@robotical/webapp-types 0.6.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/application-manager.ts +20 -0
  2. package/dist-types/src/analytics/AnalyticsManager.d.ts +28 -0
  3. package/dist-types/src/analytics/AnalyticsManager.js +171 -0
  4. package/dist-types/src/application/ApplicationManager/ApplicationManager.d.ts +117 -0
  5. package/dist-types/src/application/ApplicationManager/ApplicationManager.js +567 -0
  6. package/dist-types/src/application/RAFTs/Cog/Cog.d.ts +50 -0
  7. package/dist-types/src/application/RAFTs/Cog/Cog.js +223 -0
  8. package/dist-types/src/application/RAFTs/Cog/PublishedDataAnalyser.d.ts +120 -0
  9. package/dist-types/src/application/RAFTs/Cog/PublishedDataAnalyser.js +533 -0
  10. package/dist-types/src/application/RAFTs/Marty/Marty.d.ts +42 -0
  11. package/dist-types/src/application/RAFTs/Marty/Marty.js +187 -0
  12. package/dist-types/src/application/RAFTs/RAFT.d.ts +114 -0
  13. package/dist-types/src/application/RAFTs/RAFT.js +341 -0
  14. package/dist-types/src/application/RAFTs/RAFTInterface.d.ts +13 -0
  15. package/dist-types/src/application/RAFTs/RAFTInterface.js +6 -0
  16. package/dist-types/src/application/RAFTs/RaftObserver.d.ts +10 -0
  17. package/dist-types/src/application/RAFTs/RaftObserver.js +1 -0
  18. package/dist-types/src/application/RAFTs/raft-subscription-helpers.d.ts +63 -0
  19. package/dist-types/src/application/RAFTs/raft-subscription-helpers.js +355 -0
  20. package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.d.ts +10 -0
  21. package/dist-types/src/application/communicators/SelfdestructiveMessagePromise.js +31 -0
  22. package/dist-types/src/application/communicators/WrapperCommunicator.d.ts +24 -0
  23. package/dist-types/src/application/communicators/WrapperCommunicator.js +137 -0
  24. package/dist-types/src/components/disposables/LoadingSpinner/index.d.ts +7 -0
  25. package/dist-types/src/components/disposables/LoadingSpinner/index.js +29 -0
  26. package/dist-types/src/components/disposables/buttons/SVGImageButton/index.d.ts +14 -0
  27. package/dist-types/src/components/disposables/buttons/SVGImageButton/index.js +19 -0
  28. package/dist-types/src/components/disposables/buttons/SimpleButton/index.d.ts +14 -0
  29. package/dist-types/src/components/disposables/buttons/SimpleButton/index.js +18 -0
  30. package/dist-types/src/components/modals/ SensorsDashboardModal/index.d.ts +2 -0
  31. package/dist-types/src/components/modals/ SensorsDashboardModal/index.js +61 -0
  32. package/dist-types/src/components/modals/ConnectingLoadingSpinnerModal/index.d.ts +3 -0
  33. package/dist-types/src/components/modals/ConnectingLoadingSpinnerModal/index.js +16 -0
  34. package/dist-types/src/components/modals/DetailedFeedbackModal/index.d.ts +5 -0
  35. package/dist-types/src/components/modals/DetailedFeedbackModal/index.js +37 -0
  36. package/dist-types/src/components/modals/DisconnectConfirmation/index.d.ts +1 -0
  37. package/dist-types/src/components/modals/DisconnectConfirmation/index.js +8 -0
  38. package/dist-types/src/components/modals/DisconnectConfirmation/styles.d.ts +1 -0
  39. package/dist-types/src/components/modals/DisconnectConfirmation/styles.js +7 -0
  40. package/dist-types/src/components/modals/InUnplugged/index.d.ts +1 -0
  41. package/dist-types/src/components/modals/InUnplugged/index.js +12 -0
  42. package/dist-types/src/components/modals/InUnplugged/styles.d.ts +5 -0
  43. package/dist-types/src/components/modals/InUnplugged/styles.js +11 -0
  44. package/dist-types/src/components/modals/VerificationModal/index.d.ts +6 -0
  45. package/dist-types/src/components/modals/VerificationModal/index.js +124 -0
  46. package/dist-types/src/components/modals/VerificationModalPhoneApp/index.d.ts +6 -0
  47. package/dist-types/src/components/modals/VerificationModalPhoneApp/index.js +195 -0
  48. package/dist-types/src/components/oneoffs/LEDs/index.d.ts +8 -0
  49. package/dist-types/src/components/oneoffs/LEDs/index.js +39 -0
  50. package/dist-types/src/components/oneoffs/RaftSignal/index.d.ts +7 -0
  51. package/dist-types/src/components/oneoffs/RaftSignal/index.js +29 -0
  52. package/dist-types/src/services/logger/Logger.d.ts +8 -0
  53. package/dist-types/src/services/logger/Logger.js +25 -0
  54. package/dist-types/src/state-observables/modal/DraggableModalState.d.ts +16 -0
  55. package/dist-types/src/state-observables/modal/DraggableModalState.js +52 -0
  56. package/dist-types/src/state-observables/modal/ModalObserver.d.ts +18 -0
  57. package/dist-types/src/state-observables/modal/ModalObserver.js +1 -0
  58. package/dist-types/src/state-observables/modal/ModalState.d.ts +25 -0
  59. package/dist-types/src/state-observables/modal/ModalState.js +71 -0
  60. package/dist-types/src/store/SelectedRaftContext.d.ts +19 -0
  61. package/dist-types/src/store/SelectedRaftContext.js +84 -0
  62. package/dist-types/src/styles/colors.d.ts +35 -0
  63. package/dist-types/src/styles/colors.js +42 -0
  64. package/dist-types/src/types/communication-between-apps/wrapper-communication.d.ts +48 -0
  65. package/dist-types/src/types/communication-between-apps/wrapper-communication.js +28 -0
  66. package/dist-types/src/types/events/raft-info.d.ts +10 -0
  67. package/dist-types/src/types/events/raft-info.js +11 -0
  68. package/dist-types/src/types/phone-app-communicator.d.ts +20 -0
  69. package/dist-types/src/types/phone-app-communicator.js +5 -0
  70. package/dist-types/src/types/raft.d.ts +18 -0
  71. package/dist-types/src/types/raft.js +14 -0
  72. package/dist-types/src/utils/Toaster.d.ts +13 -0
  73. package/dist-types/src/utils/Toaster.js +38 -0
  74. package/dist-types/src/utils/helpers/compare-version.d.ts +2 -0
  75. package/dist-types/src/utils/helpers/compare-version.js +19 -0
  76. package/dist-types/src/utils/helpers/randomHashGenerator.d.ts +1 -0
  77. package/dist-types/src/utils/helpers/randomHashGenerator.js +10 -0
  78. package/dist-types/src/utils/helpers/rescale-range.d.ts +2 -0
  79. package/dist-types/src/utils/helpers/rescale-range.js +4 -0
  80. package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.d.ts +3 -0
  81. package/dist-types/src/utils/helpers/wifi-configuration-subtitle-gen.js +34 -0
  82. package/dist-types/src/utils/phone-app-communication/is-phone-app.d.ts +5 -0
  83. package/dist-types/src/utils/phone-app-communication/is-phone-app.js +7 -0
  84. package/dist-types/src/wrapper-app/WrapperAppManager.d.ts +58 -0
  85. package/dist-types/src/wrapper-app/WrapperAppManager.js +176 -0
  86. package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.d.ts +24 -0
  87. package/dist-types/src/wrapper-app/communicators/WebAppCommunicator.js +243 -0
  88. package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.d.ts +40 -0
  89. package/dist-types/src/wrapper-app/connectors/CogConnector/CogConnector.js +209 -0
  90. package/dist-types/src/wrapper-app/connectors/Connector.d.ts +72 -0
  91. package/dist-types/src/wrapper-app/connectors/Connector.js +314 -0
  92. package/dist-types/src/wrapper-app/connectors/ConnectorFactory.d.ts +15 -0
  93. package/dist-types/src/wrapper-app/connectors/ConnectorFactory.js +99 -0
  94. package/dist-types/src/wrapper-app/connectors/ConnectorInterface.d.ts +10 -0
  95. package/dist-types/src/wrapper-app/connectors/ConnectorInterface.js +6 -0
  96. package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.d.ts +40 -0
  97. package/dist-types/src/wrapper-app/connectors/MartyConnector/MartyConnector.js +243 -0
  98. package/dist-types/types-package/application-manager.d.ts +17 -0
  99. package/dist-types/types-package/application-manager.js +5 -0
  100. package/package.json +13 -0
@@ -0,0 +1,19 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import "./styles.css";
14
+ export default function SVGImageButton(_a) {
15
+ var onClick = _a.onClick, title = _a.title, subtitle = _a.subtitle, SVGImage = _a.SVGImage, backgroundColour = _a.backgroundColour, titleColour = _a.titleColour, SVGColour = _a.SVGColour, disabled = _a.disabled;
16
+ return (_jsxs("div", __assign({ className: subtitle
17
+ ? "svg-image-button-container"
18
+ : "svg-image-button-container-no-sub", onClick: disabled ? function () { } : onClick, style: { backgroundColor: disabled ? "#f0f0f0" : backgroundColour, cursor: disabled ? "not-allowed" : "pointer" } }, { children: [_jsx("p", __assign({ className: subtitle ? "svg-image-button-title" : "svg-image-button-title-no-sub", style: { color: titleColour } }, { children: title })), subtitle && _jsx("p", __assign({ className: "svg-image-button-subtitle" }, { children: subtitle })), _jsx("div", __assign({ className: "svg-image-button-image-container" }, { children: _jsx(SVGImage, { fill: SVGColour }) }))] })));
19
+ }
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import "./styles.css";
3
+ type SimpleButtonProps = {
4
+ onClick: () => void;
5
+ title: string;
6
+ titleSize?: string;
7
+ disabled?: boolean;
8
+ colour?: string;
9
+ otherStyles?: React.CSSProperties;
10
+ borderColour?: string;
11
+ textColour?: string;
12
+ };
13
+ export default function SimpleButton({ onClick, title, titleSize, disabled, colour, otherStyles, borderColour, textColour }: SimpleButtonProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,18 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import "./styles.css";
14
+ export default function SimpleButton(_a) {
15
+ var onClick = _a.onClick, title = _a.title, titleSize = _a.titleSize, disabled = _a.disabled, colour = _a.colour, otherStyles = _a.otherStyles, borderColour = _a.borderColour, textColour = _a.textColour;
16
+ return (_jsx("div", __assign({ className: "simple-button-component " +
17
+ (disabled ? "simple-button-component-disabled" : ""), style: __assign(__assign({}, otherStyles), { fontSize: titleSize, backgroundColor: colour, border: borderColour && "1px solid ".concat(borderColour), color: textColour }), onClick: disabled ? function () { } : onClick }, { children: title })));
18
+ }
@@ -0,0 +1,2 @@
1
+ declare function SensorsDashboardModal(): import("react/jsx-runtime").JSX.Element;
2
+ export default SensorsDashboardModal;
@@ -0,0 +1,61 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { createElement, useEffect, useRef, useState } from 'react';
14
+ import SensorsDashboard from '@robotical/sensors-dashboard/dist/App';
15
+ import { ReactComponent as BetaSignSVG } from "../../../assets/beta-sign.svg";
16
+ import modalState from "../../../state-observables/modal/ModalState";
17
+ import DetailedFeedbackModal from '../DetailedFeedbackModal';
18
+ import styles from './styles.module.css';
19
+ function SensorsDashboardModal() {
20
+ var _a = useState(true), showBetaSign = _a[0], setShowBetaSign = _a[1];
21
+ var betaSignRef = useRef(null);
22
+ // if (window.mv2Dashboard) {
23
+ // window.mv2Dashboard.setIsModal(true);
24
+ // }
25
+ var updateBetaSignVisibility = function () {
26
+ if (!betaSignRef.current) {
27
+ return;
28
+ }
29
+ var parent = betaSignRef.current.parentElement;
30
+ if (!parent) {
31
+ return;
32
+ }
33
+ var parentHeight = parent.clientHeight;
34
+ if (parentHeight > 100) {
35
+ setShowBetaSign(true);
36
+ }
37
+ else {
38
+ setShowBetaSign(false);
39
+ }
40
+ };
41
+ useEffect(function () {
42
+ updateBetaSignVisibility();
43
+ if (!betaSignRef.current) {
44
+ return;
45
+ }
46
+ var resizeObserver = new ResizeObserver(function () {
47
+ updateBetaSignVisibility();
48
+ });
49
+ if (!betaSignRef.current.parentElement) {
50
+ return;
51
+ }
52
+ resizeObserver.observe(betaSignRef.current.parentElement);
53
+ return function () {
54
+ resizeObserver.disconnect();
55
+ };
56
+ }, [betaSignRef]);
57
+ return (_jsxs(_Fragment, { children: [_jsx("div", __assign({ style: { visibility: showBetaSign ? "visible" : "hidden" }, className: styles.betaSign, onClick: function () {
58
+ return modalState.setModal(createElement(DetailedFeedbackModal), "Anonymous Bug Report");
59
+ }, ref: betaSignRef }, { children: _jsx(BetaSignSVG, {}) })), _jsx(SensorsDashboard, { isInModal: true })] }));
60
+ }
61
+ export default SensorsDashboardModal;
@@ -0,0 +1,3 @@
1
+ type Props = {};
2
+ export default function ConnectingLoadingSpinnerModal({}: Props): import("react/jsx-runtime").JSX.Element;
3
+ export {};
@@ -0,0 +1,16 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import styles from "./styles.module.css";
14
+ export default function ConnectingLoadingSpinnerModal(_a) {
15
+ return (_jsx("div", __assign({ className: styles.container }, { children: "This shouldn't take long!" })));
16
+ }
@@ -0,0 +1,5 @@
1
+ type Props = {
2
+ otherInfoObject?: object;
3
+ };
4
+ export default function DetailedFeedbackModal({ otherInfoObject }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,37 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import { useState } from "react";
14
+ import modalState from "../../../state-observables/modal/ModalState";
15
+ import styles from "./styles.module.css";
16
+ import SimpleButton from "../../disposables/buttons/SimpleButton";
17
+ export default function DetailedFeedbackModal(_a) {
18
+ var otherInfoObject = _a.otherInfoObject;
19
+ var _b = useState(""), report = _b[0], setReport = _b[1];
20
+ var _c = useState(""), email = _c[0], setEmail = _c[1];
21
+ var _d = useState(false), reportSent = _d[0], setReportSent = _d[1];
22
+ var onReport = function () {
23
+ if (!report)
24
+ return;
25
+ if (!email) {
26
+ var confirm_1 = window.confirm("We noticed you didn't leave your email. Without it we won't be able to reach out and help you. If you want to leave your email, press cancel and fill in the email field, otherwise press OK to send the report without your email.");
27
+ if (!confirm_1)
28
+ return;
29
+ }
30
+ var reportWithContact = { text: "".concat(email ? email : "Anonymous", ": ").concat(report) };
31
+ window.applicationManager.analyticsManager.logEvent("textfeedback", __assign(__assign({}, reportWithContact), otherInfoObject));
32
+ setReportSent(true);
33
+ modalState.updateModalProps({ modalTitle: "🚀" });
34
+ setTimeout(function () { return modalState.closeModal(); }, 1500);
35
+ };
36
+ return (_jsx("div", __assign({ className: styles.bugReportModalContainer }, { children: reportSent ? ("Thank you for your feedback!") : (_jsxs(_Fragment, { children: [_jsxs("div", __assign({ className: styles.bugReportModalInfo }, { children: ["Please help up improve Marty! Please let us know if you spot any irregularities/bugs. ", _jsx("strong", __assign({ className: styles.bugReportModalInfoStrong }, { children: "You can optionally leave your contact details so we can reach out and help you" })), ". Thank you!"] })), _jsxs("div", __assign({ className: styles.bugReportModalForm }, { children: [_jsx("textarea", { className: styles.bugReportModalTextInput, placeholder: "Your report...", onChange: function (e) { return setReport(e.target.value); }, value: report }), _jsx("label", __assign({ className: styles.bugReportModalEmailLabel }, { children: "Provide your email if you want us to get back to you with a solution!" })), _jsx("input", { type: "email", className: styles.bugReportModalEmailInput, placeholder: "Email (optional)", onChange: function (e) { return setEmail(e.target.value); }, value: email })] })), _jsxs("div", __assign({ className: styles.bugReportModalButtons }, { children: [_jsx(SimpleButton, { onClick: function () { return modalState.closeModal(); }, title: "Cancel" }), _jsx(SimpleButton, { onClick: onReport, title: "Report" })] }))] })) })));
37
+ }
@@ -0,0 +1 @@
1
+ export default function DisconnectConfirmationModal(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import modalState from "../../../state-observables/modal/ModalState";
3
+ import { RED } from "../../../styles/colors";
4
+ import SimpleButton from "../../disposables/buttons/SimpleButton";
5
+ import { Container } from "./styles";
6
+ export default function DisconnectConfirmationModal() {
7
+ return (_jsxs(Container, { children: [_jsx(SimpleButton, { onClick: function () { return modalState.closeModal(false); }, title: "Cancel" }), _jsx(SimpleButton, { onClick: function () { return modalState.closeModal(true); }, title: "Disconnect", colour: RED })] }));
8
+ }
@@ -0,0 +1 @@
1
+ export declare const Container: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -0,0 +1,7 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ import styled from "styled-components";
6
+ export var Container = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: grid;\n grid-auto-flow: column;\n column-gap: 2rem;\n"], ["\n display: grid;\n grid-auto-flow: column;\n column-gap: 2rem;\n"])));
7
+ var templateObject_1;
@@ -0,0 +1 @@
1
+ export default function InUnpluggedModalContent(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CenteredView, StyledView, ModalText, ModalTitle, StyledImage, } from "./styles";
3
+ import imageAbutton from "../../../assets/marty-a-button.png";
4
+ import modalState from "../../../state-observables/modal/ModalState";
5
+ import SimpleButton from "../../disposables/buttons/SimpleButton";
6
+ export default function InUnpluggedModalContent() {
7
+ // disconnecting from marty as soon as
8
+ // the modal comes up because some users might
9
+ // try pressing A when the modal is still up.
10
+ // window.marty.disconnect();
11
+ return (_jsxs(StyledView, { children: [_jsx(ModalTitle, { children: "Couldn't connect to your Marty!" }), _jsx(ModalText, { children: "Your Marty is currently in unplugged mode. If you want to dissconect Marty from unplugged mode, please press the \"MODE\"/\"A\" button on the back of Marty and try again!" }), _jsx(StyledImage, { src: imageAbutton }), _jsx(CenteredView, { children: _jsx(SimpleButton, { title: "Got it!", onClick: function () { return modalState.closeModal(); } }) })] }));
12
+ }
@@ -0,0 +1,5 @@
1
+ export declare const StyledView: import("styled-components").StyledComponent<"div", any, {}, never>;
2
+ export declare const ModalText: import("styled-components").StyledComponent<"p", any, {}, never>;
3
+ export declare const ModalTitle: import("styled-components").StyledComponent<"p", any, {}, never>;
4
+ export declare const CenteredView: import("styled-components").StyledComponent<"div", any, {}, never>;
5
+ export declare const StyledImage: import("styled-components").StyledComponent<"img", any, {}, never>;
@@ -0,0 +1,11 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ import styled from "styled-components";
6
+ export var StyledView = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: grid;\n grid-template-areas: \"modal-title modal-title\" \"modal-info marty-img\" \"button button\";\n grid-template-columns: 1fr 1fr;\n background-color: white;\n border-radius: 2rem;\n align-items: center;\n max-width: 90vw;\n max-height: 90vh;\n row-gap: 1rem;\n"], ["\n display: grid;\n grid-template-areas: \"modal-title modal-title\" \"modal-info marty-img\" \"button button\";\n grid-template-columns: 1fr 1fr;\n background-color: white;\n border-radius: 2rem;\n align-items: center;\n max-width: 90vw;\n max-height: 90vh;\n row-gap: 1rem;\n"])));
7
+ export var ModalText = styled.p(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n grid-area: modal-info;\n font-family: \"Lato Regular\";\n text-align: center;\n"], ["\n grid-area: modal-info;\n font-family: \"Lato Regular\";\n text-align: center;\n"])));
8
+ export var ModalTitle = styled.p(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n grid-area: modal-title;\n font-size: 2.2rem;\n font-family: \"Lato Regular\";\n text-align: center;\n"], ["\n grid-area: modal-title;\n font-size: 2.2rem;\n font-family: \"Lato Regular\";\n text-align: center;\n"])));
9
+ export var CenteredView = styled.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n grid-area: button;\n flex-direction: row;\n"], ["\n grid-area: button;\n flex-direction: row;\n"])));
10
+ export var StyledImage = styled.img(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n grid-area: marty-img;\n max-height: 40vh;\n max-width: 40vw;\n justify-self: center;\n"], ["\n grid-area: marty-img;\n max-height: 40vh;\n max-width: 40vw;\n justify-self: center;\n"])));
11
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
@@ -0,0 +1,6 @@
1
+ import "./styles.css";
2
+ import RAFT from "../../../application/RAFTs/RAFT";
3
+ declare function VerificationModal({ connectedRAFT_ }: {
4
+ connectedRAFT_: RAFT;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export default VerificationModal;
@@ -0,0 +1,124 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
49
+ import { useEffect, useState } from "react";
50
+ import "./styles.css";
51
+ import { ReactComponent as BluetoothSVG } from "../../../assets/configuration/bluetooth.svg";
52
+ import { MAIN_BLUE } from "../../../styles/colors";
53
+ import modalState from "../../../state-observables/modal/ModalState";
54
+ import RICSignal from "../../oneoffs/RaftSignal";
55
+ import SimpleButton from "../../disposables/buttons/SimpleButton";
56
+ import LEDs from "../../oneoffs/LEDs";
57
+ import { raftConnectingSubscriptionHelper } from "../../../application/RAFTs/raft-subscription-helpers";
58
+ import { useConnectedRafts } from "../../../store/SelectedRaftContext";
59
+ var SHOW_LOGS = true;
60
+ var TAG = "VerificationModal";
61
+ function VerificationModal(_a) {
62
+ var _this = this;
63
+ var connectedRAFT_ = _a.connectedRAFT_;
64
+ var _b = useState([]), randomColours = _b[0], setRandomColours = _b[1];
65
+ var _c = useState(connectedRAFT_), connectedRaft = _c[0], setConnectedRaft = _c[1];
66
+ var _d = useState(-200), RSSI = _d[0], setRSSI = _d[1];
67
+ var removeConnectedRaft = useConnectedRafts().removeConnectedRaft;
68
+ useEffect(function () {
69
+ /* Subscribe to the connectedRaft's SIGNAL strength */
70
+ if (!connectedRaft)
71
+ return;
72
+ var signalUpdateTimout = setInterval(function () {
73
+ setRSSI(connectedRaft.getRSSI());
74
+ }, 1000);
75
+ return function () { return clearInterval(signalUpdateTimout); };
76
+ }, [connectedRaft]);
77
+ var onCancel = function () { return __awaiter(_this, void 0, void 0, function () {
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0:
81
+ // close modal, stop verification process, disconnect, scan again
82
+ modalState.closeModal();
83
+ if (!connectedRaft)
84
+ return [2 /*return*/];
85
+ removeConnectedRaft(connectedRaft.id);
86
+ return [4 /*yield*/, window.applicationManager.stopVerifyingRaft(connectedRaft.id, false)];
87
+ case 1:
88
+ _a.sent();
89
+ return [4 /*yield*/, connectedRaft.disconnect()];
90
+ case 2:
91
+ _a.sent();
92
+ return [2 /*return*/];
93
+ }
94
+ });
95
+ }); };
96
+ var onYes = function () { return __awaiter(_this, void 0, void 0, function () {
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0:
100
+ modalState.closeModal();
101
+ return [4 /*yield*/, (connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.stopVerifyingRaft(true))];
102
+ case 1:
103
+ _a.sent();
104
+ return [2 /*return*/];
105
+ }
106
+ });
107
+ }); };
108
+ useEffect(function () {
109
+ /* Subscribe to the connectedRaft's Connection state */
110
+ if (!connectedRaft)
111
+ return;
112
+ raftConnectingSubscriptionHelper(connectedRaft).subscribe(setRandomColours);
113
+ return function () {
114
+ raftConnectingSubscriptionHelper(connectedRaft).unsubscribe();
115
+ };
116
+ }, [connectedRaft]);
117
+ useEffect(function () {
118
+ /* Verify the connectedRaft once it's connected */
119
+ connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.verifyRaft();
120
+ }, [connectedRaft]);
121
+ var contentJSX = _jsxs("div", __assign({ className: "verification-modal-container" }, { children: [_jsxs("div", __assign({ className: "verification-modal-martys-container" }, { children: [_jsxs("div", __assign({ className: "verification-modal-marty-name-row-container" }, { children: [_jsx("p", __assign({ className: "verification-modal-marty-name" }, { children: connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.getFriendlyName() })), _jsx("div", __assign({ className: "verification-modal-marty-signal-container" }, { children: _jsx(RICSignal, { signalStrength: RSSI }) })), _jsx(BluetoothSVG, { fill: MAIN_BLUE })] })), _jsxs("p", __assign({ className: "verification-modal-martys-back-hint" }, { children: ["Look on ", connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.type, "'s back, is it displaying these lights?"] })), _jsxs("div", __assign({ className: "verification-modal-led-row-container" }, { children: [_jsx(LEDs, { coloursArr: randomColours, connectedRaft: connectedRaft }), _jsx(SimpleButton, { onClick: onCancel, title: "No", borderColour: "red", colour: "white", textColour: "red" }), _jsx(SimpleButton, { onClick: onYes, title: "YES" })] }))] })), _jsxs("div", __assign({ className: "verification-modal-bottom-btns-container" }, { children: [_jsx("div", { className: "dummy-gap" }), _jsx(SimpleButton, { onClick: onCancel, title: "CANCEL" })] }))] }));
122
+ return contentJSX;
123
+ }
124
+ export default VerificationModal;
@@ -0,0 +1,6 @@
1
+ import "./styles.css";
2
+ import { FOUND_RAFT_ON_DISCOVERY_RESPONSE } from "../../../types/phone-app-communicator";
3
+ declare function VerificationModalPhoneApp({ foundRICs }: {
4
+ foundRICs: FOUND_RAFT_ON_DISCOVERY_RESPONSE["foundRIC"][];
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export default VerificationModalPhoneApp;
@@ -0,0 +1,195 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
49
+ import { Fragment, useEffect, useState } from "react";
50
+ import "./styles.css";
51
+ import { ReactComponent as BluetoothSVG } from "../../../assets/configuration/bluetooth.svg";
52
+ import { ReactComponent as RefreshSVG } from "../../../assets/refresh.svg";
53
+ import { MAIN_BLUE, WHITE } from "../../../styles/colors";
54
+ import modalState from "../../../state-observables/modal/ModalState";
55
+ import RICSignal from "../../oneoffs/RaftSignal";
56
+ import SimpleButton from "../../disposables/buttons/SimpleButton";
57
+ import LEDs from "../../oneoffs/LEDs";
58
+ import SVGImageButton from "../../disposables/buttons/SVGImageButton";
59
+ import { raftConnectingSubscriptionHelper, raftDiscoveryFinishedSubscriptionHelper, raftDiscoveryStartedSubscriptionHelper } from "../../../application/RAFTs/raft-subscription-helpers";
60
+ import isPhoneApp from "../../../utils/phone-app-communication/is-phone-app";
61
+ import LoadingSpinner from "../../disposables/LoadingSpinner";
62
+ import { RaftConnectionMethod } from "../../../types/raft";
63
+ import { useConnectedRafts } from "../../../store/SelectedRaftContext";
64
+ import { ConnManager } from "@robotical/roboticaljs";
65
+ var SHOW_LOGS = true;
66
+ var TAG = "VerificationModalPhone";
67
+ function VerificationModalPhoneApp(_a) {
68
+ var _this = this;
69
+ var foundRICs = _a.foundRICs;
70
+ var _b = useState([]), randomColours = _b[0], setRandomColours = _b[1];
71
+ var _c = useState(-1), selectedRICIdx = _c[0], setSelectedRICIdx = _c[1];
72
+ var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
73
+ var _e = useState(isPhoneApp()), isScanning = _e[0], setIsScanning = _e[1];
74
+ var _f = useState(), connectedRaft = _f[0], setConnectedRaft = _f[1];
75
+ var removeConnectedRaft = useConnectedRafts().removeConnectedRaft;
76
+ useEffect(function () {
77
+ raftDiscoveryFinishedSubscriptionHelper().subscribe(function () { return setIsScanning(false); });
78
+ raftDiscoveryStartedSubscriptionHelper().subscribe(function () { return setIsScanning(true); });
79
+ return function () {
80
+ raftDiscoveryFinishedSubscriptionHelper().unsubscribe();
81
+ raftDiscoveryStartedSubscriptionHelper().unsubscribe();
82
+ };
83
+ }, []);
84
+ var onCancel = function () { return __awaiter(_this, void 0, void 0, function () {
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ if (!connectedRaft) return [3 /*break*/, 3];
89
+ return [4 /*yield*/, window.applicationManager.stopVerifyingRaft(connectedRaft.id, false)];
90
+ case 1:
91
+ _a.sent();
92
+ return [4 /*yield*/, window.applicationManager.disconnectFromRaft(connectedRaft.id)];
93
+ case 2:
94
+ _a.sent();
95
+ removeConnectedRaft(connectedRaft.id);
96
+ return [3 /*break*/, 5];
97
+ case 3: return [4 /*yield*/, window.applicationManager.stopDiscovery()];
98
+ case 4:
99
+ _a.sent();
100
+ _a.label = 5;
101
+ case 5:
102
+ modalState.closeModal();
103
+ return [2 /*return*/];
104
+ }
105
+ });
106
+ }); };
107
+ var onScanAgain = function () { return __awaiter(_this, void 0, void 0, function () {
108
+ return __generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0:
111
+ if (!connectedRaft) return [3 /*break*/, 3];
112
+ return [4 /*yield*/, window.applicationManager.stopVerifyingRaft(connectedRaft.id, false)];
113
+ case 1:
114
+ _a.sent();
115
+ return [4 /*yield*/, window.applicationManager.disconnectFromRaft(connectedRaft.id)];
116
+ case 2:
117
+ _a.sent();
118
+ _a.label = 3;
119
+ case 3:
120
+ setSelectedRICIdx(-1);
121
+ setConnectedRaft(undefined);
122
+ if (!window.applicationManager.ricSelectedCb) return [3 /*break*/, 5];
123
+ return [4 /*yield*/, window.applicationManager.startDiscovery(window.applicationManager.ricSelectedCb, [ConnManager.COGUUID, ConnManager.RICUUID])];
124
+ case 4:
125
+ _a.sent();
126
+ _a.label = 5;
127
+ case 5: return [2 /*return*/];
128
+ }
129
+ });
130
+ }); };
131
+ var onYes = function () { return __awaiter(_this, void 0, void 0, function () {
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0:
135
+ modalState.closeModal();
136
+ return [4 /*yield*/, (connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.stopVerifyingRaft(true))];
137
+ case 1:
138
+ _a.sent();
139
+ return [2 /*return*/];
140
+ }
141
+ });
142
+ }); };
143
+ useEffect(function () {
144
+ if (!connectedRaft)
145
+ return;
146
+ raftConnectingSubscriptionHelper(connectedRaft).subscribe(setRandomColours);
147
+ connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.verifyRaftPhoneApp(foundRICs[selectedRICIdx]);
148
+ return function () {
149
+ raftConnectingSubscriptionHelper(connectedRaft).unsubscribe();
150
+ };
151
+ }, [connectedRaft]);
152
+ var onSelectRaft = function (raftIdx) { return __awaiter(_this, void 0, void 0, function () {
153
+ var foundRaft, newRaft;
154
+ return __generator(this, function (_a) {
155
+ switch (_a.label) {
156
+ case 0:
157
+ setIsLoading(true);
158
+ if (!connectedRaft) return [3 /*break*/, 3];
159
+ return [4 /*yield*/, window.applicationManager.stopVerifyingRaft(connectedRaft.id, false)];
160
+ case 1:
161
+ _a.sent();
162
+ return [4 /*yield*/, window.applicationManager.disconnectFromRaft(connectedRaft.id)];
163
+ case 2:
164
+ _a.sent();
165
+ removeConnectedRaft(connectedRaft.id);
166
+ _a.label = 3;
167
+ case 3:
168
+ setSelectedRICIdx(raftIdx);
169
+ if (!foundRICs) return [3 /*break*/, 5];
170
+ foundRaft = foundRICs[raftIdx];
171
+ return [4 /*yield*/, window.applicationManager.selectRaft(foundRaft, RaftConnectionMethod.PHONE_BLE)];
172
+ case 4:
173
+ newRaft = _a.sent();
174
+ if (!newRaft)
175
+ return [2 /*return*/];
176
+ setConnectedRaft(newRaft);
177
+ _a.label = 5;
178
+ case 5:
179
+ setIsLoading(false);
180
+ return [2 /*return*/];
181
+ }
182
+ });
183
+ }); };
184
+ var contentJSX = null;
185
+ if (foundRICs.length === 0) {
186
+ contentJSX = _jsxs("div", __assign({ className: "verification-modal-container" }, { children: [!isScanning && _jsx("p", __assign({ style: { alignSelf: 'center' } }, { children: "No Robots Found" })), _jsx("div", __assign({ className: "verification-modal-martys-container" }, { children: isScanning && _jsxs("div", __assign({ style: { margin: "auto", width: "50px", height: "50px" } }, { children: [" ", _jsx(LoadingSpinner, {}), " "] })) })), _jsxs("div", __assign({ className: "verification-modal-bottom-btns-container" }, { children: [_jsx(SVGImageButton, { onClick: onScanAgain, title: "SCAN AGAIN", SVGImage: RefreshSVG, backgroundColour: MAIN_BLUE, titleColour: WHITE, SVGColour: WHITE }), _jsx("div", { className: "dummy-gap" }), _jsx(SimpleButton, { onClick: onCancel, title: "CANCEL" })] }))] }));
187
+ }
188
+ else {
189
+ contentJSX = _jsxs("div", __assign({ className: "verification-modal-container" }, { children: [_jsxs("div", __assign({ className: "verification-modal-martys-container" }, { children: [isScanning && _jsxs("div", __assign({ style: { margin: "auto", width: "50px", height: "50px" } }, { children: [" ", _jsx(LoadingSpinner, {}), " "] })), foundRICs.map(function (raftObj, raftIdx) {
190
+ return _jsxs(Fragment, { children: [_jsxs("div", __assign({ className: "verification-modal-marty-name-row-container", onClick: function () { return onSelectRaft(raftIdx); } }, { children: [_jsx("p", __assign({ className: "verification-modal-marty-name" }, { children: raftObj._localName })), _jsx("div", __assign({ className: "verification-modal-marty-signal-container" }, { children: _jsx(RICSignal, { signalStrength: raftObj._rssi }) })), _jsx(BluetoothSVG, { fill: MAIN_BLUE })] })), selectedRICIdx === raftIdx && _jsxs("div", { children: [_jsx("p", __assign({ className: "verification-modal-martys-back-hint" }, { children: isLoading ? "Loading..." : "Look on ".concat(connectedRaft === null || connectedRaft === void 0 ? void 0 : connectedRaft.type, "'s back, is it displaying these lights?") })), _jsxs("div", __assign({ className: "verification-modal-led-row-container" }, { children: [_jsx(LEDs, { coloursArr: randomColours, connectedRaft: connectedRaft }), !isLoading && _jsx(SimpleButton, { onClick: onCancel, title: "No", borderColour: "red", colour: "white", textColour: "red" }), !isLoading && _jsx(SimpleButton, { onClick: onYes, title: "YES" })] }))] })] }, raftIdx);
191
+ })] })), _jsxs("div", __assign({ className: "verification-modal-bottom-btns-container" }, { children: [_jsx(SVGImageButton, { onClick: onScanAgain, title: "SCAN AGAIN", SVGImage: RefreshSVG, backgroundColour: MAIN_BLUE, titleColour: WHITE, SVGColour: WHITE, disabled: isScanning }), _jsx("div", { className: "dummy-gap" }), _jsx(SimpleButton, { onClick: onCancel, title: "CANCEL" })] }))] }));
192
+ }
193
+ return contentJSX;
194
+ }
195
+ export default VerificationModalPhoneApp;
@@ -0,0 +1,8 @@
1
+ import "./styles.css";
2
+ import RAFT from "../../../application/RAFTs/RAFT";
3
+ type LEDsProps = {
4
+ coloursArr: string[];
5
+ connectedRaft: RAFT | undefined;
6
+ };
7
+ export default function LEDs({ coloursArr, connectedRaft }: LEDsProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};