Changeset View
Changeset View
Standalone View
Standalone View
web/push-notif/push-notifs-handler.js
// @flow | // @flow | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { | |||||
setDeviceToken, | |||||
setDeviceTokenActionTypes, | |||||
} from 'lib/actions/device-actions.js'; | |||||
import { | |||||
useDispatchActionPromise, | |||||
useServerCall, | |||||
} from 'lib/utils/action-utils.js'; | |||||
import electron from '../electron.js'; | import electron from '../electron.js'; | ||||
import { useSelector } from '../redux/redux-utils.js'; | |||||
function useCreatePushSubscription(): () => Promise<void> { | |||||
const publicKey = useSelector(state => state.pushApiPublicKey); | |||||
const dispatchActionPromise = useDispatchActionPromise(); | |||||
const callSetDeviceToken = useServerCall(setDeviceToken); | |||||
return React.useCallback(async () => { | |||||
if (!publicKey) { | |||||
return; | |||||
} | |||||
const workerRegistration = await navigator.serviceWorker?.ready; | |||||
if (!workerRegistration) { | |||||
return; | |||||
} | |||||
const subscription = await workerRegistration.pushManager.subscribe({ | |||||
userVisibleOnly: true, | |||||
applicationServerKey: publicKey, | |||||
}); | |||||
dispatchActionPromise( | |||||
setDeviceTokenActionTypes, | |||||
callSetDeviceToken(JSON.stringify(subscription)), | |||||
); | |||||
}, [callSetDeviceToken, dispatchActionPromise, publicKey]); | |||||
} | |||||
function PushNotificationsHandler(): React.Node { | function PushNotificationsHandler(): React.Node { | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
(async () => { | (async () => { | ||||
if (!navigator.serviceWorker || electron) { | if (!navigator.serviceWorker || electron) { | ||||
return; | return; | ||||
} | } | ||||
await navigator.serviceWorker.register('/worker/notif', { scope: '/' }); | await navigator.serviceWorker.register('/worker/notif', { scope: '/' }); | ||||
})(); | })(); | ||||
}, []); | }, []); | ||||
return null; | return null; | ||||
} | } | ||||
export { PushNotificationsHandler }; | export { PushNotificationsHandler, useCreatePushSubscription }; |