Skip to content

Commit 05e9700

Browse files
committed
refactor(studio): extract render settings persistence to own module
Move getPersistedRenderSettings/persistRenderSettings out of RenderQueue.tsx into renderSettings.ts so code-splitting the component doesn't drag along the helper.
1 parent 8b790a1 commit 05e9700

3 files changed

Lines changed: 44 additions & 40 deletions

File tree

packages/studio/src/components/StudioLeftSidebar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { isMediaFile } from "../utils/mediaTypes";
66
import { usePanelLayoutContext } from "../contexts/PanelLayoutContext";
77
import { useStudioContext } from "../contexts/StudioContext";
88
import { useFileManagerContext } from "../contexts/FileManagerContext";
9-
import { getPersistedRenderSettings } from "./renders/RenderQueue";
9+
import { getPersistedRenderSettings } from "./renders/renderSettings";
1010

1111
export interface StudioLeftSidebarProps {
1212
leftSidebarRef: RefObject<LeftSidebarHandle | null>;

packages/studio/src/components/renders/RenderQueue.tsx

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,7 @@
1-
import { memo, useState, useRef, useEffect, useCallback } from "react";
1+
import { memo, useState, useRef, useEffect } from "react";
22
import { RenderQueueItem } from "./RenderQueueItem";
33
import type { RenderJob, ResolutionPreset } from "./useRenderQueue";
4-
5-
const RENDER_SETTINGS_KEY = "hf-studio-render-settings";
6-
7-
interface PersistedRenderSettings {
8-
format: "mp4" | "webm" | "mov";
9-
quality: "draft" | "standard" | "high";
10-
fps: 24 | 30 | 60;
11-
}
12-
13-
export function getPersistedRenderSettings(): PersistedRenderSettings {
14-
try {
15-
const raw = localStorage.getItem(RENDER_SETTINGS_KEY);
16-
if (raw) {
17-
const parsed = JSON.parse(raw);
18-
return {
19-
format: ["mp4", "webm", "mov"].includes(parsed.format) ? parsed.format : "mp4",
20-
quality: ["draft", "standard", "high"].includes(parsed.quality)
21-
? parsed.quality
22-
: "standard",
23-
fps: [24, 30, 60].includes(parsed.fps) ? parsed.fps : 30,
24-
};
25-
}
26-
} catch {
27-
/* ignore */
28-
}
29-
return { format: "mp4", quality: "standard", fps: 30 };
30-
}
4+
import { getPersistedRenderSettings, persistRenderSettings } from "./renderSettings";
315

326
export interface CompositionDimensions {
337
width: number;
@@ -231,14 +205,6 @@ function FormatExportButton({
231205
const [resolution, setResolution] = useState<ResolutionPreset | "auto">("auto");
232206
const [fps, setFps] = useState<24 | 30 | 60>(persisted.fps);
233207

234-
const persistSettings = useCallback((f: typeof format, q: typeof quality, fp: typeof fps) => {
235-
try {
236-
localStorage.setItem(RENDER_SETTINGS_KEY, JSON.stringify({ format: f, quality: q, fps: fp }));
237-
} catch {
238-
/* ignore */
239-
}
240-
}, []);
241-
242208
// MOV (ProRes) is a fixed-quality codec — quality selector has no effect.
243209
const showQuality = format !== "mov";
244210

@@ -267,7 +233,7 @@ function FormatExportButton({
267233
onChange={(e) => {
268234
const v = e.target.value as "draft" | "standard" | "high";
269235
setQuality(v);
270-
persistSettings(format, v, fps);
236+
persistRenderSettings(format, v, fps);
271237
}}
272238
disabled={isRendering}
273239
title={QUALITY_OPTIONS.find((q) => q.value === quality)?.title}
@@ -285,7 +251,7 @@ function FormatExportButton({
285251
onChange={(e) => {
286252
const v = Number(e.target.value) as 24 | 30 | 60;
287253
setFps(v);
288-
persistSettings(format, quality, v);
254+
persistRenderSettings(format, quality, v);
289255
}}
290256
disabled={isRendering}
291257
title="Frames per second"
@@ -300,7 +266,7 @@ function FormatExportButton({
300266
onChange={(e) => {
301267
const v = e.target.value as "mp4" | "webm" | "mov";
302268
setFormat(v);
303-
persistSettings(v, quality, fps);
269+
persistRenderSettings(v, quality, fps);
304270
}}
305271
disabled={isRendering}
306272
className="h-5 px-1 text-[10px] bg-neutral-800 border border-neutral-700 text-neutral-300 outline-none disabled:opacity-50"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const RENDER_SETTINGS_KEY = "hf-studio-render-settings";
2+
3+
export interface PersistedRenderSettings {
4+
format: "mp4" | "webm" | "mov";
5+
quality: "draft" | "standard" | "high";
6+
fps: 24 | 30 | 60;
7+
}
8+
9+
export function getPersistedRenderSettings(): PersistedRenderSettings {
10+
try {
11+
const raw = localStorage.getItem(RENDER_SETTINGS_KEY);
12+
if (raw) {
13+
const parsed = JSON.parse(raw);
14+
return {
15+
format: ["mp4", "webm", "mov"].includes(parsed.format) ? parsed.format : "mp4",
16+
quality: ["draft", "standard", "high"].includes(parsed.quality)
17+
? parsed.quality
18+
: "standard",
19+
fps: [24, 30, 60].includes(parsed.fps) ? parsed.fps : 30,
20+
};
21+
}
22+
} catch {
23+
/* ignore */
24+
}
25+
return { format: "mp4", quality: "standard", fps: 30 };
26+
}
27+
28+
export function persistRenderSettings(
29+
format: PersistedRenderSettings["format"],
30+
quality: PersistedRenderSettings["quality"],
31+
fps: PersistedRenderSettings["fps"],
32+
): void {
33+
try {
34+
localStorage.setItem(RENDER_SETTINGS_KEY, JSON.stringify({ format, quality, fps }));
35+
} catch {
36+
/* ignore */
37+
}
38+
}

0 commit comments

Comments
 (0)