toast 메시지 추가

alert 글로벌화
loading 글로벌화
This commit is contained in:
2025-04-25 15:33:21 +09:00
parent d2ac5b338e
commit 826459f304
50 changed files with 3211 additions and 2385 deletions

View File

@@ -1,339 +1,145 @@
import { useState, Fragment, useEffect } from 'react';
import CheckBox from '../../components/common/input/CheckBox';
import Modal from '../../components/common/modal/Modal';
import Button from '../../components/common/button/Button';
import styled from 'styled-components';
import { Title, FormWrapper, TableInfo, ListCount, ListOption, TableStyle, SelectInput, TableWrapper, BtnWrapper, ButtonClose, ModalText } from '../../styles/Components';
import { useState, Fragment, useRef } from 'react';
import { Title, FormWrapper } from '../../styles/Components';
import { useNavigate } from 'react-router-dom';
import { UserBlockDetailModal, UserBlockSearchBar } from '../../components/ServiceManage/';
import { BlackListView, BlackListDetail, BlackListDelete } from '../../apis';
import {
CommonSearchBar,
useCommonSearch,
UserBlockDetailModal,
} from '../../components/ServiceManage/';
import { BlackListDetail, BlackListDelete } from '../../apis';
import Pagination from '../../components/common/Pagination/Pagination';
import { authList } from '../../store/authList';
import { useRecoilValue } from 'recoil';
import { authType, blockPeriod, blockSanctions, blockStatus } from '../../assets/data';
import AuthModal from '../../components/common/modal/AuthModal';
import { authType } from '../../assets/data';
import { CaliTable, TableHeader } from '../../components/common';
import { useModal, useTable, withAuth } from '../../hooks/hook';
import { alertTypes } from '../../assets/data/types';
import { INITIAL_PAGE_LIMIT } from '../../assets/data/adminConstants';
import tableInfo from '../../assets/data/pages/userBlockTable.json'
import { useAlert } from '../../context/AlertProvider';
import { useLoading } from '../../context/LoadingProvider';
const UserBlock = () => {
const token = sessionStorage.getItem('token');
const userInfo = useRecoilValue(authList);
const navigate = useNavigate();
const {showModal, showToast} = useAlert();
const {withLoading} = useLoading();
// 페이지 네이션 관련
const [currentPage, setCurrentPage] = useState(1);
const [pageSize, setPageSize] = useState(50);
// 데이터 조회 관련
const [dataList, setDataList] = useState([]);
const [detailView, setDetailView] = useState('hidden');
const [selectedRow, setSelectedRow] = useState([]);
const [selectedData, setSelectedData] = useState([]);
const [detail, setDetail] = useState([]);
const [requestValue, setRequestValue] = useState([]);
// 모달 관련 변수
const [confirmModal, setConfirmModal] = useState('hidden');
const [completeModal, setCompleteModal] = useState('hidden');
// 검색 관련 변수
const [orderBy, setOrderBy] = useState('DESC');
const [searchData, setSearchData] = useState({
searchType: 'GUID',
searchKey: '',
status: 'ALL',
sanctions: 'ALL',
period: 'ALL',
const {
modalState,
handleModalView,
handleModalClose
} = useModal({
detail: 'hidden',
});
// 등록하기 모달 연결
const handleDetail = async dataValue => {
if (detailView === 'hidden') {
setDetailView('block');
} else {
setDetailView('hidden');
setDetail([]);
const {
config,
searchParams,
data: dataList,
handleSearch,
handleReset,
handlePageChange,
handlePageSizeChange,
handleOrderByChange,
updateSearchParams,
configLoaded
} = useCommonSearch(token, "userBlockSearch");
const {
selectedRows,
handleSelectRow,
isRowSelected
} = useTable(dataList?.list || [], {mode: 'single'});
const handleAction = async (action, item = null) => {
switch (action) {
case "detail":
await BlackListDetail(token, item.id).then(data => {
setDetail(data);
handleModalView('detail');
});
break;
case "delete":
showModal('USER_BLOCK_DELETE_CONFIRM', {
type: alertTypes.confirm,
onConfirm: () => handleAction('deleteConfirm')
});
break;
case "deleteConfirm":
let list = [];
selectedRows.map(data => {
list.push({
id: data.id,
});
});
await withLoading(async () => {
return BlackListDelete(token, list);
}).then(data => {
showToast('DEL_COMPLETE', {type: alertTypes.success});
}).catch(reason => {
showToast('API_FAIL', {type: alertTypes.error});
}).finally(() => {
handleSearch(updateSearchParams);
});
break;
}
setSelectedData(dataValue);
const id = dataValue.id;
if (id) {
setDetail(await BlackListDetail(token, id));
}
};
const fetchData = async (searchType, data, email, status, sanctions, period, order, size) => {
setDataList(await BlackListView(token, searchType, data, email, status, sanctions, period, order ? order : orderBy, size ? size : pageSize, currentPage));
};
// 검색 기능
const handleSearch = (searchType, data, email, status, sanctions, period) => {
fetchData(searchType, data, email, status, sanctions, period);
};
// 배열 정렬
const handleOrderBy = e => {
const order = e.target.value;
setOrderBy(order);
fetchData(searchData.searchType, searchData.searchKey, searchData.email, searchData.status, searchData.sanctions, searchData.period, order, pageSize);
};
const handlePageSize = e => {
const size = e.target.value;
setPageSize(size);
setCurrentPage(1);
fetchData(searchData.searchType, searchData.searchKey, searchData.email, searchData.status, searchData.sanctions, searchData.period, orderBy, size, 1);
};
useEffect(() => {
fetchData(searchData.searchType, searchData.searchKey, searchData.email, searchData.status, searchData.sanctions, searchData.period, orderBy, pageSize);
setSelectedRow([]);
}, [currentPage]);
// 전체 선택
const handleAllSelect = () => {
const checkAll = document.getElementById('check-all');
let list = [];
if (checkAll.checked === true) {
dataList.list.map((data, index) => {
document.getElementsByName('select')[index].checked = true;
list.push(String(data.id));
});
} else if (checkAll.checked === false) {
for (let i = 0; i < dataList.list.length; i++) {
dataList.list.map((data, index) => (document.getElementsByName('select')[index].checked = false));
list = [];
}
}
setSelectedRow(list);
};
// 일부 선택
const handleSelectCheckBox = e => {
let list = [...selectedRow];
if (e.target.checked) {
list.push(e.target.id);
setSelectedRow(list);
} else {
const filterList = list.filter(data => e.target.id !== data);
setSelectedRow(filterList);
}
};
// 삭제 여부 모달
const handleConfirmeModalClose = () => {
if (confirmModal === 'hidden') {
setConfirmModal('view');
} else {
setConfirmModal('hidden');
setRequestValue([]);
}
};
// 선택, 복수 삭제 모달창
const handleConfirmModal = data => {
if (data.id) {
setSelectedData(data.id);
if (selectedData) {
setRequestValue(data.id);
}
} else if (selectedRow) {
setRequestValue(selectedRow);
}
handleConfirmeModalClose();
};
// 완료 확인 모달
const handleCompleteModal = () => {
if (completeModal === 'hidden') {
setCompleteModal('view');
} else {
setCompleteModal('hidden');
setRequestValue([]);
handleConfirmeModalClose();
window.location.reload();
}
};
// 삭제 기능 구현
const handleDelete = () => {
let list = [];
if (requestValue === selectedRow) {
selectedRow.map(data =>
list.push({
id: data,
}),
);
BlackListDelete(token, list);
// console.log(list);
// console.log(selectedRow);
handleCompleteModal();
} else if (requestValue !== selectedRow) {
list.push({ id: selectedData });
// console.log(list);
BlackListDelete(token, list);
handleCompleteModal();
}
};
const handleCountSelectedRow = () => {
return currentPage > (dataList && dataList.total) / pageSize ? selectedRow.length === dataList.total % pageSize : selectedRow.length === Number(pageSize);
};
return (
<>
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.blackListRead) ? (
<AuthModal/>
) : (
<>
<Title>이용자 제재 조회 등록</Title>
<FormWrapper>
<UserBlockSearchBar handleSearch={handleSearch} setResultData={setSearchData} />
</FormWrapper>
<TableInfo>
<ListCount>
: {dataList && dataList.total} / {dataList && dataList.total_all}
</ListCount>
<ListOption>
<SelectInput
name=""
id=""
className="input-select"
onChange={e => {
handleOrderBy(e);
}}>
<option value="DESC">내림차순</option>
<option value="ASC">오름차순</option>
</SelectInput>
<SelectInput
name=""
id=""
onChange={e => {
handlePageSize(e);
}}
className="input-select">
<option value="50">50</option>
<option value="100">100</option>
</SelectInput>
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === 30) && (
<Button theme={selectedRow.length === 0 ? 'disable' : 'line'} type="submit" text="선택 삭제" id={selectedRow} handleClick={() => handleConfirmModal(selectedRow)} />
)}
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === 25) && (
<Button
theme="primary"
type="submit"
text="제재 등록"
handleClick={e => {
e.preventDefault();
navigate('/servicemanage/userblock/userblockregist');
}}
/>
)}
</ListOption>
</TableInfo>
<TableWrapper>
<TableStyle>
<caption></caption>
<thead>
<tr>
<th width="40">
<CheckBox id="check-all" handleCheck={handleAllSelect} checked={handleCountSelectedRow()} />
</th>
<th width="80">번호</th>
<th width="20%">GUID</th>
<th width="20%">아바타명</th>
<th width="100">상태</th>
<th width="100">제재 기간</th>
<th width="250">제재 사유</th>
<th width="150">등록자</th>
<th width="110">상세정보</th>
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === 30) && <th width="80">삭제</th>}
</tr>
</thead>
<tbody>
{dataList.list &&
dataList.list.map(data => (
<Fragment key={data.id}>
<tr>
<td>
<CheckBox name={'select'} id={data.id} setData={e => handleSelectCheckBox(e)} />
</td>
<td>{data.row_num}</td>
<td>{data.guid}</td>
<td>{data.nickname}</td>
{data.status === 'INPROGRESS' ? (
<td>
<ListState>{blockStatus.map(item => item.value === data.status && item.name)}</ListState>
</td>
) : (
<td>{blockStatus.map(item => item.value === data.status && item.name)}</td>
)}
<td>{blockPeriod.map(item => item.value === data.period && item.name)}</td>
<td>{blockSanctions.map(item => item.value === data.sanctions && item.name)}</td>
<td>{data.create_by}</td>
<td>
<Button theme="line" text="상세보기" handleClick={() => handleDetail(data)} />
</td>
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === 30) && (
<td>
<Button theme="line" id={data.id} name="single" text="삭제" handleClick={() => handleConfirmModal(data)} />
</td>
)}
</tr>
</Fragment>
))}
</tbody>
</TableStyle>
</TableWrapper>
<Pagination postsPerPage={pageSize} totalPosts={dataList && dataList.total_all} setCurrentPage={setCurrentPage} currentPage={currentPage} pageLimit={10} />
<UserBlockDetailModal stateModal={detailView} data={detail} handleModal={handleDetail} />
<Title>이용자 제재 조회 등록</Title>
<FormWrapper>
<CommonSearchBar
config={config}
searchParams={searchParams}
onSearch={(newParams, executeSearch = true) => {
if (executeSearch) {
handleSearch(newParams);
} else {
updateSearchParams(newParams);
}
}}
onReset={handleReset}
/>
</FormWrapper>
<TableHeader
config={tableInfo.header}
total={dataList?.total}
total_all={dataList?.total_all}
handleOrderBy={handleOrderByChange}
handlePageSize={handlePageSizeChange}
selectedRows={selectedRows}
onAction={handleAction}
navigate={navigate}
/>
<CaliTable
columns={tableInfo.columns}
data={dataList?.list}
selectedRows={selectedRows}
onSelectRow={handleSelectRow}
onAction={handleAction}
/>
<Pagination
postsPerPage={searchParams.pageSize}
totalPosts={dataList?.total_all}
setCurrentPage={handlePageChange}
currentPage={searchParams.currentPage}
pageLimit={INITIAL_PAGE_LIMIT}
/>
{/* 선택 삭제 모달 */}
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={confirmModal}>
<BtnWrapper $justify="flex-end">
<ButtonClose onClick={handleConfirmeModalClose} />
</BtnWrapper>
<ModalText $align="center">
제재 대상을 삭제하시겠습니까?
<br />
삭제 제재가 해제됩니다.
</ModalText>
<BtnWrapper $gap="10px">
<Button text="취소" theme="line" size="large" width="100%" handleClick={handleConfirmeModalClose} />
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handleDelete} />
</BtnWrapper>
</Modal>
{/* 완료창 모달 */}
{/* 삭제 완료 모달 */}
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={completeModal}>
<BtnWrapper $justify="flex-end">
<ButtonClose onClick={handleCompleteModal} />
</BtnWrapper>
<ModalText $align="center">삭제가 완료되었습니다.</ModalText>
<BtnWrapper $gap="10px">
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handleCompleteModal} />
</BtnWrapper>
</Modal>
</>
)}
<UserBlockDetailModal
stateModal={modalState.detailModal}
data={detail}
handleModal={() => handleModalClose('detail')}
/>
</>
);
};
export default UserBlock;
const ListState = styled.span`
color: #d60000;
`;
export default withAuth(authType.blackListRead)(UserBlock);