'use client';
// D3 장착 지위 아이템 렌더 — 댓글/게시글 작성자·프로필 옆 배지 + 닉네임 이펙트.
// EquippedItem[] 을 직접 받는 프레젠테이션 컴포넌트 (배치 조회는 상위에서 useEquippedItems 로).
import '@/app/styles/reward.scss';
import { EquipSlot, ItemKind, parseEffectPayload } from '@/types/reward';
import type { EquippedItem } from '@/types/reward';
interface BadgeProps {
items: EquippedItem[]|undefined|null;
}
// 배지 슬롯만 렌더 (닉네임 옆 아이콘/라벨). 닉네임 이펙트는 NicknameText 로 분리.
export function EquippedBadge({ items }: BadgeProps)
{
if (!items || items.length === 0) {
return null;
}
const badge = items.find(i => i.slot === EquipSlot.Badge || i.kind === ItemKind.Badge);
if (!badge) {
return null;
}
const payload = parseEffectPayload(badge.effectPayload);
const label = payload?.label ?? badge.productName;
return (
{badge.thumbnail ? (
// eslint-disable-next-line @next/next/no-img-element
) : payload?.icon ? (
{payload.icon}
) : null}
{label}
);
}
interface NicknameProps {
name: string;
items: EquippedItem[]|undefined|null;
className?: string;
}
// 닉네임 이펙트 슬롯 적용 — 색상/강조. 이펙트 없으면 평범한 텍스트.
export function NicknameText({ name, items, className }: NicknameProps)
{
const effect = items?.find(i => i.slot === EquipSlot.NicknameEffect || i.kind === ItemKind.NicknameEffect);
const payload = parseEffectPayload(effect?.effectPayload);
if (!effect || !payload) {
return {name};
}
const animCls = payload.animation ? ` nickname-effect--${payload.animation}` : '';
return (
{name}
);
}
interface RowProps {
name: string;
items: EquippedItem[]|undefined|null;
className?: string;
}
// 닉네임 이펙트 + 배지를 한 줄로 (작성자 표시 공용).
export function EquippedNickname({ name, items, className }: RowProps)
{
return (
);
}