0661016827
- Replace Email+Password login with Phone+OTP flow - Remove RegisterCubit and registration screens (email verification) - Remove ResetPasswordCubit and reset password screens - Add phone normalization and international dial code support - Update LoginCubit with sendCode/resend cooldown logic - Add new widgets: phone prefix selector, confirm sheet - Update all auth API endpoints: /otp/send, /phone-session - Update form inputs: Email -> Phone with E.164 validation - Update tests for new auth flow
86 lines
2.2 KiB
Dart
86 lines
2.2 KiB
Dart
import 'package:social_app/core/storage/token_storage.dart';
|
|
import 'auth_api.dart';
|
|
import 'auth_repository.dart';
|
|
import 'models/signup_request.dart';
|
|
import 'models/login_request.dart';
|
|
import 'models/auth_response.dart';
|
|
|
|
class AuthRepositoryImpl implements AuthRepository {
|
|
final AuthApi _api;
|
|
final TokenStorage _tokenStorage;
|
|
final Future<void> Function()? _onLogout;
|
|
|
|
AuthRepositoryImpl({
|
|
required AuthApi api,
|
|
required TokenStorage tokenStorage,
|
|
Future<void> Function()? onLogout,
|
|
}) : _api = api,
|
|
_tokenStorage = tokenStorage,
|
|
_onLogout = onLogout;
|
|
|
|
@override
|
|
Future<void> sendOtp(String phone) {
|
|
return _api.sendOtp(OtpSendRequest(phone: phone));
|
|
}
|
|
|
|
@override
|
|
Future<AuthResponse> createPhoneSession({
|
|
required String phone,
|
|
required String token,
|
|
}) async {
|
|
final response = await _api.createPhoneSession(
|
|
LoginRequest(phone: phone, token: token),
|
|
);
|
|
await _tokenStorage.saveTokens(
|
|
access: response.accessToken,
|
|
refresh: response.refreshToken,
|
|
);
|
|
return response;
|
|
}
|
|
|
|
@override
|
|
Future<AuthResponse> refreshSession(String refreshToken) async {
|
|
final response = await _api.refreshSession(
|
|
RefreshRequest(refreshToken: refreshToken),
|
|
);
|
|
await _tokenStorage.saveTokens(
|
|
access: response.accessToken,
|
|
refresh: response.refreshToken,
|
|
);
|
|
return response;
|
|
}
|
|
|
|
@override
|
|
Future<void> deleteSession() async {
|
|
final refreshToken = await _tokenStorage.getRefreshToken();
|
|
if (refreshToken != null) {
|
|
try {
|
|
await _api.deleteSession(LogoutRequest(refreshToken: refreshToken));
|
|
} catch (_) {
|
|
// ignore API errors during logout
|
|
}
|
|
}
|
|
await clearSessionLocalOnly();
|
|
}
|
|
|
|
@override
|
|
Future<void> clearSessionLocalOnly() async {
|
|
if (_onLogout != null) {
|
|
await _onLogout();
|
|
}
|
|
await _tokenStorage.clear();
|
|
}
|
|
|
|
@override
|
|
Future<String?> getAccessToken() => _tokenStorage.getAccessToken();
|
|
|
|
@override
|
|
Future<String?> getRefreshToken() => _tokenStorage.getRefreshToken();
|
|
|
|
@override
|
|
Future<bool> isAuthenticated() async {
|
|
final token = await _tokenStorage.getAccessToken();
|
|
return token != null;
|
|
}
|
|
}
|