diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeEntryPoint.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/di/ComposeEntryPoint.kt similarity index 52% rename from hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeEntryPoint.kt rename to hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/di/ComposeEntryPoint.kt index c608e36..67c0be7 100644 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeEntryPoint.kt +++ b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/di/ComposeEntryPoint.kt @@ -1,4 +1,4 @@ -package org.fnives.test.showcase.hilt.compose.screen.home +package org.fnives.test.showcase.hilt.compose.di import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -11,13 +11,30 @@ import org.fnives.test.showcase.hilt.core.content.AddContentToFavouriteUseCase import org.fnives.test.showcase.hilt.core.content.FetchContentUseCase import org.fnives.test.showcase.hilt.core.content.GetAllContentUseCase import org.fnives.test.showcase.hilt.core.content.RemoveContentFromFavouritesUseCase +import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase +import org.fnives.test.showcase.hilt.core.login.LoginUseCase import org.fnives.test.showcase.hilt.core.login.LogoutUseCase -object HomeEntryPoint { +object ComposeEntryPoint { + + /** + * Helper method to easily remember and access Hilt Dependencies in Compose. + */ + @Composable + inline fun rememberEntryPoint(component: Any = LocalContext.current.applicationContext): T = + remember(component) { EntryPoints.get(component, T::class.java) } + + sealed interface EntryPointDependencies @EntryPoint @InstallIn(SingletonComponent::class) - interface MainDependencies { + interface AuthDependencies : EntryPointDependencies { + val loginUseCase: LoginUseCase + } + + @EntryPoint + @InstallIn(SingletonComponent::class) + interface MainDependencies : EntryPointDependencies { val getAllContentUseCase: GetAllContentUseCase val logoutUseCase: LogoutUseCase val fetchContentUseCase: FetchContentUseCase @@ -25,9 +42,9 @@ object HomeEntryPoint { val removeContentFromFavouritesUseCase: RemoveContentFromFavouritesUseCase } - @Composable - fun get(): MainDependencies { - val context = LocalContext.current.applicationContext - return remember { EntryPoints.get(context, MainDependencies::class.java) } + @EntryPoint + @InstallIn(SingletonComponent::class) + interface AppNavigationDependencies : EntryPointDependencies { + val isUserLoggedInUseCase: IsUserLoggedInUseCase } } diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigation.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigation.kt index a383d08..7d1b2c7 100644 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigation.kt +++ b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigation.kt @@ -11,6 +11,8 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import kotlinx.coroutines.delay +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.AppNavigationDependencies +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint import org.fnives.test.showcase.hilt.compose.screen.auth.AuthScreen import org.fnives.test.showcase.hilt.compose.screen.auth.rememberAuthScreenState import org.fnives.test.showcase.hilt.compose.screen.home.HomeScreen @@ -20,8 +22,11 @@ import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase @Composable fun AppNavigation( - isUserLogeInUseCase: IsUserLoggedInUseCase = AppNavigationEntryPoint.get().isUserLoggedInUseCase -) { + navigationDependencies: AppNavigationDependencies = rememberEntryPoint() +) = AppNavigation(navigationDependencies.isUserLoggedInUseCase) + +@Composable +fun AppNavigation(isUserLogeInUseCase: IsUserLoggedInUseCase) { val navController = rememberNavController() LaunchedEffect(isUserLogeInUseCase) { diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigationEntryPoint.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigationEntryPoint.kt deleted file mode 100644 index d04c7a1..0000000 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/AppNavigationEntryPoint.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.fnives.test.showcase.hilt.compose.screen - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext -import dagger.hilt.EntryPoint -import dagger.hilt.EntryPoints -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase - -object AppNavigationEntryPoint { - - @EntryPoint - @InstallIn(SingletonComponent::class) - interface AppNavigationDependencies { - val isUserLoggedInUseCase: IsUserLoggedInUseCase - } - - @Composable - fun get(): AppNavigationDependencies { - val context = LocalContext.current.applicationContext - return remember { EntryPoints.get(context, AppNavigationDependencies::class.java) } - } -} diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthEntryPoint.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthEntryPoint.kt deleted file mode 100644 index 3193ef8..0000000 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthEntryPoint.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.fnives.test.showcase.hilt.compose.screen.auth - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext -import dagger.hilt.EntryPoint -import dagger.hilt.EntryPoints -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import org.fnives.test.showcase.hilt.core.login.LoginUseCase - -object AuthEntryPoint { - - @EntryPoint - @InstallIn(SingletonComponent::class) - interface AuthDependencies { - val loginUseCase: LoginUseCase - } - - @Composable - fun get(): AuthDependencies { - val context = LocalContext.current.applicationContext - return remember { EntryPoints.get(context, AuthDependencies::class.java) } - } -} diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthScreenState.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthScreenState.kt index 49454f6..9122ef9 100644 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthScreenState.kt +++ b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/auth/AuthScreenState.kt @@ -11,6 +11,8 @@ import androidx.compose.runtime.setValue import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.AuthDependencies +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint import org.fnives.test.showcase.hilt.core.login.LoginUseCase import org.fnives.test.showcase.model.auth.LoginCredentials import org.fnives.test.showcase.model.auth.LoginStatus @@ -19,7 +21,19 @@ import org.fnives.test.showcase.model.shared.Answer @Composable fun rememberAuthScreenState( stateScope: CoroutineScope = rememberCoroutineScope { Dispatchers.Main }, - loginUseCase: LoginUseCase = AuthEntryPoint.get().loginUseCase, + authDependencies: AuthDependencies = rememberEntryPoint(), + onLoginSuccess: () -> Unit = {}, +): AuthScreenState = + rememberAuthScreenState( + stateScope = stateScope, + loginUseCase = authDependencies.loginUseCase, + onLoginSuccess = onLoginSuccess + ) + +@Composable +fun rememberAuthScreenState( + stateScope: CoroutineScope = rememberCoroutineScope { Dispatchers.Main }, + loginUseCase: LoginUseCase, onLoginSuccess: () -> Unit = {}, ): AuthScreenState { return rememberSaveable(saver = AuthScreenState.getSaver(stateScope, loginUseCase, onLoginSuccess)) { diff --git a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeScreenState.kt b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeScreenState.kt index a7e2643..d51a27a 100644 --- a/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeScreenState.kt +++ b/hilt/hilt-app/src/main/java/org/fnives/test/showcase/hilt/compose/screen/home/HomeScreenState.kt @@ -9,6 +9,8 @@ import androidx.compose.runtime.setValue import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.MainDependencies +import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint import org.fnives.test.showcase.hilt.core.content.AddContentToFavouriteUseCase import org.fnives.test.showcase.hilt.core.content.FetchContentUseCase import org.fnives.test.showcase.hilt.core.content.GetAllContentUseCase @@ -21,7 +23,7 @@ import org.fnives.test.showcase.model.shared.Resource @Composable fun rememberHomeScreenState( stateScope: CoroutineScope = rememberCoroutineScope(), - mainDependencies: HomeEntryPoint.MainDependencies = HomeEntryPoint.get(), + mainDependencies: MainDependencies = rememberEntryPoint(), onLogout: () -> Unit = {}, ) = rememberHomeScreenState(