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 */}