사소한 리팩토링

This commit is contained in:
static
2026-01-02 00:31:58 +09:00
parent 2e3cd4f8a2
commit d1f9018213
6 changed files with 56 additions and 60 deletions

View File

@@ -8,10 +8,11 @@
count: number; count: number;
item: Snippet<[index: number]>; item: Snippet<[index: number]>;
itemHeight: (index: number) => number; itemHeight: (index: number) => number;
itemGap?: number;
placeholder?: Snippet; placeholder?: Snippet;
} }
let { class: className, count, item, itemHeight, placeholder }: Props = $props(); let { class: className, count, item, itemHeight, itemGap, placeholder }: Props = $props();
let element: HTMLElement | undefined = $state(); let element: HTMLElement | undefined = $state();
let scrollMargin = $state(0); let scrollMargin = $state(0);
@@ -20,6 +21,7 @@
createWindowVirtualizer({ createWindowVirtualizer({
count, count,
estimateSize: itemHeight, estimateSize: itemHeight,
gap: itemGap,
scrollMargin, scrollMargin,
}), }),
); );

View File

@@ -75,19 +75,14 @@
<p class="font-medium">하위 카테고리의 파일</p> <p class="font-medium">하위 카테고리의 파일</p>
</CheckBox> </CheckBox>
</div> </div>
<RowVirtualizer <RowVirtualizer count={files.length} itemHeight={() => 48} itemGap={4}>
count={files.length}
itemHeight={(index) => 48 + (index + 1 < files.length ? 4 : 0)}
>
{#snippet item(index)} {#snippet item(index)}
{@const { details } = files[index]!} {@const { details } = files[index]!}
<div class={[index + 1 < files.length && "pb-1"]}>
<File <File
info={details} info={details}
onclick={onFileClick} onclick={onFileClick}
onRemoveClick={!details.isRecursive ? onFileRemoveClick : undefined} onRemoveClick={!details.isRecursive ? onFileRemoveClick : undefined}
/> />
</div>
{/snippet} {/snippet}
{#snippet placeholder()} {#snippet placeholder()}
<p class="text-center text-gray-500">이 카테고리에 추가된 파일이 없어요.</p> <p class="text-center text-gray-500">이 카테고리에 추가된 파일이 없어요.</p>

View File

@@ -46,7 +46,7 @@ const isFileUploading = (status: FileUploadState["status"]) =>
export const getUploadingFiles = (parentId?: DirectoryId) => { export const getUploadingFiles = (parentId?: DirectoryId) => {
return uploadingFiles.filter( return uploadingFiles.filter(
(file): file is LiveFileUploadState => (file) =>
(parentId === undefined || file.parentId === parentId) && isFileUploading(file.status), (parentId === undefined || file.parentId === parentId) && isFileUploading(file.status),
); );
}; };

View File

@@ -1,18 +1,29 @@
<script lang="ts"> <script lang="ts">
import { onMount } from "svelte";
import { FullscreenDiv } from "$lib/components/atoms"; import { FullscreenDiv } from "$lib/components/atoms";
import { TopBar } from "$lib/components/molecules"; import { TopBar } from "$lib/components/molecules";
import { getDownloadingFiles, clearDownloadedFiles } from "$lib/modules/file"; import {
import { bulkGetFileInfo } from "$lib/modules/filesystem"; getDownloadingFiles,
clearDownloadedFiles,
type FileDownloadState,
} from "$lib/modules/file";
import { bulkGetFileInfo, type MaybeFileInfo } from "$lib/modules/filesystem";
import { masterKeyStore } from "$lib/stores"; import { masterKeyStore } from "$lib/stores";
import File from "./File.svelte"; import File from "./File.svelte";
const downloadingFiles = getDownloadingFiles(); let downloadingFiles: { info: MaybeFileInfo; state: FileDownloadState }[] = $state([]);
const filesPromise = $derived(
bulkGetFileInfo( onMount(async () => {
downloadingFiles.map(({ id }) => id), const states = getDownloadingFiles();
const infos = await bulkGetFileInfo(
states.map(({ id }) => id),
$masterKeyStore?.get(1)?.key!, $masterKeyStore?.get(1)?.key!,
),
); );
downloadingFiles = states.map((state) => ({
info: infos.get(state.id)!,
state,
}));
});
$effect(() => clearDownloadedFiles); $effect(() => clearDownloadedFiles);
</script> </script>
@@ -23,14 +34,11 @@
<TopBar /> <TopBar />
<FullscreenDiv> <FullscreenDiv>
{#await filesPromise then files}
<div class="space-y-2 pb-4"> <div class="space-y-2 pb-4">
{#each downloadingFiles as state} {#each downloadingFiles as { info, state } (info.id)}
{@const info = files.get(state.id)!}
{#if info.exists} {#if info.exists}
<File {state} {info} /> <File {info} {state} />
{/if} {/if}
{/each} {/each}
</div> </div>
{/await}
</FullscreenDiv> </FullscreenDiv>

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import type { FileDownloadState } from "$lib/modules/file"; import type { FileDownloadState } from "$lib/modules/file";
import type { FileInfo } from "$lib/modules/filesystem"; import type { SummarizedFileInfo } from "$lib/modules/filesystem";
import { formatNetworkSpeed } from "$lib/utils"; import { formatNetworkSpeed } from "$lib/utils";
import IconCloud from "~icons/material-symbols/cloud"; import IconCloud from "~icons/material-symbols/cloud";
@@ -11,7 +11,7 @@
import IconError from "~icons/material-symbols/error"; import IconError from "~icons/material-symbols/error";
interface Props { interface Props {
info: FileInfo; info: SummarizedFileInfo;
state: FileDownloadState; state: FileDownloadState;
} }

View File

@@ -33,31 +33,23 @@
const toEntry = const toEntry =
<T extends Exclude<Entry["type"], "parent">>(type: T) => <T extends Exclude<Entry["type"], "parent">>(type: T) =>
(details: Extract<Entry, { type: T }>["details"]) => ({ (details: Extract<Entry, { type: T }>["details"]) => ({ type, name: details.name, details });
type,
name: details.name,
details,
});
let entries = $derived([ let entries = $derived([
...(showParentEntry ? ([{ type: "parent" }] as const) : []), ...(showParentEntry ? ([{ type: "parent" }] as const) : []),
...sortEntries(info.subDirectories.map(toEntry("directory"))), ...sortEntries(info.subDirectories.map(toEntry("directory"))),
...sortEntries([ ...sortEntries([
...info.files.map(toEntry("file")), ...info.files.map(toEntry("file")),
...getUploadingFiles(info.id).map(toEntry("uploading-file")), ...(getUploadingFiles(info.id) as LiveFileUploadState[]).map(toEntry("uploading-file")),
]), ]),
]); ]);
</script> </script>
{#if entries.length > 0} {#if entries.length > 0}
<div class="pb-[4.5rem]"> <div class="pb-[4.5rem]">
<RowVirtualizer <RowVirtualizer count={entries.length} itemHeight={() => 56} itemGap={4}>
count={entries.length}
itemHeight={(index) => 56 + (index + 1 < entries.length ? 4 : 0)}
>
{#snippet item(index)} {#snippet item(index)}
{@const entry = entries[index]!} {@const entry = entries[index]!}
<div class={index + 1 < entries.length ? "pb-1" : ""}>
{#if entry.type === "parent"} {#if entry.type === "parent"}
<ActionEntryButton class="h-14" onclick={onParentClick}> <ActionEntryButton class="h-14" onclick={onParentClick}>
<DirectoryEntryLabel type="parent-directory" name=".." /> <DirectoryEntryLabel type="parent-directory" name=".." />
@@ -73,7 +65,6 @@
{:else} {:else}
<UploadingFile state={entry.details} /> <UploadingFile state={entry.details} />
{/if} {/if}
</div>
{/snippet} {/snippet}
</RowVirtualizer> </RowVirtualizer>
</div> </div>