Skip to content

Commit d9dc13e

Browse files
[WIP] Connection flow changes for prototype version (#245)
- Remove wearing instructions dialog from connection flow - Default to Web Bluetooth connection - Update micro:bit V1 unsupported dialog - Add persistent visual cue for prototype version - Add link for ideas on connection micro:bit to wrist or object
1 parent 0aa4729 commit d9dc13e

12 files changed

+107
-167
lines changed

src/App.svelte

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,37 @@
55
-->
66

77
<script lang="ts">
8-
import OverlayView from './views/OverlayView.svelte';
9-
import PageContentView from './views/PageContentView.svelte';
10-
import {
11-
compatibility,
12-
hasSeenAppVersionRedirectDialog,
13-
isCompatibilityWarningDialogOpen,
14-
} from './script/stores/uiStore';
15-
import IncompatiblePlatformView from './views/IncompatiblePlatformView.svelte';
16-
import CompatibilityWarningDialog from './components/CompatibilityWarningDialog.svelte';
8+
import { onMount } from 'svelte';
9+
import { isLoading } from 'svelte-i18n';
10+
import { get } from 'svelte/store';
11+
import HomeIcon from 'virtual:icons/ri/home-2-line';
1712
import AppVersionRedirectDialog from './components/AppVersionRedirectDialog.svelte';
18-
import Router from './router/Router.svelte';
13+
import CompatibilityWarningDialog from './components/CompatibilityWarningDialog.svelte';
14+
import PrototypeVersionWarning from './components/PrototypeVersionWarning.svelte';
15+
import ConnectDialogContainer from './components/connection-prompt/ConnectDialogContainer.svelte';
1916
import ControlBar from './components/control-bar/ControlBar.svelte';
20-
import { t } from './i18n';
21-
import { consent } from './script/stores/complianceStore';
22-
import microbitLogoImage from './imgs/microbit-logo.svg';
23-
import appNameImage from './imgs/app-name.svg';
2417
import HelpMenu from './components/control-bar/control-bar-items/HelpMenu.svelte';
2518
import SettingsMenu from './components/control-bar/control-bar-items/SettingsMenu.svelte';
26-
import { onMount } from 'svelte';
27-
import ConnectDialogContainer from './components/connection-prompt/ConnectDialogContainer.svelte';
19+
import { t } from './i18n';
20+
import appNameImage from './imgs/app-name.svg';
21+
import microbitLogoImage from './imgs/microbit-logo.svg';
22+
import Router from './router/Router.svelte';
2823
import { Paths, currentPath, getTitle, navigate } from './router/paths';
29-
import HomeIcon from 'virtual:icons/ri/home-2-line';
30-
import { btSelectMicrobitDialogOnLoad } from './script/stores/connectionStore';
24+
import { consent } from './script/stores/complianceStore';
3125
import {
3226
ConnectDialogStates,
3327
connectionDialogState,
3428
} from './script/stores/connectDialogStore';
35-
import { isLoading } from 'svelte-i18n';
29+
import { btSelectMicrobitDialogOnLoad } from './script/stores/connectionStore';
30+
import {
31+
compatibility,
32+
hasSeenAppVersionRedirectDialog,
33+
isCompatibilityWarningDialogOpen,
34+
} from './script/stores/uiStore';
3635
import { fetchBrowserInfo } from './script/utils/api';
37-
import { get } from 'svelte/store';
36+
import IncompatiblePlatformView from './views/IncompatiblePlatformView.svelte';
37+
import OverlayView from './views/OverlayView.svelte';
38+
import PageContentView from './views/PageContentView.svelte';
3839
3940
let isPotentiallyNextGenUser: boolean = false;
4041
onMount(async () => {
@@ -104,6 +105,7 @@
104105
<HelpMenu />
105106
</div>
106107
</ControlBar>
108+
<PrototypeVersionWarning />
107109

108110
<div class="relative flex-1 flex-row">
109111
<PageContentView />
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!--
2+
(c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
3+
4+
SPDX-License-Identifier: MIT
5+
-->
6+
7+
<script lang="ts">
8+
import { t } from '../i18n';
9+
import WarningIcon from 'virtual:icons/ri/error-warning-line';
10+
</script>
11+
12+
<div
13+
class="bg-red-600 text-white px-10 py-2 space-x-5 flex items-center sticky top-16 z-5">
14+
<WarningIcon class="text-white text-2xl" />
15+
<p class="font-bold">{$t('prototype.warning')}</p>
16+
</div>

src/components/UnsupportedMicrobitWarningDialog.svelte

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
<script lang="ts">
88
import { t } from '../i18n';
9+
import { compatibility } from '../script/stores/uiStore';
910
import DialogHeading from './DialogHeading.svelte';
1011
import HtmlFormattedMessage, { linkWithProps } from './HtmlFormattedMessage.svelte';
1112
import StandardButton from './StandardButton.svelte';
@@ -18,24 +19,13 @@
1819
target: '_blank',
1920
rel: 'noopener',
2021
});
21-
const linkToBluetoothFlowId = 'link-to-bluetooth';
22-
const linkToBluetoothFlow = linkWithProps(
23-
{
24-
id: linkToBluetoothFlowId,
25-
},
26-
{ tag: 'button' },
27-
);
28-
// The elements in translated strings don't support Svelte event handlers
29-
// so we wire it up ourselves.
30-
const wireLinkToBluetoothFlow = (node: Element) => {
31-
const link = node.querySelector('#' + linkToBluetoothFlowId);
32-
link?.addEventListener('click', onStartBluetoothClick);
33-
return {
34-
destroy() {
35-
link?.removeEventListener('click', onStartBluetoothClick);
36-
},
37-
};
38-
};
22+
const linkWithPropsForMicrobitBluetoothSupport = linkWithProps({
23+
// TODO: Replace with real support link.
24+
href: 'https://support.microbit.org/support/home',
25+
target: '_blank',
26+
rel: 'noopener',
27+
});
28+
const { bluetooth } = $compatibility;
3929
</script>
4030

4131
<div class="w-175">
@@ -51,21 +41,30 @@
5141
},
5242
}} />
5343
</p>
54-
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
55-
<p use:wireLinkToBluetoothFlow>
56-
<HtmlFormattedMessage
57-
id={$t('connectMB.unsupportedMicrobit.advice')}
58-
options={{
59-
values: {
60-
link1: linkToBluetoothFlow,
61-
link2: linkWithPropsForMicrobitVersionSupport,
62-
},
63-
}} />
64-
</p>
44+
{#if bluetooth}
45+
<p>
46+
{$t('connectMB.unsupportedMicrobit.withBluetooth')}
47+
</p>
48+
{:else}
49+
<p>
50+
<HtmlFormattedMessage
51+
id={$t('connectMB.unsupportedMicrobit.withoutBluetooth')}
52+
options={{
53+
values: {
54+
link: linkWithPropsForMicrobitBluetoothSupport,
55+
},
56+
}} />
57+
</p>
58+
{/if}
6559
</div>
6660
<div class="flex justify-end">
67-
<StandardButton onClick={onClose} type="primary"
68-
>{$t('actions.close')}</StandardButton>
61+
{#if bluetooth}
62+
<StandardButton onClick={onStartBluetoothClick} type="primary"
63+
>{$t('connectMB.unsupportedMicrobit.ctaWithBluetooth')}</StandardButton>
64+
{:else}
65+
<StandardButton onClick={onClose} type="primary"
66+
>{$t('actions.close')}</StandardButton>
67+
{/if}
6968
</div>
7069
</div>
7170
</div>

src/components/WhatYouWillNeedDialog.svelte

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
2020
export let items: Item[];
2121
export let headingId: string;
22-
export let subtitleId: string | undefined = undefined;
2322
export let switchTextId: string;
2423
export let onSwitchClick: (() => void) | undefined;
2524
export let onNextClick: () => void;
@@ -31,9 +30,6 @@
3130
{#if $state.reconnectState.reconnectFailed}
3231
<span>{$t('reconnectFailed.subtitle')}</span>
3332
{/if}
34-
{#if subtitleId}
35-
{$t(subtitleId)}
36-
{/if}
3733
</p>
3834
<div class="inline-grid grid-cols-{items.length} gap-16 py-13 px-10">
3935
{#each items as item}

src/components/connection-prompt/ConnectDialogContainer.svelte

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
} from '../../script/stores/connectionStore';
2727
import { compatibility, state } from '../../script/stores/uiStore';
2828
import StandardDialog from '../dialogs/StandardDialog.svelte';
29-
import MicrobitWearingInstructionDialog from './MicrobitWearingInstructionDialog.svelte';
3029
import WebBluetoothTryAgain from './WebBluetoothTryAgain.svelte';
3130
import WebUsbTryAgain, { USBTryAgainType } from './WebUsbTryAgain.svelte';
3231
import BluetoothConnectDialog from './bluetooth/BluetoothConnectDialog.svelte';
@@ -246,7 +245,7 @@
246245
}
247246
: undefined}
248247
onNextClick={() => {
249-
$connectionDialogState.connectionState = ConnectDialogStates.WEARING_SETUP;
248+
$connectionDialogState.connectionState = ConnectDialogStates.CONNECT_CABLE;
250249
flashStage = 'radio-remote';
251250
}} />
252251
{:else if $connectionDialogState.connectionState === ConnectDialogStates.START_BLUETOOTH}
@@ -258,26 +257,7 @@
258257
}
259258
: undefined}
260259
onNextClick={() =>
261-
($connectionDialogState.connectionState = ConnectDialogStates.WEARING_SETUP)} />
262-
{:else if $connectionDialogState.connectionState === ConnectDialogStates.WEARING_SETUP}
263-
{#if flashStage === 'bluetooth'}
264-
<MicrobitWearingInstructionDialog
265-
{flashStage}
266-
onBackClick={() =>
267-
($connectionDialogState.connectionState =
268-
ConnectDialogStates.START_BLUETOOTH)}
269-
onNextClick={() =>
270-
($connectionDialogState.connectionState =
271-
ConnectDialogStates.CONNECT_CABLE)} />
272-
{:else if flashStage === 'radio-remote'}
273-
<MicrobitWearingInstructionDialog
274-
{flashStage}
275-
onBackClick={() =>
276-
($connectionDialogState.connectionState = ConnectDialogStates.START_RADIO)}
277-
onNextClick={() =>
278-
($connectionDialogState.connectionState =
279-
ConnectDialogStates.CONNECT_CABLE)} />
280-
{/if}
260+
($connectionDialogState.connectionState = ConnectDialogStates.CONNECT_CABLE)} />
281261
{:else if $connectionDialogState.connectionState === ConnectDialogStates.CONNECT_CABLE}
282262
{#if flashStage === 'bluetooth'}
283263
<ConnectCableDialog
@@ -287,7 +267,8 @@
287267
($connectionDialogState.connectionState =
288268
ConnectDialogStates.CONNECT_BATTERY)}
289269
onBackClick={() =>
290-
($connectionDialogState.connectionState = ConnectDialogStates.WEARING_SETUP)}
270+
($connectionDialogState.connectionState =
271+
ConnectDialogStates.START_BLUETOOTH)}
291272
onNextClick={() =>
292273
usb
293274
? ($connectionDialogState.connectionState =
@@ -306,7 +287,7 @@
306287
}
307288
: undefined}
308289
onBackClick={() =>
309-
($connectionDialogState.connectionState = ConnectDialogStates.WEARING_SETUP)}
290+
($connectionDialogState.connectionState = ConnectDialogStates.START_RADIO)}
310291
onNextClick={() => {
311292
$connectionDialogState.connectionState =
312293
ConnectDialogStates.CONNECT_TUTORIAL_USB;

src/components/connection-prompt/MicrobitWearingInstructionDialog.svelte

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/components/connection-prompt/bluetooth/ConnectBatteryDialog.svelte

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,34 @@
66

77
<script lang="ts">
88
import StandardButton from '../../StandardButton.svelte';
9+
import ExternalLinkIcon from 'virtual:icons/ri/external-link-line';
910
import { t } from '../../../i18n';
1011
import microbitConnectedImage from '../../../imgs/stylised-microbit-connected.svg';
1112
import DialogHeading from '../../DialogHeading.svelte';
1213
1314
export let onNextClick: () => void;
1415
export let onBackClick: () => void;
16+
17+
//TODO: Replace with real support link.
18+
const href = 'https://support.microbit.org/support/home';
1519
</script>
1620

1721
<div class="w-175">
1822
<DialogHeading>
1923
{$t('connectMB.connectBattery.heading')}
2024
</DialogHeading>
2125
<div class="space-y-5">
22-
<p>{$t('connectMB.connectBattery.subtitle')}</p>
26+
<p>
27+
{$t('connectMB.connectBattery.subtitle')}
28+
<a
29+
class="inline mr-auto gap-x-1 items-center text-link outline-none focus-visible:ring-4 focus-visible:ring-offset-1 focus-visible:ring-ring"
30+
{href}
31+
target="_blank"
32+
rel="noopener">
33+
{$t('connectMB.connectBattery.link')}
34+
<ExternalLinkIcon class="inline transform -translate-y-0.25" />
35+
</a>
36+
</p>
2337
<img src={microbitConnectedImage} alt="" class="w-68 h-229px m-auto" />
2438
</div>
2539
</div>

src/components/connection-prompt/bluetooth/StartBluetoothDialog.svelte

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
: usb
4848
? 'connectMB.bluetoothStart.heading'
4949
: 'connectMB.radioStart.heading'}
50-
subtitleId="connectMB.bluetoothStart.subtitle"
5150
switchTextId="connectMB.bluetoothStart.switchRadio"
5251
onSwitchClick={onStartRadioClick}
5352
{onNextClick} />

src/imgs/microbit_holder.png

-11.9 KB
Binary file not shown.

src/imgs/microbit_strap.png

-20.6 KB
Binary file not shown.

0 commit comments

Comments
 (0)