"use client"; import { useState, useEffect, useCallback } from "react"; import Image from "next/image"; import Link from "next/link"; import { Loader2, Plus, Trash2, ChevronUp, ChevronDown, Pencil, Save, Check, } from "lucide-react"; import type { TeamMember } from "@/types/content"; type Member = TeamMember & { id: number }; export default function TeamEditorPage() { const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [saved, setSaved] = useState(false); useEffect(() => { fetch("/api/admin/team") .then((r) => r.json()) .then(setMembers) .finally(() => setLoading(false)); }, []); const saveOrder = useCallback(async (updated: Member[]) => { setMembers(updated); setSaving(true); await fetch("/api/admin/team/reorder", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ids: updated.map((m) => m.id) }), }); setSaving(false); setSaved(true); setTimeout(() => setSaved(false), 2000); }, []); function moveItem(index: number, direction: -1 | 1) { const newIndex = index + direction; if (newIndex < 0 || newIndex >= members.length) return; const updated = [...members]; [updated[index], updated[newIndex]] = [updated[newIndex], updated[index]]; saveOrder(updated); } async function deleteMember(id: number) { if (!confirm("Удалить этого участника?")) return; await fetch(`/api/admin/team/${id}`, { method: "DELETE" }); setMembers((prev) => prev.filter((m) => m.id !== id)); } if (loading) { return (
Загрузка...
); } return (

Команда

{(saving || saved) && ( {saving ? ( ) : ( )} {saving ? "Сохранение..." : "Сохранено!"} )} Добавить
{members.map((member, i) => (
{member.name}

{member.name}

{member.role}

))}
); }