@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.
@@ -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;AAEd,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,GAAG,KAAK,EACT,EAAE,wBAAwB,2CA+C1B"}
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 declare const NoMotionGroupModal: ((baseUrl?: string) => import("react/jsx-runtime").JSX.Element) & {
2
- displayName: string;
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":"AAoBA,eAAO,MAAM,kBAAkB,cACV,MAAM;;CAwE1B,CAAA"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wandelbots/wandelbots-js-react-components",
3
- "version": "1.11.2",
3
+ "version": "1.11.4",
4
4
  "description": "React UI toolkit for building applications on top of the Wandelbots platform",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -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 const NoMotionGroupModal = externalizeComponent(
22
- observer((baseUrl: string = getBaseUrl()) => {
23
- return (
24
- <Dialog
25
- aria-labelledby="no-motion-group-modal-title"
26
- open={true}
27
- fullWidth
28
- sx={{
29
- "& .MuiModal-backdrop": {
30
- backdropFilter: "blur(10px)",
31
- },
32
- "& .MuiDialog-paper": {
33
- "::before": {
34
- content: '""',
35
- height: "8px",
36
- width: "100%",
37
- background: "linear-gradient(90deg, #FF0E65 0%, #47D3FF 100%)",
38
- },
39
- background: "#101629",
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
- <DialogTitle id="no-motion-group-modal-title">
44
- No motion group found
45
- </DialogTitle>
46
-
47
- <DialogContent
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
- <DialogActions>
61
- <Stack
62
- width="100%"
63
- maxWidth="300px"
64
- margin="auto"
65
- marginBottom="2rem"
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
- <Button
68
- href={`${baseUrl}/settings`}
69
- variant="contained"
70
- sx={{
71
- borderRadius: "8px",
72
- width: "100%",
73
- }}
74
- >
75
- Go to settings app
76
- </Button>
77
- <Button
78
- href={`${baseUrl}`}
79
- variant="text"
80
- sx={{
81
- marginTop: "1rem",
82
- color: "#fff",
83
- textDecoration: "underline",
84
- fontSize: "0.75rem",
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
+ }