login method
Selects an account, prepares HTTP, and authenticates with SPH.
For EasyLanisClient.ephemeral, accountId is optional.
Implementation
Future<void> login({
int? accountId,
String? loginUrl,
bool withoutData = false,
}) async {
_ensureNotDisposed();
final ClearTextAccount account;
if (_ephemeral) {
if (_ephemeralAccount == null) {
throw ConfigurationException('Ephemeral account not configured');
}
account = _ephemeralAccount!;
} else {
if (accountId == null) {
throw ConfigurationException('accountId is required');
}
final loaded = await _db.getAccount(accountId);
if (loaded == null) {
throw UnknownException('Account $accountId not found');
}
account = loaded;
}
final previousId = _activeAccount?.localId;
if (previousId != null && previousId != account.localId) {
await _clearSession(skipDeauthenticate: false);
} else if (previousId == account.localId && _session != null) {
await _clearSession(skipDeauthenticate: false);
}
_activeAccount = account;
_session = LanisSession(
account: account,
config: _config,
connectionChecker: _connection,
);
await _session!.prepareDio();
_rebuildParsers();
_storageManager = null;
await _session!.authenticate(
withLoginUrl: loginUrl,
withoutData: withoutData,
);
if (!_ephemeral) {
await _db.updateLastLogin(account.localId);
if (account.accountType == null) {
final detectedType = _session!.accountTypeOrNull;
if (detectedType != null) {
await _db.setAccountType(account.localId, detectedType);
final updated = await _db.getAccount(account.localId);
if (updated != null) {
_activeAccount = updated;
_rebuildParsers();
}
}
}
} else if (_activeAccount!.accountType == null) {
final detected = _session!.accountTypeOrNull;
if (detected != null) {
_activeAccount = _activeAccount!.copyWith(accountType: detected);
_rebuildParsers();
}
}
_authenticated = true;
}