import { useState, useEffect } from 'react' import { Link } from 'react-router-dom' import { DndContext, DragOverlay, closestCenter, PointerSensor, KeyboardSensor, useSensor, useSensors, } from '@dnd-kit/core' import { SortableContext, sortableKeyboardCoordinates, useSortable, rectSortingStrategy, arrayMove, } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' const MOCK_SYMBOLS = [ { id: 1, type: '아케인', region: '소멸의 여로', image_url: 'https://s3.caadiq.co.kr/maplestory/symbol/아케인심볼(소멸의 여로).webp', max_level: 20, daily_default: 20, weekly_default: 45 }, { id: 2, type: '아케인', region: '츄츄 아일랜드', image_url: 'https://s3.caadiq.co.kr/maplestory/symbol/아케인심볼(츄츄 아일랜드).webp', max_level: 20, daily_default: 20, weekly_default: 45 }, { id: 3, type: '어센틱', region: '세르니움', image_url: 'https://s3.caadiq.co.kr/maplestory/symbol/어센틱심볼(세르니움).webp', max_level: 11, daily_default: 10, weekly_default: 25 }, { id: 4, type: '그랜드 어센틱', region: '탈라하트', image_url: 'https://s3.caadiq.co.kr/maplestory/symbol/그랜드 어센틱심볼(탈라하트).webp', max_level: 11, daily_default: 0, weekly_default: 30 }, ] const TYPE_COLOR = { '아케인': { text: 'text-violet-300', bg: 'bg-violet-500/15', border: 'border-violet-500/30' }, '어센틱': { text: 'text-sky-300', bg: 'bg-sky-500/15', border: 'border-sky-500/30' }, '그랜드 어센틱': { text: 'text-amber-300', bg: 'bg-amber-500/15', border: 'border-amber-500/30' }, } function SymbolCardContent({ symbol, dragging = false }) { const color = TYPE_COLOR[symbol.type] return (
{symbol.image_url ? ( ) : ( ? )}

{symbol.region}

{symbol.type}
만렙 {symbol.max_level} 일퀘 {symbol.daily_default} 주간퀘 {symbol.weekly_default}
) } function SortableSymbolCard({ symbol }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, setActivatorNodeRef } = useSortable({ id: symbol.id, transition: { duration: 200, easing: 'cubic-bezier(0.25, 0.1, 0.25, 1)' }, }) const style = { transform: CSS.Transform.toString(transform), transition } return (
) } export default function SymbolList() { const [items, setItems] = useState(MOCK_SYMBOLS) const [activeId, setActiveId] = useState(null) const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 5 } }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }) ) const handleDragEnd = (event) => { const { active, over } = event setActiveId(null) if (!over || active.id === over.id) return const oldIdx = items.findIndex((s) => s.id === active.id) const newIdx = items.findIndex((s) => s.id === over.id) setItems(arrayMove(items, oldIdx, newIdx)) } const activeSymbol = items.find((s) => s.id === activeId) return (

심볼 관리

심볼 정보 및 레벨별 필요 개수/메소를 관리합니다

+ 심볼 추가
{items.length === 0 ? (
🔮

등록된 심볼이 없습니다

첫 심볼 추가하기 →
) : ( setActiveId(e.active.id)} onDragCancel={() => setActiveId(null)} onDragEnd={handleDragEnd} > s.id)} strategy={rectSortingStrategy}>
{items.map((s) => ( ))}
{activeSymbol ? : null}
)}
) }