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