@spaced-out/ui-design-system 0.3.38-beta.0 → 0.3.39-beta.0

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 (307) hide show
  1. package/.cspell/custom-words.txt +4 -0
  2. package/.github/workflows/publish_to_npm.yml +32 -4
  3. package/CHANGELOG.md +16 -0
  4. package/dts-generator/.editorconfig +10 -0
  5. package/dts-generator/.gitattributes +4 -0
  6. package/dts-generator/README.md +63 -0
  7. package/dts-generator/convert.js +101 -0
  8. package/dts-generator/package.json +16 -0
  9. package/gulpfile.js +20 -1
  10. package/lib/components/Avatar/Avatar.d.ts +264 -0
  11. package/lib/components/Avatar/index.d.ts +1 -0
  12. package/lib/components/AvatarGroup/AvatarGroup.d.ts +161 -0
  13. package/lib/components/AvatarGroup/index.d.ts +1 -0
  14. package/lib/components/Badge/Badge.d.ts +138 -0
  15. package/lib/components/Badge/index.d.ts +1 -0
  16. package/lib/components/Banner/Banner.d.ts +52 -0
  17. package/lib/components/Banner/index.d.ts +1 -0
  18. package/lib/components/Breadcrumbs/BreadcrumbLink/BreadcrumbLink.d.ts +50 -0
  19. package/lib/components/Breadcrumbs/BreadcrumbLink/index.d.ts +1 -0
  20. package/lib/components/Breadcrumbs/Breadcrumbs.d.ts +64 -0
  21. package/lib/components/Breadcrumbs/index.d.ts +2 -0
  22. package/lib/components/Button/Button.d.ts +288 -0
  23. package/lib/components/Button/index.d.ts +14 -0
  24. package/lib/components/ButtonDropdown/ButtonDropdown.d.ts +192 -0
  25. package/lib/components/ButtonDropdown/SimpleButtonDropdown.d.ts +148 -0
  26. package/lib/components/ButtonDropdown/index.d.ts +2 -0
  27. package/lib/components/ButtonTabs/ButtonTab/ButtonTab.d.ts +82 -0
  28. package/lib/components/ButtonTabs/ButtonTab/index.d.ts +1 -0
  29. package/lib/components/ButtonTabs/ButtonTabDropdown.d.ts +118 -0
  30. package/lib/components/ButtonTabs/ButtonTabs.d.ts +113 -0
  31. package/lib/components/ButtonTabs/index.d.ts +2 -0
  32. package/lib/components/Card/Card.d.ts +163 -0
  33. package/lib/components/Card/index.d.ts +1 -0
  34. package/lib/components/Charts/ChartTooltip/index.d.ts +10 -0
  35. package/lib/components/Charts/ChartWrapper/ChartWrapper.d.ts +184 -0
  36. package/lib/components/Charts/ChartWrapper/index.d.ts +1 -0
  37. package/lib/components/Charts/ColumnChart/ColumnChart.d.ts +111 -0
  38. package/lib/components/Charts/ColumnChart/index.d.ts +1 -0
  39. package/lib/components/Charts/DonutChart/DonutChart.d.ts +142 -0
  40. package/lib/components/Charts/DonutChart/index.d.ts +1 -0
  41. package/lib/components/Charts/FunnelChart/FunnelChart.d.ts +99 -0
  42. package/lib/components/Charts/FunnelChart/index.d.ts +1 -0
  43. package/lib/components/Charts/LineChart/LineChart.d.ts +97 -0
  44. package/lib/components/Charts/LineChart/index.d.ts +1 -0
  45. package/lib/components/Charts/SpiderChart/SpiderChart.d.ts +95 -0
  46. package/lib/components/Charts/SpiderChart/index.d.ts +1 -0
  47. package/lib/components/Charts/index.d.ts +7 -0
  48. package/lib/components/ChatBubble/ChatBubble.d.ts +203 -0
  49. package/lib/components/ChatBubble/index.d.ts +1 -0
  50. package/lib/components/Checkbox/Checkbox.d.ts +165 -0
  51. package/lib/components/Checkbox/CheckboxGroup.d.ts +113 -0
  52. package/lib/components/Checkbox/index.d.ts +2 -0
  53. package/lib/components/Chip/Chip.d.ts +181 -0
  54. package/lib/components/Chip/index.d.ts +2 -0
  55. package/lib/components/CircularLoader/CircularLoader.d.ts +56 -0
  56. package/lib/components/CircularLoader/index.d.ts +1 -0
  57. package/lib/components/CollapsibleCard/CollapsibleCard.d.ts +134 -0
  58. package/lib/components/CollapsibleCard/index.d.ts +1 -0
  59. package/lib/components/Combobox/Combobox.d.ts +292 -0
  60. package/lib/components/Combobox/helper.d.ts +205 -0
  61. package/lib/components/Combobox/index.d.ts +1 -0
  62. package/lib/components/ConditionalWrapper/ConditionalWrapper.d.ts +12 -0
  63. package/lib/components/ConditionalWrapper/index.d.ts +1 -0
  64. package/lib/components/DateRangePicker/Calendar.d.ts +119 -0
  65. package/lib/components/DateRangePicker/DateRangePicker.d.ts +196 -0
  66. package/lib/components/DateRangePicker/DateRangeWrapper.d.ts +311 -0
  67. package/lib/components/DateRangePicker/Day.d.ts +70 -0
  68. package/lib/components/DateRangePicker/index.d.ts +1 -0
  69. package/lib/components/Dialog/Dialog.d.ts +208 -0
  70. package/lib/components/Dialog/index.d.ts +1 -0
  71. package/lib/components/Disclaimer/Disclaimer.d.ts +32 -0
  72. package/lib/components/Disclaimer/index.d.ts +1 -0
  73. package/lib/components/Dropdown/Dropdown.d.ts +145 -0
  74. package/lib/components/Dropdown/SimpleDropdown.d.ts +142 -0
  75. package/lib/components/Dropdown/index.d.ts +2 -0
  76. package/lib/components/EmptyState/EmptyImages/CalendarEmptyImage.d.ts +108 -0
  77. package/lib/components/EmptyState/EmptyImages/ChartEmptyImage.d.ts +194 -0
  78. package/lib/components/EmptyState/EmptyImages/DataEmptyImage.d.ts +116 -0
  79. package/lib/components/EmptyState/EmptyImages/FileEmptyImage.d.ts +133 -0
  80. package/lib/components/EmptyState/EmptyImages/MessageEmptyImage.d.ts +64 -0
  81. package/lib/components/EmptyState/EmptyImages/UploadEmptyImage.d.ts +67 -0
  82. package/lib/components/EmptyState/EmptyImages/index.d.ts +6 -0
  83. package/lib/components/EmptyState/EmptyState.d.ts +82 -0
  84. package/lib/components/EmptyState/index.d.ts +1 -0
  85. package/lib/components/ErrorMessage/ErrorImages/ForbiddenImage.d.ts +85 -0
  86. package/lib/components/ErrorMessage/ErrorImages/NotFoundImage.d.ts +117 -0
  87. package/lib/components/ErrorMessage/ErrorImages/ServerErrorImage.d.ts +237 -0
  88. package/lib/components/ErrorMessage/ErrorImages/UnauthorizedImage.d.ts +73 -0
  89. package/lib/components/ErrorMessage/ErrorImages/index.d.ts +4 -0
  90. package/lib/components/ErrorMessage/ErrorMessage.d.ts +86 -0
  91. package/lib/components/ErrorMessage/index.d.ts +1 -0
  92. package/lib/components/FileUpload/FileBlock/FileBlock.d.ts +137 -0
  93. package/lib/components/FileUpload/FileBlock/index.d.ts +1 -0
  94. package/lib/components/FileUpload/FileUpload.d.ts +190 -0
  95. package/lib/components/FileUpload/index.d.ts +2 -0
  96. package/lib/components/FocusManager/FocusManager.d.ts +52 -0
  97. package/lib/components/FocusManager/index.d.ts +1 -0
  98. package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.d.ts +137 -0
  99. package/lib/components/FocusManagerWithArrowKeyNavigation/index.d.ts +1 -0
  100. package/lib/components/FormTitleWrapper/FormTitleWrapper.d.ts +62 -0
  101. package/lib/components/FormTitleWrapper/index.d.ts +1 -0
  102. package/lib/components/Grid/Grid.d.ts +104 -0
  103. package/lib/components/Grid/index.d.ts +1 -0
  104. package/lib/components/Icon/ClickableIcon.d.ts +101 -0
  105. package/lib/components/Icon/Icon.d.ts +71 -0
  106. package/lib/components/Icon/Icon.docs.d.ts +138 -0
  107. package/lib/components/Icon/SemanticIcon.d.ts +42 -0
  108. package/lib/components/Icon/index.d.ts +3 -0
  109. package/lib/components/InContextAlert/InContextAlert.d.ts +210 -0
  110. package/lib/components/InContextAlert/index.d.ts +1 -0
  111. package/lib/components/InlineDropdown/InlineDropdown.d.ts +146 -0
  112. package/lib/components/InlineDropdown/SimpleInlineDropdown.d.ts +145 -0
  113. package/lib/components/InlineDropdown/index.d.ts +2 -0
  114. package/lib/components/Input/Input.d.ts +327 -0
  115. package/lib/components/Input/index.d.ts +1 -0
  116. package/lib/components/KPIBox/KPIBox.d.ts +89 -0
  117. package/lib/components/KPIBox/index.d.ts +1 -0
  118. package/lib/components/LinearLoader/LinearLoader.d.ts +44 -0
  119. package/lib/components/LinearLoader/index.d.ts +1 -0
  120. package/lib/components/Link/Link.d.ts +225 -0
  121. package/lib/components/Link/index.d.ts +1 -0
  122. package/lib/components/Menu/Menu.d.ts +379 -0
  123. package/lib/components/Menu/MenuOptionButton.d.ts +199 -0
  124. package/lib/components/Menu/index.d.ts +2 -0
  125. package/lib/components/Modal/Modal.d.ts +354 -0
  126. package/lib/components/Modal/index.d.ts +14 -0
  127. package/lib/components/Notification/Notification.d.ts +147 -0
  128. package/lib/components/Notification/index.d.ts +1 -0
  129. package/lib/components/OptionButton/OptionButton.d.ts +150 -0
  130. package/lib/components/OptionButton/SimpleOptionButton.d.ts +150 -0
  131. package/lib/components/OptionButton/index.d.ts +2 -0
  132. package/lib/components/PageTitle/PageTitle.d.ts +256 -0
  133. package/lib/components/PageTitle/index.d.ts +1 -0
  134. package/lib/components/Pagination/Pagination.d.ts +144 -0
  135. package/lib/components/Pagination/PaginationItem.d.ts +136 -0
  136. package/lib/components/Pagination/index.d.ts +1 -0
  137. package/lib/components/Panel/Panel.d.ts +168 -0
  138. package/lib/components/Panel/index.d.ts +9 -0
  139. package/lib/components/ProgressDonut/ProgressDonut.d.ts +102 -0
  140. package/lib/components/ProgressDonut/index.d.ts +1 -0
  141. package/lib/components/PromptChip/PromptChip.d.ts +167 -0
  142. package/lib/components/PromptChip/index.d.ts +1 -0
  143. package/lib/components/PromptInput/PromptInput.d.ts +189 -0
  144. package/lib/components/PromptInput/index.d.ts +1 -0
  145. package/lib/components/RadioButton/RadioButton.d.ts +132 -0
  146. package/lib/components/RadioButton/RadioGroup.d.ts +88 -0
  147. package/lib/components/RadioButton/index.d.ts +2 -0
  148. package/lib/components/RadioTile/RadioTile.d.ts +109 -0
  149. package/lib/components/RadioTile/index.d.ts +1 -0
  150. package/lib/components/RangeSlider/RangeSlider.d.ts +207 -0
  151. package/lib/components/RangeSlider/index.d.ts +1 -0
  152. package/lib/components/Rating/Rating.d.ts +131 -0
  153. package/lib/components/Rating/index.d.ts +1 -0
  154. package/lib/components/ScoreBar/ScoreBar.d.ts +122 -0
  155. package/lib/components/ScoreBar/index.d.ts +1 -0
  156. package/lib/components/SearchInput/SearchInput.d.ts +79 -0
  157. package/lib/components/SearchInput/index.d.ts +2 -0
  158. package/lib/components/Separator/Separator.d.ts +51 -0
  159. package/lib/components/Separator/index.d.ts +1 -0
  160. package/lib/components/Shimmer/Shimmer.d.ts +131 -0
  161. package/lib/components/Shimmer/index.d.ts +1 -0
  162. package/lib/components/SideMenuLink/SideMenuLink.d.ts +336 -0
  163. package/lib/components/SideMenuLink/index.d.ts +1 -0
  164. package/lib/components/StatusIndicator/StatusIndicator.d.ts +60 -0
  165. package/lib/components/StatusIndicator/index.d.ts +1 -0
  166. package/lib/components/Stepper/Step/Step.d.ts +119 -0
  167. package/lib/components/Stepper/Step/StepContent.d.ts +35 -0
  168. package/lib/components/Stepper/Step/StepLabel.d.ts +35 -0
  169. package/lib/components/Stepper/Step/index.d.ts +3 -0
  170. package/lib/components/Stepper/Stepper.d.ts +60 -0
  171. package/lib/components/Stepper/index.d.ts +2 -0
  172. package/lib/components/StickyBar/StickyBar.d.ts +55 -0
  173. package/lib/components/StickyBar/index.d.ts +1 -0
  174. package/lib/components/SubMenu/SubMenu.d.ts +89 -0
  175. package/lib/components/SubMenu/SubMenuGroup.d.ts +156 -0
  176. package/lib/components/SubMenu/SubMenuItem.d.ts +161 -0
  177. package/lib/components/SubMenu/SubMenuLink.d.ts +81 -0
  178. package/lib/components/SubMenu/index.d.ts +4 -0
  179. package/lib/components/Table/Cell.d.ts +107 -0
  180. package/lib/components/Table/DefaultRow.d.ts +144 -0
  181. package/lib/components/Table/DefaultTableHeader.d.ts +236 -0
  182. package/lib/components/Table/StaticTable.d.ts +198 -0
  183. package/lib/components/Table/Table.d.ts +113 -0
  184. package/lib/components/Table/Table.docs.d.ts +532 -0
  185. package/lib/components/Table/TableActionBar.d.ts +48 -0
  186. package/lib/components/Table/TableBottomBar.d.ts +20 -0
  187. package/lib/components/Table/TableTopBar.d.ts +20 -0
  188. package/lib/components/Table/dummyTableData.d.ts +2189 -0
  189. package/lib/components/Table/hooks.d.ts +98 -0
  190. package/lib/components/Table/index.d.ts +8 -0
  191. package/lib/components/Tabs/Tab/Tab.d.ts +146 -0
  192. package/lib/components/Tabs/Tab/index.d.ts +1 -0
  193. package/lib/components/Tabs/TabList/TabDropdown.d.ts +100 -0
  194. package/lib/components/Tabs/TabList/TabList.d.ts +157 -0
  195. package/lib/components/Tabs/TabList/index.d.ts +1 -0
  196. package/lib/components/Tabs/index.d.ts +2 -0
  197. package/lib/components/Text/Text.d.ts +1021 -0
  198. package/lib/components/Text/index.d.ts +30 -0
  199. package/lib/components/TextTile/TextTile.d.ts +40 -0
  200. package/lib/components/TextTile/index.d.ts +1 -0
  201. package/lib/components/Textarea/Textarea.d.ts +132 -0
  202. package/lib/components/Textarea/index.d.ts +2 -0
  203. package/lib/components/Timeline/Timeline.d.ts +40 -0
  204. package/lib/components/Timeline/TimelineItem/TimelineItem.d.ts +121 -0
  205. package/lib/components/Timeline/TimelineItem/index.d.ts +1 -0
  206. package/lib/components/Timeline/index.d.ts +2 -0
  207. package/lib/components/Toast/Toast.d.ts +248 -0
  208. package/lib/components/Toast/ToastContainer.d.ts +140 -0
  209. package/lib/components/Toast/ToastManager.d.ts +58 -0
  210. package/lib/components/Toast/index.d.ts +10 -0
  211. package/lib/components/Toggle/Toggle.d.ts +111 -0
  212. package/lib/components/Toggle/index.d.ts +1 -0
  213. package/lib/components/TokenListInput/TokenListInput.d.ts +333 -0
  214. package/lib/components/TokenListInput/TokenValueChips.d.ts +64 -0
  215. package/lib/components/TokenListInput/index.d.ts +1 -0
  216. package/lib/components/Tooltip/Tooltip.d.ts +186 -0
  217. package/lib/components/Tooltip/index.d.ts +1 -0
  218. package/lib/components/Truncate/Truncate.d.ts +87 -0
  219. package/lib/components/Truncate/index.d.ts +2 -0
  220. package/lib/components/TruncatedTextWithTooltip/TruncatedTextWithTooltip.d.ts +95 -0
  221. package/lib/components/TruncatedTextWithTooltip/index.d.ts +1 -0
  222. package/lib/components/Typeahead/SimpleTypeahead.d.ts +141 -0
  223. package/lib/components/Typeahead/Typeahead.d.ts +217 -0
  224. package/lib/components/Typeahead/index.d.ts +2 -0
  225. package/lib/components/WeekdayPicker/WeekdayPicker.d.ts +242 -0
  226. package/lib/components/WeekdayPicker/index.d.ts +1 -0
  227. package/lib/components/index.d.ts +71 -0
  228. package/lib/hooks/index.d.ts +12 -0
  229. package/lib/hooks/useArbitraryOptionAddition/index.d.ts +1 -0
  230. package/lib/hooks/useArbitraryOptionAddition/useArbitraryOptionAddition.d.ts +124 -0
  231. package/lib/hooks/useCopyToClipboard/index.d.ts +1 -0
  232. package/lib/hooks/useCopyToClipboard/useCopyToClipboard.d.ts +27 -0
  233. package/lib/hooks/useFileUpload/index.d.ts +1 -0
  234. package/lib/hooks/useFileUpload/useFileUpload.d.ts +342 -0
  235. package/lib/hooks/useFilteredOptions/index.d.ts +1 -0
  236. package/lib/hooks/useFilteredOptions/useFilteredOptions.d.ts +87 -0
  237. package/lib/hooks/useInputState/index.d.ts +1 -0
  238. package/lib/hooks/useInputState/useInputState.d.ts +22 -0
  239. package/lib/hooks/useLockedBody/index.d.ts +1 -0
  240. package/lib/hooks/useLockedBody/useLockedBody.d.ts +46 -0
  241. package/lib/hooks/useModal/index.d.ts +1 -0
  242. package/lib/hooks/useModal/useModal.d.ts +32 -0
  243. package/lib/hooks/useMountTransition/index.d.ts +24 -0
  244. package/lib/hooks/usePagination/index.d.ts +1 -0
  245. package/lib/hooks/usePagination/usePagination.d.ts +140 -0
  246. package/lib/hooks/useToastPortal/index.d.ts +1 -0
  247. package/lib/hooks/useToastPortal/useToastPortal.d.ts +31 -0
  248. package/lib/hooks/useToggle/index.d.ts +1 -0
  249. package/lib/hooks/useToggle/useToggle.d.ts +11 -0
  250. package/lib/hooks/useWindowSize/index.d.ts +1 -0
  251. package/lib/hooks/useWindowSize/useWindowSize.d.ts +28 -0
  252. package/lib/index.d.ts +5 -0
  253. package/lib/styles/index.d.ts +267 -0
  254. package/lib/styles/variables/_border.d.ts +12 -0
  255. package/lib/styles/variables/_color.d.ts +104 -0
  256. package/lib/styles/variables/_elevation.d.ts +7 -0
  257. package/lib/styles/variables/_font.d.ts +30 -0
  258. package/lib/styles/variables/_motion.d.ts +6 -0
  259. package/lib/styles/variables/_opacity.d.ts +15 -0
  260. package/lib/styles/variables/_shadow.d.ts +24 -0
  261. package/lib/styles/variables/_size.d.ts +57 -0
  262. package/lib/styles/variables/_space.d.ts +12 -0
  263. package/lib/types/charts.d.ts +225 -0
  264. package/lib/types/common.d.ts +10 -0
  265. package/lib/types/date-range-picker.d.ts +17 -0
  266. package/lib/types/date-range-picker.js.flow +2 -3
  267. package/lib/types/index.d.ts +6 -0
  268. package/lib/types/menu.d.ts +13 -0
  269. package/lib/types/toast.d.ts +32 -0
  270. package/lib/types/typography.d.ts +17 -0
  271. package/lib/utils/array/are-arrays-equal.d.ts +11 -0
  272. package/lib/utils/array/index.d.ts +1 -0
  273. package/lib/utils/charts/charts.d.ts +102 -0
  274. package/lib/utils/charts/columnChart.d.ts +51 -0
  275. package/lib/utils/charts/donutChart.d.ts +116 -0
  276. package/lib/utils/charts/funnelChart.d.ts +94 -0
  277. package/lib/utils/charts/helpers.d.ts +44 -0
  278. package/lib/utils/charts/index.d.ts +7 -0
  279. package/lib/utils/charts/lineChart.d.ts +44 -0
  280. package/lib/utils/charts/spiderChart.d.ts +46 -0
  281. package/lib/utils/charts/typography.d.ts +42 -0
  282. package/lib/utils/classify/index.d.ts +27 -0
  283. package/lib/utils/click-away/click-away.d.ts +194 -0
  284. package/lib/utils/click-away/index.d.ts +1 -0
  285. package/lib/utils/date-range-picker/date-range-picker.d.ts +391 -0
  286. package/lib/utils/date-range-picker/index.d.ts +2 -0
  287. package/lib/utils/date-range-picker/timezones.d.ts +262 -0
  288. package/lib/utils/dom/dom.d.ts +245 -0
  289. package/lib/utils/dom/index.d.ts +1 -0
  290. package/lib/utils/helpers/helpers.d.ts +48 -0
  291. package/lib/utils/helpers/index.d.ts +1 -0
  292. package/lib/utils/index.d.ts +14 -0
  293. package/lib/utils/makeClassNameComponent/index.d.ts +1 -0
  294. package/lib/utils/makeClassNameComponent/makeClassNameComponent.d.ts +73 -0
  295. package/lib/utils/menu/index.d.ts +1 -0
  296. package/lib/utils/merge-refs/index.d.ts +1 -0
  297. package/lib/utils/merge-refs/merge-refs.d.ts +15 -0
  298. package/lib/utils/rating/index.d.ts +1 -0
  299. package/lib/utils/rating/rating.d.ts +31 -0
  300. package/lib/utils/score-bar/index.d.ts +1 -0
  301. package/lib/utils/score-bar/score-bar.d.ts +54 -0
  302. package/lib/utils/string/index.d.ts +1 -0
  303. package/lib/utils/string/string.d.ts +30 -0
  304. package/lib/utils/token-list-input/token-list-input.d.ts +32 -0
  305. package/lib/utils/tokens/index.d.ts +1 -0
  306. package/lib/utils/tokens/tokens.d.ts +230 -0
  307. package/package.json +5 -5
@@ -0,0 +1,27 @@
1
+ import {useState} from 'react';
2
+ type CopiedValue = string | null;
3
+ type CopyFn = (text: string) => Promise<boolean>; // Return success
4
+
5
+ export function useCopyToClipboard(): [CopiedValue, CopyFn] {
6
+ const [copiedText, setCopiedText] = useState<CopiedValue>(null);
7
+
8
+ const copy: CopyFn = async (text) => {
9
+ if (!navigator.clipboard) {
10
+ console.warn('Clipboard not supported');
11
+ return false;
12
+ }
13
+
14
+ // Try to save to clipboard then save it in the state if worked
15
+ try {
16
+ await navigator.clipboard.writeText(text);
17
+ setCopiedText(text);
18
+ return true;
19
+ } catch (error) {
20
+ console.warn('Copy failed', error);
21
+ setCopiedText(null);
22
+ return false;
23
+ }
24
+ };
25
+
26
+ return [copiedText, copy];
27
+ }
@@ -0,0 +1 @@
1
+ export * from './useFileUpload';
@@ -0,0 +1,342 @@
1
+ import * as React from 'react';
2
+ // @ts-expect-error[untyped-import]
3
+ import {useDropzone} from 'react-dropzone';
4
+ import type {
5
+ FileObject,
6
+ FileProgress,
7
+ FileRejection,
8
+ FileUploadBaseProps,
9
+ } from '../../components/FileUpload';
10
+ import {uuid} from '../../utils/helpers';
11
+ // useFileUpload hook returns these props
12
+ export type UseFileUploadReturnProps = {
13
+ validFiles: Array<FileObject>;
14
+ rejectedFiles: Array<FileObject>;
15
+ isDragActive: boolean;
16
+ shouldAcceptFiles: boolean;
17
+ getRootProps: (arg0: unknown) => unknown;
18
+ getInputProps: (arg0: unknown) => unknown;
19
+ handleFileClear: (id: string) => unknown;
20
+ handleClear: () => unknown;
21
+ moveFileToProgress: (id: string, progress: FileProgress) => unknown;
22
+ moveFileToSuccess: (id: string, successMessage?: string) => unknown;
23
+ moveFileToReject: (id: string, rejectReason?: string) => unknown;
24
+ setShowReUpload: (id: string, showReUpload?: boolean) => unknown;
25
+ };
26
+ type State = {
27
+ validFiles: Array<FileObject>;
28
+ rejectedFiles: Array<FileObject>;
29
+ };
30
+ type Action =
31
+ | {
32
+ type: 'ADD_VALID_FILES';
33
+ files: Array<FileObject>;
34
+ }
35
+ | {
36
+ type: 'ADD_REJECTED_FILES';
37
+ files: Array<FileObject>;
38
+ }
39
+ | {
40
+ type: 'REMOVE_FILE';
41
+ id: string;
42
+ }
43
+ | {
44
+ type: 'CLEAR_FILES';
45
+ }
46
+ | {
47
+ type: 'UPDATE_FILE_PROGRESS';
48
+ id: string;
49
+ progress: FileProgress;
50
+ }
51
+ | {
52
+ type: 'SET_FILE_SUCCESS';
53
+ id: string;
54
+ successMessage?: string;
55
+ }
56
+ | {
57
+ type: 'SET_FILE_REJECT';
58
+ id: string;
59
+ rejectReason?: string;
60
+ }
61
+ | {
62
+ type: 'SET_FILE_RE_UPLOAD';
63
+ id: string;
64
+ showReUpload?: boolean;
65
+ };
66
+ const initialState: State = {
67
+ validFiles: [],
68
+ rejectedFiles: [],
69
+ };
70
+
71
+ const reducer = (state: State, action: Action): State => {
72
+ switch (action.type) {
73
+ case 'ADD_VALID_FILES':
74
+ return {...state, validFiles: [...state.validFiles, ...action.files]};
75
+
76
+ case 'ADD_REJECTED_FILES':
77
+ return {
78
+ ...state,
79
+ rejectedFiles: [...state.rejectedFiles, ...action.files],
80
+ };
81
+
82
+ case 'REMOVE_FILE':
83
+ return {
84
+ ...state,
85
+ validFiles: state.validFiles.filter((file) => file.id !== action.id),
86
+ rejectedFiles: state.rejectedFiles.filter(
87
+ (file) => file.id !== action.id,
88
+ ),
89
+ };
90
+
91
+ case 'CLEAR_FILES':
92
+ return {
93
+ validFiles: [],
94
+ rejectedFiles: [],
95
+ };
96
+
97
+ case 'UPDATE_FILE_PROGRESS':
98
+ return {
99
+ ...state,
100
+ validFiles: state.validFiles.map((file) =>
101
+ file.id === action.id
102
+ ? {
103
+ ...file,
104
+ progress: action.progress,
105
+ showReUpload: false,
106
+ successMessage: undefined,
107
+ rejectReason: undefined,
108
+ }
109
+ : file,
110
+ ),
111
+ rejectedFiles: state.rejectedFiles.map((file) =>
112
+ file.id === action.id
113
+ ? {
114
+ ...file,
115
+ progress: action.progress,
116
+ showReUpload: false,
117
+ successMessage: undefined,
118
+ rejectReason: undefined,
119
+ }
120
+ : file,
121
+ ),
122
+ };
123
+
124
+ case 'SET_FILE_RE_UPLOAD':
125
+ return {
126
+ ...state,
127
+ validFiles: state.validFiles.map((file) =>
128
+ file.id === action.id
129
+ ? {...file, progress: undefined, showReUpload: action.showReUpload}
130
+ : file,
131
+ ),
132
+ rejectedFiles: state.rejectedFiles.map((file) =>
133
+ file.id === action.id
134
+ ? {...file, progress: undefined, showReUpload: action.showReUpload}
135
+ : file,
136
+ ),
137
+ };
138
+
139
+ case 'SET_FILE_SUCCESS': {
140
+ // Note: When a file is accepted manually we would move a file from rejected files(if found) to valid files first
141
+ const fileIndex = state.rejectedFiles.findIndex(
142
+ (file) => file.id === action.id,
143
+ );
144
+ let validFiles = [...state.validFiles];
145
+ const rejectedFiles = [...state.rejectedFiles];
146
+
147
+ if (fileIndex !== -1) {
148
+ const file = rejectedFiles[fileIndex];
149
+ rejectedFiles.splice(fileIndex, 1);
150
+ validFiles = [...validFiles, {...file}];
151
+ }
152
+
153
+ validFiles = validFiles.map((file) =>
154
+ file.id === action.id
155
+ ? {
156
+ ...file,
157
+ success: true,
158
+ successMessage: action.successMessage,
159
+ reject: false,
160
+ rejectReason: undefined,
161
+ progress: undefined,
162
+ showReUpload: false,
163
+ }
164
+ : file,
165
+ );
166
+ return {...state, validFiles, rejectedFiles};
167
+ }
168
+
169
+ case 'SET_FILE_REJECT': {
170
+ // Note: When a file is rejected manually we would move a file from valid files(if found) to rejected files first
171
+ const fileIndex = state.validFiles.findIndex(
172
+ (file) => file.id === action.id,
173
+ );
174
+ const validFiles = [...state.validFiles];
175
+ let rejectedFiles = [...state.rejectedFiles];
176
+
177
+ if (fileIndex !== -1) {
178
+ const file = validFiles[fileIndex];
179
+ validFiles.splice(fileIndex, 1);
180
+ rejectedFiles = [...rejectedFiles, {...file}];
181
+ }
182
+
183
+ rejectedFiles = rejectedFiles.map((file) =>
184
+ file.id === action.id
185
+ ? {
186
+ ...file,
187
+ reject: true,
188
+ rejectReason: action.rejectReason,
189
+ success: false,
190
+ successMessage: undefined,
191
+ progress: undefined,
192
+ showReUpload: false,
193
+ }
194
+ : file,
195
+ );
196
+ return {...state, validFiles, rejectedFiles};
197
+ }
198
+
199
+ default:
200
+ return state;
201
+ }
202
+ };
203
+
204
+ // This is a map of error codes returned by react-dropzone and their corresponding error messages
205
+ const DROPZONE_ERROR_MESSAGES = {
206
+ 'file-too-large': 'File exceeds maximum size',
207
+ 'file-invalid-type': 'Wrong file type',
208
+ 'too-many-files': 'Too many files',
209
+ 'file-too-small': 'File is too small',
210
+ };
211
+ export const useFileUpload = ({
212
+ maxFiles = 1,
213
+ maxSize,
214
+ accept,
215
+ disabled,
216
+ onValidFilesDrop,
217
+ onRejectedFilesDrop,
218
+ onFileClear,
219
+ onClear,
220
+ }: FileUploadBaseProps): UseFileUploadReturnProps => {
221
+ const [state, dispatch] = React.useReducer(reducer, initialState);
222
+
223
+ // Callbacks for when files are dropped / selected and are valid
224
+ const handleDropAccepted = (acceptedFiles: Array<File>) => {
225
+ const validFiles = acceptedFiles.map((file) => ({
226
+ file,
227
+ id: uuid(),
228
+ reject: false,
229
+ rejectReason: undefined,
230
+ success: true,
231
+ successMessage: undefined,
232
+ progress: undefined,
233
+ showReUpload: false,
234
+ }));
235
+ dispatch({
236
+ type: 'ADD_VALID_FILES',
237
+ files: validFiles,
238
+ });
239
+ onValidFilesDrop?.(validFiles);
240
+ };
241
+
242
+ // Callbacks for when files are dropped / selected and are invalid
243
+ const handleDropRejected = (fileRejections: Array<FileRejection>) => {
244
+ const rejectedFiles = fileRejections.map(({file, errors}) => ({
245
+ file,
246
+ id: uuid(),
247
+ reject: true,
248
+ rejectReason:
249
+ DROPZONE_ERROR_MESSAGES[errors[0].code] ||
250
+ 'Some error occurred uploading this file',
251
+ success: false,
252
+ successMessage: undefined,
253
+ progress: undefined,
254
+ showReUpload: false,
255
+ }));
256
+ dispatch({
257
+ type: 'ADD_REJECTED_FILES',
258
+ files: rejectedFiles,
259
+ });
260
+ onRejectedFilesDrop?.(rejectedFiles);
261
+ };
262
+
263
+ const handleFileClear = (id: string) => {
264
+ dispatch({
265
+ type: 'REMOVE_FILE',
266
+ id,
267
+ });
268
+ onFileClear?.(id);
269
+ };
270
+
271
+ const handleClear = () => {
272
+ dispatch({
273
+ type: 'CLEAR_FILES',
274
+ });
275
+ onClear?.();
276
+ };
277
+
278
+ const moveFileToProgress = (id: string, progress: FileProgress) => {
279
+ dispatch({
280
+ type: 'UPDATE_FILE_PROGRESS',
281
+ id,
282
+ progress,
283
+ });
284
+ };
285
+
286
+ // Note(Nishant): If the file is found in rejected files, we move it to valid files first in the reducer
287
+ const moveFileToSuccess = (id: string, successMessage?: string) => {
288
+ dispatch({
289
+ type: 'SET_FILE_SUCCESS',
290
+ id,
291
+ successMessage,
292
+ });
293
+ };
294
+
295
+ // Note(Nishant): If the file is found in valid files, we move it to rejected files first in the reducer
296
+ const moveFileToReject = (id: string, rejectReason?: string) => {
297
+ dispatch({
298
+ type: 'SET_FILE_REJECT',
299
+ id,
300
+ rejectReason,
301
+ });
302
+ };
303
+
304
+ // Note: This is used to show the re-upload button on the file
305
+ const setShowReUpload = (id: string, showReUpload?: boolean) => {
306
+ dispatch({
307
+ type: 'SET_FILE_RE_UPLOAD',
308
+ id,
309
+ showReUpload,
310
+ });
311
+ };
312
+
313
+ const totalFiles = state.validFiles.length + state.rejectedFiles.length;
314
+ const shouldAcceptFiles =
315
+ !disabled && (maxFiles === 0 || totalFiles < maxFiles);
316
+ // We are using react-dropzone's useDropzone hook to get the drag and drop props
317
+ const {isDragActive, getRootProps, getInputProps} = useDropzone({
318
+ maxFiles,
319
+ multiple: maxFiles > 1 || maxFiles === 0,
320
+ maxSize,
321
+ accept,
322
+ disabled,
323
+ noClick: !shouldAcceptFiles,
324
+ noDrag: !shouldAcceptFiles,
325
+ onDropAccepted: handleDropAccepted,
326
+ onDropRejected: handleDropRejected,
327
+ });
328
+ return {
329
+ validFiles: state.validFiles,
330
+ rejectedFiles: state.rejectedFiles,
331
+ shouldAcceptFiles,
332
+ isDragActive,
333
+ getRootProps,
334
+ getInputProps,
335
+ handleFileClear,
336
+ handleClear,
337
+ moveFileToProgress,
338
+ moveFileToSuccess,
339
+ moveFileToReject,
340
+ setShowReUpload,
341
+ };
342
+ };
@@ -0,0 +1 @@
1
+ export * from './useFilteredOptions';
@@ -0,0 +1,87 @@
1
+ import * as React from 'react';
2
+ export type GroupTitleOption<V> = {
3
+ groupTitle: React.ReactNode;
4
+ options?: V[];
5
+ showLineDivider?: boolean;
6
+ };
7
+ // TODO: V should generic with constraints.
8
+ export function useFilteredOptions<V>({
9
+ searchTerm,
10
+ options = [],
11
+ excludedKeys = [],
12
+ groupTitleOptions = [],
13
+ searchOptionsBy = (option: V, searchTerm: string): boolean => {
14
+ // $FlowFixMe
15
+ const {
16
+ label,
17
+ key,
18
+ }: {
19
+ label: string;
20
+ key: string;
21
+ } = option;
22
+ return (
23
+ key.toLowerCase().includes(searchTerm) ||
24
+ (label ? label.toLowerCase().includes(searchTerm) : false)
25
+ );
26
+ },
27
+ }: {
28
+ searchTerm: string;
29
+ options?: V[];
30
+ groupTitleOptions?: GroupTitleOption<V>[];
31
+ excludedKeys?: string[];
32
+ searchOptionsBy?: (option: V, searchTerm: string) => boolean;
33
+ }): {
34
+ filteredOptions?: V[];
35
+ filteredGroupTitleOptions?: GroupTitleOption<V>[];
36
+ } {
37
+ // Memoize the filterExcluded function for performance
38
+ const filterExcluded = React.useCallback(
39
+ (
40
+ list?: V[],
41
+ ): V[] => // $FlowFixMe - list has key property
42
+ list ? list.filter((option) => !excludedKeys.includes(option.key)) : [],
43
+ [excludedKeys],
44
+ );
45
+ return React.useMemo(() => {
46
+ const trimmedValue = (searchTerm || '').trim().toLowerCase();
47
+ // Initialize filteredOptions as an empty array if options are not provided
48
+ let filteredOptions: V[] = [];
49
+
50
+ if (options.length) {
51
+ filteredOptions = filterExcluded(options);
52
+
53
+ // Apply search term filtering
54
+ if (trimmedValue) {
55
+ filteredOptions = filteredOptions.filter((option) =>
56
+ searchOptionsBy(option, trimmedValue),
57
+ );
58
+ }
59
+ }
60
+
61
+ let filteredGroupTitleOptions: GroupTitleOption<V>[] = [];
62
+
63
+ // Process groupTitleOptions if provided
64
+ if (Array.isArray(groupTitleOptions) && groupTitleOptions.length) {
65
+ filteredGroupTitleOptions = groupTitleOptions
66
+ .map((group) => {
67
+ const filtered = filterExcluded(group.options).filter(
68
+ (option) => !trimmedValue || searchOptionsBy(option, trimmedValue),
69
+ );
70
+ return {...group, options: filtered};
71
+ })
72
+ .filter((group) => (group.options ? group.options.length > 0 : false));
73
+ }
74
+
75
+ return {
76
+ filteredOptions,
77
+ filteredGroupTitleOptions,
78
+ };
79
+ }, [
80
+ searchTerm,
81
+ options,
82
+ excludedKeys,
83
+ groupTitleOptions,
84
+ searchOptionsBy,
85
+ filterExcluded,
86
+ ]);
87
+ }
@@ -0,0 +1 @@
1
+ export * from './useInputState';
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ type ReturnType = [
3
+ string,
4
+ (event: React.SyntheticEvent<HTMLInputElement>) => void,
5
+ ];
6
+
7
+ /**
8
+ * Simple Hook to use with input tag. The primary purpose is an abstraction over input onChange property.
9
+ * () => {
10
+ * const [value, onChange] = useInputState("");
11
+ *
12
+ * return <Input type="text" value={value} onChange={onChange} />;
13
+ * }
14
+ */
15
+ export const useInputState = (initialState: string = ''): ReturnType => {
16
+ const [state, setState] = React.useState(initialState);
17
+ const setInputState = React.useCallback(
18
+ (event) => setState(event && event.target.value),
19
+ [],
20
+ );
21
+ return [state, setInputState];
22
+ };
@@ -0,0 +1 @@
1
+ export * from './useLockedBody';
@@ -0,0 +1,46 @@
1
+ import {useEffect, useLayoutEffect, useState} from 'react';
2
+ type ReturnType = [boolean, (locked: boolean) => void];
3
+ export function useLockedBody(initialLocked: boolean = false): ReturnType {
4
+ const [locked, setLocked] = useState(initialLocked);
5
+ // Do the side effect before render
6
+ useLayoutEffect(() => {
7
+ if (!locked) {
8
+ return;
9
+ }
10
+
11
+ // Save initial body style
12
+ const originalOverflow = document.body?.style.overflow || '';
13
+ const originalPaddingRight = document.body?.style.paddingRight || '';
14
+
15
+ // Lock body scroll
16
+ if (document.body) {
17
+ document.body.style.overflow = 'hidden';
18
+ }
19
+
20
+ // Get the scrollBar width
21
+ // TODO(Nishant): Fetch the scrollBar width from the browser
22
+ const scrollBarWidth = 0;
23
+
24
+ // Avoid width reflow
25
+ if (!!scrollBarWidth && document.body) {
26
+ document.body.style.paddingRight = `${scrollBarWidth}px`;
27
+ }
28
+
29
+ return () => {
30
+ if (document.body) {
31
+ document.body.style.overflow = originalOverflow;
32
+ }
33
+
34
+ if (!!scrollBarWidth && document.body) {
35
+ document.body.style.paddingRight = originalPaddingRight;
36
+ }
37
+ };
38
+ }, [locked]);
39
+ // Update state if initialValue changes
40
+ useEffect(() => {
41
+ if (locked !== initialLocked) {
42
+ setLocked(initialLocked);
43
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
44
+ }, [initialLocked]);
45
+ return [locked, setLocked];
46
+ }
@@ -0,0 +1 @@
1
+ export * from './useModal';
@@ -0,0 +1,32 @@
1
+ import {useCallback, useState} from 'react';
2
+ import {motionDurationNormal} from '../../styles/variables/_motion';
3
+ export type UseModalExtras = Record<string, any>;
4
+ export type UseModalReturnType = {
5
+ isOpen: boolean;
6
+ openModal: (extras?: UseModalExtras) => void;
7
+ closeModal: () => void;
8
+ extras: UseModalExtras;
9
+ };
10
+ export const useModal = (): UseModalReturnType => {
11
+ const [isOpen, setIsOpen] = useState(false);
12
+ const [extras, setExtras] = useState({});
13
+ const openModal = useCallback((props: UseModalExtras = {}) => {
14
+ setExtras(props);
15
+ setIsOpen(true);
16
+ }, []);
17
+
18
+ const closeModal = () => {
19
+ setIsOpen(false);
20
+ // Since the Dialog close uses animation and its duration is motionDurationNormal, we should clear the data after the animation duration for better user experience
21
+ setTimeout(() => {
22
+ setExtras({});
23
+ }, parseInt(motionDurationNormal));
24
+ };
25
+
26
+ return {
27
+ isOpen,
28
+ openModal,
29
+ closeModal,
30
+ extras,
31
+ };
32
+ };
@@ -0,0 +1,24 @@
1
+ import {useEffect, useState} from 'react';
2
+
3
+ const useMountTransition = (
4
+ isMounted: boolean,
5
+ unmountDelay: number,
6
+ ): boolean => {
7
+ const [isTransitioning, setIsTransitioning] = useState(false);
8
+ useEffect(() => {
9
+ let timeoutId;
10
+
11
+ if (isMounted && !isTransitioning) {
12
+ setIsTransitioning(true);
13
+ } else if (!isMounted && isTransitioning) {
14
+ timeoutId = setTimeout(() => setIsTransitioning(false), unmountDelay);
15
+ }
16
+
17
+ return () => {
18
+ clearTimeout(timeoutId);
19
+ };
20
+ }, [unmountDelay, isMounted, isTransitioning]);
21
+ return isTransitioning;
22
+ };
23
+
24
+ export default useMountTransition;
@@ -0,0 +1 @@
1
+ export * from './usePagination';