From 5e2c52e907414ac455f0336e8e26e0471c087ba0 Mon Sep 17 00:00:00 2001 From: Lesperio Date: Wed, 14 Jan 2026 00:48:59 +0300 Subject: [PATCH] Refactor bottom sheets to use CommonBottomSheet --- .../country/CountryCodeBottomSheet.kt | 135 ++---------------- .../messengers/MessengersBottomSheet.kt | 120 +++------------- build.gradle | 4 +- 3 files changed, 37 insertions(+), 222 deletions(-) diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt index e74ab23..0d22267 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt @@ -1,140 +1,35 @@ package ru.yandex.practicum.contacts.presentation.country -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.BottomSheetDefaults -import androidx.compose.material3.Checkbox -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import ru.yandex.practicum.contacts.R import ru.yandex.practicum.contacts.data.models.CountryCode +import ru.yandex.practicum.contacts.presentation.ui.components.CommonBottomSheet -@OptIn(ExperimentalMaterial3Api::class) @Composable fun CountryCodeBottomSheet( selectedCodes: Set, onCodesSelected: (Set) -> Unit, onDismiss: () -> Unit ) { - ModalBottomSheet( - onDismissRequest = onDismiss, - dragHandle = { BottomSheetDefaults.DragHandle() } - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.filter_by_country_code), - style = MaterialTheme.typography.titleLarge - ) - IconButton(onClick = onDismiss) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.close) - ) - } - } - - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) - ) { - items(CountryCode.COMMON_CODES) { countryCode -> - val isSelected = selectedCodes.contains(countryCode) - Surface( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp), - onClick = { - val newSelection = selectedCodes.toMutableSet() - if (isSelected) { - newSelection.remove(countryCode) - } else { - newSelection.add(countryCode) - } - onCodesSelected(newSelection) - }, - color = if (isSelected) { - MaterialTheme.colorScheme.primaryContainer - } else { - MaterialTheme.colorScheme.surface - } - ) { - CountryCodeOption( - isSelected = isSelected, - countryCode = countryCode, - selectedCodes = selectedCodes, - onCodesSelected = onCodesSelected - ) - } - } - } - } + CommonBottomSheet( + title = stringResource(R.string.filter_by_country_code), + items = CountryCode.COMMON_CODES, + selectedItems = selectedCodes, + onItemsSelected = onCodesSelected, + onDismiss = onDismiss + ) { countryCode, isSelected -> + CountryCodeOption( + countryCode = countryCode, + isSelected = isSelected + ) } } @Composable private fun CountryCodeOption( - isSelected: Boolean, countryCode: CountryCode, - selectedCodes: Set, - onCodesSelected: (Set) -> Unit + isSelected: Boolean ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Checkbox( - checked = isSelected, - onCheckedChange = { checked -> - val newSelection = selectedCodes.toMutableSet() - if (checked) { - newSelection.add(countryCode) - } else { - newSelection.remove(countryCode) - } - onCodesSelected(newSelection) - } - ) - Spacer(modifier = Modifier.width(16.dp)) - Column { - Text(countryCode.code) - Text( - countryCode.country, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } - } -} \ No newline at end of file + +} diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt index dcddf8d..b436d09 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt @@ -1,113 +1,41 @@ package ru.yandex.practicum.contacts.presentation.messengers -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.BottomSheetDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import ru.yandex.practicum.contacts.R +import ru.yandex.practicum.contacts.data.models.MessagingApp +import ru.yandex.practicum.contacts.presentation.ui.components.CommonBottomSheet +import androidx.compose.foundation.layout.* import androidx.compose.material3.Checkbox -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import ru.yandex.practicum.contacts.R -import ru.yandex.practicum.contacts.data.models.MessagingApp -@OptIn(ExperimentalMaterial3Api::class) @Composable fun MessengersBottomSheet( selectedApps: Set, onAppsSelected: (Set) -> Unit, onDismiss: () -> Unit ) { - ModalBottomSheet( - onDismissRequest = onDismiss, - dragHandle = { BottomSheetDefaults.DragHandle() } - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.filter_by_messaging_app), - style = MaterialTheme.typography.titleLarge - ) - IconButton(onClick = onDismiss) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.close) - ) - } - } - - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) - ) { - items(MessagingApp.entries) { app -> - val isSelected = selectedApps.contains(app) - Surface( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp), - onClick = { - val newSelection = selectedApps.toMutableSet() - if (isSelected) { - newSelection.remove(app) - } else { - newSelection.add(app) - } - onAppsSelected(newSelection) - }, - color = if (isSelected) { - MaterialTheme.colorScheme.primaryContainer - } else { - MaterialTheme.colorScheme.surface - } - ) { - MessengerOption( - isSelected = isSelected, - app = app, - selectedApps = selectedApps, - onAppsSelected = onAppsSelected - ) - } - } - } - } + CommonBottomSheet( + title = stringResource(R.string.filter_by_messaging_app), + items = MessagingApp.entries, + selectedItems = selectedApps, + onItemsSelected = onAppsSelected, + onDismiss = onDismiss + ) { app, isSelected -> + MessengerOption( + app = app, + isSelected = isSelected + ) } } @Composable private fun MessengerOption( - isSelected: Boolean, app: MessagingApp, - selectedApps: Set, - onAppsSelected: (Set) -> Unit + isSelected: Boolean ) { Row( modifier = Modifier @@ -117,17 +45,9 @@ private fun MessengerOption( ) { Checkbox( checked = isSelected, - onCheckedChange = { checked -> - val newSelection = selectedApps.toMutableSet() - if (checked) { - newSelection.add(app) - } else { - newSelection.remove(app) - } - onAppsSelected(newSelection) - } + onCheckedChange = null ) Spacer(modifier = Modifier.width(16.dp)) Text(app.name) } -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index 86c6bb7..d7da692 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.11.1' apply false - id 'com.android.library' version '8.11.1' apply false + id 'com.android.application' version '8.13.2' apply false + id 'com.android.library' version '8.13.2' apply false id 'org.jetbrains.kotlin.android' version '2.2.0' apply false id("org.jetbrains.kotlin.plugin.compose") version "2.2.0" apply false }