Checkbox with Form

PreviousNext

A checkbox with form component

Docs
shadcnui-blockscomponent

Preview

Loading preview…
components/customized/checkbox/checkbox-12.tsx
"use client";

import { useForm, useFormContext } from "react-hook-form";
import { z } from "zod";

import { Checkbox } from "@/registry/ui/checkbox";
import {
  FormControl,
  FormItem,
  FormField,
  FormMessage,
  FormLabel,
  Form,
  FormDescription,
} from "@/registry/ui/form";
import { Button } from "@/registry/ui/button";
import { zodResolver } from "@hookform/resolvers/zod";

type CheckboxWithFormProps<K> = {
  name: keyof K & string;
  title?: string;
  description?: string;
  className?: string;
  disabled?: boolean;
};

export function CheckboxWithForm<K>({
  title,
  description,
  name,
  disabled,
  className,
}: CheckboxWithFormProps<K>) {
  const form = useFormContext();

  return (
    <FormField
      control={form.control}
      name={name}
      render={({ field }) => (
        <FormItem className="w-full flex gap-4 items-center">
          <FormControl>
            <Checkbox
              id={name}
              {...field}
              checked={field.value}
              onCheckedChange={field.onChange}
              disabled={disabled}
              className={className}
            />
          </FormControl>
          <div className="flex flex-col gap-2">
            {title && <FormLabel htmlFor={name}>{title}</FormLabel>}
            {description && <FormDescription>{description}</FormDescription>}
          </div>

          <FormMessage />
        </FormItem>
      )}
    />
  );
}

const schema = z.object({
  isAdmin: z.boolean(),
});

type schemaType = z.infer<typeof schema>;

export default function CheckboxWithFormDemo() {
  const form = useForm<schemaType>({
    resolver: zodResolver(schema),
    defaultValues: {
      isAdmin: false,
    },
    mode: "onBlur",
  });

  const onSubmit = (data: schemaType) => {
    console.log(data);
  };

  return (
    <Form {...form}>
      <form
        onSubmit={form.handleSubmit(onSubmit)}
        className="space-y-4 w-full px-4"
      >
        <CheckboxWithForm<schemaType>
          name="isAdmin"
          title="Admin role"
          description="This role has access to all the features of the application."
        />
        <Button type="submit">Submit</Button>
      </form>
    </Form>
  );
}

Installation

npx shadcn@latest add @shadcnui-blocks/checkbox-12

Usage

import { Checkbox12 } from "@/components/checkbox-12"
<Checkbox12 />