add auth register
This commit is contained in:
107
lib/features/auth/presentation/providers/session_provider.dart
Normal file
107
lib/features/auth/presentation/providers/session_provider.dart
Normal file
@@ -0,0 +1,107 @@
|
||||
/// Session Provider
|
||||
///
|
||||
/// Manages authentication session (SID and CSRF token)
|
||||
library;
|
||||
|
||||
import 'package:curl_logger_dio_interceptor/curl_logger_dio_interceptor.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:worker/features/auth/data/datasources/auth_remote_datasource.dart';
|
||||
import 'package:worker/features/auth/data/models/auth_session_model.dart';
|
||||
|
||||
part 'session_provider.g.dart';
|
||||
|
||||
/// Provider for Dio instance
|
||||
@Riverpod(keepAlive: true)
|
||||
Dio dio(Ref ref) {
|
||||
final dio = Dio(
|
||||
BaseOptions(
|
||||
baseUrl: 'https://land.dbiz.com',
|
||||
connectTimeout: const Duration(seconds: 30),
|
||||
receiveTimeout: const Duration(seconds: 30),
|
||||
),
|
||||
);
|
||||
|
||||
// Add curl logger interceptor for debugging
|
||||
dio.interceptors.add(CurlLoggerDioInterceptor(printOnSuccess: true));
|
||||
|
||||
return dio;
|
||||
}
|
||||
|
||||
/// Provider for AuthRemoteDataSource
|
||||
@Riverpod(keepAlive: true)
|
||||
AuthRemoteDataSource authRemoteDataSource(Ref ref) {
|
||||
final dio = ref.watch(dioProvider);
|
||||
return AuthRemoteDataSource(dio);
|
||||
}
|
||||
|
||||
/// Session State
|
||||
class SessionState {
|
||||
final String? sid;
|
||||
final String? csrfToken;
|
||||
final bool isLoading;
|
||||
final String? error;
|
||||
|
||||
const SessionState({
|
||||
this.sid,
|
||||
this.csrfToken,
|
||||
this.isLoading = false,
|
||||
this.error,
|
||||
});
|
||||
|
||||
SessionState copyWith({
|
||||
String? sid,
|
||||
String? csrfToken,
|
||||
bool? isLoading,
|
||||
String? error,
|
||||
}) {
|
||||
return SessionState(
|
||||
sid: sid ?? this.sid,
|
||||
csrfToken: csrfToken ?? this.csrfToken,
|
||||
isLoading: isLoading ?? this.isLoading,
|
||||
error: error ?? this.error,
|
||||
);
|
||||
}
|
||||
|
||||
bool get hasSession => sid != null && csrfToken != null;
|
||||
}
|
||||
|
||||
/// Session Provider
|
||||
///
|
||||
/// Manages the authentication session including SID and CSRF token.
|
||||
/// This should be called before making any authenticated requests.
|
||||
/// keepAlive: true ensures the session persists across the app lifecycle.
|
||||
@Riverpod(keepAlive: true)
|
||||
class Session extends _$Session {
|
||||
@override
|
||||
SessionState build() {
|
||||
return const SessionState();
|
||||
}
|
||||
|
||||
/// Get session from API
|
||||
Future<void> getSession() async {
|
||||
state = state.copyWith(isLoading: true, error: null);
|
||||
|
||||
try {
|
||||
final dataSource = ref.read(authRemoteDataSourceProvider);
|
||||
final response = await dataSource.getSession();
|
||||
|
||||
state = SessionState(
|
||||
sid: response.message.data.sid,
|
||||
csrfToken: response.message.data.csrfToken,
|
||||
isLoading: false,
|
||||
);
|
||||
} catch (e) {
|
||||
state = SessionState(
|
||||
isLoading: false,
|
||||
error: e.toString(),
|
||||
);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear session
|
||||
void clearSession() {
|
||||
state = const SessionState();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user