Files
2026-03-01 07:55:59 +09:00

79 lines
2.1 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../../../../core/logging/app_logger.dart';
import '../../../../core/network/dio_client.dart';
import '../../../../core/storage/secure_storage.dart';
import '../../data/datasources/auth_remote_source.dart';
import '../../data/repositories/auth_repository_impl.dart';
import '../../domain/entities/user.dart';
import '../../domain/repositories/auth_repository.dart';
part 'auth_providers.g.dart';
@Riverpod(keepAlive: true)
AuthRemoteSource authRemoteSource(Ref ref) {
final dio = ref.read(dioProvider);
return AuthRemoteSource(dio);
}
@Riverpod(keepAlive: true)
AuthRepository authRepository(Ref ref) {
return AuthRepositoryImpl(
remoteSource: ref.read(authRemoteSourceProvider),
secureStorage: ref.read(secureStorageProvider),
talker: ref.read(appLoggerProvider),
);
}
@riverpod
class LoginNotifier extends _$LoginNotifier {
@override
FutureOr<void> build() {}
Future<User?> login({
required String email,
required String password,
}) async {
state = const AsyncLoading();
final result = await AsyncValue.guard(() async {
final repository = ref.read(authRepositoryProvider);
return repository.login(email: email, password: password);
});
state = result.hasError
? AsyncError(result.error!, result.stackTrace!)
: const AsyncData(null);
return result.valueOrNull;
}
}
@riverpod
class RegisterNotifier extends _$RegisterNotifier {
@override
FutureOr<void> build() {}
Future<User?> register({
required String email,
required String password,
required String name,
}) async {
state = const AsyncLoading();
final result = await AsyncValue.guard(() async {
final repository = ref.read(authRepositoryProvider);
return repository.register(
email: email,
password: password,
name: name,
);
});
state = result.hasError
? AsyncError(result.error!, result.stackTrace!)
: const AsyncData(null);
return result.valueOrNull;
}
}