3 Commits
6 changed files with 26 additions and 47 deletions
+2 -2
View File
@@ -13,8 +13,8 @@ android {
applicationId "com.conta.app"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0.0"
versionCode 4
versionName "1.0.3"
}
buildTypes {
@@ -34,6 +34,7 @@ import com.conta.app.data.network.Session
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import java.io.File
@@ -82,6 +83,14 @@ class AppViewModel : ViewModel() {
_message.value = msg
}
init {
viewModelScope.launch {
val saved = ServiceLocator.settings.baseUrl.first()
Session.baseUrl = saved
if (saved.isNotBlank()) refreshAll()
}
}
private suspend fun <T> runRequest(block: suspend () -> T): Boolean {
return try {
block()
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
@@ -20,7 +21,6 @@ import androidx.compose.material.icons.filled.AccountBalance
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.CreditCard
import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -30,7 +30,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@@ -68,16 +67,7 @@ fun AccountsScreen(viewModel: AppViewModel, navController: NavController) {
val loading by viewModel.loading.collectAsStateWithLifecycle()
Scaffold(
topBar = {
TopAppBar(
title = { Text("Cuentas", fontWeight = FontWeight.Bold) },
actions = {
androidx.compose.material3.IconButton(onClick = { viewModel.refreshAccounts() }) {
Icon(Icons.Filled.Sync, contentDescription = "Actualizar")
}
},
)
},
contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp),
floatingActionButton = {
FloatingActionButton(onClick = { navController.navigate(Routes.accountForm()) }) {
Icon(Icons.Filled.Add, contentDescription = "Nueva cuenta")
@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -21,7 +22,6 @@ import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.CreditCard
import androidx.compose.material.icons.filled.Event
import androidx.compose.material.icons.filled.NotificationsActive
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material.icons.filled.Savings
import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material3.Card
@@ -33,7 +33,6 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@@ -68,16 +67,7 @@ fun DashboardScreen(viewModel: AppViewModel, navController: NavController) {
val loading by viewModel.loading.collectAsStateWithLifecycle()
Scaffold(
topBar = {
TopAppBar(
title = { Text("Conta", fontWeight = FontWeight.Bold) },
actions = {
IconButton(onClick = { viewModel.refreshDashboard() }) {
Icon(Icons.Filled.Sync, contentDescription = "Actualizar")
}
},
)
},
contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp),
floatingActionButton = {
FloatingActionButton(onClick = { navController.navigate(Routes.transactionForm(preset = "expense")) }) {
Icon(Icons.Filled.Add, contentDescription = "Nueva transacción")
@@ -95,11 +85,16 @@ fun DashboardScreen(viewModel: AppViewModel, navController: NavController) {
verticalArrangement = Arrangement.Center,
) {
EmptyState("No conectado. Configura la URL del servidor en Ajustes.")
androidx.compose.material3.Button(onClick = { navController.navigate(Routes.SETTINGS) }) {
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
androidx.compose.material3.Button(onClick = { viewModel.refreshAll() }) {
Text("Reintentar")
}
androidx.compose.material3.OutlinedButton(onClick = { navController.navigate(Routes.SETTINGS) }) {
Text("Ir a Ajustes")
}
}
}
}
else -> DashboardContent(
summary = summary!!,
notices = notices,
@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
@@ -26,7 +27,6 @@ import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -63,11 +63,7 @@ fun SettingsScreen(viewModel: AppViewModel, navController: NavController) {
val summary by viewModel.summary.collectAsStateWithLifecycle()
Scaffold(
topBar = {
TopAppBar(
title = { Text("Ajustes", fontWeight = FontWeight.Bold) },
)
},
contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp),
) { padding ->
Column(
modifier = Modifier
@@ -5,23 +5,21 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -56,16 +54,7 @@ fun TransactionsScreen(viewModel: AppViewModel, navController: NavController) {
val totalExpense = filtered.filter { it.transactionType == "expense" }.sumOf { it.amount }
Scaffold(
topBar = {
TopAppBar(
title = { Text("Movimientos", fontWeight = FontWeight.Bold) },
actions = {
IconButton(onClick = { viewModel.refreshDashboard() }) {
Icon(Icons.Filled.Sync, contentDescription = "Actualizar")
}
},
)
},
contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp),
floatingActionButton = {
FloatingActionButton(onClick = { navController.navigate(Routes.transactionForm()) }) {
Icon(Icons.Filled.Add, contentDescription = "Nueva transacción")