From 0625e79e73d69ffb786b3e4c620a79db80ad90e3 Mon Sep 17 00:00:00 2001 From: kolo Date: Fri, 20 Mar 2026 16:10:43 +0300 Subject: [PATCH] update --- lib/features/add_transaction/screen.dart | 7 +- lib/features/settings/screen.dart | 186 +++++++++++------------ 2 files changed, 98 insertions(+), 95 deletions(-) diff --git a/lib/features/add_transaction/screen.dart b/lib/features/add_transaction/screen.dart index e6098cd..6f5d62e 100644 --- a/lib/features/add_transaction/screen.dart +++ b/lib/features/add_transaction/screen.dart @@ -56,13 +56,15 @@ class _AddTransactionScreenState extends ConsumerState { final currencyInfo = ref.read(currencyProvider); ref.read(addTransactionProvider(widget.initial).notifier).setSubmitting(true); + final note = _noteController.text.trim(); + final tx = Transaction( id: state.editingId ?? _uuid.v4(), amount: state.amount!, category: state.category, type: state.type, date: state.date, - note: state.note.isEmpty ? null : state.note, + note: note.isEmpty ? null : note, currency: currencyInfo.symbol, currencyCode: currencyInfo.code, ); @@ -271,11 +273,12 @@ class _AddTransactionScreenState extends ConsumerState { TextFormField( controller: _noteController, maxLines: 2, + maxLength: 20, decoration: const InputDecoration( hintText: 'Add a note...', ), onChanged: (v) => - ref.read(addTransactionProvider(widget.initial).notifier).setNote(v), + ref.read(addTransactionProvider(widget.initial).notifier).setNote(v.trim()), ), const SizedBox(height: 32), diff --git a/lib/features/settings/screen.dart b/lib/features/settings/screen.dart index 44d1992..3ca975c 100644 --- a/lib/features/settings/screen.dart +++ b/lib/features/settings/screen.dart @@ -141,99 +141,6 @@ class _SettingsScreenState extends ConsumerState { ), const SizedBox(height: 16), - // Currency Selector - Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(16), - border: isDark ? null : Border.all(color: const Color(0xFFDDDDEE), width: 1), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - color: AppColors.accent.withOpacity(0.15), - borderRadius: BorderRadius.circular(12), - ), - child: const Icon( - Icons.attach_money_rounded, - color: AppColors.accent, - size: 20, - ), - ), - const SizedBox(width: 12), - Expanded( - child: Text( - 'Currency', - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.onSurface, - ), - ), - ), - ], - ), - const SizedBox(height: 16), - Row( - children: ['USD', 'EUR', 'BYN', 'RUB'].map((code) { - final info = currencyMap[code]!; - final isSelected = currencyInfo.code == code; - return Expanded( - child: Padding( - padding: const EdgeInsets.only(right: 8), - child: GestureDetector( - onTap: () { - final oldCode = ref.read(currencyProvider).code; - final rates = ref.read(exchangeRateServiceProvider); - ref.read(budgetProvider.notifier).onCurrencyChanged(oldCode, code, rates); - ref.read(currencyProvider.notifier).setCurrency(code); - }, - child: Container( - padding: const EdgeInsets.symmetric(vertical: 12), - decoration: BoxDecoration( - color: isSelected - ? AppColors.accent.withOpacity(0.2) - : Theme.of(context).scaffoldBackgroundColor, - borderRadius: BorderRadius.circular(12), - border: isSelected - ? Border.all(color: AppColors.accent, width: 1.5) - : (isDark ? null : Border.all(color: const Color(0xFFDDDDEE), width: 1)), - ), - child: Column( - children: [ - Text( - info.symbol, - style: Theme.of(context).textTheme.titleLarge?.copyWith( - color: isSelected ? AppColors.accent : Theme.of(context).colorScheme.onSurface.withOpacity(0.6), - fontWeight: isSelected ? FontWeight.w700 : FontWeight.normal, - ), - ), - const SizedBox(height: 2), - Text( - code, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: isSelected ? AppColors.accent : Theme.of(context).colorScheme.onSurface.withOpacity(0.6), - fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, - ), - ), - ], - ), - ), - ), - ), - ); - }).toList(), - ), - ], - ), - ), - const SizedBox(height: 16), - // Budget Setting Container( padding: const EdgeInsets.all(20), @@ -346,6 +253,99 @@ class _SettingsScreenState extends ConsumerState { ], ), ), + const SizedBox(height: 16), + + // Currency Selector + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(16), + border: isDark ? null : Border.all(color: const Color(0xFFDDDDEE), width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: AppColors.accent.withOpacity(0.15), + borderRadius: BorderRadius.circular(12), + ), + child: const Icon( + Icons.attach_money_rounded, + color: AppColors.accent, + size: 20, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + 'Currency', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ], + ), + const SizedBox(height: 16), + Row( + children: ['USD', 'EUR', 'BYN', 'RUB'].map((code) { + final info = currencyMap[code]!; + final isSelected = currencyInfo.code == code; + return Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 8), + child: GestureDetector( + onTap: () { + final oldCode = ref.read(currencyProvider).code; + final rates = ref.read(exchangeRateServiceProvider); + ref.read(budgetProvider.notifier).onCurrencyChanged(oldCode, code, rates); + ref.read(currencyProvider.notifier).setCurrency(code); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: isSelected + ? AppColors.accent.withOpacity(0.2) + : Theme.of(context).scaffoldBackgroundColor, + borderRadius: BorderRadius.circular(12), + border: isSelected + ? Border.all(color: AppColors.accent, width: 1.5) + : (isDark ? null : Border.all(color: const Color(0xFFDDDDEE), width: 1)), + ), + child: Column( + children: [ + Text( + info.symbol, + style: Theme.of(context).textTheme.titleLarge?.copyWith( + color: isSelected ? AppColors.accent : Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + fontWeight: isSelected ? FontWeight.w700 : FontWeight.normal, + ), + ), + const SizedBox(height: 2), + Text( + code, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: isSelected ? AppColors.accent : Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + ), + ), + ], + ), + ), + ), + ), + ); + }).toList(), + ), + ], + ), + ), ], ), ),