fix(types): add file_display_overrides + launch_profiles to LauncherLocState
Both fields were being written to launcher_loc.current dynamically and
read back via 'as Record<string, unknown>' casts because they were absent
from the LauncherLocState interface and launcher_loc_defaults.
file_display_overrides: Record<string, 'extend' | 'mirror' | 'none'>
— per-device display override map keyed by event_file_id.
— local-only workaround until event_file.cfg_json is added on backend.
— TODO comment preserved; migrate once the backend column exists.
launch_profiles: Record<string, Partial<LaunchProfile>> | null
— local per-device launch profile overrides (device API config takes
priority; these override the built-in DEFAULT_LAUNCH_PROFILES).
Defaults added to launcher_loc_defaults ({} and null respectively).
All 3 type casts in launcher_file_cont.svelte removed.
This commit is contained in:
@@ -7,6 +7,8 @@
|
|||||||
* launcher_sess_defaults → events_sess.launcher (in-memory, resets on page load)
|
* launcher_sess_defaults → events_sess.launcher (in-memory, resets on page load)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import type { LaunchProfile } from '$lib/ae_events/ae_launcher__default_launch_profiles';
|
||||||
|
|
||||||
/** 3-way section collapse state used throughout the Launcher UI. */
|
/** 3-way section collapse state used throughout the Launcher UI. */
|
||||||
export type SectionState = 'collapsed' | 'auto' | 'pinned';
|
export type SectionState = 'collapsed' | 'auto' | 'pinned';
|
||||||
|
|
||||||
@@ -91,6 +93,18 @@ export interface LauncherLocState {
|
|||||||
* device/OS without deploying to the Mac laptop.
|
* device/OS without deploying to the Mac laptop.
|
||||||
*/
|
*/
|
||||||
native_test_mode: boolean;
|
native_test_mode: boolean;
|
||||||
|
/**
|
||||||
|
* Per-file display mode overrides, keyed by event_file_id.
|
||||||
|
* Stored locally (per-device) because event_file has no cfg_json column yet.
|
||||||
|
* TODO: migrate to event_file.cfg_json once the backend column is added.
|
||||||
|
*/
|
||||||
|
file_display_overrides: Record<string, 'extend' | 'mirror' | 'none'>;
|
||||||
|
/**
|
||||||
|
* Local per-device launch profile overrides, keyed by profile/extension name.
|
||||||
|
* Overrides DEFAULT_LAUNCH_PROFILES for this device only.
|
||||||
|
* Priority: device API config > this local override > built-in defaults.
|
||||||
|
*/
|
||||||
|
launch_profiles: Record<string, Partial<LaunchProfile>> | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LauncherSessState {
|
export interface LauncherSessState {
|
||||||
@@ -219,7 +233,9 @@ export const launcher_loc_defaults: LauncherLocState = {
|
|||||||
controller_client_id: null,
|
controller_client_id: null,
|
||||||
native_test_mode: false,
|
native_test_mode: false,
|
||||||
wallpaper_applied_url: null,
|
wallpaper_applied_url: null,
|
||||||
wallpaper_applied_url_external: null
|
wallpaper_applied_url_external: null,
|
||||||
|
file_display_overrides: {},
|
||||||
|
launch_profiles: null
|
||||||
// controller_cmd: null,
|
// controller_cmd: null,
|
||||||
// controller_trigger_send: null,
|
// controller_trigger_send: null,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -95,10 +95,9 @@ let open_file_error_detail: string | null = $state(null);
|
|||||||
|
|
||||||
let open_in_os_loading: boolean = $state(false);
|
let open_in_os_loading: boolean = $state(false);
|
||||||
|
|
||||||
/** Reactive display override for this file — stored in $events_loc (localStorage) not in the backend. */
|
/** Reactive display override for this file — stored locally (per-device) because event_file has no cfg_json column yet. */
|
||||||
const current_display_override = $derived.by(() => {
|
const current_display_override = $derived.by(() => {
|
||||||
const overrides = ((launcher_loc.current as Record<string, unknown>)?.file_display_overrides ?? {}) as Record<string, string>;
|
return (launcher_loc.current.file_display_overrides[event_file_id] ?? null) as 'extend' | 'mirror' | 'none' | null;
|
||||||
return (overrides[event_file_id] ?? null) as 'extend' | 'mirror' | 'none' | null;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/** State for the native test mode debug popup */
|
/** State for the native test mode debug popup */
|
||||||
@@ -143,11 +142,9 @@ function get_launch_profile(
|
|||||||
native_device?.launch_profiles ??
|
native_device?.launch_profiles ??
|
||||||
null;
|
null;
|
||||||
const local_profiles = launcher_loc.current?.launch_profiles ?? null;
|
const local_profiles = launcher_loc.current?.launch_profiles ?? null;
|
||||||
// Display override is stored per-device in $events_loc — not in the backend (event_file has no JSON column).
|
// Display override is stored per-device in launcher_loc — not in the backend (event_file has no cfg_json column yet).
|
||||||
// This is intentional: display mode is a room/device preference, not a global file property.
|
// This is intentional: display mode is a room/device preference, not a global file property.
|
||||||
const launcher_kv = launcher_loc.current as Record<string, unknown>;
|
const display_override = (launcher_loc.current.file_display_overrides[event_file_id] ?? null) as 'extend' | 'mirror' | 'none' | null;
|
||||||
const file_display_overrides = (launcher_kv?.file_display_overrides ?? {}) as Record<string, string>;
|
|
||||||
const display_override = (file_display_overrides[event_file_id] ?? null) as 'extend' | 'mirror' | 'none' | null;
|
|
||||||
|
|
||||||
// open_in_os = 'win' routes to the Windows-variant profile for apps that have one.
|
// open_in_os = 'win' routes to the Windows-variant profile for apps that have one.
|
||||||
// These profiles target Windows PowerPoint / LibreOffice / Acrobat running via Parallels or CrossOver.
|
// These profiles target Windows PowerPoint / LibreOffice / Acrobat running via Parallels or CrossOver.
|
||||||
@@ -749,14 +746,13 @@ function prevent_default<T extends Event>(fn: (event: T) => void) {
|
|||||||
onclick={() => {
|
onclick={() => {
|
||||||
const cur = current_display_override;
|
const cur = current_display_override;
|
||||||
const next: 'extend' | 'mirror' | null = !cur ? 'extend' : cur === 'extend' ? 'mirror' : null;
|
const next: 'extend' | 'mirror' | null = !cur ? 'extend' : cur === 'extend' ? 'mirror' : null;
|
||||||
const launcher = launcher_loc.current as Record<string, unknown>;
|
const new_overrides = { ...launcher_loc.current.file_display_overrides };
|
||||||
const new_overrides = { ...((launcher?.file_display_overrides ?? {}) as Record<string, string>) };
|
|
||||||
if (next === null) {
|
if (next === null) {
|
||||||
delete new_overrides[event_file_id];
|
delete new_overrides[event_file_id];
|
||||||
} else {
|
} else {
|
||||||
new_overrides[event_file_id] = next;
|
new_overrides[event_file_id] = next;
|
||||||
}
|
}
|
||||||
launcher.file_display_overrides = new_overrides;
|
launcher_loc.current.file_display_overrides = new_overrides;
|
||||||
}}
|
}}
|
||||||
class="btn btn-sm transition-all"
|
class="btn btn-sm transition-all"
|
||||||
class:preset-tonal-primary={current_display_override === 'extend'}
|
class:preset-tonal-primary={current_display_override === 'extend'}
|
||||||
|
|||||||
Reference in New Issue
Block a user