From f37df53991b4df2d007bbd7c93039280bff1521b Mon Sep 17 00:00:00 2001 From: static Date: Tue, 14 Jan 2025 03:07:54 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BA=90=EC=8B=9C=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=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/modules/cache.ts | 16 ++++-- src/lib/modules/file.ts | 8 ++- src/lib/modules/util.ts | 22 +++++++ .../(fullscreen)/setting/cache/+page.svelte | 57 +++++++++++++++++++ .../(fullscreen)/setting/cache/File.svelte | 42 ++++++++++++++ .../(fullscreen)/setting/cache/service.ts | 1 + .../[[id]]/DirectoryEntries/File.svelte | 6 +- .../[[id]]/DirectoryEntries/service.ts | 14 +---- src/routes/(main)/menu/+page.svelte | 39 +++++++------ src/routes/(main)/menu/MenuEntryButton.svelte | 25 ++++++++ 10 files changed, 194 insertions(+), 36 deletions(-) create mode 100644 src/lib/modules/util.ts create mode 100644 src/routes/(fullscreen)/setting/cache/+page.svelte create mode 100644 src/routes/(fullscreen)/setting/cache/File.svelte create mode 100644 src/routes/(fullscreen)/setting/cache/service.ts create mode 100644 src/routes/(main)/menu/MenuEntryButton.svelte diff --git a/src/lib/modules/cache.ts b/src/lib/modules/cache.ts index 0bd4342..383fb75 100644 --- a/src/lib/modules/cache.ts +++ b/src/lib/modules/cache.ts @@ -1,20 +1,28 @@ -import { getFileCacheIndex, storeFileCacheIndex, type FileCacheIndex } from "$lib/indexedDB"; +import { + getFileCacheIndex as getFileCacheIndexFromIndexedDB, + storeFileCacheIndex as storeFileCacheIndexToIndexedDB, + type FileCacheIndex, +} from "$lib/indexedDB"; import { readFileFromOpfs, writeFileToOpfs } from "$lib/modules/opfs"; const fileCacheIndex = new Map(); export const prepareFileCache = async () => { - for (const cache of await getFileCacheIndex()) { + for (const cache of await getFileCacheIndexFromIndexedDB()) { fileCacheIndex.set(cache.fileId, cache); } }; +export const getFileCacheIndex = () => { + return Array.from(fileCacheIndex.values()); +}; + export const getFileCache = async (fileId: number) => { const cacheIndex = fileCacheIndex.get(fileId); if (!cacheIndex) return null; cacheIndex.lastRetrievedAt = new Date(); - storeFileCacheIndex(cacheIndex); // Intended + storeFileCacheIndexToIndexedDB(cacheIndex); // Intended return await readFileFromOpfs(`/cache/${fileId}`); }; @@ -29,5 +37,5 @@ export const storeFileCache = async (fileId: number, fileBuffer: ArrayBuffer) => size: fileBuffer.byteLength, }; fileCacheIndex.set(fileId, cacheIndex); - await storeFileCacheIndex(cacheIndex); + await storeFileCacheIndexToIndexedDB(cacheIndex); }; diff --git a/src/lib/modules/file.ts b/src/lib/modules/file.ts index 82d136e..342febc 100644 --- a/src/lib/modules/file.ts +++ b/src/lib/modules/file.ts @@ -63,7 +63,13 @@ const fetchFileInfo = async ( infoStore: Writable, ) => { const res = await callGetApi(`/api/file/${fileId}`); - if (!res.ok) throw new Error("Failed to fetch file information"); + if (!res.ok) { + if (res.status === 404) { + infoStore.update(() => null); + return; + } + throw new Error("Failed to fetch file information"); + } const metadata: FileInfoResponse = await res.json(); const { dataKey } = await unwrapDataKey(metadata.dek, masterKey); diff --git a/src/lib/modules/util.ts b/src/lib/modules/util.ts new file mode 100644 index 0000000..31e971b --- /dev/null +++ b/src/lib/modules/util.ts @@ -0,0 +1,22 @@ +const pad2 = (num: number) => num.toString().padStart(2, "0"); + +export const formatDate = (date: Date) => { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + return `${year}. ${month}. ${day}.`; +}; + +export const formatDateTime = (date: Date) => { + const dateFormatted = formatDate(date); + const hours = date.getHours(); + const minutes = date.getMinutes(); + return `${dateFormatted} ${pad2(hours)}:${pad2(minutes)}`; +}; + +export const formatFileSize = (size: number) => { + if (size < 1024) return `${size} B`; + if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KiB`; + if (size < 1024 * 1024 * 1024) return `${(size / 1024 / 1024).toFixed(1)} MiB`; + return `${(size / 1024 / 1024 / 1024).toFixed(1)} GiB`; +}; diff --git a/src/routes/(fullscreen)/setting/cache/+page.svelte b/src/routes/(fullscreen)/setting/cache/+page.svelte new file mode 100644 index 0000000..4c799fc --- /dev/null +++ b/src/routes/(fullscreen)/setting/cache/+page.svelte @@ -0,0 +1,57 @@ + + + + 캐시 설정 + + +
+ + {#if fileCache} +
+
+

+ {fileCache.length}개 파일이 캐시되어 {formatFileSize(fileCacheTotalSize)}를 사용하고 + 있어요. +

+

캐시를 삭제하더라도 원본 파일은 삭제되지 않아요.

+
+
+ {#each fileCache as { index, fileInfo }} + + {/each} +
+
+ {:else} +
+

캐시 목록을 불러오고 있어요.

+
+ {/if} +
diff --git a/src/routes/(fullscreen)/setting/cache/File.svelte b/src/routes/(fullscreen)/setting/cache/File.svelte new file mode 100644 index 0000000..f5dfcbb --- /dev/null +++ b/src/routes/(fullscreen)/setting/cache/File.svelte @@ -0,0 +1,42 @@ + + +
+ {#if $info} +
+ +
+ {:else} +
+ +
+ {/if} +
+ {#if $info} +

{$info.name}

+ {:else} +

삭제된 파일

+ {/if} +

+ 읽음 {formatDate(index.lastRetrievedAt)} · {formatFileSize(index.size)} +

+
+ +
diff --git a/src/routes/(fullscreen)/setting/cache/service.ts b/src/routes/(fullscreen)/setting/cache/service.ts new file mode 100644 index 0000000..ec16564 --- /dev/null +++ b/src/routes/(fullscreen)/setting/cache/service.ts @@ -0,0 +1 @@ +export { formatDate, formatFileSize } from "$lib/modules/util"; diff --git a/src/routes/(main)/directory/[[id]]/DirectoryEntries/File.svelte b/src/routes/(main)/directory/[[id]]/DirectoryEntries/File.svelte index c95ba6d..80479ea 100644 --- a/src/routes/(main)/directory/[[id]]/DirectoryEntries/File.svelte +++ b/src/routes/(main)/directory/[[id]]/DirectoryEntries/File.svelte @@ -1,7 +1,7 @@ + + +
+
+ +
+

+ {@render children?.()} +

+
+