Skip to content

Commit b3dcebc

Browse files
Check that Web Bluetooth is available (#223)
Bluetooth can be blocked by system policies.
1 parent 57b2a32 commit b3dcebc

File tree

3 files changed

+6
-7
lines changed

3 files changed

+6
-7
lines changed

src/App.svelte

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
compatibility,
1212
isCompatibilityWarningDialogOpen,
1313
} from './script/stores/uiStore';
14-
import { checkCompatibility } from './script/compatibility/CompatibilityChecker';
1514
import IncompatiblePlatformView from './views/IncompatiblePlatformView.svelte';
1615
import CompatibilityWarningDialog from './components/CompatibilityWarningDialog.svelte';
1716
import Router from './router/Router.svelte';
@@ -23,7 +22,6 @@
2322
import HelpMenu from './components/control-bar/control-bar-items/HelpMenu.svelte';
2423
import SettingsMenu from './components/control-bar/control-bar-items/SettingsMenu.svelte';
2524
import { onMount } from 'svelte';
26-
import { get } from 'svelte/store';
2725
import ConnectDialogContainer from './components/connection-prompt/ConnectDialogContainer.svelte';
2826
import { Paths, currentPath, getTitle, navigate } from './router/paths';
2927
import HomeIcon from 'virtual:icons/ri/home-2-line';
@@ -34,7 +32,7 @@
3432
} from './script/stores/connectDialogStore';
3533
3634
onMount(() => {
37-
const { bluetooth, usb } = get(compatibility);
35+
const { bluetooth, usb } = $compatibility;
3836
// Value must switch from false to true after mount to trigger dialog transition
3937
isCompatibilityWarningDialogOpen.set(!bluetooth && !usb);
4038
@@ -55,7 +53,7 @@
5553

5654
<Router>
5755
<div class="sr-only" bind:this={routeAnnouncementEl} aria-live="polite" />
58-
{#if !checkCompatibility().platformAllowed}
56+
{#if !$compatibility.platformAllowed}
5957
<!-- Denies mobile users access to the platform -->
6058
<IncompatiblePlatformView />
6159
{:else}

src/script/compatibility/CompatibilityChecker.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type CompatibilityStatus = {
1515
webGL: boolean;
1616
};
1717

18-
export function checkCompatibility(): CompatibilityStatus {
18+
export async function checkCompatibility(): Promise<CompatibilityStatus> {
1919
if (localStorage.getItem('isTesting')) {
2020
return { bluetooth: true, usb: true, platformAllowed: true, webGL: true };
2121
}
@@ -37,9 +37,10 @@ export function checkCompatibility(): CompatibilityStatus {
3737
platformType = 'desktop';
3838
}
3939
const isPlatformAllowed = isDevMode || !nonAllowedPlatforms.includes(platformType);
40+
const bluetooth = navigator.bluetooth && (await navigator.bluetooth.getAvailability());
4041

4142
return {
42-
bluetooth: !!navigator.bluetooth,
43+
bluetooth,
4344
usb: !!navigator.usb,
4445
platformAllowed: isPlatformAllowed,
4546
webGL: webGL,

src/script/stores/uiStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { DeviceRequestStates } from '../microbit-interfacing/MicrobitConnection'
2020
let text: (key: string, vars?: object) => string;
2121
t.subscribe(t => (text = t));
2222

23-
export const compatibility = writable<CompatibilityStatus>(checkCompatibility());
23+
export const compatibility = writable<CompatibilityStatus>(await checkCompatibility());
2424

2525
export const isCompatibilityWarningDialogOpen = writable<boolean>(false);
2626

0 commit comments

Comments
 (0)