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.DetailsViewModel
15+ import co.nimblehq.sample.compose.ui.screens.list.ListScreen
16+ import co.nimblehq.sample.compose.ui.screens.login.LoginOrRegisterScreen
17+ import co.nimblehq.sample.compose.ui.screens.login.LoginScreen
18+ import co.nimblehq.sample.compose.ui.screens.search.SearchScreen
1419import co.nimblehq.sample.compose.util.LocalResultEventBus
1520import co.nimblehq.sample.compose.util.ResultEffect
1621import dagger.Module
@@ -26,48 +31,91 @@ object MainActivityModule {
2631
2732 @Provides
2833 @ActivityRetainedScoped
29- fun provideNavigator (): Navigator = NavigatorImpl (startDestination = MainDestination . Home )
34+ fun provideNavigator (): Navigator = NavigatorImpl (startDestination = ListScreen )
3035
36+ @Suppress(" LongMethod" )
3137 @IntoSet
3238 @Provides
3339 fun provideEntryProviderInstaller (navigator : Navigator ): EntryProviderInstaller =
3440 {
35- entry<MainDestination .Home > {
36- val eventBus = LocalResultEventBus .current
41+ entry<ListScreen > {
42+ ListScreen (
43+ viewModel = hiltViewModel(),
44+ onClickSearch = { navigator.goTo(SearchScreen ) },
45+ onItemClick = { uiModel ->
46+ navigator.goTo(DetailsScreen .Details (uiModel.id.toIntOrNull() ? : 1 ))
47+ }
48+ )
49+ }
50+
51+ entry<SearchScreen > {
3752 val context = LocalContext .current
53+ SearchScreen (
54+ onClickCreateDeeplink = { username ->
55+ val intent = Intent (
56+ Intent .ACTION_VIEW ,
57+ " $PATH_BASE /$PATH_SEARCH ?${DetailsScreen .Search ::username.name} =${Uri .encode(username)} " .toUri()
58+ )
59+ context.startActivity(intent)
60+ },
61+ onClickBack = navigator::goBack
62+ )
63+ }
3864
39- ResultEffect <Boolean > { isUpdated ->
40- if (isUpdated) {
41- context.showToast(context.getString(R .string.message_updated))
42- }
43- eventBus.removeResult<Boolean >()
65+ entry<DetailsScreen .Details > { key ->
66+ val viewModel = hiltViewModel<DetailsViewModel , DetailsViewModel .Factory >(
67+ // Note: We need a new ViewModel for every new DetailsScreen instance. Usually
68+ // we would need to supply a `key` String that is unique to the
69+ // instance, however, the ViewModelStoreNavEntryDecorator (supplied
70+ // above) does this for us, using `NavEntry.contentKey` to uniquely
71+ // identify the viewModel.
72+ //
73+ // tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
74+ // if you want a new ViewModel for each new navigation key instance.
75+ creationCallback = { factory -> factory.create(key) }
76+ )
77+ val eventBus = LocalResultEventBus .current
78+
79+ ResultEffect <String > { username ->
80+ viewModel.changeUsername(username)
81+ eventBus.removeResult<String >()
4482 }
4583
46- HomeScreen (
47- viewModel = hiltViewModel(),
48- navigator = navigator
84+ DetailsScreen (
85+ viewModel = viewModel,
86+ navigateToLoginOrRegister = { navigator.goTo(LoginOrRegisterScreen ) },
87+ onClickBack = navigator::goBack
4988 )
5089 }
5190
52- entry<MainDestination .Second > { key ->
53- val eventBus = LocalResultEventBus .current
91+ entry<DetailsScreen .Search > { key ->
92+ val viewModel = hiltViewModel<DetailsViewModel , DetailsViewModel .Factory >(
93+ creationCallback = { factory -> factory.create(key) }
94+ )
5495
55- SecondScreen (
56- id = key.id,
57- navigator = navigator,
58- viewModel = hiltViewModel(),
59- onUpdate = {
60- eventBus.sendResult<Boolean >(result = true )
61- navigator.goBack()
62- }
96+ DetailsScreen (
97+ viewModel = viewModel,
98+ navigateToLoginOrRegister = { navigator.goTo(LoginOrRegisterScreen ) },
99+ onClickBack = navigator::goBack
63100 )
64101 }
65102
66- entry<MainDestination .Third > { key ->
67- ThirdScreen (
68- model = key.model,
69- navigator = navigator,
70- viewModel = hiltViewModel()
103+ entry<LoginOrRegisterScreen > {
104+ LoginOrRegisterScreen (
105+ navigateToLogin = { navigator.goTo(LoginScreen ) },
106+ navigateToRegister = { /* NO-OP */ },
107+ onClickBack = navigator::goBack
108+ )
109+ }
110+
111+ entry<LoginScreen > {
112+ val eventBus = LocalResultEventBus .current
113+ LoginScreen (
114+ navigateToDetails = { username ->
115+ eventBus.sendResult<String >(result = username)
116+ navigator.goBackToLast(DetailsScreen ::class )
117+ },
118+ onClickBack = navigator::goBack
71119 )
72120 }
73121 }
0 commit comments