From 5013fde83b7e72e92ea6ac1177fe1d3cf12ebb52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B8=D0=BD=D0=B0?= Date: Mon, 19 Jan 2026 16:40:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../country/CountryCodeBottomSheet.kt | 102 ++++-------------- .../messengers/MessengersBottomSheet.kt | 98 ++++------------- 2 files changed, 42 insertions(+), 158 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..8e1d566 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 @@ -27,6 +27,7 @@ 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 @@ -35,79 +36,25 @@ fun CountryCodeBottomSheet( 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 = { newSelection -> onCodesSelected(newSelection) }, + onDismiss = onDismiss, + itemContent = { countryCode, isSelected -> + CountryCodeItem( + countryCode = countryCode, + isSelected = isSelected + ) } - } + ) } @Composable -private fun CountryCodeOption( - isSelected: Boolean, +private fun CountryCodeItem( countryCode: CountryCode, - selectedCodes: Set, - onCodesSelected: (Set) -> Unit + isSelected: Boolean ) { Row( modifier = Modifier @@ -117,24 +64,19 @@ private fun CountryCodeOption( ) { Checkbox( checked = isSelected, - onCheckedChange = { checked -> - val newSelection = selectedCodes.toMutableSet() - if (checked) { - newSelection.add(countryCode) - } else { - newSelection.remove(countryCode) - } - onCodesSelected(newSelection) - } + onCheckedChange = null // Управляется через клик по Surface в CommonBottomSheet ) Spacer(modifier = Modifier.width(16.dp)) Column { - Text(countryCode.code) Text( - countryCode.country, + text = countryCode.code, + style = MaterialTheme.typography.bodyMedium + ) + Text( + 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..21bdfeb 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 @@ -27,6 +27,7 @@ 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 +import ru.yandex.practicum.contacts.presentation.ui.components.CommonBottomSheet @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -35,79 +36,25 @@ fun MessengersBottomSheet( 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 = { newSelection -> onAppsSelected(newSelection) }, + onDismiss = onDismiss, + itemContent = { app, isSelected -> + MessengerItem( + app = app, + isSelected = isSelected + ) } - } + ) } @Composable -private fun MessengerOption( - isSelected: Boolean, +private fun MessengerItem( app: MessagingApp, - selectedApps: Set, - onAppsSelected: (Set) -> Unit + isSelected: Boolean ) { Row( modifier = Modifier @@ -117,17 +64,12 @@ 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 // Управляется через клик по Surface в CommonBottomSheet ) Spacer(modifier = Modifier.width(16.dp)) - Text(app.name) + Text( + text = app.name, + style = MaterialTheme.typography.bodyMedium + ) } } \ No newline at end of file