From f89f13a7d3d7964f4e1f9fd41144fa768971cfa1 Mon Sep 17 00:00:00 2001 From: hjkl Date: Wed, 22 Jul 2026 13:19:30 +0900 Subject: [PATCH 1/2] =?UTF-8?q?design:=20=ED=9B=84=EA=B8=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=B2=98=EC=9D=8C~=EC=8A=A4=ED=85=9D2=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EB=B0=98=EC=9D=91=ED=98=95=20ui=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(protected)/reviews/new/page.tsx | 2 +- .../project-invite-accept-modal.tsx | 84 +++++++++---------- .../components/project-invite-handler.tsx | 8 -- .../write-review/review-spectrum-slider.tsx | 17 ++-- .../write-review/review-step-spectrum.tsx | 20 +++-- .../write-review/review-step-tag.tsx | 18 ++-- .../write-review/write-review-flow.tsx | 40 ++++++--- .../components/dialog/confirmation-dialog.tsx | 4 +- shared/components/step-indicator.tsx | 11 ++- shared/constants/guidance-copy.ts | 5 +- 10 files changed, 113 insertions(+), 96 deletions(-) diff --git a/app/(protected)/reviews/new/page.tsx b/app/(protected)/reviews/new/page.tsx index 3ec4bde3..c21a5ac6 100644 --- a/app/(protected)/reviews/new/page.tsx +++ b/app/(protected)/reviews/new/page.tsx @@ -85,7 +85,7 @@ const ReviewNewPage = async ({ searchParams }: ReviewNewPageProps) => { }); return ( -
+
diff --git a/features/project/components/project-invite-accept-modal.tsx b/features/project/components/project-invite-accept-modal.tsx index 1b5bb60e..be73bf1f 100644 --- a/features/project/components/project-invite-accept-modal.tsx +++ b/features/project/components/project-invite-accept-modal.tsx @@ -14,8 +14,6 @@ import { PROJECT_INVITE_MAX_POSITIONS, PROJECT_POSITION_LABELS, PROJECT_POSITION type ProjectInviteAcceptModalProps = { open: boolean; - /** 링크를 공유한 사람의 이름. 백엔드 조회 없이 표시할 수 있는 유일한 프로젝트 맥락이다. */ - inviterName?: string; onOpenChange: (open: boolean) => void; onConfirm: (projectPositions: ProjectPositionValue[]) => void | Promise; isConfirming?: boolean; @@ -24,7 +22,6 @@ type ProjectInviteAcceptModalProps = { export const ProjectInviteAcceptModal = ({ open, - inviterName, onOpenChange, onConfirm, isConfirming = false, @@ -49,57 +46,54 @@ export const ProjectInviteAcceptModal = ({ -
- 후기 작성 - -
- - {inviterName ? {inviterName}님이 초대한 : null} - 프로젝트의 후기 작성에 참여하시겠습니까? - -
+
+ + 프로젝트 참여 + + + 이번 프로젝트에서 본인의 역할을 선택해주세요. -
-
-

- 이 프로젝트에서 맡은 직군을 선택해주세요. (최대 {PROJECT_INVITE_MAX_POSITIONS}개) -

- setSelectedPositions(value as ProjectPositionValue[])} - > - - {selectedPositions.length === 0 ? ( - {'\uc9c1\uad70\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694'} - ) : ( - selectedPositions.map((position) => ( - +
+ setSelectedPositions(value as ProjectPositionValue[])} + > + + {selectedPositions.length === 0 ? ( + 직군을 선택해주세요 + ) : ( + selectedPositions.map((position) => ( + + {PROJECT_POSITION_LABELS[position]} + + )) + )} + + + {PROJECT_POSITIONS.map((position) => ( + {PROJECT_POSITION_LABELS[position]} - - )) - )} - - - {PROJECT_POSITIONS.map((position) => ( - - {PROJECT_POSITION_LABELS[position]} - - ))} - - + + ))} + + +

+ 최대 {PROJECT_INVITE_MAX_POSITIONS}개까지 등록 가능해요. +

+
{!!errorMessage && ( -

+

{errorMessage}

)} diff --git a/features/project/components/project-invite-handler.tsx b/features/project/components/project-invite-handler.tsx index 50373a9e..aa763537 100644 --- a/features/project/components/project-invite-handler.tsx +++ b/features/project/components/project-invite-handler.tsx @@ -7,9 +7,7 @@ import { saveLoginReturnPath, useLoginGate } from '@/features/auth'; import { useMyProfile } from '@/features/profile'; import { ProjectInviteAcceptModal } from '@/features/project/components/project-invite-accept-modal'; import { ConfirmationDialog } from '@/shared/components/dialog/confirmation-dialog'; -import { SHARE_INVITER_NAME_PARAM } from '@/shared/constants/share-query'; import { ApiError } from '@/shared/lib/api'; -import { parseShareDisplayName } from '@/shared/lib/parse-share-display-name'; import type { ProjectPositionValue } from '../project.types'; @@ -40,11 +38,6 @@ export const ProjectInviteHandler = () => { const hasSession = profile != null; - const inviterName = useMemo( - () => parseShareDisplayName(searchParams.get(SHARE_INVITER_NAME_PARAM) ?? undefined) ?? '', - [searchParams], - ); - const clearInviteParam = useCallback(() => { if (searchParams.get(PROJECT_INVITE_QUERY_KEY) == null) { return; @@ -127,7 +120,6 @@ export const ProjectInviteHandler = () => { - {leftLabel} +
+
+ {leftLabel} + {rightLabel} +
- - {rightLabel} - +
); }; diff --git a/features/review/components/write-review/review-step-spectrum.tsx b/features/review/components/write-review/review-step-spectrum.tsx index 7b52873c..fdf6ea25 100644 --- a/features/review/components/write-review/review-step-spectrum.tsx +++ b/features/review/components/write-review/review-step-spectrum.tsx @@ -33,10 +33,10 @@ export const ReviewStepSpectrum = ({ spectrums, onPrev, onNext }: Props) => { }; return ( -
-

업무 성향 스펙트럼 선택

+
+

소프트 스킬 스펙트럼 성향

-
+
{spectrums.map((spectrum) => { const answer = selectedSpectrums.find((item) => item.spectrumId === spectrum.spectrumId); @@ -52,17 +52,23 @@ export const ReviewStepSpectrum = ({ spectrums, onPrev, onNext }: Props) => { })}
-
+
-
diff --git a/features/review/components/write-review/review-step-tag.tsx b/features/review/components/write-review/review-step-tag.tsx index 18a56157..1b0a09ed 100644 --- a/features/review/components/write-review/review-step-tag.tsx +++ b/features/review/components/write-review/review-step-tag.tsx @@ -36,10 +36,10 @@ export const ReviewStepTag = ({ tags, onPrev, onNext }: Props) => { }; return ( -
+

태그 선택(최대 {REVIEW_MAX_TAGS}개)

-
+
{tags.map((tag) => { const selected = selectedTagIdSet.has(tag.tagId); const disabled = !selected && selectedTagIds.length >= REVIEW_MAX_TAGS; @@ -65,17 +65,23 @@ export const ReviewStepTag = ({ tags, onPrev, onNext }: Props) => { })}
-
+
-
diff --git a/features/review/components/write-review/write-review-flow.tsx b/features/review/components/write-review/write-review-flow.tsx index d84a79b2..8c47ad0b 100644 --- a/features/review/components/write-review/write-review-flow.tsx +++ b/features/review/components/write-review/write-review-flow.tsx @@ -51,19 +51,33 @@ export const WriteReviewFlow = ({ projectId, revieweeId, revieweeName }: Props) ); } + const stepDescription = { + tag: ( + <> + {displayName}님에 태그를 선택해주세요. + + ), + spectrum: ( + <> + {displayName}님에 소프트 스킬 스펙트럼을 선택해주세요. + + ), + feedback: ( + <> + {displayName}님에 대한 솔직한 후기를 남겨주세요. + + ), + }[currentStep]; + return (
-

후기 작성

-

- { - { - tag: `${displayName}님을 잘 나타내는 태그를 선택해주세요.`, - spectrum: `${displayName}님의 업무 성향 스펙트럼을 선택해주세요.`, - feedback: `${displayName}님에 대한 솔직한 후기를 남겨주세요.`, - }[currentStep] - } -

- +
+
+

후기 작성

+

{stepDescription}

+
+ +
{isPending ? ( -

불러오는 중...

+

불러오는 중...

) : isError || !formData ? ( -
+

데이터를 불러오지 못했습니다.

+
+
+ ); +}; diff --git a/features/review/components/write-review/review-step-feedback.tsx b/features/review/components/write-review/review-step-feedback.tsx index 4a646e7e..2746b400 100644 --- a/features/review/components/write-review/review-step-feedback.tsx +++ b/features/review/components/write-review/review-step-feedback.tsx @@ -22,60 +22,72 @@ export const ReviewStepFeedback = ({ isSubmitting = false, onPrev }: Props) => { const errorMessage = formState.errors.feedback?.message; return ( -
-

후기 작성

-

- (필수) 최소 {REVIEW_FEEDBACK_MIN_LENGTH}자 이상 작성해주세요. -

+
+
+

후기 작성

+

(필수) 최소 {REVIEW_FEEDBACK_MIN_LENGTH}자이상 작성해주세요.

- ( -