Openstatus www.openstatus.dev
at main 87 lines 2.9 kB view raw
1"use client"; 2 3import { FormCard, FormCardGroup } from "@/components/forms/form-card"; 4import { 5 FormSheetContent, 6 FormSheetDescription, 7 FormSheetFooter, 8 FormSheetHeader, 9 FormSheetTitle, 10 FormSheetTrigger, 11 FormSheetWithDirtyProtection, 12} from "@/components/forms/form-sheet"; 13import { Button } from "@/components/ui/button"; 14import { config } from "@/data/notifications.client"; 15import { useState } from "react"; 16import type { FormValues } from "./form"; 17 18export function FormSheetNotifier({ 19 children, 20 defaultValues, 21 provider, 22 onSubmit, 23 monitors, 24 defaultOpen, 25 ...props 26}: Omit<React.ComponentProps<typeof FormSheetTrigger>, "onSubmit"> & { 27 defaultValues?: FormValues; 28 provider: FormValues["provider"]; 29 onSubmit?: (values: FormValues) => Promise<void>; 30 monitors: { id: number; name: string }[]; 31 defaultOpen?: boolean; 32}) { 33 const [open, setOpen] = useState(defaultOpen ?? false); 34 const Form = provider ? config[provider].form : undefined; 35 36 return ( 37 <FormSheetWithDirtyProtection open={open} onOpenChange={setOpen}> 38 <FormSheetTrigger {...props} asChild> 39 {children} 40 </FormSheetTrigger> 41 <FormSheetContent className="sm:max-w-lg"> 42 <FormSheetHeader> 43 <FormSheetTitle>Notifier</FormSheetTitle> 44 <FormSheetDescription> 45 Configure and update the notifier. 46 </FormSheetDescription> 47 </FormSheetHeader> 48 <FormCardGroup className="overflow-y-auto"> 49 <FormCard className="overflow-auto rounded-none border-none"> 50 {Form && ( 51 <Form 52 id={`notifier-form-${provider}`} 53 className="my-4" 54 onSubmit={async (values) => { 55 await onSubmit?.(values); 56 setOpen(false); 57 }} 58 // @ts-expect-error - defaultValues is not defined in the form component 59 defaultValues={ 60 defaultValues 61 ? { 62 ...defaultValues, 63 data: 64 typeof defaultValues?.data === "string" 65 ? defaultValues?.data 66 : defaultValues?.data && 67 typeof defaultValues.data === "object" && 68 provider in defaultValues.data 69 ? defaultValues.data[provider] 70 : defaultValues?.data, 71 } 72 : undefined 73 } 74 monitors={monitors} 75 /> 76 )} 77 </FormCard> 78 </FormCardGroup> 79 <FormSheetFooter> 80 <Button type="submit" form={`notifier-form-${provider}`}> 81 Submit 82 </Button> 83 </FormSheetFooter> 84 </FormSheetContent> 85 </FormSheetWithDirtyProtection> 86 ); 87}