diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt index e58a13e..b68c46a 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt @@ -56,63 +56,6 @@ val EnHomeStrings = AppStrings( enterValidAmount = "Enter a valid amount", satsUnit = { sats -> "$sats sats" }, - // ── ReceiveScreen — general ─────────────────────────────────────────────── - receive = "Receive", - - // ── ReceiveScreen — error ───────────────────────────────────────────────── - receiveError = "Error", - - // ── ReceiveScreen — QR / share ──────────────────────────────────────────── - lightningAddressQrCode = "Lightning address QR code", - lightningAddressLabel = "Lightning Address", - shareLightningAddress = "Share Lightning Address", - lightningInvoiceQrCode = "Lightning invoice QR code", - invoiceLabel = "Invoice", - shareInvoice = "Share Invoice", - - // ── ReceiveScreen — amount step ─────────────────────────────────────────── - amountInSats = "Amount (sats)", - satsRange = { min, max -> "$min – $max sats" }, - - // ── ReceiveScreen — memo step ───────────────────────────────────────────── - memoOptional = "Memo (optional)", - memoPlaceholder = "What's this for?", - creatingInvoice = "Creating invoice…", - createInvoice = "Create Invoice", - - // ── ReceiveScreen — invoice ready ───────────────────────────────────────── - waiting = "Waiting…", - invoiceExpired = "Invoice expired", - newInvoice = "New Invoice", - - // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── - withdrawFrom = "Withdraw from", - minimumSats = { min -> "Minimum is $min sats" }, - maximumSats = { max -> "Maximum is $max sats" }, - withdrawButton = "Withdraw", - withdrawButtonAmount = { amount -> "Withdraw $amount sats" }, - - // ── ReceiveScreen — success ─────────────────────────────────────────────── - paymentReceived = "Payment Received!", - - // ── AmountDisplay ───────────────────────────────────────────────────────── - amountDisplaySats = { amount -> "$amount ${if (amount == 1L) "sat" else "sats"}" }, - - // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── - brightnessReduce = "Reduce brightness", - brightnessBoost = "Boost brightness", - qrShare = "Share", - qrCopy = "Copy", - qrNfcStop = "Stop NFC sharing", - qrNfcStart = "Share via NFC", - openInApp = "Open in app", - noAppFound = "No compatible app found", - - // ── ReceiveViewModel ────────────────────────────────────────────────────── - receiveVmFailedToCreateInvoice = "Failed to create invoice", - receiveVmWithdrawRejected = "Withdraw service rejected the invoice", - receiveVmWithdrawFailed = "Withdraw failed", - // ── SendScreen — general ────────────────────────────────────────────────── send = "Send", paste = "Paste", @@ -327,6 +270,7 @@ val EnHomeStrings = AppStrings( hideAdminKey = "Hide", showAdminKey = "Show", fieldsRequired = "All fields are required.", + invalidKeyFormat = "Invalid key format", connect = "Connect", notificationsTitle = "Stay in the loop", notificationsSubtitle = "Get notified instantly when you receive a payment.", @@ -356,6 +300,65 @@ val EnHomeStrings = AppStrings( cancel = "Cancel" ), + receive = ReceiveStrings( + // ── ReceiveScreen — general ─────────────────────────────────────────────── + receive = "Receive", + + // ── ReceiveScreen — error ───────────────────────────────────────────────── + receiveError = "Error", + + // ── ReceiveScreen — QR / share ──────────────────────────────────────────── + lightningAddressQrCode = "Lightning address QR code", + lightningAddressLabel = "Lightning Address", + shareLightningAddress = "Share Lightning Address", + lightningInvoiceQrCode = "Lightning invoice QR code", + invoiceLabel = "Invoice", + shareInvoice = "Share Invoice", + + // ── ReceiveScreen — amount step ─────────────────────────────────────────── + amountInSats = "Amount (sats)", + satsRange = { min, max -> "$min – $max sats" }, + + // ── ReceiveScreen — memo step ───────────────────────────────────────────── + memoOptional = "Memo (optional)", + memoPlaceholder = "What's this for?", + creatingInvoice = "Creating invoice…", + createInvoice = "Create Invoice", + + // ── ReceiveScreen — invoice ready ───────────────────────────────────────── + waiting = "Waiting…", + invoiceExpired = "Invoice expired", + newInvoice = "New Invoice", + + // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── + withdrawFrom = "Withdraw from", + minimumSats = { min -> "Minimum is $min sats" }, + maximumSats = { max -> "Maximum is $max sats" }, + withdrawButton = "Withdraw", + withdrawButtonAmount = { amount -> "Withdraw $amount sats" }, + + // ── ReceiveScreen — success ─────────────────────────────────────────────── + paymentReceived = "Payment Received!", + + // ── AmountDisplay ───────────────────────────────────────────────────────── + amountDisplaySats = { amount -> "$amount ${if (amount == 1L) "sat" else "sats"}" }, + + // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── + brightnessReduce = "Reduce brightness", + brightnessBoost = "Boost brightness", + qrShare = "Share", + qrCopy = "Copy", + qrNfcStop = "Stop NFC sharing", + qrNfcStart = "Share via NFC", + openInApp = "Open in app", + noAppFound = "No compatible app found", + + // ── ReceiveViewModel ────────────────────────────────────────────────────── + receiveVmFailedToCreateInvoice = "Failed to create invoice", + receiveVmWithdrawRejected = "Withdraw service rejected the invoice", + receiveVmWithdrawFailed = "Withdraw failed", + ), + nwc = NwcStrings( back = "Back", next = "Next", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt index e53ae72..2f82b4f 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt @@ -56,63 +56,6 @@ val EsHomeStrings = AppStrings( enterValidAmount = "Introduce una cantidad válida", satsUnit = { sats -> "$sats sats" }, - // ── ReceiveScreen — general ─────────────────────────────────────────────── - receive = "Recibir", - - // ── ReceiveScreen — error ───────────────────────────────────────────────── - receiveError = "Error", - - // ── ReceiveScreen — QR / share ──────────────────────────────────────────── - lightningAddressQrCode = "Código QR de dirección Lightning", - lightningAddressLabel = "Dirección Lightning", - shareLightningAddress = "Compartir dirección Lightning", - lightningInvoiceQrCode = "Código QR de factura Lightning", - invoiceLabel = "Factura", - shareInvoice = "Compartir factura", - - // ── ReceiveScreen — amount step ─────────────────────────────────────────── - amountInSats = "Cantidad (sats)", - satsRange = { min, max -> "$min – $max sats" }, - - // ── ReceiveScreen — memo step ───────────────────────────────────────────── - memoOptional = "Nota (opcional)", - memoPlaceholder = "¿Para qué es esto?", - creatingInvoice = "Creando factura…", - createInvoice = "Crear factura", - - // ── ReceiveScreen — invoice ready ───────────────────────────────────────── - waiting = "Esperando…", - invoiceExpired = "Factura expirada", - newInvoice = "Nueva factura", - - // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── - withdrawFrom = "Retirar de", - minimumSats = { min -> "Mínimo es $min sats" }, - maximumSats = { max -> "Máximo es $max sats" }, - withdrawButton = "Retirar", - withdrawButtonAmount = { amount -> "Retirar $amount sats" }, - - // ── ReceiveScreen — success ─────────────────────────────────────────────── - paymentReceived = "¡Pago recibido!", - - // ── AmountDisplay ───────────────────────────────────────────────────────── - amountDisplaySats = { amount -> "$amount ${if (amount == 1L) "sat" else "sats"}" }, - - // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── - brightnessReduce = "Reducir brillo", - brightnessBoost = "Aumentar brillo", - qrShare = "Compartir", - qrCopy = "Copiar", - qrNfcStop = "Detener NFC", - qrNfcStart = "Compartir por NFC", - openInApp = "Abrir en app", - noAppFound = "No hay aplicación compatible", - - // ── ReceiveViewModel ────────────────────────────────────────────────────── - receiveVmFailedToCreateInvoice = "No se pudo crear la factura", - receiveVmWithdrawRejected = "El servicio de retiro rechazó la factura", - receiveVmWithdrawFailed = "Error al retirar", - // ── SendScreen — general ────────────────────────────────────────────────── send = "Enviar", paste = "Pegar", @@ -328,6 +271,7 @@ val EsHomeStrings = AppStrings( hideAdminKey = "Ocultar", showAdminKey = "Mostrar", fieldsRequired = "Todos los campos son obligatorios.", + invalidKeyFormat = "Formato de clave no válido", connect = "Conectar", notificationsTitle = "Mantente al día", notificationsSubtitle = "Recibe notificaciones al instante cuando recibas un pago.", @@ -357,6 +301,65 @@ val EsHomeStrings = AppStrings( cancel = "Cancelar" ), + receive = ReceiveStrings( + // ── ReceiveScreen — general ─────────────────────────────────────────────── + receive = "Recibir", + + // ── ReceiveScreen — error ───────────────────────────────────────────────── + receiveError = "Error", + + // ── ReceiveScreen — QR / share ──────────────────────────────────────────── + lightningAddressQrCode = "Código QR de dirección Lightning", + lightningAddressLabel = "Dirección Lightning", + shareLightningAddress = "Compartir dirección Lightning", + lightningInvoiceQrCode = "Código QR de factura Lightning", + invoiceLabel = "Factura", + shareInvoice = "Compartir factura", + + // ── ReceiveScreen — amount step ─────────────────────────────────────────── + amountInSats = "Cantidad (sats)", + satsRange = { min, max -> "$min – $max sats" }, + + // ── ReceiveScreen — memo step ───────────────────────────────────────────── + memoOptional = "Nota (opcional)", + memoPlaceholder = "¿Para qué es esto?", + creatingInvoice = "Creando factura…", + createInvoice = "Crear factura", + + // ── ReceiveScreen — invoice ready ───────────────────────────────────────── + waiting = "Esperando…", + invoiceExpired = "Factura expirada", + newInvoice = "Nueva factura", + + // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── + withdrawFrom = "Retirar de", + minimumSats = { min -> "Mínimo es $min sats" }, + maximumSats = { max -> "Máximo es $max sats" }, + withdrawButton = "Retirar", + withdrawButtonAmount = { amount -> "Retirar $amount sats" }, + + // ── ReceiveScreen — success ─────────────────────────────────────────────── + paymentReceived = "¡Pago recibido!", + + // ── AmountDisplay ───────────────────────────────────────────────────────── + amountDisplaySats = { amount -> "$amount ${if (amount == 1L) "sat" else "sats"}" }, + + // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── + brightnessReduce = "Reducir brillo", + brightnessBoost = "Aumentar brillo", + qrShare = "Compartir", + qrCopy = "Copiar", + qrNfcStop = "Detener NFC", + qrNfcStart = "Compartir por NFC", + openInApp = "Abrir en app", + noAppFound = "No hay aplicación compatible", + + // ── ReceiveViewModel ────────────────────────────────────────────────────── + receiveVmFailedToCreateInvoice = "No se pudo crear la factura", + receiveVmWithdrawRejected = "El servicio de retiro rechazó la factura", + receiveVmWithdrawFailed = "Error al retirar", + ), + nwc = NwcStrings( // ── Shared ──────────────────────────────────────────────────────────────── back = "Atrás", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt index a34c23b..a4aed9e 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt @@ -55,63 +55,6 @@ val EuStrings = AppStrings( enterValidAmount = "Sartu zenbateko baliogarri bat", satsUnit = { sats -> "$sats sat" }, - // ── ReceiveScreen — general ─────────────────────────────────────────────── - receive = "Jaso", - - // ── ReceiveScreen — error ───────────────────────────────────────────────── - receiveError = "Errorea", - - // ── ReceiveScreen — QR / share ──────────────────────────────────────────── - lightningAddressQrCode = "Lightning helbidearen QR kodea", - lightningAddressLabel = "Lightning helbidea", - shareLightningAddress = "Partekatu Lightning helbidea", - lightningInvoiceQrCode = "Lightning fakturaren QR kodea", - invoiceLabel = "Faktura", - shareInvoice = "Partekatu faktura", - - // ── ReceiveScreen — amount step ─────────────────────────────────────────── - amountInSats = "Zenbatekoa (sat)", - satsRange = { min, max -> "$min – $max sat" }, - - // ── ReceiveScreen — memo step ───────────────────────────────────────────── - memoOptional = "Oharra (aukerakoa)", - memoPlaceholder = "Zertarako da hau?", - creatingInvoice = "Faktura sortzen…", - createInvoice = "Sortu faktura", - - // ── ReceiveScreen — invoice ready ───────────────────────────────────────── - waiting = "Zain…", - invoiceExpired = "Faktura iraungita", - newInvoice = "Faktura berria", - - // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── - withdrawFrom = "Atera hemendik:", - minimumSats = { min -> "Gutxienekoa $min sat da" }, - maximumSats = { max -> "Gehienekoa $max sat da" }, - withdrawButton = "Atera", - withdrawButtonAmount = { amount -> "Atera $amount sat" }, - - // ── ReceiveScreen — success ─────────────────────────────────────────────── - paymentReceived = "Ordainketa jasota!", - - // ── AmountDisplay ───────────────────────────────────────────────────────── - amountDisplaySats = { amount -> "$amount sat" }, - - // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── - brightnessReduce = "Murriztu distira", - brightnessBoost = "Handitu distira", - qrShare = "Partekatu", - qrCopy = "Kopiatu", - qrNfcStop = "Gelditu NFC partekatzea", - qrNfcStart = "Partekatu NFC bidez", - openInApp = "Ireki aplikazioan", - noAppFound = "Ez da aurkitu aplikazio bateragarririk", - - // ── ReceiveViewModel ────────────────────────────────────────────────────── - receiveVmFailedToCreateInvoice = "Ezin izan da faktura sortu", - receiveVmWithdrawRejected = "Ateratzeko zerbitzuak faktura baztertu du", - receiveVmWithdrawFailed = "Ateratzeak huts egin du", - // ── SendScreen — general ────────────────────────────────────────────────── send = "Bidali", paste = "Itsatsi", @@ -327,6 +270,7 @@ val EuStrings = AppStrings( hideAdminKey = "Ezkutatu", showAdminKey = "Erakutsi", fieldsRequired = "Eremu guztiak beharrezkoak dira.", + invalidKeyFormat = "Gako formatu baliogabea", connect = "Konektatu", notificationsTitle = "Egon eguneratuta", notificationsSubtitle = "Jaso jakinarazpenak berehala transakzio bat jasotzen duzunean.", @@ -355,6 +299,65 @@ val EuStrings = AppStrings( schedule = "Programatu", cancel = "Utzi" ), + + receive = ReceiveStrings( + // ── ReceiveScreen — general ─────────────────────────────────────────────── + receive = "Jaso", + + // ── ReceiveScreen — error ───────────────────────────────────────────────── + receiveError = "Errorea", + + // ── ReceiveScreen — QR / share ──────────────────────────────────────────── + lightningAddressQrCode = "Lightning helbidearen QR kodea", + lightningAddressLabel = "Lightning helbidea", + shareLightningAddress = "Partekatu Lightning helbidea", + lightningInvoiceQrCode = "Lightning fakturaren QR kodea", + invoiceLabel = "Faktura", + shareInvoice = "Partekatu faktura", + + // ── ReceiveScreen — amount step ─────────────────────────────────────────── + amountInSats = "Zenbatekoa (sat)", + satsRange = { min, max -> "$min – $max sat" }, + + // ── ReceiveScreen — memo step ───────────────────────────────────────────── + memoOptional = "Oharra (aukerakoa)", + memoPlaceholder = "Zertarako da hau?", + creatingInvoice = "Faktura sortzen…", + createInvoice = "Sortu faktura", + + // ── ReceiveScreen — invoice ready ───────────────────────────────────────── + waiting = "Zain…", + invoiceExpired = "Faktura iraungita", + newInvoice = "Faktura berria", + + // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── + withdrawFrom = "Atera hemendik:", + minimumSats = { min -> "Gutxienekoa $min sat da" }, + maximumSats = { max -> "Gehienekoa $max sat da" }, + withdrawButton = "Atera", + withdrawButtonAmount = { amount -> "Atera $amount sat" }, + + // ── ReceiveScreen — success ─────────────────────────────────────────────── + paymentReceived = "Ordainketa jasota!", + + // ── AmountDisplay ───────────────────────────────────────────────────────── + amountDisplaySats = { amount -> "$amount sat" }, + + // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── + brightnessReduce = "Murriztu distira", + brightnessBoost = "Handitu distira", + qrShare = "Partekatu", + qrCopy = "Kopiatu", + qrNfcStop = "Gelditu NFC partekatzea", + qrNfcStart = "Partekatu NFC bidez", + openInApp = "Ireki aplikazioan", + noAppFound = "Ez da aurkitu aplikazio bateragarririk", + + // ── ReceiveViewModel ────────────────────────────────────────────────────── + receiveVmFailedToCreateInvoice = "Ezin izan da faktura sortu", + receiveVmWithdrawRejected = "Ateratzeko zerbitzuak faktura baztertu du", + receiveVmWithdrawFailed = "Ateratzeak huts egin du", + ), nwc = NwcStrings( // ── Shared ──────────────────────────────────────────────────────────────── back = "Atzera", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt index 07ff5fa..39fe99d 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt @@ -64,63 +64,6 @@ data class AppStrings( val enterValidAmount : String, val satsUnit : (sats: Long) -> String, - // ── ReceiveScreen — general ─────────────────────────────────────────────── - val receive : String, - - // ── ReceiveScreen — error ───────────────────────────────────────────────── - val receiveError : String, - - // ── ReceiveScreen — QR / share ──────────────────────────────────────────── - val lightningAddressQrCode : String, - val lightningAddressLabel : String, - val shareLightningAddress : String, - val lightningInvoiceQrCode : String, - val invoiceLabel : String, - val shareInvoice : String, - - // ── ReceiveScreen — amount step ─────────────────────────────────────────── - val amountInSats : String, // text field label - val satsRange : (min: Long, max: Long) -> String, - - // ── ReceiveScreen — memo step ───────────────────────────────────────────── - val memoOptional : String, - val memoPlaceholder : String, - val creatingInvoice : String, - val createInvoice : String, - - // ── ReceiveScreen — invoice ready ───────────────────────────────────────── - val waiting : String, - val invoiceExpired : String, - val newInvoice : String, - - // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── - val withdrawFrom : String, - val minimumSats : (min: Long) -> String, - val maximumSats : (max: Long) -> String, - val withdrawButton : String, // no fixed amount - val withdrawButtonAmount : (amountSats: Long) -> String, // fixed amount - - // ── ReceiveScreen — success ─────────────────────────────────────────────── - val paymentReceived : String, - - // ── AmountDisplay ───────────────────────────────────────────────────────── - val amountDisplaySats : (amount: Long) -> String, - - // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── - val brightnessReduce : String, - val brightnessBoost : String, - val qrShare : String, - val qrCopy : String, - val qrNfcStop : String, - val qrNfcStart : String, - val openInApp : String, - val noAppFound : String, - - // ── ReceiveViewModel ────────────────────────────────────────────────────── - val receiveVmFailedToCreateInvoice : String, - val receiveVmWithdrawRejected : String, - val receiveVmWithdrawFailed : String, - // ── SendScreen — general ────────────────────────────────────────────────── val send : String, val paste : String, @@ -307,6 +250,7 @@ data class AppStrings( val paymentRowFailed : String, val onboarding: OnboardingStrings, + val receive: ReceiveStrings, val nwc: NwcStrings ) @@ -325,6 +269,7 @@ data class OnboardingStrings( val hideAdminKey: String, val connect: String, val fieldsRequired: String, + val invalidKeyFormat: String, val back: String, val next: String, val done: String, @@ -356,6 +301,65 @@ data class OnboardingStrings( val cancel: String ) +data class ReceiveStrings( + // ── ReceiveScreen — general ─────────────────────────────────────────────── + val receive : String, + + // ── ReceiveScreen — error ───────────────────────────────────────────────── + val receiveError : String, + + // ── ReceiveScreen — QR / share ──────────────────────────────────────────── + val lightningAddressQrCode : String, + val lightningAddressLabel : String, + val shareLightningAddress : String, + val lightningInvoiceQrCode : String, + val invoiceLabel : String, + val shareInvoice : String, + + // ── ReceiveScreen — amount step ─────────────────────────────────────────── + val amountInSats : String, // text field label + val satsRange : (min: Long, max: Long) -> String, + + // ── ReceiveScreen — memo step ───────────────────────────────────────────── + val memoOptional : String, + val memoPlaceholder : String, + val creatingInvoice : String, + val createInvoice : String, + + // ── ReceiveScreen — invoice ready ───────────────────────────────────────── + val waiting : String, + val invoiceExpired : String, + val newInvoice : String, + + // ── ReceiveScreen — lnurl withdraw ──────────────────────────────────────── + val withdrawFrom : String, + val minimumSats : (min: Long) -> String, + val maximumSats : (max: Long) -> String, + val withdrawButton : String, // no fixed amount + val withdrawButtonAmount : (amountSats: Long) -> String, // fixed amount + + // ── ReceiveScreen — success ─────────────────────────────────────────────── + val paymentReceived : String, + + // ── AmountDisplay ───────────────────────────────────────────────────────── + val amountDisplaySats : (amount: Long) -> String, + + // ── BrightnessToggleButton & QrDisplayCard ──────────────────────────────── + val brightnessReduce : String, + val brightnessBoost : String, + val qrShare : String, + val qrCopy : String, + val qrNfcStop : String, + val qrNfcStart : String, + val openInApp : String, + val noAppFound : String, + + // ── ReceiveViewModel ────────────────────────────────────────────────────── + val receiveVmFailedToCreateInvoice : String, + val receiveVmWithdrawRejected : String, + val receiveVmWithdrawFailed : String, +) + data class NwcStrings( // ── Shared / navigation ─────────────────────────────────────────────────── diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/common/QrDisplayCard.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/common/QrDisplayCard.kt index 6f9e0e1..165dd9b 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/common/QrDisplayCard.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/common/QrDisplayCard.kt @@ -121,7 +121,7 @@ internal fun QrDisplayCard( ) { Icon( imageVector = Icons.Filled.Share, - contentDescription = strings.qrShare, + contentDescription = strings.receive.qrShare, tint = MaterialTheme.colorScheme.onSurfaceVariant ) } @@ -138,7 +138,7 @@ internal fun QrDisplayCard( ) { Icon( imageVector = Icons.Filled.ContentCopy, - contentDescription = strings.qrCopy, + contentDescription = strings.receive.qrCopy, tint = MaterialTheme.colorScheme.onSurfaceVariant ) } @@ -147,8 +147,8 @@ internal fun QrDisplayCard( FilledTonalIconButton(onClick = onToggleBrightness) { Icon( imageVector = Icons.Filled.WbSunny, - contentDescription = if (brightnessOn) strings.brightnessReduce - else strings.brightnessBoost, + contentDescription = if (brightnessOn) strings.receive.brightnessReduce + else strings.receive.brightnessBoost, tint = if (brightnessOn) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant ) @@ -163,8 +163,8 @@ internal fun QrDisplayCard( Icon( imageVector = if (isNfcEmulating) Icons.Filled.Nfc else Icons.Outlined.Nfc, - contentDescription = if (isNfcEmulating) strings.qrNfcStop - else strings.qrNfcStart, + contentDescription = if (isNfcEmulating) strings.receive.qrNfcStop + else strings.receive.qrNfcStart, tint = if (isNfcEmulating) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant ) @@ -176,7 +176,7 @@ internal fun QrDisplayCard( IconButton(onClick = onOpenUri) { Icon( imageVector = Icons.AutoMirrored.Filled.OpenInNew, - contentDescription = strings.openInApp, + contentDescription = strings.receive.openInApp, tint = MaterialTheme.colorScheme.onSurfaceVariant ) } diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingScreen.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingScreen.kt index 3c2c6b9..363db7b 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingScreen.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingScreen.kt @@ -27,13 +27,13 @@ private const val PAGE_INVOICE = 2 private const val PAGE_ADMIN = 3 private const val PAGE_NOTIFICATIONS = 4 private const val PAGE_BATTERY = 5 -private const val PAGE_SYNC = 6 // ← new -private const val PAGE_COUNT = 7 // ← was 6 +private const val PAGE_SYNC = 6 +private const val PAGE_COUNT = 7 @Composable fun OnboardingScreen( secretStore : SecretStore, - syncStore : HistoricalSyncStore, // ← new + syncStore : HistoricalSyncStore, onRequestNotificationPermission: () -> Unit, onComplete : () -> Unit ) { @@ -46,12 +46,11 @@ fun OnboardingScreen( var adminKey by remember { mutableStateOf("") } var adminVisible by remember { mutableStateOf(false) } var error by remember { mutableStateOf(null) } - var credentialsSaved by remember { mutableStateOf(false) } + // var credentialsSaved by remember { mutableStateOf(false) } // ── Sync state ──────────────────────────────────────────────────────────── val vm: OnboardingViewModel = viewModel( factory = OnboardingViewModelFactory( - // LocalContext.current.applicationContext cast to Application app = androidx.compose.ui.platform.LocalContext.current .applicationContext as android.app.Application, secretStore = secretStore, @@ -65,31 +64,33 @@ fun OnboardingScreen( LaunchedEffect(pagerState.currentPage) { error = null } -// var previousPage by remember { mutableIntStateOf(0) } -// LaunchedEffect(pagerState.currentPage) { -// val current = pagerState.currentPage -// if (current > previousPage) { -// // User moved forward — save whatever the previous page owned -// when (previousPage) { -// PAGE_SERVER_URL -> secretStore.saveBaseUrl(baseUrl) -// PAGE_INVOICE -> secretStore.saveInvoiceKey(invoiceKey) -// PAGE_ADMIN -> secretStore.saveAdminKey(adminKey) -// else -> Unit -// } -// } -// previousPage = current -// } + val hexKeyRegex = Regex("^[0-9a-f]{32}$") fun validateCurrentPage(): Boolean { error = when (pagerState.currentPage) { - PAGE_SERVER_URL -> if (baseUrl.isBlank()) strings.onboarding.fieldsRequired else null - PAGE_INVOICE -> if (invoiceKey.isBlank()) strings.onboarding.fieldsRequired else null - PAGE_ADMIN -> if (adminKey.isBlank()) strings.onboarding.fieldsRequired else null - else -> null + PAGE_SERVER_URL -> when { + baseUrl.isBlank() -> strings.onboarding.fieldsRequired + else -> null + } + + PAGE_INVOICE -> when { + invoiceKey.isBlank() -> strings.onboarding.fieldsRequired + !hexKeyRegex.matches(invoiceKey) -> strings.onboarding.invalidKeyFormat + else -> null + } + + PAGE_ADMIN -> when { + adminKey.isBlank() -> strings.onboarding.fieldsRequired + !hexKeyRegex.matches(adminKey) -> strings.onboarding.invalidKeyFormat + else -> null + } + + else -> null } return error == null } + Scaffold { innerPadding -> Column( modifier = Modifier @@ -128,7 +129,7 @@ fun OnboardingScreen( onSchedule = { delayMs -> vm.enqueueHistoricalSync(delayMillis = delayMs) }, onContinue = { scope.launch { - secretStore.setOnboarded() // moved here from PAGE_BATTERY + secretStore.setOnboarded() onComplete() } }, @@ -168,7 +169,7 @@ fun OnboardingScreen( Spacer(Modifier.width(1.dp)) } - val isLastPage = pagerState.currentPage == PAGE_BATTERY + // val isLastPage = pagerState.currentPage == PAGE_BATTERY Button(onClick = { if (!validateCurrentPage()) return@Button diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/AmountDisplay.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/AmountDisplay.kt index 0fd1940..80c48d8 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/AmountDisplay.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/AmountDisplay.kt @@ -25,7 +25,7 @@ internal fun AmountDisplay( val strings = LocalAppStrings.current Text( - text = strings.amountDisplaySats(amountSats), // ← "1 sat" or "X sats" + text = strings.receive.amountDisplaySats(amountSats), // ← "1 sat" or "X sats" style = style, fontWeight = FontWeight.Bold ) diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/BrightnessToggleButton.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/BrightnessToggleButton.kt index 55439fd..02fe1d2 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/BrightnessToggleButton.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/BrightnessToggleButton.kt @@ -20,8 +20,8 @@ internal fun BrightnessToggleButton( Icon( imageVector = if (isOn) Icons.Filled.BrightnessHigh else Icons.Filled.BrightnessLow, - contentDescription = if (isOn) strings.brightnessReduce // ← "Reduce brightness" - else strings.brightnessBoost, // ← "Boost brightness" + contentDescription = if (isOn) strings.receive.brightnessReduce // ← "Reduce brightness" + else strings.receive.brightnessBoost, // ← "Boost brightness" tint = if (isOn) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveScreen.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveScreen.kt index 9398ead..97bc502 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveScreen.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveScreen.kt @@ -130,7 +130,7 @@ fun ReceiveScreen( vm.createInvoice( amountSats, memo, - failedToCreateInvoice = strings.receiveVmFailedToCreateInvoice + failedToCreateInvoice = strings.receive.receiveVmFailedToCreateInvoice ) } ) @@ -145,9 +145,9 @@ fun ReceiveScreen( callback = state.callback, amountSats = amountSats, memo = state.defaultDescription, - failedToCreateInvoice = strings.receiveVmFailedToCreateInvoice, - withdrawRejected = strings.receiveVmWithdrawRejected, - withdrawFailed = strings.receiveVmWithdrawFailed, + failedToCreateInvoice = strings.receive.receiveVmFailedToCreateInvoice, + withdrawRejected = strings.receive.receiveVmWithdrawRejected, + withdrawFailed = strings.receive.receiveVmWithdrawFailed, ) }, onDismiss = { vm.resetReceiveState() } @@ -172,7 +172,7 @@ fun ReceiveScreen( modifier = Modifier.padding(24.dp) ) { Text( - text = strings.receiveError, // ← "Error" + text = strings.receive.receiveError, // ← "Error" style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.error ) @@ -225,8 +225,8 @@ private fun LnurlWithdrawSheet( val parsed = amountText.trim().toLongOrNull() return when { parsed == null || parsed <= 0 -> { amountError = strings.enterValidAmount; null } // ← "Enter a valid amount" - parsed < state.minSats -> { amountError = strings.minimumSats(state.minSats); null } // ← "Minimum is X sats" - parsed > state.maxSats -> { amountError = strings.maximumSats(state.maxSats); null } // ← "Maximum is X sats" + parsed < state.minSats -> { amountError = strings.receive.minimumSats(state.minSats); null } // ← "Minimum is X sats" + parsed > state.maxSats -> { amountError = strings.receive.maximumSats(state.maxSats); null } // ← "Maximum is X sats" else -> { amountError = null; parsed } } } @@ -247,7 +247,7 @@ private fun LnurlWithdrawSheet( Spacer(Modifier.size(12.dp)) Column { Text( - text = strings.withdrawFrom, // ← "Withdraw from" + text = strings.receive.withdrawFrom, // ← "Withdraw from" style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -286,7 +286,7 @@ private fun LnurlWithdrawSheet( color = MaterialTheme.colorScheme.onSecondaryContainer ) Text( - text = strings.withdrawButtonAmount(state.maxSats), // ← "X sats" + text = strings.receive.withdrawButtonAmount(state.maxSats), // ← "X sats" style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSecondaryContainer @@ -297,12 +297,12 @@ private fun LnurlWithdrawSheet( OutlinedTextField( value = amountText, onValueChange = { amountText = it; amountError = null }, - label = { Text(strings.amountInSats) }, // ← "Amount (sats)" + label = { Text(strings.receive.amountInSats) }, // ← "Amount (sats)" supportingText = { if (amountError != null) Text(amountError!!, color = MaterialTheme.colorScheme.error) else - Text(strings.satsRange(state.minSats, state.maxSats)) // ← "X – Y sats" + Text(strings.receive.satsRange(state.minSats, state.maxSats)) // ← "X – Y sats" }, isError = amountError != null, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), @@ -321,8 +321,8 @@ private fun LnurlWithdrawSheet( modifier = Modifier.fillMaxWidth() ) { Text( - if (fixedAmount) strings.withdrawButtonAmount(state.maxSats) // ← "Withdraw X sats" - else strings.withdrawButton // ← "Withdraw" + if (fixedAmount) strings.receive.withdrawButtonAmount(state.maxSats) // ← "Withdraw X sats" + else strings.receive.withdrawButton // ← "Withdraw" ) } @@ -379,7 +379,7 @@ private fun ReceiveIdleContent( horizontalArrangement = Arrangement.SpaceBetween ) { Text( - text = strings.receive, // ← "Receive" + text = strings.receive.receive, // ← "Receive" style = MaterialTheme.typography.headlineSmall ) if (lightningAddress != null) { @@ -421,9 +421,9 @@ private fun ReceiveIdleContent( QrDisplayCard( content = lightningAddress, - contentDescription = strings.lightningAddressQrCode, // ← "Lightning address QR code" - clipLabel = strings.lightningAddressLabel, // ← "Lightning Address" - shareTitle = strings.shareLightningAddress, // ← "Share Lightning Address" + contentDescription = strings.receive.lightningAddressQrCode, // ← "Lightning address QR code" + clipLabel = strings.receive.lightningAddressLabel, // ← "Lightning Address" + shareTitle = strings.receive.shareLightningAddress, // ← "Share Lightning Address" textToCopy = lightningAddress, brightnessOn = brightnessOn, onToggleBrightness = onToggleBrightness @@ -587,8 +587,8 @@ private fun MemoStepContent( OutlinedTextField( value = memo, onValueChange = { memo = it }, - label = { Text(strings.memoOptional) }, // ← "Memo (optional)" - placeholder = { Text(strings.memoPlaceholder) }, // ← "What's this for?" + label = { Text(strings.receive.memoOptional) }, // ← "Memo (optional)" + placeholder = { Text(strings.receive.memoPlaceholder) }, // ← "What's this for?" singleLine = true, modifier = Modifier.fillMaxWidth() ) @@ -603,8 +603,8 @@ private fun MemoStepContent( modifier = Modifier.fillMaxWidth() ) { Text( - if (isLoading) strings.creatingInvoice // ← "Creating invoice…" - else strings.createInvoice // ← "Create Invoice" + if (isLoading) strings.receive.creatingInvoice // ← "Creating invoice…" + else strings.receive.createInvoice // ← "Create Invoice" ) } @@ -665,9 +665,9 @@ private fun ReceiveInvoiceContent( QrDisplayCard( content = state.bolt11.uppercase(), - contentDescription = strings.lightningInvoiceQrCode, // ← "Lightning invoice QR code" - clipLabel = strings.invoiceLabel, // ← "Invoice" - shareTitle = strings.shareInvoice, // ← "Share Invoice" + contentDescription = strings.receive.lightningInvoiceQrCode, // ← "Lightning invoice QR code" + clipLabel = strings.receive.invoiceLabel, // ← "Invoice" + shareTitle = strings.receive.shareInvoice, // ← "Share Invoice" textToCopy = state.bolt11, brightnessOn = brightnessOn, onToggleBrightness = onToggleBrightness, @@ -693,7 +693,7 @@ private fun ReceiveInvoiceContent( if (!isExpired) { CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp) Text( - text = strings.waiting, // ← "Waiting…" + text = strings.receive.waiting, // ← "Waiting…" style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -704,7 +704,7 @@ private fun ReceiveInvoiceContent( ) } else { Text( - text = strings.invoiceExpired, // ← "Invoice expired" + text = strings.receive.invoiceExpired, // ← "Invoice expired" style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error ) @@ -716,7 +716,7 @@ private fun ReceiveInvoiceContent( modifier = Modifier.fillMaxWidth() ) { Text( - if (isExpired) strings.newInvoice // ← "New Invoice" + if (isExpired) strings.receive.newInvoice // ← "New Invoice" else strings.cancel // ← "Cancel" ) } @@ -750,7 +750,7 @@ private fun ReceiveSuccessContent( ) Spacer(Modifier.height(16.dp)) Text( - text = strings.paymentReceived, // ← "Payment Received!" + text = strings.receive.paymentReceived, // ← "Payment Received!" style = MaterialTheme.typography.headlineSmall ) Spacer(Modifier.height(8.dp)) diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveViewModel.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveViewModel.kt index 0bb04d9..4527ff9 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveViewModel.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/receive/ReceiveViewModel.kt @@ -44,7 +44,7 @@ class ReceiveViewModel( // ── Invoice creation ────────────────────────────────────────────────────── /** * @param failedToCreateInvoice Localised error string from the call site, - * e.g. `strings.receiveVmFailedToCreateInvoice` + * e.g. `strings.receive.receiveVmFailedToCreateInvoice` */ fun createInvoice( amountSats : Long, @@ -104,9 +104,9 @@ class ReceiveViewModel( } /** - * @param failedToCreateInvoice `strings.receiveVmFailedToCreateInvoice` - * @param withdrawRejected `strings.receiveVmWithdrawRejected` - * @param withdrawFailed `strings.receiveVmWithdrawFailed` + * @param failedToCreateInvoice `strings.receive.receiveVmFailedToCreateInvoice` + * @param withdrawRejected `strings.receive.receiveVmWithdrawRejected` + * @param withdrawFailed `strings.receive.receiveVmWithdrawFailed` */ fun executeWithdraw( k1 : String, diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/send/LnurlPayForm.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/send/LnurlPayForm.kt index bf4645f..a3fe8d3 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/send/LnurlPayForm.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/send/LnurlPayForm.kt @@ -59,7 +59,7 @@ internal fun LnurlPayForm( OutlinedTextField( value = amount, onValueChange = { if (it.all(Char::isDigit)) amount = it }, - label = { Text(strings.amountInSats) }, // ← "Amount (sats)" + label = { Text(strings.receive.amountInSats) }, // ← "Amount (sats)" isError = amount.isNotBlank() && !isAmountValid, supportingText = { when { @@ -88,7 +88,7 @@ internal fun LnurlPayForm( ) } // Sats-only range when no fiat rate - !isFixed -> Text(strings.satsRange(state.minSats, state.maxSats)) // ← "X – Y sats" + !isFixed -> Text(strings.receive.satsRange(state.minSats, state.maxSats)) // ← "X – Y sats" else -> {} } },