import { styled } from 'styled-components'; import RadioInput from '../../common/input/Radio'; import React, { useState, useEffect, Fragment } from 'react'; import CheckBox from '../../common/input/CheckBox'; import { Title, SelectInput, BtnWrapper, TextInput, Label, InputLabel, DatePickerWrapper, Textarea} from '../../../styles/Components'; import Button from '../../common/button/Button'; import Modal from '../../common/modal/Modal'; import IconDelete from '../../../assets/img/icon/icon-delete.png'; import CloseIcon from '../../../assets/img/icon/icon-close.png'; import DatePickerComponent from '../../common/Date/DatePickerComponent'; import MailRegistUploadBtn from '../MailRegistUploadBtn'; import { authType, benItems, commonStatus, HourList, mailType, MinuteList, userType, currencyType, } from '../../../assets/data'; import { MailCaliumTotalView, MailIsItem, MailModify } from '../../../apis'; import { authList } from '../../../store/authList'; import { useRecoilValue } from 'recoil'; import { convertKTC, convertKTCDate } from '../../../utils'; import { useNavigate } from 'react-router-dom'; import { useDataFetch } from '../../../hooks/hook'; import { useAlert } from '../../../context/AlertProvider'; import { useLoading } from '../../../context/LoadingProvider'; import { alertTypes, currencyCodeTypes } from '../../../assets/data/types'; import { userType2 } from '../../../assets/data/options'; const MailDetailModal = ({ detailView, handleDetailView, content }) => { const userInfo = useRecoilValue(authList); const token = sessionStorage.getItem('token'); const navigate = useNavigate(); const {showModal, showToast} = useAlert(); const {withLoading} = useLoading(); const id = content && content.id; const updateAuth = userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === authType.mailUpdate); const [sendHour, setSendHour] = useState('00'); const [sendMin, setSendMin] = useState('00'); const [item, setItem] = useState(''); const [itemCount, setItemCount] = useState(''); const [resource, setResource] = useState(currencyCodeTypes.gold); const [resourceCount, setResourceCount] = useState(''); const [resultData, setResultData] = useState({ is_reserve: false, send_dt: '', mail_type: 'SELECT', receive_type: 'SINGLE', user_type: 'GUID', mail_list: [], item_list: [], guid: '', }); // 과거 판단 const [isView, setIsView] = useState(true); const [isChanged, setIsChanged] = useState(false); const [excelFile, setExcelFile] = useState(''); const [downloadData, setDownLoadData] = useState(null); const [btnValidation, setBtnValidation] = useState(false); const { data: caliumTotalData, } = useDataFetch(() => MailCaliumTotalView(token), [token]); const KOREAN_TIME = content && convertKTCDate(content.send_dt); const initialData = { send_hour: content && KOREAN_TIME.getHours() < 10 ? '0' + content && KOREAN_TIME.getHours() : content && KOREAN_TIME.getHours(), send_min: content && KOREAN_TIME.getMinutes() < 10 ? '0' + content && KOREAN_TIME.getMinutes() : content && KOREAN_TIME.getMinutes(), send_status: content && content.send_status, }; useEffect(() => { if(content) { setResultData({ ...resultData, is_reserve: content.is_reserve, send_dt: KOREAN_TIME, mail_type: content.mail_type, receive_type: content.receive_type, mail_list: content.mail_list, item_list: content.item_list, guid: content.target, file_name: content.receive_type === 'MULTIPLE' ? content.target : null }); content.mail_list.length === 1 && setBtnValidation(true); content.is_reserve === false && setBtnValidation(true); setItem(''); if (content.receive_type === 'MULTIPLE') { setDownLoadData(content.target); setExcelFile(content.target); } } }, [content]); useEffect(() => { if(content){ if(!updateAuth || !content.is_reserve || (content.is_reserve && convertKTCDate(content.send_dt) < new Date) || (content.send_status === commonStatus.fail || content.send_status === commonStatus.finish) ){ setIsView(true); }else{ setIsView(false); } } },[updateAuth, content, resultData]) // 아이템 수량 숫자 체크 const handleItemCount = e => { if (e.target.value === '0' || e.target.value === '-0') { setItemCount('1'); e.target.value = '1'; } else if (e.target.value < 0) { let plusNum = Math.abs(e.target.value); setItemCount(plusNum); } else { setItemCount(e.target.value); } }; // 아이템 추가 const handleItemList = async () => { if(benItems.includes(item)){ showToast('MAIL_ITEM_ADD_BEN',{type: alertTypes.warning}); return; } if(item.length === 0 || itemCount.length === 0 || itemCount <= 0){ showToast('COUNT_EMPTY_WARNING', { type: alertTypes.warning }); return; } await withLoading(async () => { return await MailIsItem(token, { item: item }); }).then(data => { if (data.result === 'ERROR') { showToast(data.data.message, { type: alertTypes.warning }); }else{ const itemIndex = resultData.item_list.findIndex( data => data.item === item ); if (itemIndex !== -1) { showToast('MAIL_ITEM_ADD_DUPL', { type: alertTypes.warning }); return; } const newItem = { item: item, item_cnt: itemCount, item_name: data.data.item_info.item_name }; resultData.item_list.push(newItem); setIsChanged(true); setItem(''); setItemCount(''); } }).catch(e => { showToast(e, { type: alertTypes.error }); }); }; // 아이템 삭제 const onItemRemove = id => { let filterList = resultData.item_list && resultData.item_list.filter(item => item !== resultData.item_list[id]); setIsChanged(true); setResultData({ ...resultData, item_list: filterList }); }; // 자원 수량 숫자 체크 const handleResourceCount = e => { if (e.target.value === '0' || e.target.value === '-0') { setResourceCount('1'); e.target.value = '1'; } else if (e.target.value < 0) { let plusNum = Math.abs(e.target.value); setResourceCount(plusNum); } else { setResourceCount(e.target.value); } }; // 자원 추가 const handleResourceList = () => { if (resourceCount.length === 0 || resourceCount <= 0) { showToast('COUNT_EMPTY_WARNING', { type: alertTypes.warning }); } else { const itemIndex = resultData.item_list.findIndex( (item) => item.item === resource, ); if (itemIndex !== -1) { const item_cnt = resultData.item_list[itemIndex].item_cnt; if (resource === currencyCodeTypes.calium) { if ((Number(resourceCount) + Number(item_cnt)) > caliumTotalData) { showToast('MAIL_ITEM_CALIUM_TOTAL_OVER_WARNING', { type: alertTypes.warning }); return; } } resultData.item_list[itemIndex].item_cnt = Number(item_cnt) + Number(resourceCount); } else { if (resource === currencyCodeTypes.calium) { if (Number(resourceCount) > caliumTotalData) { showToast('MAIL_ITEM_CALIUM_TOTAL_OVER_WARNING', { type: alertTypes.warning }); return; } } const name = currencyType.find(well => well.value === resource).name; const newItem = { item: resource, item_cnt: resourceCount, item_name: name }; resultData.item_list.push(newItem); } setIsChanged(true); setResourceCount(''); } }; // 입력창 삭제 const onLangDelete = language => { let filterList = resultData.mail_list && resultData.mail_list.filter(el => el.language !== language); if (filterList.length === 1) setBtnValidation(true); setIsChanged(true); setResultData({ ...resultData, mail_list: filterList }); }; // 발송 날짜 세팅 로직 const handleSelectedDate = data => { const sendDate = new Date(data); const resultSendData = new Date(sendDate.getFullYear(), sendDate.getMonth(), sendDate.getDate(), sendHour, sendMin); setIsChanged(true); setResultData({ ...resultData, send_dt: resultSendData }); }; // 발송 시간 세팅 로직 const handleSendTime = e => { if (e.target.id === 'hour') setSendHour(e.target.value); else if (e.target.id === 'min') setSendMin(e.target.value); const sendDate = new Date(resultData.send_dt); const result = new Date(sendDate.getFullYear(), sendDate.getMonth(), sendDate.getDate(), e.target.id === 'hour' ? e.target.value : sendHour, e.target.id === 'min' ? e.target.value : sendMin); setIsChanged(true); setResultData({ ...resultData, send_dt: result }); }; // 확인 버튼 후 다 초기화 const handleReset = () => { setItem(''); setItemCount(''); setResource(currencyCodeTypes.gold); setResourceCount(''); setBtnValidation(false); setIsChanged(false); setExcelFile(null); }; //내용복사 const handleCopyContent = () => { const mailData = { is_reserve: resultData.is_reserve, mail_type: resultData.mail_type, mail_list: resultData.mail_list, item_list: resultData.item_list, resource_list: resultData.resource_list, receive_type: resultData.receive_type, user_type: resultData.user_type, guid: resultData.guid }; // 복사한 데이터를 세션 스토리지에 저장 sessionStorage.setItem('copyMailData', JSON.stringify(mailData)); navigate('/servicemanage/mail/mailregist'); }; const checkCondition = () => { return ( content && resultData?.mail_list?.every(data => data.content !== '' && data.title !== '') && ((resultData.is_reserve === true && resultData.send_dt !== '') || resultData.is_reserve === false) && (resultData.receive_type === 'MULTIPLE' ? excelFile !== null : resultData.guid !== '') && resultData.mail_type !== 'SELECT' && isChanged ); }; const handleSubmit = async (type, param = null) => { switch (type) { case "submit": if (!checkCondition()) return; showModal('MAIL_UPDATE_SAVE', { type: alertTypes.confirm, onConfirm: () => handleSubmit('updateConfirm') }) break; case "updateConfirm": await withLoading(async () => { if(resultData.receive_type === 'MULTIPLE') { delete resultData.guid return await MailModify(token, id, resultData); } else { return await MailModify(token, id, resultData); } }).then(data => { if(data.result === 'SUCCESS') { showToast('UPDATE_COMPLETED', {type: alertTypes.success}); handleDetailView(); handleReset(); }else{ showToast(data.data.message, {type: alertTypes.error}); } }).catch(error => { showToast('API_FAIL', {type: alertTypes.error}); }).finally(() => { }); break; } } return ( <> 우편 상세 정보 {content && <> 등록자 : {content.create_by} 등록일 : {convertKTC(content.create_dt, false)} {typeof content.update_by !== 'undefined' && ( <> 수정자 : {content.update_by} 수정일 : {convertKTC(content.update_dt, false)} )} { setResultData({ ...resultData, is_reserve: e.target.checked }); setIsChanged(true); }} disabled={(content.is_reserve === false) || isView} /> {content.is_reserve === false ? ( <> ) : ( resultData.is_reserve === true && ( 발송 시간 handleSelectedDate(data)} pastDate={new Date()} /> handleSendTime(e)} id="hour" disabled={(content.is_reserve === false) || isView} value={ resultData && String(new Date(resultData.send_dt).getHours()) < 10 ? '0' + String(new Date(resultData.send_dt).getHours()) : resultData && String(new Date(resultData.send_dt).getHours()) }> {HourList.map(hour => ( ))} { handleSendTime(e); setIsChanged(true); }} id="min" disabled={(content.is_reserve === false) || isView} value={ resultData && String(new Date(resultData.send_dt).getMinutes()) < 10 ? '0' + String(new Date(resultData.send_dt).getMinutes()) : resultData && String(new Date(resultData.send_dt).getMinutes()) }> {MinuteList.map(min => ( ))} ) )} 우편 타입 { setResultData({ ...resultData, mail_type: e.target.value }); setIsChanged(true); }} value={resultData.mail_type} disabled={isView}> {mailType.filter(data => data.value !== 'ALL').map((data, index) => ( ))} 발송상태
{initialData.send_status === 'WAIT' && 대기} {initialData.send_status === 'FINISH' && 완료} {initialData.send_status === 'FAIL' && 실패}
수신대상 setResultData({ ...resultData, user_type: e.target.value })} value={resultData.user_type} disabled={true}> {userType2.map((data, index) => ( ))}
{}} disabledBtn={true} excelName={excelFile} setExcelName={setExcelFile} downloadData={downloadData} status={initialData.send_status} />
{resultData.mail_list && resultData?.mail_list?.map(data => { return ( 언어 : {data.language} {btnValidation === false ? ( { e.preventDefault(); onLangDelete(data.language); }} /> ) : ( )} { let list = [...resultData.mail_list]; let findIndex = resultData.mail_list && resultData.mail_list.findIndex(item => item.language === e.target.id); list[findIndex].title = e.target.value.trimStart(); setResultData({ ...resultData, mail_list: list }); setIsChanged(true); }} />