SpaceProbe1 / frontend /src /components /dashboard /AddRepoDialog.tsx
a9's picture
Upload 23 files
d53c2af verified
"use client";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Plus, Rocket } from "lucide-react";
const formSchema = z.object({
namespace: z.string().min(1, "Namespace is required"),
repo: z.string().min(1, "Repository name is required"),
});
interface AddRepoDialogProps {
onAdd: (namespace: string, repo: string) => Promise<void>;
}
export function AddRepoDialog({ onAdd }: AddRepoDialogProps) {
const [open, setOpen] = useState(false);
const [isSubmitting, setIsSubmitting] = useState(false);
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
namespace: "",
repo: "",
},
});
async function onSubmit(values: z.infer<typeof formSchema>) {
setIsSubmitting(true);
try {
await onAdd(values.namespace, values.repo);
setOpen(false);
form.reset();
} finally {
setIsSubmitting(false);
}
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button className="bg-accent text-accent-foreground hover:bg-accent/90">
<Plus className="mr-2 h-4 w-4" />
Add Space
</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<div className="mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-accent/10 text-accent">
<Rocket className="h-6 w-6" />
</div>
<DialogTitle>Monitor New Space</DialogTitle>
<DialogDescription>
Enter the Hugging Face Space repository details (e.g., username/space-name).
</DialogDescription>
</DialogHeader>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4 pt-4">
<FormField
control={form.control}
name="namespace"
render={({ field }) => (
<FormItem>
<FormLabel>Namespace / Username</FormLabel>
<FormControl>
<Input placeholder="e.g. google" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="repo"
render={({ field }) => (
<FormItem>
<FormLabel>Space Name</FormLabel>
<FormControl>
<Input placeholder="e.g. gemma-2b" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<DialogFooter className="pt-4">
<Button type="button" variant="outline" onClick={() => setOpen(false)}>
Cancel
</Button>
<Button type="submit" disabled={isSubmitting}>
{isSubmitting ? "Connecting..." : "Start Probing"}
</Button>
</DialogFooter>
</form>
</Form>
</DialogContent>
</Dialog>
);
}