Conversation
* feat: 모집 공고에 시작, 종료 시간 추가 * feat: 지원자 목록 정렬 추가 및 시간 표시 * feat: 채팅, 모집 공고 링크 파싱 기능 추가 * feat: 인스타그램 파싱 추가 * fix: prettier error * refactor: 유틸 분리 및 타입 변경 * chore: 타입 변경 반영 * chore: 동일 스타일 통합 및 entity 확장 사용
This reverts commit 98570fc.
📝 WalkthroughWalkthrough클럽 모집 API 엔티티의 날짜 필드를 Possibly related PRs
🚥 Pre-merge checks | ✅ 1 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
src/pages/Manager/ManagedRecruitment/index.tsx (1)
47-47: 모집 기간 문자열 포맷 통일 권장Line 47에서 startAt/endAt 원문 출력은 ISO/초 단위가 그대로 노출될 수 있어요. 서버 포맷에 맞춘 formatter로 표시 포맷을 통일해 주세요.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/ManagedRecruitment/index.tsx` at line 47, The current return interpolates raw timestamps settings.recruitment.startAt and settings.recruitment.endAt which can expose ISO/seconds; update this to format both values with the project's standard date/time formatter (e.g., call the shared util like formatDateTime or Intl.DateTimeFormat) before interpolation so the string becomes something like `모집 기간: ${format(start)} ~ ${format(end)}`; reference and replace settings.recruitment.startAt and settings.recruitment.endAt in the return expression and import or call the agreed formatter function.src/pages/Manager/hooks/useManagedApplications.ts (1)
28-32: Query key에 정렬 파라미터 포함 고려
sortBy,sortDirection파라미터가 쿼리 결과에 영향을 주지만,queryKey에 포함되지 않았습니다. 현재는 고정값이라 문제없지만, 향후 동적 정렬 지원 시 캐시 불일치가 발생할 수 있습니다.♻️ 확장성을 위한 제안
+const sortParams = { sortBy: 'APPLIED_AT', sortDirection: 'ASC' } as const; + export const useGetManagedApplications = (clubId: number) => { const { data: managedClubApplicationList } = useSuspenseQuery({ - queryKey: applicationQueryKeys.managedClubApplications(clubId), + queryKey: [...applicationQueryKeys.managedClubApplications(clubId), sortParams], queryFn: async () => { try { - return await getManagedClubApplications(clubId, { sortBy: 'APPLIED_AT', sortDirection: 'ASC' }); + return await getManagedClubApplications(clubId, sortParams);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/Manager/hooks/useManagedApplications.ts` around lines 28 - 32, The query uses fixed sort params in the queryFn but does not include them in the queryKey, which will cause cache mismatches if sortBy/sortDirection become dynamic; update the useSuspenseQuery call so applicationQueryKeys.managedClubApplications includes the sort parameters (sortBy and sortDirection) used by getManagedClubApplications, and ensure any callers that change sorting pass those values into the queryKey and queryFn (refer to useSuspenseQuery, applicationQueryKeys.managedClubApplications, and getManagedClubApplications).
🤖 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/Club/ClubList/components/ClubCard.tsx`:
- Around line 9-11: getDDay currently strips the time part and only compares
dates, which can show D-Day even if the deadline time has passed; update getDDay
to parse the full date-time from dateString (including the 'T' time portion when
present) into a Date object and compare that Date to new Date() (considering
timezone/UTC as used elsewhere) to determine if it's past due, today (difference
in calendar day but future time), or upcoming, and return "마감" for past, "D-Day"
for same-day future/time-left, etc.; locate and modify the getDDay function to
use the full parsed Date rather than only year/month/day.
In `@src/pages/Manager/ManagedRecruitmentWrite/index.tsx`:
- Around line 98-102: The comparison treating endDateTime < new Date() can be
false-positive due to seconds/milliseconds differences (endDateTime from
combineDateTime has seconds=0); normalize the current time to minute precision
before comparing: create/inline a normalizedNow (zero out seconds and
milliseconds or round to the same minute granularity used by combineDateTime)
and use it in the isEndBeforeNow calculation (references: combineDateTime,
endDateTime, isEndBeforeNow, isAlwaysRecruiting) so selecting the same minute
won't be treated as "before now."
In `@src/pages/Manager/ManagedRecruitmentWrite/utils.ts`:
- Around line 16-25: parseDateTimeDot currently only accepts dot-separated dates
and will return null if the API ever returns a different separator; update the
parser to accept additional common ISO-like formats (e.g., accept '.' or '-'
between year/month/day and allow 'T' or whitespace between date and time) rather
than only splitting on '.' and whitespace. Modify parseDateTimeDot to normalize
the incoming value first (e.g., replace '-' with '.' or split by a date regex),
robustly extract year/month/day and time segments, validate the Date as before,
then call normalizeTime(timePart ?? '', fallbackTime); reference the function
parseDateTimeDot and the normalizeTime call to locate where to change parsing
logic.
In `@src/utils/ts/date.ts`:
- Around line 1-14: formatIsoDateToYYYYMMDDHHMM currently assumes a 'T'
separator and splits time into exactly hour:minute, which breaks on inputs like
"YYYY-MM-DD HH:MM:SS"; update the function to accept either 'T' or a space as
the date/time separator (e.g., split on /\s|T/), validate that datePart yields
year, month, day, and validate timePart before splitting (allow optional seconds
by splitting on ':' and taking the first two segments), and ensure padStart is
applied only when hour/minute exist; keep the function name
formatIsoDateToYYYYMMDDHHMM and return original value or '' on invalid input as
before.
---
Nitpick comments:
In `@src/pages/Manager/hooks/useManagedApplications.ts`:
- Around line 28-32: The query uses fixed sort params in the queryFn but does
not include them in the queryKey, which will cause cache mismatches if
sortBy/sortDirection become dynamic; update the useSuspenseQuery call so
applicationQueryKeys.managedClubApplications includes the sort parameters
(sortBy and sortDirection) used by getManagedClubApplications, and ensure any
callers that change sorting pass those values into the queryKey and queryFn
(refer to useSuspenseQuery, applicationQueryKeys.managedClubApplications, and
getManagedClubApplications).
In `@src/pages/Manager/ManagedRecruitment/index.tsx`:
- Line 47: The current return interpolates raw timestamps
settings.recruitment.startAt and settings.recruitment.endAt which can expose
ISO/seconds; update this to format both values with the project's standard
date/time formatter (e.g., call the shared util like formatDateTime or
Intl.DateTimeFormat) before interpolation so the string becomes something like
`모집 기간: ${format(start)} ~ ${format(end)}`; reference and replace
settings.recruitment.startAt and settings.recruitment.endAt in the return
expression and import or call the agreed formatter function.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
src/apis/club/entity.tssrc/apis/club/index.tssrc/components/common/LinkifiedText.tsxsrc/pages/Chat/ChatRoom.tsxsrc/pages/Club/ClubDetail/components/ClubRecruitment.tsxsrc/pages/Club/ClubList/components/ClubCard.tsxsrc/pages/Manager/ManagedApplicationDetail/index.tsxsrc/pages/Manager/ManagedApplicationList/index.tsxsrc/pages/Manager/ManagedRecruitment/index.tsxsrc/pages/Manager/ManagedRecruitmentWrite/index.tsxsrc/pages/Manager/ManagedRecruitmentWrite/utils.tssrc/pages/Manager/components/TimePicker/index.tsxsrc/pages/Manager/hooks/useManagedApplications.tssrc/utils/ts/date.ts
| function getDDay(dateString: string): string { | ||
| const [year, month, day] = dateString.split('.').map(Number); | ||
| const datePart = dateString.split('T')[0].split(' ')[0].replace(/-/g, '.'); | ||
| const [year, month, day] = datePart.split('.').map(Number); |
There was a problem hiding this comment.
시간 포함 마감 판단 누락 가능성
Line 9-11에서 시간 정보를 잘라내서, 마감 시간이 지난 당일에도 D-Day가 표시될 수 있어요. 시간 파트가 있으면 동일 날짜라도 시간 비교로 마감 처리하도록 보완을 권장합니다.
✅ 수정 제안
- const datePart = dateString.split('T')[0].split(' ')[0].replace(/-/g, '.');
- const [year, month, day] = datePart.split('.').map(Number);
- const targetDate = new Date(year, month - 1, day);
- const today = new Date();
+ const normalized = dateString.replace('T', ' ');
+ const [datePart, timePart] = normalized.split(' ');
+ const [year, month, day] = datePart.replace(/-/g, '.').split('.').map(Number);
+ const [hour = '0', minute = '0'] = (timePart ?? '').split(':');
+ const targetDate = new Date(year, month - 1, day);
+ const targetDateTime = new Date(year, month - 1, day, Number(hour), Number(minute));
+ const today = new Date();
...
- if (diffDays > 0) return `D-${diffDays}`;
- if (diffDays === 0) return 'D-Day';
- return '마감';
+ if (diffDays > 0) return `D-${diffDays}`;
+ if (diffDays === 0) return targetDateTime < new Date() ? '마감' : 'D-Day';
+ return '마감';🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/pages/Club/ClubList/components/ClubCard.tsx` around lines 9 - 11, getDDay
currently strips the time part and only compares dates, which can show D-Day
even if the deadline time has passed; update getDDay to parse the full date-time
from dateString (including the 'T' time portion when present) into a Date object
and compare that Date to new Date() (considering timezone/UTC as used elsewhere)
to determine if it's past due, today (difference in calendar day but future
time), or upcoming, and return "마감" for past, "D-Day" for same-day
future/time-left, etc.; locate and modify the getDDay function to use the full
parsed Date rather than only year/month/day.
| const startDateTime = combineDateTime(startDate, startTime); | ||
| const endDateTime = combineDateTime(endDate, endTime); | ||
| const isStartAfterEnd = startDateTime >= endDateTime; | ||
| const isEndBeforeNow = endDateTime < new Date(); | ||
| const hasDateError = !isAlwaysRecruiting && (isStartAfterEnd || isEndBeforeNow); |
There was a problem hiding this comment.
현재 시각 비교에서 초/밀리초 오차 가능
Line 101에서 endDateTime은 초가 0인데 new Date()는 초/밀리초가 있어, 같은 분을 선택해도 “현재 이전”으로 판단될 수 있어요. 현재 시각을 분 단위로 정규화해 주세요.
✅ 수정 제안
- const isEndBeforeNow = endDateTime < new Date();
+ const now = new Date();
+ now.setSeconds(0, 0);
+ const isEndBeforeNow = endDateTime < now;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const startDateTime = combineDateTime(startDate, startTime); | |
| const endDateTime = combineDateTime(endDate, endTime); | |
| const isStartAfterEnd = startDateTime >= endDateTime; | |
| const isEndBeforeNow = endDateTime < new Date(); | |
| const hasDateError = !isAlwaysRecruiting && (isStartAfterEnd || isEndBeforeNow); | |
| const startDateTime = combineDateTime(startDate, startTime); | |
| const endDateTime = combineDateTime(endDate, endTime); | |
| const isStartAfterEnd = startDateTime >= endDateTime; | |
| const now = new Date(); | |
| now.setSeconds(0, 0); | |
| const isEndBeforeNow = endDateTime < now; | |
| const hasDateError = !isAlwaysRecruiting && (isStartAfterEnd || isEndBeforeNow); |
🤖 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 98 - 102,
The comparison treating endDateTime < new Date() can be false-positive due to
seconds/milliseconds differences (endDateTime from combineDateTime has
seconds=0); normalize the current time to minute precision before comparing:
create/inline a normalizedNow (zero out seconds and milliseconds or round to the
same minute granularity used by combineDateTime) and use it in the
isEndBeforeNow calculation (references: combineDateTime, endDateTime,
isEndBeforeNow, isAlwaysRecruiting) so selecting the same minute won't be
treated as "before now."
| export function parseDateTimeDot(value: string, fallbackTime: string): { date: Date; time: string } | null { | ||
| const [datePart, timePart] = value.trim().split(/\s+/); | ||
| const [year, month, day] = datePart.split('.').map(Number); | ||
|
|
||
| if (![year, month, day].every(Number.isFinite)) return null; | ||
|
|
||
| const date = new Date(year, month - 1, day); | ||
| if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return null; | ||
|
|
||
| return { date, time: normalizeTime(timePart ?? '', fallbackTime) }; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# startAt/endAt 포맷 사용 위치 확인
rg -n --type=ts --type=tsx -A2 -B2 'startAt|endAt' | head -100Repository: BCSDLab/KONECT_FRONT_END
Length of output: 95
🏁 Script executed:
#!/bin/bash
# parseDateTimeDot 함수 사용 위치 확인
rg -n --type=ts --type=tsx -A3 -B3 'parseDateTimeDot' | head -100Repository: BCSDLab/KONECT_FRONT_END
Length of output: 95
🏁 Script executed:
#!/bin/bash
# 해당 파일 전체 내용 확인
wc -l src/pages/Manager/ManagedRecruitmentWrite/utils.tsRepository: BCSDLab/KONECT_FRONT_END
Length of output: 121
🏁 Script executed:
#!/bin/bash
# 파일 전체 내용 읽기
cat -n src/pages/Manager/ManagedRecruitmentWrite/utils.tsRepository: BCSDLab/KONECT_FRONT_END
Length of output: 2037
🏁 Script executed:
#!/bin/bash
# startAt/endAt 및 parseDateTimeDot 사용처 검색 (타입 필터 제거)
rg -n 'parseDateTimeDot|startAt|endAt' -A2 -B2 | head -150Repository: BCSDLab/KONECT_FRONT_END
Length of output: 5504
🏁 Script executed:
#!/bin/bash
# API 응답/데이터 모델 파일 찾기
fd -e ts -e js -e tsx -e jsx | grep -i 'api\|model\|type\|dto' | head -30Repository: BCSDLab/KONECT_FRONT_END
Length of output: 654
🏁 Script executed:
#!/bin/bash
# API 호출 코드 확인
rg -n 'getClubRecruitment|recruitment' src/apis/club/index.ts -A5 -B2Repository: BCSDLab/KONECT_FRONT_END
Length of output: 752
🏁 Script executed:
#!/bin/bash
# API entity 정의 확인
cat -n src/apis/club/entity.ts | head -200Repository: BCSDLab/KONECT_FRONT_END
Length of output: 5434
🏁 Script executed:
#!/bin/bash
# 백엔드 명세나 테스트에서 startAt/endAt 포맷 확인
find . -type f \( -name "*.test.*" -o -name "*.spec.*" -o -name "*.md" \) | xargs rg -l 'startAt|endAt' 2>/dev/null | head -10Repository: BCSDLab/KONECT_FRONT_END
Length of output: 50
🏁 Script executed:
#!/bin/bash
# 모의 데이터나 fixture에서 포맷 확인
rg -n 'startAt.*:.*"[0-9]' -A1 -B1 | head -50Repository: BCSDLab/KONECT_FRONT_END
Length of output: 50
🏁 Script executed:
#!/antml/bin/bash
# 실제 API 응답 예시나 스냅샷 확인
find . -type f \( -name "*.json" -o -name "*.snap" \) | xargs grep -l 'startAt\|endAt' 2>/dev/null | head -10Repository: BCSDLab/KONECT_FRONT_END
Length of output: 50
API 포맷 명시 필요 또는 유연한 파싱으로 개선
현재 parseDateTimeDot는 도트(.) 구분자만 지원하는데, API가 정확히 YYYY.MM.DD HH:MM 형식을 반환한다는 보장이 없습니다. 포맷 변경 시 null을 반환하고 기본값이 적용되는 문제가 발생할 수 있습니다. API 문서에서 포맷을 명확히 하거나, 하이픈(-)과 T 구분자도 지원하도록 개선하면 더 견고합니다.
개선 예시
- const [datePart, timePart] = value.trim().split(/\s+/);
- const [year, month, day] = datePart.split('.').map(Number);
+ const normalized = value.replace('T', ' ').trim();
+ const [datePart, timePart] = normalized.split(/\s+/);
+ const [year, month, day] = datePart.replace(/-/g, '.').split('.').map(Number);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/pages/Manager/ManagedRecruitmentWrite/utils.ts` around lines 16 - 25,
parseDateTimeDot currently only accepts dot-separated dates and will return null
if the API ever returns a different separator; update the parser to accept
additional common ISO-like formats (e.g., accept '.' or '-' between
year/month/day and allow 'T' or whitespace between date and time) rather than
only splitting on '.' and whitespace. Modify parseDateTimeDot to normalize the
incoming value first (e.g., replace '-' with '.' or split by a date regex),
robustly extract year/month/day and time segments, validate the Date as before,
then call normalizeTime(timePart ?? '', fallbackTime); reference the function
parseDateTimeDot and the normalizeTime call to locate where to change parsing
logic.
| export const formatIsoDateToYYYYMMDDHHMM = (value: string): string => { | ||
| if (!value) return ''; | ||
|
|
||
| const [datePart, timePart] = value.split('T'); | ||
| const [year, month, day] = datePart.split('-'); | ||
|
|
||
| if (!year || !month || !day) return value; | ||
|
|
||
| const date = `${year}.${month.padStart(2, '0')}.${day.padStart(2, '0')}`; | ||
| if (!timePart) return date; | ||
|
|
||
| const [hour, minute] = timePart.split(':'); | ||
| return `${date} ${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`; | ||
| }; |
There was a problem hiding this comment.
공백 구분 날짜-시간 입력 처리 필요
Line 4-13이 T 구분만 가정하면 YYYY-MM-DD HH:MM:SS 형태 입력에서 day 파싱이 깨질 수 있어요. 공백/T 모두 처리하고 timePart 유효성 체크를 추가하는 편이 안전합니다.
✅ 수정 제안
- const [datePart, timePart] = value.split('T');
+ const normalized = value.replace('T', ' ');
+ const [datePart, timePart] = normalized.split(/\s+/);
...
- const [hour, minute] = timePart.split(':');
- return `${date} ${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`;
+ const [hour, minute] = timePart.split(':');
+ if (!hour || !minute) return date;
+ return `${date} ${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/utils/ts/date.ts` around lines 1 - 14, formatIsoDateToYYYYMMDDHHMM
currently assumes a 'T' separator and splits time into exactly hour:minute,
which breaks on inputs like "YYYY-MM-DD HH:MM:SS"; update the function to accept
either 'T' or a space as the date/time separator (e.g., split on /\s|T/),
validate that datePart yields year, month, day, and validate timePart before
splitting (allow optional seconds by splitting on ':' and taking the first two
segments), and ensure padStart is applied only when hour/minute exist; keep the
function name formatIsoDateToYYYYMMDDHHMM and return original value or '' on
invalid input as before.
* develop → main 배포 (#125) * feat: 알림설정 구현 (#108) * chore: min-w 추가 * [chore] 코드래빗 설정 파일 추가 (#110) * chore: 코드래빗 설정 파일 추가 * chore: 불필요한 tools 설정 제거 * [feat] preMember 목록 분리 및 삭제 기능 추가 (#115) * feat: preMember 목록 분리 및 삭제 기능 추가 * chore: Pascal case * chore: 변경된 변수명 반영 * feat: 학번 숫자 필터링 추가 * [feat] 채팅 목차 알림 상태 추가 (#113) * chore: svg 추가 * feat: 채팅목록 알림 끄기 설정시 UI 추가 * feat: 목차 열릴시 애니메이션 추가 * [feat] 달력 카테고리 분류 추가 (#118) * feat: 카테고리 추가 * chore: 불필요한 코드 삭제 * [refactor] 관리자 페이지 및 마이페이지 UI 수정 및 리팩토링 (#117) * feat: 정보 카드에서 정보 페이지로 이동하도록 기능 추가 * feat: 토스트 전역상태 추가 * refactor: query 훅 분리 및 onSuccess 콜백 옵션 제거 * refactor: query 훅 사용처 수정 * refactor: 사용처 수정 2 * fix: 채팅창 스크롤 초기화 문제 수정 및 줄바꿈 기준 변경 * feat: 토글 스위치 구현 * refactor: 모집 공고 관련 목록 페이지 디자인 수정 * feat: 컴포넌트 구현 및 icon 추가 * refactor: z-index 값 수정 * refactor: API 필드 변경 사항 반영 * refactor: 모집 공고 페이지 디자인 수정 및 라우트 백 수정 * refactor: 학교 목록에 없을 시 문구 디자인 수정 * fix: lint error * fix: 타입 변경 * feat: 모집 관련 페이지 API 추가사항 반영 * refactor: 토스트 타이머 클린업 추라 * refactor: 전역토스트 사용 변경 * refactor: 관리자 클럽 조회 훅 호출 범위 줄이기 * feat: onError handler add * chore: add button type and remove fragment * [feat] 문의하기 버튼 로직 추가 (#120) * feat: API 추가 및 연결 * chore: placeholder 제거 * [fix] 채팅 스크롤 미갱신 버그 및 멤버 직위 렌더링 수정 (#122) * fix: 채팅 스크롤 미작동 수정 * fix: 한글 출력으로 수정 * feat: 첫 글자 보여주도록 수정 (#124) * hotfix: 동아리 소개 줄바꿈 적용 및 한 줄 소개 글자수 제한 상향 * chore: 리뷰 반영 * fix: disabled 조건 변경 * 126 fix 배포 전 qa 사항 반영 (#127) * fix: 가입 버튼 문구 수정 * fix: 검색창 placeholder 수정 * fix: 불필요해진 UI 비활성화 * fix: 모집공고 없을 때 빈 화면 처리 * fix: 무의미한 회비페이지 수정 * feat: 토글 시 자동 페이지 이동 추가 * fix: 페이지 이동 조건 수정 --------- Co-authored-by: 김혜준 <114041848+hyejun0228@users.noreply.github.com> Co-authored-by: hyejun <hyejunkkim228@gmail.com> * develop -> main 배포 (#132) * chore: 타입 변경 반영 * [feat] 모집 공고에 시간 추가 및 지원서 정렬 추가 (#131) * feat: 모집 공고에 시작, 종료 시간 추가 * feat: 지원자 목록 정렬 추가 및 시간 표시 * feat: 채팅, 모집 공고 링크 파싱 기능 추가 * feat: 인스타그램 파싱 추가 * fix: prettier error * refactor: 유틸 분리 및 타입 변경 * chore: 타입 변경 반영 * chore: 동일 스타일 통합 및 entity 확장 사용 * chore:ios 토큰 테스트를 위한 로직 추가 * Revert "chore:ios 토큰 테스트를 위한 로직 추가" This reverts commit 98570fc. * hotfix: 모집 공고 textarea 길이 자동 재계산 추가 * feat: 페이지네이션 추가 * feat: 수정 * feat: 페이지네이션 수정 * feat: 디자인 수정 * feat: 로직 수정 * fix: key 수정 * develop-> main (#135) * chore: 타입 변경 반영 * [feat] 모집 공고에 시간 추가 및 지원서 정렬 추가 (#131) * feat: 모집 공고에 시작, 종료 시간 추가 * feat: 지원자 목록 정렬 추가 및 시간 표시 * feat: 채팅, 모집 공고 링크 파싱 기능 추가 * feat: 인스타그램 파싱 추가 * fix: prettier error * refactor: 유틸 분리 및 타입 변경 * chore: 타입 변경 반영 * chore: 동일 스타일 통합 및 entity 확장 사용 * chore:ios 토큰 테스트를 위한 로직 추가 * Revert "chore:ios 토큰 테스트를 위한 로직 추가" This reverts commit 98570fc. * hotfix: 모집 공고 textarea 길이 자동 재계산 추가 * Reapply "chore:ios 토큰 테스트를 위한 로직 추가" This reverts commit 3a56f4a. * chore: ios토큰 * feat: 가이드 페이지 이미지 변경 * chore: 푸시알림 로직 임시 변경 * refactor: 푸시 알림 토큰 로직 브릿지 방식으로 수정 (#134) * refactor: 푸시 알림 토큰 로직 브릿지 방식으로 수정 * fix: try catch 적용 * feat: 페이지네이션 추가 * feat: 수정 * feat: 페이지네이션 수정 * feat: 디자인 수정 * feat: 로직 수정 * fix: key 수정 * chore: 스테이지 용 임시 UI 제거 --------- Co-authored-by: hyejun <hyejunkkim228@gmail.com> * [feat] sentry 모니터링 추가 (#141) (#142) * chore: sentry 의존성 추가 * feat: sentry 세팅 * chore: 워크플로우 수정 및 vite 세팅 * chore: 임시 추가 * refactor: 색상 토큰 파일 분리 * refactor: 타이포그래피 스타일 파일 분리 * refactor: 피그마 타이포그래피 네이밍으로 클래스 정렬 * fix: 리뷰 코멘트 기반 접근성 및 토큰 정리 --------- Co-authored-by: 김혜준 <114041848+hyejun0228@users.noreply.github.com> Co-authored-by: hyejun <hyejunkkim228@gmail.com>
모집 공고에 시간 추가, 지원서 선착순 정렬 추가
Summary by CodeRabbit
릴리스 노트