128 lines
3.9 KiB
Dart
128 lines
3.9 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import '../../data/models/directorate_models.dart';
|
|
import '../../data/repositories/directorate_repository.dart';
|
|
|
|
abstract class DirectorateState {}
|
|
|
|
class DirectorateInitial extends DirectorateState {}
|
|
|
|
class DirectorateLoading extends DirectorateState {}
|
|
|
|
class DirectorateLoaded extends DirectorateState {
|
|
final DirectorateOverview overview;
|
|
final List<SchoolItem> schools;
|
|
final Map<String, dynamic> rawData;
|
|
|
|
DirectorateLoaded({
|
|
required this.overview,
|
|
required this.schools,
|
|
required this.rawData,
|
|
});
|
|
}
|
|
|
|
class SchoolPrincipalLoaded extends DirectorateState {
|
|
final SchoolDetail school;
|
|
final List<TeacherItem> teachers;
|
|
final List<ComputerLabItem> labs;
|
|
final Map<String, dynamic> rawData;
|
|
|
|
SchoolPrincipalLoaded({
|
|
required this.school,
|
|
required this.teachers,
|
|
required this.labs,
|
|
required this.rawData,
|
|
});
|
|
}
|
|
|
|
class DirectorateError extends DirectorateState {
|
|
final String message;
|
|
DirectorateError(this.message);
|
|
}
|
|
|
|
class DirectorateActionSuccess extends DirectorateState {
|
|
final String message;
|
|
final dynamic result;
|
|
DirectorateActionSuccess(this.message, [this.result]);
|
|
}
|
|
|
|
/// Cubit managing state for Directorate and School Principal operations
|
|
class DirectorateCubit extends Cubit<DirectorateState> {
|
|
final DirectorateRepository _repository;
|
|
|
|
DirectorateCubit({DirectorateRepository? repository})
|
|
: _repository = repository ?? DirectorateRepository(),
|
|
super(DirectorateInitial());
|
|
|
|
/// Load directorate command overview
|
|
Future<void> loadDirectorateOverview() async {
|
|
emit(DirectorateLoading());
|
|
try {
|
|
final res = await _repository.getDirectorateDashboard();
|
|
if (res['status'] == 'success' || res.containsKey('directorate')) {
|
|
final overview = DirectorateOverview.fromJson(res['directorate'] ?? {});
|
|
final schoolsList = (res['schools'] as List? ?? [])
|
|
.map((s) => SchoolItem.fromJson(s))
|
|
.toList();
|
|
emit(DirectorateLoaded(
|
|
overview: overview,
|
|
schools: schoolsList,
|
|
rawData: res,
|
|
));
|
|
} else {
|
|
emit(DirectorateError(res['message'] ?? 'فشل تحميل بيانات المديرية'));
|
|
}
|
|
} catch (e) {
|
|
emit(DirectorateError('خطأ في الاتصال: $e'));
|
|
}
|
|
}
|
|
|
|
/// Load school principal dashboard
|
|
Future<void> loadSchoolDashboard({int schoolId = 1}) async {
|
|
emit(DirectorateLoading());
|
|
try {
|
|
final res = await _repository.getSchoolDashboard(schoolId: schoolId);
|
|
if (res['status'] == 'success' || res.containsKey('school')) {
|
|
final school = SchoolDetail.fromJson(res['school'] ?? {});
|
|
final teachers = (res['teachers'] as List? ?? [])
|
|
.map((t) => TeacherItem.fromJson(t))
|
|
.toList();
|
|
final labs = (res['computer_labs'] as List? ?? [])
|
|
.map((l) => ComputerLabItem.fromJson(l))
|
|
.toList();
|
|
emit(SchoolPrincipalLoaded(
|
|
school: school,
|
|
teachers: teachers,
|
|
labs: labs,
|
|
rawData: res,
|
|
));
|
|
} else {
|
|
emit(DirectorateError(res['message'] ?? 'فشل تحميل بيانات المدرسة'));
|
|
}
|
|
} catch (e) {
|
|
emit(DirectorateError('خطأ في الاتصال: $e'));
|
|
}
|
|
}
|
|
|
|
/// Push exam to lab
|
|
Future<void> pushExam({
|
|
required int schoolId,
|
|
required String examTitle,
|
|
required String labName,
|
|
required int deviceCount,
|
|
}) async {
|
|
try {
|
|
final res = await _repository.pushExamToLab(
|
|
schoolId: schoolId,
|
|
examTitle: examTitle,
|
|
labName: labName,
|
|
deviceCount: deviceCount,
|
|
);
|
|
emit(DirectorateActionSuccess('تم دفع الامتحان للمختبر بنجاح', res));
|
|
// Reload dashboard
|
|
await loadSchoolDashboard(schoolId: schoolId);
|
|
} catch (e) {
|
|
emit(DirectorateError('فشل دفع الامتحان: $e'));
|
|
}
|
|
}
|
|
}
|