Spaces:
Sleeping
Sleeping
| "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> | |
| ); | |
| } | |