Fixes for Settings Page
This commit is contained in:
94
frontend/pweb/lib/providers/account_name.dart
Normal file
94
frontend/pweb/lib/providers/account_name.dart
Normal file
@@ -0,0 +1,94 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:pshared/provider/account.dart';
|
||||
|
||||
import 'package:pweb/models/edit_state.dart';
|
||||
|
||||
|
||||
class AccountNameState extends ChangeNotifier {
|
||||
AccountNameState({
|
||||
required this.initialName,
|
||||
required this.errorMessage,
|
||||
required AccountProvider accountProvider,
|
||||
}) : _accountProvider = accountProvider {
|
||||
_controller = TextEditingController(text: initialName);
|
||||
}
|
||||
|
||||
final AccountProvider _accountProvider;
|
||||
final String initialName;
|
||||
final String errorMessage;
|
||||
|
||||
late final TextEditingController _controller;
|
||||
EditState _editState = EditState.view;
|
||||
String _errorText = '';
|
||||
bool _disposed = false;
|
||||
|
||||
TextEditingController get controller => _controller;
|
||||
EditState get editState => _editState;
|
||||
String get errorText => _errorText;
|
||||
bool get isEditing => _editState != EditState.view;
|
||||
bool get isSaving => _editState == EditState.saving;
|
||||
bool get isBusy => _accountProvider.isLoading || isSaving;
|
||||
String get currentName => _accountProvider.account?.name ?? initialName;
|
||||
|
||||
void startEditing() => _setState(EditState.edit);
|
||||
|
||||
void cancelEditing() {
|
||||
_controller.text = currentName;
|
||||
_setError('');
|
||||
_setState(EditState.view);
|
||||
}
|
||||
|
||||
void syncName(String latestName) {
|
||||
if (isEditing) return;
|
||||
if (_controller.text != latestName) {
|
||||
_controller.text = latestName;
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> save() async {
|
||||
final newName = _controller.text.trim();
|
||||
final current = currentName;
|
||||
|
||||
if (newName.isEmpty || newName == current) {
|
||||
cancelEditing();
|
||||
return false;
|
||||
}
|
||||
|
||||
_setError('');
|
||||
_setState(EditState.saving);
|
||||
|
||||
try {
|
||||
await _accountProvider.resetUsername(newName);
|
||||
_setState(EditState.view);
|
||||
return true;
|
||||
} catch (_) {
|
||||
_setError(errorMessage);
|
||||
_setState(EditState.edit);
|
||||
return false;
|
||||
} finally {
|
||||
if (_editState == EditState.saving) {
|
||||
_setState(EditState.edit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _setState(EditState value) {
|
||||
if (_disposed || _editState == value) return;
|
||||
_editState = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void _setError(String value) {
|
||||
if (_disposed) return;
|
||||
_errorText = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_disposed = true;
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
76
frontend/pweb/lib/providers/password_form.dart
Normal file
76
frontend/pweb/lib/providers/password_form.dart
Normal file
@@ -0,0 +1,76 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:pshared/provider/account.dart';
|
||||
|
||||
import 'package:pweb/models/edit_state.dart';
|
||||
|
||||
|
||||
class PasswordFormProvider extends ChangeNotifier {
|
||||
final formKey = GlobalKey<FormState>();
|
||||
final oldPasswordController = TextEditingController();
|
||||
final newPasswordController = TextEditingController();
|
||||
final confirmPasswordController = TextEditingController();
|
||||
|
||||
EditState _state = EditState.view;
|
||||
String _errorText = '';
|
||||
bool _disposed = false;
|
||||
|
||||
bool get isExpanded => _state != EditState.view;
|
||||
bool get isSaving => _state == EditState.saving;
|
||||
String get errorText => _errorText;
|
||||
EditState get state => _state;
|
||||
|
||||
void toggleExpanded() {
|
||||
if (_state == EditState.saving) return;
|
||||
_setState(_state == EditState.view ? EditState.edit : EditState.view);
|
||||
_setError('');
|
||||
}
|
||||
|
||||
Future<void> submit({
|
||||
required AccountProvider accountProvider,
|
||||
required String errorText,
|
||||
}) async {
|
||||
final currentForm = formKey.currentState;
|
||||
if (currentForm == null || !currentForm.validate()) return;
|
||||
|
||||
_setState(EditState.saving);
|
||||
_setError('');
|
||||
|
||||
try {
|
||||
await accountProvider.changePassword(
|
||||
oldPasswordController.text,
|
||||
newPasswordController.text,
|
||||
);
|
||||
|
||||
oldPasswordController.clear();
|
||||
newPasswordController.clear();
|
||||
confirmPasswordController.clear();
|
||||
} catch (e) {
|
||||
_setError(errorText);
|
||||
rethrow;
|
||||
} finally {
|
||||
_setState(EditState.edit);
|
||||
}
|
||||
}
|
||||
|
||||
void _setState(EditState value) {
|
||||
if (_state == value || _disposed) return;
|
||||
_state = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void _setError(String value) {
|
||||
if (_disposed) return;
|
||||
_errorText = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_disposed = true;
|
||||
oldPasswordController.dispose();
|
||||
newPasswordController.dispose();
|
||||
confirmPasswordController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user