|
@@ -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();
|