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) {