-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat: #115 일정 등록 모달의 파일 업로드 기능 구현 #166
Conversation
Walkthrough이번 변경 사항은 파일 업로드 기능을 구현하기 위해 여러 컴포넌트와 서비스에 대한 수정이 포함되어 있습니다. Changes
Assessment against linked issues
Possibly related PRs
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 13
🧹 Outside diff range and nitpick comments (15)
src/constants/mimeFileType.ts (3)
1-5
: 이미지 파일 상수가 잘 정의되었습니다.이미지 파일 MIME 타입이 정확하게 정의되어 있습니다. 코드가 깔끔하고 일관성 있게 작성되었습니다.
추가적으로 GIF 형식도 고려해 보는 것이 어떨까요? 다음과 같이 추가할 수 있습니다:
export const GIF = 'image/gif';
14-23
: 문서 파일 상수가 잘 정의되었습니다.문서 파일 MIME 타입이 정확하게 정의되어 있습니다. 다양한 문서 형식을 포함하고 있어 좋습니다.
HWP 형식은 한국 시장에 특화된 형식입니다. 이에 대한 간단한 주석을 추가하는 것이 좋을 것 같습니다. 예를 들어:
// HWP: 한글 워드 프로세서 파일 형식 export const HWP = 'application/x-hwp';
25-44
:TASK_ACCEPT_FILE_TYPES
배열이 잘 정의되었습니다.모든 정의된 MIME 타입을 포함하고 있어 편리하게 사용할 수 있을 것 같습니다.
향후 확장성을 고려하여, 파일 유형별로 별도의 배열을 만드는 것도 좋은 방법일 수 있습니다. 예를 들어:
export const IMAGE_FILE_TYPES = [JPG, PNG, SVG, WEBP]; export const COMPRESSED_FILE_TYPES = [ZIP, RAR, Z7, ALZ, EGG]; export const DOCUMENT_FILE_TYPES = [TXT, PDF, HWP, DOC, XLS, PPT, DOCX, XLSX, PPTX]; export const TASK_ACCEPT_FILE_TYPES = [ ...IMAGE_FILE_TYPES, ...COMPRESSED_FILE_TYPES, ...DOCUMENT_FILE_TYPES, ];이렇게 하면 필요에 따라 특정 유형의 파일만 사용하거나, 새로운 파일 유형을 쉽게 추가할 수 있습니다.
src/types/TaskType.tsx (1)
32-32
: 새로운 TaskUploadForm 타입 추가
TaskUploadForm
타입의 추가는 파일 업로드 기능 구현이라는 PR 목표에 잘 부합합니다. 특정 태스크와 연관된 개별 파일 업로드를 위한 타입으로 적절하게 정의되었습니다.제안: 타입의 목적을 더 명확히 하기 위해 주석을 추가하는 것이 좋을 것 같습니다. 예를 들어:
// 개별 태스크에 대한 파일 업로드를 위한 타입 export type TaskUploadForm = Pick<Task, 'taskId'> & { file: File };이렇게 하면 이 타입의 용도를 더 쉽게 이해할 수 있을 것입니다.
src/utils/Validator.ts (2)
35-40
: 구현이 잘 되었습니다. 작은 개선 사항이 있습니다.이 메서드는 파일 수 유효성 검사를 잘 수행하고 있습니다. 음수 검사와 에러 처리가 잘 되어 있습니다.
개선 제안: 에러 메시지를 상수로 분리하여 재사용성을 높이는 것이 좋습니다. 예를 들어:
private static readonly NEGATIVE_FILE_COUNT_ERROR = '최대 파일수와 현재 파일 수는 음수가 될 수 없습니다.'; public static isValidFileCount(maxCount: number, currentCount: number) { if (!Validator.isPositiveNumberWithZero(maxCount) || !Validator.isPositiveNumberWithZero(currentCount)) { throw Error(Validator.NEGATIVE_FILE_COUNT_ERROR); } return maxCount >= currentCount; }
50-53
: 파일 이름 유효성 검사가 잘 구현되었습니다.이 메서드는 가져온 정규 표현식 상수를 올바르게 사용하고 있으며, 구현이 간단하고 명확합니다.
개선 제안:
FILE_NAME_REGEX
의 패턴을 설명하는 주석을 추가하면 좋을 것 같습니다. 예를 들어:public static isValidFileName(fileName: string) { // FILE_NAME_REGEX: 파일 이름에 허용되는 문자와 형식을 정의하는 정규 표현식 // (예: 영숫자, 특수 문자 '_-.' 허용, 최대 길이 255자 등) const fileNameRegex = new RegExp(FILE_NAME_REGEX); return fileNameRegex.test(fileName); }이렇게 하면 코드의 가독성과 유지보수성이 향상됩니다.
src/components/common/FileDropZone.tsx (2)
22-22
:FileDropZone
함수에accept
매개변수 추가 승인
FileDropZone
함수에accept = '*'
를 추가한 것은 적절합니다. 이는 컴포넌트의 유연성을 유지하면서 파일 유형 제한 기능을 구현합니다.가독성을 높이기 위해 기본값에 대한 간단한 주석을 추가하는 것이 좋을 것 같습니다. 예를 들어:
accept = '*', // 기본값: 모든 파일 유형 허용
45-53
: 파일 업로드를 위한input
요소 추가 승인파일 업로드를 위한
input
요소를 추가하고accept
속성을 적용한 것은 PR의 목표를 잘 달성하고 있습니다. 이는 파일 유형 제한 기능을 효과적으로 구현합니다.접근성을 개선하기 위해
aria-label
속성을 추가하는 것이 좋을 것 같습니다. 예를 들어:<input id={id} type="file" accept={accept} className="h-0 w-0 opacity-0" onChange={handleFileChange} multiple hidden aria-label="파일 선택" />이렇게 하면 스크린 리더 사용자에게 입력 필드의 목적을 더 명확히 전달할 수 있습니다.
src/services/taskService.ts (1)
39-58
: uploadTaskFile 함수 추가를 승인하며, 에러 처리 개선을 제안합니다.새로 추가된
uploadTaskFile
함수는 잘 구현되었습니다. FormData를 사용한 파일 업로드 처리, RESTful 엔드포인트 구조, 그리고 상세한 JSDoc 문서화가 잘 되어 있습니다.개선을 위한 제안:
- 파일 크기나 타입에 대한 클라이언트 측 유효성 검사를 추가하는 것이 좋습니다.
- 네트워크 오류나 서버 오류에 대한 에러 처리를 추가하는 것이 좋습니다.
에러 처리를 위해 다음과 같은 코드를 추가할 수 있습니다:
try { return await authAxios.postForm(`/project/${projectId}/task/${taskId}/upload`, fileFormData, axiosConfig); } catch (error) { console.error('파일 업로드 중 오류 발생:', error); throw error; // 또는 사용자 정의 에러 객체를 throw }src/hooks/query/useTaskQuery.ts (2)
39-47
: 에러 처리 개선이 잘 되었습니다. 작은 개선 사항을 제안합니다.에러 발생 시 사용자에게 알림을 주는
toastError
추가는 좋은 개선입니다. 사용자 경험을 더욱 향상시키기 위해, 에러 메시지에 구체적인 오류 정보를 포함시키는 것을 고려해 보세요.다음과 같이 에러 메시지를 더 구체적으로 만들 수 있습니다:
-toastError('프로젝트 일정 등록 중 오류가 발생했습니다. 잠시후 다시 등록해주세요.'); +toastError(`프로젝트 일정 등록 중 오류가 발생했습니다: ${error.message}. 잠시후 다시 등록해주세요.`);
57-69
: 파일 업로드 기능이 잘 구현되었습니다. 성공 처리를 추가하면 좋겠습니다.
useUploadTaskFile
함수는 PR의 주요 목적인 파일 업로드 기능을 잘 구현하고 있습니다. 에러 처리도 적절히 되어 있어 좋습니다.사용자 경험을 더욱 개선하기 위해, 파일 업로드 성공 시에도 알림을 추가하는 것이 좋겠습니다. 다음과 같이
onSuccess
핸들러를 추가할 수 있습니다:export function useUploadTaskFile(projectId: Project['projectId']) { - const { toastError } = useToast(); + const { toastError, toastSuccess } = useToast(); const mutation = useMutation({ mutationFn: ({ taskId, file }: TaskUploadForm) => uploadTaskFile(projectId, taskId, file, { headers: { 'Content-Type': 'multipart/form-data' }, }), onError: (error, { file }) => toastError(`${file.name} 파일 업로드에 실패 했습니다.`), + onSuccess: (_, { file }) => toastSuccess(`${file.name} 파일이 성공적으로 업로드되었습니다.`), }); return mutation; }src/mocks/services/taskServiceHandler.ts (2)
55-59
: 일정 생성 API 응답 개선이 좋습니다.새로 생성된 task 객체를 반환하도록 변경한 것은 좋은 개선입니다. 이는 RESTful API 모범 사례와 일치하며, 클라이언트에게 즉각적인 피드백을 제공합니다.
다음과 같이 상태 코드를 201(Created)로 변경하는 것을 고려해보세요:
- return HttpResponse.json(newTask); + return HttpResponse.json(newTask, { status: 201 });이는 리소스 생성 성공을 더 명확히 나타냅니다.
Line range hint
1-268
: 전반적인 변경 사항이 PR 목표와 잘 일치합니다.파일 업로드 기능 추가와 기존 엔드포인트의 개선이 잘 이루어졌습니다. 타입 처리와 응답 형식이 개선되어 전체적인 코드 품질이 향상되었습니다.
코드의 가독성과 유지보수성을 더욱 향상시키기 위해, 공통으로 사용되는 유효성 검사 로직(예: 프로젝트 및 작업 존재 여부 확인)을 별도의 함수로 추출하는 것을 고려해보세요. 이렇게 하면 코드 중복을 줄이고 일관성을 유지할 수 있습니다.
예를 들어:
function validateProjectAndTask(projectId: number, taskId: number) { const project = PROJECT_DUMMY.find((project) => project.projectId === projectId); if (!project) return new HttpResponse('프로젝트를 찾을 수 없습니다.', { status: 404 }); const task = TASK_DUMMY.find((task) => task.taskId === taskId); if (!task) return new HttpResponse('일정을 찾을 수 없습니다.', { status: 404 }); return { project, task }; }이 함수를 여러 핸들러에서 재사용할 수 있습니다.
src/mocks/mockData.ts (1)
715-732
: FILE_DUMMY 상수가 적절히 추가되었습니다.MSW를 위한 임시 파일 저장 목적으로
FILE_DUMMY
상수를 추가한 것은 좋은 접근입니다. 파일 업로드 기능 테스트에 유용할 것입니다.파일 크기를 다양하게 설정하여 파일 크기 제한 테스트도 가능하게 만드는 것이 좋을 것 같습니다. 예를 들어:
export const FILE_DUMMY: FileInfo[] = [ { fileId: 1, taskId: 1, - file: new Blob(['최종본 내용'], { type: 'text/plain' }), + file: new Blob([new Array(1024 * 1024).join('a')], { type: 'text/plain' }), // 약 1MB 크기 }, // ... 다른 파일들 ];src/components/modal/task/CreateModalTask.tsx (1)
59-60
: 실패한 파일 업로드에 대한 에러 토스트를 추가해주세요성공한 파일 업로드에 대한 토스트는 표시하고 있지만, 실패한 파일 업로드에 대한 에러 토스트가 없습니다. 다음과 같이 실패한 업로드 수를 알려주는 코드를 추가하면 사용자 경험이 향상될 것입니다.
if (fulfilledFileList.length > 0) toastSuccess(`${fulfilledFileList.length}개의 파일 업로드에 성공했습니다.`); + if (rejectedFileList.length > 0) toastError(`${rejectedFileList.length}개의 파일 업로드에 실패했습니다.`);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (15)
- src/components/common/FileDropZone.tsx (3 hunks)
- src/components/modal/task/CreateModalTask.tsx (2 hunks)
- src/components/modal/task/ModalTaskForm.tsx (4 hunks)
- src/components/modal/task/UpdateModalTask.tsx (1 hunks)
- src/constants/mimeFileType.ts (1 hunks)
- src/constants/regex.ts (1 hunks)
- src/constants/settings.ts (2 hunks)
- src/hooks/query/useTaskQuery.ts (4 hunks)
- src/mocks/mockData.ts (2 hunks)
- src/mocks/mockHash.ts (1 hunks)
- src/mocks/services/taskServiceHandler.ts (3 hunks)
- src/services/taskService.ts (1 hunks)
- src/types/FileType.tsx (1 hunks)
- src/types/TaskType.tsx (1 hunks)
- src/utils/Validator.ts (2 hunks)
✅ Files skipped from review due to trivial changes (1)
- src/mocks/mockHash.ts
🧰 Additional context used
📓 Learnings (2)
📓 Common learnings
Learnt from: Seok93 PR: GU-99/grow-up-fe#131 File: src/components/common/FileDropZone.tsx:26-26 Timestamp: 2024-09-14T04:03:37.675Z Learning: 파일 업로드 작업과 함께 `FileDropZone.tsx`의 `accept` 속성을 추가할 예정입니다.
src/components/common/FileDropZone.tsx (1)
Learnt from: Seok93 PR: GU-99/grow-up-fe#131 File: src/components/common/FileDropZone.tsx:26-26 Timestamp: 2024-09-14T04:03:37.675Z Learning: 파일 업로드 작업과 함께 `FileDropZone.tsx`의 `accept` 속성을 추가할 예정입니다.
🔇 Additional comments (16)
src/types/FileType.tsx (1)
15-23
: 새로운 타입 정의가 잘 구현되었습니다.
FileUploadSuccessResult
와FileUploadFailureResult
타입이 파일 업로드 기능의 결과를 잘 표현하고 있습니다. 이는 PR의 목표와 일치하며,Promise.allSettled
의 결과 처리에 적합합니다.다만, 일관성을 위해 다음과 같은 작은 개선을 제안합니다:
export type FileUploadSuccessResult = { status: 'fulfilled'; - file: File; + file: CustomFile; }; export type FileUploadFailureResult = { status: 'rejected'; - file: File; + file: CustomFile; error: unknown; };이렇게 하면
CustomFile
타입과 일관성을 유지하면서, 파일 ID와 파일 이름 정보도 포함할 수 있습니다.src/constants/regex.ts (1)
3-3
: 파일 이름 정규식이 추가되었습니다.새로운
FILE_NAME_REGEX
상수가 추가된 것을 확인했습니다. 이는 파일 업로드 기능 구현을 위한 PR 목표와 일치합니다.다만, 몇 가지 고려사항을 제안드립니다:
파일 이름의 최대 길이를 제한하는 것이 좋을 수 있습니다. 예를 들어:
export const FILE_NAME_REGEX = /^[가-힣a-zA-Z0-9 _\-.]{1,255}$/;파일 이름에 공백을 허용하는 것이 의도적인지 확인해주세요. 일부 시스템에서는 파일 이름에 공백이 문제를 일으킬 수 있습니다.
파일 이름 시작과 끝에 공백, 밑줄, 하이픈, 마침표가 오지 않도록 정규식을 더 엄격하게 만들 수 있습니다:
export const FILE_NAME_REGEX = /^[가-힣a-zA-Z0-9][가-힣a-zA-Z0-9 _\-.]*[가-힣a-zA-Z0-9]$/;이러한 변경사항들이 프로젝트의 요구사항과 일치하는지 검토해주시기 바랍니다.
src/constants/mimeFileType.ts (1)
7-12
: 압축 파일 상수가 잘 정의되었습니다.압축 파일 MIME 타입이 정확하게 정의되어 있습니다. 코드가 깔끔하고 일관성 있게 작성되었습니다.
ALZ와 EGG 형식은 상대적으로 덜 일반적입니다. 이 형식들이 프로젝트에서 특별히 필요한 이유가 있는지 확인해 주시겠습니까? 만약 특정 지역이나 애플리케이션에 특화된 형식이라면, 주석으로 그 이유를 설명하는 것이 좋을 것 같습니다.
src/types/TaskType.tsx (2)
26-26
: 타입 이름 변경이 적절합니다.
TaskFileForm
에서TaskFilesForm
으로의 이름 변경은 타입의 의미를 더 정확하게 반영합니다. 복수의 파일을 다루는 형태를 명확히 나타내므로 좋은 변경입니다.
31-31
: TaskForm 타입 정의의 개선
TaskForm
을TaskCreationForm
과TaskFilesForm
의 조합으로 정의한 것은 매우 적절합니다. 이 변경으로 태스크 생성과 파일 업로드 정보를 하나의 타입으로 통합하여 폼 처리를 단순화할 수 있습니다. 코드의 가독성과 유지보수성이 향상될 것으로 보입니다.src/utils/Validator.ts (1)
31-33
: LGTM! 메서드가 잘 구현되었습니다.이 메서드는 숫자의 타입과 값을 정확하게 확인하고 있습니다. 메서드 이름도 명확하고 설명적입니다.
src/components/common/FileDropZone.tsx (2)
9-9
:FileDropZoneProps
에accept
속성 추가 승인
FileDropZoneProps
타입에accept: string
속성을 추가한 것은 PR의 목표와 일치하며, 파일 업로드 기능 구현에 필요한 변경사항입니다. 이는 컴포넌트의 타입 안정성을 향상시키고, 파일 유형 제한 기능을 지원합니다.
Line range hint
1-86
: 전체적인 변경 사항에 대한 검토
FileDropZone
컴포넌트에 대한 변경 사항은 PR의 목표를 잘 달성하고 있습니다.accept
속성의 추가는 파일 업로드 기능을 효과적으로 개선하며, 타입 안정성과 하위 호환성을 유지하고 있습니다.주요 개선 사항:
FileDropZoneProps
에accept
속성 추가FileDropZone
함수에accept
매개변수 추가 (기본값 설정)input
요소에accept
속성 적용이러한 변경으로 파일 유형 제한 기능이 성공적으로 구현되었습니다. 제안된 minor 개선 사항들(주석 추가, 접근성 개선)을 적용하면 코드의 품질을 더욱 향상시킬 수 있을 것입니다.
전반적으로 잘 구현되었으며, PR의 목표를 충족하고 있습니다. 제안된 minor 개선 사항들을 고려해 보시기 바랍니다.
src/services/taskService.ts (2)
29-37
: createTask 함수의 반환 타입 개선을 승인합니다.
createTask
함수의 반환 타입을Promise<AxiosResponse<void>>
에서Promise<AxiosResponse<Task>>
로 변경한 것은 좋은 개선입니다. 이 변경으로 API 응답에서 생성된 작업에 대한 더 자세한 정보를 얻을 수 있게 되었습니다. 이는 API 설계 모범 사례에 부합하며, 클라이언트 측에서 새로 생성된 작업의 세부 정보를 즉시 활용할 수 있게 해줍니다.
Line range hint
1-58
: 전체적인 변경 사항이 PR 목표와 잘 부합합니다.이 파일의 변경 사항은 일정 등록 모달의 파일 업로드 기능 구현이라는 PR 목표를 잘 반영하고 있습니다.
createTask
함수의 반환 타입 개선과uploadTaskFile
함수의 추가는 파일 업로드 기능을 효과적으로 지원합니다.이러한 변경 사항은 AI 생성 요약 및 이전에 학습한
FileDropZone.tsx
의accept
속성 추가 계획과도 일관성이 있습니다. 전반적으로 잘 구현되었으며, 제안된 minor 개선 사항을 적용하면 더욱 견고한 코드가 될 것 같습니다.src/hooks/query/useTaskQuery.ts (1)
12-12
: 파일 업로드 기능을 위한 import 및 타입 추가가 적절합니다.
uploadTaskFile
함수와TaskUploadForm
타입의 추가는 새로운 파일 업로드 기능 구현에 필요한 변경사항으로 보입니다. 이는 PR의 목적과 일치하며 적절해 보입니다.Also applies to: 24-24
src/components/modal/task/UpdateModalTask.tsx (1)
196-196
: 파일 업로드 기능 구현에 대한 승인
FileDropZone
컴포넌트에accept
속성을 추가한 것은 PR의 목표와 일치하며, 다양한 파일 형식을 지원하는 좋은 구현입니다.다만, 가독성 향상을 위해 다음과 같이 파일 확장자를 그룹화하는 것을 고려해보세요:
accept={` .jpg,.jpeg,.png,.svg,.webp, // 이미지 .pdf,.txt,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.hwp, // 문서 .zip,.rar,.7z,.alz,.egg // 압축 파일 `}이렇게 하면 나중에 파일 형식을 추가하거나 수정할 때 더 쉽게 관리할 수 있습니다.
src/mocks/services/taskServiceHandler.ts (2)
3-3
: 가져오기 문 및 타입 정의 추가가 적절합니다.
FILE_DUMMY
가져오기와 task 관련 폼 타입들의 추가는 파일 업로드 기능 구현과 일정한 관련이 있으며, PR의 목표와 일치합니다.Also applies to: 15-15
Line range hint
193-194
: 일정 정보 수정 API에서 타입 변환이 개선되었습니다.
statusId
를 명시적으로 숫자로 변환한 것은 좋은 변경입니다. 이는 타입 일관성을 보장하고 잠재적인 타입 강제 변환 문제를 방지합니다.src/mocks/mockData.ts (2)
35-39
: 새로운 FileInfo 타입이 적절히 정의되었습니다.
FileInfo
타입은 파일 업로드 기능 구현에 필요한 정보를 잘 캡슐화하고 있습니다.file
속성에Blob
타입을 사용한 것은 파일 데이터 처리에 적합합니다.
698-710
: TASK_FILE_DUMMY의 파일 확장자 변경이 적절합니다.파일 확장자를 PDF에서 TXT로 변경한 것은 새로운
FILE_DUMMY
상수의 텍스트 콘텐츠와 일관성이 있습니다. 이는 파일 업로드 기능 구현에 도움이 될 것입니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다수의 파일을 전송한다는 특수한 상황 덕분에 이렇게 map 메서드를 사용해서 네트워크 요청을 보내는 코드도 접하게 되는군요😂 여러 개의 파일 업로드 성공 실패 분기 처리가 어려우셨을 것 같은데 고생 많으셨습니다! 이번에도 AI와 하신 대화와 작성하신 코드 보면서 많이 배워갑니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
파일 업로드 기능 구현 수고하셨습니다. mimefile과 valid 만드는데 고생했을거같아요
@Yoonyesol @ice-bear98 리뷰 감사합니다! |
* Config: #3 누락된 환경 설정 내용 추가 1. react query eslint 추가 2. 파일 시스템 구조 추가 : stores, types * Rename: common 디렉토리를 components 디렉토리 하위로 이동 1. common 디렉토리 이동 2. common 절대 경로 설정 삭제 (vite, ts) * Config: #10 routes 절대 경로 추가 * Design: #10 router 설정에 필요한 페이지 컴포넌트 추가 * Design: #10 router 설정에 필요한 layout 컴포넌트 골격 추가 * Feat: #10 로그인 전, 후에만 접근 가능하도록 제한하는 Router 추가 * Feat: #10 Router 설정 및 추가 * Config: #13 tailwind 전역 변수 추가 * Config: #13 공용 변수 정의 추가 * Config: #13 tailwind 속성명 규칙화 * Config: #13 tailwind 속성명 규칙화 * Config: #13 tailwind 속성 확장 * Config: #13 크기 자율성을 위해 contents size 설정 삭제 * Config: tailwind 유틸리티 클래스 자동 정렬 기능 추가 * Feat: #16 공용 Header 컴포넌트 UI 작성 * Fix: #16 tailwind CSS 중복된 속성명 구별을 위한 네이밍 변경 * UI: #16 공용 Header CSS 설정 추가 * Feat: #9 NotFound 페이지 작성 * UI: #21 Default Layout의 contents 부분의 크기 제한 설정 * UI: #21 Project Layout UI 작성 * Config: #21 tailwind 속성/스타일 추가 * UI: #21 ProjectLayout의 Sidebar를 공용 Sidebar로 추출 * Rename: project → ProjectType으로 파일명 수정 * Rename: #21 layout 구분을 위하여 page 디렉터리 추가 및 관련 파일 이동 * Feat: #24 React Portal Modal Layout UI 작업 * config: #24 tailwindcss 유틸리티 클래스 확장 * config: #24 React Hook Form 편의 사용을 위한 일부 eslint 제약 완화 * Feat: #24 객체 동결 기능과 공통 validation 기능 추가 * Feat: #24 상태 추가 모달 UI 작업과 Form Validation 추가 * Formatting: #24 타입명 수정 * UI: #24 상태 추가 모달 적용 * fix: #24 falsy 값 출력 방지를 위한 간단한 로직 변경 * Docs: github commit convention 변경으로 인한 PR 템플릿 수정 * Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치 * Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의 * Config: #33 ESLint 설정 완화 * Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가 * UI: #33 ProjectLayout 수정 * Formmating: #33 deepClone의 매개변수명 변경 * Feat: #33 특정 프로젝트 칸반 보드 UI 작성 & 할일 목록 DnD 기능 추가 (#36) * Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치 * Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의 * Config: #33 ESLint 설정 완화 * Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가 * UI: #33 ProjectLayout 수정 * Formmating: #33 deepClone의 매개변수명 변경 * Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화 * Refactor: #33 DnD 순서 변경 함수 통합 & 가독성을 위한 조건문 변수화 (#38) * Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치 * Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의 * Config: #33 ESLint 설정 완화 * Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가 * UI: #33 ProjectLayout 수정 * Formmating: #33 deepClone의 매개변수명 변경 * Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화 * Formatting: #33 ERD 할일 테이블 이름(Task)로 통합(todo → task) * Formatting: #33 Task 이름 단수/복수 구별 * Formatting: #33 state의 tasks와 데이터구조의 tasks 이름 구별 (for no-shadow) * Formatting: #33 기존에 사용하던 Todo라는 이름을 ERD 할일 테이블 이름인 Task으로 통합 (todo → task) (#39) * Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화 * Formatting: #33 ERD 할일 테이블 이름(Task)로 통합(todo → task) * Formatting: #33 Task 이름 단수/복수 구별 * Formatting: #33 state의 tasks와 데이터구조의 tasks 이름 구별 (for no-shadow) * Feat: #33 특정 프로젝트 상태 목록 수평 DnD 기능 추가 (#40) * Feat: #33 특정 프로젝트 상태 목록 수평 DnD 기능 추가 * Refactor: #33 컴포넌트 분리 / types, constants 등 관심사 분리 (#41) * Rename: Validator 확장자 변경 (tsx→ts) * Refactor: #33 컴포넌트 분리 / types & constants 등 관심사 분리 * Fix: #33 React Key Props 에러 재설정 * Refoctor: #33 할일 변경 함수 구조분해할당 삭제 * Rename: #33 ERD 프로젝트 상태 테이블 이름으로 통합 (TaskStatus → ProjectStatus) (#42) * Rename: #33 ERD 프로젝트 상태 테이블 이름으로 통합 (TaskStatus → ProjectStatus) * Refactor: #44 상태 모달 생성/수정 폼 공유를 위한 리팩토링 (#46) * Fix: #44 mock 데이터 에러 해결 * Refactor: #44 상태 모달 생성/수정 폼 공유를 위한 리팩토링 * Chore: #33 기능명세서 변경으로 인한 색상 추가 기능 제거 * Formatting: #44 컴포넌트 Props 이름 변경 * Feat: #5 회원가입 페이지 생성 및 Validation 작성 (#37) * Feat: #5 회원가입 페이지 생성 및 마크업, CSS 스타일링 * Feat: #5 회원가입 입력 데이터 유효성 검사 기능 추가 * Design: #5 회원가입 페이지 스타일링 변경 및 프로필 이미지 설정 , 삭제 기능 추가 * Feat: #27 로그인 페이지 작성 * design: 수정된 회원가입 폼으로 UI 수정, 비밀번호 보이기 및 숨김 기능 추가 * Design: #27 수정된 로그인 폼으로 UI 수정 * Formatting: #5 유저관련폼 중복 처리 및 회원가입 폼 변수명 수정 * refactor: 공통 유효성 인증 input 컴포넌트 적용 및 회원가입 폼 디자인 수정사항 반영 * feat: 링크 갯수 제한 기능 추가 * UI: #5 로직에 따른 아이콘 등록 수정 * UI: #5 버튼 라운드 값 수정 * UI: #5 리뷰 반영 디자인 수정 * Chore: 정규식 수정 및 eslint 수정 * Refactor: #5 회원가입 폼에서 유효성 검증 규칙 분리 * Formatting: #5 타입 변수명 컨벤션 지정에 따른 타입 변수명 변경 * Feat: #5 비밀번호 정규식에 특수기호 추가 * UI: #5 필수 입력필드 체크 UI 수정 * UI: #5 input 필드에 sup 태그 적용 및 flex-grow -> grow 수정, form의 noValidate 속성 제거 * Feat: #27 로그인 페이지 생성 및 Validation 작성 (#43) * Feat: #5 회원가입 페이지 생성 및 마크업, CSS 스타일링 * Feat: #5 회원가입 입력 데이터 유효성 검사 기능 추가 * Design: #5 회원가입 페이지 스타일링 변경 및 프로필 이미지 설정 , 삭제 기능 추가 * Feat: #27 로그인 페이지 작성 * design: 수정된 회원가입 폼으로 UI 수정, 비밀번호 보이기 및 숨김 기능 추가 * Design: #27 수정된 로그인 폼으로 UI 수정 * Formatting: #5 유저관련폼 중복 처리 및 회원가입 폼 변수명 수정 * refactor: 공통 유효성 인증 input 컴포넌트 적용 및 회원가입 폼 디자인 수정사항 반영 * feat: 링크 갯수 제한 기능 추가 * UI: #5 로직에 따른 아이콘 등록 수정 * UI: #5 버튼 라운드 값 수정 * UI: #5 리뷰 반영 디자인 수정 * Chore: 정규식 수정 및 eslint 수정 * Refactor: #5 회원가입 폼에서 유효성 검증 규칙 분리 * Refactor: #27 ValidationInput 컴포넌트를 이용한 리팩토링 및 전반적인 UI 수정 * UI: #27 소셜 로그인 버튼 UI 수정 * Feat: #44 칸반보드 프로젝트 상태 수정 모달 작성 (#47) * Feat: #44 칸반보드 상태 수정 모달 작성 * Feat: #44 useModal 커스텀훅 추가 * Fix: #49 로그인 페이지 import 관련 버그 수정 (#50) * Feat: #52 알림을 위한 토스트 메시지 추가 (#53) * Config: #52 react-toastify 라이브러리 추가 * UI: #52 ToastLayout 추가 및 설정 * Feat: #52 토스트 메시지를 위한 커스텀훅 작성(useToast) * Chore: #52 불필요한 타입 제거 및 멀티 라인 명시적 그룹화 * UI: #52 토스트 메세지별 border-bottom-color 설정 * UI: #55 스크롤바 UI 변경 (#56) * Feat: #51 특정 프로젝트 관리 페이지: 캘린더 UI 작성 (#54) * Config: #51 react-big-calendar & luxon 라이브러리 추가 * Chore: #51 TaskWithStatus 타입 세분화 및 변경사항 수정 * fix: #51 TaskWithStatus 타입 변경후 누락된 부분 추가 * Chore: #51 더미데이터 추가 정의 & ProjectType 변경 * UI: #51 Stacking Context 수정 & UI 간격 수정 * Feat: #51 Calendar 기본 UI 작성 * Fix: #51 onNavigate 에러 해결 * UI: #51 CalendarToolbar UI 개선 * UI: #51 DateHeader 커스텀 디자인 추가 * UI: #51 CustomEvent → CustomEventWrapper 변경후 UI 추가 정의 * UI: #51 Calendar Custom Component 적용 * UI: #57 프로젝트 레이아웃 UI 변경 (#59) * Feat: #51 특정 프로젝트 관리 페이지: 프로젝트 기간 설정 유무에 따른 날짜 스타일 처리 (#60) * Feat: #51 PageLayout의 Outlet Context 설정 & 커스텀훅 추가 * Feat: #51 프로젝트 기간 이외의 날짜 disable 스타일 추가 * UI: #51 react-big-calendar CSS 오버라이딩 * Chore: 불필요한 주석 삭제 * Fix: #51 프로젝트 기간이 없는 경우 처리 추가 * Chore: #51 mock 데이터 수정 * Feat: #35 ID/PW 찾기 페이지 UI 작성 및 Validation 체크 (#58) * Feat: #35 ID 찾기 페이지 마크업 및 스타일링 * Feat: #35 PW 찾기 페이지 마크업 및 스타일링 * Refactor: #35 로그인, ID, PW 찾기 페이지 중복 추출 컴포넌트 제작 및 적용 * Refactor: #35 인증 페이지 전반적으로 겹치는 스타일링 분리 * Formatting: #35 로그인 페이지의 email 필드를 id 필드로 변경 * UI: #35 공용 버튼에서 그림자 제거 * UI: #35 로그인, ID/PW 찾기 페이지 리뷰 반영 디자인 수정 * Feat: #35 닉네임 validation 추가 및 기존 validation, 정규식 관련 코드 수정 * Refactor: #35 폼 하단 공통 링크 컴포넌트 중복제거 리팩토링 * Refactor: #35 회원가입 페이지 비밀번호 확인 validate 분리 및 공용Form 컴포넌트 props 타입 수정 * Feat: 할일 등록 모달 토대 UI 작성 & 일정명, 날짜 설정 기능 추가 (#67) * UI: #63 중복값 체크 input을 공용 컴포넌트로 추출 * UI: #63 모달 레이아웃 스타일 수정 * UI: #63 할일 등록 모달 토대 UI 작성 * Feat: #63 할일 일정명과 기간 설정 로직 추가 * Formatting: #63 오탈자 수정 (ModaFormButton → ModalFormButton) * Config: Code Spell Check 확장앱 추가 * UI: #63 ToggleButton을 공통 컴포넌트로 분리 * UI: #63 ToggleButton 스타일 수정 * UI: #62 모든 프로젝트 관리 페이지 중 팀/프로젝트가 없는 경우 UI 작성 (#64) * UI: #62 모든 프로젝트 관리 페이지중 팀/프로젝트가 없는 경우 UI 작성 * Feat: #62 teamid 예외처리 추가 및 ListSidebar button props 변경 * Formatting: #62 ListSidebar props 이름 변경 * Comment: #62 불필요한 주석 삭제 * Formatting: #62 오탈자 수정 * Formatting: #62 import 경로 정리 * Feat: #63 할일 등록 모달 상태 설정 기능 추가 (#70) * Refactor: #63 useStatusQuery 검색 방식 변경에 따른 구조 변경 * Fix: #63 prettier 재반영 * Feat: #63 할일 상태 선택 기능 추가 * Feat: #65 회원가입 폼 UI 수정 및 관련 로직 수정 (#66) * Feat: #35 ID 찾기 페이지 마크업 및 스타일링 * Feat: #35 PW 찾기 페이지 마크업 및 스타일링 * Refactor: #35 로그인, ID, PW 찾기 페이지 중복 추출 컴포넌트 제작 및 적용 * Refactor: #35 인증 페이지 전반적으로 겹치는 스타일링 분리 * Formatting: #35 로그인 페이지의 email 필드를 id 필드로 변경 * UI: #35 공용 버튼에서 그림자 제거 * UI: #35 로그인, ID/PW 찾기 페이지 리뷰 반영 디자인 수정 * Feat: #35 닉네임 validation 추가 및 기존 validation, 정규식 관련 코드 수정 * Refactor: #35 폼 하단 공통 링크 컴포넌트 중복제거 리팩토링 * Refactor: #35 회원가입 페이지 비밀번호 확인 validate 분리 및 공용Form 컴포넌트 props 타입 수정 * UI: #65 변경된 회원가입 로직에 따라 UI 변경 및 폼 전송 로직 수정 * Feat: #65 링크 추가 key값 부여방식과 링크 삭제 로직 변경 * Feat: #65 회원가입 이메일 인증 초시계 구현 * Feat: #65 이미지 전송 로직 추가 * Feat: #65 회원가입 form 전송 로직 수정 및 회원가입 API 적용 * Fix: #65 이미지 제한 크기 수정 * Fix: #65 기능명세서에 따라 등록 가능 링크의 개수를 수정 * Fix: #65 병합 컨플릭트 해결 * Refactor: #65 Timer 컴포넌트 리뷰 반영 리팩토링 * Refactor: #65 이미지파일 관련 상수 분리 및 early return 패턴과 삼항연산자 적용 * Feat: #65 안내메시지 노출 방식을 toast 메시지로 변경 및 단위 상수분리 * Refactor: #65 회원가입 폼의 인증요청과 회원가입 버튼 분리 및 인증과 폼제출 로직 분리 * Feat: #65 form 전송 함수의 이미지 전송 api, 폼 전송 api 에러처리 로직 수정 * Refactor: #65 유저 설정값 상수화 및 정규표현식 수정 * Fix: #65 정규식 관련 코드 수정 * Comment: #65 회원가입 로직 관련 주석 추가 * Feature: #65 이미지 상수를 명시적으로 변경 및 파일사이즈 string 변환 함수 생성 적용 * Refactor: #65 유저 인증 폼 관련 유효성 검증 상수 분리 * Refactor: #65 회원가입 폼 submit 버튼 변경을 삼항연산자로 처리 * UI: #62 모든 프로젝트 관리 페이지 중 팀/프로젝트가 있는 경우 UI 작성 (#71) * UI: #62 모든 프로젝트 관리 페이지 팀/프로젝트 있는 경우 UI 작성 * Feat: #62 버튼 클릭 시 모달 페이지 열리도록 기능 추가 * UI: 버튼 hover시 밝기 조절추가 * UI: #69 유저 정보 설정 페이지 UI 구현 (#73) * Feat: #69 유저 설정 페이지 기본 라우트 세팅 * Feat: #69 사이드 메뉴 및 공통 레이아웃 구현 * Feat: #69 유저 설정 이메일 인증 페이지 UI 구현 * Feat: #69 비밀번호 변경 페이지 UI 구현 * UI: #69 스타일링 코드 정리 * Fix: #69 유저 설정 페이지 라우팅 관련 코드 수정 * Refactor: #69 타입명 변경 및 타입 정의 방식 수정 * UI: #69 SettingLayout 라우트별 스타일 분리 코드 제거 * Feat: #69 헤더 컴포넌트 user세팅 경로 수정 * Feat: #63 할일 추가 모달 수행자 검색 기능 구현 (#75) * Feat: #63 Axios 기본 환경 설정 & Axios Instance 생성 Provider 정의 * Feat: #63 useAxios 커스텀훅 정의 / AbortController signal 처리 추가 * Chore: #63 mock 데이터 수정 * Feat: #63 프로젝트 유저 검색 API 모킹 추가 * Chore: #63 Mock Handler 불필요한 코드 제거 * Feat: #63 useAxios 트리거 형태로 변경 & API 함수 구조 변경 * Feat: API Mock handler 처리 수정 & Mock 데이터 수정 * Feat: #63 useAxios 커스텀훅에 clearData 기능 추가 * Feat: #63 MSW handler 구조 변경 * Feat: #63 userService & teamService 기본 골격 추가 * Remove: #63 파일 구조 유지를 위한 더미 파일 삭제 * Feat: #63 수행자 검색 기능 개발 * Feat: #63 UserType 수정 & Mock 데이터 수정 * Config: #76 VSCode 확장앱 추가 (vitest, JSDoc Generator etc) (#77) * Feat: #63 수행자 목록 UI 추가 & 수행자 추가/삭제 기능 구현 (#79) * Feat: #63 수행자 목록 UI 작업 & 추가/삭제 기능 * UI: #63 할일 추가 / 상태 추가 버튼 UI 스타일 변경 * Feat: #63 수행저 권한을 아이콘으로 변경 & 아이콘 툴팁 설명 추가 (#81) * Fix: #82 UpdateModalTeam props 오류 수정 (#83) * UI: #72 유저 정보 설정 페이지 팀 설정 UI 구현 (#74) * UI: #72 유저 정보 설정 페이지 팀 설정 UI 구현 * Feat: #72 팀 초대 및 가입 상태를 처리하는 API Handler 추가 & 팀 설정 페이지 UI변경 * UI: #72 팀 head UI 추가 & style 변경 * Formatting: #72 TeamSettingPage 시맨틱 태그로 변경 * Feat: #63 마크다운 기능 추가 (#84) * Config: #63 react-markdown, react-gfm, rehype-raw, react-syntax-hightlight 추가 * Feat: #63 마크다운 기능 추가 CommonMarkdown, GFM, Rehype-raw for HTML) * UI: #69 유저 정보 설정 페이지 UI 구현 (#78) * Feat: #69 유저 개인정보 설정 페이지 구현 * Refactor: #69 UserSettingPage에서 이미지, 링크 관련 코드를 컴포넌트로 분리 * Refactor: #69 SignUpPage에서 이미지, 링크 관련 코드를 컴포넌트로 분리 * Refactor: #69 이미지 전송을 위해 폼에서 이미지를 처리할 수 있도록 코드 리팩토링 * Refactor: #69 UserAuthenticatePage의 이메일 인증 로직을 훅으로 분리 및 인증 submit 버튼을 컴포넌트로 분리 * Refactor: #69 SignUpPage의 이메일 인증 로직, 인증 submit 버튼 분리 * Refactor: #69 인증코드 확인 로직 분리 * Rename: #69 유저설정 페이지 관련 컴포넌트 이름 수정 및 auth-form 폴더 구조 수정 * Feat: #69 인증버튼 라벨 props 추가 * Fix: #69 conflict 에러 해결 * UI: #69 전체적인 코드 태그 수정 및 디자인 코드 수정, 로고 수정 * Refactor: #69 인증번호관리 훅에서 타이머 visible 코드 삭제 및 타이머 visible 로직 수정 * UI: #69 일부 코드 태그 수정 및 디자인 코드 수정 * UI: #69 링크 컴포넌트 버튼 내부 아이콘 크기 조절 * Comment: #69 타이머 만료 코드 주석 수정 * UI: #69 label 태그 중첩 해결 및 input 태그 height 수정 * Feat: #63 마크다운 코드 블록 하이라이팅 기능 추가 (#86) * Config: #63 ESLint 설정 추가 (no-cond-assign: off) * Config: #63 @types/react-syntax-highlighter 추가 * Feat: #63 코드 블록 하이라이팅 기능 추가 * Fix: #63 인라인 코드와 코드 블록 분기 처리 수정 * Feat: #63 markdown 개행 처리를 위한 기능 추가 * Feat: #63 할일 등록 모달 DnD 파일 첨부 기능 추가 (#88) * Rename: #63 userSettings → settings 파일 이름 변경 * Formatting: #63 파일 이름 변경에 따른 변수명 변경 * Config: #63 ESLint 환경 설정 추가 * Fix: #63 ESLint 설정에 포함된 공백문자 제거 * Feat: #63 할일 모달 파일 첨부 기능 추가 * UI: #63 삭제 버튼 색상 변경 * Feat: React Query 기본 환경 설정 & 상태별 프로젝트 일정 전체 조회 API 처리 추가 (#93) * Config: #89 React Query Devtools 추가 * Feat: #89 React Query 기본 설정 추가 * Feat: #89 Mutation 기본 Error handler 추가 * Refactor: #89 Axios 에러 처리와 React Query 에러 처리 통합 * Feat: #89 Task 목록 useQuery 작성 * Chore: #89 Mock 데이터 수정 & Task, Status 타입 수정 * Chore: #89 Mock & Type 변경 * Feat: 할일 전체 목록 API MSW Handler 추가 * Chore: MSW Handler 추가로 할일 목록 Dummy 참조 삭제 * Chore: #94 프로젝트 상태, 프로젝트, 할일 타입 재정의 (#95) * Chore: #94 TaskType의 color → colorCode로 변경 * Chore: #94 ProjectStatus Type의 order → sortOrder로 변경 * Chore: #94 TaskType의 order → sortOrder로 변경 * Chore: #94 ERD와 Swagger를 참고하여 타입 재정의 * Fix: #90 블록내 개행문자 삽입되는 문제 해결 (#96) * Feat: #98 프로젝트 상태 목록 조회 API 기능 구현 (#99) * Feat: #98 MSW 프로젝트 상태 목록 조회 API handler 추가 * UI: #98 로딩 UI 추가 (Spinner) * Feat: 색상 추가 모달, 할일 등록 모달 상태 처리 로직 수정 * Feat: #98 프로젝트 상태 조회 네트워크 요청 로직 추가 * Feat: #101 프로젝트 상태 생성 API를 이용하여 상태 생성 기능 구현 (#103) * Chore: #101 프로젝트 상태 타입 정의 수정 * Chore: #101 프로젝트 상태 타입 수정으로 인한 코드 수정 * Feat: #101 프로젝트 상태 생성 API를 위한 React Query 기능 추가 * Feat: #101 프로젝트 상태 생성 API MSW 기능 추가 * Feat: #101 프로젝트 상태 생성 기능 추가 * Chore: #101 불필요한 import 삭제 * Fix: #101 초기값 변수 이름 수정 * Feat: #102 프로젝트 상태 변경 API를 이용하여 상태 변경 기능 구현 (#106) * Feat: #102 상태 변경 API를 위한 React Query 처리 추가 * Feat: #102 프로젝트 상태 변경 API MSW 처리 추가 * Feat: #102 프로젝트 상태 변경 기능 추가 * Fix: #102 상태 변경시 누락된 상태 순서 데이터 추가 * UI: #107 모달 레이아웃 UI 수정 (#108) * UI: #107 모달 레이아웃 & 모달 버튼 컴포넌트 UI 수정 * UI: #107 프로젝트 상태 Form UI 수정 * Feat: #109 프로젝트 목록 조회 기능 구현 (#110) * Feat: #109 프로젝트 목록 조회 API를 위한 React Query 처리 추가 * Feat: #109 프로젝트 목록 조회 API MSW 처리 추가 * Feat: #109 프로젝트 목록 사이드바 노출 기능 구현 * Feat: #109 네트워크 통신 대기시 Spinner UI 노출 * Chore: #109 Spinner UI 변경으로 다른 설정 코드 수정 * Feat: #80 로컬 로그인 기능 구현 (#100) * Feat: #80 로그인 기능 초안 작성 * Test: #80 로그인 모킹 함수 작성 * Feat: #80 로그인 관리 저장소 로직 일부 수정 * Feat: #80 로그인 로직, 모킹 함수 일부 수정 및 요청 인터셉트 추가 * Feat: #80 axiosProvider에 응답 인터셉터 추가 * Feat: #80 access token 저장 위치 변경 - 기존 cookie에서 zustand store로 저장 위치 변경 * Chore: #80 불필요한 패키지 제거, 설치 및 유저아이디 변수명 변경 * Feat: #80 refresh token 갱신 모킹 함수 작성 * Feat: #80 refresh token 만료 시 에러 처리 구현 * Feat: #80 프로필 이미지 URL 해제 코드 적용 * Feat: #80 인터셉터 로직 일부 수정 및 로그인 API 호출 로직에 useMutation 훅 적용 * Feat: #80 모킹 함수에 토큰 발급 시간 관련 로직 추가 * Feat: #80 zustand authStore에서 persist 미들웨어 제거 * Feat: #80 로그인 코드 로직을 전체적으로 수정 * Refactor: #80 URL revoke를 위한 로직 변경 및 파일 경로 수정, 시간 상수 활용 코드 변경 * Feat: #80 로그인 API의 withCredentials 옵션 삭제, 토큰 발급 실패 시 에러 처리 방식 변경 * Feat: #80 로그인 API 호출 방식 변경 * Feat: #80 authStore에 AT 만료 시간 추가 * Feat: #80 authStore AT 자동 만료 기능 추가 * Fix: #80 Invalid hook call 에러 해결 * Formatting: #80 import 경로 정리 * Feat: #80 핸들러 타입 처리 및 이미지 컨테이너의 불필요한 revoke 코드 삭제 * Feat: #80 로그인 API 호출 시 useAxios 훅 적용 * Feat: #104 일정 순서 변경 API를 이용하여 칸반 보드 DnD로 일정의 순서를 변경하는 기능 구현 (#112) * Formatting: #104 React Query 커스텀훅명 변경 * Feat: #104 일정 목록에 대해 더미 처리에서 커스텀훅 처리로 변경 * Feat: #104 일정 순서 변경 API를 위한 React Query 처리 추가 * Feat: #104 일정 순서 변경 API MSW 처리 추가 * Feat: #104 일정 순서 변경 기능 구현 * Chore: #104 updateStatus 함수 JSDoc 수정 * Feat: #105 상태 순서 변경 API를 이용하여 칸반 보드 DnD로 상태의 순서를 변경하는 기능 구현 (#113) * Feat: #105 상태 순서 변경 API를 위한 React Query 처리 추가 * Feat: #105 상태 순서 변경 API MSW 처리 추가 * Feat: #105 상태 순서 변경 기능 구현 * Chore: #105 상대 경로를 절대 경로로 수정 * UI: #85 모든 프로젝트 및 팀 설정 페이지 UI 변경 (#97) * UI: #85 모든 프로젝트 관리 페이지 style 및 팀 설정 페이지 style 통합 * UI: #85 팀 설정 페이지 팀 목록 리스트 색상 통일 * UI: #85 불 필요한 css 수정 및 라벨 색상 통일 * UI: #85 팀 설정 페이지 가입 및 대기 현황 없을시 UI 작업 및 불필요한 tailwind 수정 * Comment: #85 가입현황 대기현황 TODO 주석 작성 * UI: #85 팀 목록 조회 Query로 변경 및 컴포넌트 분리 및 타입 변경 * Chore: #85 콘솔로그 삭제 * Rename: #85 파일 이름 변경 및 경로 이동 (Page -> Layout) * Comment: #85 router 주석 삭제 * Formatting: #85 querykey 이름 변경 및 콘솔 삭제 * Fix: #117 상태 추가 후 상태 순서 변경시 발생하는 에러 해결 (#119) * Fix: #117 초기 상태값 의존성 문제 해결 & sortOrder 번호 수정 * Fix: #117 MockHash 데이터 최신화를 위한 로직 변경 * Feat: #111 액세스 토큰 갱신 기능 구현 (#116) * Feat: #111 액세스 토큰 만료 시 리프레시 토큰을 이용해 AT 재발급 구현 * Comment: #111 필요없는 주석 및 콘솔 제거 * Fix: #122 칸반 보드 UI가 정해진 범위를 넘어가는 문제 해결 (#124) * Fix: #122 칸반보드가 정해진 범위를 넘어가는 문제 해결 * Chore: #122 응답 데이터 sortOrder 순으로 정렬 * Feat: #114 일정 생성 API를 이용하여 일정 생성 기능 구현 (#125) * Feat: #114 종료일 비활성화시 시작일을 따라가도록 변경 * Feat: #114 일정 생성 API React Query 처리 추가 * Feat: #114 일정 생성 API MSW 처리 추가 * Feat: #114 일정 생성 기능 구현 * Chore: #114 import 경로 수정 및 정리 * Feat: #118 로그인 후 유저 정보 호출 기능 구현 (#121) * Feat: #118 유저 정보 가져오기 기능 구현 및 헤더에 유저 닉네임 적용 * Feat: #118 유저 정보 설정 페이지에 API 호출한 유저 데이터 적용 * Feat: #118 queryKey를 이용해 캐싱된 데이터를 사용하도록 코드 수정 * Formatting: #118 쿼리상태값 네이밍 변경 * Formatting: #118 로그인한 유저 조회 API 반환타입 변경 * Feat: #118 네트워크 코드 작성 방식 변경을 위한 useAxios 수정 및 로그인 코드 수정 * Feat: #118 로그인 네트워크 요청 방식 변경 * Feat: #118 유저 정보를 호출 후 zustand persist에 저장 기능 구현 * Feat: #118 zustand persist 로컬 스토리지에 암호화 적용 * Feat: #118 유저설정페이지, 헤더에 zustand 저장소의 유저 정보 적용 * Chore: #118 import 경로 정리 * Config: #118 config 파일에 stores 경로 추가 * Refactor: #118 프로필 이미지 이중관리 로직 제거 * Feat: #118 zustand 스토어에 slice pattern 적용 * Feat: #118 공식문서 기반 zustand slice pattern 적용 * Feat: #118 로그인 에러 공용처리 * Chore: #128 유저 정보 값 수정 (#129) * Chore: #128 유저 프로필 이미지 관련 변수, 타입명, 초기값 관련 코드 수정 * Chore: #128 유저 정보 호출 시 userId, provider 정보를 포함하도록 타입 수정 * Chore: #128 useStore 내부 bio 속성의 초기값 변경 * UI: #89 일정 상세보기 모달 UI 작성 (#130) * UI: #89 일정 상세보기 모달 UI 작업 * Feat: #89 일정 상세보기 정보 전달 방법 변경 * UI: #127 일정 등록 입력 양식들을 컴포넌트로 분리 (#131) * UI: #127 프로젝트 상태 radio input 컴포넌트 분리 * UI: #127 시작일, 종료일 컴포넌트 분리 * UI: #127 마크다운 컴포넌트 분리 * UI: #127 파일 DropZone 컴포넌트 분리 * UI: #127 마크다운 컴포넌트 props 변경 * UI: #127 시작일, 종료일 컴포넌트 props 변경 * UI: #127 프로젝트 상태 컴포넌트 props 변경 * UI: #127 시작일, 종료일 컴포넌트 props 변경 * UI: #127 마크다운 컴포넌트 props 변경 * UI: #127 일정 등록 입력 양식중 수행자 검색, 선택 목록 컴포넌트 분리 (#132) * UI: #127 수행자 검색 UI 컴포넌트 분리 * UI: #127 수행자 목록 UI 컴포넌트 분리 * Feat: #134 일정 수행자 조회 기능 추가 (#136) * Feat: #134 수행자 타입 수정 * Chore: #134 수행자 타입 수정에 따른 mock 데이터 수정 * Feat: #134 일정 생성 API 수정 사항 반영 * Feat: #134 일정 수행자 목록 API React Query 처리 추가 * Feat: #134 일정 수행자 목록 조회 API MSW 처리 추가 * Feat: #134 일정 상세 모달 수행자 목록 조회 기능 추가 * Feat: 수행자 타입 추가 * Feat: #123 로그아웃 기능 구현 (#133) * Feat: #123 로그아웃 흐름 작성 * Feat: #123 로그아웃 네트워크 로직 작성 및 커스텀 훅 작성 * Feat: #123 토스트 메시지 표시를 위한 시간 지연 추가 * Feat: #123 로그아웃 시 유저 store 정보 초기화 기능 구현 * Feat: #123 RT 만료 시 후처리 구현 * Feat: #123 axiosProvider에 useNavigate를 사용할 수 있도록 수정 * Chore: #123 MainRouter import 경로 수정 * Comment: #123 Interceptor 컴포넌트 적용 방식 관련 ToDo 주석 추가 * Comment: #123 주석 오타 수정 * Feat: #135 일정 파일 목록 조회 기능 추가 (#138) * Feat: #135 Task 타입 수정 (files 삭제) * Chore: #135 Task 타입 수정에 따른 mock 데이터 수정 * Feat: #135 일정 파일 목록 조회 API React Query 처리 추가 * Feat: #135 일정 파일 목록 조회 MSW 처리 추가 * Feat: #135 일정 상세 모달 파일 목록 조회 기능 추가 * Feat: #135 일정 파일(TaskFile) 타입 정의 * Feat: #140 마크다운 커스텀 a태그 속성 수정 (#141) * Feat: #140 마크다운 커스텀 a태그 속성 수정 * Feat: #140 aria-label 속성 추가 * Feat: #120 팀 설정 페이지 탈퇴 삭제 및 수락 거부 기능 구현 (#126) * Feat: #120 팀 탈퇴하기 로직 구현 * Feat: #120 팀 삭제하기 기능 추가 및 탈퇴하기 Handler 수정 * Feat: #120 초대 수락 및 거부 기능 추가 * Feat: #120 msw Handler 수정 및 타입 수정 주석 삭제 * Comment: #120 js doc 설명 추가 * Fix: #120 팀 탈퇴 API 및 삭제 API 수정 * Fix: #120 userId 목 데이터 토큰으로 변경 * Fix: #120 userId 전역에서 독립 실행으로 변경 * Fix: #120 팀 삭제 API 일정 파일 & 유저 삭제 추가 및 팀 탈퇴API 수정 * Comment: #120 TODO 주석 추가 * Feat: #137 아이디/비밀번호 찾기 기능 구현 (#139) * UI: #137 아이디 찾기 Form UI 수정 및 결과 화면 UI 작성 * UI: #137 비밀번호 찾기 Form UI 수정 및 결과 화면 UI 작성 * Formatting: #137 validation에 맞게 아이디 비밀번호 임시값 변경 * Feat: #137 유저아이디 찾기 네트워크 로직 구현 * UI: #137 auth 관련 폼 UI 배치 및 margin, padding 수정 * Feat: #137 유저 비밀번호 찾기 네트워크 로직 구현 * Chore: #137 id/pw 찾기 결과 부분 태그 수정 * Formatting: #137 결과화면 시맨틱 태그 수정 * Feat: #137 아이디 길이에 따른 아이디 보안 처리 * UI: #137 아이디찾기 input 라벨을 placeholder로 변경 * Feat: #137 폼 전송 이전에 이메일 인증 코드 확인 로직 추가 * UI: #137 AuthLayout 패딩 및 간격 수정 * Refactor: #137 ID/PW 찾기 페이지의 결과 화면, 폼을 컴포넌트로 분리 * Chore: #137 MSW 핸들러의 응답 성공 실패 구현 순서 변경 * Refactor: #137 ID 보안 관련 컨버터 함수 리팩토링 * Feat: #144 비밀번호 변경 기능 구현 (#145) * Feat: #144 비밀번호 변경 네트워크 로직 구현 * Feat: #144 비밀번호 변경 후처리 구현 * Chore: #144 불필요한 데이터 출력 코드 삭제 * Comment: #144 필요한 주석 추가 * Refactor: #144 동일한 신규 비밀번호 입력 시 Validation 작성 * Feat: #142 이메일 인증 기능 구현 (#143) * Chore: #142 useNavigate 변수명 변경 및 useFormContext 타입 추가 * Feat: #142 이메일 인증번호 요청 네트워크 로직 작성 및 기존 인증 처리 로직 수정 * Feat: #142 이메일 인증코드 발급 관련 코드를 더미데이터로 대체 * Refactor: #142 상위 컴포넌트에서 이메일 인증 관련 코드를 관리하도록 수정 * Refactor: #142 인증번호 불일치시 후처리 함수 분리 * Feat: #142 인증번호 불일치 시 필드에러만 표시하도록 수정 * Refactor: #142 SearchDataForm로 전달할 데이터를 객체로 묶어 전달하도록 수정 * UI: 파일 드래그 앤 드롭시 영역 스타일 가시성 스타일 추가 (#151) * Feat: #115 일정 생성 Form 타입 정의 수정 및 추가 * Chore: #115 일정 Form 타입 변경으로 인한 관련 코드 수정 * UI: #115 파일 드래그 앤 드롭시 영역 스타일 가시성 스타일 추가 * UI: #115 스크린 리더와 접근성 개선을 위한 속성 추가 * Feat: #147 수행자 검색 API 변경으로 인한 수행자 검색 기능 수정 (#152) * Refactor: #147 수행자 검색 결과 타입 수정 * Refactor: #147 프로젝트에 속한 유저 검색 API MSW 처리 수정 * Feat: #147 프로젝트 팀원 목록 조회 React Query 처리 추가 * Feat: #147 프로젝트 팀원 목록 조회 API MSW 기능 추가 * Feat: Project Context에 프로젝트 팀원 정보 추가 * Feat: #147 프로젝트 팀원 목록과 수행자 목록 매칭하여 UI 정보 표시 * Feat: #147 프로젝트 팀원 목록과 수행자 목록 매칭하여 UI 정보 표시 * Feat: #147 매칭되는 유저 정보가 없을 시 에외처리 추가 * Refactor: #153 유저 검색을 위한 SearchUserInput 컴포넌트 리팩토링 (#154) * Refactor: #153 전체 유저 검색 & 팀 유저 검색 axios 로직 수정 * Refactor: #153 SearchUserInput 컴포넌트 디바운스, Abort 로직 추가 * Refactor: #153 callback type 분리 * Rename: #153 파일 typo 수정 * Feat: #153 Exhaustive Check 기능 추가 * Feat: 일정 수정 모달 UI 변경 사항 반영 (#155) * Refactor: #148 파일 타입 & 일정 타입 추가 및 수정 * Remove: #148 Assignee 타입 삭제 UserWithRole 타입으로 대체 * Chore: #148 타입 재정의에 따른 코드 수정 * Feat: #148 일정 모달 수정과 컴포넌트를 공유하기 위한 수정 * Feat: #148 특정 일정을 탐색하는 기능 추가 * UI: #148 일정 수정 모달 UI 수정 * Chore: #148 import 정리, ToDo 정리 * Refactor: #148 불필요한 연산 제거 * Feat: #149 일정 수정 모달 수행자 추가 기능 구현 (#157) * Feat: #149 수행자 추가 API를 위한 React Query 기능 추가 * Feat: #149 수행자 추가 API MSW 처리 추가 * Feat: #149 수행자 추가 기능 구현 * Fix: #149 이미 할당된 수행자인지 확인하는 MSW 로직 추가 * Chore: #149 MSW 변수 오타 수정 * Feat: #150 일정 수정 모달 수행자 삭제 기능 구현 (#158) * Feat: #150 수행자 삭제 API를 위한 React Query 처리 추가 * Feat: #150 수행자 삭제 API를 위한 MSW 처리 추가 * Feat: #150 수행자 삭제 기능 구현 * Refactor: #150 수행자 삭제 로직 개선 * Feat: #156 일정 수정 모달 일정 정보 변경 기능 구현 (#160) * Feat: #156 일정 정보 수정 API를 위한 React Query 기능 추가 * Feat: #156 일정 정보 수정 API를 위한 MSW 기능 추가 * Feat: #156 일정 정보 수정 기능 구현 * Fix: #163 일정 수정 모달에서 상태 선택 정보가 사라지는 문제 해결 (#164) * Fix: #163 타입 호환을 위한 새로운 타입 정의 (TaskUpdateForm) * Fix: #163 TaskUpdateForm 추가로 인한 타입 정보 처리 수정 * Feat: #146 비밀번호 변경 전 인증 페이지의 인증 로직 구현 (#162) * Feat: #146 이메일 인증여부 확인 후 비밀번호 변경 페이지를 이메일 인증 페이지로 리다이렉트 기능 구현 * Feat: #146 이메일 인증 성공 후 비밀번호 페이지로 변경 기능 구현 * Formatting: #146 이메일 인증 코드 변수명 및 타입명 변경 * Fix: #146 인증번호 에러 발생 시 리프레시 토큰발급 요청이 무한히 이루어지는 버그 수정 * Fix: #146 authAxios 사용 시 401 응답코드를 받았을 때 강제 로그아웃처리되는 오류 수정 * Formatting: #146 이메일 인증 코드 변수명 및 Validation Rule 이름 변경 * Chore: #146 코드리뷰에 따라 불필요한 코드 삭제 및 에러처리 추가 * Chore: #146 불필요한 코드 삭제 * Comment: #146 이메일 인증 페이지로 리다이렉션하는 코드 주석 처리 * Feat: #115 일정 등록 모달의 파일 업로드 기능 구현 (#166) * Feat: #115 파일 업로드 API를 위한 React Query 처리 추가 * Feat: #115 일정 파일 업로드 API를 위한 MSW 처리 추가 * Feat: #115 파일 Validation 추가 * Feat: #115 파일 업로드 기능 구현 (병렬 처리) * Chore: #115 허용하는 파일 확장자 constants로 정리 * Feat: #115 FileDropZone accept props 추가 * Feat: #115 Task Form 관련 타입 수정 및 추가 * Feat: #115 일정 파일 업로드 Validation 추가 * Chore: #115 더미 파일 설정 추가 * Chore: #115 CreateModalTask 컴포넌트 import 경로 수정 * Chore: 파일 validation warn message 수정 * Fix: #115 파일 최대 개수 Validation 수정 * Fix: #115 파일 최대 개수 Validation 수정 * Feat: #115 병렬 처리된 파일의 성공과 실패 목록 메세지 노출 * Feat: #115 파일 업로드 성공은 묶어서, 실패는 개별 메세지 노출로 변경 * Feat: #115 FileDropZone 컴포넌트 props 변경에 따른 코드 수정 * Feat: #115 파일 Validation 예외 처리 추가 * Chore: #115 일정 파일 accept 설정 상수로 추출 * Refactor: #173 React Query의 Query Key 정리 (#174) * Refactor: #173 React Query의 Query Key 정리 * Fix: #173 TaskFile Query Key 수정 * Feat: #167 일정 수정 모달의 일정 파일 삭제 기능 구현 (#176) * Feat: #167 일정 파일 삭제 API를 위한 React Query 기능 추가 * Feat: #167 일정 파일 삭제 API를 위한 MSW 처리 추가 * Feat: #167 일정 파일 삭제 기능 구현 * Feat: #167 일정 수정 모달에서 각 양식별로 Spinner가 생기도록 수정 * Fix: #167 조건문에 지정한 변수 수정 (taskFileIndex → fileIndex) * Feat: #170 일정 삭제 기능 구현 (#177) * Feat: #170 일정 삭제 API를 위한 React Query 기능 추가 * Feat: #170 일정 삭제 API를 위한 MSW 처리 추가 * Config: #170 Tailwind Delete용 색상 추가 * Feat: #170 모달용 공용 버튼 컴포넌트 추가 (ModalButton) * Feat: #170 일정 삭제 기능 구현 * UI: #170 버튼 hover 스타일 추가 * Feat: #170 일정 삭제 이후 캐시 처리 옵션 추가 * Fix: #170 삭제 로직 조건문 수정 * Feat: #170 일정 삭제 성공시 쿼리 데이터 무효화 및 삭제 옵션 수정 * Chore: #170 import 경로 수정 * Feat: #159 닉네임 중복 확인 API 및 회원가입 기능 구현 (#171) * UI: #159 회원가입 페이지에서 프로필 이미지 항목 제외 및 폼 내부 요소 수직 중앙정렬 * Feat: #159 닉네임 중복 체크 기능 구현 * Feat: #159 회원가입 기능 구현 * Feat: #159 중복 확인 후 닉네임 버튼 비활성화 기능과 중복 확인 후 재입력시 버튼 활성화 기능 구현 * Feat: #159 중복 확인 후 닉네임 버튼 비활성화 기능과 중복 확인 후 재입력시 버튼 활성화 기능 구현 * Feat: #159 회원가입 기능 구현을 위한 user mock 데이터 추가 및 mock JWT 생성, 디코딩 기능 구현 * Chore: #159 Validation Rule 에 맞추어 mock 데이터의 비밀번호 수정 * Fix: #159 새로고침 시 기본 더미 JWT 데이터로도 기능이 동작되도록 수정 * Fix: #159 액세스 토큰 재발급이 안 되는 오류 해결 * Feat: #159 회원가입 시 기존에 존재하는 이메일을 입력했을 시 에러 처리 * Chore: #159 코드 리뷰 반영 수정 * Chore: #159 User Dummy의 소셜 회원 username, nickname 값 수정 * Chore: #159 mock 데이터의 유저 정보 수정 * Fix: #159 로그인 시 리프레시 토큰의 만료 시간을 초기화하도록 수정 * UI: #178 ModalFormButton 제거 및 ModalButton으로 대체 (#179) * Feat: #169 상태 삭제 기능 구현 (#180) * Feat: #169 상태 삭제 API를 위한 React Query 기능 추가 * Feat: #169 상태 삭제 API를 위한 MSW 기능 추가 * Feat: #169 상태 삭제 기능 구현 * Config: #169 react query client 설정 추가 * Feat: #169 예외 처리 로직 추가 & 로딩 시 화면 추가 * Chore: #169 메세지 오탈자/맞춤법 수정 * Feat: #87 팀 생성 UI 및 로직 추가 (#161) * Feat: #87 팀 생성 UI 및 로직 추가 * Fix: #87 msw handler 하드코딩 수정 및 유효하지 않은 역활 처리 * Refactor: #87 팀 권한 정보 툴팁 component 분리 및 경로 정리 * Fix: #87 코드리뷰 수정사항 반영 * Fix : SelectedUserWithRole 타입 제네릭으로 변경 * Refactor: #87 코드리뷰 반영 리팩토링 * Fix: #182 칸반 보드에서 일정 삭제 / 상태 삭제 후 순서 변경이 제대로 일어나지 않는 문제 해결 (#184) * Fix: 일정 삭제 & 상태 삭제시 sortOrder를 재정렬하도록 수정 * Fix: #182 일정 삭제 & 상태 삭제시 sortOrder를 재정렬하도록 수정 * Formatting: #183 파일 목록 조회 데이터 구조 변경 (#185) * Feat: #175 유저 프로필 변경 페이지 기능 구현 (#181) * UI: #175 유저설정 페이지 링크 분리 UI 변경 * Feat: #175 유저 프로필 변경 기능 구현 * Feat: #175 유저 프로필 변경 시 닉네임 중복 체크 기능 추가 * Refactor: #175 닉네임 중복체크 훅 분리 * Refactor: #175 기존 닉네임 트래킹 변수를 커스텀 훅으로 이동 * Feat: #175 userIndex를 찾지 못한 경우 에러 추가 * Fix: #175 최대 등록 가능한 링크의 개수를 5개로 수정 * Feat: #175 유저 프로필 변경 네트워크 로직을 tanstack query 로직으로 수정 * Refactor: #175 queryKeyGenergator를 이용해 쿼리 키 생성 및 적용 * Formatting: #175 통일성을 위해 변수명 수정 * Chore: #175 유저데이터 초기값 설정에서 optional chaining 제거 * Feat: #168 일정 파일 다운로드 기능 구현 (#186) * Chore: #168 파일 더미 데이터 수정 * Feat: #168 일정 파일 다운로드 API 요청 기능 구현 * Feat: #168 일정 파일 다운로드 API MSW 기능 추가 * Feat: #168 useAxios 즉각적인 처리를 위해 response 반환 추가 * Feat: #168 일정 파일 다운로드 기능 구현 * Feat: #168 풀파일명을 파일명, 확장자로 분리하는 유틸리티 함수 추가 * Chore: #168 import 경로 수정 * Feat: #187 일정 수정 모달 파일 업로드 기능 추가 (#189) * Refactor: #187 FileDropZone 컴포넌트 리팩토링 * Feat: #187 useTaskFile 커스텀훅 추가 * Feat: #187 일정 수정 모달 파일 업로드 기능 구현 * Comment: #187 불필요한 주석 제거 * Rename: #187 파일 이름 오타 수정 * Chore: #187 코드 순서 변경 * Feat: #188 일정 상세 모달 수정 버튼 기능 구현 (상세 모달 → 수정 모달 전환) (#190) * Feat: #188 상세 모달 컴포넌트 props로 수정 모달 open 함수 주입 * Feat: #188 칸반 보드 상세모달 수정 버튼 클릭시 수정 모달 전환 * Feat: #188 캘린더 일정 수정 모달 수정 버튼 클릭시 수정 모달 전환 * Chore: #188 import 경로 수정 * Feat: #172 소셜 회원가입/로그인 기능 구현 (#191) * Feat: #172 카카오 로그인 AT 발급 기능 구현 * Feat: #172 카카오 회원가입 및 로그인 구현 * Feat: #172 구글 회원가입 및 로그인 구현 * Refactor: #172 콜백페이지를 카카오-구글이 공용으로 쓸 수 있도록 수정 및 컴포넌트, 함수명 수정 * Refactor: #172 공급업체별 service 함수 및 네트워크 모킹 핸들러 통합 * Refactor: #172 공급업체별 소셜로그인 버튼 컴포넌트 통합 * Feat: #172 인가코드 얻어오지 못했을 시 에러 처리 추가 * Fix: #172 콜백 페이지의 다중 호출 방지 기능 추가 * Refactor: #172 코드리뷰 반영 수정 * Chore: #172 카카오구글 링크 env 파일로 이동 및 코드 리뷰 반영 수정 * Feat: #198 API 명세서의 응답 데이터 구조 변경에 따른 타입 재정의 (#201) * Refactor: #198 일정 타입 수정 (name → taskName) * Refactor: #198 프로젝트 타입 수정 (name → projectName) * Comment: #198 완료한 ToDo 주석 제거 * Chore: #198 Label ID 수정 * Fix: #202 Calendar 컴포넌트 events 타입 호환 문제 해결 (#203) * Feat: #165 팀 수정 모달 UI 및 기능 구현 (#195) * Feat: #87 팀 생성 UI 및 로직 추가 * Fix: #87 msw handler 하드코딩 수정 및 유효하지 않은 역활 처리 * Refactor: #87 팀 권한 정보 툴팁 component 분리 및 경로 정리 * Fix: #87 코드리뷰 수정사항 반영 * Feat: 팀 수정 API 및 query 추가 * Feat: #165 팀 정보 수정 모달 UI 및 기능 구현 * Fix: #165 팀원 목록 조회 수정 * Remove: #165 필요없는 파일 삭제 * Fix: #165 코드리뷰 반영 수정 * Fix: #165 중복 Generator 쿼리 키 제거 * Fix: #165 코드리뷰 반영 수정 * Fix: #165 팀원 삭제 MSW 수정 및 팀원 삭제 팀 삭제 query 수정 * Fix: #165 TeamCoworkerForm 타입 정의 * Fix: #165 팀 타입 재정의 & Indexed Access type 으로 수정 * Feat: #204 일정 수정 모달에서 일정 상세 모달로 돌아가기 버튼 추가 (#205) * Feat: #204 일정 정보 수정후 모달을 닫는 기능 제거 * Feat: ModalButton의 버튼 text 색상 props로 전환 * Feat: #204 일정 상세보기 모달 props 변경, 단일 일정 검색 추가 * Refactor: #204 캘린더 일정 hover시 가시성 개선 * Refactor: #204 QueryFilter 옵션 수정을 통한 refetch 요청 최소화 * Feat: #204 일정 목록 로딩시 대체 UI(Spinner)가 나오도록 수정 * Comment: #204 React Reparenting 문제 주석 추가 * Fix: #204 useEffect 의존성 추가 * UI: #204 돌아가기 버튼 margin 간격 조정 * UI: #206 일정 파일 다운로드 버튼 태그 구성 변경 (#207) * UI: #206 일정 파일 다운로드 버튼 태그 구성 변경 & 스타일 변경 * UI: #206 드래그 선택 불가능 하도록 select-none 추가 * Feat: #208 PeriodDateInput 컴포넌트 종료일 토글 자동 활성화 기능 추가 (#209) * Fix: #208 날짜 관련 Validation 로직 수정 * Feat: #208 프로젝트 목록 데이터 타입 변환 추가 * Feat: #208 PeriodDateInput 컴포넌트 종료일 토글 자동 활성화 기능 추가 * Chore: #208 PeriodDateInput Import 정리 * Chore: #208 오타 수정 (projctStartDate → projectStartDate) * Refactor: #208 시작일과 종료일 날짜 처리 과정 수정 * Fix: #214 프로젝트 목록 및 팀 목록 쿼리로 변경 (#215) * Fix: #214 프로젝트 및 팀 목록 더미에서 쿼리로 변경 * Fix: #214 AI 코드리뷰 반영 * Feat: #192 링크 수정 기능 구현 (#193) * Feat: #192 링크 변경 기능 구현 * UI: #192 링크 수정 네트워크 처리 중 로딩 추가 * Comment: #192 삭제된 주석 추가 * Refactor: #192 코드리뷰 반영 수정 * Chore: #192 코드리뷰 반영 수정 * Feat: #192 로그아웃 시 유저 링크 데이터 초기화를 위해 쿼리키에 유저 ID 등록 * Refactor: #172 이중 관리 방지를 위한 전체 링크 변수 삭제 * Feat: #210 프로젝트 삭제 기능 추가 (#213) * Feat: #210 프로젝트 삭제 기능 추가 * Fix: #210 프로젝트 삭제 handler 변경 및 useEffect 의존성 배열 변경 * Fix: #210 코드리뷰 반영 수정 및 경로 정리 * Formatting:#210 isLoading 이름 변경 * Fix:#216 home 페이지로 이동시 teams 페이지로 리다이렉션 (#217) * Refactor: #196 MSW중 TaskService 관련 기능 리팩토링 (#219) * Refactor: #196 MSW Task 처리 관련 리팩토링 * Comment: #196 불필요한 console.log 삭제 * Feat: #196 더미 토큰 처리에서 실제 토큰 처리로 수정 * Feat: #196 Mock에 정의한 타입 분리 * Commnet: #196 MockAPI 함수 기능 설명 주석 추가 * Chore: #196 타입 형변환 로직 삭제 * Feat: #196 MSW 처리시 Auto Increment를 모방하여 ID 생성 * Chore: #196 import 경로 정리 * Fix: #220 종료일 비활성화시 종료일 설정 기능도 비활성화 되도록 수정 (#221) * UI:#199 프로젝트 생성 UI 구현 (#218) * UI:#199 프로젝트 생성 UI 구현 * Fix:#199 role.ts 파일의 프로젝트 룰 권한 이름 변경 * Fix: #222 인증여부에 따라 헤더의 문구와 로그아웃 버튼 노출하도록 수정 (#223) * Fix: #222 인증여부에 따라 헤더의 문구와 로그아웃 버튼 노출하도록 수정 * Feat: #222 유저인증 되어 있지 않을 시 로그인 버튼 추가 * Chore: #222 로그인 화면 이동 시 replace 제거 * Refactor: #224 MSW 처리중 StatusService, ProjectService 기능 리팩토링 (#226) * Refactor: #224 MSW StatusService 기능 리팩토링 * Formatting: #224 일정 수정 API 로직중 폼 데이터 변수명 수정 * Refactor: #224 MSW ProjectSevice 기능 리팩토링 * Fix: #224 프로젝트 관련 정보 조회성 로직은 팀에 속하는가로 수정 * Fix: #224 팀 접근 권한에 넘기는 매개변수 수정 * Fix: #224 AI 리뷰 반영 * Feat: #211 유저 프로필 이미지 업로드 기능 구현 (#212) * Feat: #211 유저 프로필 이미지 업로드 기능 구현 * Feat: #211 DB 명세서에 따라 프로필 사진 저장 방식 변경 * Feat: #211 유저 프로필 이미지 저장 형식을 UUID로 변경 * Chore: #211 코드리뷰 반영 수정 * Chore: #211 코드리뷰 반영 수정 * Chore: #211 토큰에서 유저 정보를 추출할 수 없을 때 오류 추가 * Feat: #211 이미지 업로드 시 서버 측에서 UUID를 가져와 zustand 스토어에 저장하도록 수정 * Feat: #228 유저 인증을 위한 MSW 수정 및 페이지 라우트 인증 처리 (#229) * Feat: #228 로그인 전후 라우트별 인증 확인 처리 * Chore: #228 MSW에서 JWT 더미 데이터 사용한 코드 일괄 삭제 * Fix: #228 새로고침 시 로그인 페이지로 강제 다이렉트되는 문제 해결 * Chore: #236 MSW에서 mock JWT 삭제 및 헤더의 로그아웃 버튼 노출 시 userId 체크 추가 (#237) * Fix:#225 팀 쿼리 키 userId 추가 및 프로젝트 목록 조회 teamId null시 처리 추가 (#227) * Fix:#225 team query key add userId & teamId null append * Fix: #225 인덱스트 엑세스 타입 교체 및 업데이트모달페이지 오류 수정 * Fix: #225 enabled 다시 추가 및 테스트 로직 삭제 * Feat: #194 유저 프로필 이미지 조회 기능 구현 (#235) * Feat: #211 유저 프로필 이미지 업로드 기능 구현 * Feat: #211 DB 명세서에 따라 프로필 사진 저장 방식 변경 * Feat: #211 유저 프로필 이미지 저장 형식을 UUID로 변경 * Chore: #211 코드리뷰 반영 수정 * Chore: #211 코드리뷰 반영 수정 * Chore: #211 토큰에서 유저 정보를 추출할 수 없을 때 오류 추가 * Feat: #211 이미지 업로드 시 서버 측에서 UUID를 가져와 zustand 스토어에 저장하도록 수정 * Feat: #194 프로필 이미지 조회 기능 구현 * Chore: #194 파일 경로 수정 * Chore: #194 불필요한 쿼리 함수 삭제 * Chore: #194 msw에서 더미 jwt 코드 삭제 및 접근권한 에러 코드 변경 * Feat: #200 프로젝트 생성 (#240) * UI: #200 프로젝트 팀 없이 생성 시 토스트 메시지 출력 및 프로젝트 생성 UI 설정 * Feat: #200 프로젝트 생성시 날짜 선택 로직 추가 * Feat: #200 프로젝트 생성 팀원 검색 로직 추가 * Feat: #200 프로젝트 생성 로직 추가 * Fix: #200 ai 코드리뷰 반영 수정 * Fix: #200 코드리뷰 반영 수정 * Fix: #238 일정 등록 전 프로젝트 상태 개수 확인하도록 수정 (#239) * Refactor: #243 전체 일정 조회에서 단일 일정 조회 로직 분리 (#244) * Refactor: #243 전체 일정 조회에서 단일 일정 조회 로직 분리 * Refactor: #243 전체 일정 조회에서 일정 이름 목록 추출 로직을 분리 * Chore: #243 AI 코드 리뷰 반영 * UI: #241 프로젝트 수정 UI 구현 (#242) * UI: #241 프로젝트 수정 UI 구현 * Fix: #241 경로 정리 & 폼 아이디 & spinner 조건 수정 * Fix: #241 경로 정리 및 프로젝트 생성 네이밍 변경 * Fix: #241 프로젝트 & 팀 이름 중복체크 및 팀 쿼리 변경 * Formatting: #241 teamList 변수 제거 후 data 별칭으로 수정 * Refactor: #248 전체 상태 조회에서 단일 상태 조회 로직 분리 (#249) * Refactor: #248 전체 상태 조회에서 단일 상태 조회 로직 분리 * Comment: #248 수정한 ToDo 주석 삭제 * Chore: #248 AI 리뷰 내용 반영 * Chore:# 248 import 경로 정리 * Feat: #246 프로젝트 수정 기능 구현 (#250) * Feat: #246 프로젝트 수정 기능 구현 * Fix: #246 mutate 별칭 네이밍 통일 및 msw 수정 * Fix: #245 accesstoken 더미 데이터를 유저 데이터로 수정 (#247) * Fix: #245 accesstoken 더미 데이터 부분 수정 * Fix: #245 유저 인증 토큰 상태 코드 통일 * Chore: #231 이메일 인증 관련 코드 검토 및 주석 제거 (#234) * Config: #254 테스트를 위한 환경 설정 추가 (#255) * Chore: #254 build 작업시 tsc에서 지적하는 내용 수정 * Config: #254 staging 로컬 환경 테스트를 위한 serve 라이브러리 추가 * Config: #254 build를 위한 tsc 설정 추가 * Config: #254 gitignore 설정 추가 * Feat: #251 프로젝트 수정 팀원 추가 및 권한 변경 추가 (#252) * Feat: #251 프로젝트 수정 팀원 추가 및 권한 변경 추가 * Fix: AI 코드리뷰 반영 코드 수정 * Fix: #251 코드리뷰 반영 수정 * Fix: #251 프로젝트 수정 msw 및 mock API 수정 * Fix: #251 mockAPI 수정 및 mswHandler 수정 * Fix: #251 type 중복 삭제 mockAPI return 삭제 mswHandler try-catch 추가 * Formatting: #251 필요없는 경로 삭제 * Feat: #253 프로젝트 팀원 삭제 추가 (#256) * Feat: #253 프로젝트 팀원 삭제 추가 * Fix: #253 프로젝트 팀원 삭제 핸들러 삭제 범위 추가 * Fix: #253 mockAPI 추가 및 프로젝트 팀원 삭제 mswhandler 수정 * Config: #258 스테이징 환경에 https 설정 적용 (#259) * Config: #258 localhost 인증서 설정을 통해 실행하도록 script 명령어 수정 * Config: #258 localhost 인증서 파일 추적 제외 설정 * Formatting: #257 권한 설명 변경 (#260) * Formatting: #257 권한 설명 변경 * Formatting: #257 팀 & 프로젝트 권한 설명 변경 * Formatting: #257 프로젝트 룰 권한 설명 변경 * Formatting: #257 권한 설명 변경 * Fix: #233 새로고침 시 zustand 스토어 초기화되는 문제 수정 (#263) * Fix: 새로고침 후 isAuthenticated 초기화 문제를 해결하기 위한 영속성 추가 * Fix: 새로고침 시 zustand 스토어의 AT가 휘발되는 현상 보완 * Fix: #233 이미지 삭제 시, 기등록된 이미지가 아닌 다른 이미지를 참조 삭제하고 있던 에러 수정 * Chore: #233 gitignore 중복 삭제 * Feat: #261 유저 전체 검색 mswHandler 추가 & 팀 생성 시 HEAD 권한 삭제 (#264) * Feat: #261 유저 전체 검색 mswHandler 추가 & 팀 생성 시 HEAD 권한 삭제 * Fix: #261 유저 전체검색 mswHandler 변경 * Config: #269 Github Actions를 통해 테스트 통과 여부 검사 설정 (#271) * Config: #269 vitest github actions workflow 추가 * Config: #269 package.json scripts 명령어 세분화 * Fix: #266 AT 기간 만료 시 로직 수정 (#267) * Feat: #197 메타 데이터를 설정하는 컴포넌트 추가 및 적용 (#273) * Config: reat-helmet-async 라이브러리 추가 * Remove: #197 .gitkeep 파일 삭제 * Config: #197 favicon 아이콘 설정 * Feat: MetaData 추가를 위한 컴포넌트 추가 * Feat: #197 Page 컴포넌트에 Meta 컴포넌트 적용 * Chore: #197 메타 데이터 title 일관성을 위한 수정 * Chore: #197 접근성 개선을 위한 수정 * Asset: #197 Open Graph용 이미지 추가 및 og:image 재설정 * Config: #197 환경변수명 변경 및 Meta 컴포넌트 적용 * Chore: #197 불필요한 로그 삭제 * Fix: #274 팀 가입 현황과 대기 현황 필터링이 반대로 설정된 문제 해결 (#277) * Fix: #274 가입현황 대기현황 팀목록 필터링 수정 * Fix: #274 필터링 조건 변경에 따른 mock 데이터 수정 * Fix: #274 필터링 값 변경에 따른 팀 초대 수락 MSW 처리 수정 * Fix: #274 팀 생성 및 팀원 초대 MSW 처리 수정 * Fix: #275 로그아웃시 Access Token이 포함되도록 수정 (#276) * Fix: #275 로그아웃시 Access Token이 포함되도록 수정 * Fix: #275 MSW 로그아웃 처리 수정 * Feat: #230 유저 프로필 이미지 삭제 기능 구현 (#272) * Feat: #230 프로필 이미지 삭제 기능 구현 * Feat: #230 query 실행 결과에 따른 후처리를 위해 mutateAsync 사용 * Feat: #230 유저 mock 데이터에서 프로필 이미지 삭제 * Chore: #230 URL 분리에 따른 변수명 변경 * Chore: #230 mutate 명칭을 명시적으로 변경 * Feat: #265 프로젝트 생성 및 수정 권한 설정 추가 (#268) * Feat: 프로젝트 생성 및 수정 권한 설정 추가 * Feat: #265 프로젝트 수정 및 삭제 권한 설정 및 컴포넌트 분리 * Fix: #265 경로 정리 및 팀원 목록 조회 타입 단언 삭제 * Config: #270 Github Actions 자동 배포 설정 추가 (#280) * Config: #285 소셜 로그인 리다이렉트 URL 설정 & checkout 브랜치 명시 (#286) * Fix: #288 환경변수명 수정 (#289) --------- Co-authored-by: Yoonyesol <[email protected]> Co-authored-by: ice-bear98 <[email protected]>
PR Type
What kind of change does this PR introduce?
Related Issues
What does this PR do?
Other information
MSW를 통해 파일 업로드를 모킹할 필요가 있었습니다. 브라우저 요청에 대한 모킹이라 로컬에 파일을 저장할 수 없어서 메모리에 Blob 객체로 넣어두고, 이후 다운로드 API를 테스트할 때 내려주는 방법으로 진행할 예정입니다.
파일의 병렬적 요청에 대해서는
Promise.allSettled
와Promise.all
를 고려했습니다. all의 경우 하나라도 실패하면 전체를 실패로 간주함을 알게 되었고, 성공/실패에 상관없이 모두가 실행되어 반영되어야하는 이번 구현 상황에선 allSettled가 적절하다고 판단하여 allSettled를 사용하였습니다.추가적으로 useForm을 사용하고 있어서 보편적인 파일 업로드라면 register의 validation을 사용했을텐데, 드래그 앤 드롭 파일 업로드 기능이 있어서 register의 validation으로 파일을 걸러낼 수 없었습니다. 그래서 별도의 파일 검증 로직을 만들었습니다. 궁금한 점 있으면 편하게 물어봐 주세요☺️
View
파일 최대 개수 Validation
파일명 Validation
파일 확장자 Validation
파일 용량 Validation
파일 업로드 실패
파일 업로드 성공
아래의 화면은 파일의 업로드 성공/실패에 대한 개별적인 처리가 아니라, 파일명을 묶어서 한 번에 보여주는 방법입니다. 원래는 아래와 같은 방법으로 진행하려고 했으나 최대 10개의 파일을 등록이 가능한 상황에서 한 번에 묶어서 보여주면 메시지가 좋아 보이지 않아서 FE 간의 상의 끝에 성공은 묶어서 몇개의 파일이 성공했는지를 피드백으로 주고 있고, 실패는 개별 메시지로 보여주고 있습니다.
이전 성공한 파일 목록을 묶어서 보여주는 경우
이전 실패한 파일 목록을 묶어서 보여주는 경우