@@ -3,12 +3,7 @@ import { useEffect, useState } from 'react';
33import { useNavigate , useParams } from 'react-router-dom' ;
44
55import { CategoryIconType } from '@/entities/category' ;
6- import {
7- useUpdateCategory ,
8- useCategory ,
9- useCreateCategory ,
10- useCategories ,
11- } from '@/features/category' ;
6+ import { useUpdateCategory , useCategory , useCreateCategory } from '@/features/category' ;
127import { PATH } from '@/shared/constants' ;
138import { useDisclosure } from '@/shared/hooks' ;
149import {
@@ -21,6 +16,7 @@ import {
2116 SimpleLayout ,
2217} from '@/shared/ui' ;
2318import { CategoryIconTypeMap , cn } from '@/shared/utils' ;
19+ import { isErrorResponse } from '@/shared/utils/error' ;
2420
2521const CATEGORY_NAME_MAX_LENGTH = 10 ;
2622
@@ -32,7 +28,6 @@ const CategoryPage = () => {
3228 const drawerProps = useDisclosure ( ) ;
3329
3430 const { data : category } = useCategory ( categoryNo ) ;
35- const { data : categories } = useCategories ( ) ;
3631 const { mutateAsync : createCategory , isPending : isCreating } = useCreateCategory ( ) ;
3732 const { mutateAsync : updateCategory , isPending : isUpdating } = useUpdateCategory ( ) ;
3833 const isPending = isCreating || isUpdating ;
@@ -59,52 +54,46 @@ const CategoryPage = () => {
5954 }
6055 } , [ category ] ) ;
6156
62- useEffect ( ( ) => {
63- const isTooLong = trimmedCategoryName . length > CATEGORY_NAME_MAX_LENGTH ;
64- const isDuplicated = isPending
65- ? // @note : 낙관적 업데이트를 하기 때문에 카테고리 생성 중에 중복 에러 메시지 보이지 않도록 함
66- false
67- : categories ?. some (
68- ( category ) => category . title === trimmedCategoryName && category . no !== categoryNo ,
69- ) ;
70- if ( isTooLong ) {
71- return setErrorMessage ( `최대 ${ CATEGORY_NAME_MAX_LENGTH } 글자까지 입력할 수 있어요.` ) ;
72- }
73- if ( isDuplicated ) {
74- return setErrorMessage ( '이미 존재하는 카테고리예요.' ) ;
57+ const handleInput = ( e : React . ChangeEvent < HTMLInputElement > ) => {
58+ setTypedCategoryName ( e . target . value ) ;
59+ if ( e . target . value . length > CATEGORY_NAME_MAX_LENGTH ) {
60+ setErrorMessage ( `카테고리 이름은 ${ CATEGORY_NAME_MAX_LENGTH } 자 이내로 입력해주세요.` ) ;
61+ } else {
62+ setErrorMessage ( null ) ;
7563 }
76- setErrorMessage ( null ) ;
77- } , [ trimmedCategoryName , categories , categoryNo , isPending ] ) ;
78-
64+ } ;
7965 const handleClickChangeIconButton = ( ) => {
8066 drawerProps . setIsOpen ( true ) ;
8167 } ;
8268 const handleClickBackButton = ( ) => {
8369 navigate ( PATH . POMODORO , { state : { openChangeCategoryDrawer : true } } ) ;
8470 } ;
8571 const handleClickCompleteButton = async ( ) => {
86- // TODO:
87- // - 카테고리 api 호출 에러 처리
88- // - 이미 존재하는 카테고리인 경우
89- // - 카테고리 이름이 너무 긴 경우
90-
91- if ( isEditMode ) {
92- await updateCategory ( {
93- no : categoryNo ,
94- body : {
95- title : trimmedCategoryName ,
96- iconType : selectedCategoryIconType ,
97- } ,
98- } ) ;
99- } else {
100- await createCategory ( {
101- body : {
102- title : trimmedCategoryName ,
103- iconType : selectedCategoryIconType ,
104- } ,
105- } ) ;
72+ try {
73+ if ( isEditMode ) {
74+ await updateCategory ( {
75+ no : categoryNo ,
76+ body : {
77+ title : trimmedCategoryName ,
78+ iconType : selectedCategoryIconType ,
79+ } ,
80+ } ) ;
81+ } else {
82+ await createCategory ( {
83+ body : {
84+ title : trimmedCategoryName ,
85+ iconType : selectedCategoryIconType ,
86+ } ,
87+ } ) ;
88+ }
89+ navigate ( PATH . POMODORO , { state : { openChangeCategoryDrawer : true } } ) ;
90+ } catch ( error ) {
91+ const errorMessage = isErrorResponse ( error )
92+ ? error . message
93+ : '알 수 없는 오류가 발생했습니다.' ;
94+
95+ setErrorMessage ( errorMessage ) ;
10696 }
107- navigate ( PATH . POMODORO , { state : { openChangeCategoryDrawer : true } } ) ;
10897 } ;
10998
11099 return (
@@ -130,7 +119,7 @@ const CategoryPage = () => {
130119
131120 < input
132121 value = { typedCategoryName }
133- onChange = { ( e ) => setTypedCategoryName ( e . target . value ) }
122+ onChange = { handleInput }
134123 type = "text"
135124 placeholder = "카테고리 이름"
136125 className = "body-sb mt-6 w-full rounded-sm bg-white p-lg text-text-primary caret-text-accent-1 placeholder:text-text-disabled"
0 commit comments