From bf9309a1557f1209ef872e8c3017a50210480a34 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Sun, 3 May 2026 22:34:52 +0200 Subject: [PATCH] fix: add currencies and search to them --- .../listexpense/CurrencySelectionDialog.kt | 113 ++++++++++-- .../screens/trippicker/TripPickerScreen.kt | 1 - .../cc/n0th1ng/tripmoney/utils/Currencies.kt | 163 +++++++++++++++++- 3 files changed, 257 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt index 3d7a6fb..b5014db 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt @@ -1,20 +1,38 @@ package cc.n0th1ng.tripmoney.screens.listexpense import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.sizeIn +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import cc.n0th1ng.tripmoney.R +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies +import com.composables.icons.materialsymbols.outlined.R.drawable @Composable fun CurrencySelectionDialog( @@ -23,29 +41,90 @@ fun CurrencySelectionDialog( selected: String ) { AlertDialog( + modifier = Modifier.sizeIn(maxHeight = 500.dp), onDismissRequest = onDismiss, title = { Text(stringResource(R.string.pick_currency)) }, text = { - Column { - Currencies.names().forEach { currency -> - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - onCurrencySelected(currency) - } - .padding(vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically) { - RadioButton( - selected = selected == currency, onClick = { - onCurrencySelected(currency) - }) - Text( - text = currency, modifier = Modifier.padding(start = 8.dp) + val scrollState = rememberLazyListState() + val currencies = Currencies.names() + var search by remember { mutableStateOf("") } + + LaunchedEffect(selected) { + val index = currencies.indexOf(selected) + if (index != -1) { + scrollState.animateScrollToItem(index) + } + } + + Column(verticalArrangement = Arrangement.spacedBy(5.dp)) { + OutlinedTextField( + value = search, + onValueChange = { newText -> + search = newText + }, + modifier = Modifier.fillMaxWidth(), + trailingIcon = { + Icon( + painter = painterResource(drawable.materialsymbols_ic_search_outlined), + contentDescription = "search" ) } + ) + + val filteredCurrencies = if (search.isBlank()) { + currencies + } else { + currencies.filter { currency -> + currency.lowercase().contains(search.lowercase()) + } + } + + LazyColumn(state = scrollState) { + items( + count = filteredCurrencies.size, + key = { index -> filteredCurrencies[index] } + ) { index -> + val currency = filteredCurrencies[index] + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + onCurrencySelected(currency) + }, + verticalAlignment = Alignment.CenterVertically + ) { + RadioButton( + selected = selected == currency, + onClick = { onCurrencySelected(currency) } + ) + Text( + text = currency, + modifier = Modifier.padding(start = 8.dp) + ) + } + } } } }, - confirmButton = {}) + confirmButton = {}, + dismissButton = { + Button( + colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.secondary), + enabled = true, + onClick = onDismiss, + ) { Text(stringResource(R.string.cancel)) } + } + ) +} + +@AllPreviews +@Composable +fun PreviewCurrencySelectionDialog() { + TripMoneyTheme { + CurrencySelectionDialog( + {}, + {}, + Currencies.names().random() + ) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index 4cf41a2..fe32182 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -326,7 +326,6 @@ fun PreviewTripPickerScreen() { @AllPreviews @Composable fun PreviewTripPickerScreenNoTrip() { - TripMoneyTheme { TripPickerScreen( tripsFlow = MutableStateFlow(PagingData.from(emptyList())), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt index c510b63..c205304 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt @@ -1,10 +1,169 @@ package cc.n0th1ng.tripmoney.utils enum class Currencies { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYN, + BZD, + CAD, + CDF, + CHF, + CLP, + CNH, + CNY, + COP, + CRC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MRU, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, PLN, - EUR, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLE, + SOS, + SRD, + SSP, + STN, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TWD, + TZS, + UAH, + UGX, USD, - RON; + UYU, + UZS, + VES, + VND, + VUV, + WST, + XAF, + XAG, + XAU, + XCD, + XCG, + XDR, + XOF, + XPD, + XPF, + XPT, + YER, + ZAR, + ZMW, + ZWG; companion object { fun default(): Currencies {