import { useId } from "@radix-ui/react-id"; import * as Label from "@radix-ui/react-label"; import * as PrimitiveSwitch from "@radix-ui/react-switch"; import React, { useState } from "react"; import classNames from "@lib/classNames"; type SwitchProps = React.ComponentProps<typeof PrimitiveSwitch.Root> & { label: string; }; export default function Switch(props: SwitchProps) { const { label, onCheckedChange, ...primitiveProps } = props; const [checked, setChecked] = useState(props.defaultChecked || false); const onPrimitiveCheckedChange = (change: boolean) => { if (onCheckedChange) { onCheckedChange(change); } setChecked(change); }; const id = useId(); return ( <div className="flex h-[20px] items-center"> <PrimitiveSwitch.Root className={classNames(checked ? "bg-gray-900" : "bg-gray-400", "h-[20px] w-[36px] rounded-sm p-0.5")} checked={checked} onCheckedChange={onPrimitiveCheckedChange} {...primitiveProps}> <PrimitiveSwitch.Thumb id={id} className={classNames( "block h-[16px] w-[16px] bg-white transition-transform", checked ? "translate-x-[16px]" : "translate-x-0" )} /> </PrimitiveSwitch.Root> {label && ( <Label.Root htmlFor={id} className="cursor-pointer align-text-top text-sm font-medium text-neutral-700 ltr:ml-3 rtl:mr-3"> {label} </Label.Root> )} </div> ); }