Skip to content

feature/#44#105

Open
ugmin1030 wants to merge 9 commits intodevelopfrom
feature/#44
Open

feature/#44#105
ugmin1030 wants to merge 9 commits intodevelopfrom
feature/#44

Conversation

@ugmin1030
Copy link
Copy Markdown
Collaborator

@ugmin1030 ugmin1030 commented Mar 30, 2026

📝 설명

해당 PR이 진행한 사항을 자세히 적어주세요.

✔️ PR 유형

어떤 변경 사항이 있나요?

  • 새로운 기능 추가
  • 버그 수정
  • CSS 등 사용자 UI 디자인 변경
  • 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 테스트 추가, 테스트 리팩토링
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

📎 관련 이슈 번호

해당 PR과 관련된 이슈 번호를 적어주세요.

Summary by CodeRabbit

릴리스 노트

  • 리팩토링
    • 모달 대화창 컴포넌트를 통합하여 UI 일관성을 개선했습니다.
    • 테마 시스템을 최적화하여 색상 및 폰트 관리 효율성을 향상했습니다.

- `FileModalWindow`를 `ModalWindow`로 이름을 변경하고 `feature/file` 모듈에서 `design` 모듈의 공통 컴포넌트로 이동
- `White`, `Black`, `MainColor` 등 로컬 테마 의존성을 `Basic.white`, `Basic.maincolor` 등 공통 디자인 시스템 테마(`Basic`)로 교체
- 하드코딩된 `DefaultFont` 대신 `LocalFontTheme.current.font`를 사용하도록 수정하여 테마 확장성 개선
- 패키지 경로 변경(`com.example.file.ui.modal` -> `com.example.design.modal`) 및 미사용 import 정리
- 프리뷰 함수명을 `ModalWindowTest`로 업데이트하고 변경된 디자인 시스템 파라미터 반영
- `PreviewDeleteLinkModal` 함수의 가시성을 `private`으로 변경하여 외부 노출 제한 및 캡슐화 강화
- `ModalWindow` 컴포넌트의 역할 및 사용법에 대한 상세 설명을 담은 KDoc 추가
- `visible`, `onOkay`, `onDismiss` 등 각 파라미터의 기능 및 역할 정의 명시
- `negativeText` 값의 유무에 따른 취소 버튼 활성화 로직 설명 보완
- `@see` 태그를 통해 관련 있는 `androidx.compose.ui.window.Dialog` 참조 정보 제공
- `setContent` 블록 내 `FileApp`을 `ThemeProvider`로 감싸 전체 UI에 테마 스타일이 적용되도록 수정
- 테마 적용을 위한 `ThemeProvider` import 추가
- `LocalColorTheme` 및 `LocalFontTheme`을 `staticCompositionLocalOf`로 변경하여 성능 최적화
- `MaterialTheme.linkuColors` 및 `MaterialTheme.linkuFont` 확장 프로퍼티를 추가하여 커스텀 테마 데이터 접근 방식 통일
- `ThemeProvider` 내 `typography` 생성 로직을 변수로 추출하여 `MaterialTheme` 선언부 가독성 개선
- 불필요한 주석 코드 제거 및 코드 포맷 정리
- `content`를 trailing lambda 내에서 호출하던 방식을 `content` 파라미터에 직접 전달하는 방식으로 변경
- 불필요한 람다 블록 및 `content.invoke()` 호출 제거 (주석 처리)
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 30, 2026

Important

Review skipped

Too many files!

This PR contains 297 files, which is 147 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 11ef2451-ff54-4542-b36d-b49ddc360ec0

📥 Commits

Reviewing files that changed from the base of the PR and between fd21dfa and 37e2a04.

⛔ Files ignored due to path filters (2)
  • feature/file/src/main/res/drawable/img_shared_bottom_sheet_folder_background.png is excluded by !**/*.png
  • feature/file/src/main/res/drawable/img_shared_bottom_sheet_folder_mask.png is excluded by !**/*.png
📒 Files selected for processing (297)
  • app/build.gradle.kts
  • app/google-services.json
  • app/release/output-metadata.json
  • app/src/androidTest/java/com/example/linku_android/ExampleInstrumentedTest.kt
  • app/src/androidTest/java/com/linku/ExampleInstrumentedTest.kt
  • app/src/androidTest/java/com/linku/link/ExampleInstrumentedTest.kt
  • app/src/main/java/com/linku/MainActivity.kt
  • app/src/main/java/com/linku/MainApp.kt
  • app/src/main/java/com/linku/MainApplication.kt
  • app/src/main/java/com/linku/MainScreen.kt
  • app/src/main/java/com/linku/MainViewModel.kt
  • app/src/main/java/com/linku/NavigationDestination.kt
  • app/src/main/java/com/linku/Splash.kt
  • app/src/main/java/com/linku/component/LinkuNavigationBar.kt
  • app/src/main/java/com/linku/component/LinkuNavigationBarFAB.kt
  • app/src/main/java/com/linku/component/ShadowedImage.kt
  • app/src/main/java/com/linku/deeplink/DeepLinkHandlerViewModel.kt
  • app/src/main/java/com/linku/deeplink/SocialDeepLinkBus.kt
  • app/src/main/java/com/linku/deeplink/SocialDeepLinkHandler.kt
  • app/src/main/java/com/linku/deeplink/SocialLoginData.kt
  • app/src/main/java/com/linku/deeplink/appLinkRoute.kt
  • app/src/main/java/com/linku/navigation/BackHandlers.kt
  • app/src/main/java/com/linku/navigation/DoubleBackToExitIfTop.kt
  • app/src/main/java/com/linku/navigation/LinkuNavigationItem.kt
  • app/src/test/java/com/example/linku_android/ExampleUnitTest.kt
  • app/src/test/java/com/linku/ExampleUnitTest.kt
  • app/src/test/java/com/linku/link/ExampleUnitTest.kt
  • core/build.gradle.kts
  • core/src/androidTest/java/com/linku/core/ExampleInstrumentedTest.kt
  • core/src/main/java/com/linku/core/error/SameNameException.kt
  • core/src/main/java/com/linku/core/error/TokenExpiredException.kt
  • core/src/main/java/com/linku/core/error/UserIdNullException.kt
  • core/src/main/java/com/linku/core/model/AiArticle.kt
  • core/src/main/java/com/linku/core/model/CategoryColorList.kt
  • core/src/main/java/com/linku/core/model/CategoryType.kt
  • core/src/main/java/com/linku/core/model/CurationDetail.kt
  • core/src/main/java/com/linku/core/model/CurationItem.kt
  • core/src/main/java/com/linku/core/model/EmotionType.kt
  • core/src/main/java/com/linku/core/model/FolderInfo.kt
  • core/src/main/java/com/linku/core/model/FolderPermission.kt
  • core/src/main/java/com/linku/core/model/FolderPermissionInfo.kt
  • core/src/main/java/com/linku/core/model/FolderSimpleInfo.kt
  • core/src/main/java/com/linku/core/model/LinkItemInfo.kt
  • core/src/main/java/com/linku/core/model/LinkResultInfo.kt
  • core/src/main/java/com/linku/core/model/LinkSimpleInfo.kt
  • core/src/main/java/com/linku/core/model/LoginResult.kt
  • core/src/main/java/com/linku/core/model/RecommendedLink.kt
  • core/src/main/java/com/linku/core/model/SharedFolderInfo.kt
  • core/src/main/java/com/linku/core/model/SharedFolderSimpleInfo.kt
  • core/src/main/java/com/linku/core/model/SystemBarMode.kt
  • core/src/main/java/com/linku/core/model/TokenReissueResult.kt
  • core/src/main/java/com/linku/core/model/UserInfo.kt
  • core/src/main/java/com/linku/core/model/auth/EmailAuthState.kt
  • core/src/main/java/com/linku/core/model/auth/Gender.kt
  • core/src/main/java/com/linku/core/model/auth/Interest.kt
  • core/src/main/java/com/linku/core/model/auth/Job.kt
  • core/src/main/java/com/linku/core/model/auth/LoginState.kt
  • core/src/main/java/com/linku/core/model/auth/Purpose.kt
  • core/src/main/java/com/linku/core/model/auth/SignUpForm.kt
  • core/src/main/java/com/linku/core/model/auth/SignUpState.kt
  • core/src/main/java/com/linku/core/model/auth/SocialLoginData.kt
  • core/src/main/java/com/linku/core/model/auth/SocialLoginEvent.kt
  • core/src/main/java/com/linku/core/model/search/FastSearchLinkInfo.kt
  • core/src/main/java/com/linku/core/model/search/RecentQuery.kt
  • core/src/main/java/com/linku/core/repository/AIArticleRepository.kt
  • core/src/main/java/com/linku/core/repository/CategoryRepository.kt
  • core/src/main/java/com/linku/core/repository/CurationRepository.kt
  • core/src/main/java/com/linku/core/repository/FolderRepository.kt
  • core/src/main/java/com/linku/core/repository/LinkuRepository.kt
  • core/src/main/java/com/linku/core/repository/RecentSearchRepository.kt
  • core/src/main/java/com/linku/core/repository/UserRepository.kt
  • core/src/main/java/com/linku/core/session/SessionStore.kt
  • core/src/main/java/com/linku/core/system/SystemBarController.kt
  • core/src/main/java/com/linku/core/util/UrlUtils.kt
  • core/src/test/java/com/linku/core/ExampleUnitTest.kt
  • data/build.gradle.kts
  • data/src/androidTest/java/com/linku/data/ExampleInstrumentedTest.kt
  • data/src/main/java/com/linku/data/api/AIArticleApi.kt
  • data/src/main/java/com/linku/data/api/CategoryApi.kt
  • data/src/main/java/com/linku/data/api/CurationApi.kt
  • data/src/main/java/com/linku/data/api/FolderApi.kt
  • data/src/main/java/com/linku/data/api/LinkuApi.kt
  • data/src/main/java/com/linku/data/api/RefreshApi.kt
  • data/src/main/java/com/linku/data/api/ServerApi.kt
  • data/src/main/java/com/linku/data/api/ServerApiExt.kt
  • data/src/main/java/com/linku/data/api/UserApi.kt
  • data/src/main/java/com/linku/data/api/dto/BaseEmptyResponse.kt
  • data/src/main/java/com/linku/data/api/dto/BaseResponse.kt
  • data/src/main/java/com/linku/data/api/dto/RefreshApi.kt
  • data/src/main/java/com/linku/data/api/dto/server/AiArticleResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseAiArticleResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseEmailVerificationResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseJoinResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseLinkuIsExistDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseLinkuResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseListLinkuSimpleDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseLoginResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseQuickSearchResult.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseString.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseUserInfoDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ApiResponseWithDrawalResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/CategoryColorListResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/CurationDetailResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/CurationLatestResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/CurationLikeStatusResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/DeleteReasonDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/EmailVerificationResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/EmptyResponseDto.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderCreateRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderListResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderPermissionRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderTreeResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/FolderUpdateRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/GetDetailLinkDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/GetParentFoldersDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/GetSharedFoldersDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/JoinDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/JoinResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LikedCurationResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinkDetailDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinksFoldersResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinkuIsExistDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinkuResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinkuSimpleDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LinkuUpdateDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LoginRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/LoginResultDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/QuickSearchResult.kt
  • data/src/main/java/com/linku/data/api/dto/server/RecommendLinksResponse.kt
  • data/src/main/java/com/linku/data/api/dto/server/RefreshDtos.kt
  • data/src/main/java/com/linku/data/api/dto/server/ShareFolderResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/SocialProfileRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/TempPasswordRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UpdateBookmarkRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UpdateBookmarkResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UpdateCategoryColorRequestDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UpdateLinkFolderDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UpdateProfileDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UserCategoryColorResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/UserInfoDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/ViewerResponseDTO.kt
  • data/src/main/java/com/linku/data/api/dto/server/withDrawalResultDTO.kt
  • data/src/main/java/com/linku/data/di/api/CurationApiModule.kt
  • data/src/main/java/com/linku/data/di/api/ServerApiModule.kt
  • data/src/main/java/com/linku/data/di/preference/AuthPreferenceModule.kt
  • data/src/main/java/com/linku/data/di/repository/AIArticleRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/CategoryRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/CurationRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/FolderRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/GsonModule.kt
  • data/src/main/java/com/linku/data/di/repository/LinkuRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/MoshiModule.kt
  • data/src/main/java/com/linku/data/di/repository/RecentSearchRepositoryModule.kt
  • data/src/main/java/com/linku/data/di/repository/RepositoryModule.kt
  • data/src/main/java/com/linku/data/implementation/preference/AuthPreferenceImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/AIArticleRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/CategoryRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/CurationRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/FolderRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/LinkuRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/RecentSearchRepositoryImpl.kt
  • data/src/main/java/com/linku/data/implementation/repository/UserRepositoryImpl.kt
  • data/src/main/java/com/linku/data/mapper/SocialProfileMapper.kt
  • data/src/main/java/com/linku/data/preference/AuthPreference.kt
  • data/src/main/java/com/linku/data/serializer/LocalDateSerializer.kt
  • data/src/main/java/com/linku/data/serializer/LocalDateTimeSerializer.kt
  • data/src/main/java/com/linku/data/serializer/OffsetDateTimeSerializer.kt
  • data/src/main/java/com/linku/data/util/DomainIdMapper.kt
  • data/src/main/java/com/linku/data/util/ToOffsetDateTime.kt
  • data/src/main/java/com/linku/data/util/toCategoryColorStyleMap.kt
  • data/src/test/java/com/linku/data/ExampleUnitTest.kt
  • design/build.gradle.kts
  • design/src/androidTest/java/com/linku/design/ExampleInstrumentedTest.kt
  • design/src/main/java/com/linku/design/BottomNavigationBar.kt
  • design/src/main/java/com/linku/design/BrushText.kt
  • design/src/main/java/com/linku/design/Color.kt
  • design/src/main/java/com/linku/design/SearchTopSheetHost.kt
  • design/src/main/java/com/linku/design/modal/ModalWindow.kt
  • design/src/main/java/com/linku/design/modifier/GradientTint.kt
  • design/src/main/java/com/linku/design/modifier/InnerRingShadow.kt
  • design/src/main/java/com/linku/design/modifier/NoRippleClickable.kt
  • design/src/main/java/com/linku/design/modifier/Skeleton.kt
  • design/src/main/java/com/linku/design/theme/ThemeProvider.kt
  • design/src/main/java/com/linku/design/theme/color/Basic.kt
  • design/src/main/java/com/linku/design/theme/color/CategoryColorStyle.kt
  • design/src/main/java/com/linku/design/theme/color/ColorMap.kt
  • design/src/main/java/com/linku/design/theme/color/ThemeColorScheme.kt
  • design/src/main/java/com/linku/design/theme/domain/Domain.kt
  • design/src/main/java/com/linku/design/theme/font/GetTypography.kt
  • design/src/main/java/com/linku/design/theme/font/Laundrygothic.kt
  • design/src/main/java/com/linku/design/theme/font/Paperlogy.kt
  • design/src/main/java/com/linku/design/theme/font/Taebaek.kt
  • design/src/main/java/com/linku/design/theme/font/ThemeFontScheme.kt
  • design/src/main/java/com/linku/design/top/bar/AlarmButton.kt
  • design/src/main/java/com/linku/design/top/bar/TopBar.kt
  • design/src/main/java/com/linku/design/top/search/SearchBarTopSheet.kt
  • design/src/main/java/com/linku/design/util/PixelScaler.kt
  • design/src/main/java/com/linku/design/util/PngImageWithShadow.kt
  • design/src/main/java/com/linku/design/util/SystemBarPresets.kt
  • design/src/main/java/com/linku/design/util/SystemBars.kt
  • design/src/main/java/com/linku/design/util/rememberFigmaDimens.kt
  • design/src/test/java/com/linku/design/ExampleUnitTest.kt
  • feature/curation/build.gradle.kts
  • feature/curation/src/androidTest/java/com/example/curation/ExampleInstrumentedTest.kt
  • feature/curation/src/androidTest/java/com/linku/curation/ExampleInstrumentedTest.kt
  • feature/curation/src/main/java/com/linku/curation/CurationApp.kt
  • feature/curation/src/main/java/com/linku/curation/CurationDetailViewModel.kt
  • feature/curation/src/main/java/com/linku/curation/CurationViewModel.kt
  • feature/curation/src/main/java/com/linku/curation/ui/CurationScreen.kt
  • feature/curation/src/main/java/com/linku/curation/ui/SourceIconMapper.kt
  • feature/curation/src/main/java/com/linku/curation/ui/UICurationItem.kt
  • feature/curation/src/main/java/com/linku/curation/ui/calendar/CalendarBox.kt
  • feature/curation/src/main/java/com/linku/curation/ui/calendar/CalendarIconBox.kt
  • feature/curation/src/main/java/com/linku/curation/ui/detail_card/HighlightCard.kt
  • feature/curation/src/main/java/com/linku/curation/ui/effect/highlight/RadialGradientCircle.kt
  • feature/curation/src/main/java/com/linku/curation/ui/effect/skeleton/ShimmerBrush.kt
  • feature/curation/src/main/java/com/linku/curation/ui/effect/skeleton/SkeletonBox.kt
  • feature/curation/src/main/java/com/linku/curation/ui/item/CurationCheckOutButton.kt
  • feature/curation/src/main/java/com/linku/curation/ui/main_card/CurationCardItem.kt
  • feature/curation/src/main/java/com/linku/curation/ui/main_card/CurationMainCard.kt
  • feature/curation/src/main/java/com/linku/curation/ui/main_card/CurationMainCardPager.kt
  • feature/curation/src/main/java/com/linku/curation/ui/recommend_list/CurationRecommendedLinksSection.kt
  • feature/curation/src/main/java/com/linku/curation/ui/screen/CurationDetailScreen.kt
  • feature/curation/src/main/java/com/linku/curation/ui/screen/detail/CurationMonthDetailOverlay.kt
  • feature/curation/src/main/java/com/linku/curation/ui/screen/detail/CurationMonthDetailScreen.kt
  • feature/curation/src/main/java/com/linku/curation/ui/util/CurationConstants.kt
  • feature/curation/src/main/java/com/linku/curation/ui/util/Responsive.kt
  • feature/curation/src/main/java/com/linku/curation/ui/util/Shimmer.kt
  • feature/curation/src/main/java/com/linku/curation/ui/util/ShimmerSkeleton.kt
  • feature/curation/src/test/java/com/example/curation/ExampleUnitTest.kt
  • feature/curation/src/test/java/com/linku/curation/ExampleUnitTest.kt
  • feature/file/build.gradle.kts
  • feature/file/src/androidTest/java/com/linku/file/ExampleInstrumentedTest.kt
  • feature/file/src/main/java/com/linku/file/FileApp.kt
  • feature/file/src/main/java/com/linku/file/FileScreen.kt
  • feature/file/src/main/java/com/linku/file/FileViewModel.kt
  • feature/file/src/main/java/com/linku/file/modifier/InnerShadow.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/BottomFolderEditBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/FileBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/LinkCategorizationBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/NewBottomFolderBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/ShareBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/TextFieldFileBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/TopFolderEditBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/bottom/sheet/_ShareBottomSheet.kt
  • feature/file/src/main/java/com/linku/file/ui/content/BottomFolderGrid.kt
  • feature/file/src/main/java/com/linku/file/ui/content/FolderGrid.kt
  • feature/file/src/main/java/com/linku/file/ui/content/FolderIcons.kt
  • feature/file/src/main/java/com/linku/file/ui/content/LinksGrid.kt
  • feature/file/src/main/java/com/linku/file/ui/content/SharedBottomFolders.kt
  • feature/file/src/main/java/com/linku/file/ui/content/SharedTopFolderGrid.kt
  • feature/file/src/main/java/com/linku/file/ui/content/TopFolderGrid.kt
  • feature/file/src/main/java/com/linku/file/ui/item/FolderItemLayout.kt
  • feature/file/src/main/java/com/linku/file/ui/item/LinkItemLayout.kt
  • feature/file/src/main/java/com/linku/file/ui/link/AIArticleModal.kt
  • feature/file/src/main/java/com/linku/file/ui/link/SaveLinkResultScreen.kt
  • feature/file/src/main/java/com/linku/file/ui/modal/DeleteLinkModal.kt
  • feature/file/src/main/java/com/linku/file/ui/theme/Color.kt
  • feature/file/src/main/java/com/linku/file/ui/theme/Domain.kt
  • feature/file/src/main/java/com/linku/file/ui/theme/Font.kt
  • feature/file/src/main/java/com/linku/file/ui/theme/Theme.kt
  • feature/file/src/main/java/com/linku/file/ui/theme/Type.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/FileTopBar.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/BottomFolderListLayout.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/BottomFolderListMenu.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/EditButton.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/FileSearchBar.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/ShareButton.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/TopFolderListLayout.kt
  • feature/file/src/main/java/com/linku/file/ui/top/bar/component/TopFolderListMenu.kt
  • feature/file/src/main/java/com/linku/file/viewmodel/edit/state/EditStateViewModel.kt
  • feature/file/src/main/java/com/linku/file/viewmodel/folder/state/FolderStateViewModel.kt
  • feature/file/src/test/java/com/linku/file/ExampleUnitTest.kt
  • feature/home/build.gradle.kts
  • feature/home/src/androidTest/java/com/linku/home/ExampleInstrumentedTest.kt
  • feature/home/src/main/java/com/linku/home/HomeApp.kt
  • feature/home/src/main/java/com/linku/home/HomeViewModel.kt
  • feature/home/src/main/java/com/linku/home/component/AIArticleModal.kt
  • feature/home/src/main/java/com/linku/home/component/ClipboardLinkPasteBanner.kt
  • feature/home/src/main/java/com/linku/home/screen/AlarmScreen.kt
  • feature/home/src/main/java/com/linku/home/screen/HomeScreen.kt
  • feature/home/src/main/java/com/linku/home/screen/SaveLinkResultScreen.kt
  • feature/home/src/main/java/com/linku/home/screen/SaveLinkScreen.kt
  • feature/home/src/main/java/com/linku/home/ui/alarm/top/bar/AlarmTopBar.kt
  • feature/home/src/main/java/com/linku/home/ui/alarm/top/bar/component/AlarmFilterTabs.kt
  • feature/home/src/main/java/com/linku/home/ui/alarm/top/bar/component/AlarmSettingTab.kt
  • feature/home/src/main/java/com/linku/home/ui/top/bar/HomeTopBar.kt
  • feature/home/src/main/java/com/linku/home/ui/top/bar/component/EmotionSelector.kt
  • feature/home/src/main/java/com/linku/home/ui/top/bar/component/HomeSearchBar.kt
  • feature/home/src/main/java/com/linku/home/ui/top/bar/component/SelectedSummaryRow.kt
  • feature/home/src/main/java/com/linku/home/ui/top/bar/component/TaskSelector.kt
  • feature/home/src/test/java/com/example/home/ExampleUnitTest.kt
  • feature/home/src/test/java/com/linku/home/ExampleUnitTest.kt
  • feature/login/build.gradle.kts
  • feature/login/src/androidTest/java/com/example/login/ExampleInstrumentedTest.kt
  • feature/login/src/androidTest/java/com/linku/login/ExampleInstrumentedTest.kt

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

워크스루

이 PR은 파일 기능 모듈에서 디자인 모듈로 모달 컴포넌트를 마이그레이션하고, 이름을 변경한 후 앱 전체의 모든 사용처를 업데이트합니다. 또한 테마 시스템을 staticCompositionLocalOf로 전환하고 새로운 확장 속성을 추가합니다.

변경 사항

Cohort / File(s) 요약
모달 컴포넌트 마이그레이션 및 이름 변경
design/src/main/java/com/example/design/modal/ModalWindow.kt
FileModalWindow에서 ModalWindow로 컴포넌트 이름 변경 및 패키지 이동. 테마 참조를 Basic.white, Basic.black 등 새로운 디자인 테마 소스로 업데이트. 미리보기 함수명도 함께 변경.
모달 컴포넌트 사용처 업데이트
app/src/main/java/com/example/linku_android/MainApp.kt, feature/file/src/main/java/com/example/file/FileScreen.kt, feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt, feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt, feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt, feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt
모든 파일에서 FileModalWindow를 새로운 ModalWindow로 교체. 임포트 업데이트 및 미사용 임포트 제거.
테마 시스템 업데이트
design/src/main/java/com/example/design/theme/ThemeProvider.kt
LocalColorThemeLocalFontThemestaticCompositionLocalOf로 전환. MaterialTheme 확장 속성 linkuColors, linkuFont 추가. typography 계산 최적화 및 MaterialTheme 호출 구문 정리.
기타 변경
feature/file/src/main/java/com/example/file/ui/modal/DeleteLinkModal.kt, test/file/src/main/java/com/example/file/TestActivity.kt
PreviewDeleteLinkModal 미리보기 함수를 private으로 변경. TestActivityThemeProvider로 감싸기.

예상 코드 리뷰 작업량

🎯 3 (보통) | ⏱️ ~20분

관련 가능성이 있는 PR

제안 리뷰어

  • Hongji03
  • KateteDeveloper
🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive PR 제목이 너무 모호하고 구체적인 정보가 없습니다. 'feature/#44'는 브랜치 이름일 뿐 실제 변경 사항을 설명하지 않습니다. PR 제목을 'FileModalWindow를 ModalWindow로 리팩토링 및 design 모듈로 이동'과 같이 변경 사항을 명확하게 설명하는 형태로 변경하세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/#44

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt (1)

58-102: ⚠️ Potential issue | 🟠 Major

루프 내부 모달 상태를 루프 밖으로 옮기세요.

Line 59의 remember { mutableStateOf(false) } 상태를 루프 내부에서 관리하면, 폴더 삭제/재정렬 시 상태가 위치 기준으로 재사용되어 잘못된 아이템에 모달이 붙을 수 있습니다. 또한 라인 84처럼 매번 ModalWindow를 생성하는 것은 불필요한 컴포지션 비용을 야기합니다. selectedFolderIdisDeleteDialogVisible를 루프 밖으로 올려서 모달을 1개만 렌더링하도록 수정하세요.

제안 변경사항
@@
-    VerticalGrid(
+    var isDeleteDialogVisible by remember { mutableStateOf(false) }
+    var selectedFolderId by remember { mutableStateOf<Long?>(null) }
+
+    VerticalGrid(
@@
-        for ((i, folder) in folderList.withIndex()) {
-            var visible by remember { mutableStateOf(false) }
+        for ((i, folder) in folderList.withIndex()) {
@@
-                        onLongClick = {
-                            visible = true
-                        }
+                        onLongClick = {
+                            selectedFolderId = folder.folderId
+                            isDeleteDialogVisible = true
+                        }
@@
-            ModalWindow(
-                visible = visible,
-                onOkay = {
-                    fileViewModel.deleteSharedFolder(folder.folderId)
-                },
-                onDismiss = {visible = false},
-                positiveText = "삭제하기",
-                title = "해당 폴더를 삭제하시겠습니까?"
-            ) {
-                Text(
-                    text = "삭제 시 폴더 내 모든 링크가 영구적으로\n제거되며 복구가 불가능합니다.",
-                    fontSize = 15.sp,
-                    lineHeight = 22.sp,
-                    fontFamily = DefaultFont,
-                    fontWeight = FontWeight(400),
-                    color = Gray600,
-                    textAlign = TextAlign.Center,
-                )
-            }
         }
     }
+
+    ModalWindow(
+        visible = isDeleteDialogVisible,
+        onOkay = {
+            selectedFolderId?.let(fileViewModel::deleteSharedFolder)
+            isDeleteDialogVisible = false
+            selectedFolderId = null
+        },
+        onDismiss = {
+            isDeleteDialogVisible = false
+            selectedFolderId = null
+        },
+        positiveText = "삭제하기",
+        title = "해당 폴더를 삭제하시겠습니까?"
+    ) {
+        Text(
+            text = "삭제 시 폴더 내 모든 링크가 영구적으로\n제거되며 복구가 불가능합니다.",
+            fontSize = 15.sp,
+            lineHeight = 22.sp,
+            fontFamily = DefaultFont,
+            fontWeight = FontWeight(400),
+            color = Gray600,
+            textAlign = TextAlign.Center,
+        )
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt`
around lines 58 - 102, The modal visibility state and selected folder should be
hoisted out of the loop: remove the per-iteration remember {
mutableStateOf(false) } (the local visible) and instead add two states above the
for-loop (e.g., var isDeleteDialogVisible by remember { mutableStateOf(false) }
and var selectedFolderId by remember { mutableStateOf<String?>(null) }). In the
combinedClickable onLongClick for each folder, set selectedFolderId =
folder.folderId and isDeleteDialogVisible = true (keep existing onClick behavior
calling fileViewModel.getLinks and folderStateViewModel). After the loop, render
a single ModalWindow whose visible is isDeleteDialogVisible, onOkay calls
fileViewModel.deleteSharedFolder(selectedFolderId) (null-check as needed) and
onDismiss sets isDeleteDialogVisible = false and clears selectedFolderId; remove
per-item ModalWindow instances so only one modal is composed.
🧹 Nitpick comments (5)
feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt (1)

142-142: for 루프 내부에서 collectAsState() 호출은 비효율적일 수 있습니다.

fileViewModel.categoryColorMap.collectAsState().value가 루프 내에서 매번 호출됩니다. Flow 값 자체는 동일하지만, 루프 외부에서 한 번만 collect하는 것이 더 효율적입니다.

♻️ collectAsState를 루프 외부로 이동
 Column {
+    val categoryColorMap by fileViewModel.categoryColorMap.collectAsState()
     // Folder Grid
     VerticalGrid(
         // ...
     ) {
         // ...
         for((i, folder) in folderList.withIndex()) {
             // ...
-            val categoryColorStyle = fileViewModel.categoryColorMap.collectAsState().value[folderStateViewModel.selectedTopFolder?.folderName]
+            val categoryColorStyle = categoryColorMap[folderStateViewModel.selectedTopFolder?.folderName]

As per coding guidelines: Focus on unnecessary recomposition and performance issues in Android/Kotlin/Compose code

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt`
at line 142, The loop in BottomFolderGrid.kt repeatedly calls
fileViewModel.categoryColorMap.collectAsState().value for each iteration,
causing unnecessary recompositions; instead, call
fileViewModel.categoryColorMap.collectAsState() once outside the for-loop (e.g.,
val categoryColorMapState = fileViewModel.categoryColorMap.collectAsState()) and
use
categoryColorMapState.value[folderStateViewModel.selectedTopFolder?.folderName]
inside the loop (or cache the key into a local variable) so you only read the
collected map once per composition and avoid per-iteration collectAsState calls.
feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt (1)

199-201: for 루프 내부의 collectAsState() 호출을 루프 외부로 이동하는 것을 고려하세요.

fileViewModel.categoryColorMap.collectAsState().value가 루프 내에서 각 폴더마다 호출됩니다. 이를 루프 외부에서 한 번만 collect하면 성능이 개선됩니다.

As per coding guidelines: Focus on recomposition cost in Android/Kotlin/Compose code

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt`
around lines 199 - 201, In ShareBottomSheet, avoid calling
fileViewModel.categoryColorMap.collectAsState().value inside the for ((i,
folder) in folderList.withIndex()) loop; instead call
fileViewModel.categoryColorMap.collectAsState() once before the loop (e.g., val
categoryColorMapState = fileViewModel.categoryColorMap.collectAsState().value)
and then reference categoryColorMapState[folder.folderName] inside the loop so
recomposition/collection happens a single time rather than per-folder.
app/src/main/java/com/example/linku_android/MainApp.kt (1)

576-592: ModalWindow 마이그레이션은 완료되었지만, 내부 Text의 테마 사용이 일관되지 않습니다.

ModalWindow는 design 모듈의 Basic.*LocalFontTheme을 사용하도록 리팩토링되었지만, 모달 본문의 Text는 여전히 file.ui.themeDefaultFontGray600을 사용하고 있습니다. 일관성을 위해 design 모듈의 테마 값으로 통일하는 것을 권장합니다.

♻️ 테마 일관성을 위한 제안
+import com.example.design.theme.LocalFontTheme
+import com.example.design.theme.color.Basic
 // ... file.ui.theme imports 제거 가능

 Text(
     text = "링큐 회원만 폴더를 공유받을 수 있습니다.\n폴더를 확인하기 위해 로그인/회원가입 해주세요.",
     fontSize = 15.sp,
     lineHeight = 22.sp,
-    fontFamily = DefaultFont,
+    fontFamily = LocalFontTheme.current.font,
     fontWeight = FontWeight.Normal,
-    color = Gray600,
+    color = Basic.gray[600],
     textAlign = TextAlign.Center,
 )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/example/linku_android/MainApp.kt` around lines 576 -
592, The modal body Text is still using file.ui.theme's DefaultFont and Gray600;
replace those with the design module's theme values so ModalWindow uses a
consistent design system. Update the Text inside ModalWindow to use the design
module's LocalFontTheme (e.g., use the LocalFontTheme typography/fontFamily and
fontWeight settings) and the design module's color token (the Basic/Colors value
used across ModalWindow) instead of DefaultFont and Gray600; keep the same
fontSize/lineHeight/textAlign but source fontFamily and color from
LocalFontTheme and Basic color tokens.
design/src/main/java/com/example/design/modal/ModalWindow.kt (1)

140-143: onOkay()onDismiss() 순차 호출 동작 개선이 필요합니다.

확인 버튼 클릭 시 onOkay()onDismiss()가 항상 순차적으로 호출되는 구조로 인해, 콜백 담당 역할이 혼란스러워집니다. 현재 코드베이스에서도 일관성 없는 패턴을 보입니다:

  • ShareBottomSheet.kt: onDismiss를 비워두고 onOkay에 모달 종료 처리
  • MainApp.kt: 양쪽 콜백 모두에 동일한 종료 로직 작성 (중복)
  • BottomFolderGrid.kt: 상태 정리를 onOkay에 명시적으로 작성

제안: onOkay 실행 후 onDismiss를 강제 호출하지 말고, 호출자가 필요한 콜백만 관리하도록 변경하면 사용성이 향상됩니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@design/src/main/java/com/example/design/modal/ModalWindow.kt` around lines
140 - 143, 현재 .noRippleClickable 클릭 핸들러가 확인 버튼 클릭 시 항상 onOkay() 실행 후 강제로
onDismiss()를 호출하고 있어 콜백 역할이 혼란스럽습니다; ModalWindow.kt 안의 해당 클릭 처리 부분에서 onOkay()만
호출하도록 변경하고 onDismiss() 강제 호출을 제거하여 호출자가 필요하면 onOkay 내부에서 또는 외부에서 직접 onDismiss()를
호출하도록 위임하세요 (참조 심볼: onOkay, onDismiss, .noRippleClickable).
feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt (1)

158-170: Dismiss 시 selectedLinkId도 함께 정리하는 편이 안전합니다.

현재는 확인 버튼 경로에서만 selectedLinkId를 null로 돌립니다. 취소/외부 dismiss 경로에서도 함께 초기화하면 상태 일관성이 좋아지고, 이후 플로우 변경 시 stale id 리스크를 줄일 수 있습니다.

🔧 제안 diff
-        onDismiss = { deleteModalWindowVisible = false },
+        onDismiss = {
+            deleteModalWindowVisible = false
+            selectedLinkId = null
+        },

As per coding guidelines "Focus on state management (state hoisting, remember vs rememberSaveable) in Android/Kotlin/Compose code".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt` around
lines 158 - 170, The modal's onDismiss currently only sets
deleteModalWindowVisible = false and leaves selectedLinkId intact; update the
ModalWindow onDismiss handler (the onDismiss lambda in the ModalWindow call) to
also clear selectedLinkId (set selectedLinkId = null) so both cancel/dismiss and
confirm flows reset state; ensure this change touches the ModalWindow's
onDismiss and not just the onOkay handler to avoid stale selectedLinkId after
dismiss.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In
`@feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt`:
- Around line 58-102: The modal visibility state and selected folder should be
hoisted out of the loop: remove the per-iteration remember {
mutableStateOf(false) } (the local visible) and instead add two states above the
for-loop (e.g., var isDeleteDialogVisible by remember { mutableStateOf(false) }
and var selectedFolderId by remember { mutableStateOf<String?>(null) }). In the
combinedClickable onLongClick for each folder, set selectedFolderId =
folder.folderId and isDeleteDialogVisible = true (keep existing onClick behavior
calling fileViewModel.getLinks and folderStateViewModel). After the loop, render
a single ModalWindow whose visible is isDeleteDialogVisible, onOkay calls
fileViewModel.deleteSharedFolder(selectedFolderId) (null-check as needed) and
onDismiss sets isDeleteDialogVisible = false and clears selectedFolderId; remove
per-item ModalWindow instances so only one modal is composed.

---

Nitpick comments:
In `@app/src/main/java/com/example/linku_android/MainApp.kt`:
- Around line 576-592: The modal body Text is still using file.ui.theme's
DefaultFont and Gray600; replace those with the design module's theme values so
ModalWindow uses a consistent design system. Update the Text inside ModalWindow
to use the design module's LocalFontTheme (e.g., use the LocalFontTheme
typography/fontFamily and fontWeight settings) and the design module's color
token (the Basic/Colors value used across ModalWindow) instead of DefaultFont
and Gray600; keep the same fontSize/lineHeight/textAlign but source fontFamily
and color from LocalFontTheme and Basic color tokens.

In `@design/src/main/java/com/example/design/modal/ModalWindow.kt`:
- Around line 140-143: 현재 .noRippleClickable 클릭 핸들러가 확인 버튼 클릭 시 항상 onOkay() 실행 후
강제로 onDismiss()를 호출하고 있어 콜백 역할이 혼란스럽습니다; ModalWindow.kt 안의 해당 클릭 처리 부분에서
onOkay()만 호출하도록 변경하고 onDismiss() 강제 호출을 제거하여 호출자가 필요하면 onOkay 내부에서 또는 외부에서 직접
onDismiss()를 호출하도록 위임하세요 (참조 심볼: onOkay, onDismiss, .noRippleClickable).

In
`@feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt`:
- Around line 199-201: In ShareBottomSheet, avoid calling
fileViewModel.categoryColorMap.collectAsState().value inside the for ((i,
folder) in folderList.withIndex()) loop; instead call
fileViewModel.categoryColorMap.collectAsState() once before the loop (e.g., val
categoryColorMapState = fileViewModel.categoryColorMap.collectAsState().value)
and then reference categoryColorMapState[folder.folderName] inside the loop so
recomposition/collection happens a single time rather than per-folder.

In `@feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt`:
- Line 142: The loop in BottomFolderGrid.kt repeatedly calls
fileViewModel.categoryColorMap.collectAsState().value for each iteration,
causing unnecessary recompositions; instead, call
fileViewModel.categoryColorMap.collectAsState() once outside the for-loop (e.g.,
val categoryColorMapState = fileViewModel.categoryColorMap.collectAsState()) and
use
categoryColorMapState.value[folderStateViewModel.selectedTopFolder?.folderName]
inside the loop (or cache the key into a local variable) so you only read the
collected map once per composition and avoid per-iteration collectAsState calls.

In `@feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt`:
- Around line 158-170: The modal's onDismiss currently only sets
deleteModalWindowVisible = false and leaves selectedLinkId intact; update the
ModalWindow onDismiss handler (the onDismiss lambda in the ModalWindow call) to
also clear selectedLinkId (set selectedLinkId = null) so both cancel/dismiss and
confirm flows reset state; ensure this change touches the ModalWindow's
onDismiss and not just the onOkay handler to avoid stale selectedLinkId after
dismiss.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 577e1ba5-56bf-4bc1-8ec4-c247316bfbbf

📥 Commits

Reviewing files that changed from the base of the PR and between ccd2117 and fd21dfa.

📒 Files selected for processing (10)
  • app/src/main/java/com/example/linku_android/MainApp.kt
  • design/src/main/java/com/example/design/modal/ModalWindow.kt
  • design/src/main/java/com/example/design/theme/ThemeProvider.kt
  • feature/file/src/main/java/com/example/file/FileScreen.kt
  • feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt
  • feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt
  • feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt
  • feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt
  • feature/file/src/main/java/com/example/file/ui/modal/DeleteLinkModal.kt
  • test/file/src/main/java/com/example/file/TestActivity.kt

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

모달 다이얼로그 컴포넌트를 디자인 모듈로 통합하고, 테마 시스템(색상/폰트)을 ThemeProvider 중심으로 정리하여 UI 일관성과 재사용성을 높이려는 PR입니다.

Changes:

  • FileModalWindowdesign 모듈의 ModalWindow로 이관/리네이밍하고 호출부를 일괄 교체
  • ThemeProvider의 CompositionLocal 정의를 정리하고(MaterialTheme 확장 프로퍼티 추가) 타이포그래피 생성 로직을 정돈
  • 일부 Preview 접근 제한(private) 등 사소한 정리

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated no comments.

Show a summary per file
File Description
test/file/src/main/java/com/example/file/TestActivity.kt FileApp()ThemeProvider로 감싸 테스트 화면에서도 디자인 테마 적용
feature/file/src/main/java/com/example/file/ui/modal/DeleteLinkModal.kt Preview 함수를 private로 변경
feature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.kt FileModalWindowModalWindow로 교체
feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt FileModalWindowModalWindow로 교체
feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt FileModalWindowModalWindow로 교체
feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt FileModalWindowModalWindow로 교체(+불필요 import 정리)
feature/file/src/main/java/com/example/file/FileScreen.kt FileModalWindowModalWindow로 교체
design/src/main/java/com/example/design/theme/ThemeProvider.kt LocalTheme를 staticCompositionLocalOf로 정리 및 MaterialTheme.linkuColors/linkuFont 확장 프로퍼티 추가
design/src/main/java/com/example/design/modal/ModalWindow.kt 모달 컴포넌트 패키지/의존성을 design로 이동하고 API를 ModalWindow로 정리
app/src/main/java/com/example/linku_android/MainApp.kt FileModalWindowModalWindow로 교체
Comments suppressed due to low confidence (1)

design/src/main/java/com/example/design/modal/ModalWindow.kt:63

  • 문제: ModalWindow 내부 색상을 Basic.*로 직접 참조하고 있어 ThemeProvider에서 주입한 LocalColorTheme(또는 MaterialTheme.linkuColors) 변경이 UI에 반영되지 않습니다.
    이유: 다른 colorScheme를 제공해도 모달은 항상 Basic 팔레트를 사용하게 되어 테마 시스템 통합/확장(다크모드, 테마 전환 등) 시 오동작합니다.
    개선: Basic.white/black/maincolor/gray[...] 대신 LocalColorTheme.current.white/black/maincolor/gray[...](혹은 MaterialTheme.linkuColors)를 사용하도록 변경하세요. 이렇게 하면 호출 측에서 theme를 바꿔도 모달이 일관되게 따라갑니다.

@@ -573,7 +573,7 @@ fun MainApp(

Log.d("MainApp", "On Modal")

FileModalWindow(
ModalWindow(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

프리뷰 만들어주실 수 있나요?

@@ -158,9 +175,9 @@ private fun FileModalWindowTest(){
text = "해당 폴더는 타인과 공유중인 폴더입니다.\n비공개 폴더로 전환하시겠습니까?",
fontSize = 15.sp,
lineHeight = 22.sp,
fontFamily = DefaultFont,
fontFamily = LocalFontTheme.current.font,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

폰트 적용 확인했습니다~!
맞춰서 리펙 진행할게요:)

@@ -13,8 +13,16 @@ import com.example.design.theme.font.getTypography
import com.example.design.util.LocalFigmaDimens
import com.example.design.util.rememberFigmaDimens

val LocalColorTheme = compositionLocalOf<ThemeColorScheme> { Basic }
val LocalFontTheme = compositionLocalOf<ThemeFontScheme> { Paperlogy }
val LocalColorTheme = staticCompositionLocalOf<ThemeColorScheme> { Basic }
Copy link
Copy Markdown
Collaborator

@KateteDeveloper KateteDeveloper Mar 30, 2026

Choose a reason for hiding this comment

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

기존 스태틱이 없는 경우 값이 없으면 ui가 변경되어서 이렇게 변경한게 맞는지 궁금합니다!
다만 다크모드 전환시 색 변경이 있을 수 있는데 컬러도 이렇게 지정한 이유도 같이 궁금합니다!

font = fontScheme.font,
)
}

CompositionLocalProvider(
LocalColorTheme provides colorScheme,
LocalFontTheme provides fontScheme,
LocalFigmaDimens provides figmaScale
) {
MaterialTheme(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

colorScheme를 MaterialTheme에 전달하지 않으신 이유가 있을까요?

현재 구조에서는 Material 컴포넌트(Button 등)에서 기본 colorScheme을 사용하게 될 것 같아서,
의도하신 동작인지 궁금합니다!

- `isLoading` 상태에 따라 콘텐츠 위에 스켈레톤 UI를 덮어씌우는 `Modifier.skeleton` 추가
- `InfiniteTransition`과 `linearGradient`를 활용하여 왼쪽에서 오른쪽으로 흐르는 시머(Shimmer) 애니메이션 구현
- `drawWithCache`를 사용하여 성능을 최적화하고, `baseColor` 및 `highlightColor` 등 스타일 커스텀 파라미터 제공
- 컴포넌트 동작 확인을 위한 `SkeletonPreview` 추가 및 기본 테마 적용
- `ShareBottomSheet` 컴포넌트의 접근 제어자를 `internal`로 변경하여 외부 모듈로부터의 가시성 제한 및 캡슐화 강화
- `ModalBottomSheet`를 활용하여 폴더 공유를 위한 바텀 시트 기본 UI 구조 구현
- 피그마 디자인 가이드에 따른 화면 높이 및 요소별 크기 비율(Ratio) 상수 정의
- 폴더 배경 이미지와 마스크 이미지를 활용한 `FolderStructure` 내부 컴포넌트 구현
- `SelectedState` sealed class를 정의하여 카테고리/폴더 선택 상태 관리 로직 기초 마련
- 선택된 폴더 정보를 표시하고 드롭다운 형태의 메뉴를 제공하는 `ShareFolderMenu` 추상화
- `AnnotatedString`을 사용하여 선택 상태에 따른 메뉴 텍스트 스타일링 적용
- 미구현된 공유 링크 레이어 및 드롭다운 아이템 로직에 대한 TODO 주석 추가
- `app`, `core`, `data`, `design` 및 모든 `feature` 모듈의 기본 패키지 명칭을 `com.example`에서 `com.linku`로 변경
- 각 모듈별 `build.gradle.kts` 내 `namespace` 및 `applicationId` 설정을 `com.linku` 기반으로 업데이트
- `google-services.json` 내 패키지 이름을 신규 네임스페이스에 맞춰 수정
- 패키지 이동에 따른 프로젝트 전역의 `import` 구문 일괄 수정 및 최적화
- 기존 `com.example` 경로의 boilerplate 테스트 파일 제거 및 신규 패키지 구조 내 테스트 클래스 재구성
- `AndroidManifest.xml` 내 `application` 및 `activity` 경로 변경 사항 반영
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants