Skip to content

Commit f45a2c8

Browse files
authored
Merge pull request #130 from synonymdev/fix/activity-list-and-sheets-pos
fix: Activity list and filtering sheets UI hierarchy
2 parents c33bf74 + c953e9b commit f45a2c8

File tree

8 files changed

+206
-146
lines changed

8 files changed

+206
-146
lines changed

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 3 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package to.bitkit.ui
22

3-
import androidx.compose.animation.AnimatedContentScope
4-
import androidx.compose.animation.AnimatedContentTransitionScope
5-
import androidx.compose.animation.EnterTransition
6-
import androidx.compose.animation.ExitTransition
73
import androidx.compose.runtime.Composable
84
import androidx.compose.runtime.CompositionLocalProvider
95
import androidx.compose.runtime.DisposableEffect
@@ -20,13 +16,10 @@ import androidx.lifecycle.Lifecycle
2016
import androidx.lifecycle.LifecycleEventObserver
2117
import androidx.lifecycle.compose.LocalLifecycleOwner
2218
import androidx.lifecycle.compose.collectAsStateWithLifecycle
23-
import androidx.navigation.NavBackStackEntry
2419
import androidx.navigation.NavController
25-
import androidx.navigation.NavDeepLink
2620
import androidx.navigation.NavGraphBuilder
2721
import androidx.navigation.NavHostController
2822
import androidx.navigation.NavOptions
29-
import androidx.navigation.NavType
3023
import androidx.navigation.compose.NavHost
3124
import androidx.navigation.compose.composable
3225
import androidx.navigation.compose.navigation
@@ -66,7 +59,6 @@ import to.bitkit.ui.screens.transfer.external.ExternalFeeCustomScreen
6659
import to.bitkit.ui.screens.transfer.external.ExternalSuccessScreen
6760
import to.bitkit.ui.screens.wallets.HomeScreen
6861
import to.bitkit.ui.screens.wallets.activity.ActivityItemScreen
69-
import to.bitkit.ui.screens.wallets.activity.AllActivityScreen
7062
import to.bitkit.ui.settings.BackupSettingsScreen
7163
import to.bitkit.ui.settings.BlocktankRegtestScreen
7264
import to.bitkit.ui.settings.BlocktankRegtestViewModel
@@ -90,8 +82,7 @@ import to.bitkit.ui.settings.pin.ChangePinResultScreen
9082
import to.bitkit.ui.settings.pin.ChangePinScreen
9183
import to.bitkit.ui.settings.pin.DisablePinScreen
9284
import to.bitkit.ui.settings.transactionSpeed.CustomFeeSettingsScreen
93-
import to.bitkit.ui.utils.screenScaleIn
94-
import to.bitkit.ui.utils.screenScaleOut
85+
import to.bitkit.ui.utils.composableWithDefaultTransitions
9586
import to.bitkit.ui.utils.screenSlideIn
9687
import to.bitkit.ui.utils.screenSlideOut
9788
import to.bitkit.utils.Logger
@@ -103,7 +94,6 @@ import to.bitkit.viewmodels.ExternalNodeViewModel
10394
import to.bitkit.viewmodels.MainScreenEffect
10495
import to.bitkit.viewmodels.TransferViewModel
10596
import to.bitkit.viewmodels.WalletViewModel
106-
import kotlin.reflect.KType
10797

10898
@Composable
10999
fun ContentView(
@@ -263,7 +253,6 @@ fun ContentView(
263253
lightning(walletViewModel, navController)
264254
devSettings(walletViewModel, navController)
265255
regtestSettings(navController)
266-
allActivity(activityListViewModel, navController)
267256
activityItem(activityListViewModel, navController)
268257
qrScanner(appViewModel, navController)
269258
authCheck(navController)
@@ -650,26 +639,13 @@ private fun NavGraphBuilder.regtestSettings(
650639
}
651640
}
652641

653-
private fun NavGraphBuilder.allActivity(
654-
viewModel: ActivityListViewModel,
655-
navController: NavHostController,
656-
) {
657-
composableWithDefaultTransitions<Routes.AllActivity> {
658-
AllActivityScreen(
659-
viewModel = viewModel,
660-
onBackCLick = { navController.popBackStack() },
661-
onActivityItemClick = { navController.navigateToActivityItem(it) },
662-
)
663-
}
664-
}
665-
666642
private fun NavGraphBuilder.activityItem(
667-
viewModel: ActivityListViewModel,
643+
activityListViewModel: ActivityListViewModel,
668644
navController: NavHostController,
669645
) {
670646
composableWithDefaultTransitions<Routes.ActivityItem> { navBackEntry ->
671647
ActivityItemScreen(
672-
viewModel = viewModel,
648+
viewModel = activityListViewModel,
673649
activityItem = navBackEntry.toRoute(),
674650
onBackClick = { navController.popBackStack() },
675651
)
@@ -722,29 +698,6 @@ private fun NavGraphBuilder.logs(
722698
}
723699
// endregion
724700

725-
/**
726-
* Adds the [Composable] to the [NavGraphBuilder] with the default screen transitions.
727-
*/
728-
inline fun <reified T : Any> NavGraphBuilder.composableWithDefaultTransitions(
729-
typeMap: Map<KType, NavType<*>> = emptyMap(),
730-
deepLinks: List<NavDeepLink> = emptyList(),
731-
noinline enterTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition?)? = { screenSlideIn },
732-
noinline exitTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition?)? = { screenScaleOut },
733-
noinline popEnterTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition?)? = { screenScaleIn },
734-
noinline popExitTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition?)? = { screenSlideOut },
735-
noinline content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit,
736-
) {
737-
composable<T>(
738-
typeMap = typeMap,
739-
deepLinks = deepLinks,
740-
enterTransition = enterTransition,
741-
exitTransition = exitTransition,
742-
popEnterTransition = popEnterTransition,
743-
popExitTransition = popExitTransition,
744-
content = content,
745-
)
746-
}
747-
748701
// region events
749702
fun NavController.navigateToHome() = navigate(
750703
route = Routes.Home,
@@ -867,10 +820,6 @@ fun NavController.navigateToTransferFunding() = navigate(
867820
route = Routes.Funding,
868821
)
869822

870-
fun NavController.navigateToAllActivity() = navigate(
871-
route = Routes.AllActivity,
872-
)
873-
874823
fun NavController.navigateToActivityItem(id: String) = navigate(
875824
route = Routes.ActivityItem(id),
876825
)
@@ -1043,9 +992,6 @@ object Routes {
1043992
@Serializable
1044993
data object ExternalFeeCustom
1045994

1046-
@Serializable
1047-
data object AllActivity
1048-
1049995
@Serializable
1050996
data class ActivityItem(val id: String)
1051997

app/src/main/java/to/bitkit/ui/components/SheetHost.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import to.bitkit.ui.theme.Colors
2828
sealed class BottomSheetType {
2929
data class Send(val route: SendRoute = SendRoute.Options) : BottomSheetType()
3030
data object Receive : BottomSheetType()
31+
data object ActivityDateRangeSelector : BottomSheetType()
32+
data object ActivityTagSelector : BottomSheetType()
3133
}
3234

3335
@OptIn(ExperimentalMaterial3Api::class)

app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.material.ExperimentalMaterialApi
2020
import androidx.compose.material.pullrefresh.PullRefreshIndicator
2121
import androidx.compose.material.pullrefresh.pullRefresh
2222
import androidx.compose.material.pullrefresh.rememberPullRefreshState
23+
import androidx.compose.material3.ExperimentalMaterial3Api
2324
import androidx.compose.material3.VerticalDivider
2425
import androidx.compose.runtime.Composable
2526
import androidx.compose.runtime.LaunchedEffect
@@ -53,14 +54,16 @@ import to.bitkit.ui.components.SheetHost
5354
import to.bitkit.ui.components.Text13Up
5455
import to.bitkit.ui.components.WalletBalanceView
5556
import to.bitkit.ui.navigateToActivityItem
56-
import to.bitkit.ui.navigateToAllActivity
5757
import to.bitkit.ui.navigateToQrScanner
5858
import to.bitkit.ui.navigateToTransferSavingsAvailability
5959
import to.bitkit.ui.navigateToTransferSavingsIntro
6060
import to.bitkit.ui.navigateToTransferSpendingAmount
6161
import to.bitkit.ui.navigateToTransferSpendingIntro
6262
import to.bitkit.ui.scaffold.AppScaffold
6363
import to.bitkit.ui.screens.wallets.activity.ActivityList
64+
import to.bitkit.ui.screens.wallets.activity.AllActivityScreen
65+
import to.bitkit.ui.screens.wallets.activity.DateRangeSelectorSheet
66+
import to.bitkit.ui.screens.wallets.activity.TagSelectorSheet
6467
import to.bitkit.ui.screens.wallets.receive.ReceiveQrSheet
6568
import to.bitkit.ui.screens.wallets.send.SendOptionsView
6669
import to.bitkit.ui.shared.TabBar
@@ -75,6 +78,7 @@ import to.bitkit.viewmodels.AppViewModel
7578
import to.bitkit.viewmodels.MainUiState
7679
import to.bitkit.viewmodels.WalletViewModel
7780

81+
@OptIn(ExperimentalMaterial3Api::class)
7882
@Composable
7983
fun HomeScreen(
8084
walletViewModel: WalletViewModel,
@@ -84,6 +88,7 @@ fun HomeScreen(
8488
) {
8589
val uiState: MainUiState by walletViewModel.uiState.collectAsState()
8690
val currentSheet by appViewModel.currentSheet
91+
8792
SheetHost(
8893
shouldExpand = currentSheet != null,
8994
onDismiss = { appViewModel.hideSheet() },
@@ -105,6 +110,14 @@ fun HomeScreen(
105110
ReceiveQrSheet(uiState)
106111
}
107112

113+
is BottomSheetType.ActivityDateRangeSelector -> {
114+
DateRangeSelectorSheet()
115+
}
116+
117+
is BottomSheetType.ActivityTagSelector -> {
118+
TagSelectorSheet()
119+
}
120+
108121
null -> Unit
109122
}
110123
}
@@ -132,7 +145,7 @@ fun HomeScreen(
132145
) {
133146
val hasSeenSpendingIntro by appViewModel.hasSeenSpendingIntro.collectAsState()
134147
SavingsWalletScreen(
135-
onAllActivityButtonClick = { rootNavController.navigateToAllActivity() },
148+
onAllActivityButtonClick = { walletNavController.navigate(HomeRoutes.AllActivity) },
136149
onActivityItemClick = { rootNavController.navigateToActivityItem(it) },
137150
onTransferToSpendingClick = {
138151
if (!hasSeenSpendingIntro) {
@@ -151,7 +164,7 @@ fun HomeScreen(
151164
val hasSeenSavingsIntro by appViewModel.hasSeenSavingsIntro.collectAsState()
152165
SpendingWalletScreen(
153166
uiState = uiState,
154-
onAllActivityButtonClick = { rootNavController.navigateToAllActivity() },
167+
onAllActivityButtonClick = { walletNavController.navigate(HomeRoutes.AllActivity) },
155168
onActivityItemClick = { rootNavController.navigateToActivityItem(it) },
156169
onTransferToSavingsClick = {
157170
if (!hasSeenSavingsIntro) {
@@ -163,6 +176,16 @@ fun HomeScreen(
163176
onBackCLick = { walletNavController.popBackStack() },
164177
)
165178
}
179+
composable<HomeRoutes.AllActivity>(
180+
enterTransition = { screenSlideIn },
181+
exitTransition = { screenSlideOut },
182+
) {
183+
AllActivityScreen(
184+
viewModel = activityListViewModel,
185+
onBackCLick = { walletNavController.popBackStack() },
186+
onActivityItemClick = { rootNavController.navigateToActivityItem(it) },
187+
)
188+
}
166189
}
167190

168191
TabBar(
@@ -245,7 +268,7 @@ private fun HomeContentView(
245268
val latestActivities by activity.latestActivities.collectAsState()
246269
ActivityList(
247270
items = latestActivities,
248-
onAllActivityClick = { rootNavController.navigateToAllActivity() },
271+
onAllActivityClick = { walletNavController.navigate(HomeRoutes.AllActivity) },
249272
onActivityItemClick = { rootNavController.navigateToActivityItem(it) },
250273
)
251274
}
@@ -297,6 +320,9 @@ object HomeRoutes {
297320

298321
@Serializable
299322
data object Spending
323+
324+
@Serializable
325+
data object AllActivity
300326
}
301327

302328
@Preview(showBackground = true, showSystemUi = true)

app/src/main/java/to/bitkit/ui/screens/wallets/activity/AllActivityScreen.kt

Lines changed: 23 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,17 @@ import androidx.compose.material3.ExperimentalMaterial3Api
1313
import androidx.compose.material3.HorizontalDivider
1414
import androidx.compose.material3.MaterialTheme
1515
import androidx.compose.material3.Text
16-
import androidx.compose.material3.rememberDateRangePickerState
1716
import androidx.compose.runtime.Composable
1817
import androidx.compose.runtime.collectAsState
1918
import androidx.compose.runtime.getValue
20-
import androidx.compose.runtime.mutableStateOf
21-
import androidx.compose.runtime.remember
22-
import androidx.compose.runtime.setValue
2319
import androidx.compose.ui.Alignment
2420
import androidx.compose.ui.Modifier
2521
import androidx.compose.ui.res.stringResource
2622
import androidx.compose.ui.unit.dp
2723
import to.bitkit.R
24+
import to.bitkit.ui.appViewModel
2825
import to.bitkit.ui.components.BodyMSB
29-
import to.bitkit.ui.components.SheetHost
26+
import to.bitkit.ui.components.BottomSheetType
3027
import to.bitkit.ui.components.TertiaryButton
3128
import to.bitkit.ui.scaffold.AppTopBar
3229
import to.bitkit.ui.scaffold.ScreenColumn
@@ -48,64 +45,23 @@ fun AllActivityScreen(
4845
onBackCLick: () -> Unit,
4946
onActivityItemClick: (String) -> Unit,
5047
) {
51-
ScreenColumn {
52-
AppTopBar(stringResource(R.string.all_activity), onBackCLick)
53-
val dateRangeState = rememberDateRangePickerState()
54-
var currentSheet by remember { mutableStateOf<ActivityFilterSheet?>(null) }
55-
56-
SheetHost(
57-
shouldExpand = currentSheet != null,
58-
onDismiss = { currentSheet = null },
59-
sheets = {
60-
when (currentSheet) {
61-
is ActivityFilterSheet.DateRangeSelector -> {
62-
DateRangeSelectorSheet(
63-
dateRangeState = dateRangeState,
64-
onClearClick = {
65-
dateRangeState.setSelection(null, null)
66-
viewModel.clearDateRange()
67-
currentSheet = null
68-
},
69-
onApplyClick = {
70-
viewModel.setDateRange(
71-
startDate = dateRangeState.selectedStartDateMillis,
72-
endDate = dateRangeState.selectedEndDateMillis,
73-
)
74-
currentSheet = null
75-
},
76-
)
77-
}
48+
val app = appViewModel ?: return
7849

79-
is ActivityFilterSheet.TagSelector -> {
80-
TagSelectorSheet(
81-
viewModel = viewModel,
82-
onClearClick = {
83-
viewModel.clearTags()
84-
currentSheet = null
85-
},
86-
onApplyClick = {
87-
currentSheet = null
88-
},
89-
)
90-
}
50+
ScreenColumn {
51+
AppTopBar(stringResource(R.string.wallet__activity_all), onBackCLick)
9152

92-
null -> Unit
93-
}
94-
}
95-
) {
96-
Column(modifier = Modifier.padding(horizontal = 16.dp)) {
97-
ActivityListFilter(
98-
viewModel = viewModel,
99-
onTagClick = { currentSheet = ActivityFilterSheet.TagSelector },
100-
onDateRangeClick = { currentSheet = ActivityFilterSheet.DateRangeSelector },
101-
)
102-
Spacer(modifier = Modifier.height(16.dp))
103-
val filteredActivities by viewModel.filteredActivities.collectAsState()
104-
ActivityListWithHeaders(
105-
items = filteredActivities,
106-
onActivityItemClick = onActivityItemClick,
107-
)
108-
}
53+
Column(modifier = Modifier.padding(horizontal = 16.dp)) {
54+
ActivityListFilter(
55+
viewModel = viewModel,
56+
onTagClick = { app.showSheet(BottomSheetType.ActivityTagSelector) },
57+
onDateRangeClick = { app.showSheet(BottomSheetType.ActivityDateRangeSelector) },
58+
)
59+
Spacer(modifier = Modifier.height(16.dp))
60+
val filteredActivities by viewModel.filteredActivities.collectAsState()
61+
ActivityListWithHeaders(
62+
items = filteredActivities,
63+
onActivityItemClick = onActivityItemClick,
64+
)
10965
}
11066
}
11167
}
@@ -157,7 +113,9 @@ fun ActivityListWithHeaders(
157113
TertiaryButton(
158114
text = stringResource(R.string.wallet__activity_show_all),
159115
onClick = onAllActivityButtonClick,
160-
modifier = Modifier.wrapContentWidth().padding(top = 8.dp)
116+
modifier = Modifier
117+
.wrapContentWidth()
118+
.padding(top = 8.dp)
161119
)
162120
}
163121
}
@@ -190,7 +148,9 @@ fun ActivityList(
190148
TertiaryButton(
191149
text = stringResource(R.string.wallet__activity_show_all),
192150
onClick = onAllActivityClick,
193-
modifier = Modifier.wrapContentWidth().padding(top = 8.dp)
151+
modifier = Modifier
152+
.wrapContentWidth()
153+
.padding(top = 8.dp)
194154
)
195155
}
196156
}
@@ -431,8 +391,3 @@ val testActivityItems: List<Activity> = listOf(
431391
),
432392
)
433393
// endregion
434-
435-
sealed class ActivityFilterSheet {
436-
data object DateRangeSelector : ActivityFilterSheet()
437-
data object TagSelector : ActivityFilterSheet()
438-
}

0 commit comments

Comments
 (0)