"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import { api } from "@/lib/api" import { Header } from "@/components/Header" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { RefreshCw, Plus, Trash2, AlertCircle } from "lucide-react" import CreateSambaDialog from "@/components/shares/CreateSambaDialog" import CreateNfsDialog from "@/components/shares/CreateNfsDialog" import DeleteConfirmDialog from "@/components/shares/DeleteConfirmDialog" export default function SharesPage() { const router = useRouter() const [activeTab, setActiveTab] = useState<"samba" | "nfs">("samba") const [sambaShares, setSambaShares] = useState([]) const [nfsShares, setNfsShares] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showSambaDialog, setShowSambaDialog] = useState(false) const [showNfsDialog, setShowNfsDialog] = useState(false) const [deleteConfirm, setDeleteConfirm] = useState<{ type: "samba" | "nfs"; name: string } | null>(null) const [deleting, setDeleting] = useState(false) useEffect(() => { const token = localStorage.getItem("access_token") if (!token) { router.push("/login") return } loadShares() }, [router]) const loadShares = async () => { try { setLoading(true) setError(null) const [samba, nfs] = await Promise.all([ api.getSambaShares().catch(() => []), api.getNfsShares().catch(() => []), ]) setSambaShares(samba) setNfsShares(nfs) } catch (err) { setError(err instanceof Error ? err.message : "Failed to load shares") } finally { setLoading(false) } } const handleDeleteSamba = async (name: string) => { try { setDeleting(true) await api.deleteSambaShare(name) setSambaShares(sambaShares.filter((s) => s.name !== name)) setDeleteConfirm(null) } catch (err) { setError(err instanceof Error ? err.message : "Failed to delete share") } finally { setDeleting(false) } } const handleDeleteNfs = async (path: string) => { try { setDeleting(true) await api.deleteNfsShare(path) setNfsShares(nfsShares.filter((s) => s.path !== path)) setDeleteConfirm(null) } catch (err) { setError(err instanceof Error ? err.message : "Failed to delete share") } finally { setDeleting(false) } } const handleSambaCreated = (newShare: any) => { setSambaShares([...sambaShares, newShare]) setShowSambaDialog(false) } const handleNfsCreated = (newShare: any) => { setNfsShares([...nfsShares, newShare]) setShowNfsDialog(false) } return (

File Sharing

Manage Samba (SMB) and NFS network shares

{error && (

Error

{error}

)} {/* Tabs */}
{/* SAMBA TAB */} {activeTab === "samba" && (
Samba Shares
{sambaShares.length === 0 ? (

No Samba shares configured. Create one to get started.

) : (
{sambaShares.map((share) => ( ))}
Name Path Users Perms Comment Actions
{share.name} {share.path} {share.valid_users || "—"} {share.read_only ? "RO" : "RW"} {share.comment || "—"}
)}
)} {/* NFS TAB */} {activeTab === "nfs" && (
NFS Shares
{nfsShares.length === 0 ? (

No NFS shares configured. Create one to get started.

) : (
{nfsShares.map((share) => ( ))}
Path Clients Options Actions
{share.path} {share.clients} {share.options || "—"}
)}
)}
{/* Dialogs */} !open && setDeleteConfirm(null)} type={deleteConfirm?.type === "samba" ? "Samba Share" : "NFS Share"} name={deleteConfirm?.name || ""} onConfirm={() => { if (deleteConfirm?.type === "samba") { handleDeleteSamba(deleteConfirm.name) } else if (deleteConfirm?.type === "nfs") { handleDeleteNfs(deleteConfirm.name) } }} loading={deleting} />
) }