Skip to content

Conversation

@techsavvy185
Copy link
Contributor

@techsavvy185 techsavvy185 commented Jan 25, 2026

Fixes - Jira-#629

Screen_recording_20260126_032328.webm

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Run the static analysis check ./gradlew check or ci-prepush.sh to make sure you didn't break anything

  • If you have multiple commits please combine them into one commit by squashing them.

Summary by CodeRabbit

  • New Features

    • Added "Add Account" buttons on loan, fixed deposit, recurring deposit, savings, and share account listing screens to create new accounts directly.
    • Tapped Add buttons navigate users to the appropriate account-creation flows.
  • Style

    • Header layouts adjusted for improved vertical alignment and consistent icon placement.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 25, 2026

📝 Walkthrough

Walkthrough

Adds a createAccount callback across multiple account screens/routes, wires AddAccount UI buttons to ViewModel actions/events, and connects those events to navigation helpers for creating new accounts.

Changes

Cohort / File(s) Summary
Client Loan Accounts
feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientLoanAccounts/ClientLoanAccountsRoute.kt, feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientLoanAccounts/ClientLoanAccountsScreen.kt, feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientLoanAccounts/ClientLoanAccountsViewModel.kt
Added createAccount: (Int) -> Unit parameter to route and screen; added UI Add button that dispatches AddAccount action; ViewModel maps action to AddAccount event and routing is wired through the new callback.
Fixed Deposit Account
feature/client/src/commonMain/kotlin/com/mifos/feature/client/fixedDepositAccount/...
Added createAccount callback to route/screen, header Add button, and ViewModel AddAccount action/event; route wires callback to navigateToCreateFixedDepositRoute(clientId).
Recurring Deposit Account
feature/client/src/commonMain/kotlin/com/mifos/feature/client/recurringDepositAccount/...
Added createAccount callback to screen/route and header Add button; ViewModel action/event added; new helper NavController.navigateToRecurringDepositAccountRoute(clientId) and routing wired to it.
Savings Accounts
feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/...
Added createAccount parameter to route/screen, header Add button and alignment tweaks; ViewModel handles AddAccount action/event and screen routes to creation via callback.
Share Accounts
feature/client/src/commonMain/kotlin/com/mifos/feature/client/shareAccounts/...
Added createAccount callback to route/screen, header Add button with spacing/alignment; ViewModel maps action to AddAccount event and routing to create-share-account is wired.
Navigation
feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt
Updated destination signatures (e.g., savingsAccountsDestination, clientLoanAccountsDestination) to accept createAccount: (Int) -> Unit and wired them to appropriate navigateTo... creation helpers.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant Screen as AccountScreen
  participant VM as ViewModel
  participant Nav as NavController

  User->>Screen: taps Add button
  Screen->>VM: onAction(AddAccount)
  VM->>VM: emit Event.AddAccount(clientId)
  VM->>Screen: sendEvent(AddAccount(clientId))
  Screen->>Nav: createAccount(clientId)  -- invokes navigation helper
  Nav->>Nav: navigate to CreateAccountRoute(clientId)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • Arinyadav1
  • revanthkumarJ
  • biplab1

Poem

🐰 A tiny hop, a button pressed,
AddAccount springs from chest to nest.
Actions sent and events take flight,
Routes unfold beneath moonlight.
Hooray — new accounts leap into sight! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title directly and clearly describes the main change: adding create account buttons for all account types. The title is specific, concise, and accurately summarizes the primary objective of the changeset.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
feature/client/src/commonMain/kotlin/com/mifos/feature/client/recurringDepositAccount/RecurringDepositAccountScreen.kt (1)

244-248: Pre-existing bug: ApproveAccount action is not dispatched.

The ApproveAccount action is constructed but never sent via onAction(), so the approve functionality won't work. Compare with ViewAccount (lines 237-243) which correctly calls onAction(...).

🐛 Proposed fix
                                            is Actions.ApproveAccount -> {
-                                                RecurringDepositAccountAction.ApproveAccount(
+                                                onAction(RecurringDepositAccountAction.ApproveAccount(
                                                     recurringDeposit.accountNo ?: "",
-                                                )
+                                                ))
                                             }
🤖 Fix all issues with AI agents
In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientLoanAccounts/ClientLoanAccountsScreen.kt`:
- Around line 242-249: Replace the null content description on the add-icon
button so screen readers can announce it: in the Icon inside IconButton (the one
invoking onAction(ClientLoanAccountsAction.AddAccount) and using
painterResource(Res.drawable.add_icon)), set contentDescription to a meaningful
string (preferably via a string resource, e.g.
stringResource(R.string.add_account) or a localized label like "Add account")
instead of null so the button is accessible.

In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/fixedDepositAccount/FixedDepositAccountScreen.kt`:
- Around line 13-14: The Add icon in FixedDepositAccountScreen (the clickable
add icon near where the composable shows an empty state) has a null
contentDescription, making it inaccessible; update the composable that renders
the add_icon (in FixedDepositAccountScreen) to pass a meaningful, localized
contentDescription string (create a new string resource like "add_fixed_deposit"
or reuse an appropriate existing resource) and wire it via stringResource(...)
so screen readers announce the action; ensure the contentDescription is non-null
for the Image/Icon composable and update any related preview/tests to reflect
the new resource.

In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccounts.kt`:
- Around line 254-262: Remove the no-op DesignToken.padding expression and
replace it with a proper Spacer using Modifier.width or Modifier.padding as
appropriate (replace the standalone DesignToken.padding near the IconButton);
also fix accessibility by providing a meaningful contentDescription for the Icon
(do not use contentDescription = null) — either hardcode a short label like "Add
account" or reference a string resource, and ensure the IconButton callback
remains onAction.invoke(SavingsAccountAction.AddAccount).
🧹 Nitpick comments (1)
feature/client/src/commonMain/kotlin/com/mifos/feature/client/shareAccounts/ShareAccountsScreen.kt (1)

186-202: Consider adding meaningful contentDescription for accessibility.

The new Add icon (and the existing Search/Filter icons) have contentDescription = null, which makes them inaccessible to screen readers. For interactive icons, providing descriptive labels improves accessibility.

♿ Suggested improvement for accessibility
         Icon(
             modifier = Modifier.onClick { onAction.invoke(ShareAccountsAction.ToggleSearchBar) },
             painter = painterResource(Res.drawable.search),
-            contentDescription = null,
+            contentDescription = "Search accounts",
         )
         Spacer(modifier = Modifier.width(DesignToken.spacing.largeIncreased))
         Icon(
             modifier = Modifier.onClick { onAction.invoke(ShareAccountsAction.AddAccount) },
             painter = painterResource(Res.drawable.add_icon),
-            contentDescription = null,
+            contentDescription = "Add account",
         )
         Spacer(modifier = Modifier.width(DesignToken.spacing.largeIncreased))
         Icon(
             modifier = Modifier.onClick { onAction.invoke(ShareAccountsAction.ToggleFiler) },
             painter = painterResource(Res.drawable.filter),
-            contentDescription = null,
+            contentDescription = "Filter accounts",
         )

Comment on lines +242 to +249
IconButton(
onClick = { onAction.invoke(ClientLoanAccountsAction.AddAccount) },
) {
Icon(
painter = painterResource(Res.drawable.add_icon),
contentDescription = null,
)
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add content description for accessibility.

The contentDescription = null makes this button invisible to screen readers.

Proposed fix
         IconButton(
             onClick = { onAction.invoke(ClientLoanAccountsAction.AddAccount) },
         ) {
             Icon(
                 painter = painterResource(Res.drawable.add_icon),
-                contentDescription = null,
+                contentDescription = "Add Loan Account",
             )
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
IconButton(
onClick = { onAction.invoke(ClientLoanAccountsAction.AddAccount) },
) {
Icon(
painter = painterResource(Res.drawable.add_icon),
contentDescription = null,
)
}
IconButton(
onClick = { onAction.invoke(ClientLoanAccountsAction.AddAccount) },
) {
Icon(
painter = painterResource(Res.drawable.add_icon),
contentDescription = "Add Loan Account",
)
}
🤖 Prompt for AI Agents
In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientLoanAccounts/ClientLoanAccountsScreen.kt`
around lines 242 - 249, Replace the null content description on the add-icon
button so screen readers can announce it: in the Icon inside IconButton (the one
invoking onAction(ClientLoanAccountsAction.AddAccount) and using
painterResource(Res.drawable.add_icon)), set contentDescription to a meaningful
string (preferably via a string resource, e.g.
stringResource(R.string.add_account) or a localized label like "Add account")
instead of null so the button is accessible.

Comment on lines +13 to 14
import androidclient.feature.client.generated.resources.add_icon
import androidclient.feature.client.generated.resources.client_empty_card_message
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add a meaningful contentDescription for the new Add icon (accessibility).

The new clickable Add icon (Line 303) has a null contentDescription, which makes the action invisible to screen readers. Please add an accessible label (add a string resource if needed).

✅ Suggested fix
 Icon(
     painter = painterResource(Res.drawable.add_icon),
-    contentDescription = null,
+    contentDescription = stringResource(Res.string.client_add_account),
     modifier = Modifier.clickable {
         addAccount.invoke()
     },
 )

Also applies to: 303-309

🤖 Prompt for AI Agents
In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/fixedDepositAccount/FixedDepositAccountScreen.kt`
around lines 13 - 14, The Add icon in FixedDepositAccountScreen (the clickable
add icon near where the composable shows an empty state) has a null
contentDescription, making it inaccessible; update the composable that renders
the add_icon (in FixedDepositAccountScreen) to pass a meaningful, localized
contentDescription string (create a new string resource like "add_fixed_deposit"
or reuse an appropriate existing resource) and wire it via stringResource(...)
so screen readers announce the action; ensure the contentDescription is non-null
for the Image/Icon composable and update any related preview/tests to reflect
the new resource.

Comment on lines +254 to +262
DesignToken.padding
IconButton(
onClick = { onAction.invoke(SavingsAccountAction.AddAccount) },
) {
Icon(
painter = painterResource(Res.drawable.add_icon),
contentDescription = null,
)
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Dead code and accessibility concerns.

  1. Line 254 has a standalone DesignToken.padding expression that has no effect. If spacing is intended, use Spacer(modifier = Modifier.width(...)).

  2. The contentDescription = null on the add icon button makes this control invisible to screen readers, which is an accessibility issue.

Proposed fix
-        DesignToken.padding
         IconButton(
             onClick = { onAction.invoke(SavingsAccountAction.AddAccount) },
         ) {
             Icon(
                 painter = painterResource(Res.drawable.add_icon),
-                contentDescription = null,
+                contentDescription = "Add Savings Account",
             )
         }
🤖 Prompt for AI Agents
In
`@feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccounts.kt`
around lines 254 - 262, Remove the no-op DesignToken.padding expression and
replace it with a proper Spacer using Modifier.width or Modifier.padding as
appropriate (replace the standalone DesignToken.padding near the IconButton);
also fix accessibility by providing a meaningful contentDescription for the Icon
(do not use contentDescription = null) — either hardcode a short label like "Add
account" or reference a string resource, and ensure the IconButton callback
remains onAction.invoke(SavingsAccountAction.AddAccount).

@techsavvy185 techsavvy185 changed the title Create account flow fix(client): Added Create Account buttons for all types of accounts. Jan 26, 2026
Copy link
Collaborator

@niyajali niyajali left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do these require changes in all places

) {
composable<ClientLoanAccountsRoute> {
composable<ClientLoanAccountsRoute> { backStackEntry ->
val route = backStackEntry.toRoute<ClientLoanAccountsRoute>()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of collecting navigation data in this manner, leverage SavedStateHandle within your ViewModel. Retrieve the necessary data and transmit it via an event.

is ClientLoanAccountsEvent.MakeRepayment -> makeRepayment(event.id)
ClientLoanAccountsEvent.NavigateBack -> navigateBack()
is ClientLoanAccountsEvent.ViewAccount -> viewAccount(event.id)
ClientLoanAccountsEvent.AddAccount -> createAccount()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of "Data Object" use "Data class AddAccount(val clientId: Int)" and pass in the lambda

makeRepayment: (Int) -> Unit,
viewAccount: (Int) -> Unit,
navController: NavController,
createAccount: () -> Unit,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update this to "createAccount: (Int) -> Unit" to accept the Int parameter

@niyajali
Copy link
Collaborator

@techsavvy185 could you also post images/videos of the outcome

)
}

IconButton(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this toolbar icon instead update the card with a proper message with a button to create a new account

@techsavvy185
Copy link
Contributor Author

@niyajali Thanks for the review! I'll make the required changes. I've already attached a screen recording in the PR, is there anything specific I should cover?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
feature/client/src/commonMain/kotlin/com/mifos/feature/client/recurringDepositAccount/RecurringDepositAccountScreen.kt (1)

270-310: Add an accessible contentDescription for the new add button.

The new clickable icon has contentDescription = null, so screen readers can’t discover or announce the action. Please provide a localized label.

♿ Suggested fix
         Icon(
             painter = painterResource(Res.drawable.add_icon),
-            contentDescription = null,
+            contentDescription = stringResource(Res.string.client_add_account),
             modifier = Modifier.clickable {
                 addAccount.invoke()
             },
         )
🧹 Nitpick comments (4)
feature/client/src/commonMain/kotlin/com/mifos/feature/client/shareAccounts/ShareAccountsViewModel.kt (1)

36-36: Minor style inconsistency: is keyword used for data object.

Other data object actions in this when block (e.g., ToggleFiler, ToggleSearchBar, Refresh) use direct matching without is. For consistency, consider removing the is keyword here.

Suggested change
-            is ShareAccountsAction.AddAccount -> sendEvent(ShareAccountsEvent.AddAccount(route.clientId))
+            ShareAccountsAction.AddAccount -> sendEvent(ShareAccountsEvent.AddAccount(route.clientId))
feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccountsRoute.kt (1)

35-35: Simplify the pass-through lambda.

The lambda wrapping is unnecessary since it just forwards the argument directly.

♻️ Suggested simplification
-            createAccount = { clientId -> createAccount(clientId) },
+            createAccount = createAccount,
feature/client/src/commonMain/kotlin/com/mifos/feature/client/fixedDepositAccount/FixedDepositAccountScreen.kt (1)

267-274: Consider reordering parameters for consistency.

The addAccount parameter (without default) is placed after modifier (with default). While Kotlin's named arguments make this work, grouping parameters without defaults before those with defaults improves readability and aligns with common Compose conventions.

♻️ Suggested parameter order
 `@Composable`
 fun FixedDepositAccountHeader(
     totalItem: String,
     onToggleFilter: () -> Unit,
+    addAccount: () -> Unit,
     onToggleSearch: () -> Unit,
     modifier: Modifier = Modifier,
-    addAccount: () -> Unit,
-    onToggleSearch: () -> Unit,
 )
feature/client/src/commonMain/kotlin/com/mifos/feature/client/shareAccounts/ShareAccountsScreen.kt (1)

192-196: Consider adding contentDescription for accessibility.

Setting contentDescription = null means screen readers cannot describe this button. For better accessibility, provide a meaningful description.

This also applies to the existing search and filter icons in this header.

♻️ Suggested improvement
         Icon(
             modifier = Modifier.onClick { onAction.invoke(ShareAccountsAction.AddAccount) },
             painter = painterResource(Res.drawable.add_icon),
-            contentDescription = null,
+            contentDescription = "Add Share Account",
         )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants