/* * This file is part of GNU Taler * (C) 2022 Taler Systems S.A. * * GNU Taler is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 3, or (at your option) any later version. * * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * GNU Taler; see the file COPYING. If not, see */ package net.taler.wallet.peer import android.annotation.SuppressLint import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import net.taler.common.Amount import net.taler.wallet.R import net.taler.wallet.cleanExchange import net.taler.wallet.exchanges.ExchangeItem @OptIn(ExperimentalMaterial3Api::class) @Composable fun OutgoingPullIntroComposable( amount: Amount, exchangeState: State, onCreateInvoice: (amount: Amount, subject: String, exchange: ExchangeItem) -> Unit, ) { val scrollState = rememberScrollState() Column( modifier = Modifier .fillMaxWidth() .verticalScroll(scrollState), horizontalAlignment = CenterHorizontally, ) { var subject by rememberSaveable { mutableStateOf("") } val focusRequester = remember { FocusRequester() } val exchangeItem = exchangeState.value OutlinedTextField( modifier = Modifier .fillMaxWidth() .padding(top = 16.dp, start = 16.dp, end = 16.dp) .focusRequester(focusRequester), singleLine = true, value = subject, onValueChange = { input -> if (input.length <= MAX_LENGTH_SUBJECT) subject = input }, isError = subject.isBlank(), label = { Text( stringResource(R.string.send_peer_purpose), color = if (subject.isBlank()) { MaterialTheme.colorScheme.error } else Color.Unspecified, ) } ) LaunchedEffect(Unit) { focusRequester.requestFocus() } Text( modifier = Modifier .fillMaxWidth() .padding(top = 5.dp, end = 16.dp), color = if (subject.isBlank()) MaterialTheme.colorScheme.error else Color.Unspecified, text = stringResource(R.string.char_count, subject.length, MAX_LENGTH_SUBJECT), textAlign = TextAlign.End, ) Text( modifier = Modifier.padding(horizontal = 16.dp), text = stringResource(id = R.string.amount_chosen), ) Text( modifier = Modifier.padding(16.dp), fontSize = 24.sp, color = colorResource(R.color.green), text = amount.toString(), ) Text( modifier = Modifier.padding(horizontal = 16.dp), text = stringResource(R.string.withdraw_exchange), ) Text( modifier = Modifier.padding(16.dp), fontSize = 24.sp, text = if (exchangeItem == null) "" else cleanExchange(exchangeItem.exchangeBaseUrl), ) Button( modifier = Modifier.padding(16.dp), enabled = subject.isNotBlank() && exchangeItem != null, onClick = { onCreateInvoice(amount, subject, exchangeItem ?: error("clickable without exchange")) }, ) { Text(text = stringResource(R.string.receive_peer_create_button)) } } } @Preview @Composable fun PreviewReceiveFundsIntro() { Surface { @SuppressLint("UnrememberedMutableState") val exchangeFlow = mutableStateOf(ExchangeItem("https://example.org", "TESTKUDOS", emptyList())) OutgoingPullIntroComposable(Amount.fromDouble("TESTKUDOS", 42.23), exchangeFlow) { _, _, _ -> } } }