@transferwise/components 46.118.0 → 46.119.2
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/dateLookup/dayCalendar/DayCalendar.js +4 -4
- package/build/dateLookup/dayCalendar/DayCalendar.js.map +1 -1
- package/build/dateLookup/dayCalendar/table/DayCalendarTable.js +4 -4
- package/build/dateLookup/dayCalendar/table/DayCalendarTable.js.map +1 -1
- package/build/dateLookup/monthCalendar/MonthCalendar.js +4 -4
- package/build/dateLookup/monthCalendar/MonthCalendar.js.map +1 -1
- package/build/dateLookup/yearCalendar/YearCalendar.js +4 -4
- package/build/dateLookup/yearCalendar/YearCalendar.js.map +1 -1
- package/build/dimmer/Dimmer.js +4 -4
- package/build/dimmer/Dimmer.js.map +1 -1
- package/build/inputs/SelectInput.js +4 -4
- package/build/inputs/SelectInput.js.map +1 -1
- package/build/inputs/SelectInput.mjs +4 -4
- package/build/inputs/SelectInput.mjs.map +1 -1
- package/build/listItem/Prompt/ListItemPrompt.js +2 -0
- package/build/listItem/Prompt/ListItemPrompt.js.map +1 -1
- package/build/listItem/Prompt/ListItemPrompt.mjs +2 -0
- package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -1
- package/build/moneyInput/MoneyInput.js +2 -2
- package/build/moneyInput/MoneyInput.js.map +1 -1
- package/build/moneyInput/MoneyInput.mjs +2 -2
- package/build/moneyInput/MoneyInput.mjs.map +1 -1
- package/build/promoCard/PromoCard.js +3 -3
- package/build/promoCard/PromoCard.js.map +1 -1
- package/build/promoCard/PromoCardGroup.js +2 -2
- package/build/promoCard/PromoCardGroup.js.map +1 -1
- package/build/promoCard/PromoCardGroup.mjs +2 -2
- package/build/promoCard/PromoCardGroup.mjs.map +1 -1
- package/build/prompt/InlinePrompt/InlinePrompt.js +8 -3
- package/build/prompt/InlinePrompt/InlinePrompt.js.map +1 -1
- package/build/prompt/InlinePrompt/InlinePrompt.mjs +8 -3
- package/build/prompt/InlinePrompt/InlinePrompt.mjs.map +1 -1
- package/build/typeahead/Typeahead.js +2 -2
- package/build/typeahead/Typeahead.js.map +1 -1
- package/build/typeahead/Typeahead.mjs +2 -2
- package/build/typeahead/Typeahead.mjs.map +1 -1
- package/build/types/inputs/SelectInput.d.ts.map +1 -1
- package/build/types/listItem/ListItem.d.ts +1 -1
- package/build/types/listItem/Prompt/ListItemPrompt.d.ts +2 -2
- package/build/types/listItem/Prompt/ListItemPrompt.d.ts.map +1 -1
- package/build/types/prompt/InlinePrompt/InlinePrompt.d.ts +6 -1
- package/build/types/prompt/InlinePrompt/InlinePrompt.d.ts.map +1 -1
- package/build/upload/Upload.js +2 -2
- package/build/upload/Upload.js.map +1 -1
- package/build/upload/Upload.mjs +2 -2
- package/build/upload/Upload.mjs.map +1 -1
- package/package.json +39 -38
- package/src/accordion/AccordionItem/__snapshots__/AccordionItem.spec.js.snap +1 -1
- package/src/accordion/__snapshots__/Accordion.spec.js.snap +1 -1
- package/src/actionButton/__snapshots__/ActionButton.spec.tsx.snap +1 -1
- package/src/avatarWrapper/__snapshots__/AvatarWrapper.spec.tsx.snap +1 -1
- package/src/checkbox/__snapshots__/Checkbox.spec.tsx.snap +1 -1
- package/src/chevron/__snapshots__/Chevron.spec.tsx.snap +1 -1
- package/src/chips/__snapshots__/Chips.spec.tsx.snap +1 -1
- package/src/common/RadioButton/__snapshots__/RadioButton.spec.tsx.snap +1 -1
- package/src/common/bottomSheet/__snapshots__/BottomSheet.spec.tsx.snap +1 -1
- package/src/common/card/__snapshots__/Card.spec.tsx.snap +1 -1
- package/src/common/closeButton/__snapshots__/CloseButton.spec.tsx.snap +1 -1
- package/src/common/flowHeader/__snapshots__/FlowHeader.spec.tsx.snap +1 -1
- package/src/common/panel/__snapshots__/Panel.spec.tsx.snap +1 -1
- package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -1
- package/src/inputs/SelectInput.tsx +21 -19
- package/src/listItem/Prompt/ListItemPrompt.spec.tsx +48 -0
- package/src/listItem/Prompt/ListItemPrompt.story.tsx +1 -0
- package/src/listItem/Prompt/ListItemPrompt.tsx +7 -2
- package/src/logo/__snapshots__/Logo.spec.tsx.snap +1 -1
- package/src/overlayHeader/__snapshots__/OverlayHeader.spec.tsx.snap +1 -1
- package/src/popover/__snapshots__/Popover.spec.tsx.snap +1 -1
- package/src/promoCard/__snapshots__/PromoCard.spec.tsx.snap +1 -1
- package/src/promoCard/__snapshots__/PromoCardGroup.spec.tsx.snap +1 -1
- package/src/prompt/InlinePrompt/InlinePrompt.spec.tsx +29 -1
- package/src/prompt/InlinePrompt/InlinePrompt.story.tsx +4 -2
- package/src/prompt/InlinePrompt/InlinePrompt.tsx +9 -3
- package/src/tile/__snapshots__/Tile.spec.tsx.snap +1 -1
- package/src/tooltip/__snapshots__/Tooltip.spec.tsx.snap +1 -1
|
@@ -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';\n\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 /**\n * Filesize expressed in B.<br />If set to `null`, no size limit will be applied.\n * @default 5000000 (5 MB)\n */\n maxSize?: number | null;\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: 300,\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 (typeof maxSize === 'number'\n ? intl.formatMessage(messages.csTooLargeMessage, { maxSize: roundFileSize(maxSize) })\n : intl.formatMessage(messages.csTooLargeNoLimitMessage))\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 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 handleUploadComplete = (type: 'success' | 'error', response: unknown) => {\n const { animationDelay, onSuccess, onFailure } = this.props;\n const { fileName } = this.state;\n\n window.clearTimeout(this.timeouts);\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n () => {\n if (type === 'success') {\n onSuccess?.(response as string | Response, fileName);\n } else {\n onFailure?.(response);\n }\n },\n );\n }, animationDelay);\n };\n\n asyncResponse = (response: unknown, type: 'success' | 'error') => {\n this.setState(\n {\n response,\n isError: type === 'error',\n isSuccess: type === 'success',\n },\n () => this.handleUploadComplete(type, response),\n );\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 (typeof maxSize === 'number' && !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 const placeholder = ((): string => {\n if (usPlaceholder) {\n return usPlaceholder;\n }\n\n if (typeof maxSize === 'number') {\n return intl.formatMessage(messages.usPlaceholder, { maxSize: roundFileSize(maxSize) });\n }\n\n return intl.formatMessage(messages.usPlaceholderNoLimit);\n })();\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={placeholder}\n />\n )}\n\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={placeholder}\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 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\nconst roundFileSize = (bytes: number) => {\n const megabytes = bytes / 1000000;\n if (megabytes >= 0.1) {\n const isRound = Math.floor(megabytes) === megabytes;\n return isRound ? `${megabytes}` : megabytes.toFixed(1);\n }\n if (megabytes >= 0.01) {\n return megabytes.toFixed(2);\n }\n return megabytes.toFixed(3);\n};\n"],"names":["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","roundFileSize","csTooLargeNoLimitMessage","onDragLeave","event","preventDefault","setState","onDragEnter","onDrop","reset","dataTransfer","files","fileDropped","asyncPost","file","httpOptions","fetcher","Error","fileInputName","name","data","formData","FormData","append","Object","keys","forEach","key","postData","handleUploadComplete","type","onSuccess","onFailure","window","clearTimeout","setTimeout","asyncResponse","handleOnClear","onCancel","showDataImage","dataUrl","onStart","file64","asyncFileRead","error","getFileType","includes","isTypeValid","ResponseError","Response","statusText","isSizeValid","render","usDropMessage","usButtonText","usButtonRetryText","usHelpImage","usPlaceholder","psButtonText","psProcessingText","csButtonText","csSuccessText","errorIconLabel","placeholder","usPlaceholderNoLimit","_jsxs","className","clsx","droppable","onDragOver","children","_jsx","UploadImageStep","CompleteStep","onClear","retry","errorMessage","ProcessingStep","PlusIcon","Title","Typography","TITLE_BODY","injectIntl","bytes","megabytes","isRound","Math","floor","toFixed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,MAAMA,gBAAgB,GAAG;IAEpBC;AAAZ,CAAA,UAAYA,UAAU,EAAA;AACpBA,EAAAA,UAAA,CAAA,mBAAA,CAAA,GAAA,iBAAqC;AACvC,CAAC,EAFWA,UAAU,KAAVA,UAAU,GAAA,EAAA,CAAA,CAAA;AAkEhB,MAAOC,MAAO,SAAQC,SAAmC,CAAA;AAG7D,EAAA,OAAOC,YAAY,GAAG;AACpBC,IAAAA,cAAc,EAAE,GAAG;AACnBC,IAAAA,OAAO,EAAEN,gBAAgB;AACzBO,IAAAA,gBAAgB,EAAE,KAAK;AACvBC,IAAAA,IAAI,EAAE,IAAI;AACVC,IAAAA,QAAQ,EAAE,SAAS;AACnBC,IAAAA,UAAU,EAAE,KAAK;AACjBC,IAAAA,OAAO,EAAE;GACqB;AAEhCC,EAAAA,WAAW,GAAG,CAAC;AACfC,EAAAA,QAAQ,GAAG,CAAC;EAEZC,WAAAA,CAAYC,KAAkB,EAAA;IAC5B,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,KAAK,GAAG;AACXC,MAAAA,QAAQ,EAAE,EAAE;AACZC,MAAAA,WAAW,EAAE,KAAK;AAClBC,MAAAA,UAAU,EAAE,KAAK;AACjBC,MAAAA,OAAO,EAAE,KAAK;AACdC,MAAAA,OAAO,EAAE,KAAK;AACdC,MAAAA,YAAY,EAAE,KAAK;AACnBC,MAAAA,SAAS,EAAE,KAAK;AAChBC,MAAAA,QAAQ,EAAEC,SAAS;AACnBC,MAAAA,aAAa,EAAED;KAChB;AACH,EAAA;EAEAE,eAAeA,CAACC,MAAe,EAAA;IAC7B,MAAM;MAAEC,aAAa;MAAEC,iBAAiB;MAAEC,kBAAkB;MAAEzB,OAAO;AAAE0B,MAAAA;KAAM,GAAG,IAAI,CAACjB,KAAK;AAC1F,IAAA,QAAQa,MAAM;AACZ,MAAA,KAAK,GAAG;AACN,QAAA,OACEE,iBAAiB,KAChB,OAAOxB,OAAO,KAAK,QAAQ,GACxB0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACJ,iBAAiB,EAAE;UAAExB,OAAO,EAAE6B,aAAa,CAAC7B,OAAO;SAAG,CAAC,GACnF0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACE,wBAAwB,CAAC,CAAC;AAE9D,MAAA,KAAK,GAAG;QACN,OAAOL,kBAAkB,IAAIC,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACH,kBAAkB,CAAC;AAC9E,MAAA;QACE,OAAOF,aAAa,IAAIG,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACL,aAAa,CAAC;AACtE;AACF,EAAA;EAEAQ,WAAWA,CAACC,KAAsC,EAAA;IAChDA,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAAC3B,WAAW,IAAI,CAAC;AACrB,IAAA,IAAI,IAAI,CAACA,WAAW,KAAK,CAAC,EAAE;MAC1B,IAAI,CAAC4B,QAAQ,CAAC;AAAEtB,QAAAA,WAAW,EAAE;AAAK,OAAE,CAAC;AACvC,IAAA;AACF,EAAA;EAEAuB,WAAWA,CAACH,KAAsC,EAAA;IAChDA,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAAC3B,WAAW,IAAI,CAAC;IACrB,MAAM;AAAEF,MAAAA;KAAY,GAAG,IAAI,CAACK,KAAK;IACjC,MAAM;AAAEO,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IACnC,IAAI,IAAI,CAACJ,WAAW,KAAK,CAAC,IAAI,CAACF,UAAU,IAAI,CAACY,YAAY,EAAE;MAC1D,IAAI,CAACkB,QAAQ,CAAC;AAAEtB,QAAAA,WAAW,EAAE;AAAI,OAAE,CAAC;AACtC,IAAA;AACF,EAAA;EAEA,MAAMwB,MAAMA,CAACJ,KAAsC,EAAA;IACjD,MAAM;AAAEhB,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IACnCsB,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAACjB,YAAY,EAAE;MACjB,IAAI,CAACqB,KAAK,EAAE;AACd,IAAA;IAEA,IAAIL,KAAK,CAACM,YAAY,EAAEC,KAAK,GAAG,CAAC,CAAC,EAAE;AAClC,MAAA,MAAM,IAAI,CAACC,WAAW,CAACR,KAAK,CAACM,YAAY,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD,IAAA;AACF,EAAA;EAEAE,SAAS,GAAG,MAAOC,IAAU,IAAI;IAC/B,MAAM;MAAEC,WAAW;AAAEC,MAAAA;KAAS,GAAG,IAAI,CAACnC,KAAK;IAC3C,IAAIkC,WAAW,IAAI,IAAI,EAAE;AACvB,MAAA,MAAM,IAAIE,KAAK,CAAC,0BAA0B,CAAC;AAC7C,IAAA;IAEA,MAAM;MAAEC,aAAa,GAAGJ,IAAI,CAACK,IAAI;AAAEC,MAAAA,IAAI,GAAG;AAAE,KAAE,GAAGL,WAAW;AAE5D,IAAA,MAAMM,QAAQ,GAAG,IAAIC,QAAQ,EAAE;AAC/BD,IAAAA,QAAQ,CAACE,MAAM,CAACL,aAAa,EAAEJ,IAAI,CAAC;IACpCU,MAAM,CAACC,IAAI,CAACL,IAAI,CAAC,CAACM,OAAO,CAAEC,GAAG,IAAKN,QAAQ,CAACE,MAAM,CAACI,GAAG,EAAEP,IAAI,CAACO,GAAG,CAAC,CAAC,CAAC;AACnE,IAAA,OAAOC,QAAQ,CAACb,WAAW,EAAEM,QAAQ,EAAEL,OAAO,CAAC;EACjD,CAAC;AAEDa,EAAAA,oBAAoB,GAAGA,CAACC,IAAyB,EAAExC,QAAiB,KAAI;IACtE,MAAM;MAAEnB,cAAc;MAAE4D,SAAS;AAAEC,MAAAA;KAAW,GAAG,IAAI,CAACnD,KAAK;IAC3D,MAAM;AAAEE,MAAAA;KAAU,GAAG,IAAI,CAACD,KAAK;AAE/BmD,IAAAA,MAAM,CAACC,YAAY,CAAC,IAAI,CAACvD,QAAQ,CAAC;AAClC,IAAA,IAAI,CAACA,QAAQ,GAAGsD,MAAM,CAACE,UAAU,CAAC,MAAK;MACrC,IAAI,CAAC7B,QAAQ,CACX;AACElB,QAAAA,YAAY,EAAE,KAAK;AACnBH,QAAAA,UAAU,EAAE;AACb,OAAA,EACD,MAAK;QACH,IAAI6C,IAAI,KAAK,SAAS,EAAE;AACtBC,UAAAA,SAAS,GAAGzC,QAA6B,EAAEP,QAAQ,CAAC;AACtD,QAAA,CAAC,MAAM;UACLiD,SAAS,GAAG1C,QAAQ,CAAC;AACvB,QAAA;AACF,MAAA,CAAC,CACF;IACH,CAAC,EAAEnB,cAAc,CAAC;EACpB,CAAC;AAEDiE,EAAAA,aAAa,GAAGA,CAAC9C,QAAiB,EAAEwC,IAAyB,KAAI;IAC/D,IAAI,CAACxB,QAAQ,CACX;MACEhB,QAAQ;MACRJ,OAAO,EAAE4C,IAAI,KAAK,OAAO;MACzBzC,SAAS,EAAEyC,IAAI,KAAK;KACrB,EACD,MAAM,IAAI,CAACD,oBAAoB,CAACC,IAAI,EAAExC,QAAQ,CAAC,CAChD;EACH,CAAC;EAED+C,aAAa,GAAgDjC,KAAK,IAAI;IACpEA,KAAK,CAACC,cAAc,EAAE;IACtB,MAAM;AAAEiC,MAAAA;KAAU,GAAG,IAAI,CAACzD,KAAK;AAC/ByD,IAAAA,QAAQ,IAAI;IAEZ,IAAI,CAAC7B,KAAK,EAAE;EACd,CAAC;EAEDA,KAAK,GAAGA,MAAK;IACX,IAAI,CAAC/B,WAAW,GAAG,CAAC;AACpBuD,IAAAA,MAAM,CAACC,YAAY,CAAC,IAAI,CAACvD,QAAQ,CAAC;IAClC,IAAI,CAAC2B,QAAQ,CAAC;AACZrB,MAAAA,UAAU,EAAE,KAAK;AACjBC,MAAAA,OAAO,EAAE,KAAK;AACdE,MAAAA,YAAY,EAAE,KAAK;AACnBC,MAAAA,SAAS,EAAE;AACZ,KAAA,CAAC;EACJ,CAAC;EAEDkD,aAAa,GAAIC,OAAe,IAAI;IAClC,MAAM;AAAErD,MAAAA;KAAS,GAAG,IAAI,CAACL,KAAK;AAC9B,IAAA,IAAIK,OAAO,EAAE;MACX,IAAI,CAACmB,QAAQ,CAAC;AACZd,QAAAA,aAAa,EAAEgD;AAChB,OAAA,CAAC;AACJ,IAAA;EACF,CAAC;EAED5B,WAAW,GAAG,MAAOE,IAAU,IAAI;IACjC,MAAM;MAAEC,WAAW;MAAE3C,OAAO;MAAEqE,OAAO;MAAEjE,UAAU;AAAED,MAAAA;KAAU,GAAG,IAAI,CAACM,KAAK;IAC1E,MAAM;AAAEO,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IAEnC,IAAIN,UAAU,IAAIY,YAAY,EAAE;AAC9B,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI,CAAC0B,IAAI,EAAE;AACT,MAAA,MAAM,IAAIG,KAAK,CAAC,yBAAyB,CAAC;AAC5C,IAAA;IAEA,IAAI,CAACX,QAAQ,CAAC;MACZvB,QAAQ,EAAE+B,IAAI,CAACK,IAAI;AACnBnC,MAAAA,WAAW,EAAE,KAAK;AAClBI,MAAAA,YAAY,EAAE;AACf,KAAA,CAAC;IAEFqD,OAAO,GAAG3B,IAAI,CAAC;IAEf,IAAI4B,MAAM,GAAG,IAAI;IAEjB,IAAI;AACFA,MAAAA,MAAM,GAAG,MAAMC,aAAa,CAAC7B,IAAI,CAAC;IACpC,CAAC,CAAC,OAAO8B,KAAK,EAAE;AACd,MAAA,IAAI,CAACR,aAAa,CAACQ,KAAK,EAAE,OAAO,CAAC;AACpC,IAAA;IAEA,IAAI,CAACF,MAAM,EAAE;AACX,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI,CAACpC,QAAQ,CAAC;MACZnB,OAAO,EAAE0D,WAAW,CAAC/B,IAAI,EAAE4B,MAAM,CAAC,CAACI,QAAQ,CAAC,OAAO;AACpD,KAAA,CAAC;IAEF,IAAI,CAACC,WAAW,CAACjC,IAAI,EAAEvC,QAAQ,EAAEmE,MAAM,CAAC,EAAE;MACxC,IAAI,CAACN,aAAa,CAChB,IAAIY,aAAa,CACf,IAAIC,QAAQ,CAAC,IAAI,EAAE;AACjBvD,QAAAA,MAAM,EAAE,GAAG;AACXwD,QAAAA,UAAU,EAAE;AACb,OAAA,CAAC,CACH,EACD,OAAO,CACR;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AAEA,IAAA,IAAI,OAAO9E,OAAO,KAAK,QAAQ,IAAI,CAAC+E,WAAW,CAACrC,IAAI,EAAE1C,OAAO,CAAC,EAAE;MAC9D,IAAI,CAACgE,aAAa,CAChB,IAAIY,aAAa,CACf,IAAIC,QAAQ,CAAC,IAAI,EAAE;AACjBvD,QAAAA,MAAM,EAAE,GAAG;AACXwD,QAAAA,UAAU,EAAE;AACb,OAAA,CAAC,CACH,EACD,OAAO,CACR;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AAEA,IAAA,IAAInC,WAAW,EAAE;AACf;AACA,MAAA,IAAIzB,QAAQ;MACZ,IAAI;AACFA,QAAAA,QAAQ,GAAG,MAAM,IAAI,CAACuB,SAAS,CAACC,IAAI,CAAC;MACvC,CAAC,CAAC,OAAO8B,KAAK,EAAE;AACd,QAAA,IAAI,CAACR,aAAa,CAACQ,KAAK,EAAE,OAAO,CAAC;AAClC,QAAA,OAAO,KAAK;AACd,MAAA;AACA,MAAA,IAAI,CAACR,aAAa,CAAC9C,QAAQ,EAAE,SAAS,CAAC;AACvC,MAAA,IAAI,CAACiD,aAAa,CAACG,MAAM,CAAC;AAC1B,MAAA,OAAO,IAAI;AACb,IAAA;AACA;AACA,IAAA,IAAI,CAACH,aAAa,CAACG,MAAM,CAAC;AAC1B,IAAA,IAAI,CAACN,aAAa,CAACM,MAAM,EAAE,SAAS,CAAC;AACrC,IAAA,OAAO,IAAI;EACb,CAAC;AAEDU,EAAAA,MAAMA,GAAA;IACJ,MAAM;MACJhF,OAAO;MACPiF,aAAa;MACb9E,QAAQ;MACR+E,YAAY;MACZC,iBAAiB;MACjB/E,UAAU;MACVgF,WAAW;MACX/E,OAAO;MACPgF,aAAa;MACbC,YAAY;MACZC,gBAAgB;MAChBtF,gBAAgB;MAChBuF,YAAY;MACZC,aAAa;MACbvF,IAAI;MACJwB,IAAI;AACJgE,MAAAA;KACD,GAAG,IAAI,CAACjF,KAAK;IAEd,MAAM;MACJS,QAAQ;MACRP,QAAQ;MACRE,UAAU;MACVD,WAAW;MACXE,OAAO;MACPC,OAAO;MACPC,YAAY;MACZC,SAAS;AACTG,MAAAA;KACD,GAAG,IAAI,CAACV,KAAK;IAEd,MAAMiF,WAAW,GAAG,CAAC,MAAa;AAChC,MAAA,IAAIN,aAAa,EAAE;AACjB,QAAA,OAAOA,aAAa;AACtB,MAAA;AAEA,MAAA,IAAI,OAAOrF,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACyD,aAAa,EAAE;UAAErF,OAAO,EAAE6B,aAAa,CAAC7B,OAAO;AAAC,SAAE,CAAC;AACxF,MAAA;AAEA,MAAA,OAAO0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACgE,oBAAoB,CAAC;AAC1D,IAAA,CAAC,GAAG;AAEJ,IAAA,oBACEC,IAAA,CAAA,KAAA,EAAA;AACEC,MAAAA,SAAS,EAAEC,IAAI,CAAC,gBAAgB,EAAE;AAChCC,QAAAA,SAAS,EAAE,IAAI;QACf,8BAA8B,EAAE9F,IAAI,KAAK,IAAI;AAC7C,QAAA,8BAA8B,EAAEA,IAAI,KAAK,IAAI,IAAI,CAACA,IAAI;QACtD,8BAA8B,EAAEA,IAAI,KAAK,IAAI;AAC7C,QAAA,oBAAoB,EAAEU,WAAW;AACjC,QAAA,sBAAsB,EAAEI,YAAY;AACpC,QAAA,oBAAoB,EAAEH,UAAU,IAAI,CAACC,OAAO;QAC5C,oBAAoB,EAAEA,OAAO,IAAI,CAACE;AACnC,OAAA,CAAE;MACHmB,WAAW,EAAGH,KAAK,IAAK,IAAI,CAACG,WAAW,CAACH,KAAK,CAAE;MAChDD,WAAW,EAAGC,KAAK,IAAK,IAAI,CAACD,WAAW,CAACC,KAAK,CAAE;MAChDI,MAAM,EAAE,MAAOJ,KAAK,IAAK,IAAI,CAACI,MAAM,CAACJ,KAAK,CAAE;AAC5CiE,MAAAA,UAAU,EAAGjE,KAAK,IAAKA,KAAK,CAACC,cAAc,EAAG;MAAAiE,QAAA,EAAA,CAE7C,CAAClF,YAAY,IAAI,CAACH,UAAU,iBAC3BsF,GAAA,CAACC,eAAe,EAAA;QACd5D,WAAW,EAAE,MAAOE,IAAI,IAAK,IAAI,CAACF,WAAW,CAACE,IAAI,CAAE;AACpD7B,QAAAA,UAAU,EAAEA,UAAW;AACvBV,QAAAA,QAAQ,EAAEA,QAAS;QACnB+E,YAAY,EAAEA,YAAY,IAAIxD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACsD,YAAY,CAAE;AACxE9E,QAAAA,UAAU,EAAEA,UAAW;AACvBgF,QAAAA,WAAW,EAAEA,WAAY;AACzB/E,QAAAA,OAAO,EAAEA,OAAQ;AACjBgF,QAAAA,aAAa,EAAEM;AAAY,OAAA,CAE9B,EAEA,CAAC1E,SAAS,IAAIJ,UAAU,KAAK,CAACC,OAAO,iBACpCqF,GAAA,CAACE,YAAY,EAAA;AACX1F,QAAAA,QAAQ,EAAEA,QAAS;AACnBE,QAAAA,UAAU,EAAEA,UAAW;AACvBE,QAAAA,OAAO,EAAEA,OAAQ;QACjByE,YAAY,EAAEA,YAAY,IAAI9D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC4D,YAAY,CAAE;QACxEC,aAAa,EAAEA,aAAa,IAAI/D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC6D,aAAa,CAAE;AAC3ErE,QAAAA,aAAa,EAAEA,aAAc;AAC7BkF,QAAAA,OAAO,EAAGtE,KAAK,IAAK,IAAI,CAACiC,aAAa,CAACjC,KAAK;OAAE,CAEjD,EACAlB,OAAO,IAAI,CAACE,YAAY,iBACvBmF,GAAA,CAACC,eAAe,EAAA;QACd5D,WAAW,EAAE,MAAOE,IAAI,IAAI;UAC1B,IAAI,CAACL,KAAK,EAAE;AACZ,UAAA,MAAM,IAAI,CAACG,WAAW,CAACE,IAAI,CAAC;QAC9B,CAAE;QACF7B,UAAU,EAAE,CAACC,OAAQ;AACrBX,QAAAA,QAAQ,EAAEA,QAAS;QACnB+E,YAAY,EAAEC,iBAAiB,IAAIzD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC2E,KAAK,CAAE;AACtEnG,QAAAA,UAAU,EAAEA,UAAW;AACvBgF,QAAAA,WAAW,EAAE,IAAK;AAClB/E,QAAAA,OAAO,EAAEA,OAAQ;AACjBgF,QAAAA,aAAa,EAAEM,WAAY;AAC3Ba,QAAAA,YAAY,EAAE,IAAI,CAACnF,eAAe,CAChCH,QAAQ,IAAI,IAAI,IACd,OAAOA,QAAQ,KAAK,QAAQ,IAC5B,QAAQ,IAAIA,QAAQ,IACpB,OAAOA,QAAQ,CAACI,MAAM,KAAK,QAAQ,GACjCJ,QAAQ,CAACI,MAAM,GACfH,SAAS,CACb;AACFuE,QAAAA,cAAc,EAAEA;AAAe,OAAA,CAElC,EACA1E,YAAY,iBACXmF,GAAA,CAACM,cAAc,EAAA;AACb5F,QAAAA,UAAU,EAAEA,UAAW;AACvBC,QAAAA,OAAO,EAAEA,OAAQ;AACjBG,QAAAA,SAAS,EAAEA,SAAU;QACrBqE,YAAY,EAAEA,YAAY,IAAI5D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC0D,YAAY,CAAE;QACxEC,gBAAgB,EAAEA,gBAAgB,IAAI7D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC2D,gBAAgB,CAAE;AACpFtF,QAAAA,gBAAgB,EAAEA,gBAAiB;AACnCqG,QAAAA,OAAO,EAAGtE,KAAK,IAAK,IAAI,CAACiC,aAAa,CAACjC,KAAK;AAAE,OAAA,CAEjD,EACA,CAAChB,YAAY,iBACZmF,GAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAC,wCAAwC;AAAC,QAAA,WAAA,EAAU,QAAQ;AAAAI,QAAAA,QAAA,eACxEL,IAAA,CAAA,KAAA,EAAA;AAAKC,UAAAA,SAAS,EAAC,wBAAwB;AAAAI,UAAAA,QAAA,gBACrCC,GAAA,CAAA,KAAA,EAAA;AAAKL,YAAAA,SAAS,EAAC,+BAA+B;YAAAI,QAAA,eAC5CC,GAAA,CAACO,IAAQ,EAAA;AAACxG,cAAAA,IAAI,EAAC;aAAI;AACrB,WAAK,CACL,eAAAiG,GAAA,CAACQ,KAAK,EAAA;YAACjD,IAAI,EAAEkD,UAAU,CAACC,UAAW;AAACf,YAAAA,SAAS,EAAC,OAAO;YAAAI,QAAA,EAClDjB,aAAa,IAAIvD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACqD,aAAa;AAAC,WACvD,CACT;SAAK;AACP,OAAK,CACN;AAAA,KACE,CAAC;AAEV,EAAA;;AAGF,eAAe6B,UAAU,CAAClH,MAAM,CAAC;AAEjC,MAAMiC,aAAa,GAAIkF,KAAa,IAAI;AACtC,EAAA,MAAMC,SAAS,GAAGD,KAAK,GAAG,OAAO;EACjC,IAAIC,SAAS,IAAI,GAAG,EAAE;IACpB,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,SAAS,CAAC,KAAKA,SAAS;IACnD,OAAOC,OAAO,GAAG,CAAA,EAAGD,SAAS,CAAA,CAAE,GAAGA,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AACxD,EAAA;EACA,IAAIJ,SAAS,IAAI,IAAI,EAAE;AACrB,IAAA,OAAOA,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AAC7B,EAAA;AACA,EAAA,OAAOJ,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AAC7B,CAAC;;;;"}
|
|
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';\n\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 /**\n * Filesize expressed in B.<br />If set to `null`, no size limit will be applied.\n * @default 5000000 (5 MB)\n */\n maxSize?: number | null;\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: 300,\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 (typeof maxSize === 'number'\n ? intl.formatMessage(messages.csTooLargeMessage, { maxSize: roundFileSize(maxSize) })\n : intl.formatMessage(messages.csTooLargeNoLimitMessage))\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 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 handleUploadComplete = (type: 'success' | 'error', response: unknown) => {\n const { animationDelay, onSuccess, onFailure } = this.props;\n const { fileName } = this.state;\n\n window.clearTimeout(this.timeouts);\n this.timeouts = window.setTimeout(() => {\n this.setState(\n {\n isProcessing: false,\n isComplete: true,\n },\n () => {\n if (type === 'success') {\n onSuccess?.(response as string | Response, fileName);\n } else {\n onFailure?.(response);\n }\n },\n );\n }, animationDelay);\n };\n\n asyncResponse = (response: unknown, type: 'success' | 'error') => {\n this.setState(\n {\n response,\n isError: type === 'error',\n isSuccess: type === 'success',\n },\n () => this.handleUploadComplete(type, response),\n );\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 (typeof maxSize === 'number' && !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 const placeholder = ((): string => {\n if (usPlaceholder) {\n return usPlaceholder;\n }\n\n if (typeof maxSize === 'number') {\n return intl.formatMessage(messages.usPlaceholder, { maxSize: roundFileSize(maxSize) });\n }\n\n return intl.formatMessage(messages.usPlaceholderNoLimit);\n })();\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={placeholder}\n />\n )}\n\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={placeholder}\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 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\nconst roundFileSize = (bytes: number) => {\n const megabytes = bytes / 1000000;\n if (megabytes >= 0.1) {\n const isRound = Math.floor(megabytes) === megabytes;\n return isRound ? `${megabytes}` : megabytes.toFixed(1);\n }\n if (megabytes >= 0.01) {\n return megabytes.toFixed(2);\n }\n return megabytes.toFixed(3);\n};\n"],"names":["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","roundFileSize","csTooLargeNoLimitMessage","onDragLeave","event","preventDefault","setState","onDragEnter","onDrop","reset","dataTransfer","files","fileDropped","asyncPost","file","httpOptions","fetcher","Error","fileInputName","name","data","formData","FormData","append","Object","keys","forEach","key","postData","handleUploadComplete","type","onSuccess","onFailure","window","clearTimeout","setTimeout","asyncResponse","handleOnClear","onCancel","showDataImage","dataUrl","onStart","file64","asyncFileRead","error","getFileType","includes","isTypeValid","ResponseError","Response","statusText","isSizeValid","render","usDropMessage","usButtonText","usButtonRetryText","usHelpImage","usPlaceholder","psButtonText","psProcessingText","csButtonText","csSuccessText","errorIconLabel","placeholder","usPlaceholderNoLimit","_jsxs","className","clsx","droppable","onDragOver","children","_jsx","UploadImageStep","CompleteStep","onClear","retry","errorMessage","ProcessingStep","PlusIcon","Title","Typography","TITLE_BODY","injectIntl","bytes","megabytes","isRound","Math","floor","toFixed"],"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.119.2",
|
|
4
4
|
"description": "Neptune React components",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -38,90 +38,91 @@
|
|
|
38
38
|
"!**/*.tsbuildinfo"
|
|
39
39
|
],
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@babel/core": "^7.28.
|
|
42
|
-
"@babel/plugin-transform-runtime": "^7.28.
|
|
43
|
-
"@babel/preset-env": "^7.28.
|
|
44
|
-
"@babel/preset-react": "^7.
|
|
45
|
-
"@babel/preset-typescript": "^7.
|
|
46
|
-
"@formatjs/cli": "^6.
|
|
47
|
-
"@rollup/plugin-babel": "^6.0
|
|
41
|
+
"@babel/core": "^7.28.5",
|
|
42
|
+
"@babel/plugin-transform-runtime": "^7.28.5",
|
|
43
|
+
"@babel/preset-env": "^7.28.5",
|
|
44
|
+
"@babel/preset-react": "^7.28.5",
|
|
45
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
46
|
+
"@formatjs/cli": "^6.8.4",
|
|
47
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
48
48
|
"@rollup/plugin-json": "^6.1.0",
|
|
49
|
-
"@rollup/plugin-node-resolve": "^16.0.
|
|
50
|
-
"@rollup/plugin-typescript": "^12.
|
|
49
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
50
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
51
51
|
"@rollup/plugin-url": "^8.0.2",
|
|
52
|
-
"@storybook/addon-a11y": "^10.1.
|
|
53
|
-
"@storybook/addon-docs": "^10.1.
|
|
52
|
+
"@storybook/addon-a11y": "^10.1.10",
|
|
53
|
+
"@storybook/addon-docs": "^10.1.10",
|
|
54
54
|
"@storybook/addon-webpack5-compiler-babel": "^4.0.0",
|
|
55
|
-
"@storybook/react-webpack5": "^10.1.
|
|
55
|
+
"@storybook/react-webpack5": "^10.1.10",
|
|
56
56
|
"@testing-library/dom": "^10.4.1",
|
|
57
|
-
"@testing-library/jest-dom": "^6.
|
|
58
|
-
"@testing-library/react": "^16.3.
|
|
57
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
58
|
+
"@testing-library/react": "^16.3.1",
|
|
59
59
|
"@testing-library/user-event": "^14.6.1",
|
|
60
|
-
"@transferwise/icons": "^4.0.
|
|
61
|
-
"@tsconfig/recommended": "^1.0.
|
|
60
|
+
"@transferwise/icons": "^4.0.1",
|
|
61
|
+
"@tsconfig/recommended": "^1.0.13",
|
|
62
62
|
"@types/babel__core": "^7.20.5",
|
|
63
63
|
"@types/commonmark": "^0.27.10",
|
|
64
64
|
"@types/jest": "^30.0.0",
|
|
65
|
-
"@types/lodash": "4.17.
|
|
65
|
+
"@types/lodash": "4.17.21",
|
|
66
66
|
"@types/lodash.clamp": "^4.0.9",
|
|
67
67
|
"@types/lodash.debounce": "^4.0.9",
|
|
68
68
|
"@types/react": "^18.3.23",
|
|
69
69
|
"@types/react-dom": "^18.3.7",
|
|
70
70
|
"@types/react-transition-group": "4.4.12",
|
|
71
|
-
"@wise/art": "^2.
|
|
72
|
-
"@wise/eslint-config": "^13.
|
|
71
|
+
"@wise/art": "^2.25.0",
|
|
72
|
+
"@wise/eslint-config": "^13.3.0",
|
|
73
73
|
"babel-plugin-formatjs": "^10.5.39",
|
|
74
|
-
"eslint": "^9.
|
|
75
|
-
"eslint-plugin-storybook": "10.1.
|
|
74
|
+
"eslint": "^9.39.2",
|
|
75
|
+
"eslint-plugin-storybook": "10.1.10",
|
|
76
76
|
"gulp": "^5.0.1",
|
|
77
|
-
"jest": "^30.0
|
|
77
|
+
"jest": "^30.2.0",
|
|
78
78
|
"jest-environment-jsdom": "^29.7.0",
|
|
79
79
|
"jest-fetch-mock": "^3.0.3",
|
|
80
80
|
"lodash.times": "^4.3.2",
|
|
81
81
|
"react-intl": "^7.1.11",
|
|
82
|
-
"rollup": "^4.
|
|
82
|
+
"rollup": "^4.54.0",
|
|
83
83
|
"rollup-preserve-directives": "^1.1.3",
|
|
84
84
|
"storybook": "^10.1.10",
|
|
85
85
|
"storybook-addon-tag-badges": "^3.0.4",
|
|
86
86
|
"storybook-addon-test-codegen": "^3.0.1",
|
|
87
87
|
"@transferwise/less-config": "3.1.2",
|
|
88
|
-
"@
|
|
89
|
-
"@
|
|
88
|
+
"@wise/components-theming": "1.9.3",
|
|
89
|
+
"@transferwise/neptune-css": "14.26.1",
|
|
90
90
|
"@wise/wds-configs": "0.0.0"
|
|
91
91
|
},
|
|
92
92
|
"peerDependencies": {
|
|
93
93
|
"@transferwise/icons": "^3 || ^4",
|
|
94
|
-
"@transferwise/neptune-css": "^14.
|
|
95
|
-
"@wise/art": "^2.
|
|
96
|
-
"@wise/components-theming": "^1.
|
|
97
|
-
"framer-motion": "^12.23.
|
|
94
|
+
"@transferwise/neptune-css": "^14.26",
|
|
95
|
+
"@wise/art": "^2.25.0",
|
|
96
|
+
"@wise/components-theming": "^1.9.1",
|
|
97
|
+
"framer-motion": "^12.23.26",
|
|
98
98
|
"react": ">=18",
|
|
99
99
|
"react-dom": ">=18",
|
|
100
100
|
"react-intl": "^5.10.0 || ^6 || ^7"
|
|
101
101
|
},
|
|
102
102
|
"dependencies": {
|
|
103
|
-
"@babel/runtime": "^7.28.
|
|
103
|
+
"@babel/runtime": "^7.28.4",
|
|
104
104
|
"@floating-ui/react": "^0.27.16",
|
|
105
105
|
"@headlessui/react": "^1.7.19",
|
|
106
106
|
"@popperjs/core": "^2.11.8",
|
|
107
|
-
"@react-aria/focus": "^3.21.
|
|
108
|
-
"@react-aria/overlays": "^3.
|
|
109
|
-
"@react-spring/web": "~10.0.
|
|
107
|
+
"@react-aria/focus": "^3.21.3",
|
|
108
|
+
"@react-aria/overlays": "^3.31.0",
|
|
109
|
+
"@react-spring/web": "~10.0.3",
|
|
110
110
|
"@transferwise/formatting": "^2.13.4",
|
|
111
111
|
"@transferwise/neptune-validation": "^3.3.1",
|
|
112
112
|
"clsx": "^2.1.1",
|
|
113
113
|
"commonmark": "^0.31.2",
|
|
114
|
-
"core-js": "^3.
|
|
115
|
-
"framer-motion": "^12.23.
|
|
114
|
+
"core-js": "^3.47.0",
|
|
115
|
+
"framer-motion": "^12.23.26",
|
|
116
116
|
"lodash.clamp": "^4.0.3",
|
|
117
117
|
"lodash.debounce": "^4.0.8",
|
|
118
118
|
"merge-props": "^6.0.0",
|
|
119
119
|
"react-popper": "^2.3.0",
|
|
120
120
|
"react-transition-group": "^4.4.5",
|
|
121
|
-
"virtua": "^0.
|
|
121
|
+
"virtua": "^0.48.2"
|
|
122
122
|
},
|
|
123
123
|
"publishConfig": {
|
|
124
|
-
"access": "public"
|
|
124
|
+
"access": "public",
|
|
125
|
+
"registry": "https://registry.npmjs.org/"
|
|
125
126
|
},
|
|
126
127
|
"scripts": {
|
|
127
128
|
"dev": "npm-run-all --parallel dev:* dev:*:* storybook:dev",
|
|
@@ -250,8 +250,10 @@ const defaultRenderTrigger = (({ content, placeholderShown, clear, disabled, siz
|
|
|
250
250
|
</InputGroup>
|
|
251
251
|
)) satisfies SelectInputProps['renderTrigger'];
|
|
252
252
|
|
|
253
|
-
interface SelectInputClearButtonProps
|
|
254
|
-
|
|
253
|
+
interface SelectInputClearButtonProps extends Pick<
|
|
254
|
+
React.ComponentPropsWithoutRef<'button'>,
|
|
255
|
+
'className' | 'onClick'
|
|
256
|
+
> {}
|
|
255
257
|
|
|
256
258
|
function SelectInputClearButton({ className, onClick }: SelectInputClearButtonProps) {
|
|
257
259
|
const intl = useIntl();
|
|
@@ -576,17 +578,10 @@ const SelectInputOptionsContainer = forwardRef(function SelectInputOptionsContai
|
|
|
576
578
|
);
|
|
577
579
|
});
|
|
578
580
|
|
|
579
|
-
interface SelectInputOptionsProps<T = string>
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
| 'renderValue'
|
|
584
|
-
| 'renderFooter'
|
|
585
|
-
| 'filterable'
|
|
586
|
-
| 'filterPlaceholder'
|
|
587
|
-
| 'id'
|
|
588
|
-
| 'parentId'
|
|
589
|
-
> {
|
|
581
|
+
interface SelectInputOptionsProps<T = string> extends Pick<
|
|
582
|
+
SelectInputProps<T>,
|
|
583
|
+
'items' | 'renderValue' | 'renderFooter' | 'filterable' | 'filterPlaceholder' | 'id' | 'parentId'
|
|
584
|
+
> {
|
|
590
585
|
searchInputRef: React.MutableRefObject<HTMLInputElement | null>;
|
|
591
586
|
listboxRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
592
587
|
filterQuery: string;
|
|
@@ -828,14 +823,19 @@ function SelectInputOptions<T = string>({
|
|
|
828
823
|
<Virtualizer
|
|
829
824
|
ref={virtualiserHandlerRef}
|
|
830
825
|
key={needle}
|
|
831
|
-
|
|
826
|
+
data={filteredItems}
|
|
832
827
|
keepMounted={mountedIndexes}
|
|
833
828
|
scrollRef={listboxRef} // `VList` doesn't expose this
|
|
834
829
|
onScroll={async () => {
|
|
835
830
|
if (!virtualiserHandlerRef.current) return;
|
|
836
831
|
|
|
837
|
-
const startIndex = virtualiserHandlerRef.current.
|
|
838
|
-
|
|
832
|
+
const startIndex = virtualiserHandlerRef.current.findItemIndex(
|
|
833
|
+
virtualiserHandlerRef.current.scrollOffset,
|
|
834
|
+
);
|
|
835
|
+
const endIndex = virtualiserHandlerRef.current.findItemIndex(
|
|
836
|
+
virtualiserHandlerRef.current.scrollOffset +
|
|
837
|
+
virtualiserHandlerRef.current.viewportSize,
|
|
838
|
+
);
|
|
839
839
|
|
|
840
840
|
setMountedIndexes((prevMountedIndexes) => {
|
|
841
841
|
const indexes = new Set(prevMountedIndexes);
|
|
@@ -848,7 +848,7 @@ function SelectInputOptions<T = string>({
|
|
|
848
848
|
});
|
|
849
849
|
}}
|
|
850
850
|
>
|
|
851
|
-
{(index) => (
|
|
851
|
+
{(item, index) => (
|
|
852
852
|
// The position of each item can't be inferred by browsers when
|
|
853
853
|
// virtualizing, as some of the items may not be in the DOM
|
|
854
854
|
<SelectInputItemsCountContext.Provider value={filteredItems.length}>
|
|
@@ -924,8 +924,10 @@ function SelectInputItemView<T = string>({
|
|
|
924
924
|
return null;
|
|
925
925
|
}
|
|
926
926
|
|
|
927
|
-
interface SelectInputGroupItemViewProps<T = string>
|
|
928
|
-
|
|
927
|
+
interface SelectInputGroupItemViewProps<T = string> extends SelectInputItemViewProps<
|
|
928
|
+
T,
|
|
929
|
+
SelectInputGroupItem<T | undefined>
|
|
930
|
+
> {}
|
|
929
931
|
|
|
930
932
|
function SelectInputGroupItemView<T = string>({
|
|
931
933
|
item,
|
|
@@ -69,4 +69,52 @@ describe('ListItem.Prompt', () => {
|
|
|
69
69
|
expect(screen.getByTestId('InlinePrompt_Muted')).toBeInTheDocument();
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
|
+
|
|
73
|
+
[
|
|
74
|
+
{ sentiment: Sentiment.NEGATIVE as const, iconLabel: 'Error:' },
|
|
75
|
+
{ sentiment: Sentiment.WARNING as const, iconLabel: 'Warning:' },
|
|
76
|
+
{ sentiment: Sentiment.NEUTRAL as const, iconLabel: 'Information:' },
|
|
77
|
+
{ sentiment: Sentiment.POSITIVE as const, iconLabel: 'Success:' },
|
|
78
|
+
{ sentiment: 'proposition' as const, iconLabel: '' },
|
|
79
|
+
].forEach(({ sentiment, iconLabel }) => {
|
|
80
|
+
describe(sentiment, () => {
|
|
81
|
+
const customLabel = 'Custom icon label';
|
|
82
|
+
|
|
83
|
+
if (!iconLabel) {
|
|
84
|
+
it('should not have accessible name for the icon', () => {
|
|
85
|
+
const { container } = render(
|
|
86
|
+
<ListItem
|
|
87
|
+
title="Test Title"
|
|
88
|
+
prompt={<ListItem.Prompt sentiment={sentiment}>Message</ListItem.Prompt>}
|
|
89
|
+
/>,
|
|
90
|
+
);
|
|
91
|
+
expect(container.querySelector('svg')).not.toHaveAccessibleName();
|
|
92
|
+
});
|
|
93
|
+
} else {
|
|
94
|
+
it('should use default aria label', () => {
|
|
95
|
+
render(
|
|
96
|
+
<ListItem
|
|
97
|
+
title="Test Title"
|
|
98
|
+
prompt={<ListItem.Prompt sentiment={sentiment}>Message</ListItem.Prompt>}
|
|
99
|
+
/>,
|
|
100
|
+
);
|
|
101
|
+
expect(screen.getByLabelText(iconLabel)).toBeInTheDocument();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
it('should allow for customisation of aria label', () => {
|
|
106
|
+
render(
|
|
107
|
+
<ListItem
|
|
108
|
+
title="Test Title"
|
|
109
|
+
prompt={
|
|
110
|
+
<ListItem.Prompt sentiment={sentiment} iconLabel={customLabel}>
|
|
111
|
+
Message
|
|
112
|
+
</ListItem.Prompt>
|
|
113
|
+
}
|
|
114
|
+
/>,
|
|
115
|
+
);
|
|
116
|
+
expect(screen.getByLabelText(customLabel)).toBeInTheDocument();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
72
120
|
});
|
|
@@ -4,7 +4,7 @@ import { Sentiment } from '../../common';
|
|
|
4
4
|
import { ListItemContext, type ListItemContextData } from '../ListItemContext';
|
|
5
5
|
import { InlinePrompt, type InlinePromptProps } from '../../prompt';
|
|
6
6
|
|
|
7
|
-
export type ListItemPromptProps = Pick<InlinePromptProps, 'children' | 'sentiment' | '
|
|
7
|
+
export type ListItemPromptProps = Pick<InlinePromptProps, 'children' | 'sentiment' | 'iconLabel'>;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* This component allows for rendering an Inline Prompt. <br />
|
|
@@ -12,7 +12,11 @@ export type ListItemPromptProps = Pick<InlinePromptProps, 'children' | 'sentimen
|
|
|
12
12
|
*
|
|
13
13
|
* Please refer to the [Design documentation](https://wise.design/components/list-item#prompt) for details.
|
|
14
14
|
*/
|
|
15
|
-
export const Prompt = ({
|
|
15
|
+
export const Prompt = ({
|
|
16
|
+
sentiment = Sentiment.NEUTRAL,
|
|
17
|
+
iconLabel,
|
|
18
|
+
children,
|
|
19
|
+
}: ListItemPromptProps) => {
|
|
16
20
|
const { ids, props } = useContext<ListItemContextData>(ListItemContext);
|
|
17
21
|
const isLongLivedMuted = props.disabled && Boolean(props.disabledPromptMessage);
|
|
18
22
|
|
|
@@ -20,6 +24,7 @@ export const Prompt = ({ sentiment = Sentiment.NEUTRAL, children }: ListItemProm
|
|
|
20
24
|
<InlinePrompt
|
|
21
25
|
id={ids.prompt}
|
|
22
26
|
sentiment={sentiment}
|
|
27
|
+
iconLabel={iconLabel}
|
|
23
28
|
muted={isLongLivedMuted}
|
|
24
29
|
className="wds-list-item-prompt"
|
|
25
30
|
>
|
|
@@ -26,7 +26,7 @@ describe('InlinePrompt', () => {
|
|
|
26
26
|
{ sentiment: Sentiment.NEGATIVE as const, acceptsMedia: false, statusIconLabel: 'Error:' },
|
|
27
27
|
{ sentiment: Sentiment.WARNING as const, acceptsMedia: false, statusIconLabel: 'Warning:' },
|
|
28
28
|
{ sentiment: Sentiment.NEUTRAL as const, acceptsMedia: false, statusIconLabel: 'Information:' },
|
|
29
|
-
{ sentiment: Sentiment.POSITIVE as const, acceptsMedia: true, statusIconLabel: '' },
|
|
29
|
+
{ sentiment: Sentiment.POSITIVE as const, acceptsMedia: true, statusIconLabel: 'Success:' },
|
|
30
30
|
{ sentiment: 'proposition' as const, acceptsMedia: true, statusIconLabel: '' },
|
|
31
31
|
].forEach(({ sentiment, statusIconLabel, acceptsMedia }) => {
|
|
32
32
|
describe(sentiment, () => {
|
|
@@ -90,6 +90,34 @@ describe('InlinePrompt', () => {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
|
+
|
|
94
|
+
describe('iconLabel', () => {
|
|
95
|
+
const iconLabel = 'Custom icon label';
|
|
96
|
+
|
|
97
|
+
if (!statusIconLabel) {
|
|
98
|
+
it('should not have accessible name for the icon', () => {
|
|
99
|
+
const { container } = render(<InlinePrompt {...defaultProps} sentiment={sentiment} />);
|
|
100
|
+
expect(container.querySelector('svg')).not.toHaveAccessibleName();
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
it('should use default aria label', () => {
|
|
104
|
+
render(<InlinePrompt {...defaultProps} sentiment={sentiment} />);
|
|
105
|
+
expect(screen.getByLabelText(statusIconLabel)).toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
it('should allow for customisation of aria label', () => {
|
|
110
|
+
render(<InlinePrompt {...defaultProps} sentiment={sentiment} iconLabel={iconLabel} />);
|
|
111
|
+
expect(screen.getByLabelText(iconLabel)).toBeInTheDocument();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should retain custom label while muted', () => {
|
|
115
|
+
render(
|
|
116
|
+
<InlinePrompt {...defaultProps} sentiment={sentiment} iconLabel={iconLabel} muted />,
|
|
117
|
+
);
|
|
118
|
+
expect(screen.getByLabelText(iconLabel)).toBeInTheDocument();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
93
121
|
});
|
|
94
122
|
});
|
|
95
123
|
|