@wandelbots/wandelbots-js-react-components 2.40.0 → 2.41.0-pr.feature-seperate-timer.383.38eb55e

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 (55) hide show
  1. package/dist/components/CycleTimer/DefaultVariant.d.ts.map +1 -1
  2. package/dist/components/CycleTimer/SmallVariant.d.ts.map +1 -1
  3. package/dist/components/CycleTimer/index.d.ts +4 -5
  4. package/dist/components/CycleTimer/index.d.ts.map +1 -1
  5. package/dist/components/CycleTimer/types.d.ts +2 -3
  6. package/dist/components/CycleTimer/types.d.ts.map +1 -1
  7. package/dist/components/CycleTimer/useTimerLogic.d.ts +1 -2
  8. package/dist/components/CycleTimer/useTimerLogic.d.ts.map +1 -1
  9. package/dist/components/TabBar.d.ts +2 -0
  10. package/dist/components/TabBar.d.ts.map +1 -1
  11. package/dist/components/Timer/Timer.d.ts +3 -0
  12. package/dist/components/Timer/Timer.d.ts.map +1 -0
  13. package/dist/components/Timer/TimerDefaultVariant.d.ts +10 -0
  14. package/dist/components/Timer/TimerDefaultVariant.d.ts.map +1 -0
  15. package/dist/components/Timer/TimerSmallVariant.d.ts +11 -0
  16. package/dist/components/Timer/TimerSmallVariant.d.ts.map +1 -0
  17. package/dist/components/Timer/index.d.ts +19 -0
  18. package/dist/components/Timer/index.d.ts.map +1 -0
  19. package/dist/components/Timer/types.d.ts +36 -0
  20. package/dist/components/Timer/types.d.ts.map +1 -0
  21. package/dist/components/Timer/useTimerAnimations.d.ts +11 -0
  22. package/dist/components/Timer/useTimerAnimations.d.ts.map +1 -0
  23. package/dist/components/Timer/useTimerLogic.d.ts +20 -0
  24. package/dist/components/Timer/useTimerLogic.d.ts.map +1 -0
  25. package/dist/components/Timer/utils.d.ts +9 -0
  26. package/dist/components/Timer/utils.d.ts.map +1 -0
  27. package/dist/components/jogging/PoseCartesianValues.d.ts.map +1 -1
  28. package/dist/components/jogging/PoseJointValues.d.ts.map +1 -1
  29. package/dist/index.cjs +48 -48
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5769 -5328
  34. package/dist/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/components/CycleTimer/DefaultVariant.tsx +0 -2
  37. package/src/components/CycleTimer/SmallVariant.tsx +2 -5
  38. package/src/components/CycleTimer/index.tsx +4 -5
  39. package/src/components/CycleTimer/types.ts +1 -3
  40. package/src/components/CycleTimer/useTimerLogic.ts +40 -96
  41. package/src/components/CycleTimer/utils.ts +3 -3
  42. package/src/components/TabBar.tsx +35 -8
  43. package/src/components/Timer/Timer.ts +2 -0
  44. package/src/components/Timer/TimerDefaultVariant.tsx +140 -0
  45. package/src/components/Timer/TimerSmallVariant.tsx +140 -0
  46. package/src/components/Timer/index.tsx +101 -0
  47. package/src/components/Timer/types.ts +38 -0
  48. package/src/components/Timer/useTimerAnimations.ts +94 -0
  49. package/src/components/Timer/useTimerLogic.ts +214 -0
  50. package/src/components/Timer/utils.ts +15 -0
  51. package/src/components/jogging/PoseCartesianValues.tsx +78 -67
  52. package/src/components/jogging/PoseJointValues.tsx +77 -67
  53. package/src/i18n/locales/de/translations.json +1 -0
  54. package/src/i18n/locales/en/translations.json +1 -0
  55. package/src/index.ts +1 -0
@@ -6,8 +6,9 @@ import type {
6
6
  } from "@wandelbots/nova-js/v1"
7
7
  import { observer } from "mobx-react-lite"
8
8
  import { useRef, useState } from "react"
9
+ import { externalizeComponent } from "../../externalizeComponent"
9
10
  import { CopyableText } from "../CopyableText"
10
- import { useAnimationFrame } from "../utils/hooks"
11
+ import { useAutorun } from "../utils/hooks"
11
12
 
12
13
  /** Minimal interface for what PoseJointValues needs from motion stream */
13
14
  type MotionStateProvider = {
@@ -38,81 +39,90 @@ export type PoseJointValuesProps = {
38
39
  showCopyButton?: boolean
39
40
  }
40
41
 
41
- export const PoseJointValues = observer(
42
- ({
43
- motionStream,
44
- connectedMotionGroup,
45
- showCopyButton = false,
46
- }: PoseJointValuesProps) => {
47
- const poseHolderRef = useRef<HTMLDivElement>(null)
48
- const [copyMessage, setCopyMessage] = useState("")
49
-
50
- const activeMotionStream = createMotionStateProvider(
42
+ export const PoseJointValues = externalizeComponent(
43
+ observer(
44
+ ({
51
45
  motionStream,
52
46
  connectedMotionGroup,
53
- )
47
+ showCopyButton = false,
48
+ }: PoseJointValuesProps) => {
49
+ const poseHolderRef = useRef<HTMLDivElement>(null)
50
+ const [copyMessage, setCopyMessage] = useState("")
54
51
 
55
- if (!activeMotionStream) {
56
- throw new Error(
57
- "PoseJointValues requires either motionStream or connectedMotionGroup prop",
52
+ const activeMotionStream = createMotionStateProvider(
53
+ motionStream,
54
+ connectedMotionGroup,
58
55
  )
59
- }
60
56
 
61
- function getCurrentPoseString() {
62
- if (!activeMotionStream) return ""
63
- const { joints } =
64
- activeMotionStream.rapidlyChangingMotionState.state.joint_position
65
- return `[${joints.map((j: number) => parseFloat(j.toFixed(4))).join(", ")}]`
66
- }
67
-
68
- const handleCopy = async () => {
69
- try {
70
- await navigator.clipboard.writeText(getCurrentPoseString())
71
- setCopyMessage("Copied!")
72
- setTimeout(() => setCopyMessage(""), 2000)
73
- } catch {
74
- setCopyMessage("Copy failed")
75
- setTimeout(() => setCopyMessage(""), 2000)
57
+ if (!activeMotionStream) {
58
+ throw new Error(
59
+ "PoseJointValues requires either motionStream or connectedMotionGroup prop",
60
+ )
76
61
  }
77
- }
78
62
 
79
- useAnimationFrame(() => {
80
- if (!poseHolderRef.current) {
81
- return
63
+ function getCurrentPoseString() {
64
+ if (!activeMotionStream) return ""
65
+ const { joints } =
66
+ activeMotionStream.rapidlyChangingMotionState.state.joint_position
67
+ return `[${joints.map((j: number) => parseFloat(j.toFixed(4))).join(", ")}]`
82
68
  }
83
69
 
84
- const newPoseContent = getCurrentPoseString()
85
- if (poseHolderRef.current.textContent === newPoseContent) {
86
- return
70
+ const handleCopy = async () => {
71
+ try {
72
+ await navigator.clipboard.writeText(getCurrentPoseString())
73
+ setCopyMessage("Copied!")
74
+ setTimeout(() => setCopyMessage(""), 2000)
75
+ } catch {
76
+ setCopyMessage("Copy failed")
77
+ setTimeout(() => setCopyMessage(""), 2000)
78
+ }
87
79
  }
88
- poseHolderRef.current.textContent = newPoseContent
89
- })
90
80
 
91
- return (
92
- <Stack
93
- direction="row"
94
- alignItems="center"
95
- spacing={1}
96
- sx={{ flexGrow: 1, minWidth: 0, overflow: "hidden" }}
97
- >
98
- <CopyableText value={getCurrentPoseString()} ref={poseHolderRef} />
99
- {showCopyButton && (
100
- <Button
101
- variant="contained"
102
- color="secondary"
103
- size="small"
104
- onClick={handleCopy}
105
- sx={{ flexShrink: 0 }}
106
- >
107
- Copy
108
- </Button>
109
- )}
110
- {copyMessage && (
111
- <Typography variant="caption" color="success.main">
112
- {copyMessage}
113
- </Typography>
114
- )}
115
- </Stack>
116
- )
117
- },
81
+ useAutorun(() => {
82
+ if (!poseHolderRef.current || !activeMotionStream) {
83
+ return
84
+ }
85
+
86
+ const { joints } =
87
+ activeMotionStream.rapidlyChangingMotionState.state.joint_position
88
+ const newPoseContent = `[${joints.map((j: number) => parseFloat(j.toFixed(4))).join(", ")}]`
89
+
90
+ requestAnimationFrame(() => {
91
+ if (
92
+ poseHolderRef.current &&
93
+ poseHolderRef.current.textContent !== newPoseContent
94
+ ) {
95
+ poseHolderRef.current.textContent = newPoseContent
96
+ }
97
+ })
98
+ })
99
+
100
+ return (
101
+ <Stack
102
+ direction="row"
103
+ alignItems="center"
104
+ spacing={1}
105
+ sx={{ flexGrow: 1, minWidth: 0, overflow: "hidden" }}
106
+ >
107
+ <CopyableText value={getCurrentPoseString()} ref={poseHolderRef} />
108
+ {showCopyButton && (
109
+ <Button
110
+ variant="contained"
111
+ color="secondary"
112
+ size="small"
113
+ onClick={handleCopy}
114
+ sx={{ flexShrink: 0 }}
115
+ >
116
+ Copy
117
+ </Button>
118
+ )}
119
+ {copyMessage && (
120
+ <Typography variant="caption" color="success.main">
121
+ {copyMessage}
122
+ </Typography>
123
+ )}
124
+ </Stack>
125
+ )
126
+ },
127
+ ),
118
128
  )
@@ -52,6 +52,7 @@
52
52
  "CycleTimer.CycleTime.lb": "Zykluszeit",
53
53
  "CycleTimer.Measuring.lb": "wird gemessen...",
54
54
  "CycleTimer.Determined.lb": "bestimmt",
55
+ "Timer.error": "Fehler",
55
56
  "ProgramControl.Start.bt": "Start",
56
57
  "ProgramControl.Resume.bt": "Weiter",
57
58
  "ProgramControl.Retry.bt": "Wiederholen",
@@ -53,6 +53,7 @@
53
53
  "CycleTimer.CycleTime.lb": "Cycle Time",
54
54
  "CycleTimer.Measuring.lb": "measuring...",
55
55
  "CycleTimer.Determined.lb": "determined",
56
+ "Timer.error": "Error",
56
57
  "ProgramControl.Start.bt": "Start",
57
58
  "ProgramControl.Resume.bt": "Resume",
58
59
  "ProgramControl.Retry.bt": "Retry",
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@ export * from "./components/3d-viewport/SafetyZonesRenderer"
4
4
  export * from "./components/3d-viewport/TrajectoryRenderer"
5
5
  export * from "./components/AppHeader"
6
6
  export * from "./components/CycleTimer"
7
+ export * from "./components/Timer"
7
8
  export * from "./components/DataGrid"
8
9
  export * from "./components/jogging/JoggingCartesianAxisControl"
9
10
  export * from "./components/jogging/JoggingJointRotationControl"