@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
@@ -1,4 +1,4 @@
1
- import { Story, Meta } from '@storybook/react';
1
+ import { StoryFn, Meta } from '@storybook/react';
2
2
  import { useState } from 'react';
3
3
 
4
4
  import Chips, { ChipsProps, ChipValue } from './Chips';
@@ -10,7 +10,9 @@ const meta: Meta<typeof Chips> = {
10
10
  };
11
11
  export default meta;
12
12
 
13
- const FilterTemplate: Story<ChipsProps> = (args: ChipsProps) => {
13
+ type Story = StoryFn<ChipsProps>;
14
+
15
+ const FilterTemplate: Story = (args: ChipsProps) => {
14
16
  const [selected, setSelected] = useState<readonly ChipValue[]>(
15
17
  args.selected == null || Array.isArray(args.selected) ? args.selected : [args.selected],
16
18
  );
@@ -31,7 +33,7 @@ const FilterTemplate: Story<ChipsProps> = (args: ChipsProps) => {
31
33
  );
32
34
  };
33
35
 
34
- const ChoiceTemplate: Story<ChipsProps> = (args: ChipsProps) => {
36
+ const ChoiceTemplate: Story = (args: ChipsProps) => {
35
37
  const [selected, setSelected] = useState<ChipValue>(args.selected as ChipValue);
36
38
  return (
37
39
  <Chips
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { Plus } from '@transferwise/icons';
3
2
 
4
3
  import { ControlType, Priority } from '../common';
@@ -54,17 +53,17 @@ describe('CircularButton', () => {
54
53
  });
55
54
 
56
55
  describe('onClick', () => {
57
- it('calls onClick when clicked', () => {
56
+ it('calls onClick when clicked', async () => {
58
57
  const onClick = jest.fn();
59
58
  render(<CircularButton {...props} onClick={onClick} />);
60
- userEvent.click(screen.getByRole('button'));
59
+ await userEvent.click(screen.getByRole('button'));
61
60
  expect(onClick).toHaveBeenCalledTimes(1);
62
61
  });
63
62
 
64
- it('does not call onClick when clicked if disabled', () => {
63
+ it('does not call onClick when clicked if disabled', async () => {
65
64
  const onClick = jest.fn();
66
65
  render(<CircularButton {...props} disabled onClick={onClick} />);
67
- userEvent.click(screen.getByRole('button'));
66
+ await userEvent.click(screen.getByRole('button'));
68
67
  expect(onClick).toHaveBeenCalledTimes(0);
69
68
  });
70
69
  });
@@ -21,7 +21,7 @@ describe('Radio button', () => {
21
21
  expect(container).toMatchSnapshot();
22
22
  });
23
23
 
24
- it('responds to user input', () => {
24
+ it('responds to user input', async () => {
25
25
  const onChange = jest.fn();
26
26
  render(
27
27
  <label htmlFor="an-id">
@@ -29,7 +29,7 @@ describe('Radio button', () => {
29
29
  </label>,
30
30
  );
31
31
 
32
- userEvent.click(screen.getByLabelText('A radio'));
32
+ await userEvent.click(screen.getByLabelText('A radio'));
33
33
 
34
34
  expect(onChange).toHaveBeenCalledWith('a-value');
35
35
  });
@@ -23,5 +23,6 @@ export const Default: Story = {
23
23
  {lorem10}
24
24
  </>
25
25
  ),
26
+ onDismiss: () => {},
26
27
  },
27
28
  };
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render } from '../../test-utils';
3
2
 
4
3
  import { CloseButton } from '.';
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render } from '@testing-library/react';
3
2
 
4
3
  import { Layout } from '../propsValues/layouts';
@@ -1,13 +1,10 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
  import { userEvent, within } from '@storybook/test';
3
- import * as React from 'react';
4
3
 
5
4
  import { DateInput, DateMode, Info, InlineAlert, Title, Typography } from '..';
6
5
  import { lorem10, storyConfig } from '../test-utils';
7
6
 
8
- import { DateInputProps } from './DateInput';
9
-
10
- export default {
7
+ const meta = {
11
8
  component: DateInput,
12
9
  title: 'Forms/DateInput',
13
10
  args: {
@@ -20,16 +17,24 @@ export default {
20
17
  tags: ['autodocs'],
21
18
  } satisfies Meta<typeof DateInput>;
22
19
 
23
- type Story = StoryObj<DateInputProps>;
20
+ export default meta;
24
21
 
25
- export const Basic: StoryObj = {};
22
+ type Story = StoryObj<typeof meta>;
26
23
 
27
- Basic.play = async ({ canvasElement }) => {
28
- const canvas = within(canvasElement);
29
- await userEvent.click(canvas.getByRole('button'));
30
- };
24
+ export const Basic = {
25
+ args: {
26
+ onChange: () => {},
27
+ },
28
+ play: async ({ canvasElement }) => {
29
+ const canvas = within(canvasElement);
30
+ await userEvent.click(canvas.getByRole('button'));
31
+ },
32
+ } satisfies Story;
31
33
 
32
- export const WithLabel: Story = {
34
+ export const WithLabel = {
35
+ args: {
36
+ onChange: () => {},
37
+ },
33
38
  render: (args) => {
34
39
  const id1 = 'date-input-group-label-1';
35
40
  const label = 'Date of Birth';
@@ -71,11 +76,11 @@ export const WithLabel: Story = {
71
76
  </>
72
77
  );
73
78
  },
74
- };
79
+ } satisfies Story;
75
80
 
76
- export const BasicMobile: Story = storyConfig(Basic, { variants: ['mobile'] });
81
+ export const BasicMobile = storyConfig(Basic, { variants: ['mobile'] });
77
82
 
78
- export const InputError: Story = {
83
+ export const InputError = {
79
84
  ...Basic,
80
85
  render: (args) => (
81
86
  <div className="form-group has-error">
@@ -83,6 +88,6 @@ export const InputError: Story = {
83
88
  <InlineAlert type="error">{lorem10}</InlineAlert>
84
89
  </div>
85
90
  ),
86
- };
91
+ } satisfies Story;
87
92
 
88
- export const InputErrorMobile: Story = storyConfig(InputError, { variants: ['mobile'] });
93
+ export const InputErrorMobile = storyConfig(InputError, { variants: ['mobile'] });
@@ -4,6 +4,8 @@ import DateLookup, { DateLookupProps } from './DateLookup';
4
4
 
5
5
  import { act } from 'react';
6
6
 
7
+ const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTimeAsync });
8
+
7
9
  mockMatchMedia();
8
10
  mockResizeObserver();
9
11
 
@@ -36,12 +38,12 @@ describe('DateLookup', () => {
36
38
  async (text) => {
37
39
  render(<DateLookup value={initialValue} onChange={() => {}} />);
38
40
 
39
- userEvent.tab();
40
- userEvent.keyboard(text);
41
+ await user.tab();
42
+ await user.keyboard(text);
41
43
 
42
44
  expect(screen.getByRole('button', { name: /next/iu })).toBeInTheDocument();
43
45
 
44
- userEvent.keyboard('{Escape}');
46
+ await user.keyboard('{Escape}');
45
47
  await act(async () => {
46
48
  await jest.runOnlyPendingTimersAsync();
47
49
  });
@@ -53,7 +55,7 @@ describe('DateLookup', () => {
53
55
  const setupAndOpenWithMouse = async (props: Partial<DateLookupProps> = {}) => {
54
56
  const view = render(<DateLookup value={initialValue} onChange={() => {}} {...props} />);
55
57
 
56
- userEvent.click(screen.getByRole('button'));
58
+ await user.click(screen.getByRole('button'));
57
59
  await act(async () => {
58
60
  await jest.runOnlyPendingTimersAsync();
59
61
  });
@@ -68,7 +70,7 @@ describe('DateLookup', () => {
68
70
 
69
71
  const dimmerElement = screen.getByRole('dialog').parentElement?.parentElement;
70
72
  if (dimmerElement != null) {
71
- userEvent.click(dimmerElement);
73
+ await user.click(dimmerElement);
72
74
  }
73
75
  await act(async () => {
74
76
  await jest.runOnlyPendingTimersAsync();
@@ -89,13 +91,13 @@ describe('DateLookup', () => {
89
91
 
90
92
  expect(handleChange).not.toHaveBeenCalled();
91
93
 
92
- userEvent.keyboard(text);
94
+ await user.keyboard(text);
93
95
 
94
96
  const value = new Date(initialValue);
95
97
  value.setDate(initialValue.getDate() + step);
96
98
  expect(handleChange).toHaveBeenCalledWith(value);
97
99
 
98
- userEvent.keyboard('{Escape}');
100
+ await user.keyboard('{Escape}');
99
101
  await act(async () => {
100
102
  await jest.runOnlyPendingTimersAsync();
101
103
  });
@@ -114,20 +116,20 @@ describe('DateLookup', () => {
114
116
  const handleChange = jest.fn();
115
117
  await setupAndOpenWithMouse({ onChange: handleChange });
116
118
 
117
- userEvent.click(screen.getByRole('button', { name: /year view/iu }));
119
+ await user.click(screen.getByRole('button', { name: /year view/iu }));
118
120
  await act(async () => {
119
121
  await jest.runOnlyPendingTimersAsync();
120
122
  });
121
123
 
122
124
  expect(handleChange).not.toHaveBeenCalled();
123
125
 
124
- userEvent.keyboard(text);
126
+ await user.keyboard(text);
125
127
 
126
128
  const value = new Date(initialValue);
127
129
  value.setFullYear(initialValue.getFullYear() + step);
128
130
  expect(handleChange).toHaveBeenCalledWith(value);
129
131
 
130
- userEvent.keyboard('{Escape}');
132
+ await user.keyboard('{Escape}');
131
133
  await act(async () => {
132
134
  await jest.runOnlyPendingTimersAsync();
133
135
  });
@@ -146,24 +148,24 @@ describe('DateLookup', () => {
146
148
  const handleChange = jest.fn();
147
149
  await setupAndOpenWithMouse({ onChange: handleChange });
148
150
 
149
- userEvent.click(screen.getByRole('button', { name: /year view/iu }));
151
+ await user.click(screen.getByRole('button', { name: /year view/iu }));
150
152
  await act(async () => {
151
153
  await jest.runOnlyPendingTimersAsync();
152
154
  });
153
- userEvent.keyboard(' ');
155
+ await user.keyboard(' ');
154
156
  await act(async () => {
155
157
  await jest.runOnlyPendingTimersAsync();
156
158
  });
157
159
 
158
160
  expect(handleChange).not.toHaveBeenCalled();
159
161
 
160
- userEvent.keyboard(text);
162
+ await user.keyboard(text);
161
163
 
162
164
  const value = new Date(initialValue);
163
165
  value.setMonth(initialValue.getMonth() + step);
164
166
  expect(handleChange).toHaveBeenCalledWith(value);
165
167
 
166
- userEvent.keyboard('{Escape}');
168
+ await user.keyboard('{Escape}');
167
169
  await act(async () => {
168
170
  await jest.runOnlyPendingTimersAsync();
169
171
  });
@@ -178,7 +180,7 @@ describe('DateLookup', () => {
178
180
  const handleChange = jest.fn();
179
181
  await setupAndOpenWithMouse({ min, onChange: handleChange });
180
182
 
181
- userEvent.keyboard('{ArrowLeft}{ArrowLeft}');
183
+ await user.keyboard('{ArrowLeft}{ArrowLeft}');
182
184
 
183
185
  expect(handleChange).toHaveBeenCalledWith(min);
184
186
  });
@@ -189,7 +191,7 @@ describe('DateLookup', () => {
189
191
  const handleChange = jest.fn();
190
192
  await setupAndOpenWithMouse({ max, onChange: handleChange });
191
193
 
192
- userEvent.keyboard('{ArrowRight}{ArrowRight}');
194
+ await user.keyboard('{ArrowRight}{ArrowRight}');
193
195
 
194
196
  expect(handleChange).toHaveBeenCalledWith(max);
195
197
  });
@@ -1,5 +1,4 @@
1
- import '@testing-library/jest-dom';
2
- import user from '@testing-library/user-event';
1
+ import { userEvent } from '@testing-library/user-event';
3
2
  import { act } from 'react';
4
3
 
5
4
  import { render, screen, mockMatchMedia } from '../test-utils';
@@ -55,103 +54,103 @@ describe('DateLookup (events)', () => {
55
54
 
56
55
  it('switches to years', async () => {
57
56
  const view = await setup();
58
- openDateLookup(view);
59
- clickDateButton(view);
57
+ await openDateLookup(view);
58
+ await clickDateButton(view);
60
59
 
61
60
  expect(getActiveYearButton(view)).toHaveFocus();
62
61
 
63
- closeDateLookup(view);
62
+ await closeDateLookup(view);
64
63
  });
65
64
 
66
65
  it('has aria-label for 20 years', async () => {
67
66
  const view = await setup();
68
- openDateLookup(view);
69
- clickDateButton(view);
67
+ await openDateLookup(view);
68
+ await clickDateButton(view);
70
69
 
71
70
  expect(getButtonByAriaLabel('next 20 years')).toBeInTheDocument();
72
71
  expect(getButtonByAriaLabel('previous 20 years')).toBeInTheDocument();
73
72
 
74
- closeDateLookup(view);
73
+ await closeDateLookup(view);
75
74
  });
76
75
 
77
76
  it('switches to months', async () => {
78
77
  const view = await setup();
79
- openDateLookup(view);
80
- clickDateButton(view);
81
- user.click(getActiveYearButton(view));
78
+ await openDateLookup(view);
79
+ await clickDateButton(view);
80
+ await userEvent.click(getActiveYearButton(view));
82
81
 
83
82
  expect(getActiveMonthButton(view)).toHaveFocus();
84
83
 
85
- closeDateLookup(view);
84
+ await closeDateLookup(view);
86
85
  });
87
86
 
88
87
  it('has aria label for year', async () => {
89
88
  const view = await setup();
90
- openDateLookup(view);
91
- clickDateButton(view);
92
- user.click(getActiveYearButton(view));
89
+ await openDateLookup(view);
90
+ await clickDateButton(view);
91
+ await userEvent.click(getActiveYearButton(view));
93
92
 
94
93
  expect(getButtonByAriaLabel('next year')).toBeInTheDocument();
95
94
  expect(getButtonByAriaLabel('previous year')).toBeInTheDocument();
96
95
 
97
- closeDateLookup(view);
96
+ await closeDateLookup(view);
98
97
  });
99
98
 
100
99
  it('switches to days', async () => {
101
100
  const view = await setup();
102
- openDateLookup(view);
103
- clickDateButton(view);
104
- user.click(getActiveYearButton(view));
105
- user.click(getActiveMonthButton(view));
101
+ await openDateLookup(view);
102
+ await clickDateButton(view);
103
+ await userEvent.click(getActiveYearButton(view));
104
+ await userEvent.click(getActiveMonthButton(view));
106
105
 
107
106
  expect(getActiveDayButton(view)).toHaveFocus();
108
107
 
109
- closeDateLookup(view);
108
+ await closeDateLookup(view);
110
109
  });
111
110
 
112
111
  it('has aria label for month', async () => {
113
112
  const view = await setup();
114
- openDateLookup(view);
115
- clickDateButton(view);
116
- user.click(getActiveYearButton(view));
117
- user.click(getActiveMonthButton(view));
113
+ await openDateLookup(view);
114
+ await clickDateButton(view);
115
+ await userEvent.click(getActiveYearButton(view));
116
+ await userEvent.click(getActiveMonthButton(view));
118
117
 
119
118
  expect(getButtonByAriaLabel('next month')).toBeInTheDocument();
120
119
  expect(getButtonByAriaLabel('previous month')).toBeInTheDocument();
121
120
 
122
- closeDateLookup(view);
121
+ await closeDateLookup(view);
123
122
  });
124
123
 
125
124
  it('updates selected date and closes', async () => {
126
125
  const view = await setup();
127
- openDateLookup(view);
126
+ await openDateLookup(view);
128
127
  const d = new Date(2018, 11, 28);
129
128
  const newDay = screen.getByText(d.getDate().toString());
130
- user.click(newDay);
129
+ await userEvent.click(newDay);
131
130
 
132
131
  expect(handleChange).toHaveBeenCalledWith(d);
133
132
  expect(getOpenButton(view)).toHaveFocus();
134
133
 
135
- closeDateLookup(view);
134
+ await closeDateLookup(view);
136
135
  });
137
136
 
138
137
  it('has aria label on selected date', async () => {
139
138
  const view = await setup();
140
- openDateLookup(view);
139
+ await openDateLookup(view);
141
140
  const d = new Date(2018, 11, 28);
142
141
  const newDay = screen.getByText(d.getDate().toString());
143
- user.click(newDay);
144
- openDateLookup(view);
142
+ await userEvent.click(newDay);
143
+ await openDateLookup(view);
145
144
  expect(screen.getByRole('button', { name: /selected day/i })).toBeInTheDocument();
146
145
 
147
- closeDateLookup(view);
146
+ await closeDateLookup(view);
148
147
  });
149
148
 
150
149
  it('supports custom `aria-labelledby` attribute', async () => {
151
150
  const view = await setup();
152
151
  expect(screen.getByLabelText('Prioritized label')).toHaveClass('input-group');
153
152
 
154
- closeDateLookup(view);
153
+ await closeDateLookup(view);
155
154
  });
156
155
  });
157
156
 
@@ -183,29 +182,33 @@ describe('DateLookup (events)', () => {
183
182
 
184
183
  it('when user clicks on clear the focus returns to btn', async () => {
185
184
  const view = await setup();
186
- clickClearButton(view);
185
+ await clickClearButton(view);
187
186
  expect(getOpenButton(view)).toHaveFocus();
188
187
  });
189
188
 
190
189
  it('onChange gets called with null when reset button is clicked', async () => {
191
190
  const view = await setup();
192
- clickClearButton(view);
191
+ await clickClearButton(view);
193
192
  expect(props.onChange).toHaveBeenCalledWith(null);
194
193
  });
195
194
  });
196
195
 
197
- const openDateLookup = (/** @type {import('@testing-library/react').RenderResult} */ view) =>
198
- user.click(getOpenButton(view));
196
+ const openDateLookup = async (
197
+ /** @type {import('@testing-library/react').RenderResult} */ view,
198
+ ) => userEvent.click(getOpenButton(view));
199
199
 
200
- const clickDateButton = (/** @type {import('@testing-library/react').RenderResult} */ view) =>
201
- user.click(getDateButton(view));
200
+ const clickDateButton = async (
201
+ /** @type {import('@testing-library/react').RenderResult} */ view,
202
+ ) => userEvent.click(getDateButton(view));
202
203
 
203
204
  // Close dateLookup and removes events attached to documents.
204
- const closeDateLookup = (/** @type {import('@testing-library/react').RenderResult} */ view) =>
205
- user.click(view.container);
205
+ const closeDateLookup = async (
206
+ /** @type {import('@testing-library/react').RenderResult} */ view,
207
+ ) => userEvent.click(view.container);
206
208
 
207
- const clickClearButton = (/** @type {import('@testing-library/react').RenderResult} */ view) =>
208
- user.click(getClearButton(view));
209
+ const clickClearButton = async (
210
+ /** @type {import('@testing-library/react').RenderResult} */ view,
211
+ ) => userEvent.click(getClearButton(view));
209
212
 
210
213
  const getActiveYearButton = (
211
214
  /** @type {import('@testing-library/react').RenderResult} */ view,
@@ -1,4 +1,4 @@
1
- import { Story } from '@storybook/react';
1
+ import { StoryFn } from '@storybook/react';
2
2
  import { expect, userEvent, within } from '@storybook/test';
3
3
  import { useState } from 'react';
4
4
 
@@ -9,7 +9,9 @@ export default {
9
9
  title: 'Forms/DateLookup/Tests',
10
10
  };
11
11
 
12
- const Template: Story<typeof DateLookup> = () => {
12
+ type Story = StoryFn<typeof DateLookup>;
13
+
14
+ const Template: Story = () => {
13
15
  const [value, setValue] = useState<Date | null>(new Date(1987, 0, 10, 12, 0, 0));
14
16
 
15
17
  return (
@@ -1,5 +1,3 @@
1
- import '@testing-library/jest-dom';
2
-
3
1
  import Avatar from '../avatar';
4
2
  import { Breakpoint, Size } from '../common';
5
3
  import { mockMatchMedia } from '../mocks';
@@ -25,42 +25,42 @@ describe('Dimmer', () => {
25
25
  });
26
26
 
27
27
  describe('closing behaviour', () => {
28
- it('calls onClose if the dimmer is clicked', () => {
28
+ it('calls onClose if the dimmer is clicked', async () => {
29
29
  const onClose = jest.fn();
30
30
  render(<Dimmer {...props} onClose={onClose} />);
31
- userEvent.click(screen.getByRole('presentation'));
31
+ await userEvent.click(screen.getByRole('presentation'));
32
32
  expect(onClose).toHaveBeenCalledTimes(1);
33
33
  });
34
34
 
35
- it('does not call onClose if the dimmer content is clicked', () => {
35
+ it('does not call onClose if the dimmer content is clicked', async () => {
36
36
  const onClose = jest.fn();
37
37
  render(
38
38
  <Dimmer {...props} onClose={onClose}>
39
39
  <Button onClick={() => {}}>McClicky</Button>
40
40
  </Dimmer>,
41
41
  );
42
- userEvent.click(screen.getByRole('button'));
42
+ await userEvent.click(screen.getByRole('button'));
43
43
  expect(onClose).toHaveBeenCalledTimes(0);
44
44
  });
45
45
 
46
- it('does not call onClose when clicked if disableClickToClose is true', () => {
46
+ it('does not call onClose when clicked if disableClickToClose is true', async () => {
47
47
  const onClose = jest.fn();
48
48
  render(<Dimmer {...props} disableClickToClose onClose={onClose} />);
49
- userEvent.click(screen.getByRole('presentation'));
49
+ await userEvent.click(screen.getByRole('presentation'));
50
50
  expect(onClose).toHaveBeenCalledTimes(0);
51
51
  });
52
52
 
53
- it('calls onClose if the escape key is pressed', () => {
53
+ it('calls onClose if the escape key is pressed', async () => {
54
54
  const onClose = jest.fn();
55
55
  render(<Dimmer {...props} onClose={onClose} />);
56
- userEvent.keyboard('{esc}');
56
+ await userEvent.keyboard('{Escape}');
57
57
  expect(onClose).toHaveBeenCalledTimes(1);
58
58
  });
59
59
 
60
- it('does not call onClose if the escape key is pressed when disableClickToClose is true', () => {
60
+ it('does not call onClose if the escape key is pressed when disableClickToClose is true', async () => {
61
61
  const onClose = jest.fn();
62
62
  render(<Dimmer {...props} disableClickToClose onClose={onClose} />);
63
- userEvent.keyboard('{esc}');
63
+ await userEvent.keyboard('{Escape}');
64
64
  expect(onClose).toHaveBeenCalledTimes(1);
65
65
  });
66
66
  });
@@ -48,10 +48,10 @@ describe('Drawer', () => {
48
48
  expect(container).toMatchSnapshot();
49
49
  });
50
50
 
51
- it('calls onClose when user clicks close button', () => {
51
+ it('calls onClose when user clicks close button', async () => {
52
52
  render(<Drawer {...props}>content</Drawer>);
53
53
  expect(props.onClose).not.toHaveBeenCalled();
54
- userEvent.click(getCloseButton());
54
+ await userEvent.click(getCloseButton());
55
55
  expect(props.onClose).toHaveBeenCalledTimes(1);
56
56
  });
57
57
 
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render } from '../test-utils';
3
2
 
4
3
  import Emphasis from './Emphasis';
@@ -73,7 +73,7 @@ describe('Field', () => {
73
73
  button.addEventListener('click', handleClick);
74
74
 
75
75
  const label = screen.getByText('Phone number');
76
- userEvent.click(label);
76
+ await userEvent.click(label);
77
77
 
78
78
  expect(handleClick).not.toHaveBeenCalled();
79
79
  });
@@ -90,6 +90,6 @@ describe('Field', () => {
90
90
  expect(screen.getByRole('textbox')).not.toHaveAttribute('id');
91
91
 
92
92
  const label = screen.getByText('Phone number');
93
- userEvent.click(label);
93
+ await userEvent.click(label);
94
94
  });
95
95
  });
@@ -1,5 +1,3 @@
1
- import '@testing-library/jest-dom';
2
-
3
1
  import Avatar, { AvatarType } from '../avatar';
4
2
  import { Breakpoint, Size } from '../common';
5
3
  import { mockMatchMedia, render, screen } from '../test-utils';
@@ -1,4 +1,3 @@
1
- import '@testing-library/jest-dom';
2
1
  import { render, screen } from '../../test-utils';
3
2
 
4
3
  import AnimatedLabel from '.';
@@ -0,0 +1,29 @@
1
+ import { ArrowLeft as ArrowLeftIcon } from '@transferwise/icons';
2
+ import classNames from 'classnames';
3
+
4
+ import Avatar, { AvatarType } from '../../avatar';
5
+
6
+ export interface BackButtonProps {
7
+ 'aria-label': string;
8
+ className?: string;
9
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
10
+ }
11
+
12
+ export default function BackButton({
13
+ className,
14
+ onClick,
15
+ 'aria-label': ariaLabel,
16
+ }: BackButtonProps) {
17
+ return (
18
+ <Avatar type={AvatarType.ICON} size={40}>
19
+ <button
20
+ type="button"
21
+ aria-label={ariaLabel}
22
+ className={classNames('np-back-button', 'btn-unstyled', className)}
23
+ onClick={onClick}
24
+ >
25
+ <ArrowLeftIcon size={24} />
26
+ </button>
27
+ </Avatar>
28
+ );
29
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from './BackButton';
2
+ export type { BackButtonProps } from './BackButton';