Files
sendico/frontend/pweb/lib/providers/account_name.dart
2025-12-22 21:09:58 +03:00

95 lines
2.3 KiB
Dart

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