@transferwise/components 0.0.0-experimental-a39a137 → 0.0.0-experimental-dcb657b

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 (74) hide show
  1. package/build/alert/Alert.js +8 -4
  2. package/build/alert/Alert.js.map +1 -1
  3. package/build/alert/Alert.mjs +8 -4
  4. package/build/alert/Alert.mjs.map +1 -1
  5. package/build/field/Field.js +2 -0
  6. package/build/field/Field.js.map +1 -1
  7. package/build/field/Field.mjs +2 -0
  8. package/build/field/Field.mjs.map +1 -1
  9. package/build/i18n/en.json +5 -0
  10. package/build/i18n/en.json.js +5 -0
  11. package/build/i18n/en.json.js.map +1 -1
  12. package/build/i18n/en.json.mjs +5 -0
  13. package/build/i18n/en.json.mjs.map +1 -1
  14. package/build/inlineAlert/InlineAlert.js +3 -1
  15. package/build/inlineAlert/InlineAlert.js.map +1 -1
  16. package/build/inlineAlert/InlineAlert.mjs +3 -1
  17. package/build/inlineAlert/InlineAlert.mjs.map +1 -1
  18. package/build/main.css +3 -0
  19. package/build/statusIcon/StatusIcon.js +50 -16
  20. package/build/statusIcon/StatusIcon.js.map +1 -1
  21. package/build/statusIcon/StatusIcon.messages.js +24 -0
  22. package/build/statusIcon/StatusIcon.messages.js.map +1 -0
  23. package/build/statusIcon/StatusIcon.messages.mjs +22 -0
  24. package/build/statusIcon/StatusIcon.messages.mjs.map +1 -0
  25. package/build/statusIcon/StatusIcon.mjs +48 -14
  26. package/build/statusIcon/StatusIcon.mjs.map +1 -1
  27. package/build/styles/alert/Alert.css +3 -0
  28. package/build/styles/main.css +3 -0
  29. package/build/types/alert/Alert.d.ts +16 -2
  30. package/build/types/alert/Alert.d.ts.map +1 -1
  31. package/build/types/field/Field.d.ts +6 -1
  32. package/build/types/field/Field.d.ts.map +1 -1
  33. package/build/types/inlineAlert/InlineAlert.d.ts +2 -1
  34. package/build/types/inlineAlert/InlineAlert.d.ts.map +1 -1
  35. package/build/types/statusIcon/StatusIcon.d.ts +7 -1
  36. package/build/types/statusIcon/StatusIcon.d.ts.map +1 -1
  37. package/build/types/statusIcon/StatusIcon.messages.d.ts +29 -0
  38. package/build/types/statusIcon/StatusIcon.messages.d.ts.map +1 -0
  39. package/build/types/upload/Upload.d.ts +5 -0
  40. package/build/types/upload/Upload.d.ts.map +1 -1
  41. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +1 -0
  42. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
  43. package/build/upload/Upload.js +4 -2
  44. package/build/upload/Upload.js.map +1 -1
  45. package/build/upload/Upload.mjs +4 -2
  46. package/build/upload/Upload.mjs.map +1 -1
  47. package/build/upload/steps/uploadImageStep/uploadImageStep.js +6 -3
  48. package/build/upload/steps/uploadImageStep/uploadImageStep.js.map +1 -1
  49. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs +6 -3
  50. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs.map +1 -1
  51. package/package.json +3 -3
  52. package/src/alert/Alert.css +3 -0
  53. package/src/alert/Alert.less +3 -0
  54. package/src/alert/Alert.spec.story.tsx +56 -3
  55. package/src/alert/Alert.spec.tsx +14 -0
  56. package/src/alert/Alert.story.tsx +93 -1
  57. package/src/alert/Alert.tsx +24 -5
  58. package/src/field/Field.spec.tsx +19 -0
  59. package/src/field/Field.story.tsx +20 -4
  60. package/src/field/Field.tsx +7 -1
  61. package/src/i18n/en.json +5 -0
  62. package/src/inlineAlert/InlineAlert.spec.tsx +12 -1
  63. package/src/inlineAlert/InlineAlert.tsx +5 -1
  64. package/src/main.css +3 -0
  65. package/src/main.less +1 -0
  66. package/src/statusIcon/StatusIcon.docs.mdx +28 -0
  67. package/src/statusIcon/StatusIcon.messages.ts +34 -0
  68. package/src/statusIcon/StatusIcon.spec.tsx +39 -4
  69. package/src/statusIcon/StatusIcon.story.tsx +15 -6
  70. package/src/statusIcon/StatusIcon.tsx +63 -14
  71. package/src/upload/Upload.spec.js +19 -0
  72. package/src/upload/Upload.tsx +7 -0
  73. package/src/upload/steps/uploadImageStep/uploadImageStep.spec.js +13 -0
  74. package/src/upload/steps/uploadImageStep/uploadImageStep.tsx +15 -4
@@ -1 +1 @@
1
- {"version":3,"file":"Upload.mjs","sources":["../../src/upload/Upload.tsx"],"sourcesContent":["import { Plus as PlusIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { Component } from 'react';\nimport { injectIntl, WrappedComponentProps } from 'react-intl';\n\nimport { Size, Typography } from '../common';\nimport Title from '../title';\n\nimport messages from './Upload.messages';\nimport { UploadImageStep, ProcessingStep, CompleteStep } from './steps';\nimport { postData, asyncFileRead, isSizeValid, isTypeValid, getFileType } from './utils';\nimport { PostDataFetcher, PostDataHTTPOptions, ResponseError } from './utils/postData/postData';\nimport { ProcessIndicatorStatus } from '../processIndicator';\n\n/*\n * This delay is required for the isError/isSuccess to be fired after isProcessing so the processIndicator, will be\n * rendered first and then updated with the right status.\n */\nconst ANIMATION_FIX = 10;\nexport const MAX_SIZE_DEFAULT = 5000000;\n\nexport enum UploadStep {\n UPLOAD_IMAGE_STEP = 'uploadImageStep',\n}\n\nexport interface UploadProps extends WrappedComponentProps {\n animationDelay?: number;\n csButtonText?: string;\n csFailureText?: string;\n csSuccessText?: string;\n csTooLargeMessage?: string;\n csWrongTypeMessage?: string;\n httpOptions?: PostDataHTTPOptions & {\n fileInputName?: string;\n data?: Record<string, string | Blob>;\n };\n /**\n * You can provide a fetcher function with the same interface as the global fetch function, which is used by default.\n * function fetcher(input: RequestInfo, init?: RequestInit): Promise<Response>\n */\n fetcher?: PostDataFetcher;\n maxSize?: number;\n psButtonText?: string;\n psButtonDisabled?: boolean;\n psProcessingText?: string;\n size?: `${Size.SMALL | Size.MEDIUM | Size.LARGE}`;\n /**\n * You can provide multiple rules separated by comma, e.g.: \"application/pdf,image/*\".\n * Using \"*\" will allow every file type to be uploaded.\n */\n usAccept?: string;\n usButtonText?: string;\n usButtonRetryText?: string;\n usDisabled?: boolean;\n usDropMessage?: string;\n usHelpImage?: React.ReactNode;\n usLabel?: string;\n usPlaceholder?: string;\n /** @deprecated Only a single variant exists, please remove this prop. */\n uploadStep?: `${UploadStep}`;\n onCancel?: () => void;\n onFailure?: (error: unknown) => void;\n onStart?: (file: File) => void;\n onSuccess?: (response: string | Response, fileName: string) => void;\n}\n\ninterface UploadState {\n fileName: string;\n isDroppable: boolean;\n isComplete: boolean;\n isError: boolean;\n isImage: boolean;\n isProcessing: boolean;\n isSuccess: boolean;\n response: unknown;\n uploadedImage: string | undefined;\n}\n\nexport class Upload extends Component<UploadProps, UploadState> {\n declare props: UploadProps & Required<Pick<UploadProps, keyof typeof Upload.defaultProps>>;\n\n static defaultProps = {\n animationDelay: 700,\n maxSize: MAX_SIZE_DEFAULT,\n psButtonDisabled: false,\n size: 'md',\n usAccept: 'image/*',\n usDisabled: false,\n usLabel: '',\n } satisfies Partial<UploadProps>;\n\n dragCounter = 0;\n timeouts = 0;\n\n constructor(props: UploadProps) {\n super(props);\n\n this.state = {\n fileName: '',\n isDroppable: false,\n isComplete: false,\n isError: false,\n isImage: false,\n isProcessing: false,\n isSuccess: false,\n response: undefined,\n uploadedImage: undefined,\n };\n }\n\n getErrorMessage(status?: number) {\n const { csFailureText, csTooLargeMessage, csWrongTypeMessage, maxSize, intl } = this.props;\n switch (status) {\n case 413:\n return (\n csTooLargeMessage ||\n intl.formatMessage(messages.csTooLargeMessage, {\n maxSize: maxSize / 1000000,\n })\n );\n case 415:\n return csWrongTypeMessage || intl.formatMessage(messages.csWrongTypeMessage);\n default:\n return csFailureText || intl.formatMessage(messages.csFailureText);\n }\n }\n\n onDragLeave(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n this.dragCounter -= 1;\n if (this.dragCounter === 0) {\n this.setState({ isDroppable: false });\n }\n }\n\n onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n this.dragCounter += 1;\n const { usDisabled } = this.props;\n const { isProcessing } = this.state;\n if (this.dragCounter === 1 && !usDisabled && !isProcessing) {\n this.setState({ isDroppable: true });\n }\n }\n\n async onDrop(event: React.DragEvent<HTMLDivElement>) {\n const { isProcessing } = this.state;\n event.preventDefault();\n if (!isProcessing) {\n this.reset();\n }\n\n if (event.dataTransfer?.files?.[0]) {\n await this.fileDropped(event.dataTransfer.files[0]);\n }\n }\n\n onAnimationCompleted = async (status: ProcessIndicatorStatus) => {\n const { response, isProcessing, fileName } = this.state;\n const { animationDelay } = this.props;\n\n if (isProcessing && status === 'succeeded') {\n const { onSuccess } = this.props;\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n onSuccess ? () => onSuccess(response as string | Response, fileName) : undefined,\n );\n }, animationDelay);\n }\n\n if (isProcessing && status === 'failed') {\n const { onFailure } = this.props;\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n onFailure ? () => onFailure(response) : undefined,\n );\n }, animationDelay);\n }\n };\n\n asyncPost = async (file: File) => {\n const { httpOptions, fetcher } = this.props;\n if (httpOptions == null) {\n throw new Error('Cannot find HTTP options');\n }\n\n const { fileInputName = file.name, data = {} } = httpOptions;\n\n const formData = new FormData();\n formData.append(fileInputName, file);\n Object.keys(data).forEach((key) => formData.append(key, data[key]));\n return postData(httpOptions, formData, fetcher);\n };\n\n asyncResponse = (response: unknown, type: 'success' | 'error') => {\n // Gives time to the animation callback to fire.\n this.timeouts = window.setTimeout(() => {\n this.setState({\n response,\n isError: type === 'error',\n isSuccess: type === 'success',\n });\n }, ANIMATION_FIX);\n };\n\n handleOnClear: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n const { onCancel } = this.props;\n onCancel?.();\n\n this.reset();\n };\n\n reset = () => {\n this.dragCounter = 0;\n window.clearTimeout(this.timeouts);\n this.setState({\n isComplete: false,\n isError: false,\n isProcessing: false,\n isSuccess: false,\n });\n };\n\n showDataImage = (dataUrl: string) => {\n const { isImage } = this.state;\n if (isImage) {\n this.setState({\n uploadedImage: dataUrl,\n });\n }\n };\n\n fileDropped = async (file: File) => {\n const { httpOptions, maxSize, onStart, usDisabled, usAccept } = this.props;\n const { isProcessing } = this.state;\n\n if (usDisabled || isProcessing) {\n return false;\n }\n\n if (!file) {\n throw new Error('Could not retrieve file');\n }\n\n this.setState({\n fileName: file.name,\n isDroppable: false,\n isProcessing: true,\n });\n\n onStart?.(file);\n\n let file64 = null;\n\n try {\n file64 = await asyncFileRead(file);\n } catch (error) {\n this.asyncResponse(error, 'error');\n }\n\n if (!file64) {\n return false;\n }\n\n this.setState({\n isImage: getFileType(file, file64).includes('image'),\n });\n\n if (!isTypeValid(file, usAccept, file64)) {\n this.asyncResponse(\n new ResponseError(\n new Response(null, {\n status: 415,\n statusText: 'Unsupported Media Type',\n }),\n ),\n 'error',\n );\n return false;\n }\n\n if (!isSizeValid(file, maxSize)) {\n this.asyncResponse(\n new ResponseError(\n new Response(null, {\n status: 413,\n statusText: 'Request Entity Too Large',\n }),\n ),\n 'error',\n );\n return false;\n }\n\n if (httpOptions) {\n // Post the file to provided endpoint\n let response;\n try {\n response = await this.asyncPost(file);\n } catch (error) {\n this.asyncResponse(error, 'error');\n return false;\n }\n this.asyncResponse(response, 'success');\n this.showDataImage(file64);\n return true;\n }\n // Post on form submit. And return the encoded image.\n this.showDataImage(file64);\n this.asyncResponse(file64, 'success');\n return true;\n };\n\n render() {\n const {\n maxSize,\n usDropMessage,\n usAccept,\n usButtonText,\n usButtonRetryText,\n usDisabled,\n usHelpImage,\n usLabel,\n usPlaceholder,\n psButtonText,\n psProcessingText,\n psButtonDisabled,\n csButtonText,\n csSuccessText,\n size,\n intl,\n } = this.props;\n\n const {\n response,\n fileName,\n isComplete,\n isDroppable,\n isError,\n isImage,\n isProcessing,\n isSuccess,\n uploadedImage,\n } = this.state;\n\n return (\n <div\n className={clsx('droppable-area', {\n droppable: true,\n 'tw-droppable-sm droppable-sm': size === 'sm',\n 'tw-droppable-md droppable-md': size === 'md' || !size,\n 'tw-droppable-lg droppable-lg': size === 'lg',\n 'droppable-dropping': isDroppable,\n 'droppable-processing': isProcessing,\n 'droppable-complete': isComplete && !isError,\n 'droppable-negative': isError && !isProcessing,\n })}\n onDragEnter={(event) => this.onDragEnter(event)}\n onDragLeave={(event) => this.onDragLeave(event)}\n onDrop={async (event) => this.onDrop(event)}\n onDragOver={(event) => event.preventDefault()}\n >\n {!isProcessing && !isComplete && (\n <UploadImageStep\n fileDropped={async (file) => this.fileDropped(file)}\n isComplete={isComplete}\n usAccept={usAccept}\n usButtonText={usButtonText || intl.formatMessage(messages.usButtonText)}\n usDisabled={usDisabled}\n usHelpImage={usHelpImage}\n usLabel={usLabel}\n usPlaceholder={\n usPlaceholder ||\n intl.formatMessage(messages.usPlaceholder, { maxSize: maxSize / 1000000 })\n }\n />\n )}\n\n {/* Starts render the step when isSuccess is true so markup is there when css transition kicks in\n css transition to work properly */}\n {(isSuccess || isComplete) && !isError && (\n <CompleteStep\n fileName={fileName}\n isComplete={isComplete}\n isImage={isImage}\n csButtonText={csButtonText || intl.formatMessage(messages.csButtonText)}\n csSuccessText={csSuccessText || intl.formatMessage(messages.csSuccessText)}\n uploadedImage={uploadedImage}\n onClear={(event) => this.handleOnClear(event)}\n />\n )}\n {isError && !isProcessing && (\n <UploadImageStep\n fileDropped={async (file) => {\n this.reset();\n await this.fileDropped(file);\n }}\n isComplete={!isError}\n usAccept={usAccept}\n usButtonText={usButtonRetryText || intl.formatMessage(messages.retry)}\n usDisabled={usDisabled}\n usHelpImage={null}\n usLabel={usLabel}\n usPlaceholder={\n usPlaceholder ||\n intl.formatMessage(messages.usPlaceholder, { maxSize: maxSize / 1000000 })\n }\n errorMessage={this.getErrorMessage(\n response != null &&\n typeof response === 'object' &&\n 'status' in response &&\n typeof response.status === 'number'\n ? response.status\n : undefined,\n )}\n />\n )}\n {isProcessing && (\n <ProcessingStep\n isComplete={isComplete}\n isError={isError}\n isSuccess={isSuccess}\n psButtonText={psButtonText || intl.formatMessage(messages.psButtonText)}\n psProcessingText={psProcessingText || intl.formatMessage(messages.psProcessingText)}\n psButtonDisabled={psButtonDisabled}\n onAnimationCompleted={async (status) => this.onAnimationCompleted(status)}\n onClear={(event) => this.handleOnClear(event)}\n />\n )}\n {!isProcessing && (\n <div className=\"droppable-dropping-card droppable-card\" aria-live=\"polite\">\n <div className=\"droppable-card-content\">\n <div className=\"circle circle-sm text-primary\">\n <PlusIcon size=\"16\" />\n </div>\n <Title type={Typography.TITLE_BODY} className=\"m-t-3\">\n {usDropMessage || intl.formatMessage(messages.usDropMessage)}\n </Title>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default injectIntl(Upload);\n"],"names":["ANIMATION_FIX","MAX_SIZE_DEFAULT","UploadStep","Upload","Component","defaultProps","animationDelay","maxSize","psButtonDisabled","size","usAccept","usDisabled","usLabel","dragCounter","timeouts","constructor","props","state","fileName","isDroppable","isComplete","isError","isImage","isProcessing","isSuccess","response","undefined","uploadedImage","getErrorMessage","status","csFailureText","csTooLargeMessage","csWrongTypeMessage","intl","formatMessage","messages","onDragLeave","event","preventDefault","setState","onDragEnter","onDrop","reset","dataTransfer","files","fileDropped","onAnimationCompleted","onSuccess","window","setTimeout","onFailure","asyncPost","file","httpOptions","fetcher","Error","fileInputName","name","data","formData","FormData","append","Object","keys","forEach","key","postData","asyncResponse","type","handleOnClear","onCancel","clearTimeout","showDataImage","dataUrl","onStart","file64","asyncFileRead","error","getFileType","includes","isTypeValid","ResponseError","Response","statusText","isSizeValid","render","usDropMessage","usButtonText","usButtonRetryText","usHelpImage","usPlaceholder","psButtonText","psProcessingText","csButtonText","csSuccessText","_jsxs","className","clsx","droppable","onDragOver","children","_jsx","UploadImageStep","CompleteStep","onClear","retry","errorMessage","ProcessingStep","PlusIcon","Title","Typography","TITLE_BODY","injectIntl"],"mappings":"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"}
1
+ {"version":3,"file":"Upload.mjs","sources":["../../src/upload/Upload.tsx"],"sourcesContent":["import { Plus as PlusIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { Component } from 'react';\nimport { injectIntl, WrappedComponentProps } from 'react-intl';\n\nimport { Size, Typography } from '../common';\nimport Title from '../title';\n\nimport messages from './Upload.messages';\nimport { UploadImageStep, ProcessingStep, CompleteStep } from './steps';\nimport { postData, asyncFileRead, isSizeValid, isTypeValid, getFileType } from './utils';\nimport { PostDataFetcher, PostDataHTTPOptions, ResponseError } from './utils/postData/postData';\nimport { ProcessIndicatorStatus } from '../processIndicator';\n\n/*\n * This delay is required for the isError/isSuccess to be fired after isProcessing so the processIndicator, will be\n * rendered first and then updated with the right status.\n */\nconst ANIMATION_FIX = 10;\nexport const MAX_SIZE_DEFAULT = 5000000;\n\nexport enum UploadStep {\n UPLOAD_IMAGE_STEP = 'uploadImageStep',\n}\n\nexport interface UploadProps extends WrappedComponentProps {\n animationDelay?: number;\n csButtonText?: string;\n csFailureText?: string;\n csSuccessText?: string;\n csTooLargeMessage?: string;\n csWrongTypeMessage?: string;\n httpOptions?: PostDataHTTPOptions & {\n fileInputName?: string;\n data?: Record<string, string | Blob>;\n };\n /**\n * You can provide a fetcher function with the same interface as the global fetch function, which is used by default.\n * function fetcher(input: RequestInfo, init?: RequestInit): Promise<Response>\n */\n fetcher?: PostDataFetcher;\n maxSize?: number;\n psButtonText?: string;\n psButtonDisabled?: boolean;\n psProcessingText?: string;\n size?: `${Size.SMALL | Size.MEDIUM | Size.LARGE}`;\n /**\n * You can provide multiple rules separated by comma, e.g.: \"application/pdf,image/*\".\n * Using \"*\" will allow every file type to be uploaded.\n */\n usAccept?: string;\n usButtonText?: string;\n usButtonRetryText?: string;\n usDisabled?: boolean;\n usDropMessage?: string;\n usHelpImage?: React.ReactNode;\n usLabel?: string;\n usPlaceholder?: string;\n /**\n * Override for the [InlineAlert icon's default, accessible name](/?path=/docs/other-statusicon-accessibility--docs)\n * announced by the screen readers\n * */\n errorIconLabel?: string;\n /** @deprecated Only a single variant exists, please remove this prop. */\n uploadStep?: `${UploadStep}`;\n onCancel?: () => void;\n onFailure?: (error: unknown) => void;\n onStart?: (file: File) => void;\n onSuccess?: (response: string | Response, fileName: string) => void;\n}\n\ninterface UploadState {\n fileName: string;\n isDroppable: boolean;\n isComplete: boolean;\n isError: boolean;\n isImage: boolean;\n isProcessing: boolean;\n isSuccess: boolean;\n response: unknown;\n uploadedImage: string | undefined;\n}\n\nexport class Upload extends Component<UploadProps, UploadState> {\n declare props: UploadProps & Required<Pick<UploadProps, keyof typeof Upload.defaultProps>>;\n\n static defaultProps = {\n animationDelay: 700,\n maxSize: MAX_SIZE_DEFAULT,\n psButtonDisabled: false,\n size: 'md',\n usAccept: 'image/*',\n usDisabled: false,\n usLabel: '',\n } satisfies Partial<UploadProps>;\n\n dragCounter = 0;\n timeouts = 0;\n\n constructor(props: UploadProps) {\n super(props);\n\n this.state = {\n fileName: '',\n isDroppable: false,\n isComplete: false,\n isError: false,\n isImage: false,\n isProcessing: false,\n isSuccess: false,\n response: undefined,\n uploadedImage: undefined,\n };\n }\n\n getErrorMessage(status?: number) {\n const { csFailureText, csTooLargeMessage, csWrongTypeMessage, maxSize, intl } = this.props;\n switch (status) {\n case 413:\n return (\n csTooLargeMessage ||\n intl.formatMessage(messages.csTooLargeMessage, {\n maxSize: maxSize / 1000000,\n })\n );\n case 415:\n return csWrongTypeMessage || intl.formatMessage(messages.csWrongTypeMessage);\n default:\n return csFailureText || intl.formatMessage(messages.csFailureText);\n }\n }\n\n onDragLeave(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n this.dragCounter -= 1;\n if (this.dragCounter === 0) {\n this.setState({ isDroppable: false });\n }\n }\n\n onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n this.dragCounter += 1;\n const { usDisabled } = this.props;\n const { isProcessing } = this.state;\n if (this.dragCounter === 1 && !usDisabled && !isProcessing) {\n this.setState({ isDroppable: true });\n }\n }\n\n async onDrop(event: React.DragEvent<HTMLDivElement>) {\n const { isProcessing } = this.state;\n event.preventDefault();\n if (!isProcessing) {\n this.reset();\n }\n\n if (event.dataTransfer?.files?.[0]) {\n await this.fileDropped(event.dataTransfer.files[0]);\n }\n }\n\n onAnimationCompleted = async (status: ProcessIndicatorStatus) => {\n const { response, isProcessing, fileName } = this.state;\n const { animationDelay } = this.props;\n\n if (isProcessing && status === 'succeeded') {\n const { onSuccess } = this.props;\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n onSuccess ? () => onSuccess(response as string | Response, fileName) : undefined,\n );\n }, animationDelay);\n }\n\n if (isProcessing && status === 'failed') {\n const { onFailure } = this.props;\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n onFailure ? () => onFailure(response) : undefined,\n );\n }, animationDelay);\n }\n };\n\n asyncPost = async (file: File) => {\n const { httpOptions, fetcher } = this.props;\n if (httpOptions == null) {\n throw new Error('Cannot find HTTP options');\n }\n\n const { fileInputName = file.name, data = {} } = httpOptions;\n\n const formData = new FormData();\n formData.append(fileInputName, file);\n Object.keys(data).forEach((key) => formData.append(key, data[key]));\n return postData(httpOptions, formData, fetcher);\n };\n\n asyncResponse = (response: unknown, type: 'success' | 'error') => {\n // Gives time to the animation callback to fire.\n this.timeouts = window.setTimeout(() => {\n this.setState({\n response,\n isError: type === 'error',\n isSuccess: type === 'success',\n });\n }, ANIMATION_FIX);\n };\n\n handleOnClear: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n const { onCancel } = this.props;\n onCancel?.();\n\n this.reset();\n };\n\n reset = () => {\n this.dragCounter = 0;\n window.clearTimeout(this.timeouts);\n this.setState({\n isComplete: false,\n isError: false,\n isProcessing: false,\n isSuccess: false,\n });\n };\n\n showDataImage = (dataUrl: string) => {\n const { isImage } = this.state;\n if (isImage) {\n this.setState({\n uploadedImage: dataUrl,\n });\n }\n };\n\n fileDropped = async (file: File) => {\n const { httpOptions, maxSize, onStart, usDisabled, usAccept } = this.props;\n const { isProcessing } = this.state;\n\n if (usDisabled || isProcessing) {\n return false;\n }\n\n if (!file) {\n throw new Error('Could not retrieve file');\n }\n\n this.setState({\n fileName: file.name,\n isDroppable: false,\n isProcessing: true,\n });\n\n onStart?.(file);\n\n let file64 = null;\n\n try {\n file64 = await asyncFileRead(file);\n } catch (error) {\n this.asyncResponse(error, 'error');\n }\n\n if (!file64) {\n return false;\n }\n\n this.setState({\n isImage: getFileType(file, file64).includes('image'),\n });\n\n if (!isTypeValid(file, usAccept, file64)) {\n this.asyncResponse(\n new ResponseError(\n new Response(null, {\n status: 415,\n statusText: 'Unsupported Media Type',\n }),\n ),\n 'error',\n );\n return false;\n }\n\n if (!isSizeValid(file, maxSize)) {\n this.asyncResponse(\n new ResponseError(\n new Response(null, {\n status: 413,\n statusText: 'Request Entity Too Large',\n }),\n ),\n 'error',\n );\n return false;\n }\n\n if (httpOptions) {\n // Post the file to provided endpoint\n let response;\n try {\n response = await this.asyncPost(file);\n } catch (error) {\n this.asyncResponse(error, 'error');\n return false;\n }\n this.asyncResponse(response, 'success');\n this.showDataImage(file64);\n return true;\n }\n // Post on form submit. And return the encoded image.\n this.showDataImage(file64);\n this.asyncResponse(file64, 'success');\n return true;\n };\n\n render() {\n const {\n maxSize,\n usDropMessage,\n usAccept,\n usButtonText,\n usButtonRetryText,\n usDisabled,\n usHelpImage,\n usLabel,\n usPlaceholder,\n psButtonText,\n psProcessingText,\n psButtonDisabled,\n csButtonText,\n csSuccessText,\n size,\n intl,\n errorIconLabel,\n } = this.props;\n\n const {\n response,\n fileName,\n isComplete,\n isDroppable,\n isError,\n isImage,\n isProcessing,\n isSuccess,\n uploadedImage,\n } = this.state;\n\n return (\n <div\n className={clsx('droppable-area', {\n droppable: true,\n 'tw-droppable-sm droppable-sm': size === 'sm',\n 'tw-droppable-md droppable-md': size === 'md' || !size,\n 'tw-droppable-lg droppable-lg': size === 'lg',\n 'droppable-dropping': isDroppable,\n 'droppable-processing': isProcessing,\n 'droppable-complete': isComplete && !isError,\n 'droppable-negative': isError && !isProcessing,\n })}\n onDragEnter={(event) => this.onDragEnter(event)}\n onDragLeave={(event) => this.onDragLeave(event)}\n onDrop={async (event) => this.onDrop(event)}\n onDragOver={(event) => event.preventDefault()}\n >\n {!isProcessing && !isComplete && (\n <UploadImageStep\n fileDropped={async (file) => this.fileDropped(file)}\n isComplete={isComplete}\n usAccept={usAccept}\n usButtonText={usButtonText || intl.formatMessage(messages.usButtonText)}\n usDisabled={usDisabled}\n usHelpImage={usHelpImage}\n usLabel={usLabel}\n usPlaceholder={\n usPlaceholder ||\n intl.formatMessage(messages.usPlaceholder, { maxSize: maxSize / 1000000 })\n }\n />\n )}\n\n {/* Starts render the step when isSuccess is true so markup is there when css transition kicks in\n css transition to work properly */}\n {(isSuccess || isComplete) && !isError && (\n <CompleteStep\n fileName={fileName}\n isComplete={isComplete}\n isImage={isImage}\n csButtonText={csButtonText || intl.formatMessage(messages.csButtonText)}\n csSuccessText={csSuccessText || intl.formatMessage(messages.csSuccessText)}\n uploadedImage={uploadedImage}\n onClear={(event) => this.handleOnClear(event)}\n />\n )}\n {isError && !isProcessing && (\n <UploadImageStep\n fileDropped={async (file) => {\n this.reset();\n await this.fileDropped(file);\n }}\n isComplete={!isError}\n usAccept={usAccept}\n usButtonText={usButtonRetryText || intl.formatMessage(messages.retry)}\n usDisabled={usDisabled}\n usHelpImage={null}\n usLabel={usLabel}\n usPlaceholder={\n usPlaceholder ||\n intl.formatMessage(messages.usPlaceholder, { maxSize: maxSize / 1000000 })\n }\n errorMessage={this.getErrorMessage(\n response != null &&\n typeof response === 'object' &&\n 'status' in response &&\n typeof response.status === 'number'\n ? response.status\n : undefined,\n )}\n errorIconLabel={errorIconLabel}\n />\n )}\n {isProcessing && (\n <ProcessingStep\n isComplete={isComplete}\n isError={isError}\n isSuccess={isSuccess}\n psButtonText={psButtonText || intl.formatMessage(messages.psButtonText)}\n psProcessingText={psProcessingText || intl.formatMessage(messages.psProcessingText)}\n psButtonDisabled={psButtonDisabled}\n onAnimationCompleted={async (status) => this.onAnimationCompleted(status)}\n onClear={(event) => this.handleOnClear(event)}\n />\n )}\n {!isProcessing && (\n <div className=\"droppable-dropping-card droppable-card\" aria-live=\"polite\">\n <div className=\"droppable-card-content\">\n <div className=\"circle circle-sm text-primary\">\n <PlusIcon size=\"16\" />\n </div>\n <Title type={Typography.TITLE_BODY} className=\"m-t-3\">\n {usDropMessage || intl.formatMessage(messages.usDropMessage)}\n </Title>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default injectIntl(Upload);\n"],"names":["ANIMATION_FIX","MAX_SIZE_DEFAULT","UploadStep","Upload","Component","defaultProps","animationDelay","maxSize","psButtonDisabled","size","usAccept","usDisabled","usLabel","dragCounter","timeouts","constructor","props","state","fileName","isDroppable","isComplete","isError","isImage","isProcessing","isSuccess","response","undefined","uploadedImage","getErrorMessage","status","csFailureText","csTooLargeMessage","csWrongTypeMessage","intl","formatMessage","messages","onDragLeave","event","preventDefault","setState","onDragEnter","onDrop","reset","dataTransfer","files","fileDropped","onAnimationCompleted","onSuccess","window","setTimeout","onFailure","asyncPost","file","httpOptions","fetcher","Error","fileInputName","name","data","formData","FormData","append","Object","keys","forEach","key","postData","asyncResponse","type","handleOnClear","onCancel","clearTimeout","showDataImage","dataUrl","onStart","file64","asyncFileRead","error","getFileType","includes","isTypeValid","ResponseError","Response","statusText","isSizeValid","render","usDropMessage","usButtonText","usButtonRetryText","usHelpImage","usPlaceholder","psButtonText","psProcessingText","csButtonText","csSuccessText","errorIconLabel","_jsxs","className","clsx","droppable","onDragOver","children","_jsx","UploadImageStep","CompleteStep","onClear","retry","errorMessage","ProcessingStep","PlusIcon","Title","Typography","TITLE_BODY","injectIntl"],"mappings":"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"}
@@ -32,7 +32,8 @@ class UploadImageStep extends React.PureComponent {
32
32
  className: "d-flex flex-column align-items-center",
33
33
  children: /*#__PURE__*/jsxRuntime.jsx(StatusIcon, {
34
34
  size: size.Size.LARGE,
35
- sentiment: sentiment.Sentiment.NEGATIVE
35
+ sentiment: sentiment.Sentiment.NEGATIVE,
36
+ iconLabel: null
36
37
  })
37
38
  });
38
39
  }
@@ -55,13 +56,14 @@ class UploadImageStep extends React.PureComponent {
55
56
  };
56
57
  render() {
57
58
  const {
59
+ errorMessage,
58
60
  isComplete,
61
+ errorIconLabel,
59
62
  usAccept,
60
63
  usButtonText,
61
64
  usDisabled,
62
65
  usLabel,
63
- usPlaceholder,
64
- errorMessage
66
+ usPlaceholder
65
67
  } = this.props;
66
68
  return /*#__PURE__*/jsxRuntime.jsx("div", {
67
69
  className: "droppable-default-card",
@@ -102,6 +104,7 @@ class UploadImageStep extends React.PureComponent {
102
104
  className: "m-t-3 has-error",
103
105
  children: /*#__PURE__*/jsxRuntime.jsx(InlineAlert, {
104
106
  type: sentiment.Sentiment.NEGATIVE,
107
+ iconLabel: errorIconLabel,
105
108
  children: errorMessage
106
109
  })
107
110
  })
@@ -1 +1 @@
1
- {"version":3,"file":"uploadImageStep.js","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder, errorMessage } =\n this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label\n className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}\n role=\"button\"\n aria-disabled={usDisabled}\n tabIndex={0}\n >\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE}>{errorMessage}</InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","UploadIcon","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","role","tabIndex","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":"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"}
1
+ {"version":3,"file":"uploadImageStep.js","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n errorIconLabel?: string;\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} iconLabel={null} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const {\n errorMessage,\n isComplete,\n errorIconLabel,\n usAccept,\n usButtonText,\n usDisabled,\n usLabel,\n usPlaceholder,\n } = this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label\n className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}\n role=\"button\"\n aria-disabled={usDisabled}\n tabIndex={0}\n >\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE} iconLabel={errorIconLabel}>\n {errorMessage}\n </InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","iconLabel","UploadIcon","src","alt","render","isComplete","errorIconLabel","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","role","tabIndex","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":"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"}
@@ -30,7 +30,8 @@ class UploadImageStep extends PureComponent {
30
30
  className: "d-flex flex-column align-items-center",
31
31
  children: /*#__PURE__*/jsx(StatusIcon, {
32
32
  size: Size.LARGE,
33
- sentiment: Sentiment.NEGATIVE
33
+ sentiment: Sentiment.NEGATIVE,
34
+ iconLabel: null
34
35
  })
35
36
  });
36
37
  }
@@ -53,13 +54,14 @@ class UploadImageStep extends PureComponent {
53
54
  };
54
55
  render() {
55
56
  const {
57
+ errorMessage,
56
58
  isComplete,
59
+ errorIconLabel,
57
60
  usAccept,
58
61
  usButtonText,
59
62
  usDisabled,
60
63
  usLabel,
61
- usPlaceholder,
62
- errorMessage
64
+ usPlaceholder
63
65
  } = this.props;
64
66
  return /*#__PURE__*/jsx("div", {
65
67
  className: "droppable-default-card",
@@ -100,6 +102,7 @@ class UploadImageStep extends PureComponent {
100
102
  className: "m-t-3 has-error",
101
103
  children: /*#__PURE__*/jsx(InlineAlert, {
102
104
  type: Sentiment.NEGATIVE,
105
+ iconLabel: errorIconLabel,
103
106
  children: errorMessage
104
107
  })
105
108
  })
@@ -1 +1 @@
1
- {"version":3,"file":"uploadImageStep.mjs","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder, errorMessage } =\n this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label\n className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}\n role=\"button\"\n aria-disabled={usDisabled}\n tabIndex={0}\n >\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE}>{errorMessage}</InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","UploadIcon","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","role","tabIndex","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":"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"}
1
+ {"version":3,"file":"uploadImageStep.mjs","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n errorIconLabel?: string;\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} iconLabel={null} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const {\n errorMessage,\n isComplete,\n errorIconLabel,\n usAccept,\n usButtonText,\n usDisabled,\n usLabel,\n usPlaceholder,\n } = this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label\n className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}\n role=\"button\"\n aria-disabled={usDisabled}\n tabIndex={0}\n >\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE} iconLabel={errorIconLabel}>\n {errorMessage}\n </InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","iconLabel","UploadIcon","src","alt","render","isComplete","errorIconLabel","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","role","tabIndex","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":";;;;;;;;AAmBqB,MAAAA,eAAgB,SAAQC,aAAmC,CAAA;EAC9EC,cAAc,gBAAGC,SAAS,EAAoB,CAAA;EAE9CC,cAAc,GAAGA,MAAK;IACpB,MAAM;AAAEC,MAAAA,WAAAA;KAAa,GAAG,IAAI,CAACC,KAAK,CAAA;IAClC,MAAMC,IAAI,GAAG,IAAI,CAACL,cAAc,CAACM,OAAO,EAAEC,KAAK,GAAG,CAAC,CAAC,CAAA;IACpD,IAAIF,IAAI,IAAI,IAAI,EAAE;MAChBF,WAAW,CAACE,IAAI,CAAC,CAAA;AACnB,KAAA;GACD,CAAA;EAEDG,QAAQ,GAAGA,MAAK;IACd,MAAM;MAAEC,WAAW;AAAEC,MAAAA,OAAAA;KAAS,GAAG,IAAI,CAACN,KAAK,CAAA;IAC3C,MAAM;AAAEO,MAAAA,YAAAA;KAAc,GAAG,IAAI,CAACP,KAAK,CAAA;AAEnC,IAAA,IAAIO,YAAY,EAAE;AAChB,MAAA,oBACEC,GAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,uCAAuC;QAAAC,QAAA,eACpDF,GAAA,CAACG,UAAU,EAAA;UAACC,IAAI,EAAEC,IAAI,CAACC,KAAM;UAACC,SAAS,EAAEC,SAAS,CAACC,QAAS;AAACC,UAAAA,SAAS,EAAE,IAAA;SAC1E,CAAA;AAAA,OAAK,CAAC,CAAA;AAEV,KAAA;IAEA,IAAI,CAACb,WAAW,EAAE;AAChB,MAAA,oBACEG,GAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,uCAAuC;QAAAC,QAAA,eACpDF,GAAA,CAACW,MAAU,EAAA;AAACP,UAAAA,IAAI,EAAE,EAAA;SACpB,CAAA;AAAA,OAAK,CAAC,CAAA;AAEV,KAAA;AAEA,IAAA,IAAI,OAAOP,WAAW,KAAK,QAAQ,EAAE;AACnC,MAAA,oBAAOG,GAAA,CAAA,KAAA,EAAA;AAAKY,QAAAA,GAAG,EAAEf,WAAY;AAACgB,QAAAA,GAAG,EAAEf,OAAQ;AAACG,QAAAA,SAAS,EAAC,0BAAA;AAA0B,QAAG,CAAA;AACrF,KAAA;AAEA,IAAA,OAAOJ,WAAW,CAAA;GACnB,CAAA;AAEDiB,EAAAA,MAAMA,GAAA;IACJ,MAAM;MACJf,YAAY;MACZgB,UAAU;MACVC,cAAc;MACdC,QAAQ;MACRC,YAAY;MACZC,UAAU;MACVrB,OAAO;AACPsB,MAAAA,aAAAA;KACD,GAAG,IAAI,CAAC5B,KAAK,CAAA;AAEd,IAAA,oBACEQ,GAAA,CAAA,KAAA,EAAA;AAAKC,MAAAA,SAAS,EAAC,wBAAwB;AAAC,MAAA,aAAA,EAAac,UAAW;AAAAb,MAAAA,QAAA,eAC9DmB,IAAA,CAAA,KAAA,EAAA;AAAKpB,QAAAA,SAAS,EAAC,wBAAwB;AAAAC,QAAAA,QAAA,gBACrCF,GAAA,CAAA,KAAA,EAAA;AAAKC,UAAAA,SAAS,EAAC,OAAO;AAAAC,UAAAA,QAAA,EAAE,IAAI,CAACN,QAAQ,EAAA;AAAE,SAAM,CAC7C,EAACE,OAAO,iBAAIE,GAAA,CAAA,IAAA,EAAA;AAAIC,UAAAA,SAAS,EAAC,0BAA0B;AAAAC,UAAAA,QAAA,EAAEJ,OAAAA;AAAO,SAAK,CAAC,EAClEsB,aAAa,iBAAIpB,GAAA,CAAA,GAAA,EAAA;AAAGC,UAAAA,SAAS,EAAC,0BAA0B;UAAAC,QAAA,EAAEoB,MAAM,CAACF,aAAa,CAAA;SAAK,CAAC,eACrFC,IAAA,CAAA,OAAA,EAAA;AACEpB,UAAAA,SAAS,EAAE,CAA0BkB,uBAAAA,EAAAA,UAAU,GAAG,UAAU,GAAG,EAAE,CAAG,CAAA;AACpEI,UAAAA,IAAI,EAAC,QAAQ;AACb,UAAA,eAAA,EAAeJ,UAAW;AAC1BK,UAAAA,QAAQ,EAAE,CAAE;UAAAtB,QAAA,EAAA,CAEXgB,YAAY,gBACXlB,GAAA,CAAA,MAAA,EAAA;AAAAE,YAAAA,QAAA,EAAOgB,YAAAA;AAAY,WAAO,CAAC,gBAE3BlB,GAAA,CAACW,MAAU,EAAA;AAACP,YAAAA,IAAI,EAAE,EAAG;AAACH,YAAAA,SAAS,EAAC,OAAA;WAAO,CACxC,eACDD,GAAA,CAAA,OAAA,EAAA;YACEyB,GAAG,EAAE,IAAI,CAACrC,cAAe;AACzBsC,YAAAA,IAAI,EAAC,MAAM;AACXC,YAAAA,MAAM,EAAEV,QAAQ,KAAK,GAAG,GAAGW,SAAS,GAAGX,QAAS;AAChDhB,YAAAA,SAAS,EAAC,2BAA2B;AACrC4B,YAAAA,QAAQ,EAAEV,UAAW;AACrBW,YAAAA,IAAI,EAAC,aAAa;AAClBC,YAAAA,QAAQ,EAAEA,MAAM,IAAI,CAACzC,cAAc,EAAE;AAAC,WAE1C,CAAA,CAAA;AAAA,SAAO,CACP,EAACS,YAAY,iBACXC,GAAA,CAAA,KAAA,EAAA;AAAKC,UAAAA,SAAS,EAAC,sBAAsB;AAAAC,UAAAA,QAAA,eACnCF,GAAA,CAAA,KAAA,EAAA;AAAKC,YAAAA,SAAS,EAAC,iBAAiB;YAAAC,QAAA,eAC9BF,GAAA,CAACgC,WAAW,EAAA;cAACN,IAAI,EAAElB,SAAS,CAACC,QAAS;AAACC,cAAAA,SAAS,EAAEM,cAAe;AAAAd,cAAAA,QAAA,EAC9DH,YAAAA;aACU,CAAA;WACV,CAAA;AACP,SAAK,CACN,CAAA;OACE,CAAA;AACP,KAAK,CAAC,CAAA;AAEV,GAAA;AACD;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-a39a137",
3
+ "version": "0.0.0-experimental-dcb657b",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -91,9 +91,9 @@
91
91
  "rollup": "^4.18.1",
92
92
  "rollup-preserve-directives": "^1.1.1",
93
93
  "storybook": "^8.2.2",
94
- "@transferwise/neptune-css": "14.19.1",
94
+ "@transferwise/less-config": "3.1.0",
95
95
  "@wise/components-theming": "1.6.1",
96
- "@transferwise/less-config": "3.1.0"
96
+ "@transferwise/neptune-css": "14.19.1"
97
97
  },
98
98
  "peerDependencies": {
99
99
  "@transferwise/icons": "^3.13.1",
@@ -0,0 +1,3 @@
1
+ .wds-alert__liveRegion {
2
+ display: contents;
3
+ }
@@ -0,0 +1,3 @@
1
+ .wds-alert__liveRegion {
2
+ display: contents;
3
+ }
@@ -1,9 +1,8 @@
1
1
  import { useState } from 'react';
2
+ import { Meta, StoryObj } from '@storybook/react';
2
3
  import { userEvent, within, expect, waitFor } from '@storybook/test';
3
4
  import { Button, Field, SelectInput, Sentiment } from '..';
4
- import Alert from './Alert';
5
-
6
- import { Meta, StoryObj } from '@storybook/react';
5
+ import Alert, { type AlertProps } from './Alert';
7
6
 
8
7
  const meta = {
9
8
  title: 'Feedback/Alert/tests',
@@ -85,3 +84,57 @@ export const ComplexTrigger: Story = {
85
84
  );
86
85
  },
87
86
  };
87
+
88
+ export const BackendForFrontend: Story = {
89
+ play: async ({ args, canvasElement }) => {
90
+ const canvas = within(canvasElement);
91
+ await expect(canvas.queryAllByRole('status')).toHaveLength(0);
92
+ await expect(canvas.queryAllByRole('alert')).toHaveLength(0);
93
+ await wait();
94
+ await userEvent.tab();
95
+ await userEvent.keyboard('{Enter}');
96
+ await waitFor(async () => expect(canvas.getAllByRole('graphics-symbol')).toHaveLength(3));
97
+ await expect(canvas.getAllByRole('status')).toHaveLength(2);
98
+ await expect(canvas.getAllByRole('alert')).toHaveLength(1);
99
+ },
100
+ render: function Render() {
101
+ const [isActive, setIsActive] = useState(false);
102
+ const [alerts, setAlerts] = useState<AlertProps[]>([]);
103
+
104
+ const getAlerts: () => AlertProps[] = () => [
105
+ {
106
+ type: Sentiment.POSITIVE,
107
+ title: `Title 1`,
108
+ children: `This is a ${Sentiment.POSITIVE} content`,
109
+ },
110
+ {
111
+ type: Sentiment.WARNING,
112
+ title: `Title 2`,
113
+ children: `This is a ${Sentiment.WARNING} content`,
114
+ },
115
+ {
116
+ type: Sentiment.NEGATIVE,
117
+ title: `Title 3`,
118
+ children: `This is a ${Sentiment.NEGATIVE} content`,
119
+ },
120
+ ];
121
+
122
+ return (
123
+ <>
124
+ <Button
125
+ htmlType="button"
126
+ onClick={() => {
127
+ setAlerts(getAlerts());
128
+ setIsActive((current) => !current);
129
+ }}
130
+ >
131
+ Generate dynamic alerts
132
+ </Button>
133
+
134
+ {alerts.map((props) => (
135
+ <Alert dynamicRender {...props} key={props.title} className="m-t-3" />
136
+ ))}
137
+ </>
138
+ );
139
+ },
140
+ };
@@ -241,6 +241,16 @@ describe('Alert', () => {
241
241
  });
242
242
  });
243
243
 
244
+ describe('StatusIcon label override', () => {
245
+ it('should accept the accessible name override for the icon', () => {
246
+ const customIconLabel = 'Custom icon label';
247
+ render(
248
+ <Alert type={Sentiment.NEGATIVE} message={message} statusIconLabel={customIconLabel} />,
249
+ );
250
+ expect(screen.getByLabelText(customIconLabel)).toBeInTheDocument();
251
+ });
252
+ });
253
+
244
254
  describe('onDismiss', () => {
245
255
  it('renders the close button if onDismiss is provided', () => {
246
256
  render(<Alert message={message} onDismiss={jest.fn()} />);
@@ -487,4 +497,8 @@ describe('Alert', () => {
487
497
  expect(screen.getByText(message)).toBeInTheDocument();
488
498
  });
489
499
  });
500
+
501
+ describe('dynamicRender', () => {
502
+ it('should', () => {});
503
+ });
490
504
  });
@@ -5,7 +5,7 @@ import { ClockBorderless } from '@transferwise/icons';
5
5
 
6
6
  import { Sentiment } from '../common';
7
7
  import { Button, Field, SelectInput } from '..';
8
- import Alert, { AlertArrowPosition } from './Alert';
8
+ import Alert, { AlertArrowPosition, type AlertProps as FullAlertProps } from './Alert';
9
9
 
10
10
  export default {
11
11
  component: Alert,
@@ -181,3 +181,95 @@ function Render(args) {
181
181
  },
182
182
  },
183
183
  };
184
+
185
+ const SENTIMENT = [
186
+ Sentiment.POSITIVE,
187
+ Sentiment.NEGATIVE,
188
+ Sentiment.NEUTRAL,
189
+ Sentiment.WARNING,
190
+ ] as const;
191
+ type AlertProps = Omit<FullAlertProps, 'type'> & { type: (typeof SENTIMENT)[number] };
192
+ const getAlerts = () => {
193
+ const length = Math.ceil(2 + Math.random() * 3);
194
+
195
+ return Array.from({ length }, (_, index) => {
196
+ const type = SENTIMENT[Math.floor(Math.random() * SENTIMENT.length)];
197
+
198
+ return {
199
+ type,
200
+ title: `Title ${index + 1}`,
201
+ children: `This is a ${type} content`,
202
+ };
203
+ });
204
+ };
205
+
206
+ /**
207
+ * When dealing with Backend for Frontend (BFF), sometimes it's not
208
+ * just about conditional rendering but also the fact you don't
209
+ * know how many `Alert`s you're going to get and when, so using
210
+ * the `active` prop is not feasible.
211
+ *
212
+ * In those cases, the only way to support screen readers is by
213
+ * forcing delayed render using the `dynamicRender` prop.
214
+ *
215
+ * **NB:** Screen readers do not guarantee the order in which they
216
+ * read out multiple injected sibling nodes.
217
+ */
218
+ export const BackendForFrontend: Story = {
219
+ render: function Render() {
220
+ const [isActive, setIsActive] = useState(false);
221
+ const [alerts, setAlerts] = useState<AlertProps[]>([]);
222
+
223
+ return (
224
+ <>
225
+ <Button
226
+ htmlType="button"
227
+ onClick={() => {
228
+ setAlerts(isActive ? [] : getAlerts());
229
+ setIsActive((current) => !current);
230
+ }}
231
+ >
232
+ Generate dynamic alerts
233
+ </Button>
234
+
235
+ {alerts.map((props) => (
236
+ <Alert {...props} key={props.title} className="m-t-3" dynamicRender />
237
+ ))}
238
+ </>
239
+ );
240
+ },
241
+ parameters: {
242
+ docs: {
243
+ source: {
244
+ code: `
245
+ function Render() {
246
+ const [isActive, setIsActive] = useState(false);
247
+ const [alerts, setAlerts] = useState<AlertProps[]>([]);
248
+
249
+ return (
250
+ <>
251
+ <Button
252
+ htmlType="button"
253
+ onClick={() => {
254
+ setAlerts(isActive ? [] : getAlerts());
255
+ setIsActive((current) => !current);
256
+ }}
257
+ >
258
+ Generate dynamic alerts
259
+ </Button>
260
+
261
+ {alerts.map(props => (
262
+ <Alert
263
+ {...props}
264
+ key={props.title}
265
+ className="m-t-3"
266
+ dynamicRender
267
+ />
268
+ ))}
269
+ </>
270
+ );
271
+ },`,
272
+ },
273
+ },
274
+ },
275
+ };
@@ -50,6 +50,11 @@ export interface AlertProps {
50
50
  className?: string;
51
51
  /** An optional icon. If not provided, we will default the icon to something appropriate for the type */
52
52
  icon?: React.ReactNode;
53
+ /**
54
+ * Override for [StatusIcon's default, accessible name](/?path=/docs/other-statusicon-accessibility--docs)
55
+ * announced by the screen readers
56
+ * */
57
+ statusIconLabel?: string;
53
58
  /** Title for the alert component */
54
59
  title?: string;
55
60
  /** The main body of the alert. Accepts plain text and bold words specified with **double stars */
@@ -59,8 +64,17 @@ export interface AlertProps {
59
64
  /** The type dictates which icon and colour will be used */
60
65
  type?: AlertType;
61
66
  variant?: `${Variant}`;
62
- /** Controls rendering of the Alert component. <br /> Toggle this prop instead using conditional rendering and logical AND (&&) operator, to make the component work with screen readers. */
67
+ /**
68
+ * Controls rendering of the Alert component. <br />
69
+ * Toggle this prop instead using conditional rendering and logical AND (&&)
70
+ * operator, to make the component work with screen readers.
71
+ * */
63
72
  active?: boolean;
73
+ /**
74
+ * Toggle this prop when dealing with multiple, dynamic Alerts, to make them
75
+ * work with screen readers. This is especially helpful for the BFF use cases.
76
+ * */
77
+ dynamicRender?: boolean;
64
78
  /** @deprecated Use `InlineAlert` instead. */
65
79
  arrow?: `${AlertArrowPosition}`;
66
80
  /** @deprecated Use `message` instead. Be aware `message` only accepts plain text or text with **bold** markdown. */
@@ -91,6 +105,7 @@ export default function Alert({
91
105
  className,
92
106
  dismissible,
93
107
  icon,
108
+ statusIconLabel,
94
109
  onDismiss,
95
110
  message,
96
111
  size,
@@ -98,6 +113,7 @@ export default function Alert({
98
113
  type = 'neutral',
99
114
  variant = 'desktop',
100
115
  active = true,
116
+ dynamicRender = false,
101
117
  }: AlertProps) {
102
118
  useEffect(() => {
103
119
  if (arrow !== undefined) {
@@ -142,17 +158,20 @@ export default function Alert({
142
158
 
143
159
  const [shouldShow, setShouldShow] = useState<boolean>();
144
160
  useEffect(() => {
145
- if (shouldShow === undefined || !active) {
161
+ if ((shouldShow === undefined && !dynamicRender) || !active) {
146
162
  setShouldShow(active);
147
163
  } else {
148
164
  setTimeout(() => setShouldShow(active), WDS_LIVE_REGION_DELAY_MS);
149
165
  }
150
- }, [active, shouldShow]);
166
+ }, [active, shouldShow, dynamicRender]);
151
167
 
152
168
  const closeButtonReference = useRef<HTMLButtonElement>(null);
153
169
 
154
170
  return (
155
- <div role={resolvedType === Sentiment.NEGATIVE ? 'alert' : 'status'}>
171
+ <div
172
+ role={resolvedType === Sentiment.NEGATIVE ? 'alert' : 'status'}
173
+ className="wds-alert__liveRegion"
174
+ >
156
175
  {shouldShow && (
157
176
  <div
158
177
  className={clsx(
@@ -189,7 +208,7 @@ export default function Alert({
189
208
  {icon ? (
190
209
  <div className="alert__icon">{icon}</div>
191
210
  ) : (
192
- <StatusIcon size={Size.LARGE} sentiment={resolvedType} />
211
+ <StatusIcon size={Size.LARGE} sentiment={resolvedType} iconLabel={statusIconLabel} />
193
212
  )}
194
213
  <div className="alert__message">
195
214
  <div>
@@ -71,6 +71,25 @@ describe('Field', () => {
71
71
  expect(screen.getByLabelText(/Phone number/)).toHaveAttribute('aria-describedby');
72
72
  });
73
73
 
74
+ it("should allow for InlineAlert's StatusIcon override via `messageIconLabel` prop", () => {
75
+ const customIconLabel = 'My custom icon label';
76
+
77
+ render(
78
+ <Field
79
+ label="Phone number"
80
+ description="This is help text"
81
+ sentiment="negative"
82
+ message="This is error text"
83
+ messageIconLabel={customIconLabel}
84
+ >
85
+ <Input />
86
+ </Field>,
87
+ );
88
+
89
+ expect(screen.queryByRole('graphics-symbol', { name: 'Error.' })).not.toBeInTheDocument();
90
+ expect(screen.getByRole('graphics-symbol', { name: customIconLabel })).toBeInTheDocument();
91
+ });
92
+
74
93
  it('should show or hide (Optional) suffix depending on required prop', () => {
75
94
  render(
76
95
  <Field label="Phone number" required={false} description="This is help text">