Skip to content

v 1.0.3#396

Merged
dydals3440 merged 26 commits into
mainfrom
develop
Mar 15, 2026
Merged

v 1.0.3#396
dydals3440 merged 26 commits into
mainfrom
develop

Conversation

@dydals3440
Copy link
Copy Markdown
Member

Release v1.0.3

v1.0.2 → v1.0.3 | develop → main

✨ Features


🐛 Bug Fixes

dydals3440 and others added 24 commits March 11, 2026 07:51
- 모든 소셜 로그인 버튼을 동일한 SocialLoginButton(풀 버튼) 형태로 통일
- Apple 버튼 다크모드 대응: 전용 색상 토큰(apple-button/apple-button-dark) 추가
- Apple 로고 SVG fill을 currentColor로 변경하여 colorClassName 지원
- 미사용 SocialLoginIconButton 컴포넌트 및 "또는" 구분선 제거

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(mobile): 디자인 스펙에 맞게 oklch 색상 값 교정

- gray 5~10 L값 교정 (반올림으로 인한 어둡게 렌더링 수정)
- gray-10 보라빛 틴트 제거 (C=0.005 H=285 → 0)
- main/secondary/error 브랜드 색상 스펙 hex 정밀 매칭
- dark white 따뜻한 틴트 제거 (H=29 → 무채색)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): 다크 모드 background/surface 색상 틴트 제거

- --background: 따뜻한 틴트(C=0.0056, H=29) 제거 → 무채색
- --surface: 보라빛 틴트(C=0.005, H=285) 제거 → 무채색

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(mobile): 주간 달성 배지 기능 추가

- 주간 완료율 기반 배지 시스템 (perfect/almost/completed)
- 상장 스타일 요약 카드 및 배지 목록 UI
- Achievement 모델, 서비스, 매퍼, 쿼리, 뷰모델 구현
- DI 컨테이너 등록 및 마이페이지 내비게이션 연결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(mobile): ViewModel 패턴 아키텍처 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): 긴 텍스트 잘림 방지를 위한 레이아웃 수정

- 리포트 헤더 날짜 범위 flex-wrap 적용
- 프리미엄 배너, 제안 목록 텍스트 정렬 및 줄바꿈 전략 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore(mobile): 달성 배지 UI 가이드 문서 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): 달성 배지 연도를 현재 연도 자동 계산으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): weekly-badge 관련 로깅 추가

* refactor(mobile): 배지 이미지를 webp 포맷으로 변환

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(mobile): ViewModel 예외 케이스 가이드 추가

단순 변환은 select에서 인라인 처리 가능하다는 예외 케이스 문서화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): 주간 배지 상세 페이지 추가

- detail API 연결 (service + query key + query options)
- achievements/[year]/[week] 상장 카드 상세 화면
- 리스트 아이템 탭 → 상세 네비게이션 + ListRow 리팩토링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): CertificateBorder 공용 컴포넌트 분리

AchievementSummaryCard에서 CertificateBorder를 별도 파일로 추출하여
상세 페이지와 리스트 요약 카드에서 공유

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: 김용민 <dydals3440@gmail.com>
* refactor(api): scheduler 내부 정리 및 WeeklyAchievement catch-up 추가

- ITimezoneStrategy 인터페이스 추출, 모든 strategy에 implements 적용
- handleHourlySweep → handleMinuteSweep 메서드명 정정
- pushEnabled 유저 없는 타임존의 WeeklyAchievement catch-up 로직 추가
- wrapAllTimezones 캐시 메서드 및 allTimezones 캐시 키 추가
- subtractMonths 날짜 유틸리티 추가
- jobs barrel export 추가

* refactor(api): WeeklyAchievement catch-up 중복 dayjs 계산 제거 및 테스트 데이터 보정
* feat(mobile): 반복 설정 날짜 선택 UX 개선

- 반복 기간 설정 라벨 변경 및 날짜 범위 표시 개선
- 선택된 반복 요일 요약 텍스트 추가
- 반복 모드에서 오늘 날짜 배경 하이라이트 비활성화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): 피드 프로필 이름 최대 너비 제한 및 InfoIcon 텍스트 전환

- 긴 이름(최대 20자)이 레이아웃을 깨지 않도록 max-w + numberOfLines 적용
- InfoIcon SVG를 ⓘ 텍스트로 변경하여 폰트 스케일 대응

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): 시스템 글꼴 크기 비례 스케일링 유틸 함수 추가

fontScaledSize(size, ratio) — PixelRatio.getFontScale() 기반으로
아이콘/버튼 크기를 시스템 글꼴에 비례하여 스케일링한다.
ratio 파라미터로 반영 비율 조절 가능 (기본 0.5).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): 아이콘/버튼 시스템 글꼴 스케일 적용 및 바텀시트 레이아웃 개선

- TodoFormContent: chips flex-wrap 레이아웃으로 변경, 버튼/아이콘 fontScaledSize 적용
- PickerHeader: CloseIcon fontScaledSize 적용
- TodoList: 카테고리 PlusIcon fontScaledSize 적용
- ProfileCard: CopyIcon fontScaledSize 적용
- KeyboardBottomSheet: 하단 패딩 여유 추가
- testing-guide: 유틸 함수 테스트 가이드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(mobile): fontScaledSize JSDoc 기본값 수정 (0.3 → 0.5)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): fontScaledSize 호출을 인라인으로 변경

- PickerHeader의 HEADER_ICON_SIZE 상수 제거
- TodoFormContent의 scaledButtonSize/scaledIconSize/scaledMicIconSize 변수 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): 테스트 설명에서 Given/When/Then 장황한 형식 제거

- testing-guide.md: it 설명은 간결하게 작성하도록 가이드 수정
- scale.test.ts: 7개 테스트 설명을 간결한 한국어로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* chore(mobile): 알림 설정 설명 문구를 ~해요 체로 통일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): 24시간제 설정을 앱 전체 시간 표시에 반영

- 알림 설정 화면에 24시간제 토글 추가
- 할일 목록, 친구 할일, AI 리포트 시간 표시에 timeFormat 반영
- iOS DateTimePicker locale 동적 전환 (en_GB/ko)
- formatTime, formatHour, formatReminderTime에 timeFormat 파라미터 추가
- formatTimeDisplay 유틸 함수 및 테스트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): TodoTimePickerContent에 Suspense boundary 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): formatTimeDisplay 기본값을 TWELVE_HOUR로 통일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(mobile): 주간 배지 공유 기능 추가

- useShareView 훅으로 ViewShot 캡처 + expo-sharing 공유 로직 분리
- 배지 상세/요약 화면에 공유 버튼 추가
- badge_share_attempted 애널리틱스 이벤트 추가
- ShareIcon 아이콘 추가 및 fontScaledSize 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): 공유 캡처 실패 시 에러 토스트 추가

- isAvailableAsync 체크를 캡처 전으로 이동
- 캡처 실패 시 에러 토스트 표시
- trackEvent를 shareCapture 전으로 이동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mobile): 배지 목록 빈 상태 UI를 상장 스타일로 개선

- 기본 Result 컴포넌트 대신 CertificateBorder 활용한 empty state
- 기록 영역에 Result 컴포넌트로 안내 표시
- badge_empty 이미지 에셋 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mobile): 콕 찌르기 쿨다운 에러 메시지 수정

- 오늘 할 일 기반이므로 시간 안내 대신 상태 안내로 변경

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(api): AI 제안에 카테고리 추천 추가 및 분석 주기를 매일로 변경 (#370)

* feat(mobile): 카테고리 id를 기준으로 바로 선택할 수 있게 UX 변경

* refactor(api): Gemini 코드 리뷰 반영 — jobId 타임존 버그 수정

* feat(api): 투두 파싱 프롬프트에 요일 약어 및 월+요일 복합 규칙 추가

- DayAbbr 규칙: 한글 요일 약어 매핑(월=MON, 화=TUE, ...) 및 조합 패턴(월수금→MON+WED+FRI)
- Compound 확장: N월+요일약어→isRecurring:true, startDate=N월1일, endDate=N월말일
- "4월 월수금 출근" 같은 월+요일 복합 표현의 endDate가 해당 월 말일로 정확히 설정됨

* feat(mobile): v1.0.1 update
* feat(mobile): 캘린더 뷰 모드 선택 값 MMKV 저장

closes #375

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): MMKV persist 함수 네이밍 통일

- useState setter는 관례적 네이밍(setX) 유지
- MMKV 저장 포함 함수는 persistX로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): 캘린더 뷰 모드 읽기에서 타입 단언 제거

- VALID_VIEW_MODES 배열 + as CalendarViewMode 대신 직접 문자열 비교로 변경
- TypeScript 자동 narrowing 활용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(mobile): MMKV 저장소에 DIP 적용 및 preference 순수 함수 분리

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: 김용민 <dydals3440@gmail.com>
* fix(mobile): Android 마이페이지 하단 컨텐츠 탭 바 가림 수정 (#377)

* refactor(mobile): 탭 바 오버레이 패딩 상수 추출 (#377)

하드코딩된 paddingBottom: 120을 LAYOUT.tabBarOverlayPadding 상수로 분리
* feat(mobile): analytics 이벤트 강화 및 친구 요청 lifecycle 추적 추가

- todo_created 이벤트에 source, is_recurring, has_scheduled_time, is_all_day, visibility 속성 추가
- 반복 할 일 생성(createRecurringTodo) 추적 추가
- category_created에 color 속성, category_updated 이벤트 신규 추가
- AI 파싱 source를 react-hook-form 상태로 관리 (props 없이)
- friend_request_accepted, friend_request_rejected 이벤트 추가
- onSuccess 내 trackEvent 호출 순서 통일 (invalidate → toast → trackEvent)

* fix(mobile): onSuccess 내 trackEvent 호출 순서 통일 (Gemini review)

카테고리 생성/수정 mutation에서 trackEvent를 invalidateQueries, toast 뒤로 이동하여
전체 코드베이스의 onSuccess 패턴(invalidate → toast → trackEvent)과 일관성 유지
* feat(mobile): 문의하기 기능 추가 (#380)

* refactor(mobile): CONTENT_PLACEHOLDER를 멀티라인 템플릿 리터럴로 변환 (#380)
…#383)

* refactor(mobile): 마이페이지/프로필 설정 UI 리팩토링 및 SettingNavigation 공통 컴포넌트 추출 (#382)

* refactor(mobile): SettingNavigation Compound Component 패턴 전환 (#382)
* fix(api): 카카오 프로필 이미지 미표시 수정 (#384)

* test(api): 카카오 토큰 검증 시 secure_resource 파라미터 검증 추가 (#384)

* refactor(api): secure_resource 파라미터를 URL 상수에 직접 포함 (#384)
* feat(api,mobile): 리마인드 콕 찌르기 기능 추가 (#386)

* refactor(api): countTodayTodos 쿼리 가독성 개선 (#386)
* fix(mobile): 다크모드에서 Apple 아이콘 미표시 수정 (#388)

* refactor(mobile): ThemedAppleIcon 제거, dark: modifier로 통일 (#388)
* feat(mobile): 할일 액션 메뉴에서 카테고리 변경 기능 추가 (#391)

* fix(mobile): 카테고리 바텀시트 stale state 및 방어 코드 개선 (#391)

- CategorySelectBottomSheet: {isOpen && (...)} 패턴으로 재오픈 시 선택 상태 초기화
- SuggestionCategoryBottomSheet: ?? 0 제거, early return null로 방어 코드 개선
* fix(mobile): 문의하기 화면 키보드 UX 개선 (#393)

* refactor(mobile): scrollTo 매직 넘버를 실제 콘텐츠 높이로 대체

onContentSizeChange로 콘텐츠 높이를 추적하여 scrollTo의
하드코딩된 9999 값을 제거하고 정확한 스크롤 위치를 사용
* feat(api,mobile): 친구 목록 드래그 앤 드롭 순서 변경 기능 추가

Follow 모델에 sortOrder 필드를 추가하고, 친구 목록에서 꾹 눌러
드래그로 순서를 변경할 수 있는 기능을 구현한다.

API:
- Prisma 스키마에 sortOrder 필드 및 인덱스 추가
- PATCH /follows/friends/:followId/reorder 엔드포인트 추가
- 상대 위치 기반 reorder + shift 알고리즘 구현
- 친구 수락 시 sortOrder 자동 할당 (maxSortOrder + 1)
- 기존 데이터 하위 호환 SQL 마이그레이션

Mobile:
- DraggableFlatList 기반 드래그 앤 드롭 UI
- 낙관적 업데이트 훅 (useDraggableFriendReorderList)
- reorderFriend 서비스 메서드 및 mutation options

* fix: 코드 리뷰 반영 및 친구 목록 레이아웃 수정

- reorder 시 followRequestNotFound → friendReorderTargetNotFound로 변경하여
  순서 변경 맥락에 맞는 에러 메시지 사용
- DraggableFlatList에 containerStyle flex:1 추가하여 전체 높이 채우도록 수정

* refactor: 코드 스타일 개선 및 analytics 이벤트 추가

- 단일 라인 if/return을 멀티 라인 브레이스로 변환 (가독성)
- API 로그 메시지 영문 → 한국어 전환 (로깅 가이드 준수)
- friend_reordered analytics 이벤트 추가
@dydals3440 dydals3440 requested a review from hijjoy March 15, 2026 15:12
@dydals3440 dydals3440 self-assigned this Mar 15, 2026
@dydals3440 dydals3440 added the release 🚀 릴리즈 - develop → main 배포 PR label Mar 15, 2026
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 릴리스는 사용자 경험을 향상시키기 위한 몇 가지 중요한 기능을 도입합니다. 친구 목록을 개인화할 수 있는 드래그 앤 드롭 순서 변경 기능과 할일 카테고리를 간편하게 수정할 수 있는 옵션이 추가되었습니다. 또한, 친구가 할일을 잊었을 때 알림을 보낼 수 있는 새로운 '리마인드 콕 찌르기' 기능이 도입되었으며, 문의하기 화면의 키보드 동작이 개선되어 더욱 부드러운 사용성을 제공합니다.

Highlights

  • 친구 목록 드래그 앤 드롭 순서 변경 기능 추가: 이제 친구 목록에서 친구의 순서를 드래그 앤 드롭으로 변경할 수 있습니다. 이 기능은 백엔드에 sortOrder 필드를 추가하고, 프론트엔드에 DraggableFlatList를 통합하여 구현되었습니다.
  • 할일 액션 메뉴에서 카테고리 변경 기능 추가: 할일 액션 메뉴에 카테고리 변경 옵션이 추가되었습니다. 이를 통해 사용자는 할일의 카테고리를 더 쉽게 수정할 수 있습니다.
  • 문의하기 화면 키보드 UX 개선: 문의하기 화면에서 키보드가 올라올 때 입력 필드가 가려지지 않도록 UX가 개선되었습니다. react-native-keyboard-controller를 활용하여 키보드 동작에 맞춰 스크롤 뷰가 자동으로 조정됩니다.
  • 리마인드 콕 찌르기 기능 추가: 친구가 오늘 할일을 만들지 않았을 때 '리마인드 콕 찌르기'를 보낼 수 있는 기능이 추가되었습니다. 이 기능은 1시간의 쿨다운 정책을 가지며, 친구가 할일이 없는 경우에만 사용할 수 있습니다.
Changelog
  • apps/api/prisma/migrations/20260314151746_add_reminder_nudge/migration.sql
    • Added a new ReminderNudge table with id, senderId, receiverId, message, and createdAt fields.
    • Created indices on (senderId, receiverId, createdAt) and (receiverId, createdAt) for ReminderNudge.
    • Added foreign key constraints linking senderId and receiverId to the User table with cascade delete/update.
  • apps/api/prisma/migrations/20260315000000_add_follow_sort_order/migration.sql
    • Added a sortOrder integer column with a default of 0 to the Follow table.
    • Created an index on (followerId, sortOrder) for the Follow table.
    • Included a data migration to assign sequential sortOrder values to existing ACCEPTED follows based on createdAt in descending order.
  • apps/api/prisma/schema.prisma
    • Added sentRemindNudges and receivedRemindNudges relations to the User model.
    • Added sortOrder field with a default value and comment to the Follow model.
    • Added an index on [followerId, sortOrder] to the Follow model.
    • Defined the new ReminderNudge model with fields, relations, and indices.
  • apps/api/src/common/exception/services/business-exception.service.ts
    • Added friendReorderTargetNotFound exception for friend reordering.
    • Added remindNudgeFriendHasTodos and remindNudgeCooldownActive exceptions for remind nudge functionality.
  • apps/api/src/modules/auth/services/oauth-token-verifier.service.spec.ts
    • Updated the Kakao user info URL in tests to include secure_resource=true.
  • apps/api/src/modules/auth/services/oauth-token-verifier.service.ts
    • Updated the KAKAO_USER_INFO_URL constant to include secure_resource=true.
  • apps/api/src/modules/follow/dtos/index.ts
    • Exported reorder-friend.dto.
  • apps/api/src/modules/follow/dtos/request/reorder-friend.dto.ts
    • Added ReorderFriendDto for friend reordering requests.
  • apps/api/src/modules/follow/dtos/response/follow-action.response.dto.ts
    • Imported and exported reorderFriendResponseSchema and ReorderFriendResponseDto.
  • apps/api/src/modules/follow/follow.controller.spec.ts
    • Updated mock Follow objects to include the new sortOrder field.
    • Added test cases for the new reorderFriend endpoint.
  • apps/api/src/modules/follow/follow.controller.ts
    • Imported necessary DTOs and decorators for friend reordering.
    • Added a new PATCH /friends/:followId/reorder endpoint to handle friend list reordering.
  • apps/api/src/modules/follow/follow.repository.spec.ts
    • Updated the default sorting order in findMany calls from createdAt to sortOrder for friend lists.
    • Adjusted test descriptions to reflect the new sorting logic.
  • apps/api/src/modules/follow/follow.repository.ts
    • Changed the default sorting order for fetching follows to sortOrder asc, id asc.
    • Added findAcceptedByIdAndFollowerId to find an accepted follow by ID and follower ID.
    • Added getMaxSortOrderForFriends to retrieve the maximum sort order for a user's friends.
    • Added shiftFriendSortOrders to atomically update a range of sort orders.
    • Added updateFollowSortOrder to update a single follow's sort order and include user details.
  • apps/api/src/modules/follow/follow.service.spec.ts
    • Updated mock Follow objects and related service calls to include sortOrder.
    • Added mock for getMaxSortOrderForFriends.
    • Implemented comprehensive tests for the reorder method, covering various scenarios like relative reordering, moving to the beginning/end, and error conditions.
  • apps/api/src/modules/follow/follow.service.ts
    • Imported TransactionClient for database transactions.
    • Modified acceptFriendRequest and sendFriendRequest to automatically assign sortOrder to newly created or updated Follow entries.
    • Implemented the reorder method to handle friend list reordering logic, utilizing new repository methods and transaction management.
    • Added private helper methods (#reorderRelativeTo, #reorderToEdge) to encapsulate reordering logic based on target position.
  • apps/api/src/modules/notification/queue/notification-queue.processor.ts
    • Modified handleNudgeSent to conditionally use remindNudgeReceived message builder if todoId is not present, indicating a remind nudge.
  • apps/api/src/modules/notification/templates/notification-templates.ts
    • Added new notification templates REMIND_NUDGE_RECEIVED and REMIND_NUDGE_RECEIVED_WITH_MESSAGE for remind nudges.
    • Added a static method remindNudgeReceived to NotificationMessageBuilder to construct messages for remind nudges, with or without a custom message.
  • apps/api/src/modules/nudge/dtos/request/send-nudge.dto.ts
    • Imported createRemindNudgeSchema and exported SendRemindNudgeDto.
  • apps/api/src/modules/nudge/dtos/response/nudge-list.response.dto.ts
    • Imported createRemindNudgeResponseSchema and exported CreateRemindNudgeResponseDto.
  • apps/api/src/modules/nudge/nudge.controller.ts
    • Imported CreateRemindNudgeResponseDto and SendRemindNudgeDto.
    • Added a POST /remind endpoint for sending remind nudges with validation and cooldown checks.
    • Added a GET /remind/cooldown/:userId endpoint to retrieve remind nudge cooldown information for a specific user.
  • apps/api/src/modules/nudge/nudge.mapper.ts
    • Imported RemindNudge and ReminderNudgeWithRelations types.
    • Added a static method toRemindNudgeDto to map ReminderNudgeWithRelations entities to RemindNudge DTOs.
  • apps/api/src/modules/nudge/nudge.repository.ts
    • Imported TransactionClient and ReminderNudge types.
    • Added findTodoForNudge to fetch essential todo details for nudge validation.
    • Modified countTodayNudges and findLastNudgeForTodo to accept an optional TransactionClient.
    • Added createNudge method to create a nudge with relations.
    • Added findLastRemindNudge to retrieve the most recent remind nudge sent to a user.
    • Added countTodayTodos to count a user's todos for the current day.
    • Added createRemindNudge to create a new remind nudge with sender and receiver relations.
  • apps/api/src/modules/nudge/nudge.service.spec.ts
    • Imported REMIND_NUDGE_LIMITS for remind nudge logic.
    • Replaced direct Prisma client calls in tests with nudgeRepository mock calls.
    • Added extensive test suites for sendRemindNudge and getRemindCooldownInfo, covering various success and error conditions, including cooldowns and todo existence checks.
  • apps/api/src/modules/nudge/nudge.service.ts
    • Imported REMIND_NUDGE_LIMITS, ReminderNudgeWithRelations, and SendRemindNudgeParams.
    • Introduced private helper methods #validateNotSelf and #validateFriendship for common validation logic.
    • Refactored sendNudge to utilize the new nudgeRepository methods for database operations.
    • Implemented sendRemindNudge to handle the creation and validation of remind nudges, including checks for existing todos and cooldowns.
    • Implemented getRemindCooldownInfo to provide cooldown status for remind nudges.
    • Modified #calculateCooldownInfo to accept a cooldownHours parameter, making it reusable for different nudge types.
  • apps/api/src/modules/nudge/types/nudge.types.ts
    • Imported ReminderNudge type.
    • Defined ReminderNudgeWithRelations interface for remind nudge entities with sender information.
    • Added SendRemindNudgeParams interface for parameters to send a remind nudge.
    • Added TodoForNudgeValidation type for simplified todo data used in nudge validation.
    • Added CreateNudgeData interface for creating nudge records.
  • apps/api/test/builders/follow.builder.ts
    • Added sortOrder: 0 as a default value for new Follow entities in the builder.
  • apps/api/test/fixtures/friend.fixture.ts
    • Added sortOrder: 0 as a default value for new Follow fixtures.
  • apps/mobile/.claude/ui-components.md
    • Updated the UI component documentation to include the new SettingNavigation component.
  • apps/mobile/app.config.ts
    • Updated the application version to 1.0.2.
  • apps/mobile/app/(app)/(tabs)/feed/(feed)/friend/[friendId].tsx
    • Imported the LAYOUT constant.
    • Used LAYOUT.tabBarOverlayPadding for the ScrollView's bottom content padding to ensure proper layout on Android.
  • apps/mobile/app/(app)/(tabs)/feed/(feed)/index.tsx
    • Imported the LAYOUT constant.
    • Used LAYOUT.tabBarOverlayPadding for the NestableScrollContainer's bottom content padding.
  • apps/mobile/app/(app)/(tabs)/mypage/index.tsx
    • Imported LAYOUT and the new SettingNavigation component.
    • Refactored the settings sections to use the SettingNavigation compound component for better structure and reusability.
    • Applied LAYOUT.tabBarOverlayPadding to the ScrollView's content container style.
  • apps/mobile/app/(app)/settings/_layout.tsx
    • Added a new Stack.Screen for the '문의하기' (Inquiry) page.
  • apps/mobile/app/(app)/settings/inquiry.tsx
    • Added a new screen for submitting inquiries, featuring category selection and a text area for content.
    • Implemented keyboard adaptive UX using react-native-keyboard-controller to ensure the input field remains visible when the keyboard is active.
  • apps/mobile/app/(app)/settings/profile.tsx
    • Refactored the ProfileScreen to use the new SettingNavigation component for organizing profile information and account settings.
    • Extracted the main content into a ProfileScreenContent functional component for better modularity.
  • apps/mobile/package.json
    • Updated the package version to 1.0.2.
  • apps/mobile/src/bootstrap/providers/di-provider.tsx
    • Imported InquiryService.
    • Added inquiryService to the DIContainer interface and initialized it in the provider.
    • Exported useInquiryService hook for accessing the inquiry service.
  • apps/mobile/src/core/ports/sync-storage.ts
    • Defined the SyncStorage interface for synchronous key-value storage operations.
  • apps/mobile/src/features/ai/presentations/components/SuggestionCategoryBottomSheet.tsx
    • Refactored the component to utilize the new CategorySelectBottomSheet for a standardized category selection UI.
  • apps/mobile/src/features/auth/presentations/constants/provider-configs.constant.tsx
    • Updated Apple icon rendering to directly use AppleIcon with dynamic color classes based on theme, removing the ThemedAppleIcon wrapper.
  • apps/mobile/src/features/friend/tests/friend.factories.ts
    • Added createReorderFriendDto factory function for generating mock friend reorder responses.
  • apps/mobile/src/features/friend/presentations/components/FriendList.tsx
    • Replaced FlashList with DraggableFlatList to enable drag-and-drop reordering of friends.
    • Integrated the useDraggableFriendReorderList hook to manage the draggable list state and reorder logic.
    • Incorporated useReorderFriendMutationOptions for handling API calls related to friend reordering.
    • Added ScaleDecorator and PressableFeedback components to enhance the drag-and-drop user interface.
  • apps/mobile/src/features/friend/presentations/hooks/use-draggable-friend-reorder-list.ts
    • Added useDraggableFriendReorderList custom hook to manage the local state of a draggable list and generate reorder instructions for the backend.
  • apps/mobile/src/features/friend/presentations/queries/use-accept-request-mutation-options.ts
    • Added analytics tracking for friend_request_accepted event upon successful acceptance of a friend request.
  • apps/mobile/src/features/friend/presentations/queries/use-reject-request-mutation-options.ts
    • Added analytics tracking for friend_request_rejected event upon successful rejection of a friend request.
  • apps/mobile/src/features/friend/presentations/queries/use-reorder-friend-mutation-options.ts
    • Added useReorderFriendMutationOptions hook for handling friend reordering mutations, including analytics tracking and query invalidation.
  • apps/mobile/src/features/friend/presentations/utils/tests/draggable-reorder.test.ts
    • Added unit tests for the getFriendReorderInstruction utility function, covering various reordering scenarios.
  • apps/mobile/src/features/friend/presentations/utils/draggable-reorder.ts
    • Added getFriendReorderInstruction utility function to calculate the necessary reorder instructions (moved item, target item, position) for a draggable list.
  • apps/mobile/src/features/friend/services/friend.service.test.ts
    • Added unit tests for the new reorderFriend method, verifying successful reordering, HTTP error handling, and Zod validation failures.
  • apps/mobile/src/features/friend/services/friend.service.ts
    • Imported ReorderFriendInput, ReorderFriendResponse, and reorderFriendResponseSchema.
    • Added the reorderFriend method to handle API calls for reordering friends, including response parsing and error handling.
  • apps/mobile/src/features/inquiry/tests/inquiry.factories.ts
    • Added factory functions createInquiryResponseDto and createInquiryApiError for testing inquiry-related services.
  • apps/mobile/src/features/inquiry/models/inquiry.model.ts
    • Defined inquiryResultSchema and InquiryResult type for inquiry submission results.
  • apps/mobile/src/features/inquiry/presentations/constants/inquiry-category-labels.constant.ts
    • Added INQUIRY_CATEGORY_LABELS constant to map inquiry categories to user-friendly labels.
  • apps/mobile/src/features/inquiry/presentations/queries/use-create-inquiry-mutation-options.ts
    • Added useCreateInquiryMutationOptions hook for creating inquiries, handling success/error toasts and navigation.
  • apps/mobile/src/features/inquiry/services/inquiry.mapper.test.ts
    • Added unit tests for the toInquiryResult mapper function.
  • apps/mobile/src/features/inquiry/services/inquiry.mapper.ts
    • Added toInquiryResult mapper function to transform API response DTOs into InquiryResult models.
  • apps/mobile/src/features/inquiry/services/inquiry.service.test.ts
    • Added unit tests for the createInquiry method of InquiryService, covering successful submission, API errors, and Zod validation failures.
  • apps/mobile/src/features/inquiry/services/inquiry.service.ts
    • Implemented InquiryService with a createInquiry method to handle API requests for submitting user inquiries.
  • apps/mobile/src/features/todo/models/todo-nudge.model.ts
    • Defined sendTodoNudgeInputSchema, sendRemindNudgeInputSchema, and sendTodoNudgeResultSchema with their corresponding TypeScript types.
  • apps/mobile/src/features/todo/presentations/components/AddTodoBottomSheet.tsx
    • Added a source field to the todo creation forms, defaulting to 'manual', to track how todos are created.
  • apps/mobile/src/features/todo/presentations/components/Calendar/calendar.types.ts
    • Updated the import path for CalendarViewMode to use the new preference file.
  • apps/mobile/src/features/todo/presentations/components/CategorySelectBottomSheet.tsx
    • Added a reusable CategorySelectBottomSheet component for consistent category selection across the app.
  • apps/mobile/src/features/todo/presentations/components/FriendTodoList.tsx
    • Imported isSameDay, useGetRemindNudgeCooldownQueryOptions, and RemindNudgeBottomSheet.
    • Modified FriendTodoList to conditionally display a 'Remind Nudge' button when a friend has no todos for the current day.
    • Introduced the RemindNudgeButton component to encapsulate the logic and UI for sending remind nudges.
  • apps/mobile/src/features/todo/presentations/components/PokeBanner.tsx
    • Imported PawIcon for visual enhancement.
    • Updated the PokeBanner's text and descriptions to be more dynamic and include the PawIcon where appropriate.
  • apps/mobile/src/features/todo/presentations/components/RemindNudgeBottomSheet.tsx
    • Added RemindNudgeBottomSheet component, allowing users to send remind nudges to friends who haven't created todos.
  • apps/mobile/src/features/todo/presentations/components/TodoFormContent.tsx
    • Automatically sets the source field to 'ai' when an AI suggestion is accepted in the todo form.
  • apps/mobile/src/features/todo/presentations/components/TodoList/TodoActionsBottomSheet.tsx
    • Imported ListIcon.
    • Added a '카테고리 변경' (Change Category) option to the todo actions bottom sheet, allowing users to modify a todo's category directly.
  • apps/mobile/src/features/todo/presentations/components/TodoList/TodoItem.tsx
    • Imported useChangeTodoCategoryMutationOptions and CategorySelectBottomSheet.
    • Introduced isCategoryOpen state to control the visibility of the category selection bottom sheet.
    • Integrated CategorySelectBottomSheet to provide a UI for changing a todo's category, triggered from the actions menu.
  • apps/mobile/src/features/todo/presentations/constants/todo-query-keys.constant.ts
    • Added remindNudgeCooldown to TODO_QUERY_KEYS for managing remind nudge cooldown state.
  • apps/mobile/src/features/todo/presentations/providers/feed-calendar-provider.tsx
    • Imported SyncStorage, mmkvSyncStorage, readCalendarViewMode, and writeCalendarViewMode.
    • Modified FeedCalendarProvider to persist the CalendarViewMode (week/month) using SyncStorage, ensuring the user's preference is saved across sessions.
  • apps/mobile/src/features/todo/presentations/queries/use-change-todo-category-mutation-options.ts
    • Added useChangeTodoCategoryMutationOptions hook for changing a todo's category, including analytics tracking for todo_edited.
  • apps/mobile/src/features/todo/presentations/queries/use-create-recurring-todo-mutation-options.ts
    • Defined CreateRecurringTodoParams interface.
    • Modified the mutation function to accept input and source parameters.
    • Added detailed analytics tracking for todo_created events, including source, is_recurring, has_scheduled_time, is_all_day, and visibility.
  • apps/mobile/src/features/todo/presentations/queries/use-create-todo-category-mutation-options.ts
    • Added analytics tracking for category_created event, including the color of the new category.
  • apps/mobile/src/features/todo/presentations/queries/use-create-todo-mutation-options.ts
    • Defined CreateTodoParams interface.
    • Modified the mutation function to accept input and source parameters.
    • Added detailed analytics tracking for todo_created events, including source, is_recurring, has_scheduled_time, is_all_day, and visibility.
  • apps/mobile/src/features/todo/presentations/queries/use-get-remind-nudge-cooldown-query-options.ts
    • Added useGetRemindNudgeCooldownQueryOptions hook to fetch cooldown information for remind nudges.
  • apps/mobile/src/features/todo/presentations/queries/use-send-remind-nudge-mutation-options.ts
    • Added useSendRemindNudgeMutationOptions hook for sending remind nudges, including analytics tracking and invalidating relevant cooldown queries.
  • apps/mobile/src/features/todo/presentations/queries/use-send-todo-nudge-mutation-options.ts
    • Added haptic feedback (Haptics.notificationAsync) on successful sending of a todo nudge.
  • apps/mobile/src/features/todo/presentations/queries/use-update-todo-category-mutation-options.ts
    • Added analytics tracking for category_updated event, specifying whether the name or color field was updated.
  • apps/mobile/src/features/todo/presentations/schemas/add-todo-form.schema.ts
    • Introduced todoSourceSchema and added a source field to addTodoFormSchema to indicate the origin of a todo (manual or AI).
  • apps/mobile/src/features/todo/services/todo-category.service.test.ts
    • Added unit tests for the new changeTodoCategory method, covering successful category changes, HTTP errors, and Zod validation.
  • apps/mobile/src/features/todo/services/todo-category.service.ts
    • Imported ChangeTodoCategoryInput, updateTodoResponseSchema, and TodoItem.
    • Implemented the changeTodoCategory method to handle API requests for updating a todo's category.
  • apps/mobile/src/features/todo/services/todo-nudge.mapper.ts
    • Imported CreateRemindNudgeResponse type.
    • Added toSendRemindNudgeResult mapper function to transform remind nudge API responses.
  • apps/mobile/src/features/todo/services/todo-nudge.service.ts
    • Imported CreateRemindNudgeResponse, createRemindNudgeResponseSchema, and SendRemindNudgeInput.
    • Implemented sendRemindNudge to handle sending remind nudges, including message normalization, validation, and API calls.
    • Implemented getRemindCooldownInfo to retrieve cooldown status for remind nudges.
  • apps/mobile/src/features/user/presentations/components/ProfileInfoCard.tsx
    • Simplified ProfileInfoCard by removing direct navigation props and relying on the parent component for routing, making it more focused on displaying profile info.
  • apps/mobile/src/shared/tests/create-mock-sync-storage.ts
    • Added createMockSyncStorage utility for creating mock implementations of the SyncStorage interface in tests.
  • apps/mobile/src/shared/tests/index.ts
    • Exported createMockSyncStorage from the shared test utilities.
  • apps/mobile/src/shared/analytics/tests/track.test.ts
    • Updated the todo_created event parameters in analytics tests to match the new, more detailed schema.
  • apps/mobile/src/shared/analytics/events/friend.events.ts
    • Added new analytics events: friend_request_accepted, friend_request_rejected, friend_reordered, and remind_nudge_sent.
  • apps/mobile/src/shared/analytics/events/todo.events.ts
    • Updated the todo_created event parameters to include source, is_recurring, has_scheduled_time, is_all_day, and visibility.
    • Added a new category_updated event with a field property to track changes to category name or color.
  • apps/mobile/src/shared/constants/layout.constant.ts
    • Added a LAYOUT constant, specifically tabBarOverlayPadding, to manage layout adjustments for Android tabs.
  • apps/mobile/src/shared/infra/storage/mmkv-storage.ts
    • Refactored mmkvStorage to mmkvSyncStorage and implemented the SyncStorage interface for consistent synchronous storage access.
  • apps/mobile/src/shared/preferences/calendar-view-mode.preference.test.ts
    • Added unit tests for readCalendarViewMode and writeCalendarViewMode to ensure correct persistence and retrieval of calendar view preferences.
  • apps/mobile/src/shared/preferences/calendar-view-mode.preference.ts
    • Defined CalendarViewMode type and utility functions (readCalendarViewMode, writeCalendarViewMode) for persisting the user's preferred calendar view mode.
  • apps/mobile/src/shared/preferences/theme-mode.preference.test.ts
    • Added unit tests for readThemeMode and writeThemeMode to verify the persistence and retrieval of theme mode preferences.
  • apps/mobile/src/shared/preferences/theme-mode.preference.ts
    • Defined ThemeMode type and utility functions (readThemeMode, writeThemeMode) for persisting the user's preferred theme mode.
  • apps/mobile/src/shared/providers/theme-provider.tsx
    • Imported SyncStorage, mmkvSyncStorage, readThemeMode, and writeThemeMode.
    • Modified ThemeProvider to use the new SyncStorage interface for persisting the user's theme mode, improving consistency and testability.
  • apps/mobile/src/shared/ui/SettingNavigation/SettingNavigation.md
    • Added comprehensive documentation for the SettingNavigation compound component, including usage examples and prop descriptions.
  • apps/mobile/src/shared/ui/SettingNavigation/SettingNavigation.test.tsx
    • Added unit tests for the SettingNavigation and SettingNavigation.Item components, verifying rendering and interaction.
  • apps/mobile/src/shared/ui/SettingNavigation/SettingNavigation.tsx
    • Created the SettingNavigation compound component, providing a structured way to group and display settings items.
  • apps/mobile/src/shared/ui/SettingNavigation/index.ts
    • Exported the SettingNavigation component for easy access.
  • apps/mobile/src/shared/ui/index.ts
    • Exported the SettingNavigation component from the main UI index.
  • packages/errors/src/errors.ts
    • Added FOLLOW_0910 error code for when a friend reorder target is not found.
    • Added NUDGE_1107 error code for when a remind nudge is sent to a friend who already has todos.
    • Added NUDGE_1108 error code for when a remind nudge is sent within the cooldown period.
  • packages/validators/src/domains/follow/follow.request.ts
    • Imported reorderPositionSchema.
    • Added reorderFriendSchema for validating friend reordering requests, including targetFollowId and position.
  • packages/validators/src/domains/follow/follow.response.ts
    • Added reorderFriendResponseSchema for validating friend reordering responses, including a success message and the updated friend details.
  • packages/validators/src/domains/nudge/nudge.constants.ts
    • Added REMIND_NUDGE_LIMITS constant, defining COOLDOWN_HOURS and MAX_MESSAGE_LENGTH for remind nudges.
  • packages/validators/src/domains/nudge/nudge.request.ts
    • Added createRemindNudgeSchema for validating remind nudge creation requests, including receiverId and an optional message.
  • packages/validators/src/domains/nudge/nudge.response.ts
    • Added remindNudgeSchema for validating remind nudge entities.
    • Added createRemindNudgeResponseSchema for validating remind nudge creation responses, including a success message and the created remind nudge details.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 PR은 친구 목록 순서 변경, 할일 카테고리 변경, 리마인드 콕 찌르기 등 여러 유용한 기능을 추가하고, 문의하기 화면의 UX를 개선했습니다. 코드베이스 전반에 걸쳐 컴포넌트 재사용성을 높이고, 설정을 영속화하며, 분석 이벤트를 상세화하는 등 중요한 리팩토링이 많이 이루어졌습니다. 특히 드래그 앤 드롭 기능 구현과 상태 관리, 그리고 새로운 기능에 대한 백엔드 지원이 인상적입니다. 한 가지 사소한 점으로, PR 제목 및 설명과 코드 내 버전 번호 간에 불일치가 있어 확인이 필요해 보입니다. 전반적으로 훌륭한 업데이트입니다.

Comment thread apps/mobile/app.config.ts
@dydals3440 dydals3440 merged commit 2fc6ed5 into main Mar 15, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release 🚀 릴리즈 - develop → main 배포 PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants