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(); 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 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(); } }