174 lines
5.9 KiB
Dart
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),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|