taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

EmptyBalancesComposable.kt (7635B)


      1 /*
      2  * This file is part of GNU Taler
      3  * (C) 2026 Taler Systems S.A.
      4  *
      5  * GNU Taler is free software; you can redistribute it and/or modify it under the
      6  * terms of the GNU General Public License as published by the Free Software
      7  * Foundation; either version 3, or (at your option) any later version.
      8  *
      9  * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
     10  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11  * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License along with
     14  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15  */
     16 
     17 package net.taler.wallet.balances
     18 
     19 import androidx.compose.foundation.Image
     20 import androidx.compose.foundation.layout.Arrangement
     21 import androidx.compose.foundation.layout.Column
     22 import androidx.compose.foundation.layout.PaddingValues
     23 import androidx.compose.foundation.layout.Row
     24 import androidx.compose.foundation.layout.Spacer
     25 import androidx.compose.foundation.layout.WindowInsets
     26 import androidx.compose.foundation.layout.WindowInsetsSides
     27 import androidx.compose.foundation.layout.fillMaxSize
     28 import androidx.compose.foundation.layout.fillMaxWidth
     29 import androidx.compose.foundation.layout.height
     30 import androidx.compose.foundation.layout.only
     31 import androidx.compose.foundation.layout.padding
     32 import androidx.compose.foundation.layout.size
     33 import androidx.compose.foundation.layout.systemBars
     34 import androidx.compose.foundation.layout.windowInsetsPadding
     35 import androidx.compose.foundation.lazy.LazyColumn
     36 import androidx.compose.material3.Button
     37 import androidx.compose.material3.ButtonDefaults
     38 import androidx.compose.material3.CircularProgressIndicator
     39 import androidx.compose.material3.MaterialTheme
     40 import androidx.compose.material3.Text
     41 import androidx.compose.runtime.Composable
     42 import androidx.compose.runtime.getValue
     43 import androidx.compose.runtime.mutableStateOf
     44 import androidx.compose.runtime.remember
     45 import androidx.compose.runtime.setValue
     46 import androidx.compose.ui.Alignment
     47 import androidx.compose.ui.Modifier
     48 import androidx.compose.ui.res.painterResource
     49 import androidx.compose.ui.res.stringResource
     50 import androidx.compose.ui.text.font.FontWeight
     51 import androidx.compose.ui.tooling.preview.Preview
     52 import androidx.compose.ui.unit.dp
     53 import net.taler.wallet.R
     54 import net.taler.wallet.compose.Material3MenuGroup
     55 import net.taler.wallet.compose.Material3MenuItemData
     56 import net.taler.wallet.compose.TalerSurface
     57 
     58 @Composable
     59 fun EmptyBalancesComposable(
     60     innerPadding: PaddingValues,
     61     networkStatus: Boolean,
     62     onWithdrawMoneyClicked: () -> Unit,
     63     onGetDemoMoneyClicked: () -> Unit,
     64 ) {
     65     var loadingWithdraw by remember { mutableStateOf(false) }
     66     var loadingDemo by remember { mutableStateOf(false) }
     67     val enabled = networkStatus && !loadingWithdraw && !loadingDemo
     68 
     69     LazyColumn (
     70         modifier = Modifier
     71             .padding(innerPadding)
     72             .windowInsetsPadding(WindowInsets.systemBars.only(
     73                 WindowInsetsSides.Top
     74             ))
     75             .padding(horizontal = 16.dp)
     76             .fillMaxSize(),
     77     ) {
     78         item { Spacer(Modifier.height(20.dp)) }
     79 
     80         item {
     81             Row(
     82                 modifier = Modifier.fillMaxWidth(),
     83                 horizontalArrangement = Arrangement.Center,
     84                 verticalAlignment = Alignment.CenterVertically
     85             ) {
     86                 Image(
     87                     modifier = Modifier
     88                         .height(45.dp)
     89                         .padding(end = 5.dp),
     90                     painter = painterResource(R.drawable.ic_taler_full),
     91                     contentDescription = null)
     92 
     93                 Text(
     94                     stringResource(R.string.wallet),
     95                     style = MaterialTheme.typography.titleLarge,
     96                     fontWeight = FontWeight.Medium,
     97                 )
     98             }
     99         }
    100 
    101         item { Spacer(Modifier.height(20.dp)) }
    102 
    103         item {
    104             Material3MenuGroup(buildList {
    105                 add(Material3MenuItemData(
    106                     title = { Text(stringResource(R.string.balances_empty_withdraw_chf_title)) },
    107                     description = {
    108                         Column {
    109                             Text(stringResource(R.string.balances_empty_withdraw_chf_message))
    110                             Spacer(Modifier.height(6.dp))
    111                             Button(
    112                                 modifier = Modifier.fillMaxWidth(),
    113                                 onClick = {
    114                                     loadingWithdraw = true
    115                                     onWithdrawMoneyClicked()
    116 
    117                                 },
    118                                 enabled = enabled,
    119                             ) {
    120                                 if (loadingWithdraw) {
    121                                     CircularProgressIndicator(Modifier.size(15.dp))
    122                                 } else Text(
    123                                     color = if (enabled) {
    124                                         ButtonDefaults.buttonColors().contentColor
    125                                     } else {
    126                                         ButtonDefaults.buttonColors().disabledContentColor
    127                                     },
    128                                     text = stringResource(R.string.balances_empty_withdraw_chf_button),
    129                                 )
    130                             }
    131                         }
    132                     },
    133                 ))
    134             })
    135         }
    136 
    137         item { Spacer(Modifier.height(12.dp)) }
    138 
    139         item {
    140             Material3MenuGroup(buildList {
    141                 add(
    142                     Material3MenuItemData(
    143                         title = {},
    144                         description = {
    145                             Column {
    146                                 Text(stringResource(R.string.balances_empty_withdraw_kudos_message))
    147                                 Spacer(Modifier.height(6.dp))
    148                                 Button(
    149                                     modifier = Modifier.fillMaxWidth(),
    150                                     onClick = {
    151                                         loadingDemo = true
    152                                         onGetDemoMoneyClicked()
    153                                     },
    154                                     enabled = networkStatus && !(loadingWithdraw || loadingDemo),
    155                                 ) {
    156                                     if (loadingDemo) {
    157                                         CircularProgressIndicator(Modifier.size(15.dp))
    158                                     } else Text(
    159                                         color = if (enabled) {
    160                                             ButtonDefaults.buttonColors().contentColor
    161                                         } else {
    162                                             ButtonDefaults.buttonColors().disabledContentColor
    163                                         },
    164                                         text = stringResource(R.string.balances_empty_withdraw_kudos_button),
    165                                     )
    166                                 }
    167                             }
    168                         },
    169                     )
    170                 )
    171             })
    172         }
    173     }
    174 }
    175 
    176 @Preview
    177 @Composable
    178 fun EmptyBalancesComposablePreview() {
    179     TalerSurface {
    180         EmptyBalancesComposable (
    181             innerPadding = PaddingValues(0.dp),
    182             networkStatus = false,
    183             onWithdrawMoneyClicked = {},
    184             onGetDemoMoneyClicked = {},
    185         )
    186     }
    187 }