"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { createRepository } from "@/actions/repositories"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "sonner"; import { Loader2, Lock, Globe } from "lucide-react"; import Link from "next/link"; export function NewRepoForm({ username }: { username: string }) { const router = useRouter(); const [loading, setLoading] = useState(false); const [formData, setFormData] = useState({ name: "", description: "", visibility: "public" as "public" | "private", }); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setLoading(true); try { await createRepository({ name: formData.name, description: formData.description || undefined, visibility: formData.visibility, }); toast.success("Repository created!"); router.push(`/${username}/${formData.name.toLowerCase().replace(/\s+/g, "-")}`); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to create repository"); } finally { setLoading(false); } } return (

Create a new repository

A repository contains all project files, including the revision history.

{username} / setFormData({ ...formData, name: e.target.value })} placeholder="my-awesome-project" required pattern="^[a-zA-Z0-9_.-]+$" className="flex-1 bg-input/50" />

Great repository names are short and memorable.