Fix local dev config and ALOTTTT OFF FLUTTER, im tired boss..

This commit is contained in:
Wowieee4
2026-05-26 21:09:13 +07:00
parent b8ad8df993
commit a629357e8c
72 changed files with 2566 additions and 530 deletions
@@ -0,0 +1,90 @@
import 'package:dartz/dartz.dart';
import '../../../../core/errors/failures.dart';
import '../../../../core/network/api_client.dart';
import '../../../../core/storage/local_database.dart';
import '../../domain/entities/guardian_notification.dart';
import '../../domain/repositories/notification_repository.dart';
class NotificationRepositoryImpl implements NotificationRepository {
final ApiClient _apiClient;
final LocalDatabase _database;
const NotificationRepositoryImpl(this._apiClient, this._database);
@override
Future<Either<Failure, List<GuardianNotificationEntity>>> getNotifications() async {
try {
final response = await _apiClient.dio.get('/user/notifications');
final body = response.data;
final data = body is Map ? body['data'] : body;
final rawList = data is Map ? data['content'] : data;
final list = rawList is List
? rawList
.whereType<Map>()
.map((item) => _fromJson(Map<String, dynamic>.from(item)))
.toList()
: <GuardianNotificationEntity>[];
await _database.notifications.replaceAll(
list
.map((item) => CachedNotification(
id: item.id,
notificationType: item.notificationType,
content: item.content,
voiceNoteUrl: item.voiceNoteUrl,
isRead: item.isRead,
createdAt: item.createdAt ?? DateTime.now(),
))
.toList(),
);
return Right(list);
} catch (_) {
final cached = await _database.notifications.getAll();
return Right(
cached
.map((item) => GuardianNotificationEntity(
id: item.id,
notificationType: item.notificationType,
content: item.content,
voiceNoteUrl: item.voiceNoteUrl,
isRead: item.isRead,
createdAt: item.createdAt,
))
.toList(),
);
}
}
@override
Future<Either<Failure, void>> markAllRead() async {
try {
await _apiClient.dio.put('/user/notifications/mark-all-read');
return const Right(null);
} catch (_) {
return const Left(NetworkFailure('Gagal menandai semua notifikasi.'));
}
}
@override
Future<Either<Failure, void>> markOneRead(int id) async {
try {
await _apiClient.dio.put('/user/notifications/$id/read');
return const Right(null);
} catch (_) {
return const Left(NetworkFailure('Gagal menandai notifikasi.'));
}
}
}
GuardianNotificationEntity _fromJson(Map<String, dynamic> json) {
return GuardianNotificationEntity(
id: (json['id'] as num?)?.toInt(),
notificationType:
json['notifType']?.toString() ?? json['notificationType']?.toString() ?? 'TEXT',
content: json['content']?.toString(),
voiceNoteUrl: json['voiceNoteUrl']?.toString(),
voiceNoteDuration: (json['voiceNoteDuration'] as num?)?.toInt(),
isRead: json['isRead'] == true,
createdAt: DateTime.tryParse(json['createdAt']?.toString() ?? ''),
);
}