Files
sxchnge/frontend/app/lib/workspace/settings.dart

122 lines
4.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:sxchnge_wallet/sxchnge_wallet.dart';
import '../providers/locale.dart';
import '../security/settings.dart';
import '../generated/i18n/app_localizations.dart';
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@override
Widget build(BuildContext context) {
final p = context.watch<WalletProvider>();
final locale = context.watch<LocaleProvider>();
final l = AppLocalizations.of(context)!;
final t = Theme.of(context);
return SingleChildScrollView(
padding: const EdgeInsets.all(24),
child: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 720),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (context.canPop())
Align(
alignment: Alignment.centerLeft,
child: TextButton.icon(
onPressed: () => context.pop(),
icon: const Icon(Icons.arrow_back),
label: Text(l.kycBack),
),
),
Text(l.wPreferences, style: t.textTheme.displayMedium),
const SizedBox(height: 28),
Card(
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(l.wLanguage, style: t.textTheme.titleLarge),
const SizedBox(height: 8),
Text(l.wLanguageHelp),
const SizedBox(height: 20),
if (p.profileLoading) const LinearProgressIndicator(),
if (p.profileFailed) ...[
Text(l.wProfileError),
TextButton(
onPressed: () => locale.loadAccount(p),
child: Text(l.wRefresh),
),
],
DropdownButtonFormField<String>(
key: ValueKey(
'account-language-${locale.locale.languageCode}',
),
initialValue: locale.locale.languageCode,
isExpanded: true,
items: const [
DropdownMenuItem(value: 'en', child: Text('English')),
DropdownMenuItem(value: 'ru', child: Text('Русский')),
],
onChanged: p.saving || p.profileLoading
? null
: (value) {
if (value != null) {
locale.saveAccountLocale(p, Locale(value));
}
},
decoration: InputDecoration(labelText: l.wLanguage),
),
if (p.saving) const LinearProgressIndicator(),
if (p.saveFailed) ...[
const SizedBox(height: 12),
Semantics(
liveRegion: true,
child: Text(l.wLanguageFailed),
),
TextButton(
onPressed: p.saving
? null
: () =>
locale.saveAccountLocale(p, locale.locale),
child: Text(l.wRefresh),
),
],
],
),
),
),
const SizedBox(height: 16),
Card(
child: ListTile(
contentPadding: const EdgeInsets.all(24),
leading: const Icon(Icons.verified_user_outlined),
title: Text(l.wIdentity),
subtitle: Text(l.wIdentityHelp),
trailing: const Icon(Icons.chevron_right),
onTap: () => context.go('/identity'),
),
),
const SizedBox(height: 16),
const SecuritySettings(),
const SizedBox(height: 20),
TextButton(
onPressed: () => context.go('/'),
child: Text(l.wBackLogin),
),
],
),
),
),
);
}
}