refactor: extract shared HEIC preview utility from file-store

This commit is contained in:
ashim-hq
2026-04-19 15:47:24 +08:00
parent db1137d94b
commit 7a29e6161e
2 changed files with 30 additions and 29 deletions
+29
View File
@@ -0,0 +1,29 @@
import { formatHeaders } from "@/lib/api";
const HEIF_EXTENSIONS = new Set(["heic", "heif", "hif"]);
export function needsServerPreview(file: File): boolean {
const ext = file.name.split(".").pop()?.toLowerCase() ?? "";
return HEIF_EXTENSIONS.has(ext);
}
export async function fetchDecodedPreview(file: File): Promise<string | null> {
try {
const formData = new FormData();
formData.append("file", file);
const res = await fetch("/api/v1/preview", {
method: "POST",
headers: formatHeaders(),
body: formData,
});
if (!res.ok) return null;
const blob = await res.blob();
return URL.createObjectURL(blob);
} catch {
return null;
}
}
export function revokePreviewUrl(url: string): void {
URL.revokeObjectURL(url);
}
+1 -29
View File
@@ -1,5 +1,5 @@
import { create } from "zustand";
import { formatHeaders } from "@/lib/api";
import { fetchDecodedPreview, needsServerPreview } from "@/lib/image-preview";
export interface FileEntry {
file: File;
@@ -77,34 +77,6 @@ function deriveFiles(entries: FileEntry[]): File[] {
return prevFiles;
}
// ---------------------------------------------------------------------------
// HEIC/HEIF preview helpers
// ---------------------------------------------------------------------------
const HEIF_EXTENSIONS = new Set(["heic", "heif", "hif"]);
function needsServerPreview(file: File): boolean {
const ext = file.name.split(".").pop()?.toLowerCase() ?? "";
return HEIF_EXTENSIONS.has(ext);
}
async function fetchDecodedPreview(file: File): Promise<string | null> {
try {
const formData = new FormData();
formData.append("file", file);
const res = await fetch("/api/v1/preview", {
method: "POST",
headers: formatHeaders(),
body: formData,
});
if (!res.ok) return null;
const blob = await res.blob();
return URL.createObjectURL(blob);
} catch {
return null;
}
}
// ---------------------------------------------------------------------------
// Store
// ---------------------------------------------------------------------------