import type {ValidationResult} from "@react-types/shared"; import type {Meta} from "@storybook/react"; import type {RadioProps, RadioGroupProps} from "../src"; import React from "react"; import {VisuallyHidden} from "@react-aria/visually-hidden"; import {radio, button, cn} from "@heroui/theme"; import {clsx} from "@heroui/shared-utils"; import {Form} from "@heroui/form"; import {RadioGroup, Radio, useRadio} from "../src"; export default { title: "Components/RadioGroup", component: RadioGroup, onChange: {action: "changed"}, argTypes: { color: { control: { type: "select", }, options: ["default", "primary", "secondary", "success", "warning", "danger"], }, size: { control: { type: "select", }, options: ["sm", "md", "lg"], }, isDisabled: { control: { type: "boolean", }, }, validationBehavior: { control: { type: "select", }, options: ["aria", "native"], }, }, } as Meta; const defaultProps = { ...radio.defaultVariants, label: "Options", }; const Template = (args: RadioGroupProps) => { const radioProps = args.description ? { a: { description: "Description for Option A", }, b: { description: "Description for Option B", }, c: { description: "Description for Option C", }, d: { description: "Description for Option D", }, } : { a: {}, b: {}, c: {}, d: {}, }; const items = ( <> Option A Option B Option C Option D ); return args.isRequired ? (
{ alert(`Submitted value: ${e.target["sample"].value}`); e.preventDefault(); }} > {items}
) : ( {items} ); }; const InvalidTemplate = (args: RadioGroupProps) => { const [isInvalid, setIsInvalid] = React.useState(true); const radioProps = args.description ? { a: { description: "Description for Option A", }, b: { description: "Description for Option B", }, c: { description: "Description for Option C", }, d: { description: "Description for Option D", }, } : { a: {}, b: {}, c: {}, d: {}, }; const items = ( <> Option A (Invalid) Option B (Valid) Option C (Valid) Option D (Invalid) ); const validOptions = ["C", "B"]; return args.isRequired ? (
{ e.preventDefault(); alert("Submitted!"); }} > setIsInvalid(!validOptions.includes(value))} > {items}
) : ( {items} ); }; const ControlledTemplate = (args: RadioGroupProps) => { const [selectedItem, setSelectedItem] = React.useState("london"); React.useEffect(() => { // eslint-disable-next-line no-console console.log("isSelected:", selectedItem); }, [selectedItem]); return (
Buenos Aires Sydney London Tokyo

Selected: {selectedItem}

); }; const ServerValidationTemplate = (args: RadioGroupProps) => { const [serverErrors, setServerErrors] = React.useState({}); const onSubmit = (e) => { e.preventDefault(); setServerErrors({ option: "You must choose an option.", }); }; delete args.isInvalid; return (
Option 1 Option 2 Option 3
); }; export const Default = { render: Template, args: { ...defaultProps, }, }; export const IsDisabled = { render: Template, args: { ...defaultProps, isDisabled: true, }, }; export const DefaultChecked = { render: Template, args: { ...defaultProps, defaultValue: "C", }, }; export const IsRequired = { render: Template, args: { ...defaultProps, isRequired: true, }, }; export const WithDescription = { render: Template, args: { ...defaultProps, description: "Please select an option", }, }; export const IsInvalid = { render: InvalidTemplate, args: { ...defaultProps, isRequired: true, description: "Please select an option", }, }; export const WithErrorMessage = { render: Template, args: { ...defaultProps, isRequired: true, isInvalid: true, errorMessage: "The selected option is invalid", }, }; export const WithErrorMessageFunction = { render: Template, args: { ...defaultProps, isRequired: true, errorMessage: (value: ValidationResult) => { if (value.validationDetails.valueMissing) { return "Please select an option"; } }, }, }; export const WithValidation = { render: Template, args: { ...defaultProps, isRequired: true, description: "Please select an option", validate: (value: string) => { if (value === "A") { return "Option A is not allowed"; } }, }, }; export const WithServerValidation = { render: ServerValidationTemplate, args: { ...defaultProps, }, }; export const Row = { render: Template, args: { ...defaultProps, orientation: "horizontal", }, }; export const DisableAnimation = { render: Template, args: { ...defaultProps, disableAnimation: true, }, }; export const Controlled = { render: ControlledTemplate, args: { ...defaultProps, }, }; const CustomRadio = (props: RadioProps) => { const {children, ...otherProps} = props; return ( {children} ); }; export const CustomWithClassNames = () => { return ( Free Pro Enterprise ); }; const RadioCard = (props: RadioProps) => { const { Component, children, description, getBaseProps, getWrapperProps, getInputProps, getLabelProps, getLabelWrapperProps, getControlProps, } = useRadio(props); return (
{children && {children}} {description && ( {description} )}
); }; export const CustomWithHooks = () => { return ( Free Pro Enterprise ); };