11package co.nimblehq.sample.compose.di.modules.main
22
3+ import android.content.Intent
4+ import android.net.Uri
35import androidx.compose.ui.platform.LocalContext
6+ import androidx.core.net.toUri
47import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
5- import co.nimblehq.sample.compose.R
6- import co.nimblehq.sample.compose.extensions.showToast
78import co.nimblehq.sample.compose.navigation.EntryProviderInstaller
89import co.nimblehq.sample.compose.navigation.Navigator
910import co.nimblehq.sample.compose.navigation.NavigatorImpl
10- import co.nimblehq.sample.compose.ui.screens.main.MainDestination
11- import co.nimblehq.sample.compose.ui.screens.main.home.HomeScreen
12- import co.nimblehq.sample.compose.ui.screens.main.second.SecondScreen
13- import co.nimblehq.sample.compose.ui.screens.main.third.ThirdScreen
11+ import co.nimblehq.sample.compose.ui.common.PATH_BASE
12+ import co.nimblehq.sample.compose.ui.common.PATH_SEARCH
13+ import co.nimblehq.sample.compose.ui.screens.details.DetailsScreen
14+ import co.nimblehq.sample.compose.ui.screens.details.DetailsScreenUi
15+ import co.nimblehq.sample.compose.ui.screens.details.DetailsViewModel
16+ import co.nimblehq.sample.compose.ui.screens.list.ListScreen
17+ import co.nimblehq.sample.compose.ui.screens.login.LoginOrRegisterScreen
18+ import co.nimblehq.sample.compose.ui.screens.login.LoginScreen
19+ import co.nimblehq.sample.compose.ui.screens.search.SearchScreen
1420import co.nimblehq.sample.compose.util.LocalResultEventBus
1521import co.nimblehq.sample.compose.util.ResultEffect
1622import dagger.Module
@@ -26,48 +32,91 @@ object MainActivityModule {
2632
2733 @Provides
2834 @ActivityRetainedScoped
29- fun provideNavigator (): Navigator = NavigatorImpl (startDestination = MainDestination . Home )
35+ fun provideNavigator (): Navigator = NavigatorImpl (startDestination = ListScreen )
3036
37+ @Suppress(" LongMethod" )
3138 @IntoSet
3239 @Provides
3340 fun provideEntryProviderInstaller (navigator : Navigator ): EntryProviderInstaller =
3441 {
35- entry<MainDestination .Home > {
36- val eventBus = LocalResultEventBus .current
42+ entry<ListScreen > {
43+ ListScreen (
44+ viewModel = hiltViewModel(),
45+ onClickSearch = { navigator.goTo(SearchScreen ) },
46+ onItemClick = { uiModel ->
47+ navigator.goTo(DetailsScreen .Details (uiModel.id.toIntOrNull() ? : 1 ))
48+ }
49+ )
50+ }
51+
52+ entry<SearchScreen > {
3753 val context = LocalContext .current
54+ SearchScreen (
55+ onClickCreateDeeplink = { username ->
56+ val intent = Intent (
57+ Intent .ACTION_VIEW ,
58+ " $PATH_BASE /$PATH_SEARCH ?${DetailsScreen .Search ::username.name} =${Uri .encode(username)} " .toUri()
59+ )
60+ context.startActivity(intent)
61+ },
62+ onClickBack = navigator::goBack
63+ )
64+ }
3865
39- ResultEffect <Boolean > { isUpdated ->
40- if (isUpdated) {
41- context.showToast(context.getString(R .string.message_updated))
42- }
43- eventBus.removeResult<Boolean >()
66+ entry<DetailsScreen .Details > { key ->
67+ val viewModel = hiltViewModel<DetailsViewModel , DetailsViewModel .Factory >(
68+ // Note: We need a new ViewModel for every new DetailsScreen instance. Usually
69+ // we would need to supply a `key` String that is unique to the
70+ // instance, however, the ViewModelStoreNavEntryDecorator (supplied
71+ // above) does this for us, using `NavEntry.contentKey` to uniquely
72+ // identify the viewModel.
73+ //
74+ // tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
75+ // if you want a new ViewModel for each new navigation key instance.
76+ creationCallback = { factory -> factory.create(key) }
77+ )
78+ val eventBus = LocalResultEventBus .current
79+
80+ ResultEffect <String > { username ->
81+ viewModel.changeUsername(username)
82+ eventBus.removeResult<String >()
4483 }
4584
46- HomeScreen (
47- viewModel = hiltViewModel(),
48- navigator = navigator
85+ DetailsScreenUi (
86+ viewModel = viewModel,
87+ navigateToLoginOrRegister = { navigator.goTo(LoginOrRegisterScreen ) },
88+ onClickBack = navigator::goBack
4989 )
5090 }
5191
52- entry<MainDestination .Second > { key ->
53- val eventBus = LocalResultEventBus .current
92+ entry<DetailsScreen .Search > { key ->
93+ val viewModel = hiltViewModel<DetailsViewModel , DetailsViewModel .Factory >(
94+ creationCallback = { factory -> factory.create(key) }
95+ )
5496
55- SecondScreen (
56- id = key.id,
57- navigator = navigator,
58- viewModel = hiltViewModel(),
59- onUpdate = {
60- eventBus.sendResult<Boolean >(result = true )
61- navigator.goBack()
62- }
97+ DetailsScreenUi (
98+ viewModel = viewModel,
99+ navigateToLoginOrRegister = { navigator.goTo(LoginOrRegisterScreen ) },
100+ onClickBack = navigator::goBack
63101 )
64102 }
65103
66- entry<MainDestination .Third > { key ->
67- ThirdScreen (
68- model = key.model,
69- navigator = navigator,
70- viewModel = hiltViewModel()
104+ entry<LoginOrRegisterScreen > {
105+ LoginOrRegisterScreen (
106+ navigateToLogin = { navigator.goTo(LoginScreen ) },
107+ navigateToRegister = { /* NO-OP */ },
108+ onClickBack = navigator::goBack
109+ )
110+ }
111+
112+ entry<LoginScreen > {
113+ val eventBus = LocalResultEventBus .current
114+ LoginScreen (
115+ navigateToDetails = { username ->
116+ eventBus.sendResult<String >(result = username)
117+ navigator.goBackToLast(DetailsScreen ::class )
118+ },
119+ onClickBack = navigator::goBack
71120 )
72121 }
73122 }
0 commit comments