[refactor] 에러 처리 유틸 및 utils 구조 정리#246
Conversation
Walkthrough에러 처리 유틸과 utils 구조를 재정리하고 에러 처리 흐름을 중앙화했습니다. Possibly related PRs
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/pages/Manager/ManagedRecruitmentForm/index.tsx (1)
76-77:⚠️ Potential issue | 🟡 Minor
patchSettings에러 핸들링 누락토글 변경 시
patchSettings실패에 대한 에러 처리가 없습니다.ManagedAccount의handleFeeEnabledChange에서도 동일하게 누락되어 있어 의도적일 수 있으나, 사용자에게 실패 피드백이 없습니다.🛠️ 에러 핸들링 추가 제안
+ const showApiErrorToast = useApiErrorToast(); + const handleApplicationEnabledChange = (enabled: boolean) => { if (isApplicationToggleDisabled) { return; } - patchSettings({ isApplicationEnabled: enabled }); + patchSettings( + { isApplicationEnabled: enabled }, + { onError: (error) => showApiErrorToast(error, '설정 변경에 실패했습니다.') } + ); };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedRecruitmentForm/index.tsx` around lines 76 - 77, The patchSettings call in ManagedRecruitmentForm (and similarly ManagedAccount.handleFeeEnabledChange) lacks error handling on toggle; wrap the async patchSettings call in try/catch (or handle the returned Promise) and on failure show user-facing feedback (toast/modal or set an error state) and optionally revert the UI toggle; reference the patchSettings invocation in ManagedRecruitmentForm and ManagedAccount.handleFeeEnabledChange to add try { await patchSettings(...); } catch (err) { show error to user and revert toggle } so failures are surfaced to users.src/pages/Manager/ManagedAccount/index.tsx (1)
97-99:⚠️ Potential issue | 🟡 Minor
handleFeeEnabledChange도 에러 핸들링 없음
ManagedRecruitmentForm과 동일하게 토글 변경 시 에러 처리가 누락되어 있습니다. 일관성을 위해 함께 개선하는 것을 권장합니다.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedAccount/index.tsx` around lines 97 - 99, handleFeeEnabledChange currently calls patchSettings({ isFeeEnabled: enabled }) with no error handling; update it to mirror ManagedRecruitmentForm by awaiting the async patchSettings call (if it returns a promise) and wrapping it in try/catch, showing a user-facing error (e.g., toast/notification or processLogger) on failure and restoring any optimistic UI change if necessary; reference the handleFeeEnabledChange function and the patchSettings call so you can add the await/try-catch and error reporting/rollback logic consistently with ManagedRecruitmentForm.
🧹 Nitpick comments (1)
src/utils/ts/error/apiErrorMessage.ts (1)
6-6:filter(Boolean)제거 고려
FieldError.message는apiError.ts의 런타임 검증(Line 62)에서 string 타입이 보장됩니다. 빈 문자열 필터링 의도라면.filter((m) => m)또는.filter((m) => m.trim())이 더 명시적입니다.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/utils/ts/error/apiErrorMessage.ts` at line 6, Replace the ambiguous .filter(Boolean) used after error.apiError.fieldErrors.map(({ message }) => message) with an explicit predicate: either .filter((m) => m) to remove falsy values (if you just want to guard against undefined/null) or .filter((m) => m.trim()) to also strip out empty/whitespace-only strings; this change should be applied where Array.from(new Set(...)) is built from error.apiError.fieldErrors so it clearly reflects the intended filtering of FieldError.message (see runtime guarantee in apiError.ts).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/pages/Manager/ManagedMemberList/index.tsx`:
- Around line 398-399: The useApiErrorToast hook currently detects 5xx server
errors but does not redirect to the server error page; inside useApiErrorToast
(where isServerError(error) is checked), add a call to
redirectToServerErrorPage() when isServerError(error) is true before returning
so the hook both handles and redirects on server errors; update the branch that
checks isAuthError/isServerError/isCanceledError (in useApiErrorToast) to call
redirectToServerErrorPage() for server errors to ensure all callers (e.g., the
onError handlers referencing showApiErrorToast) follow the guideline.
In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx`:
- Around line 556-559: The error fallback message incorrectly always says "모집 공고
수정에 실패했습니다." even in the create flow; update the call site that renders
getApiErrorMessage(error, '모집 공고 수정에 실패했습니다.') to choose the fallback string
based on whether existingRecruitment exists (use existingRecruitment ? '모집 공고
수정에 실패했습니다.' : '모집 공고 등록에 실패했습니다.'); adjust the JSX around error rendering that
references error, existingRecruitment, and getApiErrorMessage so the correct
localized message is passed for create vs edit flows.
- Around line 289-292: The UI toggles recruitment state before persisting; if
patchSettings({ isRecruitmentEnabled: nextRecruitmentEnabled }) fails, rollback
the local toggle in the catch block so UI matches server: after calling
showApiErrorToast(error, '모집 공고 활성화 설정에 실패했습니다.'), reset the local state back to
its previous value (e.g., call the state setter used for the recruitment toggle
with the inverse of nextRecruitmentEnabled or with a saved previous value).
Ensure this uses the same state setter that the toggle originally updated so the
switch reflects the real state when patchSettings fails.
---
Outside diff comments:
In `@src/pages/Manager/ManagedAccount/index.tsx`:
- Around line 97-99: handleFeeEnabledChange currently calls patchSettings({
isFeeEnabled: enabled }) with no error handling; update it to mirror
ManagedRecruitmentForm by awaiting the async patchSettings call (if it returns a
promise) and wrapping it in try/catch, showing a user-facing error (e.g.,
toast/notification or processLogger) on failure and restoring any optimistic UI
change if necessary; reference the handleFeeEnabledChange function and the
patchSettings call so you can add the await/try-catch and error
reporting/rollback logic consistently with ManagedRecruitmentForm.
In `@src/pages/Manager/ManagedRecruitmentForm/index.tsx`:
- Around line 76-77: The patchSettings call in ManagedRecruitmentForm (and
similarly ManagedAccount.handleFeeEnabledChange) lacks error handling on toggle;
wrap the async patchSettings call in try/catch (or handle the returned Promise)
and on failure show user-facing feedback (toast/modal or set an error state) and
optionally revert the UI toggle; reference the patchSettings invocation in
ManagedRecruitmentForm and ManagedAccount.handleFeeEnabledChange to add try {
await patchSettings(...); } catch (err) { show error to user and revert toggle }
so failures are surfaced to users.
---
Nitpick comments:
In `@src/utils/ts/error/apiErrorMessage.ts`:
- Line 6: Replace the ambiguous .filter(Boolean) used after
error.apiError.fieldErrors.map(({ message }) => message) with an explicit
predicate: either .filter((m) => m) to remove falsy values (if you just want to
guard against undefined/null) or .filter((m) => m.trim()) to also strip out
empty/whitespace-only strings; this change should be applied where
Array.from(new Set(...)) is built from error.apiError.fieldErrors so it clearly
reflects the intended filtering of FieldError.message (see runtime guarantee in
apiError.ts).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b36119c4-20e4-45c0-b2ed-ec610dcf056a
📒 Files selected for processing (31)
src/apis/auth/index.tssrc/apis/client.tssrc/apis/club/managedQueries.tssrc/apis/studyTime/hooks.tssrc/components/notification/hooks/useInboxNotificationStream.tssrc/main.tsxsrc/pages/Auth/SignUp/ConfirmStep.tsxsrc/pages/Club/Application/clubFeePage.tsxsrc/pages/Manager/ManagedAccount/index.tsxsrc/pages/Manager/ManagedApplicationDetail/index.tsxsrc/pages/Manager/ManagedApplicationList/index.tsxsrc/pages/Manager/ManagedClubProfile/index.tsxsrc/pages/Manager/ManagedMemberList/index.tsxsrc/pages/Manager/ManagedRecruitmentForm/index.tsxsrc/pages/Manager/ManagedRecruitmentWrite/index.tsxsrc/pages/Manager/components/ApplicationDetailContent.tsxsrc/pages/Manager/components/DatePicker/index.tsxsrc/pages/Schedule/components/CalendarWeekRow.tsxsrc/pages/Schedule/components/ScheduleDetail.tsxsrc/pages/Timer/components/RankingItem.tsxsrc/pages/Timer/components/TimerButton.tsxsrc/utils/hooks/error/useApiErrorToast.tssrc/utils/hooks/image/useUploadImage.tssrc/utils/ts/datetime/calendar.tssrc/utils/ts/datetime/date.tssrc/utils/ts/datetime/time.tssrc/utils/ts/error/apiError.tssrc/utils/ts/error/apiErrorMessage.tssrc/utils/ts/error/errorRedirect.tssrc/utils/ts/image/imagePreprocessor.tssrc/utils/ts/image/imagePreprocessor.worker.ts
There was a problem hiding this comment.
🧹 Nitpick comments (3)
src/pages/Manager/ManagedRecruitmentWrite/index.tsx (3)
291-294: 변수 섀도잉 개선 권장catch 파라미터
error가 line 76의 mutationerror를 섀도잉합니다. 혼동 방지를 위해 명시적인 이름을 권장합니다.♻️ 수정 제안
- } catch (error) { - showApiErrorToast(error, '모집 공고 활성화 설정에 실패했습니다.'); + } catch (settingsError) { + showApiErrorToast(settingsError, '모집 공고 활성화 설정에 실패했습니다.'); setIsRecruitmentEnabled(previousRecruitmentEnabled); return; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx` around lines 291 - 294, The catch block is shadowing the mutation variable named error (declared earlier), so rename the catch parameter to a distinct name (e.g., apiError or err) and update its usage in the catch body (where showApiErrorToast is called) to avoid shadowing; ensure you still call setIsRecruitmentEnabled(previousRecruitmentEnabled) and return as before. Reference symbols: the catch block around setIsRecruitmentEnabled, showApiErrorToast, previousRecruitmentEnabled, and the earlier mutation variable error — change only the catch parameter and its usage.
568-580: 버튼 텍스트가 생성/수정 구분 없이 항상 '수정'으로 표시됩니다에러 메시지(line 562)와 성공 토스트(line 298)는
existingRecruitment여부로 생성/수정을 구분하지만, 버튼 텍스트는 항상 '모집공고 수정'입니다.♻️ 수정 제안
{isPreparingImages ? '이미지 준비 중…' : isUploading ? '이미지 업로드 중…' : isSavingRecruitment - ? '수정 중…' - : '모집공고 수정'} + ? (existingRecruitment ? '수정 중…' : '등록 중…') + : (existingRecruitment ? '모집공고 수정' : '모집공고 등록')}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx` around lines 568 - 580, The submit button always shows "모집공고 수정" regardless of whether we're creating or editing; update the button text logic to mirror the elsewhere-used existingRecruitment check (used for error message and success toast) so it shows creation text (e.g., "모집공고 등록" or equivalent) when existingRecruitment is falsy and the appropriate in-progress variants when isPreparingImages/isUploading/isSavingRecruitment are true; change the button label rendering inside the button (the ternary chain) to first decide base actionText = existingRecruitment ? '모집공고 수정' : '모집공고 등록' and then apply the existing isPreparingImages/isUploading/isSavingRecruitment precedence to show the correct in-progress strings.
51-79: 페이지 로직 분리 권장 (Optional)코딩 가이드라인에 따르면 페이지별 로직은
hooks/하위 디렉토리로 분리해야 합니다. 현재 컴포넌트는 15개 이상의 state와 복잡한handleSubmit로직을 포함하고 있어, 추후 리팩토링 시 커스텀 훅으로 분리를 고려해주세요.As per coding guidelines: "Separate page logic into page-specific
hooks/subdirectory instead of keeping it in the page component"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx` around lines 51 - 79, The ManagedRecruitmentWrite component contains heavy page logic and many states (startDate, endDate, startTime, endTime, content, isRecruitmentEnabled, isAlwaysRecruiting, images, currentImageIndex, isPreparingImages, isUploading, hasHandledExisting, hasInitializedRecruitmentEnabled, textareaRef, fileInputRef) and async mutations/hooks (useUploadImage, managedClubQueries.recruitment, managedClubQueries.settings, useUpsertManagedClubRecruitmentMutation, usePatchManagedClubSettingsMutation, useApiErrorToast, useToastContext) that should be moved into a custom hook to follow the page-logic separation guideline; extract this state and all related handlers (including handleSubmit, image preparation/upload handlers, and modal controls like isChoiceModalOpen/openChoiceModal/closeChoiceModal) into a new hook (e.g., useManagedRecruitmentWrite) under hooks/, return only the necessary values and action callbacks from the hook, and refactor ManagedRecruitmentWrite to call that hook and render UI only. Ensure the hook imports/uses the same query/mutation hooks and preserves behavior and types so tests and consumers remain unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx`:
- Around line 291-294: The catch block is shadowing the mutation variable named
error (declared earlier), so rename the catch parameter to a distinct name
(e.g., apiError or err) and update its usage in the catch body (where
showApiErrorToast is called) to avoid shadowing; ensure you still call
setIsRecruitmentEnabled(previousRecruitmentEnabled) and return as before.
Reference symbols: the catch block around setIsRecruitmentEnabled,
showApiErrorToast, previousRecruitmentEnabled, and the earlier mutation variable
error — change only the catch parameter and its usage.
- Around line 568-580: The submit button always shows "모집공고 수정" regardless of
whether we're creating or editing; update the button text logic to mirror the
elsewhere-used existingRecruitment check (used for error message and success
toast) so it shows creation text (e.g., "모집공고 등록" or equivalent) when
existingRecruitment is falsy and the appropriate in-progress variants when
isPreparingImages/isUploading/isSavingRecruitment are true; change the button
label rendering inside the button (the ternary chain) to first decide base
actionText = existingRecruitment ? '모집공고 수정' : '모집공고 등록' and then apply the
existing isPreparingImages/isUploading/isSavingRecruitment precedence to show
the correct in-progress strings.
- Around line 51-79: The ManagedRecruitmentWrite component contains heavy page
logic and many states (startDate, endDate, startTime, endTime, content,
isRecruitmentEnabled, isAlwaysRecruiting, images, currentImageIndex,
isPreparingImages, isUploading, hasHandledExisting,
hasInitializedRecruitmentEnabled, textareaRef, fileInputRef) and async
mutations/hooks (useUploadImage, managedClubQueries.recruitment,
managedClubQueries.settings, useUpsertManagedClubRecruitmentMutation,
usePatchManagedClubSettingsMutation, useApiErrorToast, useToastContext) that
should be moved into a custom hook to follow the page-logic separation
guideline; extract this state and all related handlers (including handleSubmit,
image preparation/upload handlers, and modal controls like
isChoiceModalOpen/openChoiceModal/closeChoiceModal) into a new hook (e.g.,
useManagedRecruitmentWrite) under hooks/, return only the necessary values and
action callbacks from the hook, and refactor ManagedRecruitmentWrite to call
that hook and render UI only. Ensure the hook imports/uses the same
query/mutation hooks and preserves behavior and types so tests and consumers
remain unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: d2e382f7-9487-4ad4-9551-5361e38ae825
📒 Files selected for processing (2)
src/pages/Manager/ManagedRecruitmentWrite/index.tsxsrc/utils/ts/error/apiErrorMessage.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- src/utils/ts/error/apiErrorMessage.ts
* 205 feat 이미지 전처리 기능 구현 (#206) * feat: 전처리 로직 및 WebWorker 구현 * feat: 전처리 적용 및 preview 동시성 제어 로직 추가 * refactor: 리뷰 반영 * [hotfix] 하단바 너비 수정 (#208) * hotfix: 하단바 너비 수정 * chore: 불필요한 값 제거 * refactor: 고정 gap 제거 * Reapply "[feat] 광고 배너 추가 (#200)" This reverts commit c51ec85. * [feat] 하단바 리디자인 (#213) * chore: asset 추가 * feat: 하단바 리디자인 반영 및 레이아웃 수정 * [refactor] 광고 카드 레이아웃 밀림 수정 (#215) * refactor: 광고 개수 측정 시기 변경 및 기본값 제거 * feat: 스켈레톤 UI 추가 * feat: 인앱 알림 페이지 및 토스트 구현 (#217) * feat: 알림 API 및 스트림 기반 추가 * feat: 인앱 알림 레이어 추가 * feat: 알림 페이지 및 헤더 진입 구현 * fix: 알림 스트림 401 재시도 조건 정리 * fix: 알림 목록 이동 차단 제거 * refactor: 알림 공용 훅 위치 정리 * fix: 알림 재연결 캐시 동기화 추가 * fix: 알림 목록 토스트 큐 누적 방지 * fix: 알림 읽음 카운트 감소 조건 보강 * [refactor] 도메인별 TanStack Query 훅 정리 (#219) * chore: pwa용 이미지 제거 * refactor: auth 도메인 쿼리와 뮤테이션 정리 * refactor: council과 schedule 조회 훅 정리 * refactor: chat과 notification 캐시 처리 정리 * refactor: club 조회와 지원 플로우 정리 * refactor: manager 도메인 캐시 처리 정리 * refactor: studyTime 도메인 쿼리와 뮤테이션 정리 * refactor: 광고와 업로드 도메인 훅 정리 * [refactor] mutaton query 및 hook 추가 수정 (#221) * refactor: auth와 user myInfo 훅 정리 * refactor: club과 schedule 조회 훅 정리 * refactor: chat과 notification 훅 구조 정리 * refactor: club 지원 뮤테이션 훅 정리 * refactor: manager 뮤테이션 훅 구조 정리 * refactor: mutation 훅 cache 정리 * refactor: 컨벤션 통일 * refactor: isRead 조건 정리 * fix: 채팅 스크롤 문제 수정 * refactor: 불필요한 코드 제거 * [fix] 모바일 환경 입력창과 키보드 간의 간격이 큰 문제 수정 (#223) * chore: 가공용 safeArea 변수 선언 * refactor: 고정 패딩 값 수정 및 safeArea 적용 변경 * feat: 키보드 활성화 감지 및 safeArea 적용 여부 기능 추가 * refactor: 매직넘버 상수화 및 가로모드 처리 * [fix] 키보드 활성화 시 화면 흔들림 문제 수정 (#225) * refactor: 채팅 viewport 훅 네이밍 정리 * refactor: viewport 높이 잠금 훅 적용 시점 조정 * [fix] 키보드 활성화 시 채팅 화면 전체가 흔들리는 문제 수정 (#227) * refactor: 채팅 viewport 훅 네이밍 정리 * refactor: viewport 높이 잠금 훅 적용 시점 조정 * fix: 채팅 화면 스크롤 잠금으로 키보드 흔들림 완화 * fix: 입력 포커스 중 viewport offset 고정 (#229) * fix: 문서 루트 스크롤 잠금으로 빈 공간 잔류 방지 (#232) * [fix] 키보드 활성화 시 채팅 화면 상단 고정이 깨지고 빈 공간이 남는 문제 수정 (#234) * fix: 채팅 화면 상단 고정 깨짐과 빈 공간 잔류 수정 * refactor: 라우트 조건 수정 * fix: 문서 스크롤 위치 감지 보강 * refactor: 입력 요소 판별 유틸과 스크롤 주석 정리 * [fix] 키보드 활성화 시 채팅 화면에서 문서 스크롤이 발생하는 문제 수정 (#236) * fix: 채팅 문서 스크롤 제스처 차단 * fix: 입력 요소 터치 동작 예외 처리 * [fix] 키보드 활성화 시 채팅방이 마지막 메시지 위치를 유지하지 못하는 문제 수정 (#238) * fix: 키보드 활성화 시 채팅 하단 정렬 유지 * refactor: 채팅 리사이즈 관찰 안정화 * fix: mypage 연계 약관 페이지 뒤로가기 수정 (#240) * refactor: alias import 경로 정리 * fix: query 설정과 suspense 분기 정리 * refactor: 관리자 화면 스타일 유틸 정리 * fix: 이미지 전처리 예외 처리 보강 * fix: 헤더와 회비 화면 동작 정리 * fix: 공통 유틸 안정성 개선 * fix: 이미지 전처리 실패 처리를 보정 * fix: 모집 공고 저장 후 설정 반영 순서 조정 * fix: 부원 직책 변경 실패 처리를 보강 * fix: 약관 링크 접근성을 개선 * fix: 공통 쿼리와 유틸 안정성을 보완 * [feat] 동적 버전 정보 표시 구현 (#211) * feat: 동적 버전 정보 표시 구현 * refactor: 버전 정보 미 존재시 v 표시 제거 * [feat] 메인화면 동아리 카드 디자인 수정 반영 (#242) * feat: 메인화면 동아리 카드 디자인 수정 * chore: 하단바 아이콘 수정 * refactor: 코드래빗 리뷰 반영 * refactor: and 연산자로 변경 * apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 (#244) * refactor: apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 * refactor: body 직렬화 가드를 plain object/array로 한정 * fix: body 읽기 중 AbortError가 ParseError로 오분류되는 문제 수정 * [refactor] 에러 처리 유틸 및 utils 구조 정리 (#246) * refactor: 에러 처리 유틸 및 공통 토스트 흐름 정리 * refactor: utils 폴더 구조를 역할별로 정리 * refactor: 코드래빗 리뷰 반영 * refactor: 코드래빗 리뷰 반영 * Update src/pages/Home/components/HomeClubSection.tsx * fix: 인증 세션 복구 흐름 정리 * fix: 홈 동아리 카드 레이아웃 정리 * [feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리 (#249) * refactor: 하단 오버레이 처리 공통화 * feat: 총동아리 페이지와 헤더 리디자인 반영 * fix: 채팅 하단 여백과 외부 링크 속성 수정 * refactor: 총동아리 헤더 설정 정리 * fix: 총동아리 상세 접근성과 스타일 보완 * [feat] 마이페이지 관리자 카드 분리 및 채팅 미확인 배지 반영 (#251) * feat: 하단 채팅 배지 표시 및 조회 조건 보완 * refactor: 관리자 정보 카드 컴포넌트 분리 * feat: 채팅 페이지 리디자인 (#252) * feat: 채팅 페이지 리디자인 * fix:tailwind 문법 수정 * fix: 코드 수정 * fix: 폰트 색상 및 위치 수정 * fix: 채팅방 사람수 정렬 * fix: 오타 수정 * chore: conflict 해결 중 누락된 부분 수정 * [refactor] 광고 렌더링 조건 수정 (#254) * refactor: 광고 렌더링 조건 수정 * docs: 문서명 변경 --------- Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>
* [배포] 이미지 전처리, 광고 기능, 하단바 리디자인, 인앱 알림 페이지 및 토스트 프로덕션 배포 (#230) * 205 feat 이미지 전처리 기능 구현 (#206) * feat: 전처리 로직 및 WebWorker 구현 * feat: 전처리 적용 및 preview 동시성 제어 로직 추가 * refactor: 리뷰 반영 * [hotfix] 하단바 너비 수정 (#208) * hotfix: 하단바 너비 수정 * chore: 불필요한 값 제거 * refactor: 고정 gap 제거 * Reapply "[feat] 광고 배너 추가 (#200)" This reverts commit c51ec85. * [feat] 하단바 리디자인 (#213) * chore: asset 추가 * feat: 하단바 리디자인 반영 및 레이아웃 수정 * [refactor] 광고 카드 레이아웃 밀림 수정 (#215) * refactor: 광고 개수 측정 시기 변경 및 기본값 제거 * feat: 스켈레톤 UI 추가 * feat: 인앱 알림 페이지 및 토스트 구현 (#217) * feat: 알림 API 및 스트림 기반 추가 * feat: 인앱 알림 레이어 추가 * feat: 알림 페이지 및 헤더 진입 구현 * fix: 알림 스트림 401 재시도 조건 정리 * fix: 알림 목록 이동 차단 제거 * refactor: 알림 공용 훅 위치 정리 * fix: 알림 재연결 캐시 동기화 추가 * fix: 알림 목록 토스트 큐 누적 방지 * fix: 알림 읽음 카운트 감소 조건 보강 * [refactor] 도메인별 TanStack Query 훅 정리 (#219) * chore: pwa용 이미지 제거 * refactor: auth 도메인 쿼리와 뮤테이션 정리 * refactor: council과 schedule 조회 훅 정리 * refactor: chat과 notification 캐시 처리 정리 * refactor: club 조회와 지원 플로우 정리 * refactor: manager 도메인 캐시 처리 정리 * refactor: studyTime 도메인 쿼리와 뮤테이션 정리 * refactor: 광고와 업로드 도메인 훅 정리 * [refactor] mutaton query 및 hook 추가 수정 (#221) * refactor: auth와 user myInfo 훅 정리 * refactor: club과 schedule 조회 훅 정리 * refactor: chat과 notification 훅 구조 정리 * refactor: club 지원 뮤테이션 훅 정리 * refactor: manager 뮤테이션 훅 구조 정리 * refactor: mutation 훅 cache 정리 * refactor: 컨벤션 통일 * refactor: isRead 조건 정리 * fix: 채팅 스크롤 문제 수정 * refactor: 불필요한 코드 제거 * [fix] 모바일 환경 입력창과 키보드 간의 간격이 큰 문제 수정 (#223) * chore: 가공용 safeArea 변수 선언 * refactor: 고정 패딩 값 수정 및 safeArea 적용 변경 * feat: 키보드 활성화 감지 및 safeArea 적용 여부 기능 추가 * refactor: 매직넘버 상수화 및 가로모드 처리 * [fix] 키보드 활성화 시 화면 흔들림 문제 수정 (#225) * refactor: 채팅 viewport 훅 네이밍 정리 * refactor: viewport 높이 잠금 훅 적용 시점 조정 * [fix] 키보드 활성화 시 채팅 화면 전체가 흔들리는 문제 수정 (#227) * refactor: 채팅 viewport 훅 네이밍 정리 * refactor: viewport 높이 잠금 훅 적용 시점 조정 * fix: 채팅 화면 스크롤 잠금으로 키보드 흔들림 완화 * fix: 입력 포커스 중 viewport offset 고정 (#229) * fix: 문서 루트 스크롤 잠금으로 빈 공간 잔류 방지 (#232) * [fix] 키보드 활성화 시 채팅 화면 상단 고정이 깨지고 빈 공간이 남는 문제 수정 (#234) * fix: 채팅 화면 상단 고정 깨짐과 빈 공간 잔류 수정 * refactor: 라우트 조건 수정 * fix: 문서 스크롤 위치 감지 보강 * refactor: 입력 요소 판별 유틸과 스크롤 주석 정리 * [fix] 키보드 활성화 시 채팅 화면에서 문서 스크롤이 발생하는 문제 수정 (#236) * fix: 채팅 문서 스크롤 제스처 차단 * fix: 입력 요소 터치 동작 예외 처리 * [fix] 키보드 활성화 시 채팅방이 마지막 메시지 위치를 유지하지 못하는 문제 수정 (#238) * fix: 키보드 활성화 시 채팅 하단 정렬 유지 * refactor: 채팅 리사이즈 관찰 안정화 * fix: mypage 연계 약관 페이지 뒤로가기 수정 (#240) * refactor: alias import 경로 정리 * fix: query 설정과 suspense 분기 정리 * refactor: 관리자 화면 스타일 유틸 정리 * fix: 이미지 전처리 예외 처리 보강 * fix: 헤더와 회비 화면 동작 정리 * fix: 공통 유틸 안정성 개선 * fix: 이미지 전처리 실패 처리를 보정 * fix: 모집 공고 저장 후 설정 반영 순서 조정 * fix: 부원 직책 변경 실패 처리를 보강 * fix: 약관 링크 접근성을 개선 * fix: 공통 쿼리와 유틸 안정성을 보완 * [feat] 동적 버전 정보 표시 구현 (#211) * feat: 동적 버전 정보 표시 구현 * refactor: 버전 정보 미 존재시 v 표시 제거 * [feat] 메인화면 동아리 카드 디자인 수정 반영 (#242) * feat: 메인화면 동아리 카드 디자인 수정 * chore: 하단바 아이콘 수정 * refactor: 코드래빗 리뷰 반영 * refactor: and 연산자로 변경 * apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 (#244) * refactor: apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 * refactor: body 직렬화 가드를 plain object/array로 한정 * fix: body 읽기 중 AbortError가 ParseError로 오분류되는 문제 수정 * [refactor] 에러 처리 유틸 및 utils 구조 정리 (#246) * refactor: 에러 처리 유틸 및 공통 토스트 흐름 정리 * refactor: utils 폴더 구조를 역할별로 정리 * refactor: 코드래빗 리뷰 반영 * refactor: 코드래빗 리뷰 반영 * Update src/pages/Home/components/HomeClubSection.tsx * fix: 인증 세션 복구 흐름 정리 * fix: 홈 동아리 카드 레이아웃 정리 * [feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리 (#249) * refactor: 하단 오버레이 처리 공통화 * feat: 총동아리 페이지와 헤더 리디자인 반영 * fix: 채팅 하단 여백과 외부 링크 속성 수정 * refactor: 총동아리 헤더 설정 정리 * fix: 총동아리 상세 접근성과 스타일 보완 * [feat] 마이페이지 관리자 카드 분리 및 채팅 미확인 배지 반영 (#251) * feat: 하단 채팅 배지 표시 및 조회 조건 보완 * refactor: 관리자 정보 카드 컴포넌트 분리 * feat: 채팅 페이지 리디자인 (#252) * feat: 채팅 페이지 리디자인 * fix:tailwind 문법 수정 * fix: 코드 수정 * fix: 폰트 색상 및 위치 수정 * fix: 채팅방 사람수 정렬 * fix: 오타 수정 * chore: conflict 해결 중 누락된 부분 수정 * [refactor] 광고 렌더링 조건 수정 (#254) * refactor: 광고 렌더링 조건 수정 * docs: 문서명 변경 --------- Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com> * refactor: 가이드 페이지 이미지 변경 및 구조 개선 (#260) * hotfix: 가이드 이미지 경로 변경 --------- Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>
✨ 요약
😎 해결한 이슈
Summary by CodeRabbit
릴리스 노트
버그 수정
신규 기능
리팩토링