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