import React, { useState, Fragment, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import Button from '../../common/button/Button'; import Loading from '../../common/Loading'; import { Title, BtnWrapper, SearchBarAlert, SelectInput, InputLabel, DatePickerWrapper, } from '../../../styles/Components'; import { FormHelperText, FormInput, FormLabel, FormTextArea, FormTextAreaWrapper, MessageWrapper, FormRowGroup, NoticeInputRow2, NoticeInputItem2, BoxWrapper, FormStatusBar, FormStatusLabel, FormStatusWarning, FormButtonContainer, StyledSelectInput, TimeSeparator, TimeContainer, } from '../../../styles/ModuleComponents'; import { HourList, MinuteList, modalTypes } from '../../../assets/data'; import { DynamicModal, Modal, DateTimeRangePicker, SingleDatePicker, SingleTimePicker } from '../../common'; import { LandAuctionModify, LandAuctionSingleRegist } from '../../../apis'; import { NONE, TYPE_MODIFY, TYPE_REGISTRY } from '../../../assets/data/adminConstants'; import { landAuctionStatus, landAuctionStatusType, languageType, CurrencyType } from '../../../assets/data'; import { useModal } from '../../../utils/hook'; import { convertKTCDate } from '../../../utils'; import { battleEventHotTime, battleEventRoundCount, battleEventStatus, battleRepeatType, } from '../../../assets/data/options'; import DatePickerComponent from '../../common/Date/DatePickerComponent'; import { BattleEventModify, BattleEventSingleRegist } from '../../../apis/Battle'; import { battleEventStatusType } from '../../../assets/data/types'; import { result } from 'lodash'; const BattleEventModal = ({ modalType, detailView, handleDetailView, content, setDetailData, configData, rewardData }) => { const { t } = useTranslation(); const token = sessionStorage.getItem('token'); const [loading, setLoading] = useState(false); // 로딩 창 const { modalState, handleModalView, handleModalClose } = useModal({ cancel: 'hidden', registConfirm: 'hidden', registComplete: 'hidden' }); const [message_lang, setMessage_lang] = useState('KO'); const [isNullValue, setIsNullValue] = useState(false); // 데이터 값 체크 const [alertMsg, setAlertMsg] = useState(''); const [resultData, setResultData] = useState(initData); //데이터 정보 const [resetDateTime, setResetDateTime] = useState(false); useEffect(() => { if(modalType === TYPE_MODIFY && content && Object.keys(content).length > 0){ setResultData({ group_id: content.group_id, event_name: content.event_name, repeat_type: content.repeat_type, config_id: content.config_id, reward_group_id: content.reward_group_id, round_count: content.round_count, hot_time: content.hot_time, round_time: content.round_time, status: content.status, event_start_dt: convertKTCDate(content.event_start_dt), event_end_dt: convertKTCDate(content.event_end_dt) }); } }, [modalType, content]); useEffect(() => { if (checkCondition()) { setIsNullValue(false); } else { setIsNullValue(true); } }, [resultData]); useEffect(() => { if (resetDateTime) { setResetDateTime(false); } }, [resetDateTime]); // 시작 날짜 변경 핸들러 const handleStartDateChange = (date) => { if (!date) return; const newDate = new Date(date); setResultData(prev => ({ ...prev, event_start_dt: newDate })); }; // 시작 시간 변경 핸들러 const handleStartTimeChange = (time) => { if (!time) return; const newDateTime = resultData.event_start_dt ? new Date(resultData.event_start_dt) : new Date(); newDateTime.setHours( time.getHours(), time.getMinutes(), 0, 0 ); setResultData(prev => ({ ...prev, event_start_dt: newDateTime })); }; // 종료 날짜 변경 핸들러 const handleEndDateChange = (date) => { if (!date || !resultData.start_dt) return; const startDate = new Date(resultData.start_dt); const endDate = new Date(date); // 일자만 비교하기 위해 년/월/일만 추출 const startDay = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()); const endDay = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()); if (endDay <= startDay) { setAlertMsg('종료일은 시작일보다 하루 이후여야 합니다.'); return; } const newDate = new Date(date); newDate.setHours(23, 59, 59, 0); setResultData(prev => ({ ...prev, event_end_dt: newDate })); }; const handleConfigChange = (e) => { const config = configData.find(data => data.id === e.target.value); setResultData({ ...resultData, config_id: config.id, round_time: config.round_time }); } const handleReset = () => { setMessage_lang('KO') setDetailData({}); setResultData(initData); setResetDateTime(true); handleDetailView(); } const handleSubmit = async (type, param = null) => { switch (type) { case "submit": if (!checkCondition()) return; const minAllowedTime = new Date(new Date().getTime() + 10 * 60000); if (resultData.event_start_dt < minAllowedTime) { setAlertMsg(t('BATTLE_EVENT_MADEL_START_DT_WARNING')); return; } if(resultData.repeat_type !== 'NONE' && resultData.event_start_dt >= resultData.event_end_dt) { setAlertMsg(t('LAND_AUCTION_MADEL_AUCTION_DIFF_AUCTION')) return; } //화면에 머물면서 상태는 안바꼈을 경우가 있기에 시작시간 지났을경우 차단 if (modalType === TYPE_MODIFY && resultData.event_start_dt < new Date()) { setAlertMsg(t('LAND_AUCTION_MADEL_MODIFY_START')); return; } if(resultData.round_time === 0){ const config = configData.find(data => data.id === resultData.config_id); setResultData({ ...resultData, round_time: config.round_time }); } handleModalView('registConfirm'); break; case "cancel": handleModalView('cancel'); break; case "cancelConfirm": handleModalClose('cancel'); handleReset(); break; case "registConfirm": setLoading(true); if(isView('modify')){ await BattleEventModify(token, content?.id, resultData).then(data => { setLoading(false); handleModalClose('registConfirm'); if(data.result === "SUCCESS") { handleModalView('registComplete'); }else if(data.result === "ERROR_AUCTION_STATUS_IMPOSSIBLE"){ setAlertMsg(t('LAND_AUCTION_ERROR_MODIFY_STATUS')); }else{ setAlertMsg(t('UPDATE_FAIL')); } }).catch(reason => { setAlertMsg(t('API_FAIL')); }); } else{ await BattleEventSingleRegist(token, resultData).then(data => { setLoading(false); handleModalClose('registConfirm'); if(data.result === "SUCCESS") { handleModalView('registComplete'); }else if(data.result === "ERROR_LAND_AUCTION_IMPOSSIBLE"){ setAlertMsg(t('LAND_AUCTION_ERROR_PROGRESS')); }else{ setAlertMsg(t('REGIST_FAIL')); } }).catch(reason => { setAlertMsg(t('API_FAIL')); }); } break; case "registComplete": handleModalClose('registComplete'); handleReset(); window.location.reload(); break; case "warning": setAlertMsg(''); break; } } const checkCondition = () => { return ( resultData.event_start_dt !== '' && resultData.group_id !== '' && resultData.event_name !== '' && (resultData.repeat_type === 'NONE' || (resultData.repeat_type !== 'NONE' && resultData.event_end_dt !== '')) ); }; const isView = (label) => { switch (label) { case "modify": return modalType === TYPE_MODIFY && (content?.status === battleEventStatusType.register); case "registry": case "repeat": case "group": case "name": case "config": case "reward": case "round": case "hot": case "start_dt": return modalType === TYPE_REGISTRY default: return modalType === TYPE_MODIFY && (content?.status === battleEventStatusType.register ); } } return ( <> {isView('registry') ? "전투시스템 이벤트 등록" : isView('modify') ? "전투시스템 이벤트 수정" : "전투시스템 이벤트 상세"} 그룹 ID setResultData({ ...resultData, group_id: e.target.value })} /> 이벤트명 setResultData({ ...resultData, event_name: e.target.value })} /> 반복 setResultData({ ...resultData, repeat_type: e.target.value })} disabled={!isView('repeat')} width="150px"> {battleRepeatType.map((data, index) => ( ))} {resultData?.repeat_type !== 'NONE' && } 라운드 시간 {configData && configData?.map((data, index) => ( ))} 라운드 수 setResultData({ ...resultData, round_count: e.target.value })} disabled={!isView('round')} width="100px"> {battleEventRoundCount.map((data, index) => ( ))} 배정 포드 setResultData({ ...resultData, reward_group_id: e.target.value })} disabled={!isView('reward')} width="200px"> {rewardData && rewardData?.map((data, index) => ( ))} 핫타임 setResultData({ ...resultData, hot_time: e.target.value })} disabled={!isView('hot')} width="100px"> {battleEventHotTime.map((data, index) => ( ))} {!isView() && isNullValue && {t('REQUIRED_VALUE_CHECK')}} 현재상태: {battleEventStatus.find(data => data.value === content?.status)?.name || "등록"} {isView('registry') ? '' : t('LAND_AUCTION_MODAL_STATUS_WARNING')} {isView() ?