diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts index 0d8cc4cc0..c8e28e580 100644 --- a/electron/handlers/update.ts +++ b/electron/handlers/update.ts @@ -3,6 +3,8 @@ import { WindowManager } from './../managers/window' import { autoUpdater } from 'electron-updater' import { AppEvent } from '@janhq/core' +export let waitingToInstallVersion: string | undefined = undefined + export function handleAppUpdates() { /* Should not check for update during development */ if (!app.isPackaged) { @@ -29,6 +31,7 @@ export function handleAppUpdates() { buttons: ['Restart', 'Later'], }) if (action.response === 0) { + waitingToInstallVersion = _info?.version autoUpdater.quitAndInstall() } }) @@ -37,7 +40,7 @@ export function handleAppUpdates() { autoUpdater.on('error', (info: any) => { WindowManager.instance.currentWindow?.webContents.send( AppEvent.onAppUpdateDownloadError, - info + { failedToInstallVersion: waitingToInstallVersion, info } ) }) diff --git a/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx b/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx new file mode 100644 index 000000000..f82fc0ee2 --- /dev/null +++ b/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx @@ -0,0 +1,69 @@ +import React from 'react' + +import { + Modal, + ModalPortal, + ModalContent, + ModalHeader, + ModalTitle, + ModalFooter, + ModalClose, + Button, +} from '@janhq/uikit' +import { Share2Icon } from '@radix-ui/react-icons' +import { useAtom } from 'jotai' + +import { updateVersionError } from '@/containers/Providers/Jotai' + +const UpdatedFailedModal = () => { + const [error, setError] = useAtom(updateVersionError) + + return ( + setError(undefined)}> + + + + Unable to Install Update + +

+ An error occurred while installing Jan{' '} + {error}. We + appreciate your help with{' '} + + manual downloading and installation. + +

+ +
+ setError(undefined)}> + + + { + window.open('https://github.com/janhq/jan#download', '_blank') + setError(undefined) + }} + > + + +
+
+
+
+ ) +} + +export default UpdatedFailedModal diff --git a/web/containers/Layout/BottomBar/index.tsx b/web/containers/Layout/BottomBar/index.tsx index 66c089744..2373ac3d4 100644 --- a/web/containers/Layout/BottomBar/index.tsx +++ b/web/containers/Layout/BottomBar/index.tsx @@ -17,6 +17,7 @@ import { appDownloadProgress } from '@/containers/Providers/Jotai' import ImportingModelState from './ImportingModelState' import SystemMonitor from './SystemMonitor' +import UpdatedFailedModal from './UpdateFailedModal' const menuLinks = [ { @@ -44,6 +45,7 @@ const BottomBar = () => { +
diff --git a/web/containers/Providers/AppUpdateListener.tsx b/web/containers/Providers/AppUpdateListener.tsx index dceb4df13..542886ee5 100644 --- a/web/containers/Providers/AppUpdateListener.tsx +++ b/web/containers/Providers/AppUpdateListener.tsx @@ -3,10 +3,11 @@ import { Fragment, PropsWithChildren, useEffect } from 'react' import { useSetAtom } from 'jotai' -import { appDownloadProgress } from './Jotai' +import { appDownloadProgress, updateVersionError } from './Jotai' const AppUpdateListener = ({ children }: PropsWithChildren) => { const setProgress = useSetAtom(appDownloadProgress) + const setUpdateVersionError = useSetAtom(updateVersionError) useEffect(() => { if (window && window.electronAPI) { @@ -18,9 +19,13 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => { ) window.electronAPI.onAppUpdateDownloadError( - (_event: string, callback: any) => { - console.error('Download error', callback) + (_event: string, error: any) => { + console.error('Download error: ', error) setProgress(-1) + + // Can not install update + // Prompt user to download the update manually + setUpdateVersionError(error.failedToInstallVersion) } ) diff --git a/web/containers/Providers/Jotai.tsx b/web/containers/Providers/Jotai.tsx index 5907ac746..c43786c89 100644 --- a/web/containers/Providers/Jotai.tsx +++ b/web/containers/Providers/Jotai.tsx @@ -12,6 +12,7 @@ export const editPromptAtom = atom('') export const currentPromptAtom = atom('') export const fileUploadAtom = atom([]) export const appDownloadProgress = atom(-1) +export const updateVersionError = atom(undefined) export const searchAtom = atom('') export default function JotaiWrapper({ children }: Props) {