feat(web/m7-364): mount QueueDrawer + esc handler + restore on bootstrap

This commit is contained in:
2026-05-03 21:53:36 -04:00
parent 82846c9fcd
commit 49c8e5959e
2 changed files with 19 additions and 2 deletions
+15 -1
View File
@@ -6,12 +6,14 @@
import { queryClient } from '$lib/query/client'; import { queryClient } from '$lib/query/client';
import { user } from '$lib/auth/store.svelte'; import { user } from '$lib/auth/store.svelte';
import Shell from '$lib/components/Shell.svelte'; import Shell from '$lib/components/Shell.svelte';
import QueueDrawer from '$lib/components/QueueDrawer.svelte';
import { import {
registerAudioEl, registerAudioEl,
reportTimeUpdate, reportTimeUpdate,
reportDuration, reportDuration,
reportStateFromAudio, reportStateFromAudio,
player player,
closeQueueDrawer
} from '$lib/player/store.svelte'; } from '$lib/player/store.svelte';
import { useMediaSession } from '$lib/player/mediaSession.svelte'; import { useMediaSession } from '$lib/player/mediaSession.svelte';
import { useEventsDispatcher } from '$lib/player/events.svelte'; import { useEventsDispatcher } from '$lib/player/events.svelte';
@@ -65,6 +67,16 @@
} }
}); });
$effect(() => {
const handler = (e: KeyboardEvent) => {
if (e.key === 'Escape' && player.queueDrawerOpen) {
closeQueueDrawer();
}
};
document.addEventListener('keydown', handler);
return () => document.removeEventListener('keydown', handler);
});
useMediaSession(); useMediaSession();
useEventsDispatcher(); useEventsDispatcher();
applyMetaThemeColor(); applyMetaThemeColor();
@@ -82,6 +94,8 @@
onerror={() => reportStateFromAudio('error', audioEl?.error?.message)} onerror={() => reportStateFromAudio('error', audioEl?.error?.message)}
></audio> ></audio>
<QueueDrawer />
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
{#if user.value !== null && page.url.pathname !== '/login'} {#if user.value !== null && page.url.pathname !== '/login'}
<Shell>{@render children()}</Shell> <Shell>{@render children()}</Shell>
+4 -1
View File
@@ -1,10 +1,13 @@
import type { LayoutLoad } from './$types'; import type { LayoutLoad } from './$types';
import { bootstrap } from '$lib/auth/store.svelte'; import { bootstrap, user } from '$lib/auth/store.svelte';
import { restoreQueue } from '$lib/player/store.svelte';
export const ssr = false; // adapter-static fallback; we're SPA-only export const ssr = false; // adapter-static fallback; we're SPA-only
export const prerender = false; export const prerender = false;
export const load: LayoutLoad = async () => { export const load: LayoutLoad = async () => {
await bootstrap(); await bootstrap();
const userId = user.value?.id;
if (userId) restoreQueue(userId);
return {}; return {};
}; };