@wandelbots/wandelbots-js-react-components 1.11.2 → 1.11.4
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.
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1572 -1559
- package/dist/index.js.map +1 -1
- package/dist/src/components/3d-viewport/SafetyZonesRenderer.d.ts.map +1 -1
- package/dist/src/components/modal/NoMotionGroupModal.d.ts +3 -2
- package/dist/src/components/modal/NoMotionGroupModal.d.ts.map +1 -1
- package/dist/stories/SafetyZonesRenderer.stories.d.ts +147 -0
- package/dist/stories/SafetyZonesRenderer.stories.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/3d-viewport/SafetyZonesRenderer.tsx +51 -0
- package/src/components/modal/NoMotionGroupModal.tsx +69 -71
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafetyZonesRenderer.d.ts","sourceRoot":"","sources":["../../../../src/components/3d-viewport/SafetyZonesRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAItE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,qBAAqB,EAAE,CAAA;CACrC,GAAG,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"SafetyZonesRenderer.d.ts","sourceRoot":"","sources":["../../../../src/components/3d-viewport/SafetyZonesRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAItE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,qBAAqB,EAAE,CAAA;CACrC,GAAG,UAAU,CAAA;AAqCd,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,GAAG,KAAK,EACT,EAAE,wBAAwB,2CA+D1B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export type NoMotionGroupModalProps = {
|
|
2
|
+
baseUrl: string;
|
|
3
3
|
};
|
|
4
|
+
export declare function NoMotionGroupModal({ baseUrl, ...props }: NoMotionGroupModalProps): import("react/jsx-runtime").JSX.Element;
|
|
4
5
|
//# sourceMappingURL=NoMotionGroupModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoMotionGroupModal.d.ts","sourceRoot":"","sources":["../../../../src/components/modal/NoMotionGroupModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NoMotionGroupModal.d.ts","sourceRoot":"","sources":["../../../../src/components/modal/NoMotionGroupModal.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAsB,EACtB,GAAG,KAAK,EACT,EAAE,uBAAuB,2CAkEzB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Euler, Vector3, WebGLRenderer } from "three";
|
|
2
|
+
import { SafetyZonesRenderer } from "../src";
|
|
3
|
+
import type { SafetySetupSafetyZone } from "@wandelbots/wandelbots-js";
|
|
4
|
+
declare const _default: {
|
|
5
|
+
tags: string[];
|
|
6
|
+
title: string;
|
|
7
|
+
component: typeof SafetyZonesRenderer;
|
|
8
|
+
decorators: ((Story: import("@storybook/csf").PartialStoryFn<import("@storybook/react").ReactRenderer, {
|
|
9
|
+
safetyZones: SafetySetupSafetyZone[];
|
|
10
|
+
ref?: import("react").Ref<import("three").Group<import("three").Object3DEventMap>> | undefined;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
attach?: import("@react-three/fiber/dist/declarations/src/core/renderer").AttachType | undefined;
|
|
13
|
+
args?: [] | undefined;
|
|
14
|
+
key?: React.Key | undefined;
|
|
15
|
+
onUpdate?: ((self: import("three").Group<import("three").Object3DEventMap>) => void) | undefined;
|
|
16
|
+
readonly type?: string | undefined;
|
|
17
|
+
toJSON?: ((meta?: import("three").JSONMeta) => import("three").Object3DJSON) | undefined;
|
|
18
|
+
readonly isObject3D?: true | undefined;
|
|
19
|
+
readonly id?: number | undefined;
|
|
20
|
+
uuid?: string | undefined;
|
|
21
|
+
name?: string | undefined;
|
|
22
|
+
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
23
|
+
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
24
|
+
readonly normalMatrix?: import("three").Matrix3 | undefined;
|
|
25
|
+
matrixWorld?: import("three").Matrix4 | undefined;
|
|
26
|
+
matrixAutoUpdate?: boolean | undefined;
|
|
27
|
+
matrixWorldAutoUpdate?: boolean | undefined;
|
|
28
|
+
matrixWorldNeedsUpdate?: boolean | undefined;
|
|
29
|
+
visible?: boolean | undefined;
|
|
30
|
+
castShadow?: boolean | undefined;
|
|
31
|
+
receiveShadow?: boolean | undefined;
|
|
32
|
+
frustumCulled?: boolean | undefined;
|
|
33
|
+
renderOrder?: number | undefined;
|
|
34
|
+
animations?: import("three").AnimationClip[] | undefined;
|
|
35
|
+
userData?: Record<string, any> | undefined;
|
|
36
|
+
customDepthMaterial?: import("three").Material | undefined;
|
|
37
|
+
customDistanceMaterial?: import("three").Material | undefined;
|
|
38
|
+
onBeforeShadow?: ((renderer: WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry, depthMaterial: import("three").Material, group: import("three").Group) => void) | undefined;
|
|
39
|
+
onAfterShadow?: ((renderer: WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry, depthMaterial: import("three").Material, group: import("three").Group) => void) | undefined;
|
|
40
|
+
onBeforeRender?: ((renderer: WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry, material: import("three").Material, group: import("three").Group) => void) | undefined;
|
|
41
|
+
onAfterRender?: ((renderer: WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry, material: import("three").Material, group: import("three").Group) => void) | undefined;
|
|
42
|
+
applyMatrix4?: ((matrix: import("three").Matrix4) => void) | undefined;
|
|
43
|
+
applyQuaternion?: ((quaternion: import("three").Quaternion) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
44
|
+
setRotationFromAxisAngle?: ((axis: Vector3, angle: number) => void) | undefined;
|
|
45
|
+
setRotationFromEuler?: ((euler: Euler) => void) | undefined;
|
|
46
|
+
setRotationFromMatrix?: ((m: import("three").Matrix4) => void) | undefined;
|
|
47
|
+
setRotationFromQuaternion?: ((q: import("three").Quaternion) => void) | undefined;
|
|
48
|
+
rotateOnAxis?: ((axis: Vector3, angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
49
|
+
rotateOnWorldAxis?: ((axis: Vector3, angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
50
|
+
rotateX?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
51
|
+
rotateY?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
52
|
+
rotateZ?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
53
|
+
translateOnAxis?: ((axis: Vector3, distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
54
|
+
translateX?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
55
|
+
translateY?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
56
|
+
translateZ?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
57
|
+
localToWorld?: ((vector: Vector3) => Vector3) | undefined;
|
|
58
|
+
worldToLocal?: ((vector: Vector3) => Vector3) | undefined;
|
|
59
|
+
lookAt?: {
|
|
60
|
+
(vector: Vector3): void;
|
|
61
|
+
(x: number, y: number, z: number): void;
|
|
62
|
+
} | undefined;
|
|
63
|
+
add?: ((...object: import("three").Object3D[]) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
64
|
+
remove?: ((...object: import("three").Object3D[]) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
65
|
+
removeFromParent?: (() => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
66
|
+
clear?: (() => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
67
|
+
getObjectById?: ((id: number) => import("three").Object3D | undefined) | undefined;
|
|
68
|
+
getObjectByName?: ((name: string) => import("three").Object3D | undefined) | undefined;
|
|
69
|
+
getObjectByProperty?: ((name: string, value: any) => import("three").Object3D | undefined) | undefined;
|
|
70
|
+
getObjectsByProperty?: ((name: string, value: any, optionalTarget?: import("three").Object3D[]) => import("three").Object3D[]) | undefined;
|
|
71
|
+
getWorldPosition?: ((target: Vector3) => Vector3) | undefined;
|
|
72
|
+
getWorldQuaternion?: ((target: import("three").Quaternion) => import("three").Quaternion) | undefined;
|
|
73
|
+
getWorldScale?: ((target: Vector3) => Vector3) | undefined;
|
|
74
|
+
getWorldDirection?: ((target: Vector3) => Vector3) | undefined;
|
|
75
|
+
raycast?: ((raycaster: import("three").Raycaster, intersects: import("three").Intersection[]) => void) | undefined;
|
|
76
|
+
traverse?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
|
|
77
|
+
traverseVisible?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
|
|
78
|
+
traverseAncestors?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
|
|
79
|
+
updateMatrix?: (() => void) | undefined;
|
|
80
|
+
updateMatrixWorld?: ((force?: boolean) => void) | undefined;
|
|
81
|
+
updateWorldMatrix?: ((updateParents: boolean, updateChildren: boolean) => void) | undefined;
|
|
82
|
+
clone?: ((recursive?: boolean) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
83
|
+
copy?: ((object: import("three").Object3D, recursive?: boolean) => import("three").Group<import("three").Object3DEventMap>) | undefined;
|
|
84
|
+
addEventListener?: {
|
|
85
|
+
<T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): void;
|
|
86
|
+
<T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): void;
|
|
87
|
+
} | undefined;
|
|
88
|
+
hasEventListener?: {
|
|
89
|
+
<T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): boolean;
|
|
90
|
+
<T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): boolean;
|
|
91
|
+
} | undefined;
|
|
92
|
+
removeEventListener?: {
|
|
93
|
+
<T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): void;
|
|
94
|
+
<T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): void;
|
|
95
|
+
} | undefined;
|
|
96
|
+
dispatchEvent?: (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | undefined;
|
|
97
|
+
readonly isGroup?: true | undefined;
|
|
98
|
+
position?: import("@react-three/fiber").Vector3 | undefined;
|
|
99
|
+
up?: import("@react-three/fiber").Vector3 | undefined;
|
|
100
|
+
scale?: import("@react-three/fiber").Vector3 | undefined;
|
|
101
|
+
rotation?: import("@react-three/fiber").Euler | undefined;
|
|
102
|
+
matrix?: import("@react-three/fiber").Matrix4 | undefined;
|
|
103
|
+
quaternion?: import("@react-three/fiber").Quaternion | undefined;
|
|
104
|
+
layers?: import("@react-three/fiber").Layers | undefined;
|
|
105
|
+
dispose?: ((() => void) | null) | undefined;
|
|
106
|
+
onClick?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
|
|
107
|
+
onContextMenu?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
|
|
108
|
+
onDoubleClick?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
|
|
109
|
+
onPointerUp?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
110
|
+
onPointerDown?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
111
|
+
onPointerOver?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
112
|
+
onPointerOut?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
113
|
+
onPointerEnter?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
114
|
+
onPointerLeave?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
115
|
+
onPointerMove?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
116
|
+
onPointerMissed?: ((event: MouseEvent) => void) | undefined;
|
|
117
|
+
onPointerCancel?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
|
|
118
|
+
onWheel?: ((event: import("@react-three/fiber").ThreeEvent<WheelEvent>) => void) | undefined;
|
|
119
|
+
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
120
|
+
};
|
|
121
|
+
export default _default;
|
|
122
|
+
export declare const SafetyZonesRendererSt: {
|
|
123
|
+
args: {};
|
|
124
|
+
render: (args: {
|
|
125
|
+
safetyZones: SafetySetupSafetyZone[];
|
|
126
|
+
} & Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<import("three").Group<import("three").Object3DEventMap>>, import("@react-three/fiber").NodeProps<import("three").Group<import("three").Object3DEventMap>, typeof import("three").Group>>>, import("@react-three/fiber").NonFunctionKeys<{
|
|
127
|
+
position?: import("@react-three/fiber").Vector3;
|
|
128
|
+
up?: import("@react-three/fiber").Vector3;
|
|
129
|
+
scale?: import("@react-three/fiber").Vector3;
|
|
130
|
+
rotation?: import("@react-three/fiber").Euler;
|
|
131
|
+
matrix?: import("@react-three/fiber").Matrix4;
|
|
132
|
+
quaternion?: import("@react-three/fiber").Quaternion;
|
|
133
|
+
layers?: import("@react-three/fiber").Layers;
|
|
134
|
+
dispose?: (() => void) | null;
|
|
135
|
+
}>> & {
|
|
136
|
+
position?: import("@react-three/fiber").Vector3;
|
|
137
|
+
up?: import("@react-three/fiber").Vector3;
|
|
138
|
+
scale?: import("@react-three/fiber").Vector3;
|
|
139
|
+
rotation?: import("@react-three/fiber").Euler;
|
|
140
|
+
matrix?: import("@react-three/fiber").Matrix4;
|
|
141
|
+
quaternion?: import("@react-three/fiber").Quaternion;
|
|
142
|
+
layers?: import("@react-three/fiber").Layers;
|
|
143
|
+
dispose?: (() => void) | null;
|
|
144
|
+
} & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers) => import("react/jsx-runtime").JSX.Element;
|
|
145
|
+
name: string;
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=SafetyZonesRenderer.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SafetyZonesRenderer.stories.d.ts","sourceRoot":"","sources":["../../stories/SafetyZonesRenderer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;;;;;;;;mBAuEtD,MAAA,SAAI;;;cAEF,MAAA,GAAR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAtEV,wBAuB4C;AA0c5C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;CAIjB,CAAA"}
|
package/package.json
CHANGED
|
@@ -8,6 +8,41 @@ export type SafetyZonesRendererProps = {
|
|
|
8
8
|
safetyZones: SafetySetupSafetyZone[]
|
|
9
9
|
} & GroupProps
|
|
10
10
|
|
|
11
|
+
interface CoplanarityResult {
|
|
12
|
+
isCoplanar: boolean
|
|
13
|
+
normal?: THREE.Vector3
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function areVerticesCoplanar(vertices: THREE.Vector3[]): CoplanarityResult {
|
|
17
|
+
if (vertices.length < 3) {
|
|
18
|
+
console.log("Not enough vertices to define a plane")
|
|
19
|
+
return { isCoplanar: false }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Convert Vector3d to THREE.Vector3
|
|
23
|
+
const v0 = new THREE.Vector3(vertices[0].x, vertices[0].y, vertices[0].z)
|
|
24
|
+
const v1 = new THREE.Vector3(vertices[1].x, vertices[1].y, vertices[1].z)
|
|
25
|
+
const v2 = new THREE.Vector3(vertices[2].x, vertices[2].y, vertices[2].z)
|
|
26
|
+
|
|
27
|
+
const vector1 = new THREE.Vector3().subVectors(v1, v0)
|
|
28
|
+
const vector2 = new THREE.Vector3().subVectors(v2, v0)
|
|
29
|
+
const normal = new THREE.Vector3().crossVectors(vector1, vector2).normalize()
|
|
30
|
+
|
|
31
|
+
// Check if all remaining vertices lie on the same plane
|
|
32
|
+
for (let i = 3; i < vertices.length; i++) {
|
|
33
|
+
const vi = new THREE.Vector3(vertices[i].x, vertices[i].y, vertices[i].z)
|
|
34
|
+
const vector = new THREE.Vector3().subVectors(vi, v0)
|
|
35
|
+
const dotProduct = normal.dot(vector)
|
|
36
|
+
if (Math.abs(dotProduct) > 1e-6) {
|
|
37
|
+
// Allowing a small tolerance
|
|
38
|
+
console.log("Vertices are not on the same plane")
|
|
39
|
+
return { isCoplanar: false }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return { isCoplanar: true, normal }
|
|
44
|
+
}
|
|
45
|
+
|
|
11
46
|
export function SafetyZonesRenderer({
|
|
12
47
|
safetyZones,
|
|
13
48
|
...props
|
|
@@ -30,6 +65,22 @@ export function SafetyZonesRenderer({
|
|
|
30
65
|
const vertices = geometry.convex_hull.vertices.map(
|
|
31
66
|
(v) => new THREE.Vector3(v.x / 1000, v.y / 1000, v.z / 1000),
|
|
32
67
|
)
|
|
68
|
+
|
|
69
|
+
// Check if the vertices are on the same plane and only define a plane
|
|
70
|
+
// Algorithm has troubles with vertices that are on the same plane so we
|
|
71
|
+
// add a new vertex slightly moved along the normal direction
|
|
72
|
+
const coplanarityResult = areVerticesCoplanar(vertices)
|
|
73
|
+
|
|
74
|
+
if (coplanarityResult.isCoplanar && coplanarityResult.normal) {
|
|
75
|
+
// Add a new vertex slightly moved along the normal direction
|
|
76
|
+
const offset = 0.0001 // Adjust the offset as needed
|
|
77
|
+
const newVertex = new THREE.Vector3().addVectors(
|
|
78
|
+
vertices[0],
|
|
79
|
+
coplanarityResult.normal.multiplyScalar(offset),
|
|
80
|
+
)
|
|
81
|
+
vertices.push(newVertex)
|
|
82
|
+
}
|
|
83
|
+
|
|
33
84
|
let convexGeometry
|
|
34
85
|
try {
|
|
35
86
|
convexGeometry = new ConvexGeometry(vertices)
|
|
@@ -7,8 +7,6 @@ import {
|
|
|
7
7
|
Stack,
|
|
8
8
|
Typography,
|
|
9
9
|
} from "@mui/material"
|
|
10
|
-
import { observer } from "mobx-react-lite"
|
|
11
|
-
import { externalizeComponent } from "../../externalizeComponent"
|
|
12
10
|
|
|
13
11
|
function getBaseUrl(): string {
|
|
14
12
|
const currentUrl = window.location.href
|
|
@@ -18,77 +16,77 @@ function getBaseUrl(): string {
|
|
|
18
16
|
)
|
|
19
17
|
}
|
|
20
18
|
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
19
|
+
export type NoMotionGroupModalProps = {
|
|
20
|
+
baseUrl: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function NoMotionGroupModal({
|
|
24
|
+
baseUrl = getBaseUrl(),
|
|
25
|
+
...props
|
|
26
|
+
}: NoMotionGroupModalProps) {
|
|
27
|
+
return (
|
|
28
|
+
<Dialog
|
|
29
|
+
aria-labelledby="no-motion-group-modal-title"
|
|
30
|
+
open={true}
|
|
31
|
+
fullWidth
|
|
32
|
+
sx={{
|
|
33
|
+
"& .MuiModal-backdrop": {
|
|
34
|
+
backdropFilter: "blur(10px)",
|
|
35
|
+
},
|
|
36
|
+
"& .MuiDialog-paper": {
|
|
37
|
+
"::before": {
|
|
38
|
+
content: '""',
|
|
39
|
+
height: "8px",
|
|
40
|
+
width: "100%",
|
|
41
|
+
background: "linear-gradient(90deg, #FF0E65 0%, #47D3FF 100%)",
|
|
40
42
|
},
|
|
43
|
+
background: "#101629",
|
|
44
|
+
},
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
<DialogTitle id="no-motion-group-modal-title">
|
|
48
|
+
No motion group found
|
|
49
|
+
</DialogTitle>
|
|
50
|
+
|
|
51
|
+
<DialogContent
|
|
52
|
+
sx={{
|
|
53
|
+
marginTop: "3rem",
|
|
54
|
+
marginBottom: "1.5rem",
|
|
55
|
+
textAlign: "center",
|
|
41
56
|
}}
|
|
42
57
|
>
|
|
43
|
-
<
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
sx={{
|
|
49
|
-
marginTop: "3rem",
|
|
50
|
-
marginBottom: "1.5rem",
|
|
51
|
-
textAlign: "center",
|
|
52
|
-
}}
|
|
53
|
-
>
|
|
54
|
-
<Typography color="#fff">Found no devices to connect to.</Typography>
|
|
55
|
-
<Typography color="#fff">
|
|
56
|
-
Please ensure a motion group has been created.
|
|
57
|
-
</Typography>
|
|
58
|
-
</DialogContent>
|
|
58
|
+
<Typography color="#fff">Found no devices to connect to.</Typography>
|
|
59
|
+
<Typography color="#fff">
|
|
60
|
+
Please ensure a motion group has been created.
|
|
61
|
+
</Typography>
|
|
62
|
+
</DialogContent>
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
<DialogActions>
|
|
65
|
+
<Stack width="100%" maxWidth="300px" margin="auto" marginBottom="2rem">
|
|
66
|
+
<Button
|
|
67
|
+
href={`${baseUrl}/settings`}
|
|
68
|
+
variant="contained"
|
|
69
|
+
sx={{
|
|
70
|
+
borderRadius: "8px",
|
|
71
|
+
width: "100%",
|
|
72
|
+
}}
|
|
66
73
|
>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
>
|
|
87
|
-
Back to Homescreen
|
|
88
|
-
</Button>
|
|
89
|
-
</Stack>
|
|
90
|
-
</DialogActions>
|
|
91
|
-
</Dialog>
|
|
92
|
-
)
|
|
93
|
-
}),
|
|
94
|
-
)
|
|
74
|
+
Go to settings app
|
|
75
|
+
</Button>
|
|
76
|
+
<Button
|
|
77
|
+
href={`${baseUrl}`}
|
|
78
|
+
variant="text"
|
|
79
|
+
sx={{
|
|
80
|
+
marginTop: "1rem",
|
|
81
|
+
color: "#fff",
|
|
82
|
+
textDecoration: "underline",
|
|
83
|
+
fontSize: "0.75rem",
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
86
|
+
Back to Homescreen
|
|
87
|
+
</Button>
|
|
88
|
+
</Stack>
|
|
89
|
+
</DialogActions>
|
|
90
|
+
</Dialog>
|
|
91
|
+
)
|
|
92
|
+
}
|