parent
3a8d977f11
commit
641341ed90
1 changed files with 667 additions and 144 deletions
53
lib/helpers/extensions/log_out.dart
Normal file
53
lib/helpers/extensions/log_out.dart
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:flutter_riverpod/experimental/mutation.dart";
|
||||
import "package:nexus/controllers/accounts.dart";
|
||||
import "package:nexus/controllers/active_account.dart";
|
||||
import "package:nexus/controllers/client.dart";
|
||||
import "package:nexus/controllers/init_complete.dart";
|
||||
import "package:nexus/controllers/unified_push.dart";
|
||||
import "package:nexus/main.dart";
|
||||
|
||||
extension LogOut on MutationTarget {
|
||||
Future<void> logOut(String accountId) async {
|
||||
final accounts = await container.read(AccountsController.provider.future);
|
||||
final account = accounts.firstWhereOrNull(
|
||||
(account) => account.id == accountId,
|
||||
);
|
||||
if (account == null) return;
|
||||
|
||||
final isActive =
|
||||
accountId == container.read(ActiveAccountController.provider);
|
||||
final client = isActive
|
||||
? container.read(ClientController.provider.notifier)
|
||||
: container.read(ClientController.forAccount(accountId).notifier);
|
||||
|
||||
if (account.deviceId case final deviceId?) {
|
||||
await container
|
||||
.read(UnifiedPushController.provider.notifier)
|
||||
.deregister(deviceId)
|
||||
.onError(showError);
|
||||
}
|
||||
if (isActive) container.invalidate(InitCompleteController.provider);
|
||||
await client.logout().onError(showError);
|
||||
|
||||
if (!isActive) {
|
||||
container.invalidate(ClientController.forAccount(accountId));
|
||||
await container
|
||||
.read(AccountsController.provider.notifier)
|
||||
.remove(accountId);
|
||||
return;
|
||||
}
|
||||
|
||||
final other = accounts.firstWhereOrNull(
|
||||
(account) => account.id != accountId,
|
||||
);
|
||||
if (other == null) return;
|
||||
|
||||
await container
|
||||
.read(AccountsController.provider.notifier)
|
||||
.remove(accountId);
|
||||
await container
|
||||
.read(ActiveAccountController.provider.notifier)
|
||||
.switchTo(other.id);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue