Files
saqel/apps/teacher_app/lib/logic/cubits/teacher_auth_cubit.dart
T

148 lines
4.3 KiB
Dart

import 'package:flutter_bloc/flutter_bloc.dart';
import '../../core/services/storage_service.dart';
import '../../core/utils/app_logger.dart';
import '../../data/models/teacher_models.dart';
import '../../data/repositories/teacher_repository.dart';
abstract class TeacherAuthState {}
class TeacherAuthInitial extends TeacherAuthState {}
class TeacherAuthLoading extends TeacherAuthState {}
class TeacherAuthOtpSent extends TeacherAuthState {
final String phoneNumber;
TeacherAuthOtpSent({required this.phoneNumber});
}
class TeacherAuthenticated extends TeacherAuthState {
final TeacherProfileModel profile;
TeacherAuthenticated({required this.profile});
}
class TeacherUnauthenticated extends TeacherAuthState {}
class TeacherAuthError extends TeacherAuthState {
final String message;
TeacherAuthError(this.message);
}
class TeacherAuthCubit extends Cubit<TeacherAuthState> {
final TeacherRepository repository;
final StorageService _storage;
TeacherAuthCubit({
required this.repository,
StorageService? storage,
}) : _storage = storage ?? StorageService(),
super(TeacherAuthInitial());
Future<void> checkSession() async {
AppLogger.log('Checking Teacher Session...', tag: 'TEACHER_AUTH');
emit(TeacherAuthLoading());
try {
final token = await _storage.getToken();
if (token == null || token.isEmpty) {
AppLogger.log('No teacher token -> Unauthenticated',
tag: 'TEACHER_AUTH');
emit(TeacherUnauthenticated());
return;
}
final profile = await repository.getProfileStatus();
AppLogger.log(
'Teacher authenticated: ${profile.name} (${profile.specialization})',
tag: 'TEACHER_AUTH');
emit(TeacherAuthenticated(profile: profile));
} catch (e) {
AppLogger.error('Session check failed', error: e, tag: 'TEACHER_AUTH');
emit(TeacherUnauthenticated());
}
}
void resetToPhone() {
emit(TeacherUnauthenticated());
}
Future<void> sendOtp(String phoneNumber) async {
emit(TeacherAuthLoading());
try {
final res = await repository.requestOtp(phoneNumber);
if (res['status'] == 'success') {
emit(TeacherAuthOtpSent(phoneNumber: phoneNumber));
} else {
emit(TeacherAuthError(
res['message']?.toString() ?? 'فشل إرسال رمز التحقق'));
}
} catch (e) {
emit(TeacherAuthError(e.toString()));
}
}
Future<void> verifyOtp(
String phoneNumber,
String otp, {
String? fullName,
String? specialization,
String? schoolName,
List<String>? gradesTaught,
}) async {
emit(TeacherAuthLoading());
try {
final res =
await repository.verifyOtp(phoneNumber, otp, fullName: fullName);
if (res['status'] == 'success') {
if ((fullName ?? '').trim().isNotEmpty &&
(specialization ?? '').trim().isNotEmpty &&
(schoolName ?? '').trim().isNotEmpty &&
(gradesTaught?.isNotEmpty ?? false)) {
try {
await repository.setupProfile(
fullName: fullName!.trim(),
specialization: specialization!.trim(),
schoolName: schoolName!.trim(),
gradesTaught: gradesTaught!,
bio: '',
);
} catch (_) {}
}
final profile = await repository.getProfileStatus();
emit(TeacherAuthenticated(profile: profile));
} else {
emit(TeacherAuthError(
res['message']?.toString() ?? 'رمز التحقق غير صحيح'));
}
} catch (e) {
emit(TeacherAuthError(e.toString()));
}
}
Future<void> updateProfile({
required String fullName,
required String specialization,
required String schoolName,
required List<String> gradesTaught,
required String bio,
}) async {
emit(TeacherAuthLoading());
try {
final updated = await repository.setupProfile(
fullName: fullName,
specialization: specialization,
schoolName: schoolName,
gradesTaught: gradesTaught,
bio: bio,
);
emit(TeacherAuthenticated(profile: updated));
} catch (e) {
emit(TeacherAuthError(e.toString()));
}
}
Future<void> logout() async {
emit(TeacherAuthLoading());
await _storage.clearSession();
emit(TeacherUnauthenticated());
}
}