"use client"; import { useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; interface UserEditorProps { userId: string; currentRole: "user" | "moderator" | "admin"; currentTier: "free" | "pro" | "family"; currentIsDeveloper: boolean; currentIsByokEnabled: boolean; } export function UserEditor({ userId, currentRole, currentTier, currentIsDeveloper, currentIsByokEnabled }: UserEditorProps) { const [role, setRole] = useState<"user" | "moderator" | "admin">(currentRole); const [tier, setTier] = useState<"free" | "pro" | "family">(currentTier); const [isDeveloper, setIsDeveloper] = useState(currentIsDeveloper); const [isByokEnabled, setIsByokEnabled] = useState(currentIsByokEnabled); const [saving, setSaving] = useState(false); async function handleSave() { setSaving(true); try { const res = await fetch(`/api/v1/admin/users/${userId}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ role, tier, isDeveloper, isByokEnabled }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error((data as { error?: string }).error ?? "Failed to save"); } toast.success("User updated successfully"); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to save"); } finally { setSaving(false); } } return (

Enables webhooks and self-serve API keys. Users on a paid tier can also self-enable this.

Enables bring-your-own AI provider keys. Admin-only, no self-serve.

); }