import { Row, Spin, Typography, Button, Alert } from 'antd'; import React, { FC, useState } from 'react'; import UploadOutlined from '@ant-design/icons/lib/icons/UploadOutlined'; import PlusSquareOutlined from '@ant-design/icons/lib/icons/PlusSquareOutlined'; import { useRecoilValue } from 'recoil'; import { ErrorBoundary } from 'react-error-boundary'; import { useTranslation } from 'next-export-i18n'; import { accessTokenAtom, clientConfigStateAtom } from '../../stores/ClientConfigStore'; import { registerWebPushNotifications, saveNotificationRegistration, } from '../../../services/notifications-service'; import styles from './BrowserNotifyModal.module.scss'; import { ComponentError } from '../../ui/ComponentError/ComponentError'; import { Translation } from '../../ui/Translation/Translation'; import { Localization } from '../../../types/localization'; import { isMobileSafariHomeScreenApp, isMobileSafariIos } from '../../../utils/helpers'; import { arePushNotificationSupported } from '../../../utils/browserPushNotifications'; const { Title } = Typography; const NotificationsNotSupported = () => (
); const NotificationsNotSupportedLocal = () => (
); const MobileSafariInstructions = () => (
<Translation translationKey={Localization.Frontend.BrowserNotifyModal.iosTitle} defaultText="Get notified on iOS" />
  1. Tap the{' '} {' '} button in Safari.
  2. Scroll down and tap{' '} {' '} .
  3. Tap{' '} .
  4. Tap{' '} {' '} when prompted.
); export type PermissionPopupPreviewProps = { start: () => void; }; const PermissionPopupPreview: FC = ({ start }) => (
); const NotificationsEnabled = () => (
<Translation translationKey={Localization.Frontend.BrowserNotifyModal.enabledTitle} defaultText="Notifications are enabled" />
); const NotificationsDenied = () => (
<Translation translationKey={Localization.Frontend.BrowserNotifyModal.deniedTitle} defaultText="Notifications are blocked on your device" />
); export const BrowserNotifyModal = () => { const { t } = useTranslation(); const [error, setError] = useState(null); const accessToken = useRecoilValue(accessTokenAtom); const config = useRecoilValue(clientConfigStateAtom); const [browserPushPermissionsPending, setBrowserPushPermissionsPending] = useState(false); const notificationsPermitted = arePushNotificationSupported() && Notification.permission === 'granted'; const notificationsDenied = arePushNotificationSupported() && Notification.permission === 'denied'; const { notifications } = config; const { browser } = notifications; const { publicKey } = browser; const browserPushSupported = browser.enabled && (arePushNotificationSupported() || isMobileSafariHomeScreenApp()); // If notification permissions are granted, show user info how to disable them if (notificationsPermitted) { return ; } if (notificationsDenied) { return ; } if (isMobileSafariIos() && !isMobileSafariHomeScreenApp()) { return ; } const startBrowserPushRegistration = async () => { // If notification permissions are already denied or granted, don't do anything. if (arePushNotificationSupported() && Notification.permission !== 'default') { return; } setBrowserPushPermissionsPending(true); try { const subscription = await registerWebPushNotifications(publicKey); saveNotificationRegistration('BROWSER_PUSH_NOTIFICATION', subscription, accessToken); setError(null); } catch (e) { setError( t(Localization.Frontend.BrowserNotifyModal.errorMessage, { message: e.message, }), ); } setBrowserPushPermissionsPending(false); }; if (window.location.hostname === 'localhost') { return ; } if (!browserPushSupported) { return ; } return ( ( )} >   about Owncast browser notifications. {error && ( } description={error} type="error" closable className={styles.errorAlert} onClose={() => setError(null)} /> )} startBrowserPushRegistration()} /> ); };