From 166d8f1c166888391841538b7d59f3afaebe3116 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Thu, 5 Mar 2026 14:38:45 +0800 Subject: [PATCH] upd: notifikasi Deskripsi: - update notifikasi android No Issues --- app/(application)/setting/index.tsx | 4 +-- lib/useNotification.ts | 41 ++++++++++++++++++----------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/(application)/setting/index.tsx b/app/(application)/setting/index.tsx index 0102231..ffb3b71 100644 --- a/app/(application)/setting/index.tsx +++ b/app/(application)/setting/index.tsx @@ -33,6 +33,7 @@ export default function ListSetting() { const registerToken = async () => { try { + await AsyncStorage.setItem('@notification_permission', "true"); const token = await getToken(); if (token) { await apiRegisteredToken({ user: entities.id, token, category: "register" }); @@ -44,6 +45,7 @@ export default function ListSetting() { const unregisterToken = async () => { try { + await AsyncStorage.setItem('@notification_permission', "false"); const token = await getToken(); if (token) { await apiUnregisteredToken({ user: entities.id, token, category: "unregister" }); @@ -113,10 +115,8 @@ export default function ListSetting() { // OS Permission is granted, perform in-app toggle const targetState = !isNotificationEnabled; if (targetState) { - await AsyncStorage.setItem('@notification_permission', "true"); await registerToken(); } else { - await AsyncStorage.setItem('@notification_permission', "false"); await unregisterToken(); } // UI will be updated by checkNotif (triggered by state change or manually here) diff --git a/lib/useNotification.ts b/lib/useNotification.ts index a0cff32..93d3315 100644 --- a/lib/useNotification.ts +++ b/lib/useNotification.ts @@ -66,32 +66,41 @@ export const openSettings = () => { export const requestPermission = async () => { try { - const { status: currentStatus } = await Notifications.getPermissionsAsync(); + const existing = await AsyncStorage.getItem('@notification_permission'); + const { status: currentStatus, canAskAgain } = await Notifications.getPermissionsAsync(); - // Jika belum pernah ditentukan (undetermined), baru panggil request - if (currentStatus === 'undetermined') { - const { status: newStatus } = await Notifications.requestPermissionsAsync(); - await AsyncStorage.setItem('@notification_permission', newStatus === 'granted' ? 'true' : 'false'); - return newStatus === 'granted'; + // Jika baru pertama kali (fresh install / storage belum ada) + if (existing === null) { + // Cek apakah OS memungkinkan untuk memunculkan popup + if (currentStatus === 'undetermined' || (currentStatus === 'denied' && canAskAgain)) { + const { status: newStatus } = await Notifications.requestPermissionsAsync(); + await AsyncStorage.setItem('@notification_permission', newStatus === 'granted' ? 'true' : 'false'); + return newStatus === 'granted'; + } + + // Jika OS sudah granted (sudah diijinkan entah lewat mana), simpan true + if (currentStatus === 'granted') { + await AsyncStorage.setItem('@notification_permission', 'true'); + return true; + } + + // Jika OS denied dan tidak bisa minta lagi (disables) + if (currentStatus === 'denied' && !canAskAgain) { + await AsyncStorage.setItem('@notification_permission', 'false'); + return false; + } } - // Jika sudah pernah ditentukan (granted/denied), update storage sesuai OS - // Tapi jika granted, kita cek storage dlu sapa tau user pernah matiin manual di app const osPermission = await checkPermission(); - const existing = await AsyncStorage.getItem('@notification_permission'); - + // Jika sudah pernah di-request sebelumnya (storage sudah ada) + // Selalu sinkronkan jika OS menyatakan Denied if (osPermission === false) { await AsyncStorage.setItem('@notification_permission', 'false'); return false; } + // Jika OS Granted, ikuti nilai tersimpan di storage (menghargai in-app toggle user) if (osPermission === true) { - // Jika OS ijinkan, tapi di storage belum ada, set true - if (existing === null) { - await AsyncStorage.setItem('@notification_permission', 'true'); - return true; - } - // Jika OS ijinkan dan di storage ada, ikuti storage (toggle manual user) return existing === 'true'; }