"use client"; // ============================================================================ // Onboarding Page - First Workspace Creation // ============================================================================ import { useState, useRef } from "react"; import { useRouter } from "next/navigation"; import { Building2, Loader2, Megaphone, Upload, Trash2, X } from "lucide-react"; import { workspacesApi } from "@/lib/api"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { STORAGE_KEYS } from "@/lib/utils/constants"; export default function OnboardingPage() { const router = useRouter(); const [name, setName] = useState(""); const [avatarFile, setAvatarFile] = useState(null); const [avatarPreview, setAvatarPreview] = useState(null); const [isCreating, setIsCreating] = useState(false); const [error, setError] = useState(null); const fileInputRef = useRef(null); const handleAvatarChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; if (file.size > 2 * 1024 * 1024) { setError("Размер файла не должен превышать 2 МБ"); return; } setAvatarFile(file); const reader = new FileReader(); reader.onload = () => { setAvatarPreview(reader.result as string); }; reader.readAsDataURL(file); setError(null); }; const handleAvatarRemove = () => { setAvatarFile(null); setAvatarPreview(null); if (fileInputRef.current) { fileInputRef.current.value = ""; } }; const handleCreate = async () => { if (!name.trim()) return; try { setIsCreating(true); setError(null); const workspace = await workspacesApi.create({ name: name.trim(), avatar_file: avatarFile }); // Save as selected workspace localStorage.setItem(STORAGE_KEYS.SELECTED_WORKSPACE, workspace.id); // Redirect to dashboard router.replace(`/dashboard/${workspace.id}`); } catch (err: any) { setError(err?.error?.message || "Не удалось создать воркспейс"); } finally { setIsCreating(false); } }; return (
Добро пожаловать в Smartpost! Создайте свой первый воркспейс для начала работы
{/* Avatar */}
{name.charAt(0).toUpperCase() || "W"}
{avatarPreview && ( )}

PNG, JPG или GIF. Максимум 2 МБ.

setName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { handleCreate(); } }} disabled={isCreating} />

Воркспейс — это изолированное пространство для вашей команды. Вы сможете пригласить участников и настроить права доступа.

{error && (
{error}
)}
); }