UNPKG

@kiwicom/orbit-components

Version:

Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.

132 lines (131 loc) 4.58 kB
"use client"; import * as React from "react"; import cx from "clsx"; import Button from "../Button"; import ButtonLink from "../ButtonLink"; import FormLabel from "../FormLabel"; import ErrorFormTooltip from "../ErrorFormTooltip"; import Attachment from "../icons/Attachment"; import CloseCircle from "../icons/CloseCircle"; import getFieldDataState from "../common/getFieldDataState"; import useErrorTooltip from "../ErrorFormTooltip/hooks/useErrorTooltip"; import { spaceAfterClasses } from "../common/tailwind"; const InputFile = /*#__PURE__*/React.forwardRef((props, ref) => { const { placeholder = "No file selected", buttonLabel = "Select file", required, onRemoveFile, dataTest, id, helpClosable = true, spaceAfter, width = "100%", help, error, onFocus, onBlur, name, label, multiple, onChange, disabled = false, allowedFileTypes, tabIndex, fileName, insideInputGroup } = props; const hasTooltip = Boolean(error || help); const { tooltipShown, tooltipShownHover, setTooltipShown, setTooltipShownHover, labelRef, iconRef, handleFocus } = useErrorTooltip({ onFocus, hasTooltip }); const shown = tooltipShown || tooltipShownHover; const onClick = e => { if (iconRef && iconRef.current && iconRef.current.contains(e.target)) { e.preventDefault(); e.stopPropagation(); } }; return ( /*#__PURE__*/ // Disabling because the onClick exists just to stop propagation of events // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions React.createElement("label", { onClick: onClick, ref: labelRef, className: cx("font-base relative block w-full", spaceAfter && spaceAfterClasses[spaceAfter]), style: { width } }, /*#__PURE__*/React.createElement("input", { "data-test": dataTest, id: id, disabled: disabled, "aria-required": required, multiple: multiple, "data-state": insideInputGroup && typeof error === "undefined" ? undefined : getFieldDataState(!!props.error), type: "file", name: name, onChange: onChange, onFocus: handleFocus, onBlur: onBlur, accept: Array.isArray(allowedFileTypes) ? allowedFileTypes.join(",") : allowedFileTypes, tabIndex: tabIndex ? Number(tabIndex) : undefined, className: "peer pointer-events-none absolute h-0 opacity-0" }), label && /*#__PURE__*/React.createElement(FormLabel, { filled: !!fileName, required: required, error: !!error, help: !!help, labelRef: labelRef, iconRef: iconRef, onMouseEnter: () => setTooltipShownHover(true), onMouseLeave: () => setTooltipShownHover(false) }, label), /*#__PURE__*/React.createElement("div", { className: cx("peer-focus:outline-blue-normal peer-focus:outline peer-focus:outline-[2px]", "box-border flex items-center", "h-form-box-normal ps-[6px]", error ? "shadow-form-element-error" : "shadow-form-element", !disabled && (error ? "hover:shadow-form-element-error-hover" : "hover:shadow-form-element-hover"), "duration-fast transition-shadow ease-in-out", "rounded-normal", disabled ? "bg-form-element-disabled-background cursor-not-allowed" : "bg-form-element-background cursor-pointer") }, /*#__PURE__*/React.createElement(Button, { type: "secondary", disabled: disabled, size: "small", iconLeft: /*#__PURE__*/React.createElement(Attachment, null), asComponent: "div", role: "button" }, buttonLabel), /*#__PURE__*/React.createElement("div", { className: cx("font-base ps-sm w-full truncate", error ? "text-red-normal" : "text-ink-normal"), ref: ref }, fileName || placeholder), fileName && /*#__PURE__*/React.createElement(ButtonLink, { type: "primary", disabled: disabled, compact: true, iconLeft: /*#__PURE__*/React.createElement(CloseCircle, { ariaLabel: "remove", color: "secondary" }), onClick: ev => { ev.preventDefault(); if (onRemoveFile) { onRemoveFile(); } } })), !insideInputGroup && hasTooltip && /*#__PURE__*/React.createElement(ErrorFormTooltip, { help: help, error: error, helpClosable: helpClosable, inputSize: "normal", referenceElement: labelRef, shown: shown, onShown: setTooltipShown })) ); }); InputFile.displayName = "InputFile"; export default InputFile;