import { cloneElement, ReactElement, ReactNode } from "react";
import { faExclamationTriangle, faQuestionCircle } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Label from "@radix-ui/react-label";
import { twMerge } from "tailwind-merge";
import { Tooltip } from "../Tooltip";
export type FormLabelProps = {
id?: string;
isRequired?: boolean;
isOptional?: boolean;
label?: ReactNode;
icon?: ReactNode;
className?: string;
tooltipClassName?: string;
tooltipText?: ReactNode;
};
export const FormLabel = ({
id,
label,
isRequired,
icon,
className,
isOptional,
tooltipClassName,
tooltipText
}: FormLabelProps) => (
{label}
{isRequired && *}
{isOptional && - Optional}
{icon && !tooltipText && (
{icon}
)}
{tooltipText && (
)}
);
export type FormHelperTextProps = {
isError?: boolean;
text?: ReactNode;
};
export const FormHelperText = ({ isError, text }: FormHelperTextProps) => (
{isError && (
)}
{text}
);
export type FormControlProps = {
id?: string;
isRequired?: boolean;
isOptional?: boolean;
isError?: boolean;
label?: ReactNode;
helperText?: ReactNode;
errorText?: ReactNode;
children: JSX.Element;
className?: string;
icon?: ReactNode;
tooltipText?: ReactElement | string;
tooltipClassName?: string;
};
export const FormControl = ({
children,
isRequired,
isOptional,
label,
helperText,
errorText,
id,
isError,
icon,
className,
tooltipText,
tooltipClassName
}: FormControlProps): JSX.Element => {
return (
{typeof label === "string" ? (
) : (
label
)}
{cloneElement(children, { isRequired, "data-required": isRequired, isError })}
{!isError && helperText && }
{isError && errorText && }
);
};