"use client"; // ============================================================================ // Workspace Invites Page // ============================================================================ import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import { Loader2, UserPlus, Mail, Check, X, Clock } from "lucide-react"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { invitesApi } from "@/lib/api"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { toast } from "sonner"; import type { WorkspaceInvite } from "@/lib/types/api"; // ============================================================================ // Component // ============================================================================ export default function InvitesPage() { const params = useParams(); const workspaceId = params?.workspaceId as string; const [invites, setInvites] = useState([]); const [loading, setLoading] = useState(true); const [showDialog, setShowDialog] = useState(false); const [username, setUsername] = useState(""); useEffect(() => { loadInvites(); }, [workspaceId]); const loadInvites = async () => { try { setLoading(true); const response = await invitesApi.list(workspaceId, { size: 100 }); setInvites(response.items); } catch (err) { console.error("Failed to load invites:", err); } finally { setLoading(false); } }; const handleCreateInvite = async () => { if (!username.trim()) return; const cleanUsername = username.trim().replace(/^@/, ""); await toast.promise( (async () => { const invite = await invitesApi.create(workspaceId, { username: cleanUsername, }); setInvites((prev) => [invite, ...prev]); setShowDialog(false); setUsername(""); return invite; })(), { loading: "Отправка приглашения...", success: `Приглашение отправлено @${cleanUsername}`, error: (err) => { const errorMessage = err?.error?.message || err?.detail; if (errorMessage?.includes("not found")) { return `Пользователь @${cleanUsername} не зарегистрирован на платформе`; } return errorMessage || "Не удалось отправить приглашение"; }, } ); }; const getStatusIcon = (status: WorkspaceInvite["status"]) => { switch (status) { case "pending": return ; case "accepted": return ; case "rejected": return ; } }; const getStatusText = (status: WorkspaceInvite["status"]) => { switch (status) { case "pending": return "Ожидает"; case "accepted": return "Принято"; case "rejected": return "Отклонено"; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString("ru-RU", { day: "numeric", month: "short", year: "numeric", }); }; return ( <>

Приглашения

Приглашения в воркспейс через Telegram

Пригласить участника Введите username Telegram пользователя для отправки приглашения через бота
setUsername(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { handleCreateInvite(); } }} />
{loading ? (
) : invites.length === 0 ? (

Нет приглашений

Пригласите участников в воркспейс через Telegram

) : ( Username Статус Дата {invites.map((invite) => (
@{invite.username}
{getStatusIcon(invite.status)} {getStatusText(invite.status)} {formatDate(invite.created_at)}
))}
)}
); }