import React, { useCallback, useEffect, useState } from 'react'; import { View, Linking, Text, Switch, Platform, TouchableOpacity, AppState } from 'react-native'; import * as Notifications from 'expo-notifications'; import { Header, Loading, MenuButton, PageWrapper, WarningModal } from 'src/components'; import { usePushNotification } from 'src/contexts/PushNotificationContext'; import { usePostSaveNotificationTokenMutation } from '@api/user'; import { styles } from 'src/components/MenuButton/style'; import { StoreType, storage } from 'src/storage'; import { Colors } from 'src/theme'; import { NAVIGATION_PAGES } from 'src/types'; import ListIcon from 'assets/icons/notifications/list-check.svg'; import PeopleIcon from 'assets/icons/notifications/people-group-solid.svg'; import ChatIcon from 'assets/icons/notifications/messages.svg'; import GearIcon from 'assets/icons/notifications/gear-solid.svg'; import BellIcon from 'assets/icons/notifications/bell-solid.svg'; import { useGetSettingsQuery } from '@api/notifications'; import { useFocusEffect } from '@react-navigation/native'; const NotificationsScreen = ({ navigation }: { navigation: any }) => { const token = storage.get('token', StoreType.STRING) as string; const { data: notificationsSettings, refetch } = useGetSettingsQuery(token, !!token); const { mutateAsync: saveNotificationToken } = usePostSaveNotificationTokenMutation(); const { isSubscribed, toggleSubscription, unsubscribeFromNotifications } = usePushNotification(); const [modalInfo, setModalInfo] = useState({ visible: false, type: 'confirm', message: '', action: () => {} }); const [shouldOpenWarningModal, setShouldOpenWarningModal] = useState(false); const [initialPermissionStatus, setInitialPermissionStatus] = useState< 'granted' | 'denied' | 'undetermined' | null >(null); const closeModal = () => { setModalInfo({ ...modalInfo, visible: false }); }; useEffect(() => { if (notificationsSettings) { const { settings } = notificationsSettings; const isServerSubscribed = Platform.OS === 'ios' ? settings.some((setting) => setting.name === 'app-ios' && setting.active === 1) : settings.some((setting) => setting.name === 'app-android' && setting.active === 1); // if (isServerSubscribed !== isSubscribed) { // toggleSubscription(); // } } }, [notificationsSettings]); useEffect(() => { const subscription = AppState.addEventListener('change', async (nextAppState) => { if (nextAppState === 'active' && initialPermissionStatus !== null) { const currentStatus = await checkNotificationPermissions(); if (initialPermissionStatus !== 'granted' && currentStatus === 'granted') { await handleSubscribe(); setInitialPermissionStatus(currentStatus); } else if ( currentStatus !== 'granted' && (isSubscribed || initialPermissionStatus === 'granted') ) { unsubscribeFromNotifications(); } } }); return () => { subscription.remove(); }; }, [initialPermissionStatus]); useEffect(() => { const getInitialPermissionsStatus = async () => { const status = await checkNotificationPermissions(); if (status !== 'granted' && isSubscribed) { unsubscribeFromNotifications(); } setInitialPermissionStatus(status); }; getInitialPermissionsStatus(); }, []); useFocusEffect(() => { refetchData(); }); const checkNotificationPermissions = async () => { const { status } = await Notifications.getPermissionsAsync(); return status; }; const refetchData = async () => { await refetch(); }; if (!notificationsSettings) return ; const toggleSwitch = async () => { if (isSubscribed) { toggleSubscription(); } else { const status = await checkNotificationPermissions(); if (status !== 'granted') { setModalInfo({ visible: true, type: 'success', message: 'To use this feature we need your permission to access your notifications. If you press OK your system will ask you to confirm permission to receive notifications from NomadMania.', action: () => setShouldOpenWarningModal(true) }); } else { handleSubscribe(); } } }; const handleSubscribe = async () => { const deviceData = await registerForPushNotificationsAsync(); if (deviceData?.notificationToken) { toggleSubscription(); await saveNotificationToken({ token, platform: deviceData.platform, n_token: deviceData.notificationToken }); refetchData(); } }; async function registerForPushNotificationsAsync() { const existingStatus = await checkNotificationPermissions(); let finalStatus = existingStatus; if (existingStatus !== 'granted') { const { status } = await Notifications.requestPermissionsAsync(); finalStatus = status; } if (finalStatus !== 'granted') { setModalInfo({ visible: true, type: 'success', message: 'NomadMania app needs notification permissions to function properly. Open settings?', action: () => Platform.OS === 'ios' ? Linking.openURL('app-settings:') : Linking.openSettings() }); return null; } const deviceData = await Notifications.getDevicePushTokenAsync(); console.log('deviceData', deviceData); if (Platform.OS === 'android') { Notifications.setNotificationChannelAsync('default', { name: 'default', importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], lightColor: '#FF231F7C' }); } storage.set('deviceToken', deviceData.data); return { notificationToken: deviceData.data ?? '', platform: deviceData.type ?? '' }; } return (
Enable notifications {/* } red={false} buttonFn={() => navigation.navigate(NAVIGATION_PAGES.NOTIFICATIONS_LIST as never)} disabled={!isSubscribed} /> */} } red={false} buttonFn={() => navigation.navigate(NAVIGATION_PAGES.FRIENDS_NOTIFICATIONS, { settings: notificationsSettings.settings, token } as never) } disabled={!isSubscribed} /> {/* } red={false} buttonFn={() => navigation.navigate(NAVIGATION_PAGES.MESSAGES_NOTIFICATIONS as never)} disabled={!isSubscribed} /> */} {/* } red={false} buttonFn={() => navigation.navigate(NAVIGATION_PAGES.SYSTEM_NOTIFICATIONS as never)} disabled={!isSubscribed} /> */} { modalInfo.action(); closeModal(); }} onModalHide={() => { if (shouldOpenWarningModal) { setShouldOpenWarningModal(false); handleSubscribe(); } }} /> ); }; export default NotificationsScreen;