@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
JavaScript
"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;