Openstatus
www.openstatus.dev
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}