relatica/lib/utils/active_profile_selector.dart

38 lines
1.1 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:relatica/services/auth_service.dart';
import 'package:result_monad/result_monad.dart';
import '../globals.dart';
import '../models/auth/profile.dart';
import '../models/exec_error.dart';
class ActiveProfileSelector<T extends ChangeNotifier> extends ChangeNotifier {
final _entries = <Profile, T>{};
final T Function(Profile p) _entryBuilder;
ActiveProfileSelector(T Function(Profile p) entryBuilder)
: _entryBuilder = entryBuilder;
Result<T, ExecError> get activeEntry {
final service = getIt<AccountsService>();
if (!service.loggedIn) {
return buildErrorResult(
type: ErrorType.localError,
message: 'No Logged In User',
);
}
final p = service.currentProfile;
return runCatching(() {
final entry = _entries.putIfAbsent(p, () => _buildNewEntry(p));
return Result.ok(entry).execErrorCast();
}).execErrorCast();
}
T _buildNewEntry(Profile p) {
final newEntry = _entryBuilder(p);
newEntry.addListener(() => notifyListeners());
return newEntry;
}
}