Ver Fonte

permissions fix

Viktoriia há 9 meses atrás
pai
commit
a6430fadc8

+ 4 - 2
src/contexts/PushNotificationContext.tsx

@@ -9,9 +9,11 @@ import { usePostSetSettingsMutation } from '@api/notifications';
 const PushNotificationContext = createContext<{
   isSubscribed: boolean;
   toggleSubscription: () => Promise<void>;
+  unsubscribeFromNotifications: () => Promise<void>;
 }>({
   isSubscribed: false,
-  toggleSubscription: async () => {}
+  toggleSubscription: async () => {},
+  unsubscribeFromNotifications: async () => {}
 });
 
 export const usePushNotification = () => useContext(PushNotificationContext);
@@ -234,7 +236,7 @@ export const PushNotificationProvider = ({ children }: { children: React.ReactNo
   };
 
   return (
-    <PushNotificationContext.Provider value={{ isSubscribed, toggleSubscription }}>
+    <PushNotificationContext.Provider value={{ isSubscribed, toggleSubscription, unsubscribeFromNotifications }}>
       {children}
     </PushNotificationContext.Provider>
   );

+ 47 - 5
src/screens/NotificationsScreen/index.tsx

@@ -1,5 +1,5 @@
-import React, { useEffect, useState } from 'react';
-import { View, Linking, Text, Switch, Platform, TouchableOpacity } from 'react-native';
+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';
@@ -23,7 +23,7 @@ const NotificationsScreen = ({ navigation }: { navigation: any }) => {
   const { data: notificationsSettings, refetch } = useGetSettingsQuery(token, !!token);
 
   const { mutateAsync: saveNotificationToken } = usePostSaveNotificationTokenMutation();
-  const { isSubscribed, toggleSubscription } = usePushNotification();
+  const { isSubscribed, toggleSubscription, unsubscribeFromNotifications } = usePushNotification();
   const [modalInfo, setModalInfo] = useState({
     visible: false,
     type: 'confirm',
@@ -31,6 +31,9 @@ const NotificationsScreen = ({ navigation }: { navigation: any }) => {
     action: () => {}
   });
   const [shouldOpenWarningModal, setShouldOpenWarningModal] = useState(false);
+  const [initialPermissionStatus, setInitialPermissionStatus] = useState<
+    'granted' | 'denied' | 'undetermined' | null
+  >(null);
 
   const closeModal = () => {
     setModalInfo({ ...modalInfo, visible: false });
@@ -49,10 +52,49 @@ const NotificationsScreen = ({ navigation }: { navigation: any }) => {
     }
   }, [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();
   };
@@ -63,7 +105,7 @@ const NotificationsScreen = ({ navigation }: { navigation: any }) => {
     if (isSubscribed) {
       toggleSubscription();
     } else {
-      const { status } = await Notifications.getPermissionsAsync();
+      const status = await checkNotificationPermissions();
       if (status !== 'granted') {
         setModalInfo({
           visible: true,
@@ -93,7 +135,7 @@ const NotificationsScreen = ({ navigation }: { navigation: any }) => {
   };
 
   async function registerForPushNotificationsAsync() {
-    const { status: existingStatus } = await Notifications.getPermissionsAsync();
+    const existingStatus = await checkNotificationPermissions();
     let finalStatus = existingStatus;
     if (existingStatus !== 'granted') {
       const { status } = await Notifications.requestPermissionsAsync();