[feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리#249
Conversation
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 2 minutes and 22 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
Walkthroughcouncil 관련 라우트 서브트리(index → CouncilDetail, notice/:noticeId → CouncilNotice)를 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.
Pull request overview
총동아리( /council ) 소개/공지 UI를 피그마 기준으로 리디자인하고, 하단 bottom nav overlay(안전영역 포함) 대응을 공용화하며, 공지 상세용 헤더 타입을 추가한 PR입니다.
Changes:
- 총동아리 소개/공지 탭 및 공지 리스트/상세 화면 스타일 전면 리디자인
/council경로를 bottom nav 레이아웃으로 이동하고, 홈 탭 활성 경로를/council*까지 확장- bottom overlay 계산을
bottomOverlay+BottomOverlaySpacer로 공용화하고 헤더 구성(BackTitleHeader / PlainSubpageHeader) 정리
Reviewed changes
Copilot reviewed 21 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/pages/Notifications/index.tsx | 알림 리스트 하단 여백을 BottomOverlaySpacer로 공용 처리 |
| src/pages/Manager/components/ApplicationDetailContent.tsx | 스크롤 영역 하단 padding을 useBottomOverlayOffset 기반으로 변경 |
| src/pages/Council/CouncilNotice/index.tsx | 공지 상세 레이아웃 리디자인 + 하단 overlay spacer 추가 |
| src/pages/Council/CouncilDetail/index.tsx | 총동 페이지 탭 UI/배경 구성 리디자인 + 하단 spacer 적용 |
| src/pages/Council/CouncilDetail/components/CouncilNotice.tsx | 공지 리스트 카드 스타일/빈 상태 리디자인 및 sentinel 수정 |
| src/pages/Council/CouncilDetail/components/CouncilIntro.tsx | 소개/연락처 카드 리디자인 및 아이콘/링크 구조 변경 |
| src/pages/Chat/index.tsx | 하단 여백 처리 로직을 BottomOverlaySpacer로 치환 |
| src/components/notification/InAppNotificationToast.tsx | 토스트 bottom offset 계산을 useBottomOverlayOffset로 공용화 |
| src/components/layout/hooks/useLayoutBottomOverlayInset.ts | inset 계산 import를 bottomOverlay로 이동 |
| src/components/layout/Header/types.ts | 헤더 타입에 subpage 추가 |
| src/components/layout/Header/routeTitles.ts | /council/notice/:id 타이틀 매핑 추가 |
| src/components/layout/Header/index.tsx | subpage 타입 렌더러(PlainSubpageHeader) 추가 |
| src/components/layout/Header/headerConfig.ts | /council 헤더 타입 조정 + 공지 상세 subpage 타입 추가 |
| src/components/layout/Header/components/SubpageHeader.tsx | 공통 BackTitleHeader로 리팩터링 |
| src/components/layout/Header/components/PlainSubpageHeader.tsx | 공지 상세용 간소 헤더 신규 추가 |
| src/components/layout/Header/components/CouncilHeader.tsx | 기존 CouncilHeader 제거 |
| src/components/layout/Header/components/BackTitleHeader.tsx | 뒤로가기+타이틀 공통 헤더 컴포넌트 신규 추가 |
| src/components/layout/BottomOverlaySpacer.tsx | bottom overlay 대응 spacer 컴포넌트 신규 추가 |
| src/components/layout/bottomOverlay.ts | bottom overlay inset/offset 유틸 및 hook 공용화 |
| src/components/layout/BottomNav/index.tsx | 홈 탭 활성 경로를 /council*까지 확장 |
| src/assets/svg/location-pin.svg | 아이콘 stroke를 currentColor 기반으로 변경 |
| src/assets/svg/instagram.svg | 아이콘 fill을 currentColor 기반으로 변경 |
| src/assets/svg/clock.svg | 아이콘 stroke를 currentColor 기반으로 변경 |
| src/App.tsx | /council 라우트를 bottom nav 레이아웃 그룹으로 이동 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (9)
src/pages/Council/CouncilDetail/components/CouncilNotice.tsx (3)
34-34: 시맨틱 타이포그래피 토큰 사용 고려
text-[14px],text-[12px]대신text-body2,text-cap1등 시맨틱 토큰 사용을 검토해주세요.Also applies to: 39-39
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 34, The component CouncilNotice.tsx uses hardcoded utility font sizes (e.g., class names text-[14px] and text-[12px]) which should be replaced with semantic typography tokens; update the className strings in the CouncilNotice React component to use the design-system tokens (for example text-body2, text-cap1 or whatever semantic tokens are available) instead of text-[14px]/text-[12px], ensuring you adjust any leading/weight classes only if the semantic token does not already include them so visual parity is preserved.
30-30: 동일하게cn()적용 필요Line 18과 마찬가지로
cn()사용을 권장합니다.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 30, The div is using className={noticeListCardClassName} but should consistently use the utility wrapper cn(); update the JSX in CouncilNotice (the element that currently uses noticeListCardClassName) to pass the same value through cn() (e.g., className={cn(noticeListCardClassName)}) so it matches Line 18’s pattern and supports conditional/combined classes uniformly.
18-18:cn()유틸리티 사용 권장동적 className 조합 시
cn()사용이 코딩 가이드라인입니다.♻️ 제안
- <div className={`${noticeListCardClassName} px-5 py-16`}> + <div className={cn(noticeListCardClassName, 'px-5 py-16')}>
cnimport 추가 필요:import { cn } from '@/utils/ts/cn';🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 18, The JSX currently builds a dynamic className with a template literal on the div using noticeListCardClassName; replace that template literal with the cn() helper and add the cn import (import { cn } from '@/utils/ts/cn') at the top of the CouncilNotice component file so the div uses cn(noticeListCardClassName, 'px-5', 'py-16') instead of the string template.src/pages/Council/CouncilDetail/components/CouncilIntro.tsx (1)
36-36:cn()사용 권장className 조합 시
cn()유틸리티 사용이 권장됩니다.♻️ 제안
- className={`${contactItemClassName} underline`} + className={cn(contactItemClassName, 'underline')}
cnimport 추가:import { cn } from '@/utils/ts/cn';🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 36, Replace the string template className={`${contactItemClassName} underline`} with the cn utility: import cn from '@/utils/ts/cn' (add the import) and use cn(contactItemClassName, 'underline') in the component (referencing the existing contactItemClassName variable) so class composition uses the cn helper.src/components/layout/BottomNav/index.tsx (1)
25-29: 경로 매칭 로직 단순화 가능현재 코드에서
pathname === '/council'은pathname.startsWith('/council')에 포함되므로 중복된 조건입니다. App.tsx의 라우트 구조(/council,/council/notice/:noticeId)를 확인했을 때, 다음과 같이 단순화해도 안전합니다.♻️ 제안
matchesPath: (pathname) => pathname === '/home' || pathname === '/notifications' || - pathname === '/council' || - pathname.startsWith('/council/'), + pathname.startsWith('/council'),🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/layout/BottomNav/index.tsx` around lines 25 - 29, The matchesPath function has a redundant condition: `pathname === '/council'` is covered by `pathname.startsWith('/council/')` or `pathname.startsWith('/council')`; update matchesPath to remove the duplicate check and keep the simplified logic (e.g., use pathname.startsWith('/council') for council routes) in the matchesPath arrow function so it still correctly matches '/council' and subroutes while eliminating the redundant equality check.src/components/layout/Header/components/PlainSubpageHeader.tsx (1)
1-1:@/*경로 별칭으로 import 통일해주세요.신규 파일이라 지금 맞춰두면 이후 정리 비용이 줄어듭니다.
변경 제안
-import BackTitleHeader from './BackTitleHeader'; +import BackTitleHeader from '@/components/layout/Header/components/BackTitleHeader';As per coding guidelines,
**/*.{ts,tsx}: Use path alias@/*for imports instead of relative paths.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/layout/Header/components/PlainSubpageHeader.tsx` at line 1, The file imports BackTitleHeader using a relative path; change that import to use the project path-alias (`@/*`) instead of a relative path so imports are consistent; locate the import statement for BackTitleHeader in PlainSubpageHeader.tsx and replace it with the equivalent alias-based import (using the project's `@/` prefix) to match the coding guidelines.src/components/layout/Header/components/SubpageHeader.tsx (1)
3-3: 상대 경로 대신 alias import로 맞춰주세요.이 파일은 내부 import를
@/*로 통일하고 있는데 여기만 sibling 상대 경로로 돌아가 있습니다.@/components/layout/Header/components/BackTitleHeader로 맞추는 편이 일관됩니다.As per coding guidelines,
**/*.{ts,tsx}: Use path alias@/*for imports instead of relative paths.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/layout/Header/components/SubpageHeader.tsx` at line 3, SubpageHeader.tsx currently imports BackTitleHeader using a sibling relative path; change that import to the project path alias so it matches the rest of the codebase: replace the relative import of BackTitleHeader with an alias import like "@/components/layout/Header/components/BackTitleHeader" ensuring the symbol BackTitleHeader is referenced exactly the same and that any TypeScript/ESLint import rules still pass after the change.src/components/layout/Header/headerConfig.ts (1)
12-15:council헤더 타입은 이제 도달하지 않습니다.
/council이info로 흡수되면서HEADER_CONFIGS에서council을 반환할 경로가 없어졌는데,src/components/layout/Header/index.tsx:18-32와src/components/layout/Header/types.ts:3-16에는 아직council렌더러/유니온이 남아 있습니다. 같이 정리해 두는 편이 다음 변경 때 덜 헷갈립니다.Also applies to: 26-26
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/layout/Header/headerConfig.ts` around lines 12 - 15, The 'council' header case is now unreachable but remnants remain; remove all 'council' references: delete the council entry from HEADER_CONFIGS (the object with type: 'subpage' and the /^\/council\/notice\/\d+$/ match), remove the 'council' branch/renderer in the Header component (src/components/layout/Header/index.tsx) and remove 'council' from the HeaderType union in src/components/layout/Header/types.ts so the configs, renderer mapping and types stay consistent.src/pages/Council/CouncilDetail/index.tsx (1)
28-31: 배경 스타일 상수는 공통 토큰으로 맞춰주세요.
/council는info헤더를 타는데 여기만--subpage-header-height와#f4f6f9를 직접 쓰면 헤더 높이/배경 토큰 변경 때 그라데이션 시작점이 쉽게 어긋납니다. 실제 레이아웃 높이 값과theme.css토큰을 참조하는 쪽이 안전합니다.As per coding guidelines,
**/*.{ts,tsx,css}: Use Tailwind CSS v4 with design tokens fromsrc/styles/theme.css.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/index.tsx` around lines 28 - 31, The backgroundStyle constant uses a hardcoded color (`#f4f6f9`) instead of the project's theme tokens; update backgroundStyle (which references councilInfo.personalColor and uses CSSProperties) to pull the gradient stop colors from the design tokens in src/styles/theme.css (e.g., replace the hardcoded "#f4f6f9" with the appropriate CSS variable like var(--<background-token>) and keep the existing var(--subpage-header-height) usage for top), ensuring the gradient aligns with the shared theme tokens and retains the satisfies CSSProperties clause.
🤖 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/Council/CouncilDetail/index.tsx`:
- Around line 47-72: Replace the current toggle-button semantics with proper tab
semantics: add role="tablist" to the container rendering tabs (the div that maps
over tabs), change each button rendered in the tabs.map to role="tab" with
aria-selected={currentTab === tab.key} (remove aria-pressed), give each tab a
stable id like `tab-${tab.key}` and keep using handleTabClick(tab.key); then
ensure each panel wrapped by Activity (the CouncilIntro and CouncilNotice
renders) has role="tabpanel", an id like `panel-${tab.key}` and aria-labelledby
pointing to its corresponding tab id so tab and panel are linked; use tab.key to
generate unique ids consistently and keep currentTab logic unchanged.
---
Nitpick comments:
In `@src/components/layout/BottomNav/index.tsx`:
- Around line 25-29: The matchesPath function has a redundant condition:
`pathname === '/council'` is covered by `pathname.startsWith('/council/')` or
`pathname.startsWith('/council')`; update matchesPath to remove the duplicate
check and keep the simplified logic (e.g., use pathname.startsWith('/council')
for council routes) in the matchesPath arrow function so it still correctly
matches '/council' and subroutes while eliminating the redundant equality check.
In `@src/components/layout/Header/components/PlainSubpageHeader.tsx`:
- Line 1: The file imports BackTitleHeader using a relative path; change that
import to use the project path-alias (`@/*`) instead of a relative path so
imports are consistent; locate the import statement for BackTitleHeader in
PlainSubpageHeader.tsx and replace it with the equivalent alias-based import
(using the project's `@/` prefix) to match the coding guidelines.
In `@src/components/layout/Header/components/SubpageHeader.tsx`:
- Line 3: SubpageHeader.tsx currently imports BackTitleHeader using a sibling
relative path; change that import to the project path alias so it matches the
rest of the codebase: replace the relative import of BackTitleHeader with an
alias import like "@/components/layout/Header/components/BackTitleHeader"
ensuring the symbol BackTitleHeader is referenced exactly the same and that any
TypeScript/ESLint import rules still pass after the change.
In `@src/components/layout/Header/headerConfig.ts`:
- Around line 12-15: The 'council' header case is now unreachable but remnants
remain; remove all 'council' references: delete the council entry from
HEADER_CONFIGS (the object with type: 'subpage' and the
/^\/council\/notice\/\d+$/ match), remove the 'council' branch/renderer in the
Header component (src/components/layout/Header/index.tsx) and remove 'council'
from the HeaderType union in src/components/layout/Header/types.ts so the
configs, renderer mapping and types stay consistent.
In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx`:
- Line 36: Replace the string template className={`${contactItemClassName}
underline`} with the cn utility: import cn from '@/utils/ts/cn' (add the import)
and use cn(contactItemClassName, 'underline') in the component (referencing the
existing contactItemClassName variable) so class composition uses the cn helper.
In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx`:
- Line 34: The component CouncilNotice.tsx uses hardcoded utility font sizes
(e.g., class names text-[14px] and text-[12px]) which should be replaced with
semantic typography tokens; update the className strings in the CouncilNotice
React component to use the design-system tokens (for example text-body2,
text-cap1 or whatever semantic tokens are available) instead of
text-[14px]/text-[12px], ensuring you adjust any leading/weight classes only if
the semantic token does not already include them so visual parity is preserved.
- Line 30: The div is using className={noticeListCardClassName} but should
consistently use the utility wrapper cn(); update the JSX in CouncilNotice (the
element that currently uses noticeListCardClassName) to pass the same value
through cn() (e.g., className={cn(noticeListCardClassName)}) so it matches Line
18’s pattern and supports conditional/combined classes uniformly.
- Line 18: The JSX currently builds a dynamic className with a template literal
on the div using noticeListCardClassName; replace that template literal with the
cn() helper and add the cn import (import { cn } from '@/utils/ts/cn') at the
top of the CouncilNotice component file so the div uses
cn(noticeListCardClassName, 'px-5', 'py-16') instead of the string template.
In `@src/pages/Council/CouncilDetail/index.tsx`:
- Around line 28-31: The backgroundStyle constant uses a hardcoded color
(`#f4f6f9`) instead of the project's theme tokens; update backgroundStyle (which
references councilInfo.personalColor and uses CSSProperties) to pull the
gradient stop colors from the design tokens in src/styles/theme.css (e.g.,
replace the hardcoded "#f4f6f9" with the appropriate CSS variable like
var(--<background-token>) and keep the existing var(--subpage-header-height)
usage for top), ensuring the gradient aligns with the shared theme tokens and
retains the satisfies CSSProperties clause.
🪄 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: f884f407-455d-4235-a8bd-6c14066111e8
⛔ Files ignored due to path filters (3)
src/assets/svg/clock.svgis excluded by!**/*.svg,!src/assets/**and included by**src/assets/svg/instagram.svgis excluded by!**/*.svg,!src/assets/**and included by**src/assets/svg/location-pin.svgis excluded by!**/*.svg,!src/assets/**and included by**
📒 Files selected for processing (21)
src/App.tsxsrc/components/layout/BottomNav/index.tsxsrc/components/layout/BottomOverlaySpacer.tsxsrc/components/layout/Header/components/BackTitleHeader.tsxsrc/components/layout/Header/components/CouncilHeader.tsxsrc/components/layout/Header/components/PlainSubpageHeader.tsxsrc/components/layout/Header/components/SubpageHeader.tsxsrc/components/layout/Header/headerConfig.tssrc/components/layout/Header/index.tsxsrc/components/layout/Header/routeTitles.tssrc/components/layout/Header/types.tssrc/components/layout/bottomOverlay.tssrc/components/layout/hooks/useLayoutBottomOverlayInset.tssrc/components/notification/InAppNotificationToast.tsxsrc/pages/Chat/index.tsxsrc/pages/Council/CouncilDetail/components/CouncilIntro.tsxsrc/pages/Council/CouncilDetail/components/CouncilNotice.tsxsrc/pages/Council/CouncilDetail/index.tsxsrc/pages/Council/CouncilNotice/index.tsxsrc/pages/Manager/components/ApplicationDetailContent.tsxsrc/pages/Notifications/index.tsx
💤 Files with no reviewable changes (1)
- src/components/layout/Header/components/CouncilHeader.tsx
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/pages/Council/CouncilDetail/components/CouncilIntro.tsx (2)
1-1:className결합은cn()으로 통일해주세요.Line 36은 템플릿 문자열 대신
cn()사용이 가이드와 맞습니다.diff 제안
import type { ComponentType, ReactNode, SVGProps } from 'react'; import type { CouncilResponse } from '@/apis/council/entity'; import ClockIcon from '@/assets/svg/clock.svg'; import InstagramIcon from '@/assets/svg/instagram.svg'; import LocationPinIcon from '@/assets/svg/location-pin.svg'; import Card from '@/components/common/Card'; +import { cn } from '@/utils/ts/cn'; @@ - className={`${contactItemClassName} underline`} + className={cn(contactItemClassName, 'underline')}As per coding guidelines, "Use
cn()utility fromsrc/utils/ts/cn.tsto merge Tailwind CSS classes".Also applies to: 36-36
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 1, 현재 CouncilIntro 컴포넌트에서 Tailwind 클래스 결합을 템플릿 문자열로 하고 있는데 가이드에 따라 src/utils/ts/cn.ts의 cn() 유틸로 통일해야 합니다; CouncilIntro 컴포넌트 내 클래스 결합을 담당하는 부분(현재 template string 사용되는 className 표현)을 찾아 cn(...)로 교체하고, 파일 상단에 cn를 임포트하도록 업데이트하세요(기존 className 템플릿 문자열을 제거하고 cn 호출로 대체).
14-14: 타이포그래피는 semantic 토큰 클래스를 우선 사용해주세요.Line 14의
text-[13px], Line 49의text-xs, Line 55의 커스텀 조합은text-body*/text-sub*등 토큰 기반으로 맞추는 게 좋습니다.As per coding guidelines, "Use typography tokens (
text-h1throughtext-h5,text-sub1throughtext-sub4,text-body1throughtext-body3,text-cap1throughtext-cap2) fromsrc/styles/theme.css".Also applies to: 49-49, 55-55
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 14, Replace hardcoded typography utility classes with the semantic typography tokens defined in theme.css: update the const contactItemClassName (currently using text-[13px]) to use the appropriate token (e.g., text-body1/text-sub2) and replace the other occurrences of text-xs and the custom combination at the other noted locations with the corresponding text-body*/text-sub* token classes; ensure you pick tokens that match the intended size/weight/line-height so all references (contactItemClassName and the JSX elements using text-xs and the custom combo) follow the "text-h1..h5, text-sub1..sub4, text-body1..body3, text-cap1..cap2" convention.
🤖 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/Council/CouncilDetail/components/CouncilIntro.tsx`:
- Line 1: 현재 CouncilIntro 컴포넌트에서 Tailwind 클래스 결합을 템플릿 문자열로 하고 있는데 가이드에 따라
src/utils/ts/cn.ts의 cn() 유틸로 통일해야 합니다; CouncilIntro 컴포넌트 내 클래스 결합을 담당하는 부분(현재
template string 사용되는 className 표현)을 찾아 cn(...)로 교체하고, 파일 상단에 cn를 임포트하도록
업데이트하세요(기존 className 템플릿 문자열을 제거하고 cn 호출로 대체).
- Line 14: Replace hardcoded typography utility classes with the semantic
typography tokens defined in theme.css: update the const contactItemClassName
(currently using text-[13px]) to use the appropriate token (e.g.,
text-body1/text-sub2) and replace the other occurrences of text-xs and the
custom combination at the other noted locations with the corresponding
text-body*/text-sub* token classes; ensure you pick tokens that match the
intended size/weight/line-height so all references (contactItemClassName and the
JSX elements using text-xs and the custom combo) follow the "text-h1..h5,
text-sub1..sub4, text-body1..body3, text-cap1..cap2" convention.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: df95f1a8-2e24-43fa-9662-7e0d2a8d472e
📒 Files selected for processing (2)
src/pages/Chat/index.tsxsrc/pages/Council/CouncilDetail/components/CouncilIntro.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
- src/pages/Chat/index.tsx
* 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>
✨ 요약
변경 사항
/council경로를 bottom nav 레이아웃으로 이동하고 홈 탭 활성 경로 확장BackTitleHeader,PlainSubpageHeader를 추가해 공지 상세 헤더 구성 정리currentColor기반으로 통일bottomOverlay,BottomOverlaySpacer중심으로 하단 오버레이 계산/표현 공용화😎 해결한 이슈
Summary by CodeRabbit
릴리스 노트
New Features
Refactor
Bug Fixes