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 }