"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@openstatus/ui/components/ui/form"; import { Form } from "@openstatus/ui/components/ui/form"; import { Input } from "@openstatus/ui/components/ui/input"; import { cn } from "@openstatus/ui/lib/utils"; import { isTRPCClientError } from "@trpc/client"; import React, { useTransition } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { FormCardContent, FormCardSeparator, } from "@/components/forms/form-card"; import { useFormSheetDirty } from "@/components/forms/form-sheet"; import { CheckboxTree } from "@/components/ui/checkbox-tree"; import { TelegramConnectionFlow } from "../components/telegram-connection-flow"; import { TelegramFormActions } from "../components/telegram-form-actions"; import { TelegramManualInput } from "../components/telegram-manual-input"; const schema = z.object({ name: z.string(), provider: z.literal("telegram"), data: z.object({ chatId: z.string(), }), monitors: z.array(z.number()), }); export type FormValues = z.infer; export function FormTelegram({ monitors, defaultValues, onSubmit, className, ...props }: Omit, "onSubmit"> & { defaultValues?: FormValues; onSubmit: (values: FormValues) => Promise; monitors: { id: number; name: string }[]; }) { const form = useForm({ resolver: zodResolver(schema), defaultValues: defaultValues ?? { name: "", provider: "telegram", data: { chatId: "", }, monitors: [], }, }); const [isPending, startTransition] = useTransition(); const { setIsDirty } = useFormSheetDirty(); const formIsDirty = form.formState.isDirty; React.useEffect(() => { setIsDirty(formIsDirty); }, [formIsDirty, setIsDirty]); // Check if we're editing an existing notification (has chatID) or creating a new one const isEditMode = React.useMemo(() => { return Boolean(defaultValues?.data?.chatId); }, [defaultValues]); const [mode, setMode] = React.useState<"qr" | "manual" | null>( isEditMode ? null : "qr", ); function submitAction(values: FormValues) { if (isPending) return; startTransition(async () => { try { const promise = onSubmit(values); toast.promise(promise, { loading: "Saving...", success: "Saved", error: (error) => { if (isTRPCClientError(error)) { return error.message; } return "Failed to save"; }, }); await promise; // Reset UI state after successful submission setMode(null); form.reset(); } catch (error) { console.error(error); } }); } return (
( Name Enter a descriptive name for your notifier. )} />
{isEditMode ? ( // Edit mode: Show editable chatID input only ) : ( // Create mode: Show QR/manual connection flow )}
( Monitors Select the monitors you want to notify. ({ id: m.id, label: m.name, })), }, ]} value={field.value ?? []} onValueChange={field.onChange} /> )} /> ); }