@searpent/react-image-annotate 2.0.5 → 2.0.8

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 (195) hide show
  1. package/Annotator/examplePhotos.js +6976 -0
  2. package/Annotator/index.js +268 -0
  3. package/Annotator/reducers/combine-reducers.js +14 -0
  4. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  5. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  6. package/Annotator/reducers/general-reducer.js +1152 -0
  7. package/Annotator/reducers/get-active-image.js +27 -0
  8. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  9. package/Annotator/reducers/history-handler.js +38 -0
  10. package/Annotator/reducers/image-reducer.js +20 -0
  11. package/Annotator/reducers/video-reducer.js +88 -0
  12. package/ClassSelectionMenu/index.js +135 -0
  13. package/Crosshairs/index.js +53 -0
  14. package/DebugSidebarBox/index.js +20 -0
  15. package/DemoSite/Editor.js +194 -0
  16. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  17. package/DemoSite/index.js +40 -0
  18. package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  19. package/Editor/annotation-plugin/annotation.js +613 -0
  20. package/Editor/index.js +57 -0
  21. package/{src/Editor → Editor}/tools.js +2 -3
  22. package/FullImageSegmentationAnnotator/index.js +7 -0
  23. package/GroupSelectorSidebarBox/index.js +63 -0
  24. package/HighlightBox/index.js +99 -0
  25. package/HistorySidebarBox/index.js +71 -0
  26. package/ImageCanvas/index.js +429 -0
  27. package/ImageCanvas/region-tools.js +165 -0
  28. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  29. package/ImageCanvas/use-mouse.js +180 -0
  30. package/ImageCanvas/use-project-box.js +27 -0
  31. package/ImageCanvas/use-wasd-mode.js +62 -0
  32. package/ImageMask/index.js +133 -0
  33. package/ImageMask/load-image.js +25 -0
  34. package/ImageSelectorSidebarBox/index.js +60 -0
  35. package/KeyframeTimeline/get-time-string.js +27 -0
  36. package/KeyframeTimeline/index.js +233 -0
  37. package/KeyframesSelectorSidebarBox/index.js +93 -0
  38. package/LandingPage/index.js +159 -0
  39. package/MainLayout/icon-dictionary.js +104 -0
  40. package/MainLayout/index.js +469 -0
  41. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  42. package/MainLayout/types.js +0 -0
  43. package/MainLayout/use-implied-video-regions.js +13 -0
  44. package/MetadataEditorSidebarBox/index.js +126 -0
  45. package/PageSelector/index.js +69 -0
  46. package/{src/PageSelector → PageSelector}/page-selector.css +18 -0
  47. package/PointDistances/index.js +73 -0
  48. package/PreventScrollToParents/index.js +51 -0
  49. package/RegionLabel/index.js +205 -0
  50. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  51. package/RegionSelectAndTransformBoxes/index.js +167 -0
  52. package/RegionSelectorSidebarBox/index.js +248 -0
  53. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  54. package/RegionShapes/index.js +294 -0
  55. package/RegionTags/index.js +142 -0
  56. package/SettingsDialog/index.js +52 -0
  57. package/SettingsProvider/index.js +58 -0
  58. package/Shortcuts/ShortcutField.js +46 -0
  59. package/Shortcuts/index.js +133 -0
  60. package/ShortcutsManager/index.js +155 -0
  61. package/Sidebar/index.js +69 -0
  62. package/SidebarBoxContainer/index.js +93 -0
  63. package/SmallToolButton/index.js +42 -0
  64. package/TagsSidebarBox/index.js +105 -0
  65. package/TaskDescriptionSidebarBox/index.js +58 -0
  66. package/Theme/index.js +30 -0
  67. package/VideoOrImageCanvasBackground/index.js +151 -0
  68. package/colors.js +14 -0
  69. package/hooks/use-colors.js +101 -0
  70. package/hooks/use-event-callback.js +10 -0
  71. package/hooks/use-exclude-pattern.js +24 -0
  72. package/hooks/use-load-image.js +26 -0
  73. package/hooks/use-window-size.js +46 -0
  74. package/{src/hooks → hooks}/xpattern.js +1 -1
  75. package/index.js +3 -0
  76. package/lib.js +3 -0
  77. package/package.json +1 -1
  78. package/stories.js +5 -0
  79. package/{src/utils → utils}/filter-only-unique.js +1 -1
  80. package/utils/get-from-local-storage.js +7 -0
  81. package/utils/get-hotkey-help-text.js +9 -0
  82. package/utils/get-landmarks-with-transform.js +40 -0
  83. package/utils/photosToImages.js +53 -0
  84. package/utils/regions-to-blocks.js +16 -0
  85. package/utils/set-in-local-storage.js +3 -0
  86. package/.babelrc +0 -6
  87. package/.env +0 -1
  88. package/.flowconfig +0 -2
  89. package/.github/workflows/release-on-master.yml +0 -32
  90. package/.github/workflows/test.yml +0 -16
  91. package/.prettierrc +0 -3
  92. package/.releaserc.js +0 -18
  93. package/.storybook/addons.js +0 -2
  94. package/.storybook/config.js +0 -16
  95. package/LICENSE +0 -21
  96. package/public/favicon.ico +0 -0
  97. package/public/index.html +0 -38
  98. package/src/Annotator/bike-pic.png +0 -0
  99. package/src/Annotator/bike-pic2.png +0 -0
  100. package/src/Annotator/dab-keyframes.story.json +0 -1
  101. package/src/Annotator/examplePhotos.js +0 -7601
  102. package/src/Annotator/index.js +0 -291
  103. package/src/Annotator/index.story.js +0 -807
  104. package/src/Annotator/poses.story.js +0 -150
  105. package/src/Annotator/reducers/combine-reducers.js +0 -7
  106. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  107. package/src/Annotator/reducers/general-reducer.js +0 -996
  108. package/src/Annotator/reducers/get-active-image.js +0 -21
  109. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  110. package/src/Annotator/reducers/history-handler.js +0 -60
  111. package/src/Annotator/reducers/image-reducer.js +0 -23
  112. package/src/Annotator/reducers/video-reducer.js +0 -85
  113. package/src/Annotator/video.story.js +0 -51
  114. package/src/ClassSelectionMenu/index.js +0 -108
  115. package/src/Crosshairs/index.js +0 -64
  116. package/src/DebugSidebarBox/index.js +0 -36
  117. package/src/DemoSite/Editor.js +0 -235
  118. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  119. package/src/DemoSite/index.js +0 -41
  120. package/src/DemoSite/index.story.js +0 -10
  121. package/src/DemoSite/simple-segmentation-example.json +0 -572
  122. package/src/Editor/annotation-plugin/annotation.js +0 -515
  123. package/src/Editor/index.js +0 -24
  124. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  125. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  126. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  127. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  128. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  129. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  130. package/src/GroupSelectorSidebarBox/index.js +0 -48
  131. package/src/HighlightBox/index.js +0 -143
  132. package/src/HistorySidebarBox/index.js +0 -78
  133. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  134. package/src/ImageCanvas/index.js +0 -494
  135. package/src/ImageCanvas/index.story.js +0 -314
  136. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  137. package/src/ImageCanvas/region-tools.js +0 -171
  138. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  139. package/src/ImageCanvas/use-mouse.js +0 -168
  140. package/src/ImageCanvas/use-project-box.js +0 -23
  141. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  142. package/src/ImageMask/index.js +0 -127
  143. package/src/ImageMask/load-image.js +0 -32
  144. package/src/ImageSelectorSidebarBox/index.js +0 -54
  145. package/src/KeyframeTimeline/get-time-string.js +0 -25
  146. package/src/KeyframeTimeline/index.js +0 -223
  147. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  148. package/src/LandingPage/content.md +0 -57
  149. package/src/LandingPage/github-markdown.css +0 -964
  150. package/src/LandingPage/index.js +0 -147
  151. package/src/MainLayout/icon-dictionary.js +0 -79
  152. package/src/MainLayout/index.js +0 -510
  153. package/src/MainLayout/index.story.js +0 -240
  154. package/src/MainLayout/types.js +0 -164
  155. package/src/MainLayout/use-implied-video-regions.js +0 -17
  156. package/src/MetadataEditorSidebarBox/index.js +0 -98
  157. package/src/PageSelector/index.js +0 -76
  158. package/src/PointDistances/index.js +0 -90
  159. package/src/PreventScrollToParents/index.js +0 -48
  160. package/src/PreventScrollToParents/index.story.js +0 -23
  161. package/src/RegionLabel/index.js +0 -222
  162. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  163. package/src/RegionSelectorSidebarBox/index.js +0 -216
  164. package/src/RegionShapes/index.js +0 -254
  165. package/src/RegionTags/index.js +0 -134
  166. package/src/SettingsDialog/index.js +0 -58
  167. package/src/SettingsProvider/index.js +0 -48
  168. package/src/Shortcuts/ShortcutField.js +0 -44
  169. package/src/Shortcuts/index.js +0 -129
  170. package/src/ShortcutsManager/index.js +0 -162
  171. package/src/Sidebar/index.js +0 -117
  172. package/src/SidebarBoxContainer/index.js +0 -93
  173. package/src/SmallToolButton/index.js +0 -57
  174. package/src/TagsSidebarBox/index.js +0 -93
  175. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  176. package/src/Theme/index.js +0 -36
  177. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  178. package/src/colors.js +0 -32
  179. package/src/hooks/use-colors.js +0 -74
  180. package/src/hooks/use-event-callback.js +0 -11
  181. package/src/hooks/use-exclude-pattern.js +0 -27
  182. package/src/hooks/use-load-image.js +0 -21
  183. package/src/hooks/use-window-size.js +0 -46
  184. package/src/hooks/xpattern.png +0 -0
  185. package/src/index.js +0 -18
  186. package/src/lib.js +0 -7
  187. package/src/screenshot.png +0 -0
  188. package/src/site.css +0 -5
  189. package/src/stories.js +0 -2
  190. package/src/utils/get-from-local-storage.js +0 -7
  191. package/src/utils/get-hotkey-help-text.js +0 -11
  192. package/src/utils/get-landmarks-with-transform.js +0 -23
  193. package/src/utils/photosToImages.js +0 -40
  194. package/src/utils/regions-to-blocks.js +0 -14
  195. package/src/utils/set-in-local-storage.js +0 -6
@@ -1,177 +0,0 @@
1
- // @flow
2
-
3
- import React from "react"
4
-
5
- import { storiesOf } from "@storybook/react"
6
- import { action } from "@storybook/addon-actions"
7
- import orange from "./orange.story.png"
8
- import hard1 from "./hard1.story.jpg"
9
- import hard2 from "./hard2.story.jpg"
10
- import hard3 from "./hard3.story.jpg"
11
-
12
- import FullImageSegmentationAnnotator from "./"
13
-
14
- storiesOf("FullImageSegmentationAnnotator.Basic", module)
15
- .add("Orange 2 Class", () => (
16
- <div style={{ width: "95vw", height: "95vh" }}>
17
- <FullImageSegmentationAnnotator
18
- images={[
19
- {
20
- name: "Seve's Desk",
21
- // src:
22
- // "https://a.allegroimg.com/s128/113a6e/09d2c0ed4f278610e555c95b1d50/Rama-BIANCHI-OLTRE-XR4-DISC-carbon-Vision-ACR-51cm-Dedykowany-a-do-kolarstwo-szosowe",
23
- // src: "https://i.imgur.com/Dv5lkQZ.png",
24
- src: orange,
25
- regions: [
26
- [1, 40, 280],
27
- [1, 10, 10],
28
- [1, 240, 300],
29
- ]
30
- .map(([cls, y, x], i) => ({
31
- cls: ["fg", "bg"][cls],
32
- color: "hsl(162,100%,50%)",
33
- editingLabels: false,
34
- highlighted: false,
35
- id: "a" + i,
36
- type: "point",
37
- x: x / 320,
38
- y: y / 249,
39
- }))
40
- .concat([
41
- {
42
- cls: "fg",
43
- color: "hsl(162,100%,50%)",
44
- editingLabels: false,
45
- highlighted: false,
46
- id: "bb",
47
- type: "box",
48
- x: 0.3,
49
- y: 0.25,
50
- w: 0.35,
51
- h: 0.38,
52
- },
53
- ]),
54
- },
55
- ]}
56
- regionClsList={["bg", "fg"]}
57
- onExit={action("onExit")}
58
- />
59
- </div>
60
- ))
61
- .add("S3 CORS domain", () => (
62
- <div style={{ width: "95vw", height: "95vh" }}>
63
- <FullImageSegmentationAnnotator
64
- images={[
65
- {
66
- name: "Seve's Desk",
67
- src: "https://s3.amazonaws.com/datasets.workaround.online/faces/010041.jpg",
68
- regions: [
69
- [0, 100, 125],
70
- [0, 100, 150],
71
- [1, 40, 280],
72
- [1, 10, 10],
73
- [1, 240, 300],
74
- ].map(([cls, y, x], i) => ({
75
- cls: ["fg", "bg"][cls],
76
- color: "hsl(162,100%,50%)",
77
- editingLabels: false,
78
- highlighted: false,
79
- id: "a" + i,
80
- type: "point",
81
- x: x / 320,
82
- y: y / 249,
83
- })),
84
- },
85
- ]}
86
- regionClsList={["bg", "fg"]}
87
- onExit={action("onExit")}
88
- />
89
- </div>
90
- ))
91
- .add("Orange 3 Class", () => (
92
- <div style={{ width: "95vw", height: "95vh" }}>
93
- <FullImageSegmentationAnnotator
94
- images={[
95
- {
96
- name: "Seve's Desk",
97
- src: orange,
98
- regions: [
99
- [0, 100, 125],
100
- [0, 100, 150],
101
- [1, 40, 280],
102
- [1, 10, 10],
103
- [1, 240, 300],
104
- ].map(([cls, y, x], i) => ({
105
- cls: ["orange", "bg", "hand"][cls],
106
- color: "hsl(162,100%,50%)",
107
- editingLabels: false,
108
- highlighted: false,
109
- id: "a" + i,
110
- type: "point",
111
- x: x / 320,
112
- y: y / 249,
113
- })),
114
- },
115
- ]}
116
- regionClsList={["bg", "orange", "hand"]}
117
- onExit={action("onExit")}
118
- />
119
- </div>
120
- ))
121
- .add("Hard 1, 8 Class, Simple Mode", () => (
122
- <div style={{ width: "95vw", height: "95vh" }}>
123
- <FullImageSegmentationAnnotator
124
- images={[
125
- {
126
- name: "Hard",
127
- src: hard1,
128
- },
129
- ]}
130
- regionClsList={["bg", "1", "2", "3", "4", "5", "6", "7", "8"]}
131
- onExit={action("onExit")}
132
- autoSegmentationOptions={{ type: "simple" }}
133
- />
134
- </div>
135
- ))
136
- .add("Hard 1, 8 Class", () => (
137
- <div style={{ width: "95vw", height: "95vh" }}>
138
- <FullImageSegmentationAnnotator
139
- images={[
140
- {
141
- name: "Hard",
142
- src: hard1,
143
- },
144
- ]}
145
- regionClsList={["1", "2", "3", "4", "5", "6", "7", "8"]}
146
- onExit={action("onExit")}
147
- />
148
- </div>
149
- ))
150
- .add("Hard 2, 8 Class", () => (
151
- <div style={{ width: "95vw", height: "95vh" }}>
152
- <FullImageSegmentationAnnotator
153
- images={[
154
- {
155
- name: "Really Hard",
156
- src: hard2,
157
- },
158
- ]}
159
- regionClsList={["1", "2", "3", "4", "5", "6", "7", "8"]}
160
- onExit={action("onExit")}
161
- />
162
- </div>
163
- ))
164
- .add("Hard 3, 8 Class", () => (
165
- <div style={{ width: "95vw", height: "95vh" }}>
166
- <FullImageSegmentationAnnotator
167
- images={[
168
- {
169
- name: "Extremely Hard",
170
- src: hard3,
171
- },
172
- ]}
173
- regionClsList={["1", "2", "3", "4", "5", "6", "7", "8"]}
174
- onExit={action("onExit")}
175
- />
176
- </div>
177
- ))
@@ -1,48 +0,0 @@
1
- // @flow
2
-
3
- import React, { memo } from "react"
4
- import { makeStyles } from "@mui/styles"
5
- import { createTheme, ThemeProvider } from "@mui/material/styles"
6
- import SidebarBoxContainer from "../SidebarBoxContainer"
7
- import CollectionsIcon from "@mui/icons-material/Collections"
8
- import { grey } from "@mui/material/colors"
9
- import List from "@mui/material/List"
10
- import ListItem from "@mui/material/ListItem"
11
- import ListItemText from "@mui/material/ListItemText"
12
- import isEqual from "lodash/isEqual"
13
-
14
- const theme = createTheme()
15
- const useStyles = makeStyles((theme) => ({
16
- img: { width: 40, height: 40, borderRadius: 8 },
17
- }))
18
-
19
- export const GroupSelectorSidebarBox = ({ title, subtitle, groups, onSelect, selectedGroupId }) => {
20
- const classes = useStyles()
21
- return (
22
- <ThemeProvider theme={theme}>
23
- <SidebarBoxContainer
24
- title={title || ''}
25
- subTitle={subtitle || ''}
26
- icon={<CollectionsIcon style={{ color: grey[700] }} />}
27
- >
28
- <List>
29
- {groups.map(({ id, title: groupTitle, subtitle: groupSubtitle, color }, i) => (
30
- <ListItem button onClick={() => onSelect(id)} dense key={id} style={{
31
- backgroundColor: id === selectedGroupId ? '#bbdefb' : null
32
- }}>
33
- <ListItemText
34
- primary={<strong style={{
35
- color
36
- }}>{groupTitle}</strong>}
37
- secondary={groupSubtitle}
38
- />
39
- </ListItem>
40
- ))}
41
- </List>
42
-
43
- </SidebarBoxContainer>
44
- </ThemeProvider>
45
- )
46
- }
47
-
48
- export default GroupSelectorSidebarBox
@@ -1,143 +0,0 @@
1
- // @flow
2
-
3
- import React from "react"
4
- import classnames from "classnames"
5
- import { makeStyles } from "@mui/styles"
6
- import { createTheme, ThemeProvider } from "@mui/material/styles"
7
-
8
- const theme = createTheme()
9
- const useStyles = makeStyles((theme) => ({
10
- "@keyframes borderDance": {
11
- from: { strokeDashoffset: 0 },
12
- to: { strokeDashoffset: 100 },
13
- },
14
- highlightBox: {
15
- zIndex: 2,
16
- transition: "opacity 500ms",
17
- "&.highlighted": {
18
- zIndex: 3,
19
- },
20
- "&:not(.highlighted)": {
21
- opacity: 0,
22
- },
23
- "&:not(.highlighted):hover": {
24
- opacity: 0.6,
25
- },
26
- "& path": {
27
- vectorEffect: "non-scaling-stroke",
28
- strokeWidth: 2,
29
- stroke: "#FFF",
30
- fill: "none",
31
- strokeDasharray: 5,
32
- animationName: "$borderDance",
33
- animationDuration: "4s",
34
- animationTimingFunction: "linear",
35
- animationIterationCount: "infinite",
36
- animationPlayState: "running",
37
- },
38
- },
39
- }))
40
-
41
- export const HighlightBox = ({
42
- mouseEvents,
43
- dragWithPrimary,
44
- zoomWithPrimary,
45
- createWithPrimary,
46
- onBeginMovePoint,
47
- onSelectRegion,
48
- region: r,
49
- pbox,
50
- }: {
51
- mouseEvents: any,
52
- dragWithPrimary: boolean,
53
- zoomWithPrimary: boolean,
54
- createWithPrimary: boolean,
55
- onBeginMovePoint: Function,
56
- onSelectRegion: Function,
57
- region: any,
58
- pbox: { x: number, y: number, w: number, h: number },
59
- }) => {
60
- const classes = useStyles()
61
- if (!pbox.w || pbox.w === Infinity) return null
62
- if (!pbox.h || pbox.h === Infinity) return null
63
- if (r.unfinished) return null
64
-
65
- const styleCoords =
66
- r.type === "point"
67
- ? {
68
- left: pbox.x + pbox.w / 2 - 30,
69
- top: pbox.y + pbox.h / 2 - 30,
70
- width: 60,
71
- height: 60,
72
- }
73
- : {
74
- left: pbox.x - 5,
75
- top: pbox.y - 5,
76
- width: pbox.w + 10,
77
- height: pbox.h + 10,
78
- }
79
-
80
- const pathD =
81
- r.type === "point"
82
- ? `M5,5 L${styleCoords.width - 5} 5L${styleCoords.width - 5} ${
83
- styleCoords.height - 5
84
- }L5 ${styleCoords.height - 5}Z`
85
- : `M5,5 L${pbox.w + 5},5 L${pbox.w + 5},${pbox.h + 5} L5,${pbox.h + 5} Z`
86
-
87
- return (
88
- <ThemeProvider theme={theme}>
89
- <svg
90
- key={r.id}
91
- className={classnames(classes.highlightBox, {
92
- highlighted: r.highlighted,
93
- })}
94
- {...mouseEvents}
95
- {...(!zoomWithPrimary && !dragWithPrimary
96
- ? {
97
- onMouseDown: (e) => {
98
- if (
99
- !r.locked &&
100
- r.type === "point" &&
101
- r.highlighted &&
102
- e.button === 0
103
- ) {
104
- return onBeginMovePoint(r)
105
- }
106
- if (e.button === 0 && !createWithPrimary)
107
- return onSelectRegion(r)
108
- mouseEvents.onMouseDown(e)
109
- },
110
- }
111
- : {})}
112
- style={{
113
- ...(r.highlighted
114
- ? {
115
- pointerEvents: r.type !== "point" ? "none" : undefined,
116
- cursor: "grab",
117
- }
118
- : {
119
- cursor: !(
120
- zoomWithPrimary ||
121
- dragWithPrimary ||
122
- createWithPrimary
123
- )
124
- ? "pointer"
125
- : undefined,
126
- pointerEvents:
127
- zoomWithPrimary ||
128
- dragWithPrimary ||
129
- (createWithPrimary && !r.highlighted)
130
- ? "none"
131
- : undefined,
132
- }),
133
- position: "absolute",
134
- ...styleCoords,
135
- }}
136
- >
137
- <path d={pathD} />
138
- </svg>
139
- </ThemeProvider>
140
- )
141
- }
142
-
143
- export default HighlightBox
@@ -1,78 +0,0 @@
1
- // @flow
2
-
3
- import React, { setState, memo } from "react"
4
- import { makeStyles } from "@mui/styles"
5
- import { createTheme, ThemeProvider } from "@mui/material/styles"
6
- import SidebarBoxContainer from "../SidebarBoxContainer"
7
- import HistoryIcon from "@mui/icons-material/History"
8
- import List from "@mui/material/List"
9
- import ListItem from "@mui/material/ListItem"
10
- import ListItemText from "@mui/material/ListItemText"
11
- import IconButton from "@mui/material/IconButton"
12
- import ListItemSecondaryAction from "@mui/material/ListItemSecondaryAction"
13
- import UndoIcon from "@mui/icons-material/Undo"
14
- import moment from "moment"
15
- import { grey } from "@mui/material/colors"
16
- import isEqual from "lodash/isEqual"
17
- import Box from "@mui/material/Box"
18
-
19
- const theme = createTheme()
20
- const useStyles = makeStyles((theme) => ({
21
- emptyText: {
22
- fontSize: 14,
23
- fontWeight: "bold",
24
- color: grey[500],
25
- textAlign: "center",
26
- padding: 20,
27
- },
28
- }))
29
-
30
- const listItemTextStyle = { paddingLeft: 16 }
31
-
32
- export const HistorySidebarBox = ({
33
- history,
34
- onRestoreHistory,
35
- }: {
36
- history: Array<{ name: string, time: Date }>,
37
- }) => {
38
- const classes = useStyles()
39
-
40
- return (
41
- <ThemeProvider theme={theme}>
42
- <SidebarBoxContainer
43
- title="History"
44
- icon={<HistoryIcon style={{ color: grey[700] }} />}
45
- expandedByDefault
46
- >
47
- <List>
48
- {history.length === 0 && (
49
- <div className={classes.emptyText}>No History Yet</div>
50
- )}
51
- {history.map(({ name, time }, i) => (
52
- <ListItem button dense key={i}>
53
- <ListItemText
54
- style={listItemTextStyle}
55
- primary={name}
56
- secondary={moment(time).format("LT")}
57
- />
58
- {i === 0 && (
59
- <ListItemSecondaryAction onClick={() => onRestoreHistory()}>
60
- <IconButton>
61
- <UndoIcon />
62
- </IconButton>
63
- </ListItemSecondaryAction>
64
- )}
65
- </ListItem>
66
- ))}
67
- </List>
68
- </SidebarBoxContainer>
69
- </ThemeProvider>
70
- )
71
- }
72
-
73
- export default memo(HistorySidebarBox, (prevProps, nextProps) =>
74
- isEqual(
75
- prevProps.history.map((a) => [a.name, a.time]),
76
- nextProps.history.map((a) => [a.name, a.time])
77
- )
78
- )