@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.
- package/build/index.js +198 -461
- package/build/index.js.map +1 -1
- package/build/index.mjs +198 -461
- package/build/index.mjs.map +1 -1
- package/build/types/flowNavigation/backButton/BackButton.d.ts +5 -17
- package/build/types/flowNavigation/backButton/BackButton.d.ts.map +1 -1
- package/build/types/flowNavigation/backButton/index.d.ts +2 -2
- package/build/types/flowNavigation/backButton/index.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/info/Info.d.ts +2 -2
- package/build/types/info/Info.d.ts.map +1 -1
- package/build/types/info/index.d.ts +1 -1
- package/build/types/info/index.d.ts.map +1 -1
- package/build/types/overlayHeader/OverlayHeader.d.ts +9 -18
- package/build/types/overlayHeader/OverlayHeader.d.ts.map +1 -1
- package/build/types/overlayHeader/index.d.ts +2 -1
- package/build/types/overlayHeader/index.d.ts.map +1 -1
- package/build/types/processIndicator/ProcessIndicator.d.ts +1 -1
- package/build/types/processIndicator/ProcessIndicator.d.ts.map +1 -1
- package/build/types/upload/Upload.d.ts +91 -55
- package/build/types/upload/Upload.d.ts.map +1 -1
- package/build/types/upload/Upload.messages.d.ts +42 -60
- package/build/types/upload/Upload.messages.d.ts.map +1 -1
- package/build/types/upload/index.d.ts +2 -2
- package/build/types/upload/index.d.ts.map +1 -1
- package/build/types/upload/steps/completeStep/completeStep.d.ts +11 -18
- package/build/types/upload/steps/completeStep/completeStep.d.ts.map +1 -1
- package/build/types/upload/steps/completeStep/index.d.ts +2 -1
- package/build/types/upload/steps/completeStep/index.d.ts.map +1 -1
- package/build/types/upload/steps/index.d.ts +3 -4
- package/build/types/upload/steps/index.d.ts.map +1 -1
- package/build/types/upload/steps/processingStep/index.d.ts +2 -1
- package/build/types/upload/steps/processingStep/index.d.ts.map +1 -1
- package/build/types/upload/steps/processingStep/processingStep.d.ts +11 -13
- package/build/types/upload/steps/processingStep/processingStep.d.ts.map +1 -1
- package/build/types/upload/steps/uploadImageStep/index.d.ts +2 -1
- package/build/types/upload/steps/uploadImageStep/index.d.ts.map +1 -1
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +14 -18
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
- package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts +1 -1
- package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts.map +1 -1
- package/build/types/upload/utils/asyncFileRead/index.d.ts +1 -1
- package/build/types/upload/utils/asyncFileRead/index.d.ts.map +1 -1
- package/build/types/upload/utils/getFileType/getFileType.d.ts +1 -1
- package/build/types/upload/utils/getFileType/getFileType.d.ts.map +1 -1
- package/build/types/upload/utils/getFileType/index.d.ts +1 -1
- package/build/types/upload/utils/getFileType/index.d.ts.map +1 -1
- package/build/types/upload/utils/index.d.ts +5 -7
- package/build/types/upload/utils/index.d.ts.map +1 -1
- package/build/types/upload/utils/isSizeValid/index.d.ts +1 -1
- package/build/types/upload/utils/isSizeValid/index.d.ts.map +1 -1
- package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts +1 -1
- package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts.map +1 -1
- package/build/types/upload/utils/isTypeValid/index.d.ts +1 -1
- package/build/types/upload/utils/isTypeValid/index.d.ts.map +1 -1
- package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts +1 -1
- package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts.map +1 -1
- package/build/types/upload/utils/postData/index.d.ts +1 -1
- package/build/types/upload/utils/postData/index.d.ts.map +1 -1
- package/build/types/upload/utils/postData/postData.d.ts +11 -1
- package/build/types/upload/utils/postData/postData.d.ts.map +1 -1
- package/package.json +24 -26
- package/src/accordion/Accordion.spec.js +5 -5
- package/src/accordion/AccordionItem/AccordionItem.spec.js +2 -2
- package/src/actionButton/ActionButton.spec.tsx +4 -5
- package/src/alert/Alert.spec.tsx +4 -4
- package/src/alert/Alert.story.tsx +6 -5
- package/src/button/Button.spec.js +4 -5
- package/src/card/Card.spec.tsx +4 -4
- package/src/carousel/Carousel.spec.tsx +17 -17
- package/src/checkbox/Checkbox.spec.tsx +0 -2
- package/src/checkboxButton/CheckboxButton.spec.tsx +0 -2
- package/src/checkboxOption/CheckboxOption.spec.tsx +0 -2
- package/src/chevron/Chevron.spec.tsx +0 -1
- package/src/chips/Chips.spec.tsx +0 -1
- package/src/chips/Chips.story.tsx +5 -3
- package/src/circularButton/CircularButton.spec.tsx +4 -5
- package/src/common/RadioButton/RadioButton.spec.tsx +2 -2
- package/src/common/card/Card.story.tsx +1 -0
- package/src/common/closeButton/CloseButton.spec.tsx +0 -1
- package/src/common/flowHeader/FlowHeader.spec.tsx +0 -1
- package/src/dateInput/DateInput.story.tsx +21 -16
- package/src/dateLookup/DateLookup.rtl.spec.tsx +18 -16
- package/src/dateLookup/DateLookup.testingLibrary.spec.js +47 -44
- package/src/dateLookup/DateLookup.tests.story.tsx +4 -2
- package/src/decision/Decision.spec.js +0 -2
- package/src/dimmer/Dimmer.rtl.spec.js +10 -10
- package/src/drawer/Drawer.rtl.spec.tsx +2 -2
- package/src/emphasis/Emphasis.spec.tsx +0 -1
- package/src/field/Field.spec.tsx +2 -2
- package/src/flowNavigation/FlowNavigation.spec.js +0 -2
- package/src/flowNavigation/animatedLabel/AnimatedLabel.spec.js +0 -1
- package/src/flowNavigation/backButton/BackButton.tsx +29 -0
- package/src/flowNavigation/backButton/index.ts +2 -0
- package/src/header/Header.spec.tsx +6 -6
- package/src/image/Image.spec.tsx +0 -1
- package/src/index.ts +3 -1
- package/src/info/Info.story.tsx +15 -9
- package/src/info/Info.tsx +2 -2
- package/src/info/index.ts +1 -1
- package/src/inlineAlert/InlineAlert.spec.tsx +0 -1
- package/src/inputs/SelectInput.spec.tsx +26 -47
- package/src/link/Link.spec.tsx +0 -1
- package/src/listItem/ListItem.spec.tsx +0 -1
- package/src/moneyInput/MoneyInput.rtl.spec.tsx +2 -2
- package/src/moneyInput/MoneyInput.story.tsx +1 -4
- package/src/overlayHeader/{OverlayHeader.spec.js → OverlayHeader.spec.tsx} +1 -1
- package/src/overlayHeader/{OverlayHeader.story.js → OverlayHeader.story.tsx} +10 -2
- package/src/overlayHeader/{OverlayHeader.js → OverlayHeader.tsx} +12 -19
- package/src/overlayHeader/index.ts +2 -0
- package/src/phoneNumberInput/PhoneNumberInput.story.tsx +1 -0
- package/src/popover/Popover.spec.tsx +10 -10
- package/src/processIndicator/ProcessIndicator.tsx +1 -1
- package/src/progress/Progress.spec.tsx +0 -1
- package/src/progressBar/ProgressBar.spec.tsx +0 -1
- package/src/segmentedControl/SegmentedControl.spec.tsx +10 -11
- package/src/select/Select.spec.js +71 -71
- package/src/test-utils/index.js +1 -1
- package/src/test-utils/jest.setup.js +2 -0
- package/src/tooltip/Tooltip.spec.tsx +15 -16
- package/src/upload/Upload.spec.js +3 -14
- package/src/upload/Upload.story.tsx +37 -0
- package/src/upload/{Upload.js → Upload.tsx} +164 -169
- package/src/upload/index.ts +2 -0
- package/src/upload/steps/completeStep/completeStep.spec.js +3 -2
- package/src/upload/steps/completeStep/completeStep.tsx +74 -0
- package/src/upload/steps/completeStep/index.ts +2 -0
- package/src/upload/steps/{index.js → index.ts} +0 -1
- package/src/upload/steps/processingStep/index.ts +2 -0
- package/src/upload/steps/processingStep/processingStep.tsx +53 -0
- package/src/upload/steps/uploadImageStep/index.ts +2 -0
- package/src/upload/steps/uploadImageStep/{uploadImageStep.js → uploadImageStep.tsx} +17 -23
- package/src/upload/utils/asyncFileRead/asyncFileRead.spec.ts +14 -0
- package/src/upload/utils/asyncFileRead/asyncFileRead.ts +12 -0
- package/src/upload/utils/getFileType/getFileType.spec.ts +22 -0
- package/src/upload/utils/getFileType/getFileType.ts +16 -0
- package/src/upload/utils/{index.js → index.ts} +0 -2
- package/src/upload/utils/isSizeValid/{isSizeValid.spec.js → isSizeValid.spec.ts} +3 -3
- package/src/upload/utils/isSizeValid/isSizeValid.ts +3 -0
- package/src/upload/utils/isTypeValid/isTypeValid.spec.ts +62 -0
- package/src/upload/utils/isTypeValid/isTypeValid.ts +19 -0
- package/src/upload/utils/postData/postData.spec.ts +65 -0
- package/src/upload/utils/postData/postData.ts +36 -0
- package/src/uploadInput/UploadInput.spec.tsx +9 -10
- package/src/uploadInput/UploadInput.story.tsx +8 -180
- package/src/uploadInput/UploadInput.tests.story.tsx +212 -0
- package/src/uploadInput/UploadInput.tsx +1 -1
- package/src/uploadInput/uploadButton/UploadButton.spec.tsx +4 -4
- package/src/uploadInput/uploadItem/UploadItem.spec.tsx +4 -4
- package/build/types/upload/steps/mediaUploadStep/index.d.ts +0 -2
- package/build/types/upload/steps/mediaUploadStep/index.d.ts.map +0 -1
- package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts +0 -24
- package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts.map +0 -1
- package/build/types/upload/uploadSteps.d.ts +0 -5
- package/build/types/upload/uploadSteps.d.ts.map +0 -1
- package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts +0 -2
- package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts.map +0 -1
- package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts +0 -2
- package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts.map +0 -1
- package/build/types/upload/utils/requestMedia/index.d.ts +0 -2
- package/build/types/upload/utils/requestMedia/index.d.ts.map +0 -1
- package/build/types/upload/utils/requestMedia/requestMedia.d.ts +0 -2
- package/build/types/upload/utils/requestMedia/requestMedia.d.ts.map +0 -1
- package/src/flowNavigation/backButton/BackButton.js +0 -32
- package/src/flowNavigation/backButton/BackButton.spec.js +0 -16
- package/src/flowNavigation/backButton/__snapshots__/BackButton.spec.js.snap +0 -37
- package/src/flowNavigation/backButton/index.js +0 -3
- package/src/overlayHeader/index.js +0 -1
- package/src/upload/Upload.story.js +0 -36
- package/src/upload/index.js +0 -2
- package/src/upload/steps/completeStep/completeStep.js +0 -98
- package/src/upload/steps/completeStep/index.js +0 -1
- package/src/upload/steps/mediaUploadStep/index.js +0 -1
- package/src/upload/steps/mediaUploadStep/mediaUploadStep.js +0 -80
- package/src/upload/steps/mediaUploadStep/mediaUploadStep.spec.js +0 -77
- package/src/upload/steps/processingStep/index.js +0 -1
- package/src/upload/steps/processingStep/processingStep.js +0 -73
- package/src/upload/steps/uploadImageStep/index.js +0 -1
- package/src/upload/uploadSteps.ts +0 -5
- package/src/upload/utils/asyncFileRead/asyncFileRead.js +0 -11
- package/src/upload/utils/asyncFileRead/asyncFileRead.spec.js +0 -17
- package/src/upload/utils/getFileType/getFileType.js +0 -19
- package/src/upload/utils/getFileType/getFileType.spec.js +0 -33
- package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.js +0 -18
- package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.spec.js +0 -22
- package/src/upload/utils/getSupportedSpotMimeTypes/index.js +0 -1
- package/src/upload/utils/isSizeValid/isSizeValid.js +0 -1
- package/src/upload/utils/isTypeValid/isTypeValid.js +0 -26
- package/src/upload/utils/isTypeValid/isTypeValid.spec.js +0 -68
- package/src/upload/utils/postData/postData.js +0 -18
- package/src/upload/utils/postData/postData.spec.js +0 -109
- package/src/upload/utils/requestMedia/index.js +0 -1
- package/src/upload/utils/requestMedia/requestMedia.js +0 -26
- package/src/upload/utils/requestMedia/requestMedia.spec.js +0 -44
- /package/src/overlayHeader/__snapshots__/{OverlayHeader.spec.js.snap → OverlayHeader.spec.tsx.snap} +0 -0
- /package/src/upload/{Upload.messages.js → Upload.messages.ts} +0 -0
- /package/src/upload/utils/asyncFileRead/{index.js → index.ts} +0 -0
- /package/src/upload/utils/getFileType/{index.js → index.ts} +0 -0
- /package/src/upload/utils/isSizeValid/{index.js → index.ts} +0 -0
- /package/src/upload/utils/isTypeValid/{index.js → index.ts} +0 -0
- /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
|
});
|
package/src/image/Image.spec.tsx
CHANGED
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
|
/**
|
package/src/info/Info.story.tsx
CHANGED
|
@@ -5,7 +5,7 @@ import { lorem10, storyConfig } from '../test-utils';
|
|
|
5
5
|
|
|
6
6
|
import Info, { InfoPresentation } from '.';
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
23
|
+
export default meta;
|
|
24
24
|
|
|
25
|
-
|
|
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
|
|
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
|
|
46
|
+
export const OpenedPopoverMobile = storyConfig(OpenedPopover, {
|
|
47
|
+
variants: ['mobile'],
|
|
48
|
+
});
|
|
45
49
|
|
|
46
|
-
export const OpenedModal
|
|
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
|
|
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
|
|
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
|
-
}:
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
46
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|
package/src/link/Link.spec.tsx
CHANGED
|
@@ -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
|
|
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={
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
+
}
|
|
@@ -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 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
|
});
|