diff --git a/src/components/Modal/ColumnModifyModal.tsx b/src/components/Modal/ColumnModifyModal.tsx deleted file mode 100644 index 51c33691..00000000 --- a/src/components/Modal/ColumnModifyModal.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useState } from 'react'; - -import ModalActionButton from '@/components/Button/ModalActionButton'; -import ModalCancelButton from '@/components/Button/ModalCancelButton'; -import useModal from '@/hooks/useModal'; -import { putColumn } from '@/services/putService'; -import { ColumnModifyModalProps } from '@/types/Modal.interface'; - -export default function ColumnModifyModal({ modalProps }: { modalProps: ColumnModifyModalProps }) { - const id = modalProps?.columnId; - const [title, setTitle] = useState(modalProps?.columnTitle || ''); - const { openModal, closeModal } = useModal(); - - const handleModifyButton = async () => { - try { - await putColumn(id, { title }); - openModal({ type: 'textModal', modalProps: { text: '컬럼이 성공적으로 변경되었습니다.' } }); - } catch { - openModal({ type: 'textModal', modalProps: { text: '컬럼이 변경되지 않았습니다.' } }); - } - }; - - return ( -
-

컬럼 관리

-
- - { - setTitle(e.target.value); - }} - /> -
- -
-
- -
-
- 취소 - 0)} onClick={handleModifyButton}> - 변경 - -
-
-
- ); -} diff --git a/src/components/Modal/ModifyColumnModal.tsx b/src/components/Modal/ModifyColumnModal.tsx new file mode 100644 index 00000000..e7807638 --- /dev/null +++ b/src/components/Modal/ModifyColumnModal.tsx @@ -0,0 +1,105 @@ +import { useQueryClient } from '@tanstack/react-query'; +import { AxiosError } from 'axios'; +import { useRouter } from 'next/router'; +import { useState } from 'react'; + +import ModalActionButton from '@/components/Button/ModalActionButton'; +import ModalCancelButton from '@/components/Button/ModalCancelButton'; +import useModal from '@/hooks/useModal'; +import { deleteColumn } from '@/services/deleteService'; +import { putColumn } from '@/services/putService'; +import { ModifyColumnModalProps } from '@/types/Modal.interface'; + +export default function ModifyColumnModal({ columnId, columnTitle = '', columns }: ModifyColumnModalProps) { + const { openModal, closeModal } = useModal(); + const queryClient = useQueryClient(); + + const router = useRouter(); + const { id: dashboardId } = router.query; + const [title, setTitle] = useState(columnTitle); + const [errorMessage, setErrorMessage] = useState(''); + const columnNames = columns.map((column) => column.title); + + const handleValidCheck = () => { + if (!title) { + setErrorMessage('이름을 입력해주세요'); + } else if (title.length > 10) { + setErrorMessage('10자 이내로 입력해주세요'); + } else if (columnNames.includes(title)) { + setErrorMessage('중복된 컬럼 이름입니다'); + } else { + setErrorMessage(''); + } + }; + + const handleModifyClick = async () => { + try { + await putColumn(columnId, { title }); + queryClient.invalidateQueries({ queryKey: ['columns', dashboardId] }); + openModal({ type: 'notification', modalProps: { text: '컬럼이 성공적으로 변경되었습니다.' } }); + } catch (error) { + if (error instanceof AxiosError) { + setErrorMessage(error.response?.data.message || '컬럼 변경을 실패하였습니다.'); + } else { + setErrorMessage('컬럼 변경을 실패하였습니다.'); + console.log(error); + } + } + }; + + const handleDeleteClick = async () => { + try { + await deleteColumn(columnId); + queryClient.invalidateQueries({ queryKey: ['columns', dashboardId] }); + openModal({ type: 'notification', modalProps: { text: '컬럼이 삭제되었습니다.' } }); + } catch (error) { + if (error instanceof AxiosError && error.response?.data.message) { + openModal({ type: 'notification', modalProps: { text: error.response.data.message } }); + } else { + openModal({ type: 'notification', modalProps: { text: '컬럼이 삭제에 실패했습니다.' } }); + console.log(error); + } + } + }; + + return ( +
+

컬럼 관리

+ +
+ + setTitle(e.target.value)} + onBlur={handleValidCheck} + /> + {errorMessage &&

{errorMessage}

} +
+ +
+ +
+ + 취소 + + + 변경 + +
+
+
+ ); +} diff --git a/src/components/Modal/NewColumnModal.tsx b/src/components/Modal/NewColumnModal.tsx index 98dce7ed..8ddaaa05 100644 --- a/src/components/Modal/NewColumnModal.tsx +++ b/src/components/Modal/NewColumnModal.tsx @@ -23,6 +23,8 @@ export default function NewColumnModal({ columns }: NewColumnModalProps) { const handleValidCheck = () => { if (!name) { setErrorMessage('이름을 입력해주세요'); + } else if (name.length > 10) { + setErrorMessage('10자 이내로 입력해주세요'); } else if (columnNames.includes(name)) { setErrorMessage('중복된 컬럼 이름입니다'); } else { @@ -36,10 +38,10 @@ export default function NewColumnModal({ columns }: NewColumnModalProps) { queryClient.invalidateQueries({ queryKey: ['columns', id] }); openModal({ type: 'notification', modalProps: { text: '새로운 컬럼이 생성되었습니다!' } }); } catch (error) { - if (error instanceof AxiosError && error.response?.data.message) { - openModal({ type: 'notification', modalProps: { text: error.response.data.message } }); + if (error instanceof AxiosError) { + setErrorMessage(error.response?.data.message || '컬럼 생성을 실패하였습니다.'); } else { - openModal({ type: 'notification', modalProps: { text: '컬럼 생성을 실패하였습니다.' } }); + setErrorMessage('컬럼 생성을 실패하였습니다.'); console.log(error); } } @@ -64,7 +66,7 @@ export default function NewColumnModal({ columns }: NewColumnModalProps) { 취소 - + 생성 diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx index 89b8f309..1ce1f205 100644 --- a/src/components/Modal/index.tsx +++ b/src/components/Modal/index.tsx @@ -1,9 +1,9 @@ import { useEffect } from 'react'; import { useSelector } from 'react-redux'; -import ColumnModifyModal from './ColumnModifyModal'; import ConfirmModal from './ConfirmModal'; import InviteMemberModal from './InviteMemberModal'; +import ModifyColumnModal from './ModifyColumnModal'; import NewColumnModal from './NewColumnModal'; import NewDashboardModal from './NewDashboardModal'; import NotificationModal from './NotificationModal'; @@ -11,7 +11,7 @@ import NotificationModal from './NotificationModal'; import useModal from '@/hooks/useModal'; import { modalSelector } from '@/store/reducers/modalSlice'; import { - ColumnModifyModalProps, + ModifyColumnModalProps, ConfirmModalProps, InviteMemberModalProps, NewColumnModalProps, @@ -59,8 +59,8 @@ export default function Modal() { case 'inviteMember': return modalProps ? : null; - case 'columnModify': - return modalProps ? : null; + case 'modifyColumn': + return modalProps ? : null; default: return ; diff --git a/src/containers/dashboard/Column.tsx b/src/containers/dashboard/Column.tsx index 6379b236..90368290 100644 --- a/src/containers/dashboard/Column.tsx +++ b/src/containers/dashboard/Column.tsx @@ -1,5 +1,4 @@ import Image from 'next/image'; -import React from 'react'; import Card from './Card'; @@ -11,9 +10,10 @@ import { Column as ColumnType } from '@/types/Column.interface'; interface ColumnProps { column: ColumnType; + columns: ColumnType[]; } -function Column({ column }: ColumnProps) { +function Column({ column, columns }: ColumnProps) { const { openModal } = useModal(); const { data: cardList, @@ -43,9 +43,12 @@ function Column({ column }: ColumnProps) { {/* Column Edit Button */}