Conversation
- `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()` 호출 제거 (주석 처리)
|
Important Review skippedToo many files! This PR contains 297 files, which is 147 over the limit of 150. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (297)
You can disable this status message by setting the Use the checkbox below for a quick retry:
워크스루이 PR은 파일 기능 모듈에서 디자인 모듈로 모달 컴포넌트를 마이그레이션하고, 이름을 변경한 후 앱 전체의 모든 사용처를 업데이트합니다. 또한 테마 시스템을 변경 사항
예상 코드 리뷰 작업량🎯 3 (보통) | ⏱️ ~20분 관련 가능성이 있는 PR
제안 리뷰어
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
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를 생성하는 것은 불필요한 컴포지션 비용을 야기합니다.selectedFolderId와isDeleteDialogVisible를 루프 밖으로 올려서 모달을 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.theme의DefaultFont와Gray600을 사용하고 있습니다. 일관성을 위해 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
📒 Files selected for processing (10)
app/src/main/java/com/example/linku_android/MainApp.ktdesign/src/main/java/com/example/design/modal/ModalWindow.ktdesign/src/main/java/com/example/design/theme/ThemeProvider.ktfeature/file/src/main/java/com/example/file/FileScreen.ktfeature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.ktfeature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.ktfeature/file/src/main/java/com/example/file/ui/content/LinksGrid.ktfeature/file/src/main/java/com/example/file/ui/content/SharedBottomFolders.ktfeature/file/src/main/java/com/example/file/ui/modal/DeleteLinkModal.kttest/file/src/main/java/com/example/file/TestActivity.kt
There was a problem hiding this comment.
Pull request overview
모달 다이얼로그 컴포넌트를 디자인 모듈로 통합하고, 테마 시스템(색상/폰트)을 ThemeProvider 중심으로 정리하여 UI 일관성과 재사용성을 높이려는 PR입니다.
Changes:
FileModalWindow를design모듈의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 | FileModalWindow → ModalWindow로 교체 |
| feature/file/src/main/java/com/example/file/ui/content/LinksGrid.kt | FileModalWindow → ModalWindow로 교체 |
| feature/file/src/main/java/com/example/file/ui/content/BottomFolderGrid.kt | FileModalWindow → ModalWindow로 교체 |
| feature/file/src/main/java/com/example/file/ui/bottom/sheet/ShareBottomSheet.kt | FileModalWindow → ModalWindow로 교체(+불필요 import 정리) |
| feature/file/src/main/java/com/example/file/FileScreen.kt | FileModalWindow → ModalWindow로 교체 |
| 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 | FileModalWindow → ModalWindow로 교체 |
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( | |||
| @@ -158,9 +175,9 @@ private fun FileModalWindowTest(){ | |||
| text = "해당 폴더는 타인과 공유중인 폴더입니다.\n비공개 폴더로 전환하시겠습니까?", | |||
| fontSize = 15.sp, | |||
| lineHeight = 22.sp, | |||
| fontFamily = DefaultFont, | |||
| fontFamily = LocalFontTheme.current.font, | |||
There was a problem hiding this comment.
폰트 적용 확인했습니다~!
맞춰서 리펙 진행할게요:)
| @@ -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 } | |||
There was a problem hiding this comment.
기존 스태틱이 없는 경우 값이 없으면 ui가 변경되어서 이렇게 변경한게 맞는지 궁금합니다!
다만 다크모드 전환시 색 변경이 있을 수 있는데 컬러도 이렇게 지정한 이유도 같이 궁금합니다!
| font = fontScheme.font, | ||
| ) | ||
| } | ||
|
|
||
| CompositionLocalProvider( | ||
| LocalColorTheme provides colorScheme, | ||
| LocalFontTheme provides fontScheme, | ||
| LocalFigmaDimens provides figmaScale | ||
| ) { | ||
| MaterialTheme( |
There was a problem hiding this comment.
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` 경로 변경 사항 반영
📝 설명
✔️ PR 유형
어떤 변경 사항이 있나요?
📎 관련 이슈 번호
Summary by CodeRabbit
릴리스 노트