diff --git a/lib/menu.ts b/lib/menu.ts index be27f76..05dbd06 100644 --- a/lib/menu.ts +++ b/lib/menu.ts @@ -1,6 +1,6 @@ import * as Sentry from '@sentry/browser' import { Menu, MenuItem, PredefinedMenuItem, Submenu } from '@tauri-apps/api/menu' -import { sep } from '@tauri-apps/api/path' +import { resolveResource, sep } from '@tauri-apps/api/path' import { getCurrentWindow } from '@tauri-apps/api/window' import { ask, message, open } from '@tauri-apps/plugin-dialog' import { exists, mkdir, remove } from '@tauri-apps/plugin-fs' @@ -11,12 +11,14 @@ import notify from './notify' import { cleanupRemote, deleteRemote, + getRemote, listMounts, listServes, mountRemote, stopServe, unmountRemote, } from './rclone/api' +import { compareVersions, getRcloneVersion } from './rclone/common' import { dialogGetMountPlugin, needsMountPlugin } from './rclone/mount' import { usePersistedStore, useStore } from './store' import { showDefaultTray, showLoadingTray } from './tray' @@ -33,15 +35,22 @@ async function parseRemotes(remotes: string[]) { const currentServes = await listServes() console.log('[parseRemotes] currentServes', currentServes) - const parsedRemotes: Record = {} + const parsedRemotes: Record< + string, + { icon: string; items: (MenuItem | Submenu | PredefinedMenuItem)[] } + > = {} for (const remote of remotes) { console.log('[parseRemotes] remote', remote) + const remoteConfig = persistedStoreState.remoteConfigList?.[remote] if (remoteConfig?.disabledActions?.includes('tray')) { continue } + const remoteInfo = await getRemote(remote).catch(null) + console.log('[parseRemotes] remoteInfo', remoteInfo) + const submenuItems: (MenuItem | Submenu | PredefinedMenuItem)[] = [] if (!remoteConfig?.disabledActions?.includes('tray-mount')) { @@ -206,37 +215,42 @@ async function parseRemotes(remotes: string[]) { } if (!remoteConfig?.disabledActions?.includes('tray-cleanup')) { - const cleanupMenuItem = await MenuItem.new({ - id: `cleanup-${remote}`, - text: 'Cleanup', - action: async () => { - try { - const confirmed = await ask(`Start cleanup on ${remote}?`, { - title: `Cleaning up ${remote}`, - kind: 'warning', - okLabel: 'Start', - cancelLabel: 'Cancel', - }) + if ( + remoteInfo?.provider && + ['s3', 'b2', 'box', 'drive', 'onedrive'].includes(remoteInfo.provider) + ) { + const cleanupMenuItem = await MenuItem.new({ + id: `cleanup-${remote}`, + text: 'Cleanup', + action: async () => { + try { + const confirmed = await ask(`Start cleanup on ${remote}?`, { + title: `Cleaning up ${remote}`, + kind: 'warning', + okLabel: 'Start', + cancelLabel: 'Cancel', + }) - if (!confirmed) { - return + if (!confirmed) { + return + } + + await cleanupRemote(remote) + await message(`Cleanup started for ${remote}`, { + title: 'Cleanup Started', + okLabel: 'OK', + }) + } catch (error) { + await message(`Failed to start cleanup job, ${error}`, { + title: 'Cleanup Error', + kind: 'error', + okLabel: 'OK', + }) } - - await cleanupRemote(remote) - await message(`Cleanup started for ${remote}`, { - title: 'Cleanup Started', - okLabel: 'OK', - }) - } catch (error) { - await message(`Failed to start cleanup job, ${error}`, { - title: 'Cleanup Error', - kind: 'error', - okLabel: 'OK', - }) - } - }, - }) - submenuItems.push(cleanupMenuItem) + }, + }) + submenuItems.push(cleanupMenuItem) + } } if (!remoteConfig?.disabledActions?.includes('tray-remove')) { @@ -358,7 +372,12 @@ async function parseRemotes(remotes: string[]) { submenuItems.push(stopServeMenuItem) } - parsedRemotes[remote] = submenuItems + parsedRemotes[remote] = { + icon: remoteInfo?.provider + ? await resolveResource(`icons/small/providers/${remoteInfo.provider}.png`) + : await resolveResource(`icons/small/backends/${remoteInfo?.type}.png`), + items: submenuItems, + } } return parsedRemotes @@ -383,13 +402,14 @@ export async function buildMenu() { }) menuItems.push(noRemotesMenuItem) } else if (remotes.length > 5) { - const items = await parseRemotes(remotes) + const parsedRemotes = await parseRemotes(remotes) const submenuItems: (MenuItem | Submenu | PredefinedMenuItem)[] = [] - for (const remote in items) { + for (const r in parsedRemotes) { const sub = await Submenu.new({ - items: items[remote], - text: remote, + items: parsedRemotes[r].items, + icon: parsedRemotes[r].icon, + text: r, }) submenuItems.push(sub) } @@ -401,12 +421,13 @@ export async function buildMenu() { menuItems.push(sub) } else { - const items = await parseRemotes(remotes) + const parsedRemotes = await parseRemotes(remotes) - for (const remote in items) { + for (const r in parsedRemotes) { const sub = await Submenu.new({ - items: items[remote], - text: remote, + items: parsedRemotes[r].items, + icon: parsedRemotes[r].icon, + text: r, }) menuItems.push(sub) } @@ -446,20 +467,6 @@ export async function buildMenu() { menuItems.push(copyMenuItem) } - if (!persistedStoreState.disabledActions?.includes('tray-move')) { - const moveMenuItem = await MenuItem.new({ - id: 'move', - text: 'Move', - action: async () => { - await openWindow({ - name: 'Move', - url: '/move', - }) - }, - }) - menuItems.push(moveMenuItem) - } - if (!persistedStoreState.disabledActions?.includes('tray-sync')) { const syncMenuItem = await MenuItem.new({ id: 'sync', @@ -474,46 +481,82 @@ export async function buildMenu() { menuItems.push(syncMenuItem) } - if (!persistedStoreState.disabledActions?.includes('tray-serve')) { - const serveToMenuItem = await MenuItem.new({ - id: 'serve', - text: 'Serve', - action: async () => { - await openWindow({ - name: 'Serve', - url: '/serve', - }) - }, - }) - menuItems.push(serveToMenuItem) - } + const allowsAdditional = + !persistedStoreState.disabledActions?.includes('tray-move') || + !persistedStoreState.disabledActions?.includes('tray-serve') || + !persistedStoreState.disabledActions?.includes('tray-purge') || + !persistedStoreState.disabledActions?.includes('tray-delete') - if (!persistedStoreState.disabledActions?.includes('tray-purge')) { - const purgeMenuItem = await MenuItem.new({ - id: 'purge', - text: 'Purge', - action: async () => { - await openWindow({ - name: 'Purge', - url: '/purge', - }) - }, - }) - menuItems.push(purgeMenuItem) - } + if (allowsAdditional) { + const commandsSubmenuItems: (MenuItem | Submenu | PredefinedMenuItem)[] = [] - if (!persistedStoreState.disabledActions?.includes('tray-delete')) { - const deleteMenuItem = await MenuItem.new({ - id: 'delete', - text: 'Delete', - action: async () => { - await openWindow({ - name: 'Delete', - url: '/delete', - }) - }, + if (!persistedStoreState.disabledActions?.includes('tray-move')) { + const moveMenuItem = await MenuItem.new({ + id: 'move', + text: 'Move', + action: async () => { + await openWindow({ + name: 'Move', + url: '/move', + }) + }, + }) + commandsSubmenuItems.push(moveMenuItem) + } + + const rcloneVersion = await getRcloneVersion() + + if ( + rcloneVersion?.yours && + compareVersions(rcloneVersion.yours, '1.70.0') === 1 && + !persistedStoreState.disabledActions?.includes('tray-serve') + ) { + const serveToMenuItem = await MenuItem.new({ + id: 'serve', + text: 'Serve', + action: async () => { + await openWindow({ + name: 'Serve', + url: '/serve', + }) + }, + }) + commandsSubmenuItems.push(serveToMenuItem) + } + + if (!persistedStoreState.disabledActions?.includes('tray-purge')) { + const purgeMenuItem = await MenuItem.new({ + id: 'purge', + text: 'Purge', + action: async () => { + await openWindow({ + name: 'Purge', + url: '/purge', + }) + }, + }) + commandsSubmenuItems.push(purgeMenuItem) + } + + if (!persistedStoreState.disabledActions?.includes('tray-delete')) { + const deleteMenuItem = await MenuItem.new({ + id: 'delete', + text: 'Delete', + action: async () => { + await openWindow({ + name: 'Delete', + url: '/delete', + }) + }, + }) + commandsSubmenuItems.push(deleteMenuItem) + } + + const commandsSubmenu = await Submenu.new({ + items: commandsSubmenuItems, + text: 'Commands', }) - menuItems.push(deleteMenuItem) + menuItems.push(commandsSubmenu) } await PredefinedMenuItem.new({ diff --git a/src-tauri/icons/small/backends/azureblob.png b/src-tauri/icons/small/backends/azureblob.png new file mode 100644 index 0000000..50916dd Binary files /dev/null and b/src-tauri/icons/small/backends/azureblob.png differ diff --git a/src-tauri/icons/small/backends/azurefiles.png b/src-tauri/icons/small/backends/azurefiles.png new file mode 100644 index 0000000..50916dd Binary files /dev/null and b/src-tauri/icons/small/backends/azurefiles.png differ diff --git a/src-tauri/icons/small/backends/b2.png b/src-tauri/icons/small/backends/b2.png new file mode 100644 index 0000000..99a6df6 Binary files /dev/null and b/src-tauri/icons/small/backends/b2.png differ diff --git a/src-tauri/icons/small/backends/box.png b/src-tauri/icons/small/backends/box.png new file mode 100644 index 0000000..4e08f78 Binary files /dev/null and b/src-tauri/icons/small/backends/box.png differ diff --git a/src-tauri/icons/small/backends/drive.png b/src-tauri/icons/small/backends/drive.png new file mode 100644 index 0000000..e593c5c Binary files /dev/null and b/src-tauri/icons/small/backends/drive.png differ diff --git a/src-tauri/icons/small/backends/dropbox.png b/src-tauri/icons/small/backends/dropbox.png new file mode 100644 index 0000000..112651b Binary files /dev/null and b/src-tauri/icons/small/backends/dropbox.png differ diff --git a/src-tauri/icons/small/backends/ftp.png b/src-tauri/icons/small/backends/ftp.png new file mode 100644 index 0000000..a4e4192 Binary files /dev/null and b/src-tauri/icons/small/backends/ftp.png differ diff --git a/src-tauri/icons/small/backends/gcs.png b/src-tauri/icons/small/backends/gcs.png new file mode 100644 index 0000000..c19d79c Binary files /dev/null and b/src-tauri/icons/small/backends/gcs.png differ diff --git a/src-tauri/icons/small/backends/gphotos.png b/src-tauri/icons/small/backends/gphotos.png new file mode 100644 index 0000000..366b1bd Binary files /dev/null and b/src-tauri/icons/small/backends/gphotos.png differ diff --git a/src-tauri/icons/small/backends/http.png b/src-tauri/icons/small/backends/http.png new file mode 100644 index 0000000..9708e92 Binary files /dev/null and b/src-tauri/icons/small/backends/http.png differ diff --git a/src-tauri/icons/small/backends/netstorage.png b/src-tauri/icons/small/backends/netstorage.png new file mode 100644 index 0000000..98b8ddf Binary files /dev/null and b/src-tauri/icons/small/backends/netstorage.png differ diff --git a/src-tauri/icons/small/backends/onedrive.png b/src-tauri/icons/small/backends/onedrive.png new file mode 100644 index 0000000..c407771 Binary files /dev/null and b/src-tauri/icons/small/backends/onedrive.png differ diff --git a/src-tauri/icons/small/backends/oos.png b/src-tauri/icons/small/backends/oos.png new file mode 100644 index 0000000..c20030b Binary files /dev/null and b/src-tauri/icons/small/backends/oos.png differ diff --git a/src-tauri/icons/small/backends/protondrive.png b/src-tauri/icons/small/backends/protondrive.png new file mode 100644 index 0000000..2324653 Binary files /dev/null and b/src-tauri/icons/small/backends/protondrive.png differ diff --git a/src-tauri/icons/small/backends/s3.png b/src-tauri/icons/small/backends/s3.png new file mode 100644 index 0000000..bdcef32 Binary files /dev/null and b/src-tauri/icons/small/backends/s3.png differ diff --git a/src-tauri/icons/small/backends/sftp.png b/src-tauri/icons/small/backends/sftp.png new file mode 100644 index 0000000..fc533a1 Binary files /dev/null and b/src-tauri/icons/small/backends/sftp.png differ diff --git a/src-tauri/icons/small/backends/swift.png b/src-tauri/icons/small/backends/swift.png new file mode 100644 index 0000000..21be20d Binary files /dev/null and b/src-tauri/icons/small/backends/swift.png differ diff --git a/src-tauri/icons/small/backends/webdav.png b/src-tauri/icons/small/backends/webdav.png new file mode 100644 index 0000000..ae07b06 Binary files /dev/null and b/src-tauri/icons/small/backends/webdav.png differ diff --git a/src-tauri/icons/small/providers/AWS.png b/src-tauri/icons/small/providers/AWS.png new file mode 100644 index 0000000..4c45637 Binary files /dev/null and b/src-tauri/icons/small/providers/AWS.png differ diff --git a/src-tauri/icons/small/providers/Alibaba.png b/src-tauri/icons/small/providers/Alibaba.png new file mode 100644 index 0000000..890622e Binary files /dev/null and b/src-tauri/icons/small/providers/Alibaba.png differ diff --git a/src-tauri/icons/small/providers/ArvanCloud.png b/src-tauri/icons/small/providers/ArvanCloud.png new file mode 100644 index 0000000..1453528 Binary files /dev/null and b/src-tauri/icons/small/providers/ArvanCloud.png differ diff --git a/src-tauri/icons/small/providers/Ceph.png b/src-tauri/icons/small/providers/Ceph.png new file mode 100644 index 0000000..d1f73ff Binary files /dev/null and b/src-tauri/icons/small/providers/Ceph.png differ diff --git a/src-tauri/icons/small/providers/ChinaMobile.png b/src-tauri/icons/small/providers/ChinaMobile.png new file mode 100644 index 0000000..ac289f7 Binary files /dev/null and b/src-tauri/icons/small/providers/ChinaMobile.png differ diff --git a/src-tauri/icons/small/providers/Cloudflare.png b/src-tauri/icons/small/providers/Cloudflare.png new file mode 100644 index 0000000..4459b36 Binary files /dev/null and b/src-tauri/icons/small/providers/Cloudflare.png differ diff --git a/src-tauri/icons/small/providers/DigitalOcean.png b/src-tauri/icons/small/providers/DigitalOcean.png new file mode 100644 index 0000000..bb5945c Binary files /dev/null and b/src-tauri/icons/small/providers/DigitalOcean.png differ diff --git a/src-tauri/icons/small/providers/Dreamhost.png b/src-tauri/icons/small/providers/Dreamhost.png new file mode 100644 index 0000000..3413d2e Binary files /dev/null and b/src-tauri/icons/small/providers/Dreamhost.png differ diff --git a/src-tauri/icons/small/providers/Exaba.png b/src-tauri/icons/small/providers/Exaba.png new file mode 100644 index 0000000..9fa83ed Binary files /dev/null and b/src-tauri/icons/small/providers/Exaba.png differ diff --git a/src-tauri/icons/small/providers/FlashBlade.png b/src-tauri/icons/small/providers/FlashBlade.png new file mode 100644 index 0000000..9019cdb Binary files /dev/null and b/src-tauri/icons/small/providers/FlashBlade.png differ diff --git a/src-tauri/icons/small/providers/GCS.png b/src-tauri/icons/small/providers/GCS.png new file mode 100644 index 0000000..c19d79c Binary files /dev/null and b/src-tauri/icons/small/providers/GCS.png differ diff --git a/src-tauri/icons/small/providers/HuaweiOBS.png b/src-tauri/icons/small/providers/HuaweiOBS.png new file mode 100644 index 0000000..21d9328 Binary files /dev/null and b/src-tauri/icons/small/providers/HuaweiOBS.png differ diff --git a/src-tauri/icons/small/providers/IBMCOS.png b/src-tauri/icons/small/providers/IBMCOS.png new file mode 100644 index 0000000..7302479 Binary files /dev/null and b/src-tauri/icons/small/providers/IBMCOS.png differ diff --git a/src-tauri/icons/small/providers/IDrive.png b/src-tauri/icons/small/providers/IDrive.png new file mode 100644 index 0000000..09c31b1 Binary files /dev/null and b/src-tauri/icons/small/providers/IDrive.png differ diff --git a/src-tauri/icons/small/providers/IONOS.png b/src-tauri/icons/small/providers/IONOS.png new file mode 100644 index 0000000..3bfe29a Binary files /dev/null and b/src-tauri/icons/small/providers/IONOS.png differ diff --git a/src-tauri/icons/small/providers/Leviia.png b/src-tauri/icons/small/providers/Leviia.png new file mode 100644 index 0000000..ae870ae Binary files /dev/null and b/src-tauri/icons/small/providers/Leviia.png differ diff --git a/src-tauri/icons/small/providers/Liara.png b/src-tauri/icons/small/providers/Liara.png new file mode 100644 index 0000000..97550a0 Binary files /dev/null and b/src-tauri/icons/small/providers/Liara.png differ diff --git a/src-tauri/icons/small/providers/Linode.png b/src-tauri/icons/small/providers/Linode.png new file mode 100644 index 0000000..e8a4c7e Binary files /dev/null and b/src-tauri/icons/small/providers/Linode.png differ diff --git a/src-tauri/icons/small/providers/LyveCloud.png b/src-tauri/icons/small/providers/LyveCloud.png new file mode 100644 index 0000000..35154d6 Binary files /dev/null and b/src-tauri/icons/small/providers/LyveCloud.png differ diff --git a/src-tauri/icons/small/providers/Magalu.png b/src-tauri/icons/small/providers/Magalu.png new file mode 100644 index 0000000..be21c33 Binary files /dev/null and b/src-tauri/icons/small/providers/Magalu.png differ diff --git a/src-tauri/icons/small/providers/Mega.png b/src-tauri/icons/small/providers/Mega.png new file mode 100644 index 0000000..5d45c0e Binary files /dev/null and b/src-tauri/icons/small/providers/Mega.png differ diff --git a/src-tauri/icons/small/providers/Minio.png b/src-tauri/icons/small/providers/Minio.png new file mode 100644 index 0000000..157773c Binary files /dev/null and b/src-tauri/icons/small/providers/Minio.png differ diff --git a/src-tauri/icons/small/providers/Netease.png b/src-tauri/icons/small/providers/Netease.png new file mode 100644 index 0000000..b23d047 Binary files /dev/null and b/src-tauri/icons/small/providers/Netease.png differ diff --git a/src-tauri/icons/small/providers/OVHcloud.png b/src-tauri/icons/small/providers/OVHcloud.png new file mode 100644 index 0000000..53b6a4f Binary files /dev/null and b/src-tauri/icons/small/providers/OVHcloud.png differ diff --git a/src-tauri/icons/small/providers/Other.png b/src-tauri/icons/small/providers/Other.png new file mode 100644 index 0000000..bdcef32 Binary files /dev/null and b/src-tauri/icons/small/providers/Other.png differ diff --git a/src-tauri/icons/small/providers/Outscale.png b/src-tauri/icons/small/providers/Outscale.png new file mode 100644 index 0000000..97b6f83 Binary files /dev/null and b/src-tauri/icons/small/providers/Outscale.png differ diff --git a/src-tauri/icons/small/providers/Petabox.png b/src-tauri/icons/small/providers/Petabox.png new file mode 100644 index 0000000..a8ac360 Binary files /dev/null and b/src-tauri/icons/small/providers/Petabox.png differ diff --git a/src-tauri/icons/small/providers/Qiniu.png b/src-tauri/icons/small/providers/Qiniu.png new file mode 100644 index 0000000..68c396a Binary files /dev/null and b/src-tauri/icons/small/providers/Qiniu.png differ diff --git a/src-tauri/icons/small/providers/RackCorp.png b/src-tauri/icons/small/providers/RackCorp.png new file mode 100644 index 0000000..6470aab Binary files /dev/null and b/src-tauri/icons/small/providers/RackCorp.png differ diff --git a/src-tauri/icons/small/providers/Rclone.png b/src-tauri/icons/small/providers/Rclone.png new file mode 100644 index 0000000..81382bf Binary files /dev/null and b/src-tauri/icons/small/providers/Rclone.png differ diff --git a/src-tauri/icons/small/providers/Scaleway.png b/src-tauri/icons/small/providers/Scaleway.png new file mode 100644 index 0000000..e1c2868 Binary files /dev/null and b/src-tauri/icons/small/providers/Scaleway.png differ diff --git a/src-tauri/icons/small/providers/SeaweedFS.png b/src-tauri/icons/small/providers/SeaweedFS.png new file mode 100644 index 0000000..451354e Binary files /dev/null and b/src-tauri/icons/small/providers/SeaweedFS.png differ diff --git a/src-tauri/icons/small/providers/Selectel.png b/src-tauri/icons/small/providers/Selectel.png new file mode 100644 index 0000000..82caa33 Binary files /dev/null and b/src-tauri/icons/small/providers/Selectel.png differ diff --git a/src-tauri/icons/small/providers/StackPath.png b/src-tauri/icons/small/providers/StackPath.png new file mode 100644 index 0000000..c7ebcd8 Binary files /dev/null and b/src-tauri/icons/small/providers/StackPath.png differ diff --git a/src-tauri/icons/small/providers/Storj.png b/src-tauri/icons/small/providers/Storj.png new file mode 100644 index 0000000..0c95867 Binary files /dev/null and b/src-tauri/icons/small/providers/Storj.png differ diff --git a/src-tauri/icons/small/providers/Synology.png b/src-tauri/icons/small/providers/Synology.png new file mode 100644 index 0000000..537a677 Binary files /dev/null and b/src-tauri/icons/small/providers/Synology.png differ diff --git a/src-tauri/icons/small/providers/TencentCOS.png b/src-tauri/icons/small/providers/TencentCOS.png new file mode 100644 index 0000000..83b9e90 Binary files /dev/null and b/src-tauri/icons/small/providers/TencentCOS.png differ diff --git a/src-tauri/icons/small/providers/Wasabi.png b/src-tauri/icons/small/providers/Wasabi.png new file mode 100644 index 0000000..b53c07c Binary files /dev/null and b/src-tauri/icons/small/providers/Wasabi.png differ diff --git a/src-tauri/icons/small/providers/Zata.png b/src-tauri/icons/small/providers/Zata.png new file mode 100644 index 0000000..6f0a598 Binary files /dev/null and b/src-tauri/icons/small/providers/Zata.png differ diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index f21c90e..64ba0a9 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -44,27 +44,7 @@ "icons/icon.icns", "icons/icon.ico" ], - "resources": [ - "icons/favicon/icon.png", - "icons/favicon/frame_00_delay-0.1s.png", - "icons/favicon/frame_01_delay-0.1s.png", - "icons/favicon/frame_02_delay-0.1s.png", - "icons/favicon/frame_03_delay-0.1s.png", - "icons/favicon/frame_04_delay-0.1s.png", - "icons/favicon/frame_05_delay-0.1s.png", - "icons/favicon/frame_06_delay-0.1s.png", - "icons/favicon/frame_07_delay-0.1s.png", - "icons/favicon/frame_08_delay-0.1s.png", - "icons/favicon/frame_09_delay-0.1s.png", - "icons/favicon/frame_10_delay-0.1s.png", - "icons/favicon/frame_11_delay-0.1s.png", - "icons/favicon/frame_12_delay-0.1s.png", - "icons/favicon/frame_13_delay-0.1s.png", - "icons/favicon/frame_14_delay-0.1s.png", - "icons/favicon/frame_15_delay-0.1s.png", - "icons/favicon/frame_16_delay-0.1s.png", - "icons/favicon/frame_17_delay-0.1s.png" - ], + "resources": ["icons/favicon/", "icons/small/"], "shortDescription": "Cross-platform GUI for rclone & S3", "longDescription": "Cross-platform GUI for rclone & S3", "license": "Apache-2.0",