@transferwise/components 46.74.1 → 46.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/alert/Alert.js +8 -4
- package/build/alert/Alert.js.map +1 -1
- package/build/alert/Alert.mjs +8 -4
- package/build/alert/Alert.mjs.map +1 -1
- package/build/field/Field.js +2 -0
- package/build/field/Field.js.map +1 -1
- package/build/field/Field.mjs +2 -0
- package/build/field/Field.mjs.map +1 -1
- package/build/i18n/en.json +5 -0
- package/build/i18n/en.json.js +5 -0
- package/build/i18n/en.json.js.map +1 -1
- package/build/i18n/en.json.mjs +5 -0
- package/build/i18n/en.json.mjs.map +1 -1
- package/build/inlineAlert/InlineAlert.js +3 -1
- package/build/inlineAlert/InlineAlert.js.map +1 -1
- package/build/inlineAlert/InlineAlert.mjs +3 -1
- package/build/inlineAlert/InlineAlert.mjs.map +1 -1
- package/build/main.css +3 -0
- package/build/statusIcon/StatusIcon.js +50 -16
- package/build/statusIcon/StatusIcon.js.map +1 -1
- package/build/statusIcon/StatusIcon.messages.js +24 -0
- package/build/statusIcon/StatusIcon.messages.js.map +1 -0
- package/build/statusIcon/StatusIcon.messages.mjs +22 -0
- package/build/statusIcon/StatusIcon.messages.mjs.map +1 -0
- package/build/statusIcon/StatusIcon.mjs +48 -14
- package/build/statusIcon/StatusIcon.mjs.map +1 -1
- package/build/styles/alert/Alert.css +3 -0
- package/build/styles/main.css +3 -0
- package/build/types/alert/Alert.d.ts +17 -2
- package/build/types/alert/Alert.d.ts.map +1 -1
- package/build/types/field/Field.d.ts +6 -1
- package/build/types/field/Field.d.ts.map +1 -1
- package/build/types/inlineAlert/InlineAlert.d.ts +2 -1
- package/build/types/inlineAlert/InlineAlert.d.ts.map +1 -1
- package/build/types/statusIcon/StatusIcon.d.ts +7 -1
- package/build/types/statusIcon/StatusIcon.d.ts.map +1 -1
- package/build/types/statusIcon/StatusIcon.messages.d.ts +29 -0
- package/build/types/statusIcon/StatusIcon.messages.d.ts.map +1 -0
- package/build/types/upload/Upload.d.ts +5 -0
- package/build/types/upload/Upload.d.ts.map +1 -1
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +1 -0
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
- package/build/upload/Upload.js +4 -2
- package/build/upload/Upload.js.map +1 -1
- package/build/upload/Upload.mjs +4 -2
- package/build/upload/Upload.mjs.map +1 -1
- package/build/upload/steps/uploadImageStep/uploadImageStep.js +6 -3
- package/build/upload/steps/uploadImageStep/uploadImageStep.js.map +1 -1
- package/build/upload/steps/uploadImageStep/uploadImageStep.mjs +6 -3
- package/build/upload/steps/uploadImageStep/uploadImageStep.mjs.map +1 -1
- package/package.json +3 -3
- package/src/alert/Alert.css +3 -0
- package/src/alert/Alert.less +3 -0
- package/src/alert/Alert.spec.story.tsx +51 -5
- package/src/alert/Alert.spec.tsx +14 -0
- package/src/alert/Alert.story.tsx +109 -13
- package/src/alert/Alert.tsx +25 -5
- package/src/field/Field.spec.tsx +19 -0
- package/src/field/Field.story.tsx +20 -4
- package/src/field/Field.tsx +7 -1
- package/src/i18n/en.json +5 -0
- package/src/inlineAlert/InlineAlert.spec.tsx +12 -1
- package/src/inlineAlert/InlineAlert.tsx +5 -1
- package/src/main.css +3 -0
- package/src/main.less +1 -0
- package/src/statusIcon/StatusIcon.docs.mdx +28 -0
- package/src/statusIcon/StatusIcon.messages.ts +34 -0
- package/src/statusIcon/StatusIcon.spec.tsx +39 -4
- package/src/statusIcon/StatusIcon.story.tsx +15 -6
- package/src/statusIcon/StatusIcon.tsx +63 -14
- package/src/upload/Upload.spec.js +19 -0
- package/src/upload/Upload.tsx +7 -0
- package/src/upload/steps/uploadImageStep/uploadImageStep.spec.js +13 -0
- 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 {
|
|
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 {
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@transferwise/components",
|
|
3
|
-
"version": "46.
|
|
3
|
+
"version": "46.76.0",
|
|
4
4
|
"description": "Neptune React components",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -92,8 +92,8 @@
|
|
|
92
92
|
"rollup-preserve-directives": "^1.1.1",
|
|
93
93
|
"storybook": "^8.2.2",
|
|
94
94
|
"@transferwise/neptune-css": "14.19.1",
|
|
95
|
-
"@
|
|
96
|
-
"@
|
|
95
|
+
"@wise/components-theming": "1.6.1",
|
|
96
|
+
"@transferwise/less-config": "3.1.0"
|
|
97
97
|
},
|
|
98
98
|
"peerDependencies": {
|
|
99
99
|
"@transferwise/icons": "^3.13.1",
|
|
@@ -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',
|
|
@@ -43,7 +42,7 @@ export const SimpleTrigger: Story = {
|
|
|
43
42
|
Trigger Alert
|
|
44
43
|
</Button>
|
|
45
44
|
|
|
46
|
-
<Alert {...args}
|
|
45
|
+
{isActive && <Alert {...args} dynamicRender className="m-t-4" />}
|
|
47
46
|
</>
|
|
48
47
|
);
|
|
49
48
|
},
|
|
@@ -80,7 +79,54 @@ export const ComplexTrigger: Story = {
|
|
|
80
79
|
/>
|
|
81
80
|
</Field>
|
|
82
81
|
|
|
83
|
-
<Alert {...args}
|
|
82
|
+
{isActive && <Alert dynamicRender {...args} className="m-t-2" />}
|
|
83
|
+
</>
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const BackendForFrontend: Story = {
|
|
89
|
+
play: async ({ 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 [alerts, setAlerts] = useState<AlertProps[]>([]);
|
|
102
|
+
|
|
103
|
+
const getAlerts: () => AlertProps[] = () => [
|
|
104
|
+
{
|
|
105
|
+
type: Sentiment.POSITIVE,
|
|
106
|
+
title: `Title 1`,
|
|
107
|
+
children: `This is a ${Sentiment.POSITIVE} content`,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: Sentiment.WARNING,
|
|
111
|
+
title: `Title 2`,
|
|
112
|
+
children: `This is a ${Sentiment.WARNING} content`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: Sentiment.NEGATIVE,
|
|
116
|
+
title: `Title 3`,
|
|
117
|
+
children: `This is a ${Sentiment.NEGATIVE} content`,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<>
|
|
123
|
+
<Button htmlType="button" onClick={() => setAlerts(getAlerts())}>
|
|
124
|
+
Generate dynamic alerts
|
|
125
|
+
</Button>
|
|
126
|
+
|
|
127
|
+
{alerts.map((props) => (
|
|
128
|
+
<Alert dynamicRender {...props} key={props.title} className="m-t-3" />
|
|
129
|
+
))}
|
|
84
130
|
</>
|
|
85
131
|
);
|
|
86
132
|
},
|
package/src/alert/Alert.spec.tsx
CHANGED
|
@@ -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,16 +5,17 @@ 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,
|
|
12
12
|
title: 'Feedback/Alert',
|
|
13
13
|
args: {
|
|
14
14
|
type: Sentiment.POSITIVE,
|
|
15
|
-
|
|
15
|
+
dynamicRender: false,
|
|
16
16
|
message:
|
|
17
17
|
'Payments sent to your bank details **today** might not arrive in time for the holidays.',
|
|
18
|
+
active: true,
|
|
18
19
|
},
|
|
19
20
|
argTypes: {
|
|
20
21
|
arrow: {
|
|
@@ -112,17 +113,22 @@ export const WithTitle: Story = {
|
|
|
112
113
|
* Once present in the accessibility tree (AT), its dynamic contents
|
|
113
114
|
* will be announced correctly.
|
|
114
115
|
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
116
|
+
* It's not a problem if your page includes an Alert that is initially
|
|
117
|
+
* visible upon the very first render, but if it appears as a result
|
|
118
|
+
* of some interaction or is async, e.g. BE-driven then the screen
|
|
119
|
+
* reader might not announce it correctly.
|
|
120
|
+
*
|
|
121
|
+
* In order for this to work, we've introduced a small delay (175ms)
|
|
122
|
+
* between mounting the Alert's live region wrapper and actual DOM
|
|
123
|
+
* content injection to allow screen readers to process it correctly.
|
|
124
|
+
* It also to compensates for focus and AT manipulations commonly
|
|
125
|
+
* introduced by more complex triggers like e.g. `SelectInput`,
|
|
126
|
+
* which prevent the screen readers from announcing simultaneous
|
|
127
|
+
* changes on the page.
|
|
118
128
|
*
|
|
119
|
-
*
|
|
120
|
-
* the `active` prop and actual DOM injection to compensate for some
|
|
121
|
-
* common triggers like e.g. `SelectInput`. Those components affect
|
|
122
|
-
* the AT and have programmatic focus control, which prevents the
|
|
123
|
-
* screen readers from announcing simultaneous changes on the page.
|
|
129
|
+
* In those cases you should enable the `dynamicRender` prop.
|
|
124
130
|
*/
|
|
125
|
-
export const
|
|
131
|
+
export const DynamicRender: Story = {
|
|
126
132
|
render: function Render(args) {
|
|
127
133
|
const [isActive, setIsActive] = useState(false);
|
|
128
134
|
const [value, setValue] = useState<string>();
|
|
@@ -144,7 +150,7 @@ export const ConditionallyRendered: Story = {
|
|
|
144
150
|
/>
|
|
145
151
|
</Field>
|
|
146
152
|
|
|
147
|
-
<Alert {...args}
|
|
153
|
+
{isActive && <Alert {...args} dynamicRender className="m-t-5" />}
|
|
148
154
|
</>
|
|
149
155
|
);
|
|
150
156
|
},
|
|
@@ -173,7 +179,7 @@ function Render(args) {
|
|
|
173
179
|
/>
|
|
174
180
|
</Field>
|
|
175
181
|
|
|
176
|
-
<Alert {...args}
|
|
182
|
+
{isActive && <Alert {...args} dynamicRender className="m-t-5" />}
|
|
177
183
|
</>
|
|
178
184
|
);
|
|
179
185
|
}`,
|
|
@@ -181,3 +187,93 @@ function Render(args) {
|
|
|
181
187
|
},
|
|
182
188
|
},
|
|
183
189
|
};
|
|
190
|
+
|
|
191
|
+
const SENTIMENT = [
|
|
192
|
+
Sentiment.POSITIVE,
|
|
193
|
+
Sentiment.NEGATIVE,
|
|
194
|
+
Sentiment.NEUTRAL,
|
|
195
|
+
Sentiment.WARNING,
|
|
196
|
+
] as const;
|
|
197
|
+
type AlertProps = Omit<FullAlertProps, 'type'> & { type: (typeof SENTIMENT)[number] };
|
|
198
|
+
const getAlerts = () => {
|
|
199
|
+
const length = Math.ceil(2 + Math.random() * 3);
|
|
200
|
+
|
|
201
|
+
return Array.from({ length }, (_, index) => {
|
|
202
|
+
const type = SENTIMENT[Math.floor(Math.random() * SENTIMENT.length)];
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
type,
|
|
206
|
+
title: `Title ${index + 1}`,
|
|
207
|
+
children: `This is a ${type} content`,
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* When dealing with Backend for Frontend (BFF), sometimes it's not
|
|
214
|
+
* just about conditional rendering but also the fact you don't
|
|
215
|
+
* know how many `Alert`s you're going to get and when.
|
|
216
|
+
*
|
|
217
|
+
* `dynamicRender` prop will work with those scenarios as well.
|
|
218
|
+
*
|
|
219
|
+
* **NB:** Screen readers do not guarantee the order in which they
|
|
220
|
+
* read out multiple injected sibling nodes.
|
|
221
|
+
*/
|
|
222
|
+
export const BackendForFrontend: Story = {
|
|
223
|
+
render: function Render() {
|
|
224
|
+
const [isActive, setIsActive] = useState(false);
|
|
225
|
+
const [alerts, setAlerts] = useState<AlertProps[]>([]);
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<>
|
|
229
|
+
<Button
|
|
230
|
+
htmlType="button"
|
|
231
|
+
onClick={() => {
|
|
232
|
+
setAlerts(isActive ? [] : getAlerts());
|
|
233
|
+
setIsActive((current) => !current);
|
|
234
|
+
}}
|
|
235
|
+
>
|
|
236
|
+
Generate dynamic alerts
|
|
237
|
+
</Button>
|
|
238
|
+
|
|
239
|
+
{alerts.map((props) => (
|
|
240
|
+
<Alert {...props} key={props.title} dynamicRender className="m-t-3" />
|
|
241
|
+
))}
|
|
242
|
+
</>
|
|
243
|
+
);
|
|
244
|
+
},
|
|
245
|
+
parameters: {
|
|
246
|
+
docs: {
|
|
247
|
+
source: {
|
|
248
|
+
code: `
|
|
249
|
+
function Render() {
|
|
250
|
+
const [isActive, setIsActive] = useState(false);
|
|
251
|
+
const [alerts, setAlerts] = useState<AlertProps[]>([]);
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
<>
|
|
255
|
+
<Button
|
|
256
|
+
htmlType="button"
|
|
257
|
+
onClick={() => {
|
|
258
|
+
setAlerts(isActive ? [] : getAlerts());
|
|
259
|
+
setIsActive((current) => !current);
|
|
260
|
+
}}
|
|
261
|
+
>
|
|
262
|
+
Generate dynamic alerts
|
|
263
|
+
</Button>
|
|
264
|
+
|
|
265
|
+
{alerts.map(props => (
|
|
266
|
+
<Alert
|
|
267
|
+
{...props}
|
|
268
|
+
key={props.title}
|
|
269
|
+
className="m-t-3"
|
|
270
|
+
dynamicRender
|
|
271
|
+
/>
|
|
272
|
+
))}
|
|
273
|
+
</>
|
|
274
|
+
);
|
|
275
|
+
},`,
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
};
|