mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-19 09:23:31 +00:00
38 lines
1.1 KiB
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;
|
|
}
|
|
}
|