diff --git a/src/lib/dialogs/ConnectionFailed.svelte b/src/lib/dialogs/ConnectionFailed.svelte new file mode 100644 index 00000000..3f3c3156 --- /dev/null +++ b/src/lib/dialogs/ConnectionFailed.svelte @@ -0,0 +1,106 @@ + + + + {#if !navigator.serial} +

Incompatible Browser

+

Your browser does not support the Web Serial API.

+

Supported browsers are any Chromium based Browsers, such as

+ + {:else} +

Connection Failed

+
{message}
+

Troubleshooting Steps

+ + {/if} +
+ +
+
+ + diff --git a/src/lib/dialogs/connection-failed-dialog.ts b/src/lib/dialogs/connection-failed-dialog.ts new file mode 100644 index 00000000..33ec0b11 --- /dev/null +++ b/src/lib/dialogs/connection-failed-dialog.ts @@ -0,0 +1,24 @@ +import ConnectionFailed from "$lib/dialogs/ConnectionFailed.svelte"; +import { mount, unmount } from "svelte"; + +export async function showConnectionFailedDialog( + message: string, +): Promise { + let resolvePromise: (value: void) => void; + const resultPromise = new Promise((resolve) => { + resolvePromise = resolve; + }); + + const dialog = mount(ConnectionFailed, { + target: document.body, + props: { + message, + onclose: () => resolvePromise(), + }, + }); + + const result = await resultPromise; + unmount(dialog); + + return result; +} diff --git a/src/lib/serial/device.ts b/src/lib/serial/device.ts index 1a259ba2..2783fe2f 100644 --- a/src/lib/serial/device.ts +++ b/src/lib/serial/device.ts @@ -9,6 +9,7 @@ import { stringifyPhrase, } from "$lib/serial/chord"; import { browser } from "$app/environment"; +import { showConnectionFailedDialog } from "$lib/dialogs/connection-failed-dialog"; const PORT_FILTERS: Map = new Map([ ["ONE M0", { usbProductId: 32783, usbVendorId: 9114 }], @@ -142,9 +143,8 @@ export class CharaDevice { this.chipset = chipset as typeof this.chipset; this.keyCount = KEY_COUNTS[this.device]; } catch (e) { - alert(e); console.error(e); - throw e; + await showConnectionFailedDialog(String(e)); } } diff --git a/src/routes/(app)/Footer.svelte b/src/routes/(app)/Footer.svelte index fc024497..c7f19f7f 100644 --- a/src/routes/(app)/Footer.svelte +++ b/src/routes/(app)/Footer.svelte @@ -16,6 +16,7 @@ syncStatus, } from "$lib/serial/connection"; import { fade, slide } from "svelte/transition"; + import { showConnectionFailedDialog } from "$lib/dialogs/connection-failed-dialog"; let locale = $state( (browser && (localStorage.getItem("locale") as Locales)) || detectLocale(), @@ -52,9 +53,7 @@ await initSerial(true); } catch (error) { console.error(error); - alert( - "Connection failed. Is your device maybe pre-CCOS? Refer to the doc link in the bottom left for more information on your device.", - ); + await showConnectionFailedDialog(String(error)); } } diff --git a/src/routes/(app)/learn/sentence/+page.svelte b/src/routes/(app)/learn/sentence/+page.svelte index 193999ea..bf465a94 100644 --- a/src/routes/(app)/learn/sentence/+page.svelte +++ b/src/routes/(app)/learn/sentence/+page.svelte @@ -8,7 +8,6 @@ import TrackChords from "$lib/charrecorder/TrackChords.svelte"; import ChordHud from "$lib/charrecorder/ChordHud.svelte"; import type { InferredChord } from "$lib/charrecorder/core/types"; - import { onMount } from "svelte"; import TrackText from "$lib/charrecorder/TrackText.svelte"; import { browser } from "$app/environment"; import { expoOut } from "svelte/easing";