import Button from '@components/Button' import Icon from '@components/Icon' import { MenuContainer, MenuRow } from '@components/Menu' import CustomText from '@components/Text' import browserPackage from '@helpers/browserPackage' import { useAppDispatch } from '@root/store' import { isDevelopment } from '@utils/checkEnvironment' import { useAppsQuery } from '@utils/queryHooks/apps' import { useProfileQuery } from '@utils/queryHooks/profile' import { getExpoToken, retrieveExpoToken } from '@utils/slices/appSlice' import { checkPushAdminPermission, PUSH_ADMIN, PUSH_DEFAULT, setChannels } from '@utils/slices/instances/push/utils' import { updateInstancePush } from '@utils/slices/instances/updatePush' import { updateInstancePushAlert } from '@utils/slices/instances/updatePushAlert' import { updateInstancePushDecode } from '@utils/slices/instances/updatePushDecode' import { getInstance, getInstancePush } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import layoutAnimation from '@utils/styles/layoutAnimation' import { useTheme } from '@utils/styles/ThemeManager' import * as Notifications from 'expo-notifications' import * as WebBrowser from 'expo-web-browser' import React, { useState, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { AppState, Linking, Platform, ScrollView, View } from 'react-native' import { useSelector } from 'react-redux' const TabMePush: React.FC = () => { const { colors } = useTheme() const { t } = useTranslation('screenTabs') const instance = useSelector(getInstance) const expoToken = useSelector(getExpoToken) const [serverKeyAvailable, setServerKeyAvailable] = useState() useAppsQuery({ options: { onSuccess: data => setServerKeyAvailable(!!data.vapid_key) } }) const dispatch = useAppDispatch() const instancePush = useSelector(getInstancePush) const [pushAvailable, setPushAvailable] = useState() const [pushEnabled, setPushEnabled] = useState() const [pushCanAskAgain, setPushCanAskAgain] = useState() useEffect(() => { const checkPush = async () => { switch (Platform.OS) { case 'ios': const settings = await Notifications.getPermissionsAsync() layoutAnimation() setPushEnabled(settings.granted) setPushCanAskAgain(settings.canAskAgain) break case 'android': await setChannels(instance) layoutAnimation() dispatch(retrieveExpoToken()) break } } if (serverKeyAvailable) { checkPush() if (isDevelopment) { setPushAvailable(true) } else { setPushAvailable(!!expoToken) } } const subscription = AppState.addEventListener('change', checkPush) return () => { subscription.remove() } }, [serverKeyAvailable]) const alerts = () => instancePush?.alerts ? PUSH_DEFAULT.map(alert => ( dispatch( updateInstancePushAlert({ changed: alert, alerts: { ...instancePush?.alerts, [alert]: instancePush?.alerts[alert] } }) ) } /> )) : null const profileQuery = useProfileQuery() const adminAlerts = () => profileQuery.data?.role?.permissions ? PUSH_ADMIN.map(({ type, permission }) => checkPushAdminPermission(permission, profileQuery.data.role?.permissions) ? ( dispatch( updateInstancePushAlert({ changed: type, alerts: { ...instancePush?.alerts, [type]: instancePush?.alerts[type] } }) ) } /> ) : null ) : null return ( {!!serverKeyAvailable ? ( <> {!!pushAvailable ? ( <> {pushEnabled === false ? (