"use client"; import * as React from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { toast } from "sonner"; import { Loader2, ArrowLeft, Plug, Plus } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardHeader, CardTitle, CardDescription, } from "@/components/ui/card"; type ProviderInfo = { id: string; name: string; description: string; configFields: ConfigField[]; supportsOAuth: boolean; }; type ConfigField = { key: string; label: string; type: string; placeholder?: string; required?: boolean; helpText?: string; options?: { value: string; label: string }[]; }; export default function NewIntegrationPage() { const router = useRouter(); const searchParams = useSearchParams(); const preselectedProvider = searchParams.get("provider") || ""; const [providers, setProviders] = React.useState([]); const [selectedProvider, setSelectedProvider] = React.useState(preselectedProvider); const [name, setName] = React.useState(""); const [config, setConfig] = React.useState>({}); const [loading, setLoading] = React.useState(true); const [creating, setCreating] = React.useState(false); React.useEffect(() => { fetch("/api/integrations") .then((r) => r.json()) .then((data) => { setProviders(data.providers || []); setLoading(false); }) .catch(() => setLoading(false)); }, []); React.useEffect(() => { if (selectedProvider) { const p = providers.find((pr) => pr.id === selectedProvider); if (p && !name) { setName(p.name); } } }, [selectedProvider, providers, name]); const provider = providers.find((p) => p.id === selectedProvider); const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedProvider) { toast.error("Select a provider"); return; } setCreating(true); try { const res = await fetch("/api/integrations", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ provider: selectedProvider, name: name || provider?.name || selectedProvider, config, }), }); if (res.ok) { const data = await res.json(); toast.success("Integration created"); if (provider?.supportsOAuth) { window.location.href = `/api/integrations/oauth/${selectedProvider}/authorize?integrationId=${data.integration.id}`; } else { router.push(`/settings/integrations/${data.integration.id}`); } } else { const data = await res.json(); toast.error(data.error || "Failed to create integration"); } } catch { toast.error("Failed to create integration"); } finally { setCreating(false); } }; if (loading) { return (
); } return (
{!selectedProvider ? (

Choose a provider

{providers.map((p) => ( ))}
) : ( Configure {provider?.name} {provider?.description}
setName(e.target.value)} placeholder={provider?.name || "My Integration"} />
{provider?.configFields.map((field) => (
{field.type === "select" && field.options ? ( ) : ( setConfig((c) => ({ ...c, [field.key]: e.target.value, })) } placeholder={field.placeholder} required={field.required} /> )} {field.helpText && (

{field.helpText}

)}
))} {provider?.supportsOAuth && (

After creating, you'll be redirected to authorize with{" "} {provider.name}.

)}
)}
); }