"use client"; import React, { useEffect, useMemo, useState } from "react"; import { Plus, Trash2, ChevronUp, ChevronDown, Search, } from "lucide-react"; import useMazeStore from "@/stores/mazeStore"; import useUserDataStore from "@/stores/userDataStore"; import useMonsterStore from "@/stores/monsterStore"; import useLocaleStore from "@/stores/localeStore"; import { getLocaleName } from "@/helper"; import Image from "next/image"; import { MonsterBasic } from "@/types"; import { cloneDeep } from "lodash"; import { useTranslations } from "next-intl"; export default function CeBar() { const [searchTerm, setSearchTerm] = useState(""); const [showSearchWaveId, setShowSearchWaveId] = useState(null); const { Stage } = useMazeStore() const { ce_config, setCeConfig } = useUserDataStore() const { listMonster } = useMonsterStore() const { locale } = useLocaleStore() const filteredMonsters = useMemo(() => { const newlistMonster = new Set() for (const monster of listMonster) { if (getLocaleName(locale, monster).toLowerCase().includes(searchTerm.toLowerCase())) { newlistMonster.add(monster) } if (monster.id.toLowerCase().includes(searchTerm.toLowerCase())) { newlistMonster.add(monster) } } return Array.from(newlistMonster) }, [listMonster, locale, searchTerm]); const transI18n = useTranslations("DataPage") const [showSearchStage, setShowSearchStage] = useState(false) const [stageSearchTerm, setStageSearchTerm] = useState("") const [stagePage, setStagePage] = useState(1) const pageSize = 30 const stageList = useMemo(() => Object.values(Stage).map((stage) => ({ id: stage.stage_id.toString(), name: `${stage.stage_type} (${stage.stage_id})`, })), [Stage]) const filteredStages = useMemo(() => stageList.filter((s) => s.name.toLowerCase().includes(stageSearchTerm.toLowerCase()) ), [stageList, stageSearchTerm]) const paginatedStages = useMemo(() => filteredStages.slice( (stagePage - 1) * pageSize, stagePage * pageSize ), [filteredStages, stagePage, pageSize]) const hasMorePages = useMemo(() => stagePage * pageSize < filteredStages.length, [stagePage, filteredStages]) useEffect(() => { setStagePage(1) }, [stageSearchTerm]) return (
{ setShowSearchWaveId(null) setShowSearchStage(false) }}>
{showSearchStage && (
setStageSearchTerm(e.target.value)} autoFocus />
{paginatedStages.length > 0 ? ( <> {paginatedStages.map((stage) => (
{ setCeConfig({ ...ce_config, stage_id: Number(stage.id), cycle_count: 30 }) setShowSearchStage(false) setStageSearchTerm("") }} > {stage.name}
))} ) : (
{transI18n("noStageFound")}
)}
{paginatedStages.length > 0 && (
)}
)}
{ce_config.monsters.map((wave, waveIndex) => (

{transI18n("wave")} {waveIndex + 1}

{wave.map((member, memberIndex) => (
{listMonster.find((monster2) => monster2.child.includes(member.monster_id))?.icon && monster2.child.includes(member.monster_id))?.icon?.split("/")?.pop()?.replace(".png", "")}.webp`} alt="Enemy Icon" width={376} height={512} className=" object-contain w-20 h-20 overflow-hidden" />}
{listMonster .find((monster) => monster.child.includes(member.monster_id)) ?.weak?.map((icon, iconIndex) => ( {icon} ))}
{getLocaleName(locale, listMonster.find((monster) => monster.child.includes(member.monster_id)))}
Lv. { try { Number(e.target.value) } catch { return; } if (Number(e.target.value) < 1 || Number(e.target.value) > 95) return; const newCeConfig = cloneDeep(ce_config) newCeConfig.monsters[waveIndex][memberIndex].level = Number(e.target.value) setCeConfig(newCeConfig) }} />
))} {/* Add Member Button + Search */}
{showSearchWaveId === waveIndex && (
setSearchTerm(e.target.value)} autoFocus />
{filteredMonsters.length > 0 ? ( filteredMonsters.map((monster) => (
{ const newCeConfig = cloneDeep(ce_config) newCeConfig.monsters[waveIndex].push({ monster_id: Number(monster.id), level: 95, amount: 1, }) setCeConfig(newCeConfig) setShowSearchWaveId(null); }} >
{listMonster.find((monster2) => monster2.child.includes(Number(monster.id)))?.icon?.split("/")?.pop()?.replace(".png", "") && ( monster2.child.includes(Number(monster.id)))?.icon?.split("/")?.pop()?.replace(".png", "")}.webp`} alt="Enemy Icon" width={376} height={512} className="w-full h-full object-cover" /> )}
{getLocaleName(locale, monster)} {`(${monster.id})`}
)) ) : (
{transI18n("noMonstersFound")}
)}
)}
))} {/* Add New Wave Button */}
); }