Repository navigation
Expand file tree
/
Copy pathbrowserDefaults.ts
More file actions
81 lines (71 loc) · 2.84 KB
/
Copy pathbrowserDefaults.ts
File metadata and controls
81 lines (71 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import {
DEFAULT_BROWSER_PROFILE_ID,
resolveBrowserProfiles,
type BrowserProfile,
type DesktopPreviewTabDefaults,
type PreviewAppearancePreference,
type PreviewViewportSetting,
} from "@t3tools/contracts";
import {
ensureClientSettingsHydrated,
getClientSettings,
useClientSettings,
} from "~/hooks/useSettings";
import { resolveResponsiveBrowserViewportSize } from "./browserViewportLayout";
export interface BrowserDefaults {
readonly viewport: PreviewViewportSetting;
readonly zoomFactor: number;
readonly appearance: PreviewAppearancePreference;
readonly autoShowFloatingPreview: boolean;
readonly profiles: ReadonlyArray<BrowserProfile>;
readonly profileId: string;
}
const toBrowserDefaults = (settings: {
readonly browserDefaultViewport: PreviewViewportSetting;
readonly browserDefaultZoomFactor: number;
readonly browserDefaultAppearance: PreviewAppearancePreference;
readonly browserAutoShowFloatingPreview: boolean;
readonly browserProfiles: ReadonlyArray<BrowserProfile>;
readonly browserDefaultProfileId: string;
}): BrowserDefaults => {
const profiles = resolveBrowserProfiles(settings.browserProfiles);
return {
viewport: settings.browserDefaultViewport,
zoomFactor: settings.browserDefaultZoomFactor,
appearance: settings.browserDefaultAppearance,
autoShowFloatingPreview: settings.browserAutoShowFloatingPreview,
profiles,
profileId:
profiles.find(
(profile) =>
profile.id === settings.browserDefaultProfileId && profile.kind !== "incognito",
)?.id ?? DEFAULT_BROWSER_PROFILE_ID,
};
};
export function getBrowserDefaults(): BrowserDefaults {
return toBrowserDefaults(getClientSettings());
}
/** New tabs retain their initial defaults, so wait for settings hydration. Read failures reject. */
export async function resolveBrowserDefaults(): Promise<BrowserDefaults> {
await ensureClientSettingsHydrated();
return getBrowserDefaults();
}
export function useBrowserDefaults(): BrowserDefaults {
return useClientSettings(toBrowserDefaults);
}
export function browserDefaultTabState(defaults: BrowserDefaults): DesktopPreviewTabDefaults {
return { zoomFactor: defaults.zoomFactor, colorScheme: defaults.appearance };
}
const FALLBACK_RESPONSIVE_VIEWPORT_SIZE = { width: 1024, height: 768 } as const;
export function browserResponsiveViewportForToggle(input: {
readonly defaults?: BrowserDefaults;
readonly panelRect: { readonly width: number; readonly height: number } | null;
readonly zoomFactor: number | undefined;
}): PreviewViewportSetting {
const defaults = input.defaults ?? getBrowserDefaults();
if (defaults.viewport._tag !== "fill") return defaults.viewport;
const size = input.panelRect
? resolveResponsiveBrowserViewportSize(input.panelRect, input.zoomFactor)
: FALLBACK_RESPONSIVE_VIEWPORT_SIZE;
return { _tag: "freeform", ...size };
}