diff --git a/frontend/src/components/backlog/StoryBlock.tsx b/frontend/src/components/backlog/StoryBlock.tsx index 9a618fcc..33bd7241 100644 --- a/frontend/src/components/backlog/StoryBlock.tsx +++ b/frontend/src/components/backlog/StoryBlock.tsx @@ -4,7 +4,6 @@ import useShowDetail from "../../hooks/pages/backlog/useShowDetail"; import { BacklogStatusType, EpicCategoryDTO } from "../../types/DTO/backlogDTO"; import BacklogStatusChip from "./BacklogStatusChip"; import CategoryChip from "./CategoryChip"; -import TaskCreateButton from "./TaskCreateButton"; import ChevronDown from "../../assets/icons/chevron-down.svg?react"; import ChevronRight from "../../assets/icons/chevron-right.svg?react"; import TaskContainer from "./TaskContainer"; @@ -19,6 +18,7 @@ import TrashCan from "../../assets/icons/trash-can.svg?react"; import { useModal } from "../../hooks/common/modal/useModal"; import ConfirmModal from "../common/ConfirmModal"; import EpicDropdown from "./EpicDropdown"; +import TaskCreateBlock from "./TaskCreateBlock"; interface StoryBlockProps { id: number; @@ -182,7 +182,10 @@ const StoryBlock = ({ + + + + + ); +}; + +export default TaskCreateForm; diff --git a/frontend/src/hooks/pages/backlog/useBacklogSocket.ts b/frontend/src/hooks/pages/backlog/useBacklogSocket.ts index aac07e5e..1ea42071 100644 --- a/frontend/src/hooks/pages/backlog/useBacklogSocket.ts +++ b/frontend/src/hooks/pages/backlog/useBacklogSocket.ts @@ -1,11 +1,17 @@ import { useEffect, useState } from "react"; import { Socket } from "socket.io-client"; -import { BacklogDTO, EpicDTO, StoryDTO } from "../../../types/DTO/backlogDTO"; +import { + BacklogDTO, + EpicDTO, + StoryDTO, + TaskDTO, +} from "../../../types/DTO/backlogDTO"; import { BacklogSocketData, BacklogSocketDomain, BacklogSocketEpicAction, BacklogSocketStoryAction, + BacklogSocketTaskAction, } from "../../../types/common/backlog"; const useBacklogSocket = (socket: Socket) => { @@ -96,6 +102,34 @@ const useBacklogSocket = (socket: Socket) => { } }; + const handleTaskEvent = ( + action: BacklogSocketTaskAction, + content: TaskDTO + ) => { + switch (action) { + case BacklogSocketTaskAction.CREATE: + setBacklog((prevBacklog) => { + const newEpicList = prevBacklog.epicList.map((epic) => { + if ( + epic.storyList.filter(({ id }) => id === content.storyId).length + ) { + const newStoryList = epic.storyList.map((story) => { + if (story.id === content.storyId) { + return { ...story, taskList: [...story.taskList, content] }; + } + return story; + }); + + return { ...epic, storyList: newStoryList }; + } + return epic; + }); + return { epicList: newEpicList }; + }); + break; + } + }; + const handleOnBacklog = ({ domain, action, content }: BacklogSocketData) => { switch (domain) { case BacklogSocketDomain.BACKLOG: @@ -107,6 +141,9 @@ const useBacklogSocket = (socket: Socket) => { case BacklogSocketDomain.STORY: handleStoryEvent(action, content); break; + case BacklogSocketDomain.TASK: + handleTaskEvent(action, content); + break; } }; diff --git a/frontend/src/hooks/pages/backlog/useTaskEmitEvent.ts b/frontend/src/hooks/pages/backlog/useTaskEmitEvent.ts new file mode 100644 index 00000000..45cdab79 --- /dev/null +++ b/frontend/src/hooks/pages/backlog/useTaskEmitEvent.ts @@ -0,0 +1,12 @@ +import { Socket } from "socket.io-client"; +import { TaskForm } from "../../../types/common/backlog"; + +const useTaskEmitEvent = (socket: Socket) => { + const emitTaskCreateEvent = (content: TaskForm) => { + socket.emit("task", { action: "create", content }); + }; + + return { emitTaskCreateEvent }; +}; + +export default useTaskEmitEvent; diff --git a/frontend/src/types/DTO/backlogDTO.ts b/frontend/src/types/DTO/backlogDTO.ts index f81ce5db..78fb1c94 100644 --- a/frontend/src/types/DTO/backlogDTO.ts +++ b/frontend/src/types/DTO/backlogDTO.ts @@ -17,6 +17,7 @@ export interface TaskDTO { actualTime: number | null; status: BacklogStatusType; assignedMemberId: number | null; + storyId: number; } export interface StoryDTO { diff --git a/frontend/src/types/common/backlog.ts b/frontend/src/types/common/backlog.ts index 155deaf1..c6401cb0 100644 --- a/frontend/src/types/common/backlog.ts +++ b/frontend/src/types/common/backlog.ts @@ -3,6 +3,7 @@ import { EpicCategoryDTO, EpicDTO, StoryDTO, + TaskDTO, } from "../DTO/backlogDTO"; export type BacklogPath = "backlog" | "epic" | "completed"; @@ -29,6 +30,15 @@ export interface StoryForm { status: "시작전"; } +export interface TaskForm { + storyId: number; + title: string; + expectedTime: number | null | ""; + actualTime: number | null | ""; + status: "시작전"; + assignedMemberId: null; +} + export enum BacklogSocketDomain { BACKLOG = "backlog", EPIC = "epic", @@ -48,6 +58,12 @@ export enum BacklogSocketStoryAction { UPDATE = "update", } +export enum BacklogSocketTaskAction { + CREATE = "create", + DELETE = "delete", + UPDATE = "update", +} + export interface BacklogSocketInitData { domain: BacklogSocketDomain.BACKLOG; action: "init"; @@ -66,7 +82,14 @@ export interface BacklogSocketStoryData { content: StoryDTO; } +export interface BacklogSocketTaskData { + domain: BacklogSocketDomain.TASK; + action: BacklogSocketTaskAction; + content: TaskDTO; +} + export type BacklogSocketData = | BacklogSocketInitData | BacklogSocketEpicData - | BacklogSocketStoryData; + | BacklogSocketStoryData + | BacklogSocketTaskData;