import 'package:dio/dio.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import '../../../common/network/auth_interceptor.dart'; import '../../../common/storage/storage_keys.dart'; import '../../../common/storage/storage_service.dart'; import '../../../common/network/dio_provider.dart'; import '../data/auth_models.dart'; import '../data/auth_api.dart'; import '../data/one_key_login_api.dart'; final authProvider = StateNotifierProvider>( (ref) => AuthController(ref.read(dioProvider)), ); class AuthController extends StateNotifier> { AuthController(this._dio) : super(const AsyncLoading()) { _bootstrap(); } final Dio _dio; Future _bootstrap() async { final token = await loadJwt(); if (token == null || token.isEmpty) { state = const AsyncData(GuestAuthState()); return; } final phone = StorageService.to.getString(storageJinzhiMockLoggedIn) ?? ''; state = AsyncData( LoggedInAuthState( user: JinzhiUser( phone: phone.isEmpty ? '13800000000' : phone, nickname: '金值用户', createdAt: DateTime(2026, 6, 18), ), token: token, ), ); } Future sendCode(String phone) async { await AuthApi(_dio).sendSmsCode(phone); } Future verifyCode(String phone, String code) async { final reply = await AuthApi(_dio).verifySmsCode(phone, code); await saveJwt(reply.accessToken); await StorageService.to.setString(storageJinzhiMockLoggedIn, reply.phone); state = AsyncData( LoggedInAuthState( user: JinzhiUser( phone: reply.phone, nickname: '金值用户', createdAt: DateTime.now(), ), token: reply.accessToken, ), ); } /// Test environment reuses Yanting's one-key verification endpoint until /// 金值 has its own account contract. Future verifyOneKeyLogin(String loginToken) async { final reply = await OneKeyLoginApi(_dio).verify(loginToken); await saveJwt(reply.token); await StorageService.to.setString(storageJinzhiMockLoggedIn, reply.phone); state = AsyncData( LoggedInAuthState( user: JinzhiUser( phone: reply.phone, nickname: '金值用户', createdAt: DateTime.now(), ), token: reply.token, ), ); } Future logout() async { await clearJwt(); await StorageService.to.setString(storageJinzhiMockLoggedIn, ''); state = const AsyncData(GuestAuthState()); } Future deleteAccount([String? code]) async { await logout(); } bool get isLoggedIn => state.valueOrNull is LoggedInAuthState; }