import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/domain/models/app_error.dart';
import 'package:comwell_key_app/domain/models/notification_permission.dart';
import 'package:comwell_key_app/domain/repositories/notifications_repository.dart';
import 'package:comwell_key_app/presentation/screens/notifications/bloc/notifications_state.dart';
class NotificationsCubit extends BaseCubit<NotificationsState> {
final NotificationsRepository _notificationsRepository;
NotificationsCubit(this._notificationsRepository) : super(const NotificationsState()) {
init();
}
// List of permission types that should be shown in the UI
final List<NotificationPermissionType> _visiblePermissionTypes = [
NotificationPermissionType.appNotifications,
NotificationPermissionType.ccSms,
NotificationPermissionType.ccDigital,
NotificationPermissionType.ccEmail,
];
void init() async {
try {
safeEmit(state.loading());
final notifications = await _notificationsRepository.fetchNotificationPermissions();
final visible = notifications
.where(
(permission) => _visiblePermissionTypes.any(
(type) => type.code == permission.code,
),
)
.toList();
safeEmit(state.copyWith(allNotifications: visible));
} catch (e, st) {
logError(e, st);
safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
} finally {
safeEmit(state.copyWith(isLoading: false));
}
}
void onNotificationPermissionClicked(String name) {
final notificationPermissions = state.allNotifications
.map(
(permission) => permission.displayName == name
? permission.copyWith(
given: !permission.given,
notificationPermissionDescription: permission.notificationPermissionDescription,
)
: permission,
)
.toList();
safeEmit(state.copyWith(allNotifications: notificationPermissions));
}
void updateAllPermissionsUI(bool value) {
final notificationPermissions = state.allNotifications
.map(
(permission) => permission.copyWith(
given: value,
notificationPermissionDescription: permission.notificationPermissionDescription,
),
)
.toList();
safeEmit(state.copyWith(allNotifications: notificationPermissions));
}
void updatePreferences(List<NotificationPermission> notificationPermissions) async {
await _notificationsRepository.updateNotificationPreferences(notificationPermissions);
safeEmit(state.copyWith(allNotifications: notificationPermissions));
}
void fetchNotificationPermissions() async {
final notificationPermissions = await _notificationsRepository.fetchNotificationPermissions();
safeEmit(state.copyWith(allNotifications: notificationPermissions));
}
}