import { RadioGroup } from "@headlessui/react"; import clsx from "clsx"; import CheckEmptyCircle from "../icons/CheckEmptyCircleIcon"; import HintTooltip from "../tooltips/HintTooltip"; import { useState, useEffect } from "react"; import { Colors } from "../../../application/enums/shared/Colors"; type ItemDto = { value: string | number; name: string; color?: Colors; icon?: JSX.Element; disabled?: boolean; renderName?: React.ReactNode; }; export default function InputRadioGroupCards({ title, name, options, value, onChange, required, disabled, help, hint, columns, className, display, }: { title?: string; name?: string; options: ItemDto[]; value?: string; onChange?: (value: string) => void; required?: boolean; disabled?: boolean; help?: string; hint?: React.ReactNode; columns?: number; className?: string; display?: "name" | "value" | "nameAndValue"; }) { const [displayType, setDisplayType] = useState<"name" | "value" | "nameAndValue">("name"); const [actualValue, setActualValue] = useState(value ?? ""); useEffect(() => { setActualValue(value ?? ""); }, [value]); useEffect(() => { if (onChange && value !== actualValue) { onChange(actualValue); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [actualValue]); useEffect(() => { if (display) { setDisplayType(display); } else { const hasNames = options.some((item) => item.name); if (!hasNames) { setDisplayType("value"); } else { const namesAreDifferent = options.some((item) => item.name !== item.value.toString()); if (namesAreDifferent) { setDisplayType("nameAndValue"); } else { setDisplayType("name"); } } } }, [display, options]); return ( setActualValue(e)} className={className}> {title && (
{title} {required && *}
{help && }
{hint}
)}
{options.map((item) => ( clsx( checked ? "border-transparent bg-gray-50" : "border-gray-300", active ? "border-gray-300 ring-1 ring-gray-300" : "", "relative flex rounded-lg border p-3 shadow-sm focus:outline-none", disabled || item.disabled ? "cursor-not-allowed bg-gray-100" : "cursor-pointer" ) } > {({ checked, active }) => ( <> {item.icon ? (
{item.icon}
) : ( <> {["name", "nameAndValue"].includes(displayType) ? {item.renderName ? item.renderName : item.name} : item.value} {["nameAndValue", "value"].includes(displayType) && ( {item.value} )} )}
))}
); }