diff --git a/apps/client/src/shared/components/sidebar/PopupPortal.tsx b/apps/client/src/shared/components/sidebar/PopupPortal.tsx index 4767653e..c94e82e5 100644 --- a/apps/client/src/shared/components/sidebar/PopupPortal.tsx +++ b/apps/client/src/shared/components/sidebar/PopupPortal.tsx @@ -5,6 +5,7 @@ import type { PopupState } from '@shared/hooks/useCategoryPopups'; interface Props { popup: PopupState; onClose: () => void; + onChange?: (value: string) => void; onCreateConfirm?: () => void; onEditConfirm?: (id: number, draft?: string) => void; onDeleteConfirm?: (id: number) => void; @@ -13,6 +14,7 @@ interface Props { export default function PopupPortal({ popup, onClose, + onChange, onCreateConfirm, onEditConfirm, onDeleteConfirm, @@ -29,6 +31,7 @@ export default function PopupPortal({ title="카테고리 추가하기" left="취소" right="추가" + onInputChange={onChange} placeholder="카테고리 제목을 입력해주세요" onLeftClick={onClose} onRightClick={() => onCreateConfirm?.()} diff --git a/apps/client/src/shared/components/sidebar/Sidebar.tsx b/apps/client/src/shared/components/sidebar/Sidebar.tsx index 48e1f791..ffdcd284 100644 --- a/apps/client/src/shared/components/sidebar/Sidebar.tsx +++ b/apps/client/src/shared/components/sidebar/Sidebar.tsx @@ -10,21 +10,20 @@ import { useSidebarNav } from '@shared/hooks/useSidebarNav'; import { useCategoryPopups } from '@shared/hooks/useCategoryPopups'; import OptionsMenuPortal from './OptionsMenuPortal'; import PopupPortal from './PopupPortal'; - -const CATEGORIES = [ - { id: 1, label: '일정' }, - { id: 2, label: '공부' }, - { id: 3, label: '운동' }, - { id: 4, label: '취미' }, - { id: 5, label: '기타' }, - { id: 6, label: '기타' }, - { id: 7, label: '기타' }, - { id: 8, label: '기타' }, - { id: 9, label: '기타' }, - { id: 10, label: '기타' }, -]; +import { + useGetDashboardCategories, + usePostCategory, +} from '@shared/components/sidebar/apis/queries'; +import { useState } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; export function Sidebar() { + const [newCategoryName, setNewCategoryName] = useState(''); + const queryClient = useQueryClient(); + + const { data: categories } = useGetDashboardCategories(); + const { mutate: createCategory } = usePostCategory(); + const { activeTab, selectedCategoryId, @@ -35,6 +34,9 @@ export function Sidebar() { setSelectedCategoryId, } = useSidebarNav(); + const { popup, openCreate, openEdit, openDelete, close } = + useCategoryPopups(); + const { state: menu, open: openMenu, @@ -43,11 +45,25 @@ export function Sidebar() { style, } = useAnchoredMenu((anchor) => rightOf(anchor, 30)); - const { popup, openCreate, openEdit, openDelete, close } = - useCategoryPopups(); - const getCategoryName = (id: number | null) => - CATEGORIES.find((c) => c.id === id)?.label ?? ''; + categories?.categories.find((category) => category.id === id)?.name ?? ''; + + const handleCategoryChange = (name: string) => { + setNewCategoryName(name); + }; + + const handleCreateCategory = () => { + createCategory(newCategoryName, { + onSuccess: () => { + handleCategoryChange(''); + queryClient.invalidateQueries({ queryKey: ['dashboardCategories'] }); + close(); + }, + onError: (error) => { + console.error('카테고리 생성 실패:', error); + }, + }); + }; return (