From b5cd33069683c37a16ad21ef4b1a641715974bc9 Mon Sep 17 00:00:00 2001 From: Bro Date: Sun, 16 Aug 2026 16:35:27 +0700 Subject: [PATCH] Kantongku: amankan notifikasi untuk Expo Go (aktif penuh di APK) --- src/screens/SettingsScreen.tsx | 23 ++++++++++++++--- src/utils/notifications.ts | 46 +++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/screens/SettingsScreen.tsx b/src/screens/SettingsScreen.tsx index 40b2d60..45efce7 100644 --- a/src/screens/SettingsScreen.tsx +++ b/src/screens/SettingsScreen.tsx @@ -122,12 +122,19 @@ export function SettingsScreen() { const ok = await ensureNotificationPermission(); if (!ok) { Alert.alert( - 'Izin notifikasi ditolak', - 'Aktifkan izin notifikasi di pengaturan HP untuk memakai pengingat.' + 'Notifikasi belum tersedia di Expo Go', + 'Fitur pengingat akan aktif saat app di-build sebagai APK. (Expo Go tidak mendukung notifikasi sejak SDK 53)' + ); + return; + } + const scheduled = await scheduleDailyReminder(reminderHour, 0); + if (!scheduled) { + Alert.alert( + 'Gagal menjadwalkan', + 'Notifikasi belum tersedia di Expo Go — akan aktif di versi APK.' ); return; } - await scheduleDailyReminder(reminderHour, 0); await setSetting('reminder_enabled', '1'); await setSetting('reminder_hour', String(reminderHour)); setReminderEnabled(true); @@ -142,7 +149,15 @@ export function SettingsScreen() { setReminderHour(hour); await setSetting('reminder_hour', String(hour)); if (reminderEnabled) { - await scheduleDailyReminder(hour, 0); + const scheduled = await scheduleDailyReminder(hour, 0); + if (!scheduled) { + setReminderEnabled(false); + await setSetting('reminder_enabled', '0'); + Alert.alert( + 'Gagal menjadwalkan', + 'Notifikasi belum tersedia di Expo Go — akan aktif di versi APK.' + ); + } } }; diff --git a/src/utils/notifications.ts b/src/utils/notifications.ts index 3cdc9c0..603db84 100644 --- a/src/utils/notifications.ts +++ b/src/utils/notifications.ts @@ -1,5 +1,11 @@ import * as Notifications from 'expo-notifications'; +/** + * Catatan: expo-notifications TIDAK tersedia di Expo Go (sejak SDK 53). + * Semua fungsi di sini aman (return false) supaya tidak crash — + * fitur jalan penuh saat app di-build sebagai APK (development build). + */ + export async function ensureNotificationPermission(): Promise { try { const { status } = await Notifications.getPermissionsAsync(); @@ -14,21 +20,31 @@ export async function ensureNotificationPermission(): Promise { export async function scheduleDailyReminder( hour: number, minute: number -): Promise { - await Notifications.cancelAllScheduledNotificationsAsync(); - await Notifications.scheduleNotificationAsync({ - content: { - title: 'Kantongku 👛', - body: 'Belum catat hari ini? 5 detik aja, kak — biar saldo & tabunganmu tetap kejaga!', - }, - trigger: { - type: Notifications.SchedulableTriggerInputTypes.DAILY, - hour, - minute, - }, - }); +): Promise { + try { + await Notifications.cancelAllScheduledNotificationsAsync(); + await Notifications.scheduleNotificationAsync({ + content: { + title: 'Kantongku 👛', + body: 'Belum catat hari ini? 5 detik aja, kak — biar saldo & tabunganmu tetap kejaga!', + }, + trigger: { + type: Notifications.SchedulableTriggerInputTypes.DAILY, + hour, + minute, + }, + }); + return true; + } catch { + return false; + } } -export async function cancelReminder(): Promise { - await Notifications.cancelAllScheduledNotificationsAsync(); +export async function cancelReminder(): Promise { + try { + await Notifications.cancelAllScheduledNotificationsAsync(); + return true; + } catch { + return false; + } }