/* eslint-disable react-hooks/exhaustive-deps */ "use client"; import { useCallback, useEffect, useMemo } from "react"; import RelicMaker from "../relicBar"; import useUserDataStore from "@/stores/userDataStore"; import { useTranslations } from "next-intl"; import RelicCard from "../card/relicCard"; import useModelStore from '@/stores/modelStore'; import { replaceByParam } from '@/helper'; import useRelicMakerStore from '@/stores/relicMakerStore'; import QuickView from "../quickView"; import { ModalConfig } from "@/types"; import useCurrentDataStore from "@/stores/currentDataStore"; import useDetailDataStore from "@/stores/detailDataStore"; import { getLocaleName } from '@/helper'; import useLocaleStore from "@/stores/localeStore"; import { useShallow } from 'zustand/react/shallow'; export default function RelicsInfo() { const { avatars, setAvatar } = useUserDataStore( useShallow((state) => ({ avatars: state.avatars, setAvatar: state.setAvatar, })) ) const { setSelectedRelicSlot, selectedRelicSlot, setSelectedMainStat, setSelectedRelicSet, setSelectedRelicLevel, setListSelectedSubStats, resetHistory, resetSubStat, listSelectedSubStats, } = useRelicMakerStore( useShallow((state) => ({ setSelectedRelicSlot: state.setSelectedRelicSlot, selectedRelicSlot: state.selectedRelicSlot, setSelectedMainStat: state.setSelectedMainStat, setSelectedRelicSet: state.setSelectedRelicSet, setSelectedRelicLevel: state.setSelectedRelicLevel, setListSelectedSubStats: state.setListSelectedSubStats, resetHistory: state.resetHistory, resetSubStat: state.resetSubStat, listSelectedSubStats: state.listSelectedSubStats, })) ) const { isOpenRelic, setIsOpenRelic, isOpenQuickView, setIsOpenQuickView } = useModelStore( useShallow((state) => ({ isOpenRelic: state.isOpenRelic, setIsOpenRelic: state.setIsOpenRelic, isOpenQuickView: state.isOpenQuickView, setIsOpenQuickView: state.setIsOpenQuickView, })) ) const transI18n = useTranslations("DataPage") const { avatarSelected } = useCurrentDataStore( useShallow((state) => ({ avatarSelected: state.avatarSelected, })) ) const { mapRelicSet, subAffix } = useDetailDataStore( useShallow((state) => ({ mapRelicSet: state.mapRelicSet, subAffix: state.subAffix, })) ) const { locale } = useLocaleStore( useShallow((state) => ({ locale: state.locale, })) ) const handleShow = (modalId: string) => { const modal = document.getElementById(modalId) as HTMLDialogElement | null; if (modal) { modal.showModal(); } }; // Close modal handler const handleCloseModal = (modalId: string) => { const modal = document.getElementById(modalId) as HTMLDialogElement | null; if (modal) { modal.close(); } }; const getRelic = useCallback((slot: string) => { const avatar = avatars[avatarSelected?.ID.toString() || ""]; if (avatar) { const profile = avatar.profileList?.[avatar.profileSelect] ?? avatar.profileList?.[0]; return profile?.relics?.[slot] || null; } return null; }, [avatars, avatarSelected]); const handlerDeleteRelic = (slot: string) => { const avatarKey = avatarSelected?.ID.toString() || ""; const avatar = avatars[avatarKey]; if (avatar) { const profileIndex = avatar.profileSelect; const currentProfile = avatar.profileList?.[profileIndex]; if (currentProfile) { const newRelics = { ...currentProfile.relics }; delete newRelics[slot]; const newProfileList = [...avatar.profileList]; newProfileList[profileIndex] = { ...currentProfile, relics: newRelics, }; setAvatar({ ...avatar, profileList: newProfileList, }); } } }; const handlerChangeRelic = (slot: string) => { const relic = getRelic(slot) setSelectedRelicSlot(slot) resetSubStat() resetHistory(null) if (relic) { setSelectedMainStat(relic.main_affix_id.toString()) setSelectedRelicSet(relic.relic_set_id.toString()) setSelectedRelicLevel(relic.level) const newSubAffixes: { affixId: string, property: string, rollCount: number, stepCount: number }[] = [...listSelectedSubStats]; relic.sub_affixes.forEach((item, index) => { if (newSubAffixes[index]) { newSubAffixes[index].affixId = item.sub_affix_id.toString(); newSubAffixes[index].property = subAffix["5"]?.[item.sub_affix_id.toString()]?.Property || ""; newSubAffixes[index].rollCount = item.count || 0; newSubAffixes[index].stepCount = item.step || 0; } }) setListSelectedSubStats(newSubAffixes) } else { setSelectedMainStat("") setSelectedRelicSet("") setSelectedRelicLevel(15) const newSubAffixes: { affixId: string, property: string, rollCount: number, stepCount: number }[] = [...listSelectedSubStats]; newSubAffixes.forEach((item) => { item.affixId = "" item.property = "" item.rollCount = 0 item.stepCount = 0 }) setListSelectedSubStats(newSubAffixes) } setIsOpenRelic(true) handleShow("action_detail_modal") } const relicEffects = useMemo(() => { const avatar = avatars[avatarSelected?.ID.toString() || ""]; const relicCount: { [key: string]: number } = {}; const currentProfile = avatar?.profileList?.[avatar?.profileSelect] ?? avatar?.profileList?.[0]; if (currentProfile?.relics) { for (const relic of Object.values(currentProfile.relics)) { if (relic) { relicCount[relic.relic_set_id] = (relicCount[relic.relic_set_id] || 0) + 1; } } } const listEffects: { key: string, count: number }[] = []; Object.entries(relicCount).forEach(([key, value]) => { if (value >= 2) { listEffects.push({ key: key, count: value }); } }); return listEffects; }, [avatars, avatarSelected]); const modalConfigs: ModalConfig[] = [ { id: "action_detail_modal", title: transI18n("changeRelic") || "Cài đặt di vật", isOpen: isOpenRelic, onClose: () => { setIsOpenRelic(false) handleCloseModal("action_detail_modal") }, content: }, { id: "quick_view_modal", title: transI18n("quickView").toUpperCase(), isOpen: isOpenQuickView, onClose: () => { setIsOpenQuickView(false) handleCloseModal("quick_view_modal") }, content: } ] // Handle ESC key to close modal useEffect(() => { for (const item of modalConfigs) { if (!item?.isOpen) { handleCloseModal(item?.id || "") } } const handleEscKey = (event: KeyboardEvent) => { if (event.key === 'Escape') { for (const item of modalConfigs) { handleCloseModal(item?.id || "") } } }; window.addEventListener('keydown', handleEscKey); return () => window.removeEventListener('keydown', handleEscKey); }, [isOpenRelic]); return (
{/* Left Section - Relic Equipment Grid */}

{transI18n("relics")}

{/* 6-Slot Grid completely free of box-in-box */}
{["1", "2", "3", "4", "5", "6"].map((item, index) => (
{ if (item === selectedRelicSlot) { setSelectedRelicSlot("") } else { setSelectedRelicSlot(item) } handlerChangeRelic(item) }} className={`relative group flex flex-col items-center justify-center p-2 rounded-2xl transition-all duration-200 cursor-pointer ${ item === selectedRelicSlot ? "bg-primary/5 rounded-2xl ring-1.5 ring-primary/40" : "hover:bg-base-content/5" }`} > {/* Micro Actions */}
{getRelic(item) && ( )}
))}
{/* Bottom Actions Bar */}
{/* Right Section - Set Effects Showcase */}

{transI18n("setEffects")}

{relicEffects.length > 0 ? (
{relicEffects.map((setEffect, index) => { const relicInfo = mapRelicSet[setEffect.key]; if (!relicInfo) return null; return (
{setEffect.count && ( {setEffect.count} Pc )}
{Object.entries(relicInfo.Skills).map(([requireNum, value]) => { if (Number(requireNum) > Number(setEffect.count)) return null; return (
{requireNum}-PC Bonus
) })}
) })}
) : (
{transI18n("noRelicEquipped")}
)}
{/* Modals */} {modalConfigs.map(({ id, title, onClose, content }) => (

{title}

{content}
))}
); }