Build, Test, and Push CFDM Docker Image / test (push) Successful in 4m5s
Build, Test, and Push CFDM Docker Image / build-and-push (push) Successful in 2m26s
Build, Test, and Push CFDM Docker Image / update-wiki (push) Successful in 8s
Build, Test, and Push CFDM Docker Image / create-release (push) Has been skipped
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import type { ReactNode } from 'react'
|
|
import type { FieldValues, UseFormReturn } from 'react-hook-form'
|
|
import { FormProvider } from 'react-hook-form'
|
|
import {
|
|
Sheet,
|
|
SheetContent,
|
|
SheetDescription,
|
|
SheetFooter,
|
|
SheetHeader,
|
|
SheetTitle,
|
|
} from '@cfdm/ui/components/sheet'
|
|
import { cn } from '@cfdm/ui/lib/utils'
|
|
|
|
interface FormSheetProps<T extends FieldValues> {
|
|
open: boolean
|
|
onOpenChange: (open: boolean) => void
|
|
title: string
|
|
description?: string
|
|
form: UseFormReturn<T>
|
|
onSubmit: (values: T) => void | Promise<void>
|
|
children: ReactNode
|
|
footer?: ReactNode
|
|
className?: string
|
|
contentClassName?: string
|
|
}
|
|
|
|
export function FormSheet<T extends FieldValues>({
|
|
open,
|
|
onOpenChange,
|
|
title,
|
|
description,
|
|
form,
|
|
onSubmit,
|
|
children,
|
|
footer,
|
|
className,
|
|
contentClassName,
|
|
}: FormSheetProps<T>) {
|
|
const handleSubmit = form.handleSubmit(onSubmit)
|
|
|
|
return (
|
|
<Sheet open={open} onOpenChange={onOpenChange}>
|
|
<SheetContent className={cn(className)}>
|
|
<SheetHeader>
|
|
<SheetTitle>{title}</SheetTitle>
|
|
{description && <SheetDescription>{description}</SheetDescription>}
|
|
</SheetHeader>
|
|
<FormProvider {...form}>
|
|
<form
|
|
onSubmit={handleSubmit}
|
|
className={cn('flex flex-1 flex-col gap-4 px-4', contentClassName)}
|
|
>
|
|
{children}
|
|
{footer && <SheetFooter>{footer}</SheetFooter>}
|
|
</form>
|
|
</FormProvider>
|
|
</SheetContent>
|
|
</Sheet>
|
|
)
|
|
}
|