4a93bd1c44
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
49 lines
1.5 KiB
Dart
49 lines
1.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../../shared/network/api_client.dart';
|
|
import '../../../shared/storage/session_store.dart';
|
|
import '../domain/auth_session.dart';
|
|
|
|
class AuthController {
|
|
AuthController({ApiClient? apiClient}) : _apiClient = apiClient ?? const ApiClient();
|
|
|
|
final ApiClient _apiClient;
|
|
|
|
final ValueNotifier<bool> isLoading = ValueNotifier<bool>(false);
|
|
final ValueNotifier<String?> errorMessage = ValueNotifier<String?>(null);
|
|
|
|
Future<void> login({required String account, required String password}) async {
|
|
isLoading.value = true;
|
|
errorMessage.value = null;
|
|
try {
|
|
final session = await _apiClient.login(account: account, password: password);
|
|
final currentUser = await _apiClient.fetchCurrentUser(session.accessToken);
|
|
await SessionStore.save(_mergeSession(session, currentUser));
|
|
} on ApiException catch (error) {
|
|
errorMessage.value = error.message;
|
|
rethrow;
|
|
} catch (_) {
|
|
errorMessage.value = '登录失败,请稍后重试';
|
|
rethrow;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
Future<void> logout() async {
|
|
await SessionStore.clear();
|
|
errorMessage.value = null;
|
|
}
|
|
|
|
AuthSession _mergeSession(AuthSession session, AuthSession currentUser) {
|
|
return session.copyWith(
|
|
userId: currentUser.userId,
|
|
tenantId: currentUser.tenantId,
|
|
username: currentUser.username,
|
|
userDisplayName: currentUser.userDisplayName,
|
|
role: currentUser.role,
|
|
status: currentUser.status,
|
|
);
|
|
}
|
|
}
|