"use client"; import { useState, useEffect, useTransition } from "react"; import { useSession } from "next-auth/react"; import Card from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import HouseForm from "./HouseForm"; import RequestList from "./RequestList"; import Alert from "@/components/ui/Alert"; import { deleteHouse, leaveHouse } from "@/actions/houses/update"; import { inviteUser } from "@/actions/houses/invitations"; interface House { id: string; name: string; description: string | null; creator: { id: string; username: string; avatar: string | null; }; memberships?: Array<{ id: string; role: string; user: { id: string; username: string; avatar: string | null; score?: number; level?: number; }; }>; } interface User { id: string; username: string; avatar: string | null; } interface HouseManagementProps { house: House | null; users?: User[]; requests?: Array<{ id: string; requester: { id: string; username: string; avatar: string | null; }; status: string; createdAt: string; }>; onUpdate?: () => void; } interface Request { id: string; requester: { id: string; username: string; avatar: string | null; }; status: string; createdAt: string; } export default function HouseManagement({ house, users = [], requests: initialRequests = [], onUpdate, }: HouseManagementProps) { const { data: session } = useSession(); const [isEditing, setIsEditing] = useState(false); const [showInviteForm, setShowInviteForm] = useState(false); const [selectedUserId, setSelectedUserId] = useState(""); const [requests, setRequests] = useState(initialRequests); const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const userRole = house?.memberships?.find( (m) => m.user.id === session?.user?.id )?.role; const isOwner = userRole === "OWNER"; const isAdmin = userRole === "ADMIN" || isOwner; const pendingRequests = requests.filter((r) => r.status === "PENDING"); useEffect(() => { const fetchRequests = async () => { if (!house || !isAdmin) return; try { const response = await fetch(`/api/houses/${house.id}/requests?status=PENDING`); if (response.ok) { const data = await response.json(); setRequests(data); } } catch (error) { console.error("Error fetching requests:", error); } }; fetchRequests(); }, [house?.id, isAdmin]); const handleDelete = () => { if (!house || !confirm("Êtes-vous sûr de vouloir supprimer cette maison ?")) { return; } setError(null); startTransition(async () => { const result = await deleteHouse(house.id); if (result.success) { onUpdate?.(); } else { setError(result.error || "Erreur lors de la suppression"); } }); }; const handleLeave = () => { if (!house || !confirm("Êtes-vous sûr de vouloir quitter cette maison ?")) { return; } setError(null); startTransition(async () => { const result = await leaveHouse(house.id); if (result.success) { onUpdate?.(); } else { setError(result.error || "Erreur lors de la sortie"); } }); }; const handleInvite = () => { if (!house || !selectedUserId) return; setError(null); setSuccess(null); startTransition(async () => { const result = await inviteUser(house.id, selectedUserId); if (result.success) { setSuccess("Invitation envoyée"); setShowInviteForm(false); setSelectedUserId(""); onUpdate?.(); } else { setError(result.error || "Erreur lors de l'envoi de l'invitation"); } }); }; const availableUsers = users.filter( (u) => u.id !== session?.user?.id && !house?.memberships?.some((m) => m.user.id === u.id) ); if (!house) { return (

Ma Maison

Vous n'êtes membre d'aucune maison pour le moment.

); } return (

{house.name}

{house.description && (

{house.description}

)}
{isAdmin && ( <> {isOwner && ( )} )} {!isOwner && ( )}
{error && {error}} {success && {success}} {isEditing ? ( { setIsEditing(false); onUpdate?.(); }} onCancel={() => setIsEditing(false)} /> ) : (

Membres ({house.memberships?.length ?? 0})

{(house.memberships || []).map((membership) => { const isCurrentUser = membership.user.id === session?.user?.id; const roleColor = membership.role === "OWNER" ? "var(--accent)" : membership.role === "ADMIN" ? "var(--primary)" : "var(--muted-foreground)"; return (
{membership.user.avatar && ( {membership.user.username} )}
{membership.user.username} {isCurrentUser && " (Vous)"} {membership.user.score} pts {" • "} Niveau {membership.user.level}
{membership.role === "OWNER" && "👑 "} {membership.role}
); })}
{isAdmin && (
{showInviteForm ? (
) : ( )}
)}
)}
{isAdmin && pendingRequests.length > 0 && (

Demandes d'adhésion

)}
); }