import ModalConfirmation from "@/components/ModalConfirmation"; import Text from "@/components/Text"; import ButtonSetting from "@/components/buttonSetting"; import DrawerBottom from "@/components/drawerBottom"; import Styles from "@/constants/Styles"; import { apiRegisteredToken, apiUnregisteredToken } from "@/lib/api"; import { checkPermission, getToken, openSettings, requestPermission } from "@/lib/useNotification"; import { useAuthSession } from "@/providers/AuthProvider"; import { useTheme } from "@/providers/ThemeProvider"; import { Feather, Ionicons } from "@expo/vector-icons"; import { router } from "expo-router"; import { useCallback, useEffect, useState } from "react"; import { AppState, AppStateStatus, Pressable, View } from "react-native"; import { useSelector } from "react-redux"; export default function ListSetting() { const { theme, setTheme, colors } = useTheme() const { signOut } = useAuthSession() const [isNotificationEnabled, setIsNotificationEnabled] = useState(null); const entities = useSelector((state: any) => state.entities) const [modalVisible, setModalVisible] = useState(false); const [modalConfig, setModalConfig] = useState({ title: '', message: '', confirmText: 'Buka Pengaturan', onConfirm: () => { } }); const [showLogoutModal, setShowLogoutModal] = useState(false) const [showThemeModal, setShowThemeModal] = useState(false) const registerToken = async () => { try { const token = await getToken(); if (token) { await apiRegisteredToken({ user: entities.id, token }); } } catch (error) { console.warn('Error registering token:', error); } }; const unregisterToken = async () => { try { const token = await getToken(); if (token) { await apiUnregisteredToken({ user: entities.id, token }); } } catch (error) { console.warn('Error unregistering token:', error); } }; const checkNotif = useCallback(async () => { const status = await checkPermission(); setIsNotificationEnabled((prev) => { if (prev === false && status === true) { registerToken(); } else if (prev === true && status === false) { unregisterToken(); } return !!status; }); }, [entities.id]); useEffect(() => { checkNotif(); const subscription = AppState.addEventListener('change', (nextAppState: AppStateStatus) => { if (nextAppState === 'active') { checkNotif(); } }); return () => { subscription.remove(); }; }, [checkNotif]); const handleToggleNotif = async () => { if (isNotificationEnabled) { setModalConfig({ title: "Matikan Notifikasi?", message: "Anda akan diarahkan ke pengaturan sistem untuk mematikan notifikasi.", confirmText: "Buka Pengaturan", onConfirm: () => { setModalVisible(false); openSettings(); } }); setModalVisible(true); } else { const granted = await requestPermission(); if (granted) { setIsNotificationEnabled(true); registerToken(); } else { setModalConfig({ title: "Aktifkan Notifikasi?", message: "Izin notifikasi tidak diberikan. Buka pengaturan sistem untuk mengaktifkannya?", confirmText: "Buka Pengaturan", onConfirm: () => { setModalVisible(false); openSettings(); } }); setModalVisible(true); } } }; const ThemeOption = ({ label, value, icon }: { label: string, value: 'light' | 'dark' | 'system', icon: string }) => ( { setTheme(value); }} > {label} {theme === value && } ); return ( { entities.idUserRole != "developer" && } onPress={() => { router.push('/edit-profile') }} /> } } onPress={() => setShowThemeModal(true)} value={theme === 'light' ? 'Terang' : theme === 'dark' ? 'Gelap' : 'Sistem'} /> } onPress={handleToggleNotif} value={isNotificationEnabled === null ? 'Memuat...' : isNotificationEnabled ? 'Aktif' : 'Nonaktif'} /> } onPress={() => setShowLogoutModal(true)} borderBottom={false} /> setModalVisible(false)} /> { setShowLogoutModal(false) signOut() }} onCancel={() => setShowLogoutModal(false)} confirmText="Keluar" cancelText="Batal" /> ) }