diff --git a/.github/workflows/android_build.yml b/.github/workflows/android_build.yml index 4a7af26f..eb8427a2 100644 --- a/.github/workflows/android_build.yml +++ b/.github/workflows/android_build.yml @@ -43,6 +43,18 @@ jobs: echo "storePassword=$KEYSTORE_STORE_PASSWORD" >> keystore.properties echo "keyPassword=$KEYSTORE_KEY_PASSWORD" >> keystore.properties + - name: Cache Gradle + uses: actions/cache@v4 + with: + path: ~/.gradle/caches/ + key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }} + + - name: Cache Gradle Wrapper + uses: actions/cache@v4 + with: + path: ~/.gradle/wrapper/ + key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }} + - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/.github/workflows/android_deploy_beta.yml b/.github/workflows/android_deploy_beta.yml index 87a44a24..1fc6a780 100644 --- a/.github/workflows/android_deploy_beta.yml +++ b/.github/workflows/android_deploy_beta.yml @@ -26,7 +26,7 @@ jobs: ruby-version: '3.3' - name: Cache Ruby - Bundler - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} @@ -41,13 +41,13 @@ jobs: cache: gradle - name: Cache Gradle - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: ~/.gradle/caches/ key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }} - name: Cache Gradle Wrapper - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: ~/.gradle/wrapper/ key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }} diff --git a/.github/workflows/android_deploy_prod.yml b/.github/workflows/android_deploy_prod.yml index 0a05556b..7a0eec1f 100644 --- a/.github/workflows/android_deploy_prod.yml +++ b/.github/workflows/android_deploy_prod.yml @@ -24,7 +24,7 @@ jobs: ruby-version: '3.3' - name: Cache Ruby - Bundler - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} @@ -39,13 +39,13 @@ jobs: cache: gradle - name: Cache Gradle - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: ~/.gradle/caches/ key: cache-clean-gradle-${{ matrix.os }}-${{ matrix.jdk }} - name: Cache Gradle Wrapper - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: ~/.gradle/wrapper/ key: cache-clean-wrapper-${{ matrix.os }}-${{ matrix.jdk }} diff --git a/app/src/main/java/st/slex/csplashscreen/ui/InitialApp.kt b/app/src/main/java/st/slex/csplashscreen/ui/InitialApp.kt index e185c2e5..19a98d80 100644 --- a/app/src/main/java/st/slex/csplashscreen/ui/InitialApp.kt +++ b/app/src/main/java/st/slex/csplashscreen/ui/InitialApp.kt @@ -14,20 +14,14 @@ import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.Stable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.google.accompanist.systemuicontroller.rememberSystemUiController -import st.slex.csplashscreen.core.core.Logger import st.slex.csplashscreen.core.navigation.Screen import st.slex.csplashscreen.ui.components.NavHostControllerHolder import st.slex.csplashscreen.ui.components.NavigationHost -import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource -import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource.Companion.getByRoute +import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource.Companion.isAppbar import st.slex.csplashscreen.ui.components.bottom_appbar.MainBottomAppBar @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @@ -41,16 +35,6 @@ fun InitialApp( val systemUiController = rememberSystemUiController() val isDarkTheme = isSystemInDarkTheme() - var currentDestination by remember { - mutableStateOf(Screen.Home) - } - - navControllerHolder.navController.addOnDestinationChangedListener { _, destination, _ -> - Logger.d("current route: ${destination.route}") - currentDestination = destination.route?.let(::getByRoute) - Logger.d("currentDestination: ${currentDestination}") - } - DisposableEffect(systemUiController, isDarkTheme) { systemUiController.setSystemBarsColor( color = Color.Transparent, @@ -65,13 +49,13 @@ fun InitialApp( containerColor = MaterialTheme.colorScheme.background, bottomBar = { AnimatedVisibility( - visible = BottomAppBarResource.isAppbar(currentDestination), + visible = navControllerHolder.bottomBarDestination.value.isAppbar(), enter = slideInVertically(tween(300)) { it }, exit = slideOutVertically(tween(300)) { it } ) { MainBottomAppBar( onBottomAppBarClick = onBottomAppBarClick, - currentDestination = currentDestination + currentDestination = navControllerHolder.bottomBarDestination ) } }, diff --git a/app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt b/app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt index 0fa249dd..b8097d20 100644 --- a/app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt +++ b/app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt @@ -5,12 +5,11 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.remember import androidx.core.view.WindowCompat -import androidx.navigation.compose.rememberNavController import org.koin.androidx.compose.koinViewModel import org.koin.compose.getKoin import st.slex.csplashscreen.core.ui.theme.AppTheme import st.slex.csplashscreen.navigation.BaseNavigationHolder -import st.slex.csplashscreen.ui.components.NavHostControllerHolder +import st.slex.csplashscreen.ui.components.NavHostControllerHolder.Companion.rememberNavHostControllerHolder class MainActivity : ComponentActivity() { @@ -20,7 +19,7 @@ class MainActivity : ComponentActivity() { WindowCompat.setDecorFitsSystemWindows(window, false) setContent { AppTheme { - val navHostControllerHolder = NavHostControllerHolder(rememberNavController()) + val navHostControllerHolder = rememberNavHostControllerHolder() getKoin().get().setNavController(navHostControllerHolder) val viewModel = koinViewModel() diff --git a/app/src/main/java/st/slex/csplashscreen/ui/components/NavHostControllerHolder.kt b/app/src/main/java/st/slex/csplashscreen/ui/components/NavHostControllerHolder.kt new file mode 100644 index 00000000..c2d57f7b --- /dev/null +++ b/app/src/main/java/st/slex/csplashscreen/ui/components/NavHostControllerHolder.kt @@ -0,0 +1,47 @@ +package st.slex.csplashscreen.ui.components + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.navigation.NavController.OnDestinationChangedListener +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import st.slex.csplashscreen.core.navigation.Screen +import st.slex.csplashscreen.ui.components.bottom_appbar.BottomAppBarResource + +@Stable +class NavHostControllerHolder private constructor( + val navController: NavHostController, + val bottomBarDestination: State +) { + + companion object { + + @Composable + fun rememberNavHostControllerHolder(): NavHostControllerHolder { + val controller = rememberNavController() + val bottomBarDestination = remember { + mutableStateOf(Screen.Home) + } + DisposableEffect(controller) { + val listener = OnDestinationChangedListener { _, destination, _ -> + bottomBarDestination.value = + destination.route?.let(BottomAppBarResource::getByRoute) + } + controller.addOnDestinationChangedListener(listener) + onDispose { + controller.removeOnDestinationChangedListener(listener) + } + } + return remember(controller) { + NavHostControllerHolder( + navController = controller, + bottomBarDestination = bottomBarDestination + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/st/slex/csplashscreen/ui/components/NavigationHost.kt b/app/src/main/java/st/slex/csplashscreen/ui/components/NavigationHost.kt index 797242b9..2a8bd9b0 100644 --- a/app/src/main/java/st/slex/csplashscreen/ui/components/NavigationHost.kt +++ b/app/src/main/java/st/slex/csplashscreen/ui/components/NavigationHost.kt @@ -6,20 +6,16 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.Stable import androidx.compose.ui.Modifier -import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import st.slex.csplashscreen.core.navigation.Screen import st.slex.csplashscreen.core.ui.theme.LocalSharedTransitionScope import st.slex.csplashscreen.feature.collection.navigation.singleCollectionGraph import st.slex.csplashscreen.feature.favourite.navigation.favouriteGraph -import st.slex.csplashscreen.feature.photo_detail.navigation.imageDetailGraph import st.slex.csplashscreen.feature.home.navigation.homeGraph +import st.slex.csplashscreen.feature.photo_detail.navigation.imageDetailGraph import st.slex.csplashscreen.feature.search.navigation.searchPhotosGraph import st.slex.csplashscreen.feature.user.navigation.userGraph -@Stable -class NavHostControllerHolder(val navController: NavHostController) - @OptIn(ExperimentalSharedTransitionApi::class) @Composable @Stable diff --git a/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarNavigation.kt b/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarNavigation.kt index 9b24d8ab..d463e199 100644 --- a/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarNavigation.kt +++ b/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarNavigation.kt @@ -8,6 +8,7 @@ import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -16,7 +17,7 @@ import st.slex.csplashscreen.core.navigation.Screen @Composable fun MainBottomAppBar( onBottomAppBarClick: (Screen) -> Unit, - currentDestination: Screen? + currentDestination: State ) { NavigationBar( modifier = Modifier @@ -26,7 +27,7 @@ fun MainBottomAppBar( BottomAppBarResource .entries .forEach { item -> - val isSelected = currentDestination == item.screen + val isSelected = currentDestination.value == item.screen BottomAppBarItem( item = item, isSelected = isSelected, diff --git a/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarResource.kt b/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarResource.kt index 679b659a..b8a92058 100644 --- a/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarResource.kt +++ b/app/src/main/java/st/slex/csplashscreen/ui/components/bottom_appbar/BottomAppBarResource.kt @@ -13,7 +13,6 @@ import st.slex.csplashscreen.core.navigation.Screen import st.slex.csplashscreen.core.navigation.Screen.Favourite import st.slex.csplashscreen.core.navigation.Screen.Home import st.slex.csplashscreen.core.navigation.Screen.SearchPhotosScreen -import kotlin.reflect.KClass enum class BottomAppBarResource( val unselectedIcon: ImageVector, @@ -44,16 +43,12 @@ enum class BottomAppBarResource( companion object { - fun isAppbar(screen: Any?): Boolean = entries.any { it.screen == screen } + fun Screen?.isAppbar(): Boolean = entries.any { it.screen == this } - fun getByRoute(route: String): Screen? = when { - Home::class.checkScreen(route) -> HOME - SearchPhotosScreen::class.checkScreen(route) -> SEARCH - Favourite::class.checkScreen(route) -> FAVOURITE - else -> null + fun getByRoute( + route: String + ): Screen? = BottomAppBarResource.entries.find { entry -> + route.startsWith(checkNotNull(entry.screen.javaClass.canonicalName)) }?.screen - - private fun KClass.checkScreen(route: String): Boolean = - route.contains(simpleName.orEmpty()) } } \ No newline at end of file diff --git a/core/core/src/main/java/st/slex/csplashscreen/core/core/Logger.kt b/core/core/src/main/java/st/slex/csplashscreen/core/core/Logger.kt index ed84d48f..304489c0 100644 --- a/core/core/src/main/java/st/slex/csplashscreen/core/core/Logger.kt +++ b/core/core/src/main/java/st/slex/csplashscreen/core/core/Logger.kt @@ -28,4 +28,17 @@ object Logger { val currentTag = "$DEFAULT_TAG:${tag.orEmpty()}" Log.d(currentTag, message) } -} \ No newline at end of file + + fun i( + message: String, + tag: String? = null, + throwable: Throwable? = null, + ) { + if (BuildConfig.DEBUG.not()) return + val currentTag = "$DEFAULT_TAG:${tag.orEmpty()}" + Log.i(currentTag, message, throwable) + } + + fun tag(tag: String): LoggerTag = LoggerTag(tag) +} + diff --git a/core/core/src/main/java/st/slex/csplashscreen/core/core/LoggerTag.kt b/core/core/src/main/java/st/slex/csplashscreen/core/core/LoggerTag.kt new file mode 100644 index 00000000..d2b4d56b --- /dev/null +++ b/core/core/src/main/java/st/slex/csplashscreen/core/core/LoggerTag.kt @@ -0,0 +1,32 @@ +package st.slex.csplashscreen.core.core + +class LoggerTag( + private val tag: String +) { + + fun e(throwable: Throwable, message: String? = null) { + Logger.e( + throwable = throwable, + tag = tag, + message = message + ) + } + + fun d(message: String) { + Logger.d( + message = message, + tag = tag + ) + } + + fun i( + message: String, + throwable: Throwable? = null, + ) { + Logger.i( + message = message, + tag = tag, + throwable = throwable + ) + } +} \ No newline at end of file diff --git a/core/image/src/main/kotlin/st/slex/scplashscreen/core/image/AppImageRequest.kt b/core/image/src/main/kotlin/st/slex/scplashscreen/core/image/AppImageRequest.kt index e9acdec3..62a80890 100644 --- a/core/image/src/main/kotlin/st/slex/scplashscreen/core/image/AppImageRequest.kt +++ b/core/image/src/main/kotlin/st/slex/scplashscreen/core/image/AppImageRequest.kt @@ -6,12 +6,14 @@ import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import coil3.request.CachePolicy import coil3.request.ImageRequest +import st.slex.csplashscreen.core.core.Logger object AppImageRequest { @Composable fun createImageRequestBuilder(url: String): ImageRequest.Builder { val context = LocalContext.current + Logger.tag("AppImageRequest").d("createImageRequestBuilder: $url") return remember { createImageRequestBuilder(context, url) .placeholderMemoryCacheKey(url) diff --git a/core/network/src/main/java/st/slex/csplashscreen/core/network/model/remote/user/RemoteUserLinksModel.kt b/core/network/src/main/java/st/slex/csplashscreen/core/network/model/remote/user/RemoteUserLinksModel.kt index e3a52a6f..9f3c2dc7 100644 --- a/core/network/src/main/java/st/slex/csplashscreen/core/network/model/remote/user/RemoteUserLinksModel.kt +++ b/core/network/src/main/java/st/slex/csplashscreen/core/network/model/remote/user/RemoteUserLinksModel.kt @@ -10,6 +10,6 @@ data class RemoteUserLinksModel( @SerialName("photos") val photos: String, @SerialName("likes") val likes: String, @SerialName("portfolio") val portfolio: String, - @SerialName("following") val following: String, - @SerialName("followers") val followers: String + @SerialName("following") val following: String?, + @SerialName("followers") val followers: String? ) diff --git a/core/ui/src/main/java/st/slex/csplashscreen/core/ui/components/ImageComponent.kt b/core/ui/src/main/java/st/slex/csplashscreen/core/ui/components/ImageComponent.kt index 33b691eb..115c7781 100644 --- a/core/ui/src/main/java/st/slex/csplashscreen/core/ui/components/ImageComponent.kt +++ b/core/ui/src/main/java/st/slex/csplashscreen/core/ui/components/ImageComponent.kt @@ -3,9 +3,11 @@ package st.slex.csplashscreen.core.ui.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import coil3.compose.AsyncImage +import coil3.request.CachePolicy +import coil3.request.ImageRequest import coil3.request.crossfade -import st.slex.scplashscreen.core.image.AppImageRequest.createImageRequestBuilder @Composable fun ImageComponent( @@ -15,7 +17,14 @@ fun ImageComponent( ) { AsyncImage( modifier = modifier, - model = createImageRequestBuilder(url) + model = ImageRequest.Builder(LocalContext.current) + .data(url) + .placeholderMemoryCacheKey(url) + .memoryCacheKey(url) + .diskCacheKey(url) + .networkCachePolicy(CachePolicy.ENABLED) + .diskCachePolicy(CachePolicy.ENABLED) + .memoryCachePolicy(CachePolicy.ENABLED) .crossfade(true) .build(), contentDescription = null, diff --git a/core/ui/src/main/java/st/slex/csplashscreen/core/ui/mvi/Store.kt b/core/ui/src/main/java/st/slex/csplashscreen/core/ui/mvi/Store.kt index 961d92cb..129327eb 100644 --- a/core/ui/src/main/java/st/slex/csplashscreen/core/ui/mvi/Store.kt +++ b/core/ui/src/main/java/st/slex/csplashscreen/core/ui/mvi/Store.kt @@ -35,21 +35,27 @@ abstract class Store( initialState: S ) : ViewModel() { + private val logger = Logger.tag(this::class.simpleName ?: "Store") + private val _state: MutableStateFlow = MutableStateFlow(initialState) val state: StateFlow get() = _state.asStateFlow() val event: MutableSharedFlow = MutableSharedFlow() - abstract fun sendAction(action: A) + open fun sendAction(action: A) { + i("action: $action") + } fun sendEvent(event: E) { + i("event: $event") viewModelScope.launch(appDispatcher.default) { this@Store.event.emit(event) } } protected fun navigate(event: N) { + i("navigate: $event") router(event) } @@ -106,4 +112,16 @@ abstract class Store( } .onEach(each) .launchIn(viewModelScope) + + protected fun d(msg: String) { + logger.d(msg) + } + + protected fun e(throwable: Throwable, msg: String? = null) { + logger.e(throwable, msg) + } + + protected fun i(msg: String, throwable: Throwable? = null) { + logger.i(msg, throwable) + } } \ No newline at end of file diff --git a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/domain/HomeInteractorImpl.kt b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/domain/HomeInteractorImpl.kt index 8f70db53..eebc2616 100644 --- a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/domain/HomeInteractorImpl.kt +++ b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/domain/HomeInteractorImpl.kt @@ -1,6 +1,7 @@ package st.slex.csplashscreen.feature.home.domain import st.slex.csplashscreen.core.collection.data.CollectionsRepository +import st.slex.csplashscreen.core.core.Logger import st.slex.csplashscreen.core.network.model.mapToDomain import st.slex.csplashscreen.core.network.model.toDomain import st.slex.csplashscreen.core.network.model.ui.CollectionDomainModel @@ -31,4 +32,7 @@ class HomeInteractorImpl( pageSize = pageSize ) .toDomain() + .also { + Logger.tag("DEBUG_HOME").d("getAllPhotos: $it") + } } \ No newline at end of file diff --git a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/navigation/HomeGraph.kt b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/navigation/HomeGraph.kt index 94c98ef9..b9279303 100644 --- a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/navigation/HomeGraph.kt +++ b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/navigation/HomeGraph.kt @@ -34,6 +34,14 @@ fun NavGraphBuilder.homeGraph( // TODO NOT IMPLEMENTED YET } + LaunchedEffect(photos.loadState) { + store.sendAction(Action.PhotosPagingState(photos.loadState)) + } + + LaunchedEffect(photos.loadState) { + store.sendAction(Action.CollectionsPagingState(photos.loadState)) + } + MainScreen( modifier = modifier, navToProfile = remember { diff --git a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStore.kt b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStore.kt index a7fe7b7d..e84ab518 100644 --- a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStore.kt +++ b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStore.kt @@ -1,5 +1,7 @@ package st.slex.csplashscreen.feature.home.ui.presenter +import androidx.paging.CombinedLoadStates +import androidx.paging.LoadState import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData @@ -28,20 +30,25 @@ class HomeStore( initialState = State.INIT ) { - private val collections: StateFlow> = - Pager(config = config) { PagingSource(interactor::getAllCollections) } + private val collections: StateFlow> + get() = Pager(config = config) { PagingSource(interactor::getAllCollections) } .state { collection -> collection.toPresentation() } - private val photos: StateFlow> = - Pager(config = config) { PagingSource(interactor::getAllPhotos) } + private val photos: StateFlow> + get() = Pager(config = config) { + PagingSource(interactor::getAllPhotos) + } .state { image -> image.toPresentation() } override fun sendAction(action: Action) { + super.sendAction(action) when (action) { is Action.Init -> actionInit() is Action.OnCollectionClick -> actionCollectionClick(action) is Action.OnImageClick -> actionImageClick(action) is Action.OnUserClick -> actionUserClick(action) + is Action.CollectionsPagingState -> actionCollectionPagingState(action) + is Action.PhotosPagingState -> actionPhotosPagingState(action) } } @@ -70,6 +77,27 @@ class HomeStore( navigate(Navigation.User(action.username)) } + private fun actionCollectionPagingState(action: Action.CollectionsPagingState) { + action.combinedLoadStates.checkError()?.let { e(it) } + } + + private fun actionPhotosPagingState(action: Action.PhotosPagingState) { + action.combinedLoadStates.checkError()?.let { e(it) } + } + + private fun CombinedLoadStates.checkError(): Throwable? { + if (refresh is LoadState.Error) { + return (refresh as LoadState.Error).error + } + if (append is LoadState.Error) { + return (append as LoadState.Error).error + } + if (prepend is LoadState.Error) { + return (prepend as LoadState.Error).error + } + return null + } + companion object { private val config = PagingConfig( diff --git a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStoreComponent.kt b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStoreComponent.kt index d23189a7..7ebc88bd 100644 --- a/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStoreComponent.kt +++ b/feature/home/src/main/java/st/slex/csplashscreen/feature/home/ui/presenter/HomeStoreComponent.kt @@ -1,6 +1,7 @@ package st.slex.csplashscreen.feature.home.ui.presenter import androidx.compose.runtime.Stable +import androidx.paging.CombinedLoadStates import androidx.paging.PagingData import st.slex.csplashscreen.core.collection.ui.model.CollectionModel import st.slex.csplashscreen.core.photos.ui.model.PhotoModel @@ -63,6 +64,16 @@ interface HomeStoreComponent : StoreComponent { data class OnImageClick( val uuid: String ) : Action + + @Stable + data class PhotosPagingState( + val combinedLoadStates: CombinedLoadStates + ) : Action + + @Stable + data class CollectionsPagingState( + val combinedLoadStates: CombinedLoadStates + ) : Action } } diff --git a/feature/search/src/main/java/st/slex/csplashscreen/feature/search/ui/presenter/SearchStore.kt b/feature/search/src/main/java/st/slex/csplashscreen/feature/search/ui/presenter/SearchStore.kt index 41708222..31e365a7 100644 --- a/feature/search/src/main/java/st/slex/csplashscreen/feature/search/ui/presenter/SearchStore.kt +++ b/feature/search/src/main/java/st/slex/csplashscreen/feature/search/ui/presenter/SearchStore.kt @@ -47,6 +47,7 @@ class SearchStore( .state() override fun sendAction(action: Action) { + super.sendAction(action) when (action) { is Action.Init -> actionInit(action) is Action.ClearHistory -> actionClearHistory() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 40d58801..824d6e4d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,8 +7,8 @@ androidTools = "31.8.1" minSdk = "28" targetSdk = "35" compileSdk = "35" -versionName = "1.76" -versionCode = "23" +versionName = "1.77" +versionCode = "24" ktx = "1.15.0" material = "1.12.0"