From 19cf7c1c023a52dd01d1281dcd2d88b4fa0b37c6 Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 03:29:48 +0500 Subject: [PATCH 1/8] Added github action --- .github/pr_checks.yaml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/pr_checks.yaml diff --git a/.github/pr_checks.yaml b/.github/pr_checks.yaml new file mode 100644 index 0000000..5fb2b9e --- /dev/null +++ b/.github/pr_checks.yaml @@ -0,0 +1,27 @@ +name: Checks for pr +run-name: Checks for pr "${{ github.event.pull_request.title }}" by ${{ github.actor }} + +on: + pull_request: + +# cancel previous running work flow on new one with same workflow name and pull_request_number +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + ktlint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.2.1/ktlint && chmod a+x ktlint && sudo mv ktlint /usr/local/bin/ + - name: run ktlint + run: | + ktlint --reporter=checkstyle,output=build/ktlint-report.xml + continue-on-error: true + - uses: yutailang0119/action-ktlint@v4 + with: + report-path: build/*.xml # Support glob patterns by https://www.npmjs.com/package/@actions/glob + ignore-warnings: true # Ignore Lint Warnings + continue-on-error: false # If annotations contain error of severity, action-ktlint exit 1. From 2336b8c3aa9a22a94a09294448a4b5a4498e8674 Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 03:29:48 +0500 Subject: [PATCH 2/8] Fixed location --- .github/workflows/pr_checks.yaml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/pr_checks.yaml diff --git a/.github/workflows/pr_checks.yaml b/.github/workflows/pr_checks.yaml new file mode 100644 index 0000000..5fb2b9e --- /dev/null +++ b/.github/workflows/pr_checks.yaml @@ -0,0 +1,27 @@ +name: Checks for pr +run-name: Checks for pr "${{ github.event.pull_request.title }}" by ${{ github.actor }} + +on: + pull_request: + +# cancel previous running work flow on new one with same workflow name and pull_request_number +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + ktlint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.2.1/ktlint && chmod a+x ktlint && sudo mv ktlint /usr/local/bin/ + - name: run ktlint + run: | + ktlint --reporter=checkstyle,output=build/ktlint-report.xml + continue-on-error: true + - uses: yutailang0119/action-ktlint@v4 + with: + report-path: build/*.xml # Support glob patterns by https://www.npmjs.com/package/@actions/glob + ignore-warnings: true # Ignore Lint Warnings + continue-on-error: false # If annotations contain error of severity, action-ktlint exit 1. From 9b2f39bf8b6d1a97146f3e5696a093d795f904de Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 03:41:51 +0500 Subject: [PATCH 3/8] Removed file --- .github/pr_checks.yaml | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 .github/pr_checks.yaml diff --git a/.github/pr_checks.yaml b/.github/pr_checks.yaml deleted file mode 100644 index 5fb2b9e..0000000 --- a/.github/pr_checks.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: Checks for pr -run-name: Checks for pr "${{ github.event.pull_request.title }}" by ${{ github.actor }} - -on: - pull_request: - -# cancel previous running work flow on new one with same workflow name and pull_request_number -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - ktlint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: | - curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.2.1/ktlint && chmod a+x ktlint && sudo mv ktlint /usr/local/bin/ - - name: run ktlint - run: | - ktlint --reporter=checkstyle,output=build/ktlint-report.xml - continue-on-error: true - - uses: yutailang0119/action-ktlint@v4 - with: - report-path: build/*.xml # Support glob patterns by https://www.npmjs.com/package/@actions/glob - ignore-warnings: true # Ignore Lint Warnings - continue-on-error: false # If annotations contain error of severity, action-ktlint exit 1. From f0a953faa154efd786255d58e0953820594e8fba Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 03:45:38 +0500 Subject: [PATCH 4/8] Fixed linter warnings --- app/build.gradle.kts | 4 ++-- .../flowerapp/ExampleInstrumentedTest.kt | 24 ------------------- .../com/shurdev/flowerapp/FlowerAndroidApp.kt | 2 +- .../com/shurdev/flowerapp/MainActivity.kt | 2 +- .../presentation/BottomNavigationItems.kt | 9 ++++--- .../com/shurdev/flowerapp/ExampleUnitTest.kt | 17 ------------- 6 files changed, 8 insertions(+), 50 deletions(-) delete mode 100644 app/src/androidTest/java/com/shurdev/flowerapp/ExampleInstrumentedTest.kt delete mode 100644 app/src/test/java/com/shurdev/flowerapp/ExampleUnitTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 851038d..3088703 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,7 +28,7 @@ android { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + "proguard-rules.pro", ) } } @@ -94,4 +94,4 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) -} \ No newline at end of file +} diff --git a/app/src/androidTest/java/com/shurdev/flowerapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/shurdev/flowerapp/ExampleInstrumentedTest.kt deleted file mode 100644 index b7cbd96..0000000 --- a/app/src/androidTest/java/com/shurdev/flowerapp/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.shurdev.flowerapp - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.shurdev.flowerapp", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/shurdev/flowerapp/FlowerAndroidApp.kt b/app/src/main/java/com/shurdev/flowerapp/FlowerAndroidApp.kt index 5470a7c..88ef8c1 100644 --- a/app/src/main/java/com/shurdev/flowerapp/FlowerAndroidApp.kt +++ b/app/src/main/java/com/shurdev/flowerapp/FlowerAndroidApp.kt @@ -4,4 +4,4 @@ import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp -class FlowerAndroidApp : Application() \ No newline at end of file +class FlowerAndroidApp : Application() diff --git a/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt b/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt index 0f5d983..35a4b54 100644 --- a/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt +++ b/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt @@ -19,4 +19,4 @@ class MainActivity : ComponentActivity() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt b/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt index e53f75b..c25e757 100644 --- a/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt +++ b/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt @@ -10,15 +10,14 @@ sealed class BottomNavigationItems( val name: String, val selectedIconResId: Int, val unSelectedIconResId: Int, - val route: T + val route: T, ) { - @Serializable data object MyPlants : BottomNavigationItems( name = "Мои растения", selectedIconResId = R.drawable.icon_home_filled, unSelectedIconResId = R.drawable.icon_home_unfilled, - route = MyPlantsNavGraph + route = MyPlantsNavGraph, ) @Serializable @@ -26,7 +25,7 @@ sealed class BottomNavigationItems( name = "Галерея", selectedIconResId = R.drawable.icon_flower_filled, unSelectedIconResId = R.drawable.icon_flower_unfilled, - route = GalleryNavGraph + route = GalleryNavGraph, ) // TODO @@ -35,4 +34,4 @@ sealed class BottomNavigationItems( data object Settings : BottomNavigationItems{ }*/ -} \ No newline at end of file +} diff --git a/app/src/test/java/com/shurdev/flowerapp/ExampleUnitTest.kt b/app/src/test/java/com/shurdev/flowerapp/ExampleUnitTest.kt deleted file mode 100644 index ce4286a..0000000 --- a/app/src/test/java/com/shurdev/flowerapp/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.shurdev.flowerapp - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file From f13bf024d05194a0b04aeb5b702c51ab369d00f4 Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 04:37:43 +0500 Subject: [PATCH 5/8] Fixed linter warnings --- .editorconfig | 6 + .../com/shurdev/flowerapp/MainActivity.kt | 2 +- .../presentation/BottomNavigationItems.kt | 9 +- .../flowerapp/presentation/FlowerApp.kt | 15 ++- .../composables/AppBottomNavigation.kt | 34 ++++-- .../java/com/shurdev/domain/models/Plant.kt | 2 +- .../com/shurdev/domain/models/PlantFilters.kt | 2 +- .../domain/repositories/PlantRepository.kt | 2 +- .../gallery/components/PlantCategoriesList.kt | 10 +- .../gallery/components/PlantCategoryItem.kt | 16 +-- .../shurdev/gallery/components/PlantItem.kt | 31 +++-- .../shurdev/gallery/components/PlantsList.kt | 12 +- .../com/shurdev/gallery/mocks/Categories.kt | 10 +- .../java/com/shurdev/gallery/mocks/Plants.kt | 15 ++- .../gallery/navigation/GalleryNavigation.kt | 22 ++-- .../details/GalleryPlantDetailsScreen.kt | 50 ++++---- .../viewModel/GalleryPlantDetailsUiState.kt | 4 +- .../viewModel/GalleryPlantDetailsViewModel.kt | 5 +- .../gallery/screens/gallery/GalleryScreen.kt | 113 +++++++++--------- .../gallery/viewModel/GalleryUiState.kt | 4 +- .../gallery/viewModel/GalleryViewModel.kt | 5 +- .../components/MyPlantItem.kt | 27 +++-- .../navigation/MyPlantsNavigation.kt | 25 ++-- .../screens/details/MyPlantDetailsScreen.kt | 50 ++++---- .../viewModel/MyPlantDetailsUiState.kt | 10 +- .../viewModel/MyPlantDetailsViewModel.kt | 6 +- .../screens/myPlants/MyPlantsScreen.kt | 40 +++---- .../myPlants/viewModel/MyPlantsUiState.kt | 2 +- .../myPlants/viewModel/MyPlantsViewModel.kt | 2 +- gradle/libs.versions.toml | 6 - .../actions/FavoriteAction.kt | 7 +- .../{ui_kit => uiKit}/buttons/BackButton.kt | 11 +- .../buttons/PrimaryButton.kt | 6 +- .../com/shurdev/uiKit/errors/ErrorView.kt | 13 ++ .../{ui_kit => uiKit}/fields/SearchField.kt | 16 +-- .../{ui_kit => uiKit}/layouts/Center.kt | 9 +- .../java/com/shurdev/uiKit/loaders/Loader.kt | 15 +++ .../shurdev/{ui_kit => uiKit}/theme/Color.kt | 4 +- .../shurdev/{ui_kit => uiKit}/theme/Theme.kt | 10 +- .../{ui_kit => uiKit}/theme/Typography.kt | 11 +- .../{ui_kit => uiKit}/utils/Extensions.kt | 6 +- .../com/shurdev/ui_kit/errors/ErrorView.kt | 9 -- .../java/com/shurdev/ui_kit/loaders/Loader.kt | 12 -- .../main/java/com/shurdev/utils/Extensions.kt | 2 +- .../src/main/java/com/shurdev/utils/Utils.kt | 4 - 45 files changed, 339 insertions(+), 333 deletions(-) create mode 100644 .editorconfig rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/components/MyPlantItem.kt (81%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/navigation/MyPlantsNavigation.kt (67%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/details/MyPlantDetailsScreen.kt (64%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/details/viewModel/MyPlantDetailsUiState.kt (51%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/details/viewModel/MyPlantDetailsViewModel.kt (96%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/myPlants/MyPlantsScreen.kt (72%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/myPlants/viewModel/MyPlantsUiState.kt (85%) rename features/my_plants/src/main/java/com/shurdev/{my_plants => myPlants}/screens/myPlants/viewModel/MyPlantsViewModel.kt (95%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/actions/FavoriteAction.kt (83%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/buttons/BackButton.kt (65%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/buttons/PrimaryButton.kt (89%) create mode 100644 ui_kit/src/main/java/com/shurdev/uiKit/errors/ErrorView.kt rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/fields/SearchField.kt (90%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/layouts/Center.kt (71%) create mode 100644 ui_kit/src/main/java/com/shurdev/uiKit/loaders/Loader.kt rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/theme/Color.kt (83%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/theme/Theme.kt (92%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/theme/Typography.kt (98%) rename ui_kit/src/main/java/com/shurdev/{ui_kit => uiKit}/utils/Extensions.kt (92%) delete mode 100644 ui_kit/src/main/java/com/shurdev/ui_kit/errors/ErrorView.kt delete mode 100644 ui_kit/src/main/java/com/shurdev/ui_kit/loaders/Loader.kt delete mode 100644 utils/src/main/java/com/shurdev/utils/Utils.kt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c71db85 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +# noinspection EditorConfigKeyCorrectness +[*.{kt,kts}] +ktlint_standard_multiline-expression-wrapping = disabled +ktlint_function_naming_ignore_when_annotated_with = Composable +ktlint_standard_annotation = disabled +ktlint_standard_function-expression-body = disabled \ No newline at end of file diff --git a/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt b/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt index 35a4b54..683b278 100644 --- a/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt +++ b/app/src/main/java/com/shurdev/flowerapp/MainActivity.kt @@ -5,7 +5,7 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import com.shurdev.flowerapp.presentation.FlowerApp -import com.shurdev.ui_kit.theme.FlowerAppTheme +import com.shurdev.uiKit.theme.FlowerAppTheme import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt b/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt index c25e757..a3f6b6b 100644 --- a/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt +++ b/app/src/main/java/com/shurdev/flowerapp/presentation/BottomNavigationItems.kt @@ -2,7 +2,7 @@ package com.shurdev.flowerapp.presentation import com.shurdev.flowerapp.R import com.shurdev.gallery.navigation.GalleryNavGraph -import com.shurdev.my_plants.navigation.MyPlantsNavGraph +import com.shurdev.myPlants.navigation.MyPlantsNavGraph import kotlinx.serialization.Serializable @Serializable @@ -27,11 +27,4 @@ sealed class BottomNavigationItems( unSelectedIconResId = R.drawable.icon_flower_unfilled, route = GalleryNavGraph, ) - - // TODO - /* - @Serializable - data object Settings : BottomNavigationItems{ - - }*/ } diff --git a/app/src/main/java/com/shurdev/flowerapp/presentation/FlowerApp.kt b/app/src/main/java/com/shurdev/flowerapp/presentation/FlowerApp.kt index ba0f6ca..a627ace 100644 --- a/app/src/main/java/com/shurdev/flowerapp/presentation/FlowerApp.kt +++ b/app/src/main/java/com/shurdev/flowerapp/presentation/FlowerApp.kt @@ -10,9 +10,9 @@ import androidx.navigation.compose.rememberNavController import com.shurdev.flowerapp.presentation.composables.AppBottomNavigation import com.shurdev.gallery.navigation.galleryNavGraph import com.shurdev.gallery.navigation.navigateToGalleryPlantDetailsScreen -import com.shurdev.my_plants.navigation.MyPlantsNavGraph -import com.shurdev.my_plants.navigation.myPlantsNavGraph -import com.shurdev.my_plants.navigation.navigateToMyPlantDetailsScreen +import com.shurdev.myPlants.navigation.MyPlantsNavGraph +import com.shurdev.myPlants.navigation.myPlantsNavGraph +import com.shurdev.myPlants.navigation.navigateToMyPlantDetailsScreen @Composable fun FlowerApp() { @@ -23,21 +23,20 @@ fun FlowerApp() { BottomAppBar { AppBottomNavigation(navController) } - } + }, ) { padding -> NavHost( modifier = Modifier.padding(padding), navController = navController, startDestination = MyPlantsNavGraph, ) { - galleryNavGraph( onPop = navController::navigateUp, onPlantClick = { plant -> plant.id?.let { navController.navigateToGalleryPlantDetailsScreen(plantId = it) } - } + }, ) myPlantsNavGraph( @@ -45,8 +44,8 @@ fun FlowerApp() { plant.id?.let { navController.navigateToMyPlantDetailsScreen(plantId = it) } - } + }, ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt b/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt index 91b5810..6895df7 100644 --- a/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt +++ b/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt @@ -1,5 +1,6 @@ package com.shurdev.flowerapp.presentation.composables +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar @@ -18,8 +19,10 @@ import androidx.navigation.compose.currentBackStackEntryAsState import com.shurdev.flowerapp.presentation.BottomNavigationItems @Composable -fun AppBottomNavigation(navController: NavController) { - +fun AppBottomNavigation( + navController: NavController, + modifier: Modifier = Modifier, +) { val bottomNavigationItems = remember { listOf( BottomNavigationItems.MyPlants, @@ -27,23 +30,30 @@ fun AppBottomNavigation(navController: NavController) { ) } - NavigationBar { + NavigationBar( + modifier = modifier + .fillMaxWidth() + .size(20.dp) + .size(20.dp), + ) { val currentDestination = navController.currentBackStackEntryAsState().value?.destination bottomNavigationItems.forEach { item -> - val isSelected = currentDestination?.hierarchy?.any { - it.hasRoute(item.route::class) - } ?: false + val isSelected = + currentDestination?.hierarchy?.any { + it.hasRoute(item.route::class) + } ?: false NavigationBarItem( icon = { Icon( modifier = Modifier.size(24.dp), - painter = painterResource( - id = if (isSelected) item.selectedIconResId else item.unSelectedIconResId - ), - contentDescription = item.name + painter = + painterResource( + id = if (isSelected) item.selectedIconResId else item.unSelectedIconResId, + ), + contentDescription = item.name, ) }, label = { @@ -58,8 +68,8 @@ fun AppBottomNavigation(navController: NavController) { launchSingleTop = true // restoreState = true } - } + }, ) } } -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/shurdev/domain/models/Plant.kt b/domain/src/main/java/com/shurdev/domain/models/Plant.kt index 841f631..ec74a53 100644 --- a/domain/src/main/java/com/shurdev/domain/models/Plant.kt +++ b/domain/src/main/java/com/shurdev/domain/models/Plant.kt @@ -7,4 +7,4 @@ data class Plant( val name: String, val description: String, val imageLink: String, -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/shurdev/domain/models/PlantFilters.kt b/domain/src/main/java/com/shurdev/domain/models/PlantFilters.kt index f47f419..caabcd3 100644 --- a/domain/src/main/java/com/shurdev/domain/models/PlantFilters.kt +++ b/domain/src/main/java/com/shurdev/domain/models/PlantFilters.kt @@ -2,5 +2,5 @@ package com.shurdev.domain.models data class PlantFilters( val name: String?, - val description: String? + val description: String?, ) diff --git a/domain/src/main/java/com/shurdev/domain/repositories/PlantRepository.kt b/domain/src/main/java/com/shurdev/domain/repositories/PlantRepository.kt index fc1e717..a77a863 100644 --- a/domain/src/main/java/com/shurdev/domain/repositories/PlantRepository.kt +++ b/domain/src/main/java/com/shurdev/domain/repositories/PlantRepository.kt @@ -7,4 +7,4 @@ interface PlantRepository { suspend fun getPlants(filters: PlantFilters? = null): List suspend fun getPlantById(id: Int): Plant? -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoriesList.kt b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoriesList.kt index 65b252e..531b4bd 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoriesList.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoriesList.kt @@ -10,20 +10,20 @@ import androidx.compose.ui.unit.dp @Composable internal fun PlantCategoriesList( - modifier: Modifier = Modifier, categories: List, - onCategoryClick: (String) -> Unit + onCategoryClick: (String) -> Unit, + modifier: Modifier = Modifier, ) { LazyRow( modifier = modifier .padding(top = 12.dp), - contentPadding = PaddingValues(start = 16.dp) + contentPadding = PaddingValues(start = 16.dp), ) { items(categories) { category -> PlantCategoryItem( category = category, - onCategoryClick = onCategoryClick + onCategoryClick = onCategoryClick, ) } } -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoryItem.kt b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoryItem.kt index fdff5b4..34a315e 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoryItem.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantCategoryItem.kt @@ -16,28 +16,28 @@ import com.shurdev.gallery.mocks.CATEGORIES @Composable internal fun PlantCategoryItem( - modifier: Modifier = Modifier, category: String, - onCategoryClick: (String) -> Unit + onCategoryClick: (String) -> Unit, + modifier: Modifier = Modifier, ) { OutlinedCard( modifier = modifier .padding(end = 8.dp), colors = CardDefaults.cardColors( - containerColor = Color.Transparent + containerColor = Color.Transparent, ), shape = RoundedCornerShape(20.dp), - onClick = { onCategoryClick(category) } + onClick = { onCategoryClick(category) }, ) { Column { Text( modifier = Modifier .padding( vertical = 4.dp, - horizontal = 12.dp + horizontal = 12.dp, ), text = category, - fontSize = 14.sp + fontSize = 14.sp, ) } } @@ -48,6 +48,6 @@ internal fun PlantCategoryItem( internal fun PlantCategoryItemPreview() { PlantCategoryItem( category = CATEGORIES[0], - onCategoryClick = {} + onCategoryClick = {}, ) -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantItem.kt b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantItem.kt index 4f5e1d1..3e2aff7 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantItem.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantItem.kt @@ -33,9 +33,9 @@ import com.shurdev.gallery.mocks.Plants @Composable internal fun PlantItem( - modifier: Modifier = Modifier, plant: Plant, onPlantClick: (Plant) -> Unit, + modifier: Modifier = Modifier, ) { val configuration = LocalConfiguration.current val screenWidth = configuration.screenWidthDp.dp @@ -50,28 +50,28 @@ internal fun PlantItem( topStart = 12.dp, topEnd = 0.dp, bottomStart = 12.dp, - bottomEnd = 0.dp + bottomEnd = 0.dp, ), colors = CardDefaults.cardColors( containerColor = Color.Transparent, - - ), + ), ) { Row( modifier = Modifier .fillMaxSize() - .background(Color.Transparent) + .background(Color.Transparent), ) { AsyncImage( modifier = Modifier .size(imageSize) .clip(RoundedCornerShape(12.dp)), - model = ImageRequest.Builder(LocalContext.current) + model = ImageRequest + .Builder(LocalContext.current) .data(plant.imageLink) .placeholder(R.drawable.flower_placeholder_1) .build(), contentDescription = "Your Plant", - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) val paddingTop = 12.dp @@ -80,21 +80,20 @@ internal fun PlantItem( modifier = Modifier .padding( start = 12.dp, - top = paddingTop - ) - .height(imageSize - paddingTop) + top = paddingTop, + ).height(imageSize - paddingTop) .background(Color.Transparent), verticalArrangement = Arrangement.SpaceBetween, ) { Column( modifier = Modifier - .background(Color.Transparent) + .background(Color.Transparent), ) { Text( text = plant.name, fontSize = 20.sp, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) Text( @@ -102,7 +101,7 @@ internal fun PlantItem( fontSize = 12.sp, color = Color.Gray, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } @@ -110,7 +109,7 @@ internal fun PlantItem( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(Color.LightGray) + .background(Color.LightGray), ) } } @@ -122,6 +121,6 @@ internal fun PlantItem( internal fun PlantItemPreview() { PlantItem( plant = Plants[0], - onPlantClick = {} + onPlantClick = {}, ) -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantsList.kt b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantsList.kt index 1f106f5..9a5f8bd 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/components/PlantsList.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/components/PlantsList.kt @@ -14,9 +14,9 @@ import com.shurdev.gallery.mocks.Plants @Composable internal fun PlantsList( - modifier: Modifier = Modifier, plants: List, - onPlantClick: (Plant) -> Unit + onPlantClick: (Plant) -> Unit, + modifier: Modifier = Modifier, ) { LazyColumn( modifier = modifier @@ -26,12 +26,12 @@ internal fun PlantsList( items(plants) { plant -> PlantItem( plant = plant, - onPlantClick = onPlantClick + onPlantClick = onPlantClick, ) Spacer( modifier = Modifier - .height(10.dp) + .height(10.dp), ) } } @@ -42,6 +42,6 @@ internal fun PlantsList( internal fun PlantsListPreview() { PlantsList( plants = Plants, - onPlantClick = {} + onPlantClick = {}, ) -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/mocks/Categories.kt b/features/gallery/src/main/java/com/shurdev/gallery/mocks/Categories.kt index 9a7621e..8e71082 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/mocks/Categories.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/mocks/Categories.kt @@ -1,5 +1,11 @@ package com.shurdev.gallery.mocks val CATEGORIES = listOf( - "Неприхотливые", "Суккуленты", "Любят свет", "Много вредителей", "Часто поливать", "Долго цветут", "Колючие" -) \ No newline at end of file + "Неприхотливые", + "Суккуленты", + "Любят свет", + "Много вредителей", + "Часто поливать", + "Долго цветут", + "Колючие", +) diff --git a/features/gallery/src/main/java/com/shurdev/gallery/mocks/Plants.kt b/features/gallery/src/main/java/com/shurdev/gallery/mocks/Plants.kt index 596753b..eb9e4d6 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/mocks/Plants.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/mocks/Plants.kt @@ -2,11 +2,10 @@ package com.shurdev.gallery.mocks import com.shurdev.domain.models.Plant -val Plants = (1..10) - .map { - Plant( - name = "Подсолнух обыкновенный", - description = "Description$it", - imageLink = "https://cdn.britannica.com/84/73184-050-05ED59CB/Sunflower-field-Fargo-North-Dakota.jpg" - ) - } \ No newline at end of file +val Plants = (1..10).map { + Plant( + name = "Подсолнух обыкновенный", + description = "Description$it", + imageLink = "https://cdn.britannica.com/84/73184-050-05ED59CB/Sunflower-field-Fargo-North-Dakota.jpg", + ) +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/navigation/GalleryNavigation.kt b/features/gallery/src/main/java/com/shurdev/gallery/navigation/GalleryNavigation.kt index 9e0fcd8..0a8cf97 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/navigation/GalleryNavigation.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/navigation/GalleryNavigation.kt @@ -11,7 +11,6 @@ import com.shurdev.gallery.screens.details.GalleryPlantDetailsRoute import com.shurdev.gallery.screens.gallery.GalleryRoute import kotlinx.serialization.Serializable - @Serializable object GalleryNavGraph @@ -26,7 +25,6 @@ fun NavGraphBuilder.galleryNavGraph( onPlantClick = onPlantClick, ) - galleryPlantDetailsScreen( onPop = onPop, ) @@ -36,9 +34,7 @@ fun NavGraphBuilder.galleryNavGraph( @Serializable object GalleryRoute -fun NavGraphBuilder.galleryScreen( - onPlantClick: (Plant) -> Unit, -) { +fun NavGraphBuilder.galleryScreen(onPlantClick: (Plant) -> Unit) { composable { GalleryRoute( onPlantClick = onPlantClick, @@ -46,22 +42,20 @@ fun NavGraphBuilder.galleryScreen( } } - @Serializable -data class GalleryPlantDetails(val plantId: PlantId) +data class GalleryPlantDetails( + val plantId: PlantId, +) -fun NavController.navigateToGalleryPlantDetailsScreen(plantId: PlantId) = - navigate(GalleryPlantDetails(plantId)) +fun NavController.navigateToGalleryPlantDetailsScreen(plantId: PlantId) = navigate(GalleryPlantDetails(plantId)) -fun NavGraphBuilder.galleryPlantDetailsScreen( - onPop: () -> Unit, -) { +fun NavGraphBuilder.galleryPlantDetailsScreen(onPop: () -> Unit) { composable { backStackEntry -> val plantDetails: GalleryPlantDetails = backStackEntry.toRoute() GalleryPlantDetailsRoute( plantId = plantDetails.plantId, - onPop = onPop + onPop = onPop, ) } -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/GalleryPlantDetailsScreen.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/GalleryPlantDetailsScreen.kt index 098677b..644b843 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/GalleryPlantDetailsScreen.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/GalleryPlantDetailsScreen.kt @@ -30,30 +30,31 @@ import androidx.hilt.navigation.compose.hiltViewModel import coil.compose.AsyncImage import coil.request.ImageRequest import com.shurdev.domain.models.Plant -import com.shurdev.gallery.R import com.shurdev.gallery.mocks.Plants import com.shurdev.gallery.screens.details.viewModel.GalleryPlantDetailsErrorState import com.shurdev.gallery.screens.details.viewModel.GalleryPlantDetailsLoadedState import com.shurdev.gallery.screens.details.viewModel.GalleryPlantDetailsLoadingState import com.shurdev.gallery.screens.details.viewModel.GalleryPlantDetailsUiState import com.shurdev.gallery.screens.details.viewModel.GalleryPlantDetailsViewModel -import com.shurdev.ui_kit.actions.FavoriteAction -import com.shurdev.ui_kit.buttons.BackButton -import com.shurdev.ui_kit.buttons.PrimaryButton -import com.shurdev.ui_kit.errors.ErrorView -import com.shurdev.ui_kit.loaders.Loader -import com.shurdev.ui_kit.R as uiKitResource +import com.shurdev.uiKit.actions.FavoriteAction +import com.shurdev.uiKit.buttons.BackButton +import com.shurdev.uiKit.buttons.PrimaryButton +import com.shurdev.uiKit.errors.ErrorView +import com.shurdev.uiKit.loaders.Loader +import com.shurdev.ui_kit.R @Composable internal fun GalleryPlantDetailsRoute( plantId: Int, onPop: () -> Unit, + // TODO: Refactor + viewModel: GalleryPlantDetailsViewModel = hiltViewModel< + GalleryPlantDetailsViewModel, + GalleryPlantDetailsViewModel.ViewModelFactory, + > { factory -> + factory.create(plantId) + }, ) { - val viewModel = - hiltViewModel { factory -> - factory.create(plantId) - } - val uiState by viewModel.uiState.collectAsState() GalleryPlantDetailsScreen( @@ -77,9 +78,9 @@ internal fun GalleryPlantDetailsScreen( // TODO: Implement me FavoriteAction( isActive = false, - onClick = {} + onClick = {}, ) - } + }, ) Box( Modifier @@ -95,16 +96,14 @@ internal fun GalleryPlantDetailsScreen( } @Composable -internal fun GalleryPlantDetailsContent( - plant: Plant, -) { +internal fun GalleryPlantDetailsContent(plant: Plant) { val typography = MaterialTheme.typography Column { Column( Modifier .weight(1f) - .verticalScroll(rememberScrollState()) + .verticalScroll(rememberScrollState()), ) { AsyncImage( modifier = Modifier @@ -112,12 +111,13 @@ internal fun GalleryPlantDetailsContent( .fillMaxWidth() .aspectRatio(1F) .height(400.dp), - model = ImageRequest.Builder(LocalContext.current) + model = ImageRequest + .Builder(LocalContext.current) .data(plant.imageLink) - .placeholder(R.drawable.flower_placeholder_1) + .placeholder(com.shurdev.gallery.R.drawable.flower_placeholder_1) .build(), contentDescription = "Your Plant", - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) Spacer(Modifier.height(12.dp)) @@ -130,11 +130,11 @@ internal fun GalleryPlantDetailsContent( Spacer(Modifier.height(12.dp)) Text( - text = plant.description + text = plant.description, ) } - val addPlant = stringResource(uiKitResource.string.add_plant) + val addPlant = stringResource(R.string.add_plant) PrimaryButton( modifier = Modifier.fillMaxWidth(), @@ -152,7 +152,7 @@ internal fun GalleryPlantDetailsScreenPreview() { GalleryPlantDetailsScreen( onPop = {}, uiState = GalleryPlantDetailsLoadedState( - plant = Plants[0] + plant = Plants[0], ), ) -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsUiState.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsUiState.kt index 5ab7bdc..1c4e052 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsUiState.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsUiState.kt @@ -10,7 +10,9 @@ sealed class GalleryPlantDetailsUiState data object GalleryPlantDetailsLoadingState : GalleryPlantDetailsUiState() @Stable -data class GalleryPlantDetailsLoadedState(val plant: Plant) : GalleryPlantDetailsUiState() +data class GalleryPlantDetailsLoadedState( + val plant: Plant, +) : GalleryPlantDetailsUiState() @Stable data object GalleryPlantDetailsErrorState : GalleryPlantDetailsUiState() diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsViewModel.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsViewModel.kt index d4c49e8..59e46e8 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsViewModel.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/details/viewModel/GalleryPlantDetailsViewModel.kt @@ -18,7 +18,6 @@ class GalleryPlantDetailsViewModel @AssistedInject constructor( @Assisted private val plantId: Int, private val plantRepository: PlantRepository, ) : ViewModel() { - private var _uiState = MutableStateFlow(GalleryPlantDetailsLoadingState) @@ -35,6 +34,7 @@ class GalleryPlantDetailsViewModel @AssistedInject constructor( runSuspendCatching { val plant = plantRepository.getPlantById(id) + // TODO: Refactor if (plant != null) { _uiState.value = GalleryPlantDetailsLoadedState(plant = plant) } else { @@ -48,7 +48,6 @@ class GalleryPlantDetailsViewModel @AssistedInject constructor( @AssistedFactory interface ViewModelFactory { - fun create(plantId: PlantId): GalleryPlantDetailsViewModel } -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/GalleryScreen.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/GalleryScreen.kt index 0d05b53..b90b6dc 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/GalleryScreen.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/GalleryScreen.kt @@ -3,7 +3,6 @@ package com.shurdev.gallery.screens.gallery import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -26,23 +25,22 @@ import com.shurdev.gallery.screens.gallery.viewModel.GalleryLoadingErrorState import com.shurdev.gallery.screens.gallery.viewModel.GalleryLoadingState import com.shurdev.gallery.screens.gallery.viewModel.GalleryUiState import com.shurdev.gallery.screens.gallery.viewModel.GalleryViewModel -import com.shurdev.ui_kit.fields.SearchField -import com.shurdev.ui_kit.errors.ErrorView -import com.shurdev.ui_kit.loaders.Loader +import com.shurdev.uiKit.errors.ErrorView +import com.shurdev.uiKit.fields.SearchField +import com.shurdev.uiKit.loaders.Loader @Composable internal fun GalleryRoute( onPlantClick: (Plant) -> Unit, + galleryViewModel: GalleryViewModel = hiltViewModel(), ) { - val galleryViewModel = hiltViewModel() - val uiState by galleryViewModel.uiState.collectAsState() GalleryScreen( uiState = uiState, onPlantClick = onPlantClick, onCategoryClick = {}, - onSearchTextChange = galleryViewModel::onSearchTextChange + onSearchTextChange = galleryViewModel::onSearchTextChange, ) } @@ -53,56 +51,63 @@ internal fun GalleryScreen( onCategoryClick: (String) -> Unit, onSearchTextChange: (String) -> Unit, ) { + when (uiState) { + GalleryLoadingErrorState -> ErrorView() + GalleryLoadingState -> Loader() + is GalleryLoadedState -> GalleryScreenContent( + plants = uiState.plants, + onPlantClick = onPlantClick, + onCategoryClick = onCategoryClick, + onSearchTextChange = onSearchTextChange, + ) + } +} - Scaffold { padding -> - when (uiState) { - is GalleryLoadedState -> { - Column( - modifier = Modifier - ) { - Text( - modifier = Modifier - .padding(horizontal = 16.dp) - .padding(top = 20.dp) - .fillMaxWidth(), - text = stringResource(R.string.search), - fontSize = 24.sp, - fontWeight = FontWeight.Bold - ) - - SearchField( - modifier = Modifier - .padding(top = 10.dp) - .padding(horizontal = 16.dp), - hint = stringResource(R.string.search_hint), - onSearchTextChange = onSearchTextChange, - debounceTimeMillis = 800L - ) +@Composable +internal fun GalleryScreenContent( + plants: List, + onPlantClick: (Plant) -> Unit, + onCategoryClick: (String) -> Unit, + onSearchTextChange: (String) -> Unit, +) { + Column { + Text( + modifier = Modifier + .padding(horizontal = 16.dp) + .padding(top = 20.dp) + .fillMaxWidth(), + text = stringResource(R.string.search), + fontSize = 24.sp, + fontWeight = FontWeight.Bold, + ) - PlantCategoriesList( - categories = CATEGORIES, - onCategoryClick = onCategoryClick - ) + SearchField( + modifier = Modifier + .padding(top = 10.dp) + .padding(horizontal = 16.dp), + hint = stringResource(R.string.search_hint), + onSearchTextChange = onSearchTextChange, + debounceTimeMillis = 800L, + ) - Text( - modifier = Modifier - .padding(top = 20.dp) - .padding(horizontal = 16.dp), - text = stringResource(R.string.popular_plants), - fontSize = 20.sp, - fontWeight = FontWeight.Normal - ) + PlantCategoriesList( + categories = CATEGORIES, + onCategoryClick = onCategoryClick, + ) - PlantsList( - plants = uiState.plants, - onPlantClick = onPlantClick - ) - } - } + Text( + modifier = Modifier + .padding(top = 20.dp) + .padding(horizontal = 16.dp), + text = stringResource(R.string.popular_plants), + fontSize = 20.sp, + fontWeight = FontWeight.Normal, + ) - GalleryLoadingErrorState -> ErrorView() - GalleryLoadingState -> Loader() - } + PlantsList( + plants = plants, + onPlantClick = onPlantClick, + ) } } @@ -111,10 +116,10 @@ internal fun GalleryScreen( internal fun GalleryScreenPreview() { GalleryScreen( uiState = GalleryLoadedState( - plants = Plants + plants = Plants, ), onPlantClick = {}, onCategoryClick = {}, onSearchTextChange = {}, ) -} \ No newline at end of file +} diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryUiState.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryUiState.kt index ca0be72..fc76ea3 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryUiState.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryUiState.kt @@ -10,7 +10,9 @@ sealed class GalleryUiState data object GalleryLoadingState : GalleryUiState() @Stable -data class GalleryLoadedState(val plants: List) : GalleryUiState() +data class GalleryLoadedState( + val plants: List, +) : GalleryUiState() @Stable data object GalleryLoadingErrorState : GalleryUiState() diff --git a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryViewModel.kt b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryViewModel.kt index 27e02cc..d3e14dc 100644 --- a/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryViewModel.kt +++ b/features/gallery/src/main/java/com/shurdev/gallery/screens/gallery/viewModel/GalleryViewModel.kt @@ -17,7 +17,6 @@ import javax.inject.Inject class GalleryViewModel @Inject constructor( private val plantRepository: PlantRepository, ) : ViewModel() { - private var _uiState = MutableStateFlow(GalleryLoadingState) val uiState: StateFlow = _uiState.asStateFlow() @@ -50,7 +49,7 @@ class GalleryViewModel @Inject constructor( filters = PlantFilters( name = query, description = query, - ) + ), ) _uiState.update { GalleryLoadedState(plants = plants) } @@ -59,4 +58,4 @@ class GalleryViewModel @Inject constructor( } } } -} \ No newline at end of file +} diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/components/MyPlantItem.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/components/MyPlantItem.kt similarity index 81% rename from features/my_plants/src/main/java/com/shurdev/my_plants/components/MyPlantItem.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/components/MyPlantItem.kt index fdd3116..c1ec547 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/components/MyPlantItem.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/components/MyPlantItem.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.components +package com.shurdev.myPlants.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -22,23 +22,23 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import com.shurdev.domain.models.Plant import com.shurdev.my_plants.R -import com.shurdev.ui_kit.theme.PlantCardBackgroundColor -import com.shurdev.ui_kit.theme.PlantCardContentColor +import com.shurdev.uiKit.theme.PlantCardBackgroundColor +import com.shurdev.uiKit.theme.PlantCardContentColor @Composable fun MyPlantItem( - modifier: Modifier = Modifier, plant: Plant, onItemClick: (Plant) -> Unit, + modifier: Modifier = Modifier, ) { Card( modifier = modifier, shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors( containerColor = PlantCardBackgroundColor, - contentColor = PlantCardContentColor + contentColor = PlantCardContentColor, ), - onClick = { onItemClick(plant) } + onClick = { onItemClick(plant) }, ) { Row( modifier = Modifier @@ -51,22 +51,23 @@ fun MyPlantItem( .fillMaxWidth(0.25f) .aspectRatio(1F) .clip(RoundedCornerShape(12.dp)), - model = ImageRequest.Builder(LocalContext.current) + model = ImageRequest + .Builder(LocalContext.current) .data(plant.imageLink) .placeholder(R.drawable.flower_placeholder_1) .build(), contentDescription = "Your Plant", - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) Column( Modifier .padding(horizontal = 17.dp) - .padding(top = 12.dp) + .padding(top = 12.dp), ) { Text( text = plant.name, - fontSize = 22.sp + fontSize = 22.sp, ) Text( @@ -79,13 +80,13 @@ fun MyPlantItem( @Composable @Preview -fun MyPlantItemPreview() { +private fun MyPlantItemPreview() { MyPlantItem( plant = Plant( name = "Пахира Акватика", description = "Дата следующего полива", - imageLink = "" + imageLink = "", ), - onItemClick = {} + onItemClick = {}, ) } diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/navigation/MyPlantsNavigation.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/navigation/MyPlantsNavigation.kt similarity index 67% rename from features/my_plants/src/main/java/com/shurdev/my_plants/navigation/MyPlantsNavigation.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/navigation/MyPlantsNavigation.kt index adf47a3..44d0c03 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/navigation/MyPlantsNavigation.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/navigation/MyPlantsNavigation.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.navigation +package com.shurdev.myPlants.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder @@ -7,18 +7,16 @@ import androidx.navigation.compose.navigation import androidx.navigation.toRoute import com.shurdev.domain.models.Plant import com.shurdev.domain.models.PlantId -import com.shurdev.my_plants.screens.details.MyPlantDetailsRoute -import com.shurdev.my_plants.screens.myPlants.MyPlantsRoute +import com.shurdev.myPlants.screens.details.MyPlantDetailsRoute +import com.shurdev.myPlants.screens.myPlants.MyPlantsRoute import kotlinx.serialization.Serializable @Serializable object MyPlantsNavGraph -fun NavGraphBuilder.myPlantsNavGraph( - onPlantClick: (Plant) -> Unit, -) { +fun NavGraphBuilder.myPlantsNavGraph(onPlantClick: (Plant) -> Unit) { navigation( - startDestination = MyPlantsRoute + startDestination = MyPlantsRoute, ) { myPlantsScreen( onPlantClick = onPlantClick, @@ -31,9 +29,7 @@ fun NavGraphBuilder.myPlantsNavGraph( @Serializable object MyPlantsRoute -fun NavGraphBuilder.myPlantsScreen( - onPlantClick: (Plant) -> Unit, -) { +fun NavGraphBuilder.myPlantsScreen(onPlantClick: (Plant) -> Unit) { composable { MyPlantsRoute( onPlantClick = onPlantClick, @@ -42,17 +38,18 @@ fun NavGraphBuilder.myPlantsScreen( } @Serializable -data class MyPlantDetails(val plantId: PlantId) +data class MyPlantDetails( + val plantId: PlantId, +) -fun NavController.navigateToMyPlantDetailsScreen(plantId: PlantId) = - navigate(MyPlantDetails(plantId)) +fun NavController.navigateToMyPlantDetailsScreen(plantId: PlantId) = navigate(MyPlantDetails(plantId)) fun NavGraphBuilder.myPlantDetailsScreen() { composable { backStackEntry -> val plantDetails: MyPlantDetails = backStackEntry.toRoute() MyPlantDetailsRoute( - plantId = plantDetails.plantId + plantId = plantDetails.plantId, ) } } diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/MyPlantDetailsScreen.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/MyPlantDetailsScreen.kt similarity index 64% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/MyPlantDetailsScreen.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/MyPlantDetailsScreen.kt index 0389373..6308e29 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/MyPlantDetailsScreen.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/MyPlantDetailsScreen.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.screens.details +package com.shurdev.myPlants.screens.details import androidx.compose.foundation.layout.Column import androidx.compose.foundation.shape.RoundedCornerShape @@ -16,23 +16,24 @@ import androidx.hilt.navigation.compose.hiltViewModel import coil.compose.AsyncImage import coil.request.ImageRequest import com.shurdev.domain.models.Plant +import com.shurdev.myPlants.screens.details.viewModel.MyPlantDetailsErrorState +import com.shurdev.myPlants.screens.details.viewModel.MyPlantDetailsLoadedState +import com.shurdev.myPlants.screens.details.viewModel.MyPlantDetailsLoadingState +import com.shurdev.myPlants.screens.details.viewModel.MyPlantDetailsUiState +import com.shurdev.myPlants.screens.details.viewModel.MyPlantDetailsViewModel import com.shurdev.my_plants.R -import com.shurdev.my_plants.screens.details.viewModel.MyPlantDetailsErrorState -import com.shurdev.my_plants.screens.details.viewModel.MyPlantDetailsLoadedState -import com.shurdev.my_plants.screens.details.viewModel.MyPlantDetailsLoadingState -import com.shurdev.my_plants.screens.details.viewModel.MyPlantDetailsUiState -import com.shurdev.my_plants.screens.details.viewModel.MyPlantDetailsViewModel -import com.shurdev.ui_kit.layouts.Center +import com.shurdev.uiKit.layouts.Center @Composable internal fun MyPlantDetailsRoute( plantId: Int, + viewModel: MyPlantDetailsViewModel = hiltViewModel< + MyPlantDetailsViewModel, + MyPlantDetailsViewModel.ViewModelFactory, + > { factory -> + factory.create(plantId) + }, ) { - val viewModel = - hiltViewModel { factory -> - factory.create(plantId) - } - val uiState by viewModel.uiState.collectAsState() MyPlantDetailsScreen( @@ -41,45 +42,40 @@ internal fun MyPlantDetailsRoute( } @Composable -internal fun MyPlantDetailsScreen( - uiState: MyPlantDetailsUiState, -) { - +internal fun MyPlantDetailsScreen(uiState: MyPlantDetailsUiState) { when (uiState) { is MyPlantDetailsLoadedState -> { val plant = uiState.plant Text( - text = "My plant details" + text = "My plant details", ) Center { Column { - AsyncImage( modifier = Modifier .clip(RoundedCornerShape(12.dp)), - model = ImageRequest.Builder(LocalContext.current) + model = ImageRequest + .Builder(LocalContext.current) .data(plant.imageLink) .placeholder(R.drawable.flower_placeholder_1) .build(), contentDescription = "Your Plant", - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) Text( - text = plant.id.toString() + text = plant.id.toString(), ) Text( - text = plant.name + text = plant.name, ) Text( - text = plant.description + text = plant.description, ) - - } } } @@ -99,7 +95,7 @@ internal fun MyPlantDetailsScreen( internal fun MyPlantDetailsScreenPreview() { MyPlantDetailsScreen( uiState = MyPlantDetailsLoadedState( - plant = Plant(1, "Тюльпан", "Великолепный", "") - ) + plant = Plant(1, "Тюльпан", "Великолепный", ""), + ), ) } diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsUiState.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsUiState.kt similarity index 51% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsUiState.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsUiState.kt index 3d7dd86..800f73c 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsUiState.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsUiState.kt @@ -1,18 +1,18 @@ -package com.shurdev.my_plants.screens.details.viewModel +package com.shurdev.myPlants.screens.details.viewModel import androidx.compose.runtime.Stable import com.shurdev.domain.models.Plant - @Stable sealed class MyPlantDetailsUiState - @Stable data object MyPlantDetailsLoadingState : MyPlantDetailsUiState() @Stable -data class MyPlantDetailsLoadedState(val plant: Plant) : MyPlantDetailsUiState() +data class MyPlantDetailsLoadedState( + val plant: Plant, +) : MyPlantDetailsUiState() @Stable -data object MyPlantDetailsErrorState : MyPlantDetailsUiState() \ No newline at end of file +data object MyPlantDetailsErrorState : MyPlantDetailsUiState() diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsViewModel.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsViewModel.kt similarity index 96% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsViewModel.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsViewModel.kt index ef88989..1748d4e 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/details/viewModel/MyPlantDetailsViewModel.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/details/viewModel/MyPlantDetailsViewModel.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.screens.details.viewModel +package com.shurdev.myPlants.screens.details.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -18,7 +18,6 @@ class MyPlantDetailsViewModel @AssistedInject constructor( @Assisted private val plantId: Int, private val plantRepository: PlantRepository, ) : ViewModel() { - private var _uiState = MutableStateFlow(MyPlantDetailsLoadingState) @@ -48,7 +47,6 @@ class MyPlantDetailsViewModel @AssistedInject constructor( @AssistedFactory interface ViewModelFactory { - fun create(plantId: PlantId): MyPlantDetailsViewModel } -} \ No newline at end of file +} diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/MyPlantsScreen.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/MyPlantsScreen.kt similarity index 72% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/MyPlantsScreen.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/MyPlantsScreen.kt index d4d82bb..c5ee58d 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/MyPlantsScreen.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/MyPlantsScreen.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.screens.myPlants +package com.shurdev.myPlants.screens.myPlants import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Spacer @@ -19,26 +19,25 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import com.shurdev.domain.models.Plant +import com.shurdev.myPlants.components.MyPlantItem +import com.shurdev.myPlants.screens.myPlants.viewModel.MyPlantsLoadedState +import com.shurdev.myPlants.screens.myPlants.viewModel.MyPlantsLoadingErrorState +import com.shurdev.myPlants.screens.myPlants.viewModel.MyPlantsLoadingState +import com.shurdev.myPlants.screens.myPlants.viewModel.MyPlantsUiState +import com.shurdev.myPlants.screens.myPlants.viewModel.MyPlantsViewModel +import com.shurdev.uiKit.buttons.PrimaryButton +import com.shurdev.uiKit.errors.ErrorView +import com.shurdev.uiKit.loaders.Loader +import com.shurdev.uiKit.theme.AppBackgroundColor +import com.shurdev.uiKit.theme.PlantCardContentColor import com.shurdev.ui_kit.R -import com.shurdev.my_plants.components.MyPlantItem -import com.shurdev.my_plants.screens.myPlants.viewModel.MyPlantsLoadedState -import com.shurdev.my_plants.screens.myPlants.viewModel.MyPlantsLoadingErrorState -import com.shurdev.my_plants.screens.myPlants.viewModel.MyPlantsLoadingState -import com.shurdev.my_plants.screens.myPlants.viewModel.MyPlantsUiState -import com.shurdev.my_plants.screens.myPlants.viewModel.MyPlantsViewModel -import com.shurdev.ui_kit.buttons.PrimaryButton -import com.shurdev.ui_kit.errors.ErrorView -import com.shurdev.ui_kit.loaders.Loader -import com.shurdev.ui_kit.theme.AppBackgroundColor -import com.shurdev.ui_kit.theme.PlantCardContentColor @Composable internal fun MyPlantsRoute( onPlantClick: (Plant) -> Unit, + viewModel: MyPlantsViewModel = hiltViewModel(), ) { - val myPlantsViewModel = hiltViewModel() - - val uiState by myPlantsViewModel.uiState.collectAsState() + val uiState by viewModel.uiState.collectAsState() MyPlantsScreen( uiState = uiState, @@ -46,6 +45,7 @@ internal fun MyPlantsRoute( ) } +// TODO: Refactor @Composable internal fun MyPlantsScreen( uiState: MyPlantsUiState, @@ -65,14 +65,14 @@ internal fun MyPlantsScreen( Modifier .padding(padding) .padding(horizontal = 16.dp), - verticalArrangement = Arrangement.spacedBy(5.dp) + verticalArrangement = Arrangement.spacedBy(5.dp), ) { item { Text( text = myPlants, color = PlantCardContentColor, fontSize = 24.sp, - style = TextStyle(fontWeight = FontWeight.Bold) + style = TextStyle(fontWeight = FontWeight.Bold), ) Spacer(Modifier.height(12.dp)) @@ -80,7 +80,7 @@ internal fun MyPlantsScreen( PrimaryButton( text = addPlant, onClick = { - // Go to add plant screen + // TODO: Navigate to add plant screen }, ) @@ -90,11 +90,11 @@ internal fun MyPlantsScreen( items(uiState.plants) { plant -> MyPlantItem( plant = plant, - onItemClick = onPlantClick + onItemClick = onPlantClick, ) } } } } } -} \ No newline at end of file +} diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsUiState.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsUiState.kt similarity index 85% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsUiState.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsUiState.kt index 7662ae0..2e82c5f 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsUiState.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsUiState.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.screens.myPlants.viewModel +package com.shurdev.myPlants.screens.myPlants.viewModel import androidx.compose.runtime.Stable import com.shurdev.domain.models.Plant diff --git a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsViewModel.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt similarity index 95% rename from features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsViewModel.kt rename to features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt index 5ae6e34..36d5929 100644 --- a/features/my_plants/src/main/java/com/shurdev/my_plants/screens/myPlants/viewModel/MyPlantsViewModel.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt @@ -1,4 +1,4 @@ -package com.shurdev.my_plants.screens.myPlants.viewModel +package com.shurdev.myPlants.screens.myPlants.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 72fbe81..e068216 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,9 +18,6 @@ hiltNavigationFragment = "1.2.0" hilt = "2.51.1" ksp = "1.9.0-1.0.13" kotlinxSerializationJson = "1.6.3" -appcompat = "1.7.0" -material = "1.12.0" -runtimeAndroid = "1.7.2" uiTooling = "1.7.4" [libraries] @@ -50,9 +47,6 @@ hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", ve kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } -androidx-runtime-android = { group = "androidx.compose.runtime", name = "runtime-android", version.ref = "runtimeAndroid" } ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "uiTooling" } [plugins] diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/actions/FavoriteAction.kt b/ui_kit/src/main/java/com/shurdev/uiKit/actions/FavoriteAction.kt similarity index 83% rename from ui_kit/src/main/java/com/shurdev/ui_kit/actions/FavoriteAction.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/actions/FavoriteAction.kt index b4fccf0..b31e877 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/actions/FavoriteAction.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/actions/FavoriteAction.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.actions +package com.shurdev.uiKit.actions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Favorite @@ -6,6 +6,7 @@ import androidx.compose.material.icons.filled.FavoriteBorder import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.shurdev.ui_kit.R @@ -13,8 +14,10 @@ import com.shurdev.ui_kit.R fun FavoriteAction( onClick: () -> Unit, isActive: Boolean, + modifier: Modifier = Modifier, ) { IconButton( + modifier = modifier, onClick = onClick, ) { val icon = if (isActive) Icons.Default.Favorite else Icons.Default.FavoriteBorder @@ -22,4 +25,4 @@ fun FavoriteAction( Icon(icon, addToFavorite) } -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/buttons/BackButton.kt b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/BackButton.kt similarity index 65% rename from ui_kit/src/main/java/com/shurdev/ui_kit/buttons/BackButton.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/buttons/BackButton.kt index 343532f..0869690 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/buttons/BackButton.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/BackButton.kt @@ -1,16 +1,21 @@ -package com.shurdev.ui_kit.buttons +package com.shurdev.uiKit.buttons import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier @Composable fun BackButton( onClick: () -> Unit, + modifier: Modifier = Modifier, ) { - IconButton(onClick = onClick) { + IconButton( + modifier = modifier, + onClick = onClick, + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, null) } -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/buttons/PrimaryButton.kt b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt similarity index 89% rename from ui_kit/src/main/java/com/shurdev/ui_kit/buttons/PrimaryButton.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt index c5407b0..0d1cbc8 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/buttons/PrimaryButton.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.buttons +package com.shurdev.uiKit.buttons import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shurdev.ui_kit.theme.Black -import com.shurdev.ui_kit.theme.Green +import com.shurdev.uiKit.theme.Black +import com.shurdev.uiKit.theme.Green @Composable fun PrimaryButton( diff --git a/ui_kit/src/main/java/com/shurdev/uiKit/errors/ErrorView.kt b/ui_kit/src/main/java/com/shurdev/uiKit/errors/ErrorView.kt new file mode 100644 index 0000000..9ac384a --- /dev/null +++ b/ui_kit/src/main/java/com/shurdev/uiKit/errors/ErrorView.kt @@ -0,0 +1,13 @@ +package com.shurdev.uiKit.errors + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun ErrorView(modifier: Modifier = Modifier) { + Text( + modifier = modifier, + text = "ERRROR", + ) +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/fields/SearchField.kt b/ui_kit/src/main/java/com/shurdev/uiKit/fields/SearchField.kt similarity index 90% rename from ui_kit/src/main/java/com/shurdev/ui_kit/fields/SearchField.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/fields/SearchField.kt index e527e73..7dc36ad 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/fields/SearchField.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/fields/SearchField.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.fields +package com.shurdev.uiKit.fields import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxWidth @@ -19,22 +19,22 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shurdev.ui_kit.utils.useDebounce +import com.shurdev.uiKit.utils.useDebounce @Composable fun SearchField( + debounceTimeMillis: Long, + onSearchTextChange: (String) -> Unit, modifier: Modifier = Modifier, hint: String = "", searchText: String = "", - debounceTimeMillis: Long, - onSearchTextChange: (String) -> Unit, ) { var currentSearchText by remember { mutableStateOf(searchText) } currentSearchText.useDebounce( delayMillis = debounceTimeMillis, coroutineScope = rememberCoroutineScope(), - onChange = onSearchTextChange + onChange = onSearchTextChange, ) TextField( @@ -55,7 +55,7 @@ fun SearchField( colors = TextFieldDefaults.colors( focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, - disabledIndicatorColor = Color.Transparent + disabledIndicatorColor = Color.Transparent, ), shape = RoundedCornerShape(12.dp), ) @@ -63,11 +63,11 @@ fun SearchField( @Preview @Composable -fun SearchFieldPreview() { +private fun SearchFieldPreview() { SearchField( hint = "Поиск", searchText = "", debounceTimeMillis = 1000L, onSearchTextChange = {}, ) -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/layouts/Center.kt b/ui_kit/src/main/java/com/shurdev/uiKit/layouts/Center.kt similarity index 71% rename from ui_kit/src/main/java/com/shurdev/ui_kit/layouts/Center.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/layouts/Center.kt index a58b6bc..019cc9d 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/layouts/Center.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/layouts/Center.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.layouts +package com.shurdev.uiKit.layouts import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -9,13 +9,14 @@ import androidx.compose.ui.Modifier @Composable fun Center( + modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { Column( - modifier = Modifier.fillMaxSize(), + modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { content() } -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/uiKit/loaders/Loader.kt b/ui_kit/src/main/java/com/shurdev/uiKit/loaders/Loader.kt new file mode 100644 index 0000000..81ba200 --- /dev/null +++ b/ui_kit/src/main/java/com/shurdev/uiKit/loaders/Loader.kt @@ -0,0 +1,15 @@ +package com.shurdev.uiKit.loaders + +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.shurdev.uiKit.layouts.Center + +@Composable +fun Loader(modifier: Modifier = Modifier) { + Center( + modifier = modifier, + ) { + CircularProgressIndicator() + } +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Color.kt b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Color.kt similarity index 83% rename from ui_kit/src/main/java/com/shurdev/ui_kit/theme/Color.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/theme/Color.kt index b1dd27e..055dc11 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Color.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Color.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.theme +package com.shurdev.uiKit.theme import androidx.compose.ui.graphics.Color @@ -16,4 +16,4 @@ val Black = Color(0xFF0A250F) val AppBackgroundColor = Color(0xFFF7FCF7) val PlantCardBackgroundColor = Color(0xFFE8F2E8) -val PlantCardContentColor = Color(0xFF0D1C0F) \ No newline at end of file +val PlantCardContentColor = Color(0xFF0D1C0F) diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Theme.kt b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Theme.kt similarity index 92% rename from ui_kit/src/main/java/com/shurdev/ui_kit/theme/Theme.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/theme/Theme.kt index f264960..a525270 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Theme.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.theme +package com.shurdev.uiKit.theme import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme @@ -13,13 +13,13 @@ import androidx.compose.ui.platform.LocalContext private val DarkColorScheme = darkColorScheme( primary = Purple80, secondary = PurpleGrey80, - tertiary = Pink80 + tertiary = Pink80, ) private val LightColorScheme = lightColorScheme( primary = Purple40, secondary = PurpleGrey40, - tertiary = Pink40 + tertiary = Pink40, ) @Composable @@ -42,6 +42,6 @@ fun FlowerAppTheme( MaterialTheme( colorScheme = colorScheme, typography = Typography, - content = content + content = content, ) -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Typography.kt b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Typography.kt similarity index 98% rename from ui_kit/src/main/java/com/shurdev/ui_kit/theme/Typography.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/theme/Typography.kt index 7ef4f89..9cb4a6d 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/theme/Typography.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/theme/Typography.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.theme +package com.shurdev.uiKit.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.font.Font @@ -17,7 +17,6 @@ val epilogueFamily = FontFamily( Font(R.font.epilogue_black, FontWeight.Black), Font(R.font.epilogue_thin, FontWeight.Thin), Font(R.font.epilogue_semi_bold, FontWeight.SemiBold), - Font(R.font.epilogue_light_italic, FontWeight.Light, FontStyle.Italic), Font(R.font.epilogue_italic, FontWeight.Normal, FontStyle.Italic), Font(R.font.epilogue_medium_italic, FontWeight.Medium, FontStyle.Italic), @@ -35,20 +34,16 @@ val Typography = Typography( displayLarge = defaultTypography.displayLarge.copy(fontFamily = epilogueFamily), displayMedium = defaultTypography.displayMedium.copy(fontFamily = epilogueFamily), displaySmall = defaultTypography.displaySmall.copy(fontFamily = epilogueFamily), - headlineLarge = defaultTypography.headlineLarge.copy(fontFamily = epilogueFamily), headlineMedium = defaultTypography.headlineMedium.copy(fontFamily = epilogueFamily), headlineSmall = defaultTypography.headlineSmall.copy(fontFamily = epilogueFamily), - titleLarge = defaultTypography.titleLarge.copy(fontFamily = epilogueFamily), titleMedium = defaultTypography.titleMedium.copy(fontFamily = epilogueFamily), titleSmall = defaultTypography.titleSmall.copy(fontFamily = epilogueFamily), - bodyLarge = defaultTypography.bodyLarge.copy(fontFamily = epilogueFamily), bodyMedium = defaultTypography.bodyMedium.copy(fontFamily = epilogueFamily), bodySmall = defaultTypography.bodySmall.copy(fontFamily = epilogueFamily), - labelLarge = defaultTypography.labelLarge.copy(fontFamily = epilogueFamily), labelMedium = defaultTypography.labelMedium.copy(fontFamily = epilogueFamily), - labelSmall = defaultTypography.labelSmall.copy(fontFamily = epilogueFamily) -) \ No newline at end of file + labelSmall = defaultTypography.labelSmall.copy(fontFamily = epilogueFamily), +) diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/utils/Extensions.kt b/ui_kit/src/main/java/com/shurdev/uiKit/utils/Extensions.kt similarity index 92% rename from ui_kit/src/main/java/com/shurdev/ui_kit/utils/Extensions.kt rename to ui_kit/src/main/java/com/shurdev/uiKit/utils/Extensions.kt index 63bf66c..9585d49 100644 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/utils/Extensions.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/utils/Extensions.kt @@ -1,4 +1,4 @@ -package com.shurdev.ui_kit.utils +package com.shurdev.uiKit.utils import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -13,7 +13,7 @@ import kotlinx.coroutines.launch fun T.useDebounce( delayMillis: Long, coroutineScope: CoroutineScope = rememberCoroutineScope(), - onChange: (T) -> Unit + onChange: (T) -> Unit, ): T { val state by rememberUpdatedState(this) @@ -27,4 +27,4 @@ fun T.useDebounce( } } return state -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/errors/ErrorView.kt b/ui_kit/src/main/java/com/shurdev/ui_kit/errors/ErrorView.kt deleted file mode 100644 index 9097677..0000000 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/errors/ErrorView.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shurdev.ui_kit.errors - -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable - -@Composable -fun ErrorView() { - Text("ERRROR") -} \ No newline at end of file diff --git a/ui_kit/src/main/java/com/shurdev/ui_kit/loaders/Loader.kt b/ui_kit/src/main/java/com/shurdev/ui_kit/loaders/Loader.kt deleted file mode 100644 index a84eb8b..0000000 --- a/ui_kit/src/main/java/com/shurdev/ui_kit/loaders/Loader.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.shurdev.ui_kit.loaders - -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.runtime.Composable -import com.shurdev.ui_kit.layouts.Center - -@Composable -fun Loader() { - Center { - CircularProgressIndicator() - } -} \ No newline at end of file diff --git a/utils/src/main/java/com/shurdev/utils/Extensions.kt b/utils/src/main/java/com/shurdev/utils/Extensions.kt index 0adf7ee..c3102df 100644 --- a/utils/src/main/java/com/shurdev/utils/Extensions.kt +++ b/utils/src/main/java/com/shurdev/utils/Extensions.kt @@ -10,4 +10,4 @@ inline fun runSuspendCatching(block: () -> T): Result { } catch (e: Throwable) { Result.failure(e) } -} \ No newline at end of file +} diff --git a/utils/src/main/java/com/shurdev/utils/Utils.kt b/utils/src/main/java/com/shurdev/utils/Utils.kt deleted file mode 100644 index b0ba080..0000000 --- a/utils/src/main/java/com/shurdev/utils/Utils.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.shurdev.utils - -class Utils { -} \ No newline at end of file From d328e3875ab5bca5a3dd821d2bff920052102f57 Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 04:41:03 +0500 Subject: [PATCH 6/8] Fixed remaining warnings --- build.gradle.kts | 2 +- data/build.gradle.kts | 2 +- .../java/com/shurdev/data/di/RepositoryModule.kt | 3 +-- .../data/repositories/PlantRepositoryImpl.kt | 14 ++++++++------ domain/build.gradle.kts | 2 +- features/gallery/build.gradle.kts | 2 +- features/my_plants/build.gradle.kts | 2 +- ui_kit/build.gradle.kts | 2 +- utils/build.gradle.kts | 2 +- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e26426e..532a508 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,4 +6,4 @@ plugins { alias(libs.plugins.jetbrains.kotlin.jvm) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.android.library) apply false -} \ No newline at end of file +} diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 095cbe1..1e3019d 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -32,4 +32,4 @@ dependencies { // Retrofit implementation(libs.retrofit) implementation(libs.converter.gson) -} \ No newline at end of file +} diff --git a/data/src/main/java/com/shurdev/data/di/RepositoryModule.kt b/data/src/main/java/com/shurdev/data/di/RepositoryModule.kt index e57c8ec..7984c7c 100644 --- a/data/src/main/java/com/shurdev/data/di/RepositoryModule.kt +++ b/data/src/main/java/com/shurdev/data/di/RepositoryModule.kt @@ -11,8 +11,7 @@ import dagger.hilt.android.scopes.ViewModelScoped @Module @InstallIn(ViewModelComponent::class) interface RepositoryModule { - @Binds @ViewModelScoped fun bindPlantRepository(impl: PlantRepositoryImpl): PlantRepository -} \ No newline at end of file +} diff --git a/data/src/main/java/com/shurdev/data/repositories/PlantRepositoryImpl.kt b/data/src/main/java/com/shurdev/data/repositories/PlantRepositoryImpl.kt index 139efe9..eca1261 100644 --- a/data/src/main/java/com/shurdev/data/repositories/PlantRepositoryImpl.kt +++ b/data/src/main/java/com/shurdev/data/repositories/PlantRepositoryImpl.kt @@ -6,7 +6,6 @@ import com.shurdev.domain.repositories.PlantRepository import javax.inject.Inject class PlantRepositoryImpl @Inject constructor() : PlantRepository { - override suspend fun getPlants(filters: PlantFilters?): List { return plants.filter { item -> filters?.let { @@ -23,12 +22,15 @@ class PlantRepositoryImpl @Inject constructor() : PlantRepository { name = "Подсолнух обыкновенный", description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" .repeat(10), - imageLink = "https://cdn.britannica.com/84/73184-050-05ED59CB/Sunflower-field-Fargo-North-Dakota.jpg" + imageLink = "https://cdn.britannica.com/84/73184-050-05ED59CB/Sunflower-field-Fargo-North-Dakota.jpg", ) } - private fun doesPlantMatchFilters(plant: Plant, filters: PlantFilters): Boolean { - return plant.name.contains(filters.name ?: "", ignoreCase = true) - || plant.description.contains(filters.description ?: "", ignoreCase = true) + private fun doesPlantMatchFilters( + plant: Plant, + filters: PlantFilters, + ): Boolean { + return plant.name.contains(filters.name ?: "", ignoreCase = true) || + plant.description.contains(filters.description ?: "", ignoreCase = true) } -} \ No newline at end of file +} diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index f381d16..c7153c7 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -4,4 +4,4 @@ plugins { dependencies { implementation(libs.kotlinx.coroutines.core) -} \ No newline at end of file +} diff --git a/features/gallery/build.gradle.kts b/features/gallery/build.gradle.kts index 21d0801..837ed92 100644 --- a/features/gallery/build.gradle.kts +++ b/features/gallery/build.gradle.kts @@ -50,4 +50,4 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) -} \ No newline at end of file +} diff --git a/features/my_plants/build.gradle.kts b/features/my_plants/build.gradle.kts index 933fb4f..62ef449 100644 --- a/features/my_plants/build.gradle.kts +++ b/features/my_plants/build.gradle.kts @@ -49,4 +49,4 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) -} \ No newline at end of file +} diff --git a/ui_kit/build.gradle.kts b/ui_kit/build.gradle.kts index e1209c9..f716a76 100644 --- a/ui_kit/build.gradle.kts +++ b/ui_kit/build.gradle.kts @@ -32,4 +32,4 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) -} \ No newline at end of file +} diff --git a/utils/build.gradle.kts b/utils/build.gradle.kts index ba1ceb0..793bed4 100644 --- a/utils/build.gradle.kts +++ b/utils/build.gradle.kts @@ -6,4 +6,4 @@ plugins { java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 -} \ No newline at end of file +} From ced99aa17b9481b9d4a4d41428e308345d66d96c Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 04:43:44 +0500 Subject: [PATCH 7/8] Fixed more warnings --- .../screens/myPlants/viewModel/MyPlantsViewModel.kt | 3 +-- .../main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt index 36d5929..5140218 100644 --- a/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt +++ b/features/my_plants/src/main/java/com/shurdev/myPlants/screens/myPlants/viewModel/MyPlantsViewModel.kt @@ -27,7 +27,6 @@ class MyPlantsViewModel @Inject constructor( viewModelScope.launch { runSuspendCatching { - val plants = plantsRepository.getPlants() _uiState.update { MyPlantsLoadedState(plants) } }.onFailure { @@ -35,4 +34,4 @@ class MyPlantsViewModel @Inject constructor( } } } -} \ No newline at end of file +} diff --git a/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt index 0d1cbc8..a198c22 100644 --- a/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt +++ b/ui_kit/src/main/java/com/shurdev/uiKit/buttons/PrimaryButton.kt @@ -25,18 +25,17 @@ fun PrimaryButton( colors = ButtonDefaults.buttonColors().copy( containerColor = Green, contentColor = Black, - ) + ), ) { Text(text, style = MaterialTheme.typography.titleMedium) } } - @Preview @Composable -fun PreviewButton() { +private fun PreviewButton() { PrimaryButton( onClick = {}, - text = "" + text = "", ) -} \ No newline at end of file +} From 101383a91f905d4b4f6a896eb38a4cc9d7ce1da1 Mon Sep 17 00:00:00 2001 From: Vladimir Boyko Date: Thu, 7 Nov 2024 20:46:06 +0500 Subject: [PATCH 8/8] Fixed modifier --- .../presentation/composables/AppBottomNavigation.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt b/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt index 6895df7..fc545c9 100644 --- a/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt +++ b/app/src/main/java/com/shurdev/flowerapp/presentation/composables/AppBottomNavigation.kt @@ -1,6 +1,5 @@ package com.shurdev.flowerapp.presentation.composables -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar @@ -31,10 +30,7 @@ fun AppBottomNavigation( } NavigationBar( - modifier = modifier - .fillMaxWidth() - .size(20.dp) - .size(20.dp), + modifier = modifier, ) { val currentDestination = navController.currentBackStackEntryAsState().value?.destination