@transferwise/components 46.38.0 → 46.40.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 (202) hide show
  1. package/build/index.js +198 -461
  2. package/build/index.js.map +1 -1
  3. package/build/index.mjs +198 -461
  4. package/build/index.mjs.map +1 -1
  5. package/build/types/flowNavigation/backButton/BackButton.d.ts +5 -17
  6. package/build/types/flowNavigation/backButton/BackButton.d.ts.map +1 -1
  7. package/build/types/flowNavigation/backButton/index.d.ts +2 -2
  8. package/build/types/flowNavigation/backButton/index.d.ts.map +1 -1
  9. package/build/types/index.d.ts +3 -1
  10. package/build/types/index.d.ts.map +1 -1
  11. package/build/types/info/Info.d.ts +2 -2
  12. package/build/types/info/Info.d.ts.map +1 -1
  13. package/build/types/info/index.d.ts +1 -1
  14. package/build/types/info/index.d.ts.map +1 -1
  15. package/build/types/overlayHeader/OverlayHeader.d.ts +9 -18
  16. package/build/types/overlayHeader/OverlayHeader.d.ts.map +1 -1
  17. package/build/types/overlayHeader/index.d.ts +2 -1
  18. package/build/types/overlayHeader/index.d.ts.map +1 -1
  19. package/build/types/processIndicator/ProcessIndicator.d.ts +1 -1
  20. package/build/types/processIndicator/ProcessIndicator.d.ts.map +1 -1
  21. package/build/types/upload/Upload.d.ts +91 -55
  22. package/build/types/upload/Upload.d.ts.map +1 -1
  23. package/build/types/upload/Upload.messages.d.ts +42 -60
  24. package/build/types/upload/Upload.messages.d.ts.map +1 -1
  25. package/build/types/upload/index.d.ts +2 -2
  26. package/build/types/upload/index.d.ts.map +1 -1
  27. package/build/types/upload/steps/completeStep/completeStep.d.ts +11 -18
  28. package/build/types/upload/steps/completeStep/completeStep.d.ts.map +1 -1
  29. package/build/types/upload/steps/completeStep/index.d.ts +2 -1
  30. package/build/types/upload/steps/completeStep/index.d.ts.map +1 -1
  31. package/build/types/upload/steps/index.d.ts +3 -4
  32. package/build/types/upload/steps/index.d.ts.map +1 -1
  33. package/build/types/upload/steps/processingStep/index.d.ts +2 -1
  34. package/build/types/upload/steps/processingStep/index.d.ts.map +1 -1
  35. package/build/types/upload/steps/processingStep/processingStep.d.ts +11 -13
  36. package/build/types/upload/steps/processingStep/processingStep.d.ts.map +1 -1
  37. package/build/types/upload/steps/uploadImageStep/index.d.ts +2 -1
  38. package/build/types/upload/steps/uploadImageStep/index.d.ts.map +1 -1
  39. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +14 -18
  40. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
  41. package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts +1 -1
  42. package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts.map +1 -1
  43. package/build/types/upload/utils/asyncFileRead/index.d.ts +1 -1
  44. package/build/types/upload/utils/asyncFileRead/index.d.ts.map +1 -1
  45. package/build/types/upload/utils/getFileType/getFileType.d.ts +1 -1
  46. package/build/types/upload/utils/getFileType/getFileType.d.ts.map +1 -1
  47. package/build/types/upload/utils/getFileType/index.d.ts +1 -1
  48. package/build/types/upload/utils/getFileType/index.d.ts.map +1 -1
  49. package/build/types/upload/utils/index.d.ts +5 -7
  50. package/build/types/upload/utils/index.d.ts.map +1 -1
  51. package/build/types/upload/utils/isSizeValid/index.d.ts +1 -1
  52. package/build/types/upload/utils/isSizeValid/index.d.ts.map +1 -1
  53. package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts +1 -1
  54. package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts.map +1 -1
  55. package/build/types/upload/utils/isTypeValid/index.d.ts +1 -1
  56. package/build/types/upload/utils/isTypeValid/index.d.ts.map +1 -1
  57. package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts +1 -1
  58. package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts.map +1 -1
  59. package/build/types/upload/utils/postData/index.d.ts +1 -1
  60. package/build/types/upload/utils/postData/index.d.ts.map +1 -1
  61. package/build/types/upload/utils/postData/postData.d.ts +11 -1
  62. package/build/types/upload/utils/postData/postData.d.ts.map +1 -1
  63. package/package.json +24 -26
  64. package/src/accordion/Accordion.spec.js +5 -5
  65. package/src/accordion/AccordionItem/AccordionItem.spec.js +2 -2
  66. package/src/actionButton/ActionButton.spec.tsx +4 -5
  67. package/src/alert/Alert.spec.tsx +4 -4
  68. package/src/alert/Alert.story.tsx +6 -5
  69. package/src/button/Button.spec.js +4 -5
  70. package/src/card/Card.spec.tsx +4 -4
  71. package/src/carousel/Carousel.spec.tsx +17 -17
  72. package/src/checkbox/Checkbox.spec.tsx +0 -2
  73. package/src/checkboxButton/CheckboxButton.spec.tsx +0 -2
  74. package/src/checkboxOption/CheckboxOption.spec.tsx +0 -2
  75. package/src/chevron/Chevron.spec.tsx +0 -1
  76. package/src/chips/Chips.spec.tsx +0 -1
  77. package/src/chips/Chips.story.tsx +5 -3
  78. package/src/circularButton/CircularButton.spec.tsx +4 -5
  79. package/src/common/RadioButton/RadioButton.spec.tsx +2 -2
  80. package/src/common/card/Card.story.tsx +1 -0
  81. package/src/common/closeButton/CloseButton.spec.tsx +0 -1
  82. package/src/common/flowHeader/FlowHeader.spec.tsx +0 -1
  83. package/src/dateInput/DateInput.story.tsx +21 -16
  84. package/src/dateLookup/DateLookup.rtl.spec.tsx +18 -16
  85. package/src/dateLookup/DateLookup.testingLibrary.spec.js +47 -44
  86. package/src/dateLookup/DateLookup.tests.story.tsx +4 -2
  87. package/src/decision/Decision.spec.js +0 -2
  88. package/src/dimmer/Dimmer.rtl.spec.js +10 -10
  89. package/src/drawer/Drawer.rtl.spec.tsx +2 -2
  90. package/src/emphasis/Emphasis.spec.tsx +0 -1
  91. package/src/field/Field.spec.tsx +2 -2
  92. package/src/flowNavigation/FlowNavigation.spec.js +0 -2
  93. package/src/flowNavigation/animatedLabel/AnimatedLabel.spec.js +0 -1
  94. package/src/flowNavigation/backButton/BackButton.tsx +29 -0
  95. package/src/flowNavigation/backButton/index.ts +2 -0
  96. package/src/header/Header.spec.tsx +6 -6
  97. package/src/image/Image.spec.tsx +0 -1
  98. package/src/index.ts +3 -1
  99. package/src/info/Info.story.tsx +15 -9
  100. package/src/info/Info.tsx +2 -2
  101. package/src/info/index.ts +1 -1
  102. package/src/inlineAlert/InlineAlert.spec.tsx +0 -1
  103. package/src/inputs/SelectInput.spec.tsx +26 -47
  104. package/src/link/Link.spec.tsx +0 -1
  105. package/src/listItem/ListItem.spec.tsx +0 -1
  106. package/src/moneyInput/MoneyInput.rtl.spec.tsx +2 -2
  107. package/src/moneyInput/MoneyInput.story.tsx +1 -4
  108. package/src/overlayHeader/{OverlayHeader.spec.js → OverlayHeader.spec.tsx} +1 -1
  109. package/src/overlayHeader/{OverlayHeader.story.js → OverlayHeader.story.tsx} +10 -2
  110. package/src/overlayHeader/{OverlayHeader.js → OverlayHeader.tsx} +12 -19
  111. package/src/overlayHeader/index.ts +2 -0
  112. package/src/phoneNumberInput/PhoneNumberInput.story.tsx +1 -0
  113. package/src/popover/Popover.spec.tsx +10 -10
  114. package/src/processIndicator/ProcessIndicator.tsx +1 -1
  115. package/src/progress/Progress.spec.tsx +0 -1
  116. package/src/progressBar/ProgressBar.spec.tsx +0 -1
  117. package/src/segmentedControl/SegmentedControl.spec.tsx +10 -11
  118. package/src/select/Select.spec.js +71 -71
  119. package/src/test-utils/index.js +1 -1
  120. package/src/test-utils/jest.setup.js +2 -0
  121. package/src/tooltip/Tooltip.spec.tsx +15 -16
  122. package/src/upload/Upload.spec.js +3 -14
  123. package/src/upload/Upload.story.tsx +37 -0
  124. package/src/upload/{Upload.js → Upload.tsx} +164 -169
  125. package/src/upload/index.ts +2 -0
  126. package/src/upload/steps/completeStep/completeStep.spec.js +3 -2
  127. package/src/upload/steps/completeStep/completeStep.tsx +74 -0
  128. package/src/upload/steps/completeStep/index.ts +2 -0
  129. package/src/upload/steps/{index.js → index.ts} +0 -1
  130. package/src/upload/steps/processingStep/index.ts +2 -0
  131. package/src/upload/steps/processingStep/processingStep.tsx +53 -0
  132. package/src/upload/steps/uploadImageStep/index.ts +2 -0
  133. package/src/upload/steps/uploadImageStep/{uploadImageStep.js → uploadImageStep.tsx} +17 -23
  134. package/src/upload/utils/asyncFileRead/asyncFileRead.spec.ts +14 -0
  135. package/src/upload/utils/asyncFileRead/asyncFileRead.ts +12 -0
  136. package/src/upload/utils/getFileType/getFileType.spec.ts +22 -0
  137. package/src/upload/utils/getFileType/getFileType.ts +16 -0
  138. package/src/upload/utils/{index.js → index.ts} +0 -2
  139. package/src/upload/utils/isSizeValid/{isSizeValid.spec.js → isSizeValid.spec.ts} +3 -3
  140. package/src/upload/utils/isSizeValid/isSizeValid.ts +3 -0
  141. package/src/upload/utils/isTypeValid/isTypeValid.spec.ts +62 -0
  142. package/src/upload/utils/isTypeValid/isTypeValid.ts +19 -0
  143. package/src/upload/utils/postData/postData.spec.ts +65 -0
  144. package/src/upload/utils/postData/postData.ts +36 -0
  145. package/src/uploadInput/UploadInput.spec.tsx +9 -10
  146. package/src/uploadInput/UploadInput.story.tsx +8 -180
  147. package/src/uploadInput/UploadInput.tests.story.tsx +212 -0
  148. package/src/uploadInput/UploadInput.tsx +1 -1
  149. package/src/uploadInput/uploadButton/UploadButton.spec.tsx +4 -4
  150. package/src/uploadInput/uploadItem/UploadItem.spec.tsx +4 -4
  151. package/build/types/upload/steps/mediaUploadStep/index.d.ts +0 -2
  152. package/build/types/upload/steps/mediaUploadStep/index.d.ts.map +0 -1
  153. package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts +0 -24
  154. package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts.map +0 -1
  155. package/build/types/upload/uploadSteps.d.ts +0 -5
  156. package/build/types/upload/uploadSteps.d.ts.map +0 -1
  157. package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts +0 -2
  158. package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts.map +0 -1
  159. package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts +0 -2
  160. package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts.map +0 -1
  161. package/build/types/upload/utils/requestMedia/index.d.ts +0 -2
  162. package/build/types/upload/utils/requestMedia/index.d.ts.map +0 -1
  163. package/build/types/upload/utils/requestMedia/requestMedia.d.ts +0 -2
  164. package/build/types/upload/utils/requestMedia/requestMedia.d.ts.map +0 -1
  165. package/src/flowNavigation/backButton/BackButton.js +0 -32
  166. package/src/flowNavigation/backButton/BackButton.spec.js +0 -16
  167. package/src/flowNavigation/backButton/__snapshots__/BackButton.spec.js.snap +0 -37
  168. package/src/flowNavigation/backButton/index.js +0 -3
  169. package/src/overlayHeader/index.js +0 -1
  170. package/src/upload/Upload.story.js +0 -36
  171. package/src/upload/index.js +0 -2
  172. package/src/upload/steps/completeStep/completeStep.js +0 -98
  173. package/src/upload/steps/completeStep/index.js +0 -1
  174. package/src/upload/steps/mediaUploadStep/index.js +0 -1
  175. package/src/upload/steps/mediaUploadStep/mediaUploadStep.js +0 -80
  176. package/src/upload/steps/mediaUploadStep/mediaUploadStep.spec.js +0 -77
  177. package/src/upload/steps/processingStep/index.js +0 -1
  178. package/src/upload/steps/processingStep/processingStep.js +0 -73
  179. package/src/upload/steps/uploadImageStep/index.js +0 -1
  180. package/src/upload/uploadSteps.ts +0 -5
  181. package/src/upload/utils/asyncFileRead/asyncFileRead.js +0 -11
  182. package/src/upload/utils/asyncFileRead/asyncFileRead.spec.js +0 -17
  183. package/src/upload/utils/getFileType/getFileType.js +0 -19
  184. package/src/upload/utils/getFileType/getFileType.spec.js +0 -33
  185. package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.js +0 -18
  186. package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.spec.js +0 -22
  187. package/src/upload/utils/getSupportedSpotMimeTypes/index.js +0 -1
  188. package/src/upload/utils/isSizeValid/isSizeValid.js +0 -1
  189. package/src/upload/utils/isTypeValid/isTypeValid.js +0 -26
  190. package/src/upload/utils/isTypeValid/isTypeValid.spec.js +0 -68
  191. package/src/upload/utils/postData/postData.js +0 -18
  192. package/src/upload/utils/postData/postData.spec.js +0 -109
  193. package/src/upload/utils/requestMedia/index.js +0 -1
  194. package/src/upload/utils/requestMedia/requestMedia.js +0 -26
  195. package/src/upload/utils/requestMedia/requestMedia.spec.js +0 -44
  196. /package/src/overlayHeader/__snapshots__/{OverlayHeader.spec.js.snap → OverlayHeader.spec.tsx.snap} +0 -0
  197. /package/src/upload/{Upload.messages.js → Upload.messages.ts} +0 -0
  198. /package/src/upload/utils/asyncFileRead/{index.js → index.ts} +0 -0
  199. /package/src/upload/utils/getFileType/{index.js → index.ts} +0 -0
  200. /package/src/upload/utils/isSizeValid/{index.js → index.ts} +0 -0
  201. /package/src/upload/utils/isTypeValid/{index.js → index.ts} +0 -0
  202. /package/src/upload/utils/postData/{index.js → index.ts} +0 -0
@@ -9,7 +9,7 @@ describe('Header', () => {
9
9
  expect(screen.getByText('Header title')).toBeInTheDocument();
10
10
  });
11
11
 
12
- it('can trigger header action', () => {
12
+ it('can trigger header action', async () => {
13
13
  const onHeaderActionClick = jest.fn();
14
14
 
15
15
  render(
@@ -22,12 +22,12 @@ describe('Header', () => {
22
22
  />,
23
23
  );
24
24
 
25
- userEvent.click(screen.getByRole('button', { name: 'Click me!' }));
25
+ await userEvent.click(screen.getByRole('button', { name: 'Click me!' }));
26
26
 
27
27
  expect(onHeaderActionClick).toHaveBeenCalledTimes(1);
28
28
  });
29
29
 
30
- it('can set aria-label property for header action', () => {
30
+ it('can set aria-label property for header action', async () => {
31
31
  const onHeaderActionClick = jest.fn();
32
32
 
33
33
  render(
@@ -41,7 +41,7 @@ describe('Header', () => {
41
41
  />,
42
42
  );
43
43
 
44
- userEvent.click(screen.getByRole('button', { name: 'Magic' }));
44
+ await userEvent.click(screen.getByRole('button', { name: 'Magic' }));
45
45
 
46
46
  expect(onHeaderActionClick).toHaveBeenCalledTimes(1);
47
47
  });
@@ -75,7 +75,7 @@ describe('Header', () => {
75
75
  expect(screen.getByRole('heading', { name: 'Header title', level: 3 })).toBeInTheDocument();
76
76
  });
77
77
 
78
- it('runs onClick if specified even when it got href prop', () => {
78
+ it('runs onClick if specified even when it got href prop', async () => {
79
79
  const callback = jest.fn();
80
80
  render(
81
81
  <Header
@@ -88,7 +88,7 @@ describe('Header', () => {
88
88
  const button = screen.getByRole('link', { name: 'Click me' });
89
89
  expect(button).toBeInTheDocument();
90
90
 
91
- userEvent.click(button);
91
+ await userEvent.click(button);
92
92
 
93
93
  expect(callback).toHaveBeenCalledTimes(1);
94
94
  });
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import * as useHasIntersectedUtils from '../common/hooks/useHasIntersected/useHasIntersected';
3
2
  import { render, fireEvent, screen } from '../test-utils';
4
3
 
package/src/index.ts CHANGED
@@ -55,9 +55,10 @@ export type {
55
55
  MoneyInputProps,
56
56
  } from './moneyInput';
57
57
  export type { NavigationOptionListProps } from './navigationOptionsList';
58
+ export type { OverlayHeaderProps } from './overlayHeader';
58
59
  export type { PhoneNumberInputProps } from './phoneNumberInput/PhoneNumberInput';
59
60
  export type { PopoverProps } from './popover';
60
- export type { ProcessIndicatorProps } from './processIndicator';
61
+ export type { ProcessIndicatorProps, ProcessIndicatorStatus } from './processIndicator';
61
62
  export type { ProgressProps } from './progress';
62
63
  export type { ProgressBarProps } from './progressBar';
63
64
  export type { DirectionProviderProps, LanguageProviderProps, ProviderProps } from './provider';
@@ -76,6 +77,7 @@ export type { SwitchOptionProps } from './switchOption';
76
77
  export type { TextareaWithDisplayFormatProps } from './textareaWithDisplayFormat';
77
78
  export type { TooltipProps } from './tooltip';
78
79
  export type { TypeaheadOption, TypeaheadProps } from './typeahead';
80
+ export type { UploadProps } from './upload';
79
81
  export type { UploadError, UploadResponse, UploadedFile } from './uploadInput/types';
80
82
 
81
83
  /**
@@ -5,7 +5,7 @@ import { lorem10, storyConfig } from '../test-utils';
5
5
 
6
6
  import Info, { InfoPresentation } from '.';
7
7
 
8
- export default {
8
+ const meta = {
9
9
  component: Info,
10
10
  title: 'Dialogs/Info',
11
11
  args: {
@@ -20,16 +20,18 @@ export default {
20
20
  ),
21
21
  } satisfies Meta<typeof Info>;
22
22
 
23
- type Story = StoryObj<typeof Info>;
23
+ export default meta;
24
24
 
25
- export const Basic: Story = storyConfig(
25
+ type Story = StoryObj<typeof meta>;
26
+
27
+ export const Basic = storyConfig<typeof meta>(
26
28
  {},
27
29
  {
28
30
  variants: ['default', 'dark', 'rtl'],
29
31
  },
30
32
  );
31
33
 
32
- export const OpenedPopover: Story = {
34
+ export const OpenedPopover = {
33
35
  parameters: {
34
36
  chromatic: {
35
37
  delay: 1000,
@@ -39,15 +41,19 @@ export const OpenedPopover: Story = {
39
41
  const canvas = within(canvasElement);
40
42
  await userEvent.click(canvas.getByRole('button'));
41
43
  },
42
- };
44
+ } satisfies Story;
43
45
 
44
- export const OpenedPopoverMobile: Story = storyConfig(OpenedPopover, { variants: ['mobile'] });
46
+ export const OpenedPopoverMobile = storyConfig(OpenedPopover, {
47
+ variants: ['mobile'],
48
+ });
45
49
 
46
- export const OpenedModal: Story = {
50
+ export const OpenedModal = {
47
51
  ...OpenedPopover,
48
52
  args: {
49
53
  presentation: InfoPresentation.MODAL,
50
54
  },
51
- };
55
+ } satisfies Story;
52
56
 
53
- export const OpenedModalMobile: Story = storyConfig(OpenedModal, { variants: ['mobile'] });
57
+ export const OpenedModalMobile = storyConfig(OpenedModal, {
58
+ variants: ['mobile'],
59
+ });
package/src/info/Info.tsx CHANGED
@@ -10,7 +10,7 @@ import Popover, { PopoverPreferredPlacement } from '../popover';
10
10
  import messages from './Info.messages';
11
11
  import { InfoPresentation } from './infoPresentations';
12
12
 
13
- export interface Props {
13
+ export interface InfoProps {
14
14
  'aria-label'?: string;
15
15
  /**
16
16
  * Extra classes applied to Info
@@ -48,7 +48,7 @@ const Info = ({
48
48
  title = undefined,
49
49
  'aria-label': ariaLabel,
50
50
  preferredPlacement = Position.BOTTOM,
51
- }: Props) => {
51
+ }: InfoProps) => {
52
52
  const intl = useIntl();
53
53
  const [open, setOpen] = useState(false);
54
54
  ariaLabel ??= intl.formatMessage(messages.ariaLabel);
package/src/info/index.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { InfoPresentation } from './infoPresentations';
2
2
  export { default } from './Info';
3
- export type { Props as InfoProps } from './Info';
3
+ export type { InfoProps } from './Info';
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable no-console */
2
- import '@testing-library/jest-dom';
3
2
  import { Sentiment } from '../common';
4
3
  import { render, screen } from '../test-utils';
5
4
 
@@ -1,5 +1,5 @@
1
- import { act, screen, waitFor, within } from '@testing-library/react';
2
- import userEvent from '@testing-library/user-event';
1
+ import { screen, waitFor, within } from '@testing-library/react';
2
+ import { userEvent } from '@testing-library/user-event';
3
3
 
4
4
  import { render, mockMatchMedia, mockResizeObserver } from '../test-utils';
5
5
 
@@ -42,25 +42,22 @@ describe('SelectInput', () => {
42
42
  />,
43
43
  );
44
44
 
45
- // eslint-disable-next-line @typescript-eslint/require-await
46
- await act(async () => {
47
- userEvent.tab();
48
- userEvent.keyboard(' ');
49
- });
45
+ await userEvent.tab();
46
+ await userEvent.keyboard(' ');
50
47
 
51
48
  const footer = screen.getByText('All items shown');
52
49
  expect(footer).toBeInTheDocument();
53
50
 
54
- userEvent.keyboard('u');
51
+ await userEvent.keyboard('u');
55
52
  expect(footer).toHaveTextContent(/‘u’$/);
56
53
 
57
- userEvent.keyboard('r');
54
+ await userEvent.keyboard('r');
58
55
  expect(footer).toHaveTextContent(/‘ur’$/);
59
56
 
60
- userEvent.keyboard('x');
57
+ await userEvent.keyboard('x');
61
58
  expect(footer).toHaveTextContent(/‘urx’$/);
62
59
 
63
- userEvent.keyboard('{Backspace}');
60
+ await userEvent.keyboard('{Backspace}');
64
61
  expect(footer).toHaveTextContent(/‘ur’$/);
65
62
  });
66
63
 
@@ -80,16 +77,13 @@ describe('SelectInput', () => {
80
77
  expect(screen.queryByText('EUR')).not.toBeInTheDocument();
81
78
 
82
79
  const trigger = screen.getAllByRole('button')[0];
83
- // eslint-disable-next-line @typescript-eslint/require-await
84
- await act(async () => {
85
- userEvent.click(trigger);
86
- });
80
+ await userEvent.click(trigger);
87
81
 
88
82
  expect(handleClose).not.toHaveBeenCalled();
89
83
 
90
84
  const listbox = screen.getByRole('listbox');
91
85
  const option = within(listbox).getByRole('option', { name: 'EUR' });
92
- userEvent.click(option);
86
+ await userEvent.click(option);
93
87
 
94
88
  expect(handleClose).toHaveBeenCalledTimes(1);
95
89
  expect(trigger).toHaveTextContent('EUR');
@@ -117,34 +111,28 @@ describe('SelectInput', () => {
117
111
  );
118
112
 
119
113
  const trigger = screen.getAllByRole('button')[0];
120
- // eslint-disable-next-line @typescript-eslint/require-await
121
- await act(async () => {
122
- userEvent.tab();
123
- userEvent.keyboard(' ');
124
- });
114
+ await userEvent.tab();
115
+ await userEvent.keyboard(' ');
125
116
 
126
117
  expect(handleClose).not.toHaveBeenCalled();
127
118
 
128
119
  const listbox = screen.getByRole('listbox');
129
120
  expect(within(listbox).getAllByRole('option')).toHaveLength(3);
130
121
 
131
- userEvent.keyboard('u');
122
+ await userEvent.keyboard('u');
132
123
  expect(within(listbox).getAllByRole('option')).toHaveLength(2);
133
124
 
134
- userEvent.keyboard('r');
125
+ await userEvent.keyboard('r');
135
126
  expect(within(listbox).getByRole('option')).toBeInTheDocument();
136
127
 
137
- userEvent.keyboard('x');
128
+ await userEvent.keyboard('x');
138
129
  expect(within(listbox).queryByRole('option')).not.toBeInTheDocument();
139
130
 
140
- userEvent.keyboard('{Backspace}');
131
+ await userEvent.keyboard('{Backspace}');
141
132
  expect(within(listbox).getByRole('option')).toBeInTheDocument();
142
133
 
143
134
  const option = within(listbox).getAllByRole('option')[0];
144
- // eslint-disable-next-line @typescript-eslint/require-await
145
- await act(async () => {
146
- userEvent.click(option);
147
- });
135
+ await userEvent.click(option);
148
136
 
149
137
  expect(handleClose).toHaveBeenCalledTimes(1);
150
138
  expect(trigger).toHaveTextContent('EUR');
@@ -165,21 +153,18 @@ describe('SelectInput', () => {
165
153
  );
166
154
 
167
155
  const trigger = screen.getAllByRole('button')[0];
168
- // eslint-disable-next-line @typescript-eslint/require-await
169
- await act(async () => {
170
- userEvent.tab();
171
- userEvent.keyboard(' ');
172
- });
156
+ await userEvent.tab();
157
+ await userEvent.keyboard(' ');
173
158
 
174
159
  expect(handleFilterChange).not.toHaveBeenCalled();
175
160
 
176
- userEvent.keyboard(' x');
161
+ await userEvent.keyboard(' x');
177
162
  expect(handleFilterChange).toHaveBeenLastCalledWith({
178
163
  query: ' x',
179
164
  queryNormalized: 'x',
180
165
  });
181
166
 
182
- userEvent.keyboard('{Escape}');
167
+ await userEvent.keyboard('{Escape}');
183
168
  await waitFor(() => {
184
169
  expect(handleFilterChange).toHaveBeenLastCalledWith({
185
170
  query: '',
@@ -187,10 +172,7 @@ describe('SelectInput', () => {
187
172
  });
188
173
  });
189
174
 
190
- // eslint-disable-next-line @typescript-eslint/require-await
191
- await act(async () => {
192
- userEvent.click(trigger);
193
- });
175
+ await userEvent.click(trigger);
194
176
 
195
177
  const listbox = screen.getByRole('listbox');
196
178
  expect(within(listbox).getAllByRole('option')).toHaveLength(2);
@@ -208,16 +190,13 @@ describe('SelectInput', () => {
208
190
  );
209
191
 
210
192
  const trigger = screen.getAllByRole('button')[0];
211
- // eslint-disable-next-line @typescript-eslint/require-await
212
- await act(async () => {
213
- userEvent.click(trigger);
214
- });
193
+ await userEvent.click(trigger);
215
194
 
216
195
  const listbox = screen.getByRole('listbox');
217
196
  const options = within(listbox).getAllByRole('option');
218
- options.forEach((option) => {
219
- userEvent.click(option);
220
- });
197
+ for (const option of options) {
198
+ await userEvent.click(option);
199
+ }
221
200
 
222
201
  expect(trigger).toHaveTextContent('USD, EUR');
223
202
  });
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render, screen } from '../test-utils';
3
2
 
4
3
  import Link from '.';
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import ActionButton from '../actionButton/ActionButton';
3
2
  import { render, screen, within } from '../test-utils';
4
3
 
@@ -62,11 +62,11 @@ describe('MoneyInput', () => {
62
62
  ['1±!@#$^*,_+?><2', '1,2'],
63
63
  ['12,3', '12,3'],
64
64
  ['12.3', '12.3'],
65
- ])("ignores the letters when typed '%s' and shows '%s'", (testValue, expectedValue) => {
65
+ ])("ignores the letters when typed '%s' and shows '%s'", async (testValue, expectedValue) => {
66
66
  render(<MoneyInput {...props} amount={null} />);
67
67
 
68
68
  const input = screen.getByRole('textbox');
69
- userEvent.type(input, testValue);
69
+ await userEvent.type(input, testValue);
70
70
  expect(input).toHaveValue(expectedValue);
71
71
  });
72
72
 
@@ -1,9 +1,7 @@
1
- import { FORCE_RE_RENDER } from '@storybook/core-events';
2
- import { addons, useGlobals } from '@storybook/manager-api';
3
1
  import { Meta, StoryObj } from '@storybook/react';
4
2
  import { expect, within, userEvent } from '@storybook/test';
5
3
  import { Lock } from '@transferwise/icons';
6
- import React, { useEffect, useState } from 'react';
4
+ import { useState } from 'react';
7
5
 
8
6
  import MoneyInput, { CurrencyOptionItem } from '.';
9
7
  import Provider from '../provider/Provider';
@@ -107,7 +105,6 @@ export const SingleCurrency: Story = {
107
105
  args: {
108
106
  currencies: [],
109
107
  selectedCurrency: exampleCurrency.eur,
110
- onCurrencyChange: undefined,
111
108
  },
112
109
  };
113
110
 
@@ -24,7 +24,7 @@ describe('OverlayHeader', () => {
24
24
  });
25
25
 
26
26
  it("doesn't render separator if avatar or onClose are not provided", () => {
27
- const { container, rerender } = render(<OverlayHeader {...props} onClose={null} />);
27
+ const { container, rerender } = render(<OverlayHeader {...props} onClose={undefined} />);
28
28
  expect(container.querySelector('.separator')).not.toBeInTheDocument();
29
29
  rerender(<OverlayHeader {...props} avatar={null} />);
30
30
  expect(container.querySelector('.separator')).not.toBeInTheDocument();
@@ -21,7 +21,11 @@ const avatarProfiles = {
21
21
  };
22
22
 
23
23
  export const Basic = () => {
24
- const showAvatar = select('avatar', Object.keys(avatarProfiles), 'Profile');
24
+ const showAvatar = select(
25
+ 'avatar',
26
+ Object.keys(avatarProfiles) as (keyof typeof avatarProfiles)[],
27
+ 'Profile',
28
+ );
25
29
  return (
26
30
  <OverlayHeader
27
31
  logo={<Logo />}
@@ -40,7 +44,11 @@ export const WithAvatarWrapper = () => {
40
44
  'avatarURL',
41
45
  'https://wise.com/web-art/assets/illustrations/heart-small@2x.webp',
42
46
  );
43
- const profileType = select('profileType', Object.keys(ProfileType));
47
+ const profileType = select(
48
+ 'profileType',
49
+ Object.keys(ProfileType) as `${ProfileType}`[],
50
+ undefined,
51
+ );
44
52
  return (
45
53
  <OverlayHeader
46
54
  logo={<Logo />}
@@ -1,12 +1,21 @@
1
1
  import classNames from 'classnames';
2
- import PropTypes from 'prop-types';
3
2
 
4
3
  import { Size } from '../common';
5
4
  import { CloseButton } from '../common/closeButton';
6
5
  import FlowHeader from '../common/flowHeader';
7
6
  import Logo from '../logo';
8
7
 
9
- const OverlayHeader = ({ avatar, onClose, logo }) => {
8
+ export interface OverlayHeaderProps {
9
+ /** An Avatar */
10
+ avatar?: React.ReactNode;
11
+ logo?: React.ReactNode;
12
+ /** Function called when the close is clicked */
13
+ onClose?: React.MouseEventHandler<HTMLButtonElement>;
14
+ }
15
+
16
+ const defaultLogo = <Logo />;
17
+
18
+ export default function OverlayHeader({ avatar, onClose, logo = defaultLogo }: OverlayHeaderProps) {
10
19
  const closeButton = onClose && <CloseButton size={Size.LARGE} onClick={onClose} />;
11
20
  return (
12
21
  <div className="np-overlay-header d-flex justify-content-center">
@@ -23,20 +32,4 @@ const OverlayHeader = ({ avatar, onClose, logo }) => {
23
32
  />
24
33
  </div>
25
34
  );
26
- };
27
-
28
- OverlayHeader.defaultProps = {
29
- avatar: null,
30
- logo: <Logo />,
31
- onClose: null,
32
- };
33
-
34
- OverlayHeader.propTypes = {
35
- /** An Avatar */
36
- avatar: PropTypes.element,
37
- logo: PropTypes.node,
38
- /** Function called when the close is clicked */
39
- onClose: PropTypes.func,
40
- };
41
-
42
- export default OverlayHeader;
35
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from './OverlayHeader';
2
+ export type { OverlayHeaderProps } from './OverlayHeader';
@@ -19,5 +19,6 @@ export const Basic = {
19
19
  selectProps: {
20
20
  className: 'custom-class',
21
21
  },
22
+ onChange: () => {},
22
23
  },
23
24
  } satisfies Story;
@@ -29,7 +29,7 @@ describe('Popover', () => {
29
29
  </Popover>,
30
30
  );
31
31
 
32
- userEvent.click(screen.getByText('Open'));
32
+ await userEvent.click(screen.getByText('Open'));
33
33
 
34
34
  await waitForPanel();
35
35
  expect(getPanel()).toMatchSnapshot();
@@ -42,7 +42,7 @@ describe('Popover', () => {
42
42
  </Popover>,
43
43
  ));
44
44
 
45
- userEvent.click(screen.getByText('Open'));
45
+ await userEvent.click(screen.getByText('Open'));
46
46
  await waitForPanel();
47
47
 
48
48
  expect(getTitle()).toBeInTheDocument();
@@ -53,7 +53,7 @@ describe('Popover', () => {
53
53
  </Popover>,
54
54
  );
55
55
 
56
- userEvent.click(screen.getByText('Open'));
56
+ await userEvent.click(screen.getByText('Open'));
57
57
 
58
58
  expect(getTitle()).not.toBeInTheDocument();
59
59
  });
@@ -67,7 +67,7 @@ describe('Popover', () => {
67
67
 
68
68
  expect(getPanel()).not.toBeInTheDocument();
69
69
 
70
- userEvent.click(screen.getByText('Open'));
70
+ await userEvent.click(screen.getByText('Open'));
71
71
  await waitForPanel();
72
72
 
73
73
  expect(getPanel()).toBeInTheDocument();
@@ -79,19 +79,19 @@ describe('Popover', () => {
79
79
  global.innerWidth = Breakpoint.SMALL - 1;
80
80
  });
81
81
 
82
- it('renders when is open', () => {
82
+ it('renders when is open', async () => {
83
83
  ({ container } = render(
84
84
  <Popover {...props}>
85
85
  <button type="button">Open</button>
86
86
  </Popover>,
87
87
  ));
88
88
 
89
- userEvent.click(screen.getByText('Open'));
89
+ await userEvent.click(screen.getByText('Open'));
90
90
 
91
91
  expect(container).toMatchSnapshot();
92
92
  });
93
93
 
94
- it('renders BottomSheet onClick', () => {
94
+ it('renders BottomSheet onClick', async () => {
95
95
  render(
96
96
  <Popover {...props}>
97
97
  <button type="button">Open</button>
@@ -100,7 +100,7 @@ describe('Popover', () => {
100
100
 
101
101
  expect(getBottomSheet()).not.toBeInTheDocument();
102
102
 
103
- userEvent.click(screen.getByText('Open'));
103
+ await userEvent.click(screen.getByText('Open'));
104
104
 
105
105
  expect(getBottomSheet()).toBeInTheDocument();
106
106
  });
@@ -115,11 +115,11 @@ describe('Popover', () => {
115
115
  );
116
116
 
117
117
  expect(handleOnClose).not.toHaveBeenCalled();
118
- userEvent.click(screen.getByText('Open'));
118
+ await userEvent.click(screen.getByText('Open'));
119
119
  await waitForPanel();
120
120
  const dimmer = getDimmer();
121
121
  if (dimmer != null) {
122
- userEvent.click(dimmer);
122
+ await userEvent.click(dimmer);
123
123
  }
124
124
  expect(handleOnClose).toHaveBeenCalledTimes(1);
125
125
  });
@@ -7,7 +7,7 @@ const radius = { xxs: 6, xs: 11, sm: 22, xl: 61 };
7
7
 
8
8
  const ANIMATION_DURATION_IN_MS = 1500;
9
9
 
10
- type ProcessIndicatorStatus =
10
+ export type ProcessIndicatorStatus =
11
11
  `${Status.PROCESSING | Status.FAILED | Status.SUCCEEDED | Status.HIDDEN}`;
12
12
 
13
13
  export interface ProcessIndicatorProps {
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render } from '../test-utils';
3
2
 
4
3
  import Progress from '.';
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render, screen } from '../test-utils';
3
2
 
4
3
  import ProgressBar from './ProgressBar';
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import React from 'react';
3
2
 
4
3
  import { render, screen, userEvent, waitFor } from '../test-utils';
@@ -60,30 +59,30 @@ describe('SegmentedControl', () => {
60
59
  expect(accountingTab).toHaveAttribute('aria-selected', 'true');
61
60
  });
62
61
 
63
- it('lets the user pick through the segments when it is set to input', () => {
62
+ it('lets the user pick through the segments when it is set to input', async () => {
64
63
  renderSegmentedControl();
65
64
 
66
65
  const payroll = screen.getByRole('radio', { name: 'Payroll' });
67
- userEvent.click(payroll);
66
+ await userEvent.click(payroll);
68
67
 
69
68
  expect(onChange).toHaveBeenCalledWith('payroll');
70
69
 
71
70
  const reporting = screen.getByRole('radio', { name: 'Reporting' });
72
- userEvent.click(reporting);
71
+ await userEvent.click(reporting);
73
72
 
74
73
  expect(onChange).toHaveBeenCalledWith('reporting');
75
74
  });
76
75
 
77
- it('lets the user pick through the segments when it is set to view', () => {
76
+ it('lets the user pick through the segments when it is set to view', async () => {
78
77
  renderSegmentedControl({ mode: 'view', segments: defaultSegmentsWithControls });
79
78
 
80
79
  const payroll = screen.getByRole('tab', { name: 'Payroll' });
81
- userEvent.click(payroll);
80
+ await userEvent.click(payroll);
82
81
 
83
82
  expect(onChange).toHaveBeenCalledWith('payroll');
84
83
 
85
84
  const reporting = screen.getByRole('tab', { name: 'Reporting' });
86
- userEvent.click(reporting);
85
+ await userEvent.click(reporting);
87
86
 
88
87
  expect(onChange).toHaveBeenCalledWith('reporting');
89
88
  });
@@ -134,11 +133,11 @@ describe('SegmentedControl', () => {
134
133
  });
135
134
  });
136
135
 
137
- it('updates the selected segment when the selectedValue prop changes', () => {
136
+ it('updates the selected segment when the selectedValue prop changes', async () => {
138
137
  const { rerender } = render(<SegmentedControl {...defaultProps} />);
139
138
 
140
139
  const payroll = screen.getByRole('radio', { name: 'Payroll' });
141
- userEvent.click(payroll);
140
+ await userEvent.click(payroll);
142
141
 
143
142
  expect(onChange).toHaveBeenCalledWith('payroll');
144
143
 
@@ -148,7 +147,7 @@ describe('SegmentedControl', () => {
148
147
  expect(reporting).toBeChecked();
149
148
  });
150
149
 
151
- it('updates the options when the segments prop changes', () => {
150
+ it('updates the options when the segments prop changes', async () => {
152
151
  const { rerender } = render(<SegmentedControl {...defaultProps} />);
153
152
 
154
153
  const newSegments = [
@@ -167,7 +166,7 @@ describe('SegmentedControl', () => {
167
166
  rerender(<SegmentedControl {...defaultProps} segments={newSegments} />);
168
167
 
169
168
  const anotherOne = screen.getByRole('radio', { name: 'Another One' });
170
- userEvent.click(anotherOne);
169
+ await userEvent.click(anotherOne);
171
170
 
172
171
  expect(onChange).toHaveBeenCalledWith('anotherOne');
173
172
  });