[Mod/#171] Second QA#173
Open
sonms wants to merge 50 commits into
Open
Conversation
- **패키지 구조 개선**: `DbtiService`, `DbtiRepositoryImpl`, `DbtiDataSource` 등 DBTI 관련 클래스들을 `DBTI` 하위 패키지로 이동하여 구조화
- **인증 로직 수정**:
- `DbtiService` 내 모든 API 엔드포인트(`getQuestions`, `submitResult`, `getResult`)에서 `@Header("Authorization")` 매개변수 제거
- `DbtiDataSource` 및 `DbtiRepositoryImpl`에서 하드코딩된 토큰 전달 로직 삭제
- **의존성 업데이트**: 패키지 위치 변경에 따른 관련 `import` 문 수정
- `DbtiViewModel`: 질문 로드, 옵션 선택, 결과 제출 및 상태 관리(`TestUiState`, `resultUiModel`) 로직 구현 - `DbtiResultUiModel` 및 매퍼: DBTI 결과 데이터를 UI 레이어에서 사용하기 위한 모델 정의 및 엔티티 변환 로직 추가 - `GetDbtiQuestionsUseCase` 및 `SubmitDbtiResultUseCase` 연동을 통한 데이터 흐름 구현
- `TestViewModel` 클래스 및 관련 로직(질문 조회, 옵션 선택, 결과 제출) 제거
- `DbtiRepository`의 위치 변경(`domain.repository` -> `domain.repository.DBTI`)에 따른 UseCase 내 import 문 업데이트 - `GetDbtiQuestionsUseCase` 및 `SubmitDbtiResultUseCase` 내 참조 경로 수정
- `ResultBox.kt` 내부에 정의되어 있던 `TraitAnalysis` 데이터 클래스를 별도 파일(`TraitAnalysis.kt`)로 분리 - `DbtiAnalysisEntity`를 `TraitAnalysis` UI 모델로 변환하는 매퍼 함수(`toUiModel`) 추가
- `DbtiRepositoryImpl`, `DbtiRepository`, `DbtiService`의 패키지 위치 변경(DBTI 하위 디렉토리 이동)에 따라 `RepositoryModule` 및 `ServiceModule` 내 import 경로 업데이트
- `libs.versions.toml`: 주요 라이브러리 버전 업데이트
- `composeBom`: 2026.01.01 -> 2026.03.01
- `datastorePreferences`: 1.1.7 -> 1.2.1
- `naverMapCompose`: 1.8.2 -> 1.9.0
- `app/build.gradle.kts`: `kotlinOptions`를 최신 `compilerOptions` DSL로 변경 및 JVM 타겟 설정 방식 개선
- **DBTI 검사(`TestScreen`)**:
- `DbtiViewModel`로 뷰모델 통합 및 `testUiState` 적용
- 다음 질문 이동 로직에 결과 화면 이동 콜백(`onNavigateToResult`) 추가
- 배경색(`background`) 설정 및 상단 여백 수정
- 문항 텍스트 수정 ("산책 중 다른 강아지를 만나면...")
- **DBTI 결과(`ResultScreen`)**:
- 개별 파라미터(type, name 등) 대신 `DbtiResultUiModel`을 사용하도록 리팩터링
- `TraitAnalysis` 모델 위치 이동 및 관련 UI 데이터 바인딩 로직 수정
- **DBTI 시작(`StartScreen`)**:
- 화면 배경색(`PawKeyTheme.colors.background`) 추가 및 적용
- **기타**:
- 불필요한 import 정리 및 레이아웃 패딩/정렬 보정
- `RegionalManagementScreen`의 불필요한 `modifier` 파라미터 제거 및 `regionId` 파라미터 위치 조정 - `RegionalNavigation` 내 `regionalManagement` 호출 시 사용하지 않는 `modifier` 인자 제거
- **홈 화면**: `HomeBanner` 클릭 시 DBTI 검사 시작 화면으로 이동하는 내비게이션 로직 추가 (`navigateToDbti`)
- **DBTI**:
- `DbtiNavigation` 내 결과 화면(`DbtiResult`) 경로 추가 및 `DbtiViewModel` 공유를 위한 BackStackEntry 처리
- `TestScreen`에서 결과 화면으로 이동하는 로직 및 `ResultScreen` 구현 (재테스트 및 홈 이동 기능 포함)
- `DbtiRepository` 패키지 위치 수정 (`domain.repository.DBTI`)
- **기타**:
- `PawKeyNavHost` 및 `detailNavGraph`에 `navigateUp` 파라미터 추가하여 상세 페이지 내 뒤로가기 로직 개선
- `HomeScreen` 내 배너 영역에 리플 효과가 없는 클릭 이벤트(`noRippleClickable`) 적용
- **마이페이지**:
- 반려동물 DBTI 검사 결과(이름, 설명) 데이터 바인딩 추가 및 결과 유무에 따른 버튼 텍스트 처리
- `MyPageViewModel`에서 `DbtiRepository`를 통해 DBTI 결과 조회 로직 추가
- `MyPageScreen` 하단 여백 및 패딩 구조 수정
- **API**:
- `MypageService` 내 내 경로 조회 API 엔드포인트 수정 (`users/me/routes` -> `users/me/posts`)
- **기타**:
- `MyPageViewModel` 의존성에 `DbtiRepository` 추가 및 프로필/DBTI 정보 병렬 조회 적용
- `DetailScreen`: `TopBar`에 `onBackClick` 콜백을 연동하고, 상단 이미지와 상세 정보 영역의 레이아웃 및 스크롤 구조 개선 - `DetailScreen`: 상단 이미지 `contentScale` 설정 및 반려동물 프로필 이미지에 `Crop` 스케일 적용 - `RouteItem`: 아이템 전체 영역에 리플 효과가 없는 클릭 이벤트(`noRippleClickable`) 추가 - `DogkyFilterBadge`: 클릭 시 리플 효과가 발생하지 않도록 `noRippleClickable` 적용 - `DetailRoute`: `navigateUp` 파라미터 추가 및 `DetailScreen`에 뒤로가기 로직 연결
- **패키지 리팩터링**: `domain.entity.DBTI` 패키지명을 소문자(`dbti`)로 변경하여 컨벤션 준수 및 관련 임포트 경로 수정
- **테스트 로직 개선**:
- `DbtiViewModel` 초기화 시 및 테스트 시작 시(`navigateToTest`) 기존 테스트 상태를 초기화하는 `resetTest()` 호출 추가
- `TestScreen`에서 결과 화면으로 이동 시, 테스트 화면을 스택에서 제거(`popUpTo inclusive`)하도록 내비게이션 옵션 설정
- **결과 화면 내비게이션**: `ResultScreen`의 뒤로가기(`navigateUp`) 동작을 `popBackStack`으로 구체화
- **DetailScreen**:
- 필터 칩 더보기 버튼(`FilterChipDivider`)의 표시 조건을 `hiddenCount > 0`일 때로 제한
- 산책하기 버튼(`DokiButton`)의 활성화 상태를 `routeId` 유효성(-1 여부)에 따라 결정하도록 수정
- **DetailViewModel**:
- 게시물 상세 정보(`fetchDetail`) 로드 후 획득한 `routeId`를 기반으로 리뷰(`fetchTopReview`)를 조회하도록 순서 변경
- `fetchTopReview` 함수에 `routeId` 파라미터 추가
- **DetailNavigation**: `navigateToSharedCourse` 호출 시 로깅 추가 및 파라미터 명칭 수정 (routeId -> infoRouteId)
- `MyPageState`에 `dbtiType` 필드 추가 - `MyPageViewModel`에서 DBTI 상세 조회 성공 시 `dbtiType` 상태를 업데이트하도록 로직 수정 - `MyPageScreen`의 DBTI 버튼 텍스트 형식을 기존 '이름 | 설명'에서 '타입 | 이름'으로 변경 (예: ENFP | 활동적인 강아지)
- **RegionViewModel**: 지도에서 지역 확정 시 검색 단계로 전환하는 `confirmRegionOnMap` 메서드 추가 및 지역 수정 성공 시 다음 화면으로 이동하도록 로직 개선
- **RegionalManagementScreen**:
- `RegionStep`(SEARCH, MAP)에 따른 화면 렌더링 로직을 `when` 문으로 구조화
- 기존 `PawkeyButton`을 `DokiButton` 및 `DokiBorderButton`으로 교체
- 불필요한 `navigateDbtiStart` 파라미터 제거 및 `navigateNext`와 통합
- **RegionSearchScreen**:
- 지역 선택 여부에 따라 버튼 텍스트를 "수정하기"에서 "저장하기"로 동적 변경하도록 수정
- 하단 여백 조절을 위한 `Spacer` 추가 및 저장 클릭 이벤트(`onSaveRegionClick`) 연동
- **Navigation**: `regionalNavGraph`에서 사용하지 않는 내비게이션 파라미터 정리 및 주석 추가
- `SignUpSideEffect` 내 `NavigateHome`을 `NavigateDBTI`로 변경 및 `isSignUp` 파라미터 추가 - `SignUpViewModel`에서 회원가입 성공 시 홈 대신 DBTI 화면으로 이동하도록 수정 - `SignUpNavigation` 및 `SignUpScreen`의 내비게이션 콜백 파라미터를 `navigateToHome`에서 `navigateToDBTI`로 변경 - `SignUpScreen` 내 불필요한 로그(`Timber`) 및 미사용 코드(URI 변환 등) 제거
- **ResultScreen**:
- 결과 화면에 스크롤(`verticalScroll`) 기능을 추가하고 레이아웃 구조 개선
- 하단 버튼 영역을 고정하고 중앙 콘텐츠 영역에 `weight` 및 `Arrangement` 조정
- **TestScreen**:
- 하드코딩된 `weight` 기반 레이아웃을 `Spacer`와 고정 높이(`height`) 기반으로 변경하여 UI 안정성 확보
- `Preview` 어노테이션을 `PreviewScreenSizes`로 변경하여 다양한 기기 대응 확인
- 불필요한 `Box` 중첩 제거 및 전반적인 컴포넌트 배치 최적화
- **도메인 모델 및 유스케이스**:
- DBTI 관련 엔티티의 패키지 경로 수정 (`DBTI` -> `dbti` 소문자 변경으로 인한 임포트 경로 업데이트)
- `WalkCourseScreen`: `isShared` 상태에 따라 지도 카메라가 경로 전체를 포커싱하는 애니메이션 및 패딩 로직 수정 - `WalkCourseViewModel`: 경로 좌표 조회 시 `isShared` 상태를 업데이트하도록 변경하고, 위치 데이터 저장 시 `routeId` 널 체크 추가 - `WalkCourseNavigation` & `WalkCourseRoute`: `routeId`를 선택적 파라미터(Nullable)로 변경하여 유연성 확보 - `WalkCourseContract`: UI 상태 모델(`WalkCourseState`)에 `isShared` 필드 추가
- `PawKeyNavHost`:
- 상세 페이지에서 산책 경로 이동 시 `routeId` 대신 `infoRouteId`를 사용하도록 변경
- 지역 설정(`regionalNavGraph`) 완료 후 이동 대상을 홈에서 마이페이지로 변경 및 DBTI 시작 로직 제거
- 회원가입(`signUpNavGraph`) 완료 후 이동 대상을 홈에서 DBTI 시작 화면으로 변경
- `MainNavigator`: `navigateWalkCourse` 호출 시 `routeId`(String)와 `infoRouteId`(Int)를 모두 지원하도록 파라미터 확장 및 옵셔널 처리
- `libs.versions.toml` 내 `kakaoMaps` 버전 및 라이브러리 선언 삭제 - `app/build.gradle.kts` 내 `kakaoMaps` 라이브러리 의존성 제거
- **게시물 상세(`DetailScreen`)**:
- 게시물 삭제를 위한 `onDeletePosts` 콜백 추가 및 `DokiDeleteButton`에 연결
- `UrlImage` 컴포넌트에 `isUserIcon` 속성 적용
- `navigateToSharedCourse` 호출 시 `postId` 및 `userId` 파라미터 전달하도록 수정
- `DetailTopReview` 관련 코드 일시적 주석 처리
- **ViewModel 및 Contract**:
- `DetailViewModel`에 게시물 삭제 로직(`removePosts`) 추가 및 `DetailSideEffect` 정의
- 삭제 성공 시 커뮤니티 화면으로 이동하도록 `navigateToCommunity` 사이드 이펙트 처리
- `savedStateHandle`에서 `routeId` 추출 로직 추가
- **내비게이션**:
- `Detail` 내비게이션 대상에 `routeId` 파라미터 추가
- `navigateDetail` 및 `detailNavGraph`에서 `postId`, `userId` 등 관련 파라미터 구조 확장 및 전달 로직 수정
- 리뷰 관련 도메인 엔티티(`ReviewEntity`, `ReviewHeaderEntity`) 추가 - 리뷰 작성(`postReview`) 및 리뷰 헤더 조회(`getReviewHeader`) API 인터페이스 정의 - `ReviewsRepository` 및 `ReviewsDataSource` 구현을 통한 데이터 레이어 구축 - API 요청/응답을 위한 DTO(`ReviewRequestDto`, `ReviewHeaderResponseDto`) 및 엔티티 매퍼 추가 - `RepositoryModule`에 `ReviewsRepository` 의존성 바인딩 설정
- **산책 기록(WalkCourse)**:
- 공유 경로 산책 시 작성자 및 리뷰 전송에 필요한 `postId`, `userId` 파라미터 추가
- `WalkCourseViewModel`에서 공유 경로 산책 종료 시 `NavigateSharedReview` 사이드 이펙트를 발생시키도록 수정
- 산책 종료 엔티티(`WalkFinish`) 변환 시 `duration` 단위를 밀리초에서 분(Minutes)으로 변경
- 내 위치 표시 아이콘(`user_poi`) 크기 조정 (36 -> 72)
- **리뷰(WalkReview)**:
- 공유 경로 리뷰 화면을 위한 `WalkSharedReviewHeader` 컴포넌트 추가
- 공유 경로 리뷰용 UI 모델(`WalkSharedReviewUiModel`) 및 엔티티 매퍼 함수 정의
- `WalkCourseSideEffect`에 공유 경로 전용 내비게이션 액션(`NavigateSharedReview`) 추가
- **내비게이션**:
- `WalkCourseGraph` 및 관련 내비게이션 함수에 공유 리뷰 이동을 위한 파라미터(`routeId`, `isShared`, `postId`, `userId`) 확장 반영
- **리뷰 작성 및 공유 로직**:
- `WalkReviewViewModel` 내 공유 리뷰 등록(`completeSharedReview`) 및 리뷰 헤더 정보 조회(`fetchReviews`) 기능 추가
- 게시물 등록(`postPosts`) 성공 시 반환된 ID 정보를 `CompletePostsUiModel`을 통해 상태에 저장하도록 개선
- 공유 상태(`isShared`) 여부에 따라 필터 선택 시 `SelectedReviewSetUiModel`을 동기화하는 로직 추가
- **UI 및 컴포넌트**:
- `WalkReviewScreen`: 공유 모드일 때 이미지 행 대신 `WalkSharedReviewHeader`를 표시하고, 하단 버튼 구성을 "산책 후기 남기기"로 변경
- 공유 상태에 따라 후기 제목 및 내용 입력란을 숨기거나 버튼 텍스트를 분기 처리
- `WalkReviewDialog`: 공유 완료 여부에 따른 대응을 위해 `isShared` 파라미터 추가
- **내비게이션 및 상태**:
- `WalkReview` 내비게이션 파라미터 확장 (`isShared`, `postId`, `userId` 추가)
- `WalkReviewState`: 공유 여부, 공유 리뷰 헤더 모델, 완료 후 이동을 위한 `completePostsUiModel` 필드 추가
- `walkReviewNavGraph` 내 `navigateWalkDetail` 콜백에 `postId`, `routeId` 파라미터 전달 로직 적용
- **도메인 연동**:
- `ReviewsRepository` 주입 및 관련 API(리뷰 헤더 조회, 리뷰 등록) 연동 기초 작업 수행
- **WalkComplete**:
- 네이버 지도 `uiSettings` 변경 (로고 위치를 우상단으로 조정, 줌 컨트롤 비활성화, 로고 클릭 활성화)
- 프로필 이미지 컴포넌트에 `isUserIcon = true` 속성 추가
- **WalkCompleteViewModel**: `finishResultUseCase` 및 `finishWalkInfoUseCase` 데이터 수집 시 디버깅을 위한 Timber 로그 추가
- **CompletePostsUiModel**: 게시물 작성 결과 정보를 관리하기 위한 UI 모델 및 매퍼 함수(`toUiModel`) 추가
- **회원가입**:
- `SignUpViewModel`: 반려견 정보 입력 시 이미지 필수 조건을 제거하고, 기본 이미지 ID를 수정(`-1` -> `0`)
- `SignUpMapInfoScreen`: 네이버 지도 UI 설정 추가(로고 위치 조정, 줌 컨트롤 비활성화)
- `SignUpViewModel`: 임시 이미지 URI 생성 로직의 로그 제거 및 가독성 개선
- **UI 컴포넌트**:
- `UriImage`: 사용자 아이콘 여부에 따른 기본 프로필 이미지(`img_default_user`) 표시 로직 추가
- `MypageCard`: 프로필 이미지 로드 실패 시 기본 사용자 아이콘이 표시되도록 설정 추가
- `PawKeyApplication`에서 `KakaoMapSdk.init` 호출 및 관련 import 제거 - Naver Map으로의 지도 라이브러리 단일화에 따른 불필요한 의존성 정리
- **게시물 관리**:
- `PostsService`, `PostsDataSource`, `PostsRepository`에 게시물 삭제 API(`deletePosts`) 연동
- `PostsRepositoryImpl`에 삭제 로직에 대한 `suspendRunCatching` 적용
- **회원가입**:
- `PostCreateUserUseCase` 내 반려견 이미지 ID 기본값을 `-1`에서 `0`으로 수정
- `SharedWalkService`를 삭제하고 관련 기능을 담당할 `ReviewsService` 추가 및 서비스 모듈 연동 - `NetworkModule` 내 `baseUrl` 설정을 `DEBUG_BASE_URL` 대신 `BASE_URL`을 우선 사용하도록 수정 - 기본 사용자 프로필 이미지(`img_default_user.png`) 리소스 추가
- **내비게이션**:
- `MainNavigator` 및 `PawKeyNavHost` 내 `navigateDetail`, `navigateWalkCourse`, `navigateWalkReview` 호출 시 `postId`, `userId`, `routeId` 등 전달 파라미터 추가
- `walkCourseGraph`에서 리뷰 화면 이동 시 `WalkReview` 경로까지 `popUpTo` 및 `inclusive` 설정을 적용하여 백스택 관리 로직 개선
- `walkReviewNavGraph`에서 상세 페이지로의 이동(`navigateWalkDetail`) 로직 구현
- **UI 및 지도 설정**:
- `RegionalManagementScreen` 내 네이버지도 UI 설정(`MapUiSettings`) 추가: 로고 위치 조정, 줌 컨트롤 비활성화, 로고 클릭 활성화
- `MyPageScreen` 내 DBTI 검사 버튼 문구 띄어쓰기 수정
- **기타**:
- `detailNavGraph`의 `navigateToSharedCourse` 콜백 파라미터에 `postId`, `userId` 추가 및 연동
- **산책 기록 (`WalkCourseScreen`)**: 기록 중이며 일시정지 상태가 아닐 때 화면이 꺼지지 않도록 `Modifier.keepScreenOn()` 적용 - **마이페이지 (`CourseInfoScreen`)**: `MyReviewCard`에 전달하는 데이터를 제목 단일 필드에서 전체 객체(`course`)로 변경 - **데이터 모델 (`CourseData`)**: `CourseData`의 각 필드에 기본값 추가 및 날짜 매핑 로직 수정 - **유틸리티**: ISO 날짜 형식을 "yyyy.MM.dd | 오전/오후 hh:mm" 패턴으로 변환하는 `formatDateTime` 함수 추가 및 적용
- `WalkSharedReviewHeader`: 제목(`postTitle`)에 좌측 패딩 추가 및 하단 구분선(`HorizontalDivider`)의 불필요한 가로 패딩 제거 - `WalkReviewScreen`: `WalkSharedReviewHeader` 호출 시 중복된 패딩 설정 제거 - `WalkReviewDialog`: 사용하지 않는 `isShared` 매개변수 제거 및 관련 로직 정리
- `ReviewsService` 내 `postReview` API의 반환 타입을 `BaseResponse<String>`에서 `Response<Unit>`으로 변경 - `ReviewsRepository` 및 `ReviewsRepositoryImpl`의 `postReview` 메서드 반환 타입을 `Result<Unit>`으로 수정 - 리뷰 등록 성공 시 별도의 데이터 반환 없이 성공 여부만 전달하도록 로직 개선
- `RegionViewModel`: `patchRegion` 호출 시 `userId` 파라미터 제거 및 실행 단계별 디버깅용 로그 추가 - `RegionCurrentRepository`, `RegionCurrentDataSource`: `regionCurrent` 메서드에서 불필요한 `userId` 매개변수 삭제 - `RegionCurrentRepositoryImpl`: 인터페이스 변경에 따른 `regionCurrent` 구현부 수정 및 데이터 소스 연동 로직 업데이트
- `HomeRegionService` 내 지역 수정(`patchRegion`) 및 현재 지역 조회(`regionCurrent`) API에서 불필요한 `userId` 헤더 제거 - `patchRegion` API의 반환 타입을 `BaseResponse<Unit?>`에서 `Response<Unit>`으로 변경 - `HomeRepository` 및 관련 구현체(`HomeRegionRepositoryImpl`)의 `patchRegion` 파라미터에서 `userId` 제거 및 반환 타입을 `Result<Unit>`으로 수정 - 사용하지 않는 엔티티 `HomeRegionDataEntity` 제거 및 `suspendRunCatching` 적용을 통한 예외 처리 개선
- `MyReviewCard`에서 정적 텍스트 대신 `CourseData` 모델의 데이터를 바인딩하도록 수정 - 리뷰의 카테고리 옵션 리스트를 표시하기 위한 `FlowRow` 및 `SubChip` 적용 - 카테고리 옵션이 많을 경우 5개까지만 노출하고, 나머지는 더보기(`FilterChipDivider`)를 통해 펼칠 수 있는 접기/펼치기 기능 추가 - 리뷰 작성일 표시를 위한 날짜 포맷팅 함수(`formatDateTime`) 적용 - 불필요한 기존 컴포넌트(`ReviewAdditionArea`, `ReviewChip`) 삭제 및 UI 레이아웃 조정
- `CourseInfoScreen` 및 `CourseInfoRoute`에 상세 페이지 이동을 위한 `navigateToDetail` 콜백 추가 - 코스 아이템 클릭 시 해당 게시글 상세 화면으로 이동하도록 이벤트 연결 - `CourseData` 매퍼에서 날짜 문자열 포맷 수정 (ISO 형식을 `YYYY/MM/DD` 형태로 변환) - `CourseInfoNavigation` 내비게이션 그래프에 `navigateToDetail` 파라미터 추가 및 전달 로직 반영
- **DetailScreen**: 게시물 삭제 시 즉시 삭제 대신 `DokiDialog`를 호출하여 사용자 확인 절차 추가 - **PawKeyNavHost**: `courseInfoNavGraph` 내 상세 페이지 이동(`navigateToDetail`)을 위한 내비게이션 로직 추가 및 연동
- `deletePosts` API의 반환 타입을 `Response<Unit>`에서 `Unit`으로 변경 - 불필요한 `retrofit2.Response` 임포트 제거
- `CourseInfoViewModel`의 `fetchCourses` 호출 시점을 `init` 블록에서 `CourseInfoScreen`의 `LaunchedEffect`로 변경 - `CourseInfoScreen`에서 `collectSideEffect` 확장 함수를 사용하여 사이드 이펙트 처리 로직 최적화 - `CourseInfoScreen` 로딩 인디케이터(`CircularProgressIndicator`)에 테마 컬러(`primary`) 적용
- **로그인 (`LoginViewModel`)**:
- 소셜 로그인 성공 시 `isNewUser` 결과와 로컬에 저장된 `petId`를 확인하는 로직 추가
- 신규 사용자이거나 `petId`가 없는 경우(`-1`) 회원가입/온보딩 화면으로 이동하도록 수정
- **스플래시 (`SplashViewModel`, `SplashScreen`)**:
- 토큰 갱신 성공 시 `petId` 존재 여부를 확인하여 홈 또는 회원가입 화면으로 분기 처리
- `SplashSideEffect` 및 내비게이션 경로에 `NavigateToSignUp` 추가
- **내비게이션 (`PawKeyNavHost`)**:
- `SplashRoute` 및 `PawKeyNavHost`에 회원가입 화면 이동 콜백(`navigateToSignUp`) 연동 및 구현
- **게시물 수정**:
- `DetailEditScreen` 및 `DetailEditState`를 추가하여 게시물 수정 UI와 관리 로직 구현
- `DetailViewModel` 내 기존 데이터를 편집 상태로 변환하는 `initEditState` 및 수정 API 연동(`submitEdit`) 로직 추가
- 이미지 추가/삭제, 필터 선택, 제목/본문 입력 등 편집 기능 구현
- **상세 페이지 및 UI 개선**:
- `DetailViewType`을 정의하여 상세 보기와 수정 모드 간 화면 전환 로직 적용
- `DetailImageHolder`에 이미지 클릭 이벤트를 추가하고, 클릭 시 `ImageModal`을 통해 원본 이미지를 볼 수 있도록 개선
- `DateDataVisualTransformation`을 추가하여 날짜 입력 형식(YYYY-MM-DD) 처리
- **기타**:
- `AndroidManifest.xml`에서 불필요한 `READ_MEDIA_IMAGES` 권한 및 중복된 Kakao AppKey 설정 제거
- 상세 페이지 내 '수정하기' 버튼 클릭 이벤트 연결 및 삭제 다이얼로그 연동 유지
- `MypageService`: 사용자 정보 수정 엔드포인트 변경 (`users/me` -> `users`)
- `MypageService`: 반려동물 정보 수정 API를 경로 변수 방식으로 변경 (`pets/me` -> `pets/{petId}`)
- `updateUser` 및 `updatePet` API의 반환 타입을 `BaseResponse<Unit>`에서 `Response<Unit>`으로 변경
- `MypageRepository`, `MypageDataSource` 및 구현체 내 반려동물 수정 함수에 `petId` 파라미터 추가
- `MypageDataSourceImpl` 패키지 경로 정리 및 인터페이스 수정 사항 반영
- **데이터 및 도메인**:
- `LoginResponseDto`에 `userId` 및 `petId` 필드 추가
- `LoginUseCase`에서 로그인 성공 시 전달받은 `userId`와 `petId`를 `localStorageRepository`에 저장하도록 로직 수정
- **로그인 로직 및 UI**:
- `LoginViewModel`에서 구글/카카오 로그인 실패 시 `isLoading` 상태를 `false`로 변경하고 에러 메시지(`ShowSnackBar`)를 송출하도록 개선
- `LoginScreen`에서 `ShowSnackBar` 사이드 이펙트 발생 시 `Toast` 메시지를 표시하도록 구현
- `LoginScreen` 내 불필요한 `SnackbarHostState` 임포트 제거
- **마이페이지**:
- `MyPageViewModel`의 `init` 블록에서 수행하던 데이터 로드(`getUserProfiles`, `getPetProfiles`)를 `MyPageScreen`의 `LaunchedEffect`로 이동
- `MyPageCard`에 반려동물 상세 페이지로 이동할 수 있는 `navigatePetProfile` 클릭 이벤트(noRippleClickable) 추가
- `MyPageProfile` 컴포넌트 내 `UrlImage`의 URL null 안정성 처리 추가 (`image ?: ""`)
- **반려견 프로필 수정**:
- `PetProfileViewModel`을 `presentation.ui.mypage.route.petinfo` 패키지로 이동 및 기존 파일 삭제
- 프로필 수정 시 `petId` 파라미터 추가 및 생년월일 입력 로직(숫자만 추출) 개선
- 품종 리스트 조회(`fetchPetBreedInfo`) 및 선택 로직 연동
- 카메라 촬영을 위한 `ImageUriManager` 연동 및 `cameraUri` 상태 관리 추가
- **UI 및 UX 개선**:
- `PetProfileScreen`: 프로필 이미지 클릭 시 이미지 선택 다이얼로그(`ImageTypeSelectDialog`) 표시
- 생년월일 입력 필드에 `DateDataVisualTransformation` 적용 및 플레이스홀더 수정
- 카메라 권한 요청 및 촬영 결과 처리 로직 추가
- `collectSideEffect` 확장 함수를 통한 사이드 이펙트 처리 방식 통일
- **데이터 모델**:
- `PetProfileEntity`, `PetInfoModel`, `PetProfileResponseDto` 내 `imageUrl` 타입을 Nullable로 변경
- `PetInfoEntity`, `PetInfoRequestDto` 내 `imageId` 타입을 Nullable로 변경
- `PetProfileState`에 `cameraUri`, `petBreedList` 필드 추가 및 `Gender` 초기값 변경 (`MALE` -> `UNKNOWN`)
- **게시물 수정 기능 구현**:
- `PostsService` 및 `PostsDataSource`에 게시물 수정을 위한 `patchPosts` API 연동
- `PostsRepository`에 `editPosts` 메서드 추가 및 구현
- 게시물 수정 요청을 위한 `PostsEditRequestDto` 및 매퍼 함수(`toEditDto`) 추가
- **도메인 로직 수정**:
- `PostCreateUserUseCase`: 반려동물 이미지 ID 처리 로직 개선 (null 허용 및 기본값 0 제거)
- **기타**:
- `RepositoryModule`: 패키지 구조 변경에 따른 `MypageDataSourceImpl` import 경로 수정
- **WalkCourseScreen**: `DisposableEffect`를 통해 컴포넌트 파괴(`ON_DESTROY`) 시 산책 기록이 진행 중이면 자동으로 트래킹을 종료하도록 로직 추가
- **WalkCourseViewModel**:
- `stopTracking` 내 트래킹 종료 및 API 요청 로직을 `NonCancellable` 컨텍스트로 감싸 프로세스 종료 시에도 안정적으로 수행되도록 개선
- 시간 기록 단위를 `LocalDateTime`에서 `Instant` 기반 ISO-8601 형식으로 변경
- 패키지 위치 이동 (`com.paw.key.presentation.ui.course.walkcourse.viewmodel` -> `com.paw.key.presentation.ui.course.walkcourse`)
- **WalkCourseContract**: 산책 종료 엔티티 변환 시 산책 시간(`duration`)이 0분으로 계산되는 경우 최소 1분으로 보정하는 로직 추가
- **기타**: 네이버 지도 `ArrowheadPathOverlay` 컴포넌트 추가 및 불필요한 로그 출력 제거
- **사용자 프로필**:
- 생년월일 입력 시 숫자만 추출하도록 `NON_DIGIT_REGEX` 적용 및 8자리 제한 로직 추가
- `DateDataVisualTransformation`을 적용하여 생년월일 입력 UI 포맷팅 개선
- 프로필 수정 시 날짜 형식을 서버 규격(`YYYY-MM-DD`)에 맞게 변환하는 로직 추가
- 성별 데이터를 서버 통신 규격(`M`/`F`)에 맞춰 매핑하도록 수정
- 프로필 로드 및 수정 실패 시 `Timber` 로그 출력 추가 및 불필요한 성공 스낵바 제거
- **커뮤니티**:
- `CommunityScreen` 내 리스트 하단 도달 시 추가 데이터 로드(`onLoadMore`) 호출 로직 보정 및 로그 추가
- 사용하지 않는 `selectedFilters` 변수 제거
- **기타**:
- `NON_DIGIT_REGEX` 공통 상수 추가
- `PawKeyApplication` 및 `MainNavigator` 내 불필요한 주석 정리 및 코드 가독성 개선
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ISSUE
❗ WORK DESCRIPTIONAdd commentMore actions
📢 TO REVIEWERS