95 lines
2.3 KiB
Dart
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();
|
|
}
|
|
}
|