Add account switcher

Fixes #146
This commit is contained in:
Henry Hiles 2026-11-02 17:00:54 -05:00
commit 641341ed90
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

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