UNPKG

@kode-frontend/react-native-push-notification

Version:
78 lines (67 loc) 2.26 kB
import { useEvent, useStore } from 'effector-react' import { useCallback, useEffect, useState } from 'react' import { AppState, AppStateStatus, Platform } from 'react-native' import { useUnregisterDevice } from './use-unregister-device' import { pushService } from '../../push-notification-service' import * as pushSettings from '../push-settings' type TParams = { onFailEnabledPush: () => void } export const usePushAvailable = ({ onFailEnabledPush }: TParams) => { const [isLoading, setLoaderState] = useState(false) const enabledPush = useStore(pushSettings.$pushEnabled) const disablePush = useEvent(pushSettings.disablePush) const enablePush = useEvent(pushSettings.enablePush) const [hasPermissions, setHasPermissions] = useState(enabledPush) const [enabledPushNotifications, setEnabledPushNotifications] = useState(enabledPush) const { unregister } = useUnregisterDevice() useEffect(() => { setEnabledPushNotifications(hasPermissions && enabledPush) }, [hasPermissions, enabledPush]) useEffect(() => { const checkPermissions = async () => { const hasPermission = await pushService.hasPermission() setHasPermissions(hasPermission) } checkPermissions() const callback = (state: AppStateStatus) => { if (state === 'active') { checkPermissions() } } const subscription = AppState.addEventListener('change', callback) return () => { subscription.remove() } }, []) const changeEnabledPushesHandler = useCallback( async (state: boolean) => { setLoaderState(true) try { if (!state) { setEnabledPushNotifications(false) disablePush() unregister() pushService.cancelAllNotifications() return } const hasPermission = await pushService.checkPermission() if (hasPermission) { setEnabledPushNotifications(true) } else { onFailEnabledPush() } enablePush() } finally { setLoaderState(false) } }, [onFailEnabledPush, enablePush, unregister, disablePush], ) return { enabled: enabledPushNotifications, isLoading, changeNotificationEnabled: changeEnabledPushesHandler, } }