redesign for settings page

This commit is contained in:
Arseni
2026-03-13 23:01:57 +03:00
parent 70bd7a6214
commit d601f245d4
36 changed files with 1151 additions and 262 deletions

View File

@@ -12,7 +12,6 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class AccountPasswordContent extends StatelessWidget {
const AccountPasswordContent({
required this.title,
required this.successText,
required this.errorText,
required this.oldPasswordLabel,
@@ -22,7 +21,6 @@ class AccountPasswordContent extends StatelessWidget {
required this.loc,
});
final String title;
final String successText;
final String errorText;
final String oldPasswordLabel;
@@ -33,34 +31,19 @@ class AccountPasswordContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Consumer2<AccountProvider, PasswordFormController>(
builder: (context, accountProvider, formProvider, _) {
final isBusy = accountProvider.isLoading || formProvider.isSaving;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TextButton.icon(
onPressed: isBusy ? null : formProvider.toggleExpanded,
icon: Icon(Icons.lock_outline, color: theme.colorScheme.primary),
label: Text(title, style: theme.textTheme.bodyMedium),
),
if (formProvider.isExpanded)
PasswordForm(
formProvider: formProvider,
accountProvider: accountProvider,
isBusy: accountProvider.isLoading,
oldPasswordLabel: oldPasswordLabel,
newPasswordLabel: newPasswordLabel,
confirmPasswordLabel: confirmPasswordLabel,
savePassword: savePassword,
successText: successText,
errorText: errorText,
loc: loc,
),
],
return PasswordForm(
formProvider: formProvider,
accountProvider: accountProvider,
isBusy: accountProvider.isLoading,
oldPasswordLabel: oldPasswordLabel,
newPasswordLabel: newPasswordLabel,
confirmPasswordLabel: confirmPasswordLabel,
savePassword: savePassword,
successText: successText,
errorText: errorText,
loc: loc,
);
},
);

View File

@@ -1,14 +1,17 @@
import 'package:flutter/material.dart';
import 'package:pshared/provider/account.dart';
import 'package:pshared/widgets/password/fields.dart';
import 'package:pshared/widgets/password/field.dart';
import 'package:pshared/utils/snackbar.dart';
import 'package:pweb/models/auth/password_field_type.dart';
import 'package:pweb/controllers/auth/password_form.dart';
import 'package:pweb/models/state/control_state.dart';
import 'package:pweb/models/state/visibility.dart';
import 'package:pweb/pages/settings/profile/account/password/form/error_text.dart';
import 'package:pweb/pages/settings/profile/account/password/form/submit_button.dart';
import 'package:pweb/utils/error/snackbar.dart';
import 'package:pweb/widgets/password/ui_controller.dart';
import 'package:pweb/widgets/password/verify.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
@@ -46,6 +49,9 @@ class PasswordForm extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isFormBusy = isBusy || formProvider.isSaving;
final controlState = isFormBusy
? ControlState.disabled
: ControlState.enabled;
return Column(
children: [
@@ -54,30 +60,38 @@ class PasswordForm extends StatelessWidget {
key: formProvider.formKey,
child: Column(
children: [
PasswordFields(
oldPasswordController: formProvider.oldPasswordController,
newPasswordController: formProvider.newPasswordController,
confirmPasswordController: formProvider.confirmPasswordController,
oldPasswordLabel: oldPasswordLabel,
newPasswordLabel: newPasswordLabel,
confirmPasswordLabel: confirmPasswordLabel,
missingPasswordError: loc.errorPasswordMissing,
passwordsDoNotMatchError: loc.passwordsDoNotMatch,
PasswordField(
controller: formProvider.oldPasswordController,
labelText: oldPasswordLabel,
fieldWidth: _fieldWidth,
gapSmall: _gapSmall,
isEnabled: !isFormBusy,
showOldPassword:
formProvider.isPasswordVisible(PasswordFieldType.old),
showNewPassword:
formProvider.isPasswordVisible(PasswordFieldType.newPassword),
showConfirmPassword: formProvider
.isPasswordVisible(PasswordFieldType.confirmPassword),
onToggleOldPassword: () =>
formProvider.togglePasswordVisibility(PasswordFieldType.old),
onToggleNewPassword: () => formProvider
.togglePasswordVisibility(PasswordFieldType.newPassword),
onToggleConfirmPassword: () => formProvider
.togglePasswordVisibility(PasswordFieldType.confirmPassword),
isEnabled: controlState == ControlState.enabled,
obscureText:
formProvider.oldPasswordVisibility !=
VisibilityState.visible,
onToggleVisibility: formProvider.toggleOldPasswordVisibility,
validator: (value) => (value == null || value.isEmpty)
? loc.errorPasswordMissing
: null,
),
const SizedBox(height: _gapSmall),
SizedBox(
width: _fieldWidth,
child: PasswordUiController(
controller: formProvider.newPasswordController,
labelText: newPasswordLabel,
state: controlState,
),
),
const SizedBox(height: _gapSmall),
SizedBox(
width: _fieldWidth,
child: VerifyPasswordField(
controller: formProvider.confirmPasswordController,
externalPasswordController:
formProvider.newPasswordController,
labelText: confirmPasswordLabel,
state: controlState,
),
),
const SizedBox(height: _gapMedium),
PasswordSubmitButton(

View File

@@ -9,7 +9,6 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class AccountPassword extends StatelessWidget {
final String title;
final String successText;
final String errorText;
final String oldPasswordLabel;
@@ -19,7 +18,6 @@ class AccountPassword extends StatelessWidget {
const AccountPassword({
super.key,
required this.title,
required this.successText,
required this.errorText,
required this.oldPasswordLabel,
@@ -35,7 +33,6 @@ class AccountPassword extends StatelessWidget {
return ChangeNotifierProvider(
create: (_) => PasswordFormController(),
child: AccountPasswordContent(
title: title,
successText: successText,
errorText: errorText,
oldPasswordLabel: oldPasswordLabel,