diff --git a/src/features/experience-detail/config/messages.ts b/src/features/experience-detail/config/messages.ts index 98bdfda4..d45714fa 100644 --- a/src/features/experience-detail/config/messages.ts +++ b/src/features/experience-detail/config/messages.ts @@ -40,6 +40,7 @@ export const EXPERIENCE_MESSAGES = { SAVE_FAILED: "경험 저장에 실패했습니다. 다시 시도해주세요", DELETE_FAILED: "경험 삭제에 실패했습니다. 다시 시도해주세요", DEFAULT_SETTING_FAILED: "기본 경험 설정에 실패했습니다", + FETCH_FAILED: "경험 데이터를 불러오는데 실패했습니다.", }, SUCCESS: { diff --git a/src/features/experience-detail/model/use-actions.ts b/src/features/experience-detail/model/use-actions.ts index 7dc1587f..e2a2a9cd 100644 --- a/src/features/experience-detail/model/use-actions.ts +++ b/src/features/experience-detail/model/use-actions.ts @@ -97,6 +97,9 @@ export const useExperienceSubmit = () => { }); const submit = useCallback(async () => { + const { isSubmitting } = useExperienceDetailStore.getState(); + if (isSubmitting) return; + const result = validateExperienceDraft(draft); if (!result.ok) { diff --git a/src/features/experience-detail/ui/experience-form/experience-form.tsx b/src/features/experience-detail/ui/experience-form/experience-form.tsx index 65a56111..fc50ef92 100644 --- a/src/features/experience-detail/ui/experience-form/experience-form.tsx +++ b/src/features/experience-detail/ui/experience-form/experience-form.tsx @@ -9,6 +9,7 @@ import { useExperienceHeaderActions, } from "../../model/use-actions"; import { useExperienceDateField } from "../../model/use-experience-date-field"; +import { useExperienceDetailStore } from "../../store/experience.store"; import { useExperienceActions, useExperienceDraft, @@ -22,6 +23,7 @@ import type { TextfieldType } from "@/shared/ui/textfield/textfield"; const ExperienceForm = () => { const draft = useExperienceDraft(); const isDraftDefault = useIsDraftDefault(); + const isSubmitting = useExperienceDetailStore((s) => s.isSubmitting); const { setDraftField } = useExperienceActions(); const { onToggleDefault } = useExperienceHeaderActions(); @@ -36,7 +38,7 @@ const ExperienceForm = () => { isDefault={isDraftDefault} onToggle={onToggleDefault} rightSlot={ - } diff --git a/src/pages/experience-detail/experience-detail-page.tsx b/src/pages/experience-detail/experience-detail-page.tsx index a0f2769f..0976f159 100644 --- a/src/pages/experience-detail/experience-detail-page.tsx +++ b/src/pages/experience-detail/experience-detail-page.tsx @@ -10,6 +10,7 @@ import { useLeaveConfirm, useGetExperienceDetail, hydrateExperienceFromApi, + EXPERIENCE_MESSAGES, } from "@/features/experience-detail"; import { ModalBasic } from "@/shared/ui/modal/modal-basic"; @@ -51,7 +52,7 @@ const ExperienceDetailPage = ({ mode }: ExperiencePageProps) => { } if (shouldFetch && isError) { - return
경험 데이터를 불러오는데 실패했습니다.
; + return
{EXPERIENCE_MESSAGES.API.FETCH_FAILED}
; } const content = (() => { diff --git a/src/shared/api/config/query-key.ts b/src/shared/api/config/query-key.ts index 758caed2..3fb99be4 100644 --- a/src/shared/api/config/query-key.ts +++ b/src/shared/api/config/query-key.ts @@ -6,7 +6,7 @@ export const universityQueryKey = { // 경험 관련 API (experience) export const experienceQueryKey = { - all: () => ["experiene"], + all: () => ["experience"], lists: () => [...experienceQueryKey.all(), "list"], // 모든 경험 리스트 list: (type: string, page: number) => [ ...experienceQueryKey.lists(), @@ -27,7 +27,7 @@ export const meQueryKey = { export const aiReportsQueryKey = { all: () => ["aiReports"], list: (page: number, keyword?: string) => [ - ...experienceQueryKey.all(), + ...aiReportsQueryKey.all(), page, keyword, ], // page, keyword에 따른 AI report 리스트