'use client'; import { FormEvent, useState } from 'react'; import { useRouter } from 'next/navigation'; import { apiFetch } from '../../lib/api'; type Artifact = { id: number; name: string; description: string; rarity: string; image_url?: string | null; }; const RARITY_OPTIONS = [ { value: 'common', label: 'Обычный' }, { value: 'rare', label: 'Редкий' }, { value: 'epic', label: 'Эпический' }, { value: 'legendary', label: 'Легендарный' } ]; interface Props { token: string; artifacts: Artifact[]; } export function AdminArtifactManager({ token, artifacts }: Props) { const router = useRouter(); const [selectedId, setSelectedId] = useState('new'); const [name, setName] = useState(''); const [description, setDescription] = useState(''); const [rarity, setRarity] = useState('rare'); const [imageUrl, setImageUrl] = useState(''); const [status, setStatus] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const resetForm = () => { setName(''); setDescription(''); setRarity('rare'); setImageUrl(''); }; const handleSelect = (value: string) => { if (value === 'new') { setSelectedId('new'); resetForm(); setStatus(null); setError(null); return; } const id = Number(value); const artifact = artifacts.find((item) => item.id === id); if (!artifact) { return; } setSelectedId(id); setName(artifact.name); setDescription(artifact.description); setRarity(artifact.rarity); setImageUrl(artifact.image_url ?? ''); }; const handleSubmit = async (event: FormEvent) => { event.preventDefault(); setLoading(true); setStatus(null); setError(null); const payload = { name, description, rarity, image_url: imageUrl || null }; try { if (selectedId === 'new') { await apiFetch('/api/admin/artifacts', { method: 'POST', body: JSON.stringify(payload), authToken: token }); setStatus('Артефакт создан'); resetForm(); } else { await apiFetch(`/api/admin/artifacts/${selectedId}`, { method: 'PUT', body: JSON.stringify(payload), authToken: token }); setStatus('Артефакт обновлён'); } router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : 'Не удалось сохранить артефакт'); } finally { setLoading(false); } }; const handleDelete = async () => { if (selectedId === 'new') { return; } setLoading(true); setStatus(null); setError(null); try { await apiFetch(`/api/admin/artifacts/${selectedId}`, { method: 'DELETE', authToken: token }); setStatus('Артефакт удалён'); setSelectedId('new'); resetForm(); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : 'Не удалось удалить артефакт'); } finally { setLoading(false); } }; return (

Артефакты

Подготовьте коллекционные награды за миссии: укажите название, редкость и изображение. Артефакты можно привязывать в карточке миссии.