import * as React from 'react'; import { useCallback, useContext, useEffect } from 'react'; import { UpdateInfo } from 'electron-updater'; import { ipcRenderer, IpcRendererEvent } from 'electron'; import { AutoUpdaterEvents } from '../../services/autoUpdater/AutoUpdaterService'; import { _ } from '@joplin/lib/locale'; import shim from '@joplin/lib/shim'; import { PopupNotificationContext } from '../PopupNotification/PopupNotificationProvider'; import Button, { ButtonLevel } from '../Button/Button'; import { NotificationType } from '../PopupNotification/types'; interface Props { } export enum UpdateNotificationEvents { ApplyUpdate = 'apply-update', UpdateNotAvailable = 'update-not-available', Dismiss = 'dismiss-update-notification', } const changelogLink = 'https://github.com/laurent22/joplin/releases'; const openChangelogLink = () => { shim.openUrl(changelogLink); }; const handleApplyUpdate = () => { ipcRenderer.send('apply-update-now'); }; const UpdateNotification: React.FC = () => { const popupManager = useContext(PopupNotificationContext); const handleUpdateDownloaded = useCallback((_event: IpcRendererEvent, info: UpdateInfo) => { const notification = popupManager.createPopup(() => (
{_('A new update (%s) is available', info.version)}
)); }, [popupManager]); const handleUpdateNotAvailable = useCallback(() => { const notification = popupManager.createPopup(() => (
{_('No updates available')}
), { type: NotificationType.Info }); notification.scheduleDismiss(); }, [popupManager]); useEffect(() => { ipcRenderer.on(AutoUpdaterEvents.UpdateDownloaded, handleUpdateDownloaded); ipcRenderer.on(AutoUpdaterEvents.UpdateNotAvailable, handleUpdateNotAvailable); return () => { ipcRenderer.removeListener(AutoUpdaterEvents.UpdateDownloaded, handleUpdateDownloaded); ipcRenderer.removeListener(AutoUpdaterEvents.UpdateNotAvailable, handleUpdateNotAvailable); }; }, [handleUpdateDownloaded, handleUpdateNotAvailable]); return (
); }; export default UpdateNotification;