"use client"; import { useState, useEffect, use } from "react"; import { useRouter } from "next/navigation"; import { getRepositoryWithStars, updateRepository, deleteRepository } from "@/actions/repositories"; import { useSession } from "@/lib/auth-client"; 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 { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { toast } from "sonner"; import { Loader2, Lock, Globe, Trash2, AlertTriangle } from "lucide-react"; import Link from "next/link"; type RepoData = { id: string; name: string; description: string | null; visibility: "public" | "private"; ownerId: string; }; export default function RepoSettingsPage({ params, }: { params: Promise<{ username: string; repo: string }>; }) { const { username, repo: repoName } = use(params); const router = useRouter(); const { data: session } = useSession(); const [repo, setRepo] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(false); const [deleteConfirm, setDeleteConfirm] = useState(""); const [deleteOpen, setDeleteOpen] = useState(false); const [formData, setFormData] = useState({ name: "", description: "", visibility: "public" as "public" | "private", }); useEffect(() => { async function loadRepo() { try { const data = await getRepositoryWithStars(username, repoName); if (data) { setRepo(data); setFormData({ name: data.name, description: data.description || "", visibility: data.visibility, }); } } finally { setLoading(false); } } loadRepo(); }, [username, repoName]); const isOwner = session?.user?.id === repo?.ownerId; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!repo) return; setSaving(true); try { const updated = await updateRepository(repo.id, { name: formData.name, description: formData.description, visibility: formData.visibility, }); toast.success("Settings saved"); if (updated.name !== repo.name) { router.push(`/${username}/${updated.name}/settings`); } setRepo({ ...repo, ...updated }); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to save settings"); } finally { setSaving(false); } } async function handleDelete() { if (!repo || deleteConfirm !== repo.name) return; setDeleting(true); try { await deleteRepository(repo.id); toast.success("Repository deleted"); router.push(`/${username}`); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to delete repository"); setDeleting(false); } } if (loading) { return (
); } if (!repo || !isOwner) { return (

Access Denied

You don't have permission to access this page

); } return (

Repository Settings

Manage settings for{" "} {username}/{repo.name}

General Basic repository information
setFormData({ ...formData, name: e.target.value })} pattern="^[a-zA-Z0-9_.-]+$" required />