bharat_erp/lib/modules/settings/presentation/screens/general_settings_screen.dart
2026-07-14 18:15:26 +05:30

174 lines
5.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../../core/utils/formatters.dart';
import '../../../../shared/widgets/app_button.dart';
import '../../../../shared/widgets/app_text_field.dart';
import '../../domain/entities/app_settings.dart';
import '../providers/settings_provider.dart';
import '../widgets/settings_widgets.dart';
import '../../../../shared/widgets/app_toast.dart';
class GeneralSettingsScreen extends ConsumerStatefulWidget {
const GeneralSettingsScreen({super.key});
@override
ConsumerState<GeneralSettingsScreen> createState() =>
_GeneralSettingsScreenState();
}
class _GeneralSettingsScreenState extends ConsumerState<GeneralSettingsScreen> {
final _formKey = GlobalKey<FormState>();
late final TextEditingController _defaultBranchController;
late final TextEditingController _branchCodeFormatController;
late String _timeZone;
late String _language;
late String _currency;
late String _timeFormat;
late String _numberFormat;
@override
void initState() {
super.initState();
final general = ref.read(appSettingsProvider).general;
_defaultBranchController = TextEditingController(text: general.defaultBranch);
_branchCodeFormatController =
TextEditingController(text: general.branchCodeFormat);
_timeZone = general.timeZone;
_language = general.language;
_currency = general.currency;
_timeFormat = general.timeFormat;
_numberFormat = general.numberFormat;
}
@override
void dispose() {
_defaultBranchController.dispose();
_branchCodeFormatController.dispose();
super.dispose();
}
Future<void> _save() async {
if (!_formKey.currentState!.validate()) return;
await ref.read(appSettingsProvider.notifier).updateGeneral(
GeneralSettings(
defaultBranch: _defaultBranchController.text.trim(),
branchCodeFormat: _branchCodeFormatController.text.trim(),
timeZone: _timeZone,
language: _language,
currency: _currency,
dateFormat: DateFormatter.displayDatePattern,
timeFormat: _timeFormat,
numberFormat: _numberFormat,
),
);
if (mounted) {
showAppToastFromSnackBar(context,
const SnackBar(content: Text('General settings saved')),
);
}
}
@override
Widget build(BuildContext context) {
return SettingsPageLayout(
title: 'General Settings',
subtitle: 'Regional preferences and branch defaults',
child: Form(
key: _formKey,
child: Column(
children: [
SettingsFormCard(
title: 'Branch Settings',
subtitle: 'Default branch and code format',
children: [
AppTextField(
controller: _defaultBranchController,
label: 'Default Branch',
),
const SizedBox(height: 16),
AppTextField(
controller: _branchCodeFormatController,
label: 'Branch Code Format',
hint: 'BR-{000}',
),
],
),
const SizedBox(height: 16),
SettingsFormCard(
title: 'Regional Settings',
subtitle: 'Time zone, language, currency, and formats',
children: [
SettingsDropdownField<String>(
label: 'Time Zone',
value: _timeZone,
items: const [
'Asia/Kolkata',
'Asia/Dubai',
'Europe/London',
'America/New_York',
],
itemLabel: (v) => v,
onChanged: (v) => setState(() => _timeZone = v!),
),
const SizedBox(height: 16),
SettingsDropdownField<String>(
label: 'Language',
value: _language,
items: const ['en', 'hi', 'ta'],
itemLabel: (v) => switch (v) {
'en' => 'English',
'hi' => 'Hindi',
'ta' => 'Tamil',
_ => v,
},
onChanged: (v) => setState(() => _language = v!),
),
const SizedBox(height: 16),
SettingsDropdownField<String>(
label: 'Currency',
value: _currency,
items: const ['INR', 'USD', 'EUR', 'AED'],
itemLabel: (v) => v,
onChanged: (v) => setState(() => _currency = v!),
),
const SizedBox(height: 16),
InputDecorator(
decoration: const InputDecoration(
labelText: 'Date Format',
enabled: false,
),
child: Text(
'DD/MM/YYYY',
style: Theme.of(context).textTheme.bodyLarge,
),
),
const SizedBox(height: 16),
SettingsDropdownField<String>(
label: 'Time Format',
value: _timeFormat,
items: const ['HH:mm', 'hh:mm a'],
itemLabel: (v) => v,
onChanged: (v) => setState(() => _timeFormat = v!),
),
const SizedBox(height: 16),
SettingsDropdownField<String>(
label: 'Number Format',
value: _numberFormat,
items: const ['1,234.56', '1.234,56'],
itemLabel: (v) => v,
onChanged: (v) => setState(() => _numberFormat = v!),
),
],
),
const SizedBox(height: 24),
AppButton(label: 'Save Changes', onPressed: _save),
],
),
),
);
}
}