lbry-desktop/web/component/browserNotificationSettings/use-browser-notifications.js

68 lines
2 KiB
JavaScript
Raw Normal View History

// @flow
import { useEffect, useState, useMemo } from 'react';
import { pushSubscribe, pushUnsubscribe, pushIsSubscribed } from '$web/src/push-notifications';
import { isSupported } from 'firebase/messaging';
// @todo: Once we are on Redux 7 we should have proper hooks we can use here for store access.
import { store } from '$ui/store';
import { selectUser } from 'redux/selectors/user';
import { doToast } from 'redux/actions/notifications';
export default () => {
const [pushPermission, setPushPermission] = useState(window.Notification?.permission);
const [subscribed, setSubscribed] = useState(false);
const [pushEnabled, setPushEnabled] = useState(false);
const [pushSupported, setPushSupported] = useState(false);
const [user] = useState(selectUser(store.getState()));
useEffect(() => {
pushIsSubscribed(user.id).then((isSubscribed: boolean) => setSubscribed(isSubscribed));
isSupported().then((supported: boolean) => setPushSupported(supported));
}, [user]);
useMemo(() => setPushEnabled(pushPermission === 'granted' && subscribed), [pushPermission, subscribed]);
const subscribe = async () => {
if (await pushSubscribe(user.id)) {
setSubscribed(true);
setPushPermission(window.Notification?.permission);
} else {
showError();
}
};
const unsubscribe = async () => {
if (await pushUnsubscribe(user.id)) {
setSubscribed(false);
}
};
const pushToggle = async () => {
return !pushEnabled ? subscribe() : unsubscribe();
};
const pushRequest = async () => {
return window.Notification?.permission !== 'granted' ? subscribe() : null;
};
const showError = () => {
store.dispatch(
doToast({
isError: true,
message: __(
'There was an error enabling browser notifications. Please make sure your browser settings allow you to subscribe to notifications.'
),
})
);
};
return {
pushSupported,
pushEnabled,
pushPermission,
pushToggle,
pushRequest,
};
};