{"version":3,"file":"UploadItem.mjs","sources":["../../../src/uploadInput/uploadItem/UploadItem.tsx"],"sourcesContent":["import { Bin, CheckCircleFill, CrossCircleFill } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { forwardRef, useImperativeHandle, useRef } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { Size, Status, Typography } from '../../common';\nimport ProcessIndicator from '../../processIndicator/ProcessIndicator';\nimport { UploadedFile, UploadError } from '../types';\n\nimport MESSAGES from './UploadItem.messages';\nimport { UploadItemLink } from './UploadItemLink';\n\nexport type UploadItemProps = React.JSX.IntrinsicAttributes & {\n  file: UploadedFile;\n  /**\n   * Is this Item part of a multiple- or single-file UploadInput\n   */\n  singleFileUpload: boolean;\n  canDelete: boolean;\n  onDelete: () => void;\n  onFocus: (target?: 'button' | 'link') => void;\n\n  /**\n   * Callback to be called when the file link is clicked.\n   * When provided, you need to manually trigger actions to load/download the file.\n   *\n   * @param file\n   */\n  onDownload?: (file: UploadedFile) => void;\n  ref?: React.Ref<UploadItemRef>;\n};\ninterface UploadItemRef {\n  /**\n   * A method to set focus on the upload item.\n   * @returns {void}\n   */\n  focus: () => void;\n\n  /**\n   * A required unique identifier for the upload item.\n   */\n  id: string | number;\n\n  /**\n   * An optional status of the upload item.\n   */\n  status?: string;\n}\n\nexport enum TEST_IDS {\n  uploadItem = 'uploadItem',\n  mediaBody = 'mediaBody',\n  link = 'link',\n  action = 'action',\n}\n\nconst UploadItem = forwardRef<UploadItemRef, UploadItemProps>(\n  ({ file, canDelete, onDelete, onDownload, singleFileUpload, onFocus: handleFocus }, ref) => {\n    const { formatMessage } = useIntl();\n    const { status, filename, error, errors, url } = file;\n    const linkRef = useRef<HTMLAnchorElement>(null);\n    const buttonRef = useRef<HTMLButtonElement>(null);\n\n    useImperativeHandle<UploadItemRef, UploadItemRef>(ref, () => ({\n      focus: (target?: 'button' | 'link'): void => {\n        if (target === 'button' && buttonRef.current) {\n          buttonRef.current.focus();\n        } else if (target === 'link' && linkRef.current) {\n          linkRef.current.focus();\n        } else if (buttonRef.current) {\n          buttonRef.current.focus();\n        } else if (linkRef.current) {\n          linkRef.current.focus();\n        }\n      },\n      id: file.id,\n      status: file.status,\n    }));\n\n    const isSucceeded = [Status.SUCCEEDED, undefined].includes(status) && !!url;\n\n    /**\n     * We're temporarily reverting to the regular icon components,\n     * until the StatusIcon receives 24px sizing. Some misalignment\n     * to be expected.\n     */\n    const getIcon = () => {\n      if (error || errors?.length || status === Status.FAILED) {\n        return <CrossCircleFill size={24} className=\"emphasis--negative\" />;\n      }\n\n      let processIndicator: React.ReactNode;\n\n      switch (status) {\n        case Status.PROCESSING:\n        case Status.PENDING:\n          processIndicator = (\n            <ProcessIndicator size={Size.EXTRA_SMALL} status={Status.PROCESSING} />\n          );\n          break;\n        case Status.SUCCEEDED:\n        case Status.DONE:\n        default:\n          processIndicator = <CheckCircleFill size={24} className=\"emphasis--positive\" />;\n      }\n\n      return processIndicator;\n    };\n\n    const getErrorMessage = (error?: UploadError) =>\n      typeof error === 'object' ? error.message : error || formatMessage(MESSAGES.uploadingFailed);\n\n    const getMultipleErrors = (errors?: UploadError[]) => {\n      if (!errors?.length) {\n        return null;\n      }\n\n      if (errors?.length === 1) {\n        return getErrorMessage(errors[0]);\n      }\n\n      return (\n        <ul className=\"np-upload-input-errors m-b-0\">\n          {errors.map((error, index) => {\n            // eslint-disable-next-line react/no-array-index-key\n            return <li key={index}>{getErrorMessage(error)}</li>;\n          })}\n        </ul>\n      );\n    };\n\n    const getDescription = () => {\n      if (error || errors?.length || status === Status.FAILED) {\n        return (\n          <Body type={Typography.BODY_DEFAULT_BOLD} className=\"np-upload-input__text text-negative\">\n            {errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)}\n          </Body>\n        );\n      }\n\n      switch (status) {\n        case Status.PENDING:\n          return (\n            <Body type={Typography.BODY_DEFAULT} className=\"np-upload-input__text\">\n              {formatMessage(MESSAGES.uploading)}\n            </Body>\n          );\n        case Status.PROCESSING:\n          return <Body className=\"np-upload-input__text\">{formatMessage(MESSAGES.deleting)}</Body>;\n        case Status.SUCCEEDED:\n        case Status.DONE:\n        default:\n          return (\n            <Body type={Typography.BODY_DEFAULT_BOLD} className=\"np-upload-input__text\">\n              {formatMessage(MESSAGES.uploaded)}\n            </Body>\n          );\n      }\n    };\n\n    const getTitle = () => {\n      return filename || formatMessage(MESSAGES.uploadedFile);\n    };\n\n    const onDownloadFile = (event: React.MouseEvent): void => {\n      if (onDownload) {\n        event.preventDefault();\n        onDownload(file);\n      }\n    };\n\n    return (\n      <div\n        className={clsx('np-upload-input__item', { 'is-interactive': isSucceeded && url })}\n        data-testid={`${file.id}-${TEST_IDS.uploadItem}`}\n      >\n        <UploadItemLink\n          ref={linkRef}\n          url={isSucceeded ? url : undefined}\n          singleFileUpload={singleFileUpload}\n          data-testid={`${file.id}-${TEST_IDS.link}`}\n          onDownload={onDownloadFile}\n        >\n          <span className=\"np-upload-input__icon\">{getIcon()}</span>\n          <div\n            className=\"np-upload-input__item-content\"\n            data-testid={`${file.id}-${TEST_IDS.mediaBody}`}\n          >\n            <Body type={Typography.BODY_LARGE} className=\"np-upload-input__title text-word-break\">\n              {getTitle()}\n            </Body>\n            {getDescription()}\n          </div>\n        </UploadItemLink>\n        {canDelete && (\n          <div className=\"np-upload-input__item-action\">\n            <button\n              ref={buttonRef}\n              aria-label={formatMessage(MESSAGES.removeFile, { filename })}\n              className=\"np-upload-input__item-button\"\n              type=\"button\"\n              tabIndex={0}\n              data-testid={`${file.id}-${TEST_IDS.action}`}\n              onClick={() => onDelete()}\n              // @ts-expect-error: handleFocus is not a standard FocusEventHandler, but required for parent logic\n              onFocus={handleFocus}\n            >\n              <Bin size={16} />\n            </button>\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nUploadItem.displayName = 'UploadItem';\n\nexport default UploadItem;\n"],"names":["TEST_IDS","UploadItem","forwardRef","file","canDelete","onDelete","onDownload","singleFileUpload","onFocus","handleFocus","ref","formatMessage","useIntl","status","filename","error","errors","url","linkRef","useRef","buttonRef","useImperativeHandle","focus","target","current","id","isSucceeded","Status","SUCCEEDED","undefined","includes","getIcon","length","FAILED","_jsx","CrossCircleFill","size","className","processIndicator","PROCESSING","PENDING","ProcessIndicator","Size","EXTRA_SMALL","DONE","CheckCircleFill","getErrorMessage","message","MESSAGES","uploadingFailed","getMultipleErrors","children","map","index","getDescription","Body","type","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","uploading","deleting","uploaded","getTitle","uploadedFile","onDownloadFile","event","preventDefault","_jsxs","clsx","uploadItem","UploadItemLink","link","mediaBody","BODY_LARGE","removeFile","tabIndex","action","onClick","Bin","displayName"],"mappings":"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"}