From 051fb9fd535ee015f083df9697b207cb57fb7b1a Mon Sep 17 00:00:00 2001 From: hello-yujin Date: Tue, 10 Mar 2026 21:01:22 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20experienceQueryKey=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20aiReportsQueryKey?= =?UTF-8?q?=20=EC=B0=B8=EC=A1=B0=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/api/config/query-key.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 리스트 From 21284a45a55150d83fb18ae2284463c199515ec7 Mon Sep 17 00:00:00 2001 From: hello-yujin Date: Tue, 10 Mar 2026 21:10:45 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=EA=B2=BD=ED=97=98=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D/=EC=88=98=EC=A0=95=20=EB=8D=94=EB=B8=94=20submit=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/experience-detail/model/use-actions.ts | 3 +++ .../experience-detail/ui/experience-form/experience-form.tsx | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) 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={ - } From a3fcdd5265c2263168ce043b6c7093e19167d94e Mon Sep 17 00:00:00 2001 From: hello-yujin Date: Tue, 10 Mar 2026 21:27:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=EA=B2=BD=ED=97=98=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A7=A4=EC=A7=81=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A7=81=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/experience-detail/config/messages.ts | 1 + src/pages/experience-detail/experience-detail-page.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) 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/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 = (() => {