Skip to content

Commit 5c6bb70

Browse files
authored
Implement New Figma Top App Bar (#2508)
1 parent 84ae030 commit 5c6bb70

File tree

21 files changed

+432
-321
lines changed

21 files changed

+432
-321
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!--
3+
Copyright 2025 Mifos Initiative
4+
5+
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
6+
If a copy of the MPL was not distributed with this file,
7+
You can obtain one at https://mozilla.org/MPL/2.0/.
8+
9+
See https://github.com/openMF/android-client/blob/master/LICENSE.md
10+
-->
11+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
12+
android:width="28dp"
13+
android:height="28dp"
14+
android:viewportWidth="28"
15+
android:viewportHeight="28">
16+
<path
17+
android:pathData="M12.346,0.073C10.478,0.27 6.425,1.727 6.425,2.201C6.425,2.429 8.075,4.712 9.007,5.774L9.669,6.528L10.384,5.809C11.994,4.188 13.55,2.871 15.727,1.285L17.024,0.341L16.561,0.249C15.298,-0.001 13.687,-0.069 12.346,0.073Z"
18+
android:fillColor="#76C47A"
19+
android:fillType="evenOdd"/>
20+
<path
21+
android:pathData="M16.269,2.955C14.118,4.555 11.925,6.421 11.118,7.339L10.845,7.649L11.369,8.078C12.482,8.986 14.781,10.396 14.902,10.244C14.931,10.208 15.061,9.68 15.192,9.071C15.646,6.961 16.282,5.093 17.224,3.098C17.539,2.432 17.773,1.89 17.745,1.892C17.717,1.893 17.053,2.372 16.269,2.955Z"
22+
android:fillColor="#0673BA"/>
23+
<path
24+
android:pathData="M19.681,1.667C18.388,3.608 17.189,6.8 16.603,9.86C16.587,9.945 16.571,10.024 16.557,10.096C16.474,10.516 16.431,10.734 16.507,10.874C16.589,11.026 16.812,11.087 17.274,11.213C17.348,11.233 17.428,11.255 17.514,11.279C20.108,12.005 23.778,12.282 26.742,11.977C26.849,11.966 26.944,11.957 27.027,11.95C27.38,11.917 27.539,11.903 27.593,11.813C27.637,11.738 27.61,11.613 27.56,11.385C27.546,11.319 27.53,11.244 27.513,11.16C26.728,7.224 24.175,3.728 20.63,1.734L19.908,1.328L19.681,1.667Z"
25+
android:fillColor="#22B24C"/>
26+
<path
27+
android:pathData="M4.248,3.895C2.959,5.136 1.92,6.632 1.182,8.306L0.785,9.21L0.972,9.536C1.863,11.092 2.742,12.341 4.013,13.862L4.439,14.371L4.871,13.508C5.684,11.88 6.692,10.277 7.918,8.663L8.587,7.782L8.005,7.156C7.221,6.312 6.29,5.123 5.603,4.09C5.54,3.996 5.485,3.911 5.435,3.835C5.213,3.493 5.103,3.325 4.979,3.311C4.857,3.297 4.722,3.43 4.454,3.693C4.393,3.754 4.325,3.821 4.248,3.895Z"
28+
android:fillColor="#28ACE2"/>
29+
<path
30+
android:pathData="M9.203,9.522C7.903,11.215 6.393,13.796 5.818,15.306L5.709,15.593L6.304,16.109C8.271,17.815 11.065,19.386 13.557,20.187C13.65,20.216 13.734,20.244 13.81,20.269C14.204,20.399 14.388,20.459 14.464,20.386C14.53,20.322 14.515,20.157 14.487,19.847L14.487,19.846C14.481,19.778 14.474,19.702 14.467,19.619C14.326,17.889 14.436,13.029 14.637,12.111C14.645,12.076 14.274,11.856 13.812,11.623C12.816,11.119 11.492,10.271 10.608,9.572C10.257,9.295 9.911,9.023 9.839,8.967C9.721,8.876 9.654,8.934 9.203,9.522Z"
31+
android:fillColor="#0773BB"/>
32+
<path
33+
android:pathData="M16.182,12.813C15.955,13.658 16,20.647 16.233,20.902C16.29,20.964 18.587,21.256 19.614,21.331C21.622,21.48 25.483,21.253 25.894,20.963C26.656,20.426 27.801,16.296 27.801,14.085V13.583L27.094,13.696C24.105,14.171 19.499,13.749 16.341,12.71C16.266,12.686 16.205,12.725 16.182,12.813Z"
34+
android:fillColor="#28ACE2"/>
35+
<path
36+
android:pathData="M0.13,11.939C-0.296,15.035 0.338,18.428 1.809,20.919C2.092,21.4 2.095,21.399 2.259,20.69C2.482,19.728 2.892,18.354 3.284,17.252C3.499,16.648 3.674,16.13 3.673,16.102C3.673,16.073 3.376,15.711 3.014,15.296C2.141,14.296 1.534,13.467 0.866,12.361C0.563,11.859 0.293,11.419 0.265,11.384C0.238,11.348 0.177,11.598 0.13,11.939Z"
37+
android:fillColor="#22B24C"/>
38+
<path
39+
android:pathData="M4.483,19.044C3.912,20.945 3.406,23.05 3.474,23.245C3.64,23.719 6.014,25.615 7.32,26.316C9.711,27.601 13.29,28.288 15.491,27.885L15.825,27.824L15.686,27.292C15.444,26.358 15.054,24.414 14.886,23.302L14.722,22.224L13.562,21.863C10.713,20.978 8.078,19.634 5.869,17.941C5.451,17.62 5.083,17.358 5.05,17.358C5.017,17.358 4.762,18.117 4.483,19.044Z"
40+
android:fillColor="#0773BB"/>
41+
<path
42+
android:pathData="M16.46,22.923C16.62,24.008 16.886,25.465 17.098,26.402L17.339,27.473L17.588,27.45C19.177,27.305 22.659,25.157 24.274,23.325L24.552,23.01L23.115,23.05C21.233,23.103 17.204,22.841 16.544,22.623C16.423,22.583 16.414,22.611 16.46,22.923Z"
43+
android:fillColor="#76C47A"/>
44+
</vector>

cmp-navigation/src/commonMain/kotlin/cmp/navigation/authenticated/AuthenticatedNavbarNavigationScreen.kt

Lines changed: 8 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import androidx.compose.material3.DrawerValue
2727
import androidx.compose.material3.ExperimentalMaterial3Api
2828
import androidx.compose.material3.HorizontalDivider
2929
import androidx.compose.material3.Icon
30-
import androidx.compose.material3.IconButton
3130
import androidx.compose.material3.MaterialTheme
3231
import androidx.compose.material3.ModalDrawerSheet
3332
import androidx.compose.material3.ModalNavigationDrawer
@@ -37,7 +36,6 @@ import androidx.compose.material3.SnackbarDuration.Indefinite
3736
import androidx.compose.material3.SnackbarHost
3837
import androidx.compose.material3.SnackbarHostState
3938
import androidx.compose.material3.Text
40-
import androidx.compose.material3.TopAppBar
4139
import androidx.compose.material3.rememberDrawerState
4240
import androidx.compose.runtime.Composable
4341
import androidx.compose.runtime.LaunchedEffect
@@ -64,11 +62,11 @@ import androidx.navigation.compose.NavHost
6462
import androidx.navigation.compose.currentBackStackEntryAsState
6563
import androidx.navigation.navOptions
6664
import cmp.navigation.components.MifosScaffold
65+
import cmp.navigation.components.MifosTopAppBar
6766
import cmp.navigation.components.ScaffoldNavigationData
6867
import cmp.navigation.navigation.HomeDestinationsScreen
6968
import cmp.navigation.ui.rememberMifosNavController
7069
import com.mifos.core.common.utils.Constants
71-
import com.mifos.core.designsystem.icon.MifosIcons
7270
import com.mifos.core.designsystem.theme.DesignToken
7371
import com.mifos.core.ui.RootTransitionProviders
7472
import com.mifos.core.ui.util.EventsEffect
@@ -88,7 +86,6 @@ import com.mifos.feature.groups.navigation.navigateToCreateNewGroupScreen
8886
import com.mifos.feature.groups.navigation.navigateToGroupDetailsScreen
8987
import com.mifos.feature.groups.navigation.navigateToGroupListScreen
9088
import com.mifos.feature.loan.groupLoanAccount.navigateToGroupLoanScreen
91-
import com.mifos.feature.loan.loanAccount.navigateToLoanAccountScreen
9289
import com.mifos.feature.loan.loanAccountSummary.navigateToLoanAccountSummaryScreen
9390
import com.mifos.feature.note.notes.navigateToNoteScreen
9491
import com.mifos.feature.savings.navigation.navigateToAddSavingsAccount
@@ -101,6 +98,7 @@ import kotlinx.coroutines.launch
10198
import org.jetbrains.compose.resources.painterResource
10299
import org.jetbrains.compose.resources.stringResource
103100
import org.koin.compose.viewmodel.koinViewModel
101+
import org.mifos.core.designsystem.component.MifosTopAppBar
104102
import org.mifos.navigation.generated.resources.Res
105103
import org.mifos.navigation.generated.resources.cmp_navigation_mifos
106104
import org.mifos.navigation.generated.resources.cmp_navigation_no_internet
@@ -110,14 +108,11 @@ import org.mifos.navigation.generated.resources.ic_dp_placeholder
110108
@Composable
111109
internal fun AuthenticatedNavbarNavigationScreen(
112110
navigateToDocumentScreen: (Int, String) -> Unit,
113-
navigateToNoteScreen: (Int, String) -> Unit,
114111
onDrawerItemClick: (String) -> Unit,
115112
modifier: Modifier = Modifier,
116113
navController: NavHostController = rememberMifosNavController(
117114
name = "AuthenticatedNavbarScreen",
118115
),
119-
navigateToNewLoanAccountScreen: (Int) -> Unit,
120-
navigateToNewSavingsAccountScreen: (Int) -> Unit,
121116
viewModel: AuthenticatedNavbarNavigationViewModel = koinViewModel(),
122117
) {
123118
val scope = rememberCoroutineScope()
@@ -177,9 +172,6 @@ internal fun AuthenticatedNavbarNavigationScreen(
177172
},
178173
onDrawerItemClick = onDrawerItemClick,
179174
navigateToDocumentScreen = navigateToDocumentScreen,
180-
navigateToNoteScreen = navigateToNoteScreen,
181-
navigateToNewLoanAccountScreen = navigateToNewLoanAccountScreen,
182-
navigateToNewSavingsAccountScreen = navigateToNewSavingsAccountScreen,
183175
)
184176
}
185177

@@ -189,9 +181,6 @@ internal fun AuthenticatedNavbarNavigationScreenContent(
189181
navController: NavHostController,
190182
onDrawerItemClick: (String) -> Unit,
191183
navigateToDocumentScreen: (Int, String) -> Unit,
192-
navigateToNoteScreen: (Int, String) -> Unit,
193-
navigateToNewLoanAccountScreen: (Int) -> Unit,
194-
navigateToNewSavingsAccountScreen: (Int) -> Unit,
195184
modifier: Modifier = Modifier,
196185
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
197186
onAction: (AuthenticatedNavBarAction) -> Unit,
@@ -296,26 +285,14 @@ internal fun AuthenticatedNavbarNavigationScreenContent(
296285
) {
297286
MifosScaffold(
298287
topBar = {
299-
TopAppBar(
300-
title = {
301-
Text(stringResource(Res.string.cmp_navigation_mifos))
302-
},
303-
navigationIcon = {
304-
IconButton(
305-
onClick = {
306-
scope.launch {
307-
drawerState.apply {
308-
if (isClosed) open() else close()
309-
}
310-
}
311-
},
312-
) {
313-
Icon(
314-
imageVector = MifosIcons.Menu,
315-
contentDescription = "Menu",
316-
)
288+
MifosTopAppBar(
289+
onNavigationIconClick = {
290+
scope.launch {
291+
drawerState.open()
317292
}
318293
},
294+
onSearchIconClick = {},
295+
onNotificationIconClick = {},
319296
)
320297
},
321298
contentWindowInsets = WindowInsets(0.dp),
@@ -398,44 +375,19 @@ internal fun AuthenticatedNavbarNavigationScreenContent(
398375

399376
clientNavGraph(
400377
navController = navController,
401-
addLoanAccount = navController::navigateToLoanAccountScreen,
402-
addSavingsAccount = { clientId ->
403-
navController.navigateToAddSavingsAccount(0, clientId, false)
404-
},
405-
documents = { clientId ->
406-
navigateToDocumentScreen(
407-
clientId,
408-
Constants.ENTITY_TYPE_CLIENTS,
409-
)
410-
},
411378
moreClientInfo = { clientId ->
412379
navController.navigateToDataTable(
413380
Constants.DATA_TABLE_NAME_CLIENT,
414381
clientId,
415382
)
416383
},
417-
notes = { clientId ->
418-
navigateToNoteScreen(
419-
clientId,
420-
Constants.ENTITY_TYPE_CLIENTS,
421-
)
422-
},
423-
loanAccountSelected = { loanAccountNumber ->
424-
navController.navigateToLoanAccountSummaryScreen(loanAccountNumber)
425-
},
426-
savingsAccountSelected = { clientId, depositType ->
427-
navController.navigateToSavingsAccountSummaryScreen(clientId, depositType)
428-
},
429384
activateClient = { clientId ->
430385
navController.navigateToActivateRoute(
431386
clientId,
432387
Constants.ACTIVATE_CLIENT,
433388
)
434389
},
435390
hasDatatables = navController::navigateDataTableList,
436-
onDocumentClicked = navigateToDocumentScreen,
437-
navigateToNewLoanAccount = navigateToNewLoanAccountScreen,
438-
navigateToNewSavingsAccount = navigateToNewSavingsAccountScreen,
439391
)
440392
}
441393
}

cmp-navigation/src/commonMain/kotlin/cmp/navigation/authenticated/AuthenticatedNavbarRoute.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,11 @@ internal fun NavController.navigateToAuthenticatedNavBar(navOptions: NavOptions?
2525
internal fun NavGraphBuilder.authenticatedNavbarGraph(
2626
onDrawerItemClick: (String) -> Unit,
2727
navigateToDocumentScreen: (Int, String) -> Unit,
28-
navigateToNoteScreen: (Int, String) -> Unit,
29-
navigateToNewLoanAccountScreen: (Int) -> Unit,
30-
navigateToNewSavingsAccountScreen: (Int) -> Unit,
3128
) {
3229
composable<AuthenticatedNavbar> {
3330
AuthenticatedNavbarNavigationScreen(
3431
onDrawerItemClick = onDrawerItemClick,
3532
navigateToDocumentScreen = navigateToDocumentScreen,
36-
navigateToNoteScreen = navigateToNoteScreen,
37-
navigateToNewLoanAccountScreen = navigateToNewLoanAccountScreen,
38-
navigateToNewSavingsAccountScreen = navigateToNewSavingsAccountScreen,
3933
)
4034
}
4135
}

cmp-navigation/src/commonMain/kotlin/cmp/navigation/authenticated/AuthenticatedNavigation.kt

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,15 @@ import com.mifos.feature.activate.activateDestination
1818
import com.mifos.feature.checker.inbox.task.navigation.checkerInboxTaskNavGraph
1919
import com.mifos.feature.client.navigation.navigateClientDetailsScreen
2020
import com.mifos.feature.dataTable.navigation.dataTableNavGraph
21-
import com.mifos.feature.dataTable.navigation.navigateToDataTable
2221
import com.mifos.feature.document.navigation.documentListScreen
2322
import com.mifos.feature.document.navigation.navigateToDocumentListScreen
2423
import com.mifos.feature.individualCollectionSheet.navigation.generateCollectionSheetScreen
2524
import com.mifos.feature.individualCollectionSheet.navigation.individualCollectionSheetNavGraph
2625
import com.mifos.feature.loan.groupLoanAccount.groupLoanScreen
2726
import com.mifos.feature.loan.loanAccount.addLoanAccountScreen
28-
import com.mifos.feature.loan.navigation.loanNavGraph
29-
import com.mifos.feature.loan.newLoanAccount.navigateToNewLoanAccountRoute
30-
import com.mifos.feature.note.navigation.noteNavGraph
31-
import com.mifos.feature.note.notes.navigateToNoteScreen
3227
import com.mifos.feature.offline.navigation.offlineNavGraph
3328
import com.mifos.feature.path.tracking.navigation.pathTrackingRoute
3429
import com.mifos.feature.report.navigation.reportNavGraph
35-
import com.mifos.feature.savings.navigation.savingsNavGraph
36-
import com.mifos.feature.savings.savingsAccountv2.navigateToSavingsAccountRoute
3730
import com.mifos.feature.settings.navigation.settingsScreen
3831
import kotlinx.serialization.ExperimentalSerializationApi
3932
import kotlinx.serialization.InternalSerializationApi
@@ -60,9 +53,6 @@ internal fun NavGraphBuilder.authenticatedGraph(
6053
}
6154
},
6255
navigateToDocumentScreen = navController::navigateToDocumentListScreen,
63-
navigateToNoteScreen = navController::navigateToNoteScreen,
64-
navigateToNewLoanAccountScreen = navController::navigateToNewLoanAccountRoute,
65-
navigateToNewSavingsAccountScreen = navController::navigateToSavingsAccountRoute,
6656
)
6757

6858
checkerInboxTaskNavGraph(navController)
@@ -80,22 +70,10 @@ internal fun NavGraphBuilder.authenticatedGraph(
8070
},
8171
)
8272

83-
savingsNavGraph(
84-
navController = navController,
85-
onBackPressed = navController::popBackStack,
86-
loadMoreSavingsAccountInfo = navController::navigateToDataTable,
87-
loadDocuments = navController::navigateToDocumentListScreen,
88-
)
89-
9073
aboutDestination(onBackPressed = navController::popBackStack)
9174

9275
offlineNavGraph(navController = navController)
9376

94-
noteNavGraph(
95-
navController = navController,
96-
onBackPressed = navController::popBackStack,
97-
)
98-
9977
activateDestination(onBackPressed = navController::popBackStack)
10078

10179
settingsScreen(
@@ -114,12 +92,6 @@ internal fun NavGraphBuilder.authenticatedGraph(
11492

11593
reportNavGraph(navController = navController)
11694

117-
loanNavGraph(
118-
navController = navController,
119-
onMoreInfoClicked = navController::navigateToDataTable,
120-
onDocumentsClicked = navController::navigateToDocumentListScreen,
121-
)
122-
12395
groupLoanScreen { navController.popBackStack() }
12496

12597
addLoanAccountScreen(

cmp-navigation/src/commonMain/kotlin/cmp/navigation/components/MifosScaffold.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.compose.material3.FabPosition
3333
import androidx.compose.material3.MaterialTheme
3434
import androidx.compose.material3.Scaffold
3535
import androidx.compose.material3.ScaffoldDefaults
36+
import androidx.compose.material3.contentColorFor
3637
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults
3738
import androidx.compose.material3.pulltorefresh.pullToRefresh
3839
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
@@ -42,12 +43,14 @@ import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
4243
import androidx.compose.runtime.Composable
4344
import androidx.compose.ui.Alignment
4445
import androidx.compose.ui.Modifier
46+
import androidx.compose.ui.graphics.Color
4547
import androidx.compose.ui.platform.testTag
4648
import androidx.compose.ui.unit.dp
4749
import androidx.compose.ui.zIndex
4850
import com.mifos.core.designsystem.component.MifosNavigationRail
4951
import com.mifos.core.designsystem.component.MifosPullToRefreshState
5052
import com.mifos.core.designsystem.component.rememberMifosPullToRefreshState
53+
import com.mifos.core.designsystem.theme.AppColors
5154

5255
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3WindowSizeClassApi::class)
5356
@Suppress("LongMethod")
@@ -62,6 +65,8 @@ fun MifosScaffold(
6265
floatingActionButtonPosition: FabPosition = FabPosition.End,
6366
navigationData: ScaffoldNavigationData? = null,
6467
pullToRefreshState: MifosPullToRefreshState = rememberMifosPullToRefreshState(),
68+
containerColor: Color = AppColors.customWhite,
69+
contentColor: Color = contentColorFor(containerColor),
6570
contentWindowInsets: WindowInsets = ScaffoldDefaults
6671
.contentWindowInsets
6772
.only(WindowInsetsSides.Horizontal),
@@ -74,11 +79,13 @@ fun MifosScaffold(
7479
val isNavigationBarVisible = isCompact && hasNavigationItems
7580
Scaffold(
7681
modifier = modifier,
77-
topBar = if (isNavigationBarVisible) {
78-
topBar
79-
} else {
80-
{}
82+
topBar = {
83+
if (isCompact) {
84+
topBar()
85+
}
8186
},
87+
containerColor = containerColor,
88+
contentColor = contentColor,
8289
bottomBar = {
8390
AnimatedVisibility(
8491
visible = isNavigationBarVisible,

0 commit comments

Comments
 (0)