@transferwise/components 46.39.0 → 46.41.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 (146) hide show
  1. package/build/index.js +244 -493
  2. package/build/index.js.map +1 -1
  3. package/build/index.mjs +245 -494
  4. package/build/index.mjs.map +1 -1
  5. package/build/main.css +4 -2
  6. package/build/styles/main.css +4 -2
  7. package/build/styles/statusIcon/StatusIcon.css +4 -2
  8. package/build/types/dateInput/DateInput.d.ts.map +1 -1
  9. package/build/types/field/Field.d.ts +6 -1
  10. package/build/types/field/Field.d.ts.map +1 -1
  11. package/build/types/index.d.ts +2 -1
  12. package/build/types/index.d.ts.map +1 -1
  13. package/build/types/inlineAlert/InlineAlert.d.ts +2 -2
  14. package/build/types/inlineAlert/InlineAlert.d.ts.map +1 -1
  15. package/build/types/processIndicator/ProcessIndicator.d.ts +1 -1
  16. package/build/types/processIndicator/ProcessIndicator.d.ts.map +1 -1
  17. package/build/types/upload/Upload.d.ts +91 -55
  18. package/build/types/upload/Upload.d.ts.map +1 -1
  19. package/build/types/upload/Upload.messages.d.ts +42 -60
  20. package/build/types/upload/Upload.messages.d.ts.map +1 -1
  21. package/build/types/upload/index.d.ts +2 -2
  22. package/build/types/upload/index.d.ts.map +1 -1
  23. package/build/types/upload/steps/completeStep/completeStep.d.ts +11 -18
  24. package/build/types/upload/steps/completeStep/completeStep.d.ts.map +1 -1
  25. package/build/types/upload/steps/completeStep/index.d.ts +2 -1
  26. package/build/types/upload/steps/completeStep/index.d.ts.map +1 -1
  27. package/build/types/upload/steps/index.d.ts +3 -4
  28. package/build/types/upload/steps/index.d.ts.map +1 -1
  29. package/build/types/upload/steps/processingStep/index.d.ts +2 -1
  30. package/build/types/upload/steps/processingStep/index.d.ts.map +1 -1
  31. package/build/types/upload/steps/processingStep/processingStep.d.ts +11 -13
  32. package/build/types/upload/steps/processingStep/processingStep.d.ts.map +1 -1
  33. package/build/types/upload/steps/uploadImageStep/index.d.ts +2 -1
  34. package/build/types/upload/steps/uploadImageStep/index.d.ts.map +1 -1
  35. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +14 -18
  36. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
  37. package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts +1 -1
  38. package/build/types/upload/utils/asyncFileRead/asyncFileRead.d.ts.map +1 -1
  39. package/build/types/upload/utils/asyncFileRead/index.d.ts +1 -1
  40. package/build/types/upload/utils/asyncFileRead/index.d.ts.map +1 -1
  41. package/build/types/upload/utils/getFileType/getFileType.d.ts +1 -1
  42. package/build/types/upload/utils/getFileType/getFileType.d.ts.map +1 -1
  43. package/build/types/upload/utils/getFileType/index.d.ts +1 -1
  44. package/build/types/upload/utils/getFileType/index.d.ts.map +1 -1
  45. package/build/types/upload/utils/index.d.ts +5 -7
  46. package/build/types/upload/utils/index.d.ts.map +1 -1
  47. package/build/types/upload/utils/isSizeValid/index.d.ts +1 -1
  48. package/build/types/upload/utils/isSizeValid/index.d.ts.map +1 -1
  49. package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts +1 -1
  50. package/build/types/upload/utils/isSizeValid/isSizeValid.d.ts.map +1 -1
  51. package/build/types/upload/utils/isTypeValid/index.d.ts +1 -1
  52. package/build/types/upload/utils/isTypeValid/index.d.ts.map +1 -1
  53. package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts +1 -1
  54. package/build/types/upload/utils/isTypeValid/isTypeValid.d.ts.map +1 -1
  55. package/build/types/upload/utils/postData/index.d.ts +1 -1
  56. package/build/types/upload/utils/postData/index.d.ts.map +1 -1
  57. package/build/types/upload/utils/postData/postData.d.ts +11 -1
  58. package/build/types/upload/utils/postData/postData.d.ts.map +1 -1
  59. package/package.json +2 -2
  60. package/src/dateInput/DateInput.spec.tsx +220 -0
  61. package/src/dateInput/DateInput.story.tsx +3 -76
  62. package/src/dateInput/DateInput.tests.story.tsx +238 -0
  63. package/src/dateInput/DateInput.tsx +50 -53
  64. package/src/field/Field.story.tsx +17 -36
  65. package/src/field/Field.tests.story.tsx +33 -0
  66. package/src/field/Field.tsx +23 -13
  67. package/src/index.ts +2 -1
  68. package/src/inlineAlert/InlineAlert.story.tsx +13 -5
  69. package/src/inlineAlert/InlineAlert.tsx +14 -7
  70. package/src/main.css +4 -2
  71. package/src/processIndicator/ProcessIndicator.tsx +1 -1
  72. package/src/statusIcon/StatusIcon.css +4 -2
  73. package/src/statusIcon/StatusIcon.less +4 -2
  74. package/src/statusIcon/StatusIcon.tsx +1 -1
  75. package/src/upload/Upload.spec.js +3 -14
  76. package/src/upload/Upload.story.tsx +37 -0
  77. package/src/upload/{Upload.js → Upload.tsx} +164 -169
  78. package/src/upload/index.ts +2 -0
  79. package/src/upload/steps/completeStep/completeStep.spec.js +3 -2
  80. package/src/upload/steps/completeStep/completeStep.tsx +74 -0
  81. package/src/upload/steps/completeStep/index.ts +2 -0
  82. package/src/upload/steps/{index.js → index.ts} +0 -1
  83. package/src/upload/steps/processingStep/index.ts +2 -0
  84. package/src/upload/steps/processingStep/processingStep.tsx +53 -0
  85. package/src/upload/steps/uploadImageStep/index.ts +2 -0
  86. package/src/upload/steps/uploadImageStep/{uploadImageStep.js → uploadImageStep.tsx} +17 -23
  87. package/src/upload/utils/asyncFileRead/asyncFileRead.spec.ts +14 -0
  88. package/src/upload/utils/asyncFileRead/asyncFileRead.ts +12 -0
  89. package/src/upload/utils/getFileType/getFileType.spec.ts +22 -0
  90. package/src/upload/utils/getFileType/getFileType.ts +16 -0
  91. package/src/upload/utils/{index.js → index.ts} +0 -2
  92. package/src/upload/utils/isSizeValid/{isSizeValid.spec.js → isSizeValid.spec.ts} +3 -3
  93. package/src/upload/utils/isSizeValid/isSizeValid.ts +3 -0
  94. package/src/upload/utils/isTypeValid/isTypeValid.spec.ts +62 -0
  95. package/src/upload/utils/isTypeValid/isTypeValid.ts +19 -0
  96. package/src/upload/utils/postData/postData.spec.ts +65 -0
  97. package/src/upload/utils/postData/postData.ts +36 -0
  98. package/src/uploadInput/UploadInput.tsx +1 -1
  99. package/build/types/upload/steps/mediaUploadStep/index.d.ts +0 -2
  100. package/build/types/upload/steps/mediaUploadStep/index.d.ts.map +0 -1
  101. package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts +0 -24
  102. package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts.map +0 -1
  103. package/build/types/upload/uploadSteps.d.ts +0 -5
  104. package/build/types/upload/uploadSteps.d.ts.map +0 -1
  105. package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts +0 -2
  106. package/build/types/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.d.ts.map +0 -1
  107. package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts +0 -2
  108. package/build/types/upload/utils/getSupportedSpotMimeTypes/index.d.ts.map +0 -1
  109. package/build/types/upload/utils/requestMedia/index.d.ts +0 -2
  110. package/build/types/upload/utils/requestMedia/index.d.ts.map +0 -1
  111. package/build/types/upload/utils/requestMedia/requestMedia.d.ts +0 -2
  112. package/build/types/upload/utils/requestMedia/requestMedia.d.ts.map +0 -1
  113. package/src/dateInput/DateInput.rtl.spec.tsx +0 -17
  114. package/src/dateInput/DateInput.spec.js +0 -477
  115. package/src/upload/Upload.story.js +0 -36
  116. package/src/upload/index.js +0 -2
  117. package/src/upload/steps/completeStep/completeStep.js +0 -98
  118. package/src/upload/steps/completeStep/index.js +0 -1
  119. package/src/upload/steps/mediaUploadStep/index.js +0 -1
  120. package/src/upload/steps/mediaUploadStep/mediaUploadStep.js +0 -80
  121. package/src/upload/steps/mediaUploadStep/mediaUploadStep.spec.js +0 -77
  122. package/src/upload/steps/processingStep/index.js +0 -1
  123. package/src/upload/steps/processingStep/processingStep.js +0 -73
  124. package/src/upload/steps/uploadImageStep/index.js +0 -1
  125. package/src/upload/uploadSteps.ts +0 -5
  126. package/src/upload/utils/asyncFileRead/asyncFileRead.js +0 -11
  127. package/src/upload/utils/asyncFileRead/asyncFileRead.spec.js +0 -17
  128. package/src/upload/utils/getFileType/getFileType.js +0 -19
  129. package/src/upload/utils/getFileType/getFileType.spec.js +0 -33
  130. package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.js +0 -18
  131. package/src/upload/utils/getSupportedSpotMimeTypes/getSupportedSpotMimeTypes.spec.js +0 -22
  132. package/src/upload/utils/getSupportedSpotMimeTypes/index.js +0 -1
  133. package/src/upload/utils/isSizeValid/isSizeValid.js +0 -1
  134. package/src/upload/utils/isTypeValid/isTypeValid.js +0 -26
  135. package/src/upload/utils/isTypeValid/isTypeValid.spec.js +0 -68
  136. package/src/upload/utils/postData/postData.js +0 -18
  137. package/src/upload/utils/postData/postData.spec.js +0 -109
  138. package/src/upload/utils/requestMedia/index.js +0 -1
  139. package/src/upload/utils/requestMedia/requestMedia.js +0 -26
  140. package/src/upload/utils/requestMedia/requestMedia.spec.js +0 -44
  141. /package/src/upload/{Upload.messages.js → Upload.messages.ts} +0 -0
  142. /package/src/upload/utils/asyncFileRead/{index.js → index.ts} +0 -0
  143. /package/src/upload/utils/getFileType/{index.js → index.ts} +0 -0
  144. /package/src/upload/utils/isSizeValid/{index.js → index.ts} +0 -0
  145. /package/src/upload/utils/isTypeValid/{index.js → index.ts} +0 -0
  146. /package/src/upload/utils/postData/{index.js → index.ts} +0 -0
@@ -1,22 +1,18 @@
1
- export default UploadImageStep;
2
- declare class UploadImageStep extends PureComponent<any, any, any> {
3
- constructor();
4
- uploadInputRef: import("react").RefObject<any>;
1
+ import { PureComponent } from 'react';
2
+ export interface UploadImageStepProps {
3
+ fileDropped: (file: File) => void;
4
+ isComplete: boolean;
5
+ usAccept: string;
6
+ usButtonText: string;
7
+ usDisabled: boolean;
8
+ usHelpImage: React.ReactNode;
9
+ usLabel: string;
10
+ usPlaceholder: string;
11
+ }
12
+ export default class UploadImageStep extends PureComponent<UploadImageStepProps> {
13
+ uploadInputRef: import("react").RefObject<HTMLInputElement>;
5
14
  onManualUpload: () => void;
6
- getImage: () => any;
15
+ getImage: () => number | true | Iterable<import("react").ReactNode> | import("react").JSX.Element;
7
16
  render(): import("react").JSX.Element;
8
17
  }
9
- declare namespace UploadImageStep {
10
- namespace propTypes {
11
- let fileDropped: any;
12
- let isComplete: any;
13
- let usAccept: any;
14
- let usButtonText: any;
15
- let usDisabled: any;
16
- let usHelpImage: any;
17
- let usLabel: any;
18
- let usPlaceholder: any;
19
- }
20
- }
21
- import { PureComponent } from 'react';
22
18
  //# sourceMappingURL=uploadImageStep.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadImageStep.d.ts","sourceRoot":"","sources":["../../../../../src/upload/steps/uploadImageStep/uploadImageStep.js"],"names":[],"mappings":";AAIA;IACE,cAGC;IADC,+CAAiC;IAGnC,2BAME;IAEF,oBAgBE;IAEF,sCA8BC;CACF;;;;;;;;;;;;;8BAjEwC,OAAO"}
1
+ {"version":3,"file":"uploadImageStep.d.ts","sourceRoot":"","sources":["../../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAC9E,cAAc,8CAAiC;IAE/C,cAAc,aAMZ;IAEF,QAAQ,0FAgBN;IAEF,MAAM;CA+BP"}
@@ -1,2 +1,2 @@
1
- export function asyncFileRead(file: any): Promise<any>;
1
+ export declare function asyncFileRead(file: Blob): Promise<string>;
2
2
  //# sourceMappingURL=asyncFileRead.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"asyncFileRead.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/asyncFileRead/asyncFileRead.js"],"names":[],"mappings":"AAAO,uDAUH"}
1
+ {"version":3,"file":"asyncFileRead.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/asyncFileRead/asyncFileRead.ts"],"names":[],"mappings":"AAAA,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,mBAW7C"}
@@ -1,2 +1,2 @@
1
- export { asyncFileRead } from "./asyncFileRead";
1
+ export { asyncFileRead } from './asyncFileRead';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/asyncFileRead/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/asyncFileRead/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,2 +1,2 @@
1
- export function getFileType(file: any, file64: any): any;
1
+ export declare function getFileType(file: Blob, file64?: string): string;
2
2
  //# sourceMappingURL=getFileType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFileType.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/getFileType/getFileType.js"],"names":[],"mappings":"AAAO,yDAkBN"}
1
+ {"version":3,"file":"getFileType.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/getFileType/getFileType.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,UAetD"}
@@ -1,2 +1,2 @@
1
- export { getFileType } from "./getFileType";
1
+ export { getFileType } from './getFileType';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/getFileType/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/getFileType/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,8 +1,6 @@
1
- export { postData } from "./postData";
2
- export { asyncFileRead } from "./asyncFileRead";
3
- export { isSizeValid } from "./isSizeValid";
4
- export { isTypeValid } from "./isTypeValid";
5
- export { getFileType } from "./getFileType";
6
- export { getSupportedSpotMimeTypes } from "./getSupportedSpotMimeTypes";
7
- export { requestMedia } from "./requestMedia";
1
+ export { postData } from './postData';
2
+ export { asyncFileRead } from './asyncFileRead';
3
+ export { isSizeValid } from './isSizeValid';
4
+ export { isTypeValid } from './isTypeValid';
5
+ export { getFileType } from './getFileType';
8
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/upload/utils/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/upload/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- export { isSizeValid } from "./isSizeValid";
1
+ export { isSizeValid } from './isSizeValid';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isSizeValid/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isSizeValid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- export function isSizeValid(file: any, maxSize: any): boolean;
1
+ export declare function isSizeValid(file: Blob, maxSize: number): boolean;
2
2
  //# sourceMappingURL=isSizeValid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isSizeValid.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isSizeValid/isSizeValid.js"],"names":[],"mappings":"AAAO,8DAAwF"}
1
+ {"version":3,"file":"isSizeValid.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isSizeValid/isSizeValid.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAEtD"}
@@ -1,2 +1,2 @@
1
- export { isTypeValid } from "./isTypeValid";
1
+ export { isTypeValid } from './isTypeValid';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isTypeValid/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isTypeValid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- export function isTypeValid(file: any, rule: any, file64: any): any;
1
+ export declare function isTypeValid(file: Blob, rule: string, file64?: string): boolean;
2
2
  //# sourceMappingURL=isTypeValid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isTypeValid.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isTypeValid/isTypeValid.js"],"names":[],"mappings":"AAEO,oEAuBN"}
1
+ {"version":3,"file":"isTypeValid.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/isTypeValid/isTypeValid.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,WAgBpE"}
@@ -1,2 +1,2 @@
1
- export { postData } from "./postData";
1
+ export { postData } from './postData';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/postData/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/postData/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -1,2 +1,12 @@
1
- export function postData(httpOptions: any, data?: {}, fetcher?: typeof fetch): Promise<Response>;
1
+ export declare class ResponseError extends Error {
2
+ response: Response;
3
+ status: number;
4
+ constructor(response: Response, message?: string);
5
+ }
6
+ export interface PostDataHTTPOptions extends Omit<RequestInit, 'body'> {
7
+ url: string;
8
+ method?: 'POST' | 'PUT' | 'PATCH';
9
+ }
10
+ export type PostDataFetcher = (input: string, init: RequestInit) => Promise<Response>;
11
+ export declare function postData({ url, method, ...httpOptions }: PostDataHTTPOptions, data: RequestInit['body'], fetcher?: PostDataFetcher): Promise<Response>;
2
12
  //# sourceMappingURL=postData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postData.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/postData/postData.js"],"names":[],"mappings":"AAAO,iGAiBD"}
1
+ {"version":3,"file":"postData.d.ts","sourceRoot":"","sources":["../../../../../src/upload/utils/postData/postData.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;gBAEH,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM;CAMjD;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEtF,wBAAsB,QAAQ,CAC5B,EAAE,GAAG,EAAE,MAAe,EAAE,GAAG,WAAW,EAAE,EAAE,mBAAmB,EAC7D,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,OAAO,GAAE,eAAuB,qBAajC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "46.39.0",
3
+ "version": "46.41.0",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -92,8 +92,8 @@
92
92
  "react-intl": "^6.6.6",
93
93
  "rollup": "^4.17.2",
94
94
  "storybook": "^8.1.10",
95
- "@transferwise/neptune-css": "14.10.0",
96
95
  "@transferwise/less-config": "3.1.0",
96
+ "@transferwise/neptune-css": "14.11.0",
97
97
  "@wise/components-theming": "1.3.0"
98
98
  },
99
99
  "peerDependencies": {
@@ -0,0 +1,220 @@
1
+ import { screen, fireEvent } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { DateInput, DateInputProps, Field } from '..';
4
+ import { mockMatchMedia, mockResizeObserver, render } from '../test-utils';
5
+
6
+ describe('Date Input Component', () => {
7
+ const props: DateInputProps = { onChange: jest.fn() };
8
+
9
+ beforeEach(() => {
10
+ mockMatchMedia();
11
+ mockResizeObserver();
12
+ });
13
+
14
+ afterEach(() => {
15
+ jest.resetAllMocks();
16
+ });
17
+
18
+ describe('when initialised without a model', () => {
19
+ it('sets day field to empty', () => {
20
+ render(<DateInput {...props} />);
21
+ const dayInput = screen.getByRole('textbox', { name: /day/i });
22
+ expect(dayInput).toHaveValue('');
23
+ });
24
+
25
+ it('sets month field to empty', () => {
26
+ render(<DateInput {...props} />);
27
+ const monthSelect = screen.getByRole('button', { name: /month/i });
28
+ expect(monthSelect).toHaveValue('');
29
+ });
30
+
31
+ it('sets year field to empty', () => {
32
+ render(<DateInput {...props} />);
33
+ const yearInput = screen.getByRole('textbox', { name: /year/i });
34
+ expect(yearInput).toHaveValue('');
35
+ });
36
+ });
37
+
38
+ describe('when initialised with a model', () => {
39
+ it('sets values correctly with a valid Date instance', () => {
40
+ render(<DateInput {...props} value="1971-08-01" />);
41
+ expect(screen.getByRole('textbox', { name: /day/i })).toHaveValue('1');
42
+ expect(screen.getByRole('button', { name: /month/i })).toHaveTextContent('August');
43
+ expect(screen.getByRole('textbox', { name: /year/i })).toHaveValue('1971');
44
+ });
45
+
46
+ it('sets values correctly with a valid short ISO8601 string', () => {
47
+ render(<DateInput {...props} value="1990-08-22" />);
48
+ expect(screen.getByRole('textbox', { name: /day/i })).toHaveValue('22');
49
+ expect(screen.getByRole('button', { name: /month/i })).toHaveTextContent('August');
50
+ expect(screen.getByRole('textbox', { name: /year/i })).toHaveValue('1990');
51
+ });
52
+
53
+ it('sets values correctly with a valid short ISO8601 string with year and month only', () => {
54
+ render(<DateInput {...props} value="1990-08" />);
55
+ expect(screen.getByRole('textbox', { name: /day/i })).toHaveValue('');
56
+ expect(screen.getByRole('button', { name: /month/i })).toHaveTextContent('August');
57
+ expect(screen.getByRole('textbox', { name: /year/i })).toHaveValue('1990');
58
+ });
59
+
60
+ it('sets values correctly with a valid long ISO8601 string', () => {
61
+ render(<DateInput {...props} value="1990-02-28T00:00:00.000Z" />);
62
+ expect(screen.getByRole('textbox', { name: /day/i })).toHaveValue('28');
63
+ expect(screen.getByRole('button', { name: /month/i })).toHaveTextContent('February');
64
+ expect(screen.getByRole('textbox', { name: /year/i })).toHaveValue('1990');
65
+ });
66
+
67
+ it('sets values to disabled when disabled is set to true', () => {
68
+ render(<DateInput {...props} disabled />);
69
+ expect(screen.getByRole('textbox', { name: /day/i })).toBeDisabled();
70
+ expect(screen.getByRole('button', { name: /month/i })).toBeDisabled();
71
+ expect(screen.getByRole('textbox', { name: /year/i })).toBeDisabled();
72
+ });
73
+
74
+ it("doesn't set values to disabled when disabled is set to false", () => {
75
+ render(<DateInput {...props} />);
76
+ expect(screen.getByRole('textbox', { name: /day/i })).toBeEnabled();
77
+ expect(screen.getByRole('button', { name: /month/i })).toBeEnabled();
78
+ expect(screen.getByRole('textbox', { name: /year/i })).toBeEnabled();
79
+ });
80
+ });
81
+
82
+ describe('when initialised', () => {
83
+ it(`doesn't call the onChange callback without an initial value`, () => {
84
+ render(<DateInput {...props} />);
85
+ expect(props.onChange).not.toHaveBeenCalled();
86
+ });
87
+
88
+ it(`doesn't call the onChange callback with an initial value`, () => {
89
+ render(<DateInput {...props} value="1990-08-08" />);
90
+ expect(props.onChange).not.toHaveBeenCalled();
91
+ });
92
+ });
93
+
94
+ describe('when interacting', () => {
95
+ it('calls the onChange callback with null when changing the day but nothing else is filled out', async () => {
96
+ render(<DateInput {...props} />);
97
+ await userEvent.type(screen.getByRole('textbox', { name: /day/i }), '4');
98
+ expect(props.onChange).toHaveBeenCalledWith(null);
99
+ });
100
+
101
+ it('calls the onChange callback with null when changing the month but nothing else is filled out', async () => {
102
+ render(<DateInput {...props} />);
103
+ const monthSelect = screen.getByLabelText(/month/i);
104
+ await userEvent.click(monthSelect);
105
+ await userEvent.click(screen.getByRole('option', { name: /January/ }));
106
+ expect(props.onChange).toHaveBeenCalledWith(null);
107
+ });
108
+
109
+ it('calls the onChange callback with null when changing the year but nothing else is filled out', async () => {
110
+ render(<DateInput {...props} />);
111
+ await userEvent.type(screen.getByRole('textbox', { name: /day/i }), '4444');
112
+ expect(props.onChange).toHaveBeenCalledWith(null);
113
+ });
114
+
115
+ it('calls the onChange callback with the correct value when changing the day', async () => {
116
+ render(<DateInput {...props} value="2022-12-1" />);
117
+ const dayInput = screen.getByRole('textbox', { name: /day/i });
118
+ // add 8 to the 1 that's already there
119
+ await userEvent.type(dayInput, '8');
120
+ expect(props.onChange).toHaveBeenCalledWith('2022-12-18');
121
+ });
122
+
123
+ it('calls the onChange callback with the correct value when changing the month', async () => {
124
+ render(<DateInput {...props} value="2022-12-1" />);
125
+ const monthSelect = screen.getByRole('button', { name: /month/i });
126
+ await userEvent.click(monthSelect);
127
+ await userEvent.click(screen.getByRole('option', { name: /January/ }));
128
+ expect(props.onChange).toHaveBeenCalledWith('2022-01-01');
129
+ });
130
+
131
+ it('calls the onChange callback with the correct value when changing the year', async () => {
132
+ render(<DateInput {...props} value="0122-12-1" />);
133
+ const yearInput = screen.getByRole('textbox', { name: /year/i });
134
+ // 0122 ends up being 122 in the box when it's supplied as the starting value
135
+ await userEvent.type(yearInput, '2');
136
+ expect(props.onChange).toHaveBeenCalledWith('1222-12-01');
137
+ });
138
+
139
+ it('calls the onChange callback with the null when not having a 4 digit year', async () => {
140
+ render(<DateInput {...props} />);
141
+ const yearInput = screen.getByRole('textbox', { name: /year/i });
142
+ await userEvent.type(yearInput, '123');
143
+ expect(props.onChange).toHaveBeenCalledWith(null);
144
+ });
145
+
146
+ it('calls the onChange callback with the null when changing the day to a day that is higher than max value', async () => {
147
+ render(<DateInput {...props} value="2022-11-3" />);
148
+ const dayInput = screen.getByRole('textbox', { name: /day/i });
149
+ // add 1 to the 3 that's already there
150
+ await userEvent.type(dayInput, '1');
151
+ expect(props.onChange).toHaveBeenCalledWith(null);
152
+ });
153
+
154
+ it('does not overflow very high day values to the next month', async () => {
155
+ render(<DateInput {...props} value="2022-11-6" />);
156
+ const dayInput = screen.getByRole('textbox', { name: /day/i });
157
+ // add 6 to the 6 that's already there
158
+ await userEvent.type(dayInput, '6');
159
+ expect(props.onChange).toHaveBeenCalledWith(null);
160
+ });
161
+
162
+ it('only pastes in first 6 digits of a long number for year', async () => {
163
+ render(<DateInput {...props} value="2010-01-01" />);
164
+ const yearInput = screen.getByRole('textbox', { name: /year/i });
165
+ yearInput.focus();
166
+ await userEvent.type(yearInput, '{backspace}{backspace}{backspace}{backspace}');
167
+ await userEvent.paste('12345678');
168
+ expect(props.onChange).toHaveBeenCalledWith('123456-01-01');
169
+ });
170
+
171
+ it('only pastes in first 2 digits of a long number for day', async () => {
172
+ render(<DateInput {...props} value="2010-01-01" />);
173
+ const yearInput = screen.getByRole('textbox', { name: /day/i });
174
+ yearInput.focus();
175
+ await userEvent.type(yearInput, '{backspace}{backspace}');
176
+ await userEvent.paste('123456');
177
+ expect(props.onChange).toHaveBeenCalledWith('2010-01-12');
178
+ });
179
+ });
180
+
181
+ describe('when switching from day input to year input', () => {
182
+ it('does not call onBlur nor onFocus', () => {
183
+ const onFocus = jest.fn();
184
+ const onBlur = jest.fn();
185
+
186
+ render(<DateInput {...props} />);
187
+ const dayInput = screen.getByRole('textbox', { name: /day/i });
188
+ const yearInput = screen.getByRole('textbox', { name: /year/i });
189
+ fireEvent.focus(dayInput);
190
+ fireEvent.blur(dayInput);
191
+ fireEvent.focus(yearInput);
192
+ expect(onFocus).not.toHaveBeenCalled();
193
+ expect(onBlur).not.toHaveBeenCalled();
194
+ });
195
+ });
196
+
197
+ describe('when selectProps is provided', () => {
198
+ it('renders Select component with expected props', () => {
199
+ render(
200
+ <DateInput
201
+ selectProps={{
202
+ id: 'mock-id',
203
+ }}
204
+ {...props}
205
+ />,
206
+ );
207
+ const monthSelect = screen.getByRole('button', { name: /month/i });
208
+ expect(monthSelect).toHaveAttribute('id', 'mock-id');
209
+ });
210
+ });
211
+
212
+ it('supports `Field` for labeling', () => {
213
+ render(
214
+ <Field label="Date of birth">
215
+ <DateInput onChange={() => {}} />
216
+ </Field>,
217
+ );
218
+ expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Date of birth/);
219
+ });
220
+ });
@@ -1,19 +1,11 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
- import { userEvent, within } from '@storybook/test';
2
+ import { fn } from '@storybook/test';
3
3
 
4
- import { DateInput, DateMode, Info, InlineAlert, Title, Typography } from '..';
5
- import { lorem10, storyConfig } from '../test-utils';
4
+ import { DateInput } from '..';
6
5
 
7
6
  const meta = {
8
7
  component: DateInput,
9
8
  title: 'Forms/DateInput',
10
- args: {
11
- dayLabel: 'Day input',
12
- dayAutoComplete: 'bday-day',
13
- monthLabel: 'Month select',
14
- yearLabel: 'Year input',
15
- yearAutoComplete: 'bday-year',
16
- },
17
9
  tags: ['autodocs'],
18
10
  } satisfies Meta<typeof DateInput>;
19
11
 
@@ -23,71 +15,6 @@ type Story = StoryObj<typeof meta>;
23
15
 
24
16
  export const Basic = {
25
17
  args: {
26
- onChange: () => {},
27
- },
28
- play: async ({ canvasElement }) => {
29
- const canvas = within(canvasElement);
30
- await userEvent.click(canvas.getByRole('button'));
31
- },
32
- } satisfies Story;
33
-
34
- export const WithLabel = {
35
- args: {
36
- onChange: () => {},
37
- },
38
- render: (args) => {
39
- const id1 = 'date-input-group-label-1';
40
- const label = 'Date of Birth';
41
- return (
42
- <>
43
- <Title type={Typography.TITLE_SUBSECTION}>
44
- label (as <code>div</code> element) is linked with <code>DateInput</code> via{' '}
45
- <code>aria-labelledby</code> prop
46
- </Title>
47
- <div className="control-label" id={id1}>
48
- Date of Delivery
49
- </div>
50
- <DateInput {...args} aria-labelledby={id1} />
51
-
52
- <br />
53
-
54
- <Title type={Typography.TITLE_SUBSECTION}>
55
- label (as <code>div</code> element) is detached but <code>DateInput</code> has same label
56
- via <code>aria-label</code> attribute
57
- </Title>
58
- <div className="control-label">
59
- {label}{' '}
60
- <Info aria-label="Fast transfer hint" title="Fast transfer hint" content={lorem10} />
61
- </div>
62
- <DateInput {...args} aria-label={label} />
63
-
64
- <br />
65
-
66
- <Title type={Typography.TITLE_SUBSECTION}>
67
- <code>DateInput</code> wrapped in <code>fieldset</code> + using <code>legend</code> as
68
- label (rare use case)
69
- </Title>
70
- <fieldset>
71
- <legend className="control-label">
72
- Expiry Date for Credit Card (example of MONTH_YEAR mode)
73
- </legend>
74
- <DateInput {...args} mode={DateMode.MONTH_YEAR} />
75
- </fieldset>
76
- </>
77
- );
18
+ onChange: fn(),
78
19
  },
79
20
  } satisfies Story;
80
-
81
- export const BasicMobile = storyConfig(Basic, { variants: ['mobile'] });
82
-
83
- export const InputError = {
84
- ...Basic,
85
- render: (args) => (
86
- <div className="form-group has-error">
87
- <DateInput {...args} />
88
- <InlineAlert type="error">{lorem10}</InlineAlert>
89
- </div>
90
- ),
91
- } satisfies Story;
92
-
93
- export const InputErrorMobile = storyConfig(InputError, { variants: ['mobile'] });