Skip to content

Commit 14e8791

Browse files
committed
refactor: use $effect for audio permission coordination
Move audio permission request from MIDI store to layout using Svelte 5's $effect rune. This decouples the stores and handles cross-cutting concerns at the coordination layer, following Svelte 5 best practices.
1 parent 0e00497 commit 14e8791

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/lib/stores/midi.svelte.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { getCurrentFirmwareVersion } from '$lib/config/firmware';
44
import { createLogger, isMidiRealtimeMessage, isMidiSystemMessage } from '$lib/utils/logger';
5-
import { requestPermission as requestAudioPermission } from '$lib/stores/audioInput.svelte';
65

76
interface MidiState {
87
access: MIDIAccess | null;
@@ -302,12 +301,6 @@ function connectDevice(deviceId: string) {
302301
}
303302
_setDeviceConnected(output, input || null);
304303
logger.info('Connected to MIDI device: ' + output.name);
305-
306-
// Request audio recording permission proactively after device connection
307-
// This improves UX by not interrupting the user during recording
308-
requestAudioPermission().catch((error) => {
309-
logger.warn('Failed to request audio permission: ' + (error instanceof Error ? error.message : String(error)));
310-
});
311304
} else {
312305
_setDeviceConnectionError('Selected device not found.');
313306
logger.error('Device not found: ' + deviceId);

src/routes/+layout.svelte

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,32 @@
22
import '../app.css';
33
import { locale } from 'svelte-i18n';
44
import { isDraggingOverWindow } from '$lib/stores/dragDropStore';
5-
import { initialize as initializeAudioInput } from '$lib/stores/audioInput.svelte';
5+
import { midiState } from '$lib/stores/midi.svelte';
6+
import { initialize as initializeAudioInput, requestPermission } from '$lib/stores/audioInput.svelte';
67
import { onMount } from 'svelte';
8+
import { createLogger } from '$lib/utils/logger';
79
import Footer from '$lib/components/Footer.svelte';
810
11+
const logger = createLogger('Layout');
12+
913
let { children } = $props();
1014
1115
// Initialize audio input store on mount
1216
onMount(() => {
1317
initializeAudioInput();
1418
});
1519
20+
// Request audio permission when MIDI device connects
21+
// This improves UX by avoiding interruption during recording
22+
$effect(() => {
23+
if (midiState.isConnected) {
24+
logger.info('MIDI device connected, requesting audio permission...');
25+
requestPermission().catch((error) => {
26+
logger.warn('Failed to request audio permission: ' + (error instanceof Error ? error.message : String(error)));
27+
});
28+
}
29+
});
30+
1631
const locales = [
1732
{ code: 'en', name: 'English' },
1833
{ code: 'de', name: 'Deutsch' },

0 commit comments

Comments
 (0)