From 72babc532fab5f06e2074456981bed9d37102d73 Mon Sep 17 00:00:00 2001 From: static Date: Sun, 18 Jan 2026 13:29:06 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=80=EC=83=89=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EC=97=90=20=EC=A6=90=EA=B2=A8=EC=B0=BE=EA=B8=B0=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/indexedDB/cacheIndex.ts | 7 +++++- src/lib/indexedDB/filesystem.ts | 23 +++++++++++++++++--- src/routes/(fullscreen)/search/+page.svelte | 14 ++++++++++-- src/routes/(fullscreen)/search/+page.ts | 5 ++++- src/routes/(main)/favorites/+page.svelte | 15 +++++++++++-- src/routes/(main)/favorites/Directory.svelte | 2 +- src/routes/(main)/favorites/File.svelte | 2 +- 7 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/lib/indexedDB/cacheIndex.ts b/src/lib/indexedDB/cacheIndex.ts index c820007..1602c8c 100644 --- a/src/lib/indexedDB/cacheIndex.ts +++ b/src/lib/indexedDB/cacheIndex.ts @@ -20,7 +20,12 @@ export const getFileCacheIndex = async () => { }; export const storeFileCacheIndex = async (fileCacheIndex: FileCacheIndex) => { - await cacheIndex.fileCache.put(fileCacheIndex); + await cacheIndex.fileCache.put({ + fileId: fileCacheIndex.fileId, + cachedAt: fileCacheIndex.cachedAt, + lastRetrievedAt: fileCacheIndex.lastRetrievedAt, + size: fileCacheIndex.size, + }); }; export const deleteFileCacheIndex = async (fileId: number) => { diff --git a/src/lib/indexedDB/filesystem.ts b/src/lib/indexedDB/filesystem.ts index daaf100..937fe92 100644 --- a/src/lib/indexedDB/filesystem.ts +++ b/src/lib/indexedDB/filesystem.ts @@ -74,7 +74,11 @@ export const getDirectoryInfo = async (id: number) => { }; export const storeDirectoryInfo = async (directoryInfo: DirectoryInfo) => { - await filesystem.directory.upsert(directoryInfo.id, { ...directoryInfo }); + await filesystem.directory.upsert(directoryInfo.id, { + parentId: directoryInfo.parentId, + name: directoryInfo.name, + isFavorite: directoryInfo.isFavorite, + }); }; export const deleteDirectoryInfo = async (id: number) => { @@ -108,7 +112,15 @@ export const bulkGetFileInfos = async (ids: number[]) => { }; export const storeFileInfo = async (fileInfo: FileInfo) => { - await filesystem.file.upsert(fileInfo.id, { ...fileInfo }); + await filesystem.file.upsert(fileInfo.id, { + parentId: fileInfo.parentId, + name: fileInfo.name, + contentType: fileInfo.contentType, + createdAt: fileInfo.createdAt, + lastModifiedAt: fileInfo.lastModifiedAt, + categoryIds: fileInfo.categoryIds, + isFavorite: fileInfo.isFavorite, + }); }; export const deleteFileInfo = async (id: number) => { @@ -135,7 +147,12 @@ export const getCategoryInfo = async (id: number) => { }; export const storeCategoryInfo = async (categoryInfo: CategoryInfo) => { - await filesystem.category.upsert(categoryInfo.id, { ...categoryInfo }); + await filesystem.category.upsert(categoryInfo.id, { + parentId: categoryInfo.parentId, + name: categoryInfo.name, + files: categoryInfo.files, + isFileRecursive: categoryInfo.isFileRecursive, + }); }; export const updateCategoryInfo = async (id: number, changes: { isFileRecursive?: boolean }) => { diff --git a/src/routes/(fullscreen)/search/+page.svelte b/src/routes/(fullscreen)/search/+page.svelte index c1296db..ef0c447 100644 --- a/src/routes/(fullscreen)/search/+page.svelte +++ b/src/routes/(fullscreen)/search/+page.svelte @@ -25,6 +25,7 @@ includeImages: boolean; includeVideos: boolean; includeDirectories: boolean; + searchInFavorites: boolean; searchInDirectory: boolean; categories: SearchFilter["categories"]; } @@ -36,6 +37,7 @@ includeImages: false, includeVideos: false, includeDirectories: false, + searchInFavorites: false, searchInDirectory: false, categories: [], }); @@ -45,6 +47,7 @@ filters.includeImages || filters.includeVideos || filters.includeDirectories || + filters.searchInFavorites || filters.name.trim().length > 0, ); @@ -81,7 +84,9 @@ return sortEntries( [...directories, ...files].filter( - ({ name }) => !nameFilter || searchString(name, nameFilter), + (entry) => + (!nameFilter || searchString(entry.name, nameFilter)) && + (!filters.searchInFavorites || entry.isFavorite), ), ); }); @@ -118,7 +123,7 @@ }, }; - $effect(() => { + $effect.pre(() => { if (data.directoryId) { HybridPromise.resolve(getDirectoryInfo(data.directoryId, $masterKeyStore?.get(1)?.key!)).then( (res) => { @@ -132,6 +137,10 @@ } }); + $effect.pre(() => { + filters.searchInFavorites = data.fromFavorites; + }); + $effect(() => { // Svelte sucks hasAnyFilter; @@ -172,6 +181,7 @@ {#if !hasCategoryFilter} 폴더 {/if} + 즐겨찾기 {#if directoryInfo?.exists} 위치: {directoryInfo.name} diff --git a/src/routes/(fullscreen)/search/+page.ts b/src/routes/(fullscreen)/search/+page.ts index f570304..6bf5a8e 100644 --- a/src/routes/(fullscreen)/search/+page.ts +++ b/src/routes/(fullscreen)/search/+page.ts @@ -4,15 +4,18 @@ import type { PageLoad } from "./$types"; export const load: PageLoad = ({ url }) => { const directoryId = url.searchParams.get("directoryId"); + const from = url.searchParams.get("from"); const zodRes = z .object({ directoryId: z.coerce.number().int().positive().nullable(), + from: z.enum(["favorites"]).nullable(), }) - .safeParse({ directoryId }); + .safeParse({ directoryId, from }); if (!zodRes.success) error(400, "Invalid query parameters"); return { directoryId: zodRes.data.directoryId, + fromFavorites: zodRes.data.from === "favorites", }; }; diff --git a/src/routes/(main)/favorites/+page.svelte b/src/routes/(main)/favorites/+page.svelte index 20d2a97..5c4c16d 100644 --- a/src/routes/(main)/favorites/+page.svelte +++ b/src/routes/(main)/favorites/+page.svelte @@ -2,11 +2,14 @@ import { onMount } from "svelte"; import { goto } from "$app/navigation"; import { RowVirtualizer } from "$lib/components/atoms"; + import { TopBar } from "$lib/components/molecules"; import { masterKeyStore } from "$lib/stores"; import Directory from "./Directory.svelte"; import File from "./File.svelte"; import { requestFavoriteEntries, requestRemoveFavorite, type FavoriteEntry } from "./service"; + import IconSearch from "~icons/material-symbols/search"; + let { data } = $props(); let entries: FavoriteEntry[] = $state([]); @@ -41,14 +44,22 @@ 즐겨찾기 -
+ + + +
{#if isLoading}

{#if data.favorites.files.length === 0 && data.favorites.directories.length === 0} 즐겨찾기한 항목이 없어요. {:else} - 로딩 중... + 즐겨찾기 목록을 불러오고 있어요. {/if}

diff --git a/src/routes/(main)/favorites/Directory.svelte b/src/routes/(main)/favorites/Directory.svelte index ae1ab13..9415478 100644 --- a/src/routes/(main)/favorites/Directory.svelte +++ b/src/routes/(main)/favorites/Directory.svelte @@ -20,5 +20,5 @@ actionButtonIcon={IconClose} onActionButtonClick={onRemoveClick} > - + diff --git a/src/routes/(main)/favorites/File.svelte b/src/routes/(main)/favorites/File.svelte index 78015d7..54fd07d 100644 --- a/src/routes/(main)/favorites/File.svelte +++ b/src/routes/(main)/favorites/File.svelte @@ -23,5 +23,5 @@ actionButtonIcon={IconClose} onActionButtonClick={onRemoveClick} > - +