'use client'; // D3 장착 지위 아이템 배치 조회 훅 — 여러 작성자 ID 를 모아 한 번에 GET /api/members/equipped-items?ids=. // 댓글 목록/프로필에서 작성자별 배지·닉네임 이펙트 렌더용. 익명 허용. import { useEffect, useState } from 'react'; import { fetchApi } from '@/lib/utils/client'; import type { EquippedItem, EquippedItemsResponse } from '@/types/reward'; type EquippedMap = Record; export default function useEquippedItems(memberIDs: (number|null|undefined)[]): EquippedMap { const [map, setMap] = useState({}); // 유효 ID 만 정렬·중복 제거해 안정적인 key 생성 (불필요한 재조회 방지) const ids = Array.from(new Set(memberIDs.filter((id): id is number => typeof id === 'number' && id > 0))).sort((a, b) => a - b); const key = ids.join(','); useEffect(() => { if (ids.length === 0) { setMap({}); return; } let cancelled = false; (async () => { const res = await fetchApi(`/api/members/equipped-items?ids=${key}`, { silent: true }); if (cancelled) { return; } if (res.success && res.data) { const next: EquippedMap = {}; for (const m of res.data.members) { next[m.memberID] = m.items; } setMap(next); } else { setMap({}); } })(); return () => { cancelled = true; }; }, [key]); // eslint-disable-line react-hooks/exhaustive-deps return map; }