Fix local dev config and ALOTTTT OFF FLUTTER, im tired boss..
This commit is contained in:
+90
@@ -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() ?? ''),
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user