From 2cbcadc4cc2f824a9bf4d17e6b59ab14311defa6 Mon Sep 17 00:00:00 2001 From: YuminPark Date: Mon, 25 Aug 2025 17:12:04 +0900 Subject: [PATCH 01/11] =?UTF-8?q?#207=20[DEL]=20=EC=B4=88=EB=8C=80=20url?= =?UTF-8?q?=20&=20=EC=9B=8C=ED=81=AC=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EB=AA=85=20=EA=B2=80=EC=82=AC=20=ED=95=A8=EC=88=98=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/validateInviteUrl.tsx | 1 - src/utils/validateWorkspaceName.ts | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/utils/validateInviteUrl.tsx b/src/utils/validateInviteUrl.tsx index ad959a04..e9393234 100644 --- a/src/utils/validateInviteUrl.tsx +++ b/src/utils/validateInviteUrl.tsx @@ -1,4 +1,3 @@ -// src/utils/validateInviteUrl.ts export const validateInviteUrl = (url?: string | null): boolean => { if (!url) return false; try { diff --git a/src/utils/validateWorkspaceName.ts b/src/utils/validateWorkspaceName.ts index f3128bfd..9fb51694 100644 --- a/src/utils/validateWorkspaceName.ts +++ b/src/utils/validateWorkspaceName.ts @@ -1,4 +1,3 @@ -// 워크스페이스 이름 유효성 검사 함수 type Validator = (name: string, firstChar: string) => string | null; const KOREAN = /[가-힣]/; @@ -7,19 +6,16 @@ const NON_ALNUM = /[^A-Za-z0-9]/; const ALNUM_SPACE = /^[A-Za-z0-9 ]+$/; const validators: Validator[] = [ - // 1) 길이 (name) => name.length < 4 || name.length > 10 ? '워크스페이스 이름은 4자 이상 10자 이하의 영문 또는 숫자여야 합니다.' : null, - // 2) 첫 글자: 한글/숫자/특수문자 금지 + 영문 시작 (_, fc) => (KOREAN.test(fc) ? '워크스페이스 이름은 한글로 시작할 수 없습니다.' : null), (_, fc) => (/[0-9]/.test(fc) ? '워크스페이스 이름은 숫자로 시작할 수 없습니다.' : null), (_, fc) => (NON_ALNUM.test(fc) ? '워크스페이스 이름은 특수문자로 시작할 수 없습니다.' : null), (_, fc) => (!START_ALPHA.test(fc) ? '워크스페이스 이름은 영문으로 시작해야 합니다.' : null), - // 3) 전체 문자열 제약 (name) => (KOREAN.test(name) ? '워크스페이스 이름에 한글은 사용할 수 없습니다.' : null), (name) => !ALNUM_SPACE.test(name) ? '워크스페이스 이름은 영문, 숫자, 공백만 사용할 수 있습니다.' : null, @@ -29,7 +25,7 @@ const validators: Validator[] = [ export const validateWorkspaceName = (raw: string): string | null => { const name = String(raw ?? ''); - const firstChar = name[0] ?? ''; // 빈 문자열일 때도 안전 + const firstChar = name[0] ?? ''; for (const v of validators) { const msg = v(name, firstChar); From 770389fac145549f25b0768b038a0dd36396c26b Mon Sep 17 00:00:00 2001 From: YuminPark Date: Mon, 25 Aug 2025 17:15:13 +0900 Subject: [PATCH 02/11] =?UTF-8?q?#207=20[REFACTOR]=20interface=20->=20type?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/workspace.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/types/workspace.ts b/src/types/workspace.ts index 06dff708..f0706a98 100644 --- a/src/types/workspace.ts +++ b/src/types/workspace.ts @@ -1,9 +1,9 @@ import type { CommonResponse } from './common'; // 워크스페이스 생성 -export interface CreateWorkspaceRequest { +export type CreateWorkspaceRequest = { workspaceName: string; -} +}; export type CreateWorkspaceResponse = CommonResponse<{ workspaceId: number; @@ -16,19 +16,19 @@ export type CreateWorkspaceResponse = CommonResponse<{ }>; // 워크스페이스 URL 생성 -export interface CreateWorkspaceUrlRequest { +export type CreateWorkspaceUrlRequest = { workspaceName: string; -} +}; export type CreateWorkspaceUrlResponse = CommonResponse<{ workspaceUrl: string; }>; // 워크스페이스 참여 -export interface JoinWorkspaceRequest { +export type JoinWorkspaceRequest = { token: string; password: string; -} +}; export type JoinWorkspaceResponse = CommonResponse<{ workspaceId: number; From 876f24562310ec93432830b5fb0e5cd4fd1f08b3 Mon Sep 17 00:00:00 2001 From: YuminPark Date: Mon, 25 Aug 2025 17:37:50 +0900 Subject: [PATCH 03/11] =?UTF-8?q?#207=20[DEL]=20onboarding=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=93=A4=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/onboarding/InviteLoading.tsx | 8 +++----- src/pages/onboarding/OnboardingCreateWorkspace.tsx | 9 --------- .../onboarding/OnboardingError404NotFound.tsx | 4 ---- src/pages/onboarding/OnboardingFinish.tsx | 7 ------- src/pages/onboarding/OnboardingInviteMember.tsx | 10 ---------- src/pages/onboarding/OnboardingSSOLogin.tsx | 6 ------ .../onboarding/ParticipateWorkspaceInputPw.tsx | 14 +++----------- src/pages/onboarding/TokenLoading.tsx | 2 -- 8 files changed, 6 insertions(+), 54 deletions(-) diff --git a/src/pages/onboarding/InviteLoading.tsx b/src/pages/onboarding/InviteLoading.tsx index cbaed70f..8a9656d5 100644 --- a/src/pages/onboarding/InviteLoading.tsx +++ b/src/pages/onboarding/InviteLoading.tsx @@ -1,5 +1,3 @@ -// src/pages/onboarding/InviteLoading.tsx -// 초대 받은 사용자를 위한 리다이렉트 페이지 import { useEffect } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { useLocalStorage } from '../../hooks/useLocalStorage'; @@ -7,9 +5,9 @@ import { LOCAL_STORAGE_KEY } from '../../constants/key'; import LoadingSpinner from '../../components/LoadingSpinner'; const InviteLoading = () => { - const { workspaceName } = useParams(); // URL 파라미터 추출 - const [searchParams] = useSearchParams(); // URL query parameter - const token = searchParams.get('token'); // token 값 추출 + const { workspaceName } = useParams(); + const [searchParams] = useSearchParams(); + const token = searchParams.get('token'); const navigate = useNavigate(); const { setItem: setWorkspaceName } = useLocalStorage(LOCAL_STORAGE_KEY.workspaceName); diff --git a/src/pages/onboarding/OnboardingCreateWorkspace.tsx b/src/pages/onboarding/OnboardingCreateWorkspace.tsx index 7fd638db..1f94f770 100644 --- a/src/pages/onboarding/OnboardingCreateWorkspace.tsx +++ b/src/pages/onboarding/OnboardingCreateWorkspace.tsx @@ -1,5 +1,3 @@ -// src/pages/onboarding/OnboardingCreateWorkspace.tsx - import PageIndicator from '../../components/Onboarding/PageIndicator'; import onboardingSteps from '../../constants/onboardingSteps'; import PrimaryButton from '../../components/Onboarding/PrimaryButton'; @@ -17,7 +15,6 @@ const OnboardingCreateWorkspace = () => { const { mutateAsync } = usePostCreateWorkspace(); const handleButtonClick = async () => { - // 이미 한 번 성공했다면: 재요청 없이 바로 이동 if (workspaceCreated) { navigate('/onboarding/invite'); return; @@ -34,9 +31,7 @@ const OnboardingCreateWorkspace = () => { return (
- {/* 인디케이터 */} - {/* 본문 */}

새 워크스페이스 생성하기

@@ -44,8 +39,6 @@ const OnboardingCreateWorkspace = () => { 팀이 함께 일하며 이슈들을 공유하는 환경이에요

- - {/* 워크스페이스 이름 & 워크스페이스 URL */} { setWorkspaceUrl={setWorkspaceUrl} setIsLocked={setIsLocked} /> - - {/* 워크스페이스 생성하기 버튼 */} {
- {/* 에러 문구 */}

404

@@ -18,7 +15,6 @@ const OnboardingError404NotFound = () => {
요청하신 페이지가 사라졌거나, 잘못된 경로로 이용하셨어요!

- {/* 돌아가기 버튼 */} navigate(-1)} />
diff --git a/src/pages/onboarding/OnboardingFinish.tsx b/src/pages/onboarding/OnboardingFinish.tsx index 13e6e932..da98b499 100644 --- a/src/pages/onboarding/OnboardingFinish.tsx +++ b/src/pages/onboarding/OnboardingFinish.tsx @@ -1,5 +1,3 @@ -// src/pages/onboarding/OnboardingFinish.tsx - import vecologo from '../../assets/logos/vecologo.svg'; import PageIndicator from '../../components/Onboarding/PageIndicator'; import onboardingSteps from '../../constants/onboardingSteps'; @@ -8,22 +6,17 @@ import PrimaryButton from '../../components/Onboarding/PrimaryButton'; const OnboardingFinish = () => { return (
- {/* 인디케이터 */} - {/* 본문 */}
- {/* 백호 로고 & 백호 텍스트 */}
Veco

Veco

- {/* 툴 소개 문구 */}

속도의 관성을 유지하여 목표를 달성하는 협업툴

- {/* 지금 시작하기 버튼 */}
diff --git a/src/pages/onboarding/OnboardingInviteMember.tsx b/src/pages/onboarding/OnboardingInviteMember.tsx index c586f276..163359fb 100644 --- a/src/pages/onboarding/OnboardingInviteMember.tsx +++ b/src/pages/onboarding/OnboardingInviteMember.tsx @@ -1,5 +1,3 @@ -// src/pages/onboarding/OnboardingInviteMember.tsx - import { useRef, useState, useEffect } from 'react'; import CopyToClipboard from '../../components/Onboarding/CopyToClipboard'; import PageIndicator from '../../components/Onboarding/PageIndicator'; @@ -10,8 +8,6 @@ import { useLocalStorage } from '../../hooks/useLocalStorage'; const OnboardingInviteMember = () => { const [inviteText, setInviteText] = useState(''); - - // 텍스트 영역의 DOM 요소에 접근하기 위한 ref (복사 기능용) const inputRef = useRef(null); const { getItem: getInviteUrl } = useLocalStorage(LOCAL_STORAGE_KEY.inviteUrl); @@ -27,29 +23,23 @@ const OnboardingInviteMember = () => { return (
- {/* 인디케이터 */} - {/* 본문 */}
- {/* 초대 문구 */}

팀원 초대

팀원을 {getName()}님의 팀에 초대해봐요

- {/* 입력창 */}