diff --git a/src/lib/components/library/LibraryToolbar.svelte b/src/lib/components/library/LibraryToolbar.svelte index 7f2dc60..13b0022 100644 --- a/src/lib/components/library/LibraryToolbar.svelte +++ b/src/lib/components/library/LibraryToolbar.svelte @@ -3,6 +3,7 @@ MagnifyingGlass, Books, DownloadSimple, Folder, FolderSimple, SortAscending, CaretUp, CaretDown, ArrowsClockwise, Star, X, CheckSquare, } from "phosphor-svelte"; + import { canOpenFolder } from "$lib/core/filesystem"; import LibraryFilters from "./LibraryFilters.svelte"; import type { Category } from "$lib/types"; import type { LibrarySortOption, LibrarySortDir, LibraryStatusFilter, LibraryContentFilter } from "$lib/state/library.svelte"; @@ -165,9 +166,11 @@ {/if} - + {#if canOpenFolder()} + + {/if}
- {#if downloadedCount > 0} + {#if downloadedCount > 0 && canOpenFolder()} diff --git a/src/lib/core/filesystem.ts b/src/lib/core/filesystem.ts index 28d546f..1f3cd61 100644 --- a/src/lib/core/filesystem.ts +++ b/src/lib/core/filesystem.ts @@ -16,11 +16,28 @@ function join(root: string, ...parts: string[]): string { return [root.replace(/[/\\]$/, ''), ...parts].join(sep) } -function checkSupported(): boolean { +function isLocalServer(): boolean { + try { + const host = new URL(settingsState.settings.serverUrl).hostname + return host === 'localhost' || host === '127.0.0.1' || host === '::1' + } catch { + return false + } +} + +export function canOpenFolder(): boolean { + return platformService.isSupported('filesystem') && isLocalServer() +} + +function checkCanOpenFolder(): boolean { if (!platformService.isSupported('filesystem')) { addToast({ kind: 'info', title: 'Desktop only', body: 'Opening folders requires the desktop app.' }) return false } + if (!isLocalServer()) { + addToast({ kind: 'info', title: 'Remote server', body: 'Folder access is unavailable when connected to a remote server.' }) + return false + } return true } @@ -33,7 +50,7 @@ function checkRoot(root: string): boolean { } export async function openMangaFolder(manga: Manga): Promise { - if (!checkSupported()) return + if (!checkCanOpenFolder()) return const root = getDownloadsRoot() if (!checkRoot(root)) return const source = (manga as any).source?.displayName ?? (manga as any).source?.name ?? '' @@ -44,14 +61,14 @@ export async function openMangaFolder(manga: Manga): Promise { } export async function openDownloadsFolder(): Promise { - if (!checkSupported()) return + if (!checkCanOpenFolder()) return const root = getDownloadsRoot() if (!checkRoot(root)) return await platformService.openPath(root).catch(console.error) } export async function openCustomFolder(path: string): Promise { - if (!checkSupported()) return + if (!checkCanOpenFolder()) return if (!path?.trim()) return await platformService.openPath(path).catch(console.error) } \ No newline at end of file