diff --git a/src/api/hooks/group/useDeleteGroup.ts b/src/api/hooks/group/useDeleteGroup.ts index d0d3129c..6d0793c9 100644 --- a/src/api/hooks/group/useDeleteGroup.ts +++ b/src/api/hooks/group/useDeleteGroup.ts @@ -1,15 +1,22 @@ import { deleteGroup } from "@/api/axios"; import { toastKit } from "@/utils"; -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useRouter } from "next/navigation"; const useDeleteGroup = () => { const { success, error } = toastKit(); const router = useRouter(); + const queryClient = useQueryClient(); return useMutation({ mutationFn: deleteGroup, onSuccess: () => { success("팀을 성공적으로 삭제 하였습니다."); + queryClient.invalidateQueries({ + queryKey: ["groups"], + }); + queryClient.invalidateQueries({ + queryKey: ["user"], + }); router.replace("/team"); }, onError: () => error("팀을 삭제하지 못하였습니다."), diff --git a/src/api/hooks/group/usePatchGroup.ts b/src/api/hooks/group/usePatchGroup.ts index 32be4f9b..ed6113cd 100644 --- a/src/api/hooks/group/usePatchGroup.ts +++ b/src/api/hooks/group/usePatchGroup.ts @@ -12,6 +12,7 @@ const usePatchGroup = () => { onSuccess: () => { success("팀 이름을 성공적으로 변경하였습니다."); queryClient.invalidateQueries({ queryKey: ["groups"] }); + queryClient.invalidateQueries({ queryKey: ["user"] }); router.back(); }, onError: () => { diff --git a/src/api/hooks/task/usePatchTask.ts b/src/api/hooks/task/usePatchTask.ts index 30d568ab..c44bbae6 100644 --- a/src/api/hooks/task/usePatchTask.ts +++ b/src/api/hooks/task/usePatchTask.ts @@ -14,7 +14,6 @@ const usePatchTask = () => { const { groupId } = variables; success("할 일 수정 성공"); - // TODO(지권): groupId 네이밍 변경 queryClient.invalidateQueries({ queryKey: ["groups", groupId], }); diff --git a/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.stories.tsx b/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.stories.tsx deleted file mode 100644 index a3bf7cb4..00000000 --- a/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.stories.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/nextjs"; -import MyWorkHistory from "./MyWorkHistory"; -import { TaskListItemType } from "@/types"; - -const meta: Meta = { - title: "Page/MyHistory/MyWorkHistory", - component: MyWorkHistory, - parameters: { - layout: "centered", - }, -}; - -export default meta; -type Story = StoryObj; - -const MY_HISTORY_ITEM_MOCK_DATA: TaskListItemType[] = [ - { - id: 1, - name: "아침 운동하기", - description: "30분 러닝 또는 스트레칭", - date: "2025-11-14T09:00:00.000Z", - doneAt: "2025-11-14T09:30:00.000Z", - updatedAt: "2025-11-14T09:30:00.000Z", - deletedAt: null, - displayIndex: 0, - commentCount: 2, - recurringId: 101, - frequency: "DAILY", - writer: { - image: "/images/user1.png", - nickname: "지권", - id: 11, - }, - doneBy: { - user: { - image: "/images/user1.png", - nickname: "지권", - id: 11, - }, - }, - }, - { - id: 2, - name: "주간 회고 작성", - description: "이번 주 목표 대비 진행 상황 점검", - date: "2025-11-15T20:00:00.000Z", - doneAt: "2025-11-15T20:15:00.000Z", - updatedAt: "2025-11-15T20:15:00.000Z", - deletedAt: null, - displayIndex: 1, - commentCount: 0, - recurringId: 202, - frequency: "WEEKLY", - writer: { - image: "/images/user2.png", - nickname: "홍길동", - id: 12, - }, - doneBy: { - user: { - image: "/images/user2.png", - nickname: "홍길동", - id: 12, - }, - }, - }, -]; - -export const Default: Story = { - args: { - title: "내가 한 일", - items: MY_HISTORY_ITEM_MOCK_DATA.map((item) => ({ item })), - }, -}; diff --git a/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.tsx b/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.tsx deleted file mode 100644 index ddea3d22..00000000 --- a/src/app/(route)/my-history/_components/MyWorkHistory/MyWorkHistory.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { TaskListItemType } from "@/types"; - -type Item = { - item: TaskListItemType; -}; - -interface MyWorkHistoryProps { - title: string; - items: Item[]; -} - -const MyWorkHistoryItem = ({ item }: Item) => { - return ( -
  • - - {item.commentCount > 0 && {item.commentCount}개} -
  • - ); -}; - -const MyWorkHistory = ({ title, items }: MyWorkHistoryProps) => { - return ( - - ); -}; - -export default MyWorkHistory; diff --git a/src/app/(route)/my-history/_components/index.ts b/src/app/(route)/my-history/_components/index.ts index 03ad07a4..e38ee470 100644 --- a/src/app/(route)/my-history/_components/index.ts +++ b/src/app/(route)/my-history/_components/index.ts @@ -1,2 +1 @@ -export { default as MyWorkHistory } from "./MyWorkHistory/MyWorkHistory"; export { default as WorkHistorySection } from "./WorkHistorySection/WorkHistorySection"; diff --git a/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/MakeTodoModal/MakeTodoModal.tsx b/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/MakeTodoModal/MakeTodoModal.tsx index 53ef3054..3a9e560c 100644 --- a/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/MakeTodoModal/MakeTodoModal.tsx +++ b/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/MakeTodoModal/MakeTodoModal.tsx @@ -111,7 +111,6 @@ const MakeTodoModal = ({ isOpen, onClose, groupId, taskListId }: MakeTodoModalPr - {/* TODO(지권): Disabled 상태 추가 필요 */} 만들기 diff --git a/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/TodoSection/TodoSection.tsx b/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/TodoSection/TodoSection.tsx index 49be2b1c..0ae97a8f 100644 --- a/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/TodoSection/TodoSection.tsx +++ b/src/app/(route)/team/[teamId]/task-list/[taskListId]/_components/TodoSection/TodoSection.tsx @@ -13,7 +13,6 @@ import { useTaskMutations } from "@/hooks"; import EditDataModal from "../../_detail/_components/_internal/EditDataModal/EditDataModal"; import { TaskResponse } from "@/api/axios/task/_types"; import ErrorState from "@/features/ErrorState/ErrorState"; -// TODO(지권): EditDataModal 네이밍 및 위치 변경 필요 interface TodoSectionHeaderProps { data: TaskResponse; diff --git a/src/app/(route)/team/[teamId]/task-list/[taskListId]/page.tsx b/src/app/(route)/team/[teamId]/task-list/[taskListId]/page.tsx index d3058151..e92c58a8 100644 --- a/src/app/(route)/team/[teamId]/task-list/[taskListId]/page.tsx +++ b/src/app/(route)/team/[teamId]/task-list/[taskListId]/page.tsx @@ -54,7 +54,7 @@ const TaskListPage = ({ params }: { params: Promise<{ teamId: number; taskListId

    목록 페이지

    - +
    diff --git a/src/common/Chip/Chip.stories.tsx b/src/common/Chip/Chip.stories.tsx deleted file mode 100644 index 40d48f7f..00000000 --- a/src/common/Chip/Chip.stories.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Meta, StoryObj } from "@storybook/nextjs"; -import Chip from "./Chip"; - -const meta: Meta = { - title: "Common/Chip", - component: Chip, - tags: ["autodocs"], - parameters: { - layout: "centered", - }, - decorators: [ - (Story) => ( -
    - -
    - ), - ], -}; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - title: "법인 등기", - count: 3, - isActive: false, - }, -}; - -export const Active: Story = { - args: { - title: "법인 등기", - count: 3, - isActive: true, - }, -}; - -export const CountOver99WithDefault: Story = { - args: { - title: "법인 등기", - count: 100, - isActive: false, - }, -}; - -export const CountOver99WithActive: Story = { - args: { - title: "법인 등기", - count: 100, - isActive: true, - }, -}; diff --git a/src/common/Chip/Chip.tsx b/src/common/Chip/Chip.tsx deleted file mode 100644 index 37883ae3..00000000 --- a/src/common/Chip/Chip.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { cn, formatClampedCount } from "@/utils"; -import Link from "next/link"; - -/** - * @author jikwon - * @component - * @example - * ```tsx - * - * ``` - */ - -interface ChipProps { - title: string; - count: number; - isActive?: boolean; -} - -const Chip = ({ title, count, isActive }: ChipProps) => { - return ( - - {title} - {formatClampedCount(count)} - - ); -}; - -export default Chip; diff --git a/src/common/PageHeaderBar/PageHeaderBar.tsx b/src/common/PageHeaderBar/PageHeaderBar.tsx index 712189d6..fef7180a 100644 --- a/src/common/PageHeaderBar/PageHeaderBar.tsx +++ b/src/common/PageHeaderBar/PageHeaderBar.tsx @@ -1,7 +1,14 @@ -import { cn } from "@/utils"; -import { ReactNode } from "react"; +"use client"; + +import { ReactNode, useState } from "react"; +import { useRouter } from "next/navigation"; +import Icon from "../Icon/Icon"; +import Modal from "../Modal/Modal"; import Dropdown from "../Dropdown/Dropdown"; +import BaseButton from "../Button/BaseButton"; +import { cn } from "@/utils"; import { LoadingSpinner } from "@/features"; +import { useDeleteGroup } from "@/api/hooks"; /** * @author jikwon @@ -13,30 +20,76 @@ import { LoadingSpinner } from "@/features"; interface PageHeaderBarProps { title: ReactNode; + id?: number; isDropdown?: boolean; } -const PageHeaderBar = ({ title, isDropdown = true }: PageHeaderBarProps) => { - // TODO(지권): 수정하기, 삭제하기 기능 추가 +const PageHeaderBar = ({ title, id, isDropdown = true }: PageHeaderBarProps) => { + const router = useRouter(); + const [isOpenDeleteModal, setIsOpenDeleteModal] = useState(false); + const { mutate: deleteGroup, isPending } = useDeleteGroup(); + const options = [ - { label: "수정하기", action: () => {} }, - { label: "삭제하기", action: () => {} }, + { label: "수정하기", action: () => router.push(`/team/${id}/edit`) }, + { label: "삭제하기", action: () => setIsOpenDeleteModal(true) }, ]; + const handleTeamDelete = () => { + if (!id) return; + + deleteGroup( + { id }, + { + onSettled: () => setIsOpenDeleteModal(false), + }, + ); + }; + return ( -
    -

    - {title || } -

    - {isDropdown && ( - + <> +
    +

    + {title || } +

    + {isDropdown && ( + + )} +
    + + {isOpenDeleteModal && ( + setIsOpenDeleteModal(false)}> + + +

    정말로 팀을 삭제하시겠습니까?

    +
    + + setIsOpenDeleteModal(false)}> + 취소하기 + + + 삭제하기 + + +
    )} -
    + ); }; diff --git a/src/common/PageHeaderBar/PageheaderBar.stories.tsx b/src/common/PageHeaderBar/PageheaderBar.stories.tsx index e54431fd..90c1c931 100644 --- a/src/common/PageHeaderBar/PageheaderBar.stories.tsx +++ b/src/common/PageHeaderBar/PageheaderBar.stories.tsx @@ -1,5 +1,8 @@ import { Meta, StoryObj } from "@storybook/nextjs"; import PageHeaderBar from "./PageHeaderBar"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +const queryClient = new QueryClient(); const meta: Meta = { component: PageHeaderBar, @@ -14,9 +17,11 @@ const meta: Meta = { }, decorators: [ (Story) => ( -
    - -
    + +
    + +
    +
    ), ], }; diff --git a/src/common/PageLayout/PageLayout.tsx b/src/common/PageLayout/PageLayout.tsx index 57b74996..8a1f5c63 100644 --- a/src/common/PageLayout/PageLayout.tsx +++ b/src/common/PageLayout/PageLayout.tsx @@ -11,7 +11,6 @@ import { cn } from "@/utils"; * * *
    - * ({ item }))} /> * *
    * diff --git a/src/common/index.ts b/src/common/index.ts index f0abaa33..68078cbf 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -11,7 +11,6 @@ export { default as Modal } from "./Modal/Modal"; export { default as InputReply } from "./Input/InputReply/InputReply"; export { default as DateItem } from "./DateItem/DateItem"; export { default as Todo } from "./Todo/Todo"; -export { default as Chip } from "./Chip/Chip"; export { default as Profile } from "./Profile/Profile"; export { default as ProfileItem } from "./Profile/ProfileItem/ProfileItem"; export { default as ProfileEdit } from "./Profile/ProfileEdit/ProfileEdit"; diff --git a/src/hooks/useTaskMutations/useListDataMutations.ts b/src/hooks/useTaskMutations/useListDataMutations.ts index 1bb9446a..4c4704d9 100644 --- a/src/hooks/useTaskMutations/useListDataMutations.ts +++ b/src/hooks/useTaskMutations/useListDataMutations.ts @@ -1,5 +1,4 @@ import { usePatchTaskDetail } from "@/api/hooks"; -// TODO(지권): 삭제 요청 확인 필요 import useDeleteTask from "@/api/hooks/task/useDeleteTask"; interface UseTaskListMutationsProps {