From 434abaaca65ca922d32ef8845e9be5c6655e96a0 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Thu, 22 May 2025 11:54:06 +0700 Subject: [PATCH] chore: app updater UI (#5054) * chore: initial app updater UI and download management enhance * chore: revert package version * chore: update conditional app updater * chore: remove console * chore: add utils isDev * chore: close popup when user click download * revert yarn lock --- src-tauri/capabilities/default.json | 1 + src-tauri/src/lib.rs | 1 + web-app/package.json | 1 + web-app/src/containers/DownloadManegement.tsx | 63 ++++++++-- web-app/src/containers/LeftPanel.tsx | 10 +- web-app/src/containers/dialogs/AppUpdater.tsx | 119 ++++++++++++++++++ web-app/src/hooks/useAppUpdater.ts | 103 +++++++++++++++ web-app/src/hooks/useReleaseNotes.ts | 49 ++++++++ web-app/src/lib/utils.ts | 4 + web-app/src/providers/DataProvider.tsx | 8 ++ web-app/src/routes/__root.tsx | 3 +- 11 files changed, 344 insertions(+), 18 deletions(-) create mode 100644 web-app/src/containers/dialogs/AppUpdater.tsx create mode 100644 web-app/src/hooks/useAppUpdater.ts create mode 100644 web-app/src/hooks/useReleaseNotes.ts diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 1ff4c7f9a..9fbb9e906 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -16,6 +16,7 @@ "core:window:allow-set-focus", "os:default", "log:default", + "updater:default", "dialog:default", "core:webview:allow-create-webview-window", { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index b89918e88..6c55cbf4f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -19,6 +19,7 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_http::init()) .plugin(tauri_plugin_store::Builder::new().build()) + .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_shell::init()) .invoke_handler(tauri::generate_handler![ // FS commands - Deperecate soon diff --git a/web-app/package.json b/web-app/package.json index d8838b344..2057377c9 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -32,6 +32,7 @@ "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-os": "^2.2.1", + "@tauri-apps/plugin-updater": "^2.7.1", "@types/react-syntax-highlighter": "^15.5.13", "@types/uuid": "^10.0.0", "@uiw/react-textarea-code-editor": "^3.1.1", diff --git a/web-app/src/containers/DownloadManegement.tsx b/web-app/src/containers/DownloadManegement.tsx index 4a347464a..acfbb199e 100644 --- a/web-app/src/containers/DownloadManegement.tsx +++ b/web-app/src/containers/DownloadManegement.tsx @@ -5,18 +5,22 @@ import { } from '@/components/ui/popover' import { Progress } from '@/components/ui/progress' import { useDownloadStore } from '@/hooks/useDownloadStore' +import { useLeftPanel } from '@/hooks/useLeftPanel' import { useModelProvider } from '@/hooks/useModelProvider' +import { useAppUpdater } from '@/hooks/useAppUpdater' import { abortDownload } from '@/services/models' import { getProviders } from '@/services/providers' import { DownloadEvent, DownloadState, events } from '@janhq/core' -import { IconX } from '@tabler/icons-react' +import { IconDownload, IconX } from '@tabler/icons-react' import { useCallback, useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' export function DownloadManagement() { const { setProviders } = useModelProvider() + const { open: isLeftPanelOpen } = useLeftPanel() const [isPopoverOpen, setIsPopoverOpen] = useState(false) const { downloads, updateProgress, removeDownload } = useDownloadStore() + const { updateState } = useAppUpdater() const downloadCount = useMemo( () => Object.keys(downloads).length, [downloads] @@ -114,21 +118,36 @@ export function DownloadManagement() { return ( <> - {downloadCount > 0 && ( + {(downloadCount > 0 || + (!updateState.isDownloading && updateState.downloadProgress > 0)) && ( - -
-
- {downloadCount} + + {isLeftPanelOpen ? ( +
+
+ {downloadCount} +
+

Downloads

+
+ + + {Math.round(overallProgress * 100)}% + +
-

Downloads

-
- - - {Math.round(overallProgress * 100)}% - + ) : ( +
+
+ +
+ {downloadCount} +
+
-
+ )}
Downloading

+ {!updateState.isDownloading && + updateState.downloadProgress > 0 && ( +
+
+

+ App Update +

+
+ +

+ {`${renderGB(updateState.downloadedBytes)} / ${renderGB(updateState.totalBytes)}`}{' '} + GB ({Math.round(updateState.downloadProgress * 100)}%) +

+
+ )} {downloadProcesses.map((download) => (
diff --git a/web-app/src/containers/LeftPanel.tsx b/web-app/src/containers/LeftPanel.tsx index 6473e33b3..d0b248900 100644 --- a/web-app/src/containers/LeftPanel.tsx +++ b/web-app/src/containers/LeftPanel.tsx @@ -39,7 +39,7 @@ import { } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { toast } from 'sonner' -import { DownloadManagement } from './DownloadManegement' +import { DownloadManagement } from '@/containers/DownloadManegement' const mainMenus = [ { @@ -97,7 +97,9 @@ const LeftPanel = () => {