feat: 서재 필터 개발#914
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Walkthrough서재 필터를 장르, 연재상태, 평점 범위, 키워드로 확장하고, 목록 조회를 커서 기반으로 전환했습니다. 정렬 선택 바텀시트와 탭 기반 필터 바텀시트가 추가되었고, 저장·조회·표시 모델이 새 구조에 맞게 갱신됐습니다. Changes서재 필터 전면 재설계
Sequence Diagram(s)sequenceDiagram
participant LibraryScreen
participant LibraryViewModel
participant MyLibraryRepository
participant LibraryPagingSource
participant LibraryRemoteDataSource
participant LibraryApi
LibraryScreen->>LibraryViewModel: updateGenre / updateRatingRange / updateKeyword
LibraryViewModel->>LibraryViewModel: tempFilterUiState 갱신
LibraryScreen->>LibraryViewModel: searchFilteredNovels()
LibraryViewModel->>MyLibraryRepository: applyLibraryFilter(...)
LibraryViewModel->>LibraryPagingSource: invalidate 후 load(cursor)
LibraryPagingSource->>MyLibraryRepository: getNovels(cursor)
MyLibraryRepository->>LibraryRemoteDataSource: getUserNovels(cursor, sortType, genres, ratingMin, ratingMax, keywords, ...)
LibraryRemoteDataSource->>LibraryApi: /users/{userId}/novels/v2 요청
LibraryApi-->>LibraryRemoteDataSource: UserNovelsResponseDto(nextCursor)
LibraryRemoteDataSource-->>MyLibraryRepository: UserNovelsEntity
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Suggested labels: Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ 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.
Actionable comments posted: 9
🧹 Nitpick comments (4)
feature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.kt (1)
84-88: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winToast 문구는 문자열 리소스로 분리해 주세요.
Line 87의 하드코딩 문구는 카피 수정이나 번역 대응 시 추적이 어렵습니다.
R.string으로 빼두는 편이 유지보수에 낫습니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.kt` around lines 84 - 88, The hardcoded Toast message in LibraryScreen’s keyword limit event handler should be moved to a string resource. Update the collectAsEventWithLifecycle block that uses LocalContext.current and latestKeywordLimitEvent to reference an R.string entry instead of an inline literal, so the message is easier to maintain and translate.feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryTopBar.kt (1)
48-50: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win검색 안내 문구도 문자열 리소스로 관리해 주세요.
Line 49 텍스트가 코드에 고정돼 있어 동일 문구 변경과 번역 반영이 번거로워집니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryTopBar.kt` around lines 48 - 50, The search prompt text in LibraryTopBar is hardcoded, so move it out of the Text call and into a string resource to make updates and localization easier. Update the Text in LibraryTopBar to use the corresponding string resource via the existing Compose resource access pattern, and add a new resource entry for the “작품을 검색해보세요” copy.feature/library/src/main/java/com/into/websoso/feature/library/component/LibrarySortBottomSheet.kt (1)
84-107: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win선택 상태를 semantics로도 노출해 주세요.
현재는 배경색과 체크 아이콘으로만 선택 여부를 표현해서 TalkBack 사용자는 현재 정렬 기준을 알기 어렵습니다. 이 행에는
selected상태와 단일 선택 역할을 함께 실어주는 편이 안전합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/library/src/main/java/com/into/websoso/feature/library/component/LibrarySortBottomSheet.kt` around lines 84 - 107, The sort option row in LibrarySortBottomSheet is only visually indicating selection, so TalkBack cannot announce the current state. Update the Row building this item to expose selection semantics by setting the selected state and a single-choice role on the clickable container, using the existing isSelected and onClick setup. Keep the visual behavior unchanged, but ensure the item’s accessibility metadata reflects that it is a selectable radio-style option.feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt (1)
61-61: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
novels는 읽기 전용으로만 노출하는 편이 안전합니다.지금 형태면 ViewModel 밖에서도
value를 직접 덮어쓸 수 있어서 페이징 상태 일관성이 깨질 수 있습니다. private backing property로 감추고StateFlow만 공개해 두는 쪽이 안전합니다.제안 코드
- val novels: MutableStateFlow<PagingData<NovelUiModel>> = MutableStateFlow(PagingData.empty()) + private val _novels = MutableStateFlow(PagingData.empty<NovelUiModel>()) + val novels: StateFlow<PagingData<NovelUiModel>> = _novels.asStateFlow()- novels.update { result } + _novels.update { result }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt` at line 61, `LibraryViewModel`의 `novels`가 `MutableStateFlow`로 공개되어 있어 외부에서 상태를 직접 변경할 수 있습니다. `novels`를 private backing property로 숨기고, 외부에는 `StateFlow` 또는 읽기 전용 타입만 노출하도록 `LibraryViewModel`의 선언과 접근 방식을 정리해 페이징 상태가 내부에서만 갱신되게 수정하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@core/datastore/src/main/java/com/into/websoso/core/datastore/datasource/library/DefaultLibraryFilterDataSource.kt`:
- Around line 35-45: `DefaultLibraryFilterDataSource.libraryFilterFlow` is
silently dropping the legacy `novelRating` field because `Json(ignoreUnknownKeys
= true)` ignores it, which resets saved rating filters after upgrade. Update the
deserialization path in `DefaultLibraryFilterDataSource` /
`LibraryFilterPreferences.toData()` to detect the old schema and map
`novelRating` into `ratingMin` and `ratingMax` before converting to
`LibraryFilter`, preserving existing user settings instead of falling back to
defaults.
In
`@data/library/src/main/java/com/into/websoso/data/filter/repository/UserLibraryFilterRepository.kt`:
- Around line 22-29: UserLibraryFilterRepository의 필터 갱신 로직에서 filterFlow.first()로
현재 값을 미리 읽어온 뒤 나중에 _filterFlow.update로 쓰는 방식은 원자적이지 않으므로,
sortCriteria/isInterested를 반영하는 모든 갱신 경로에서 _filterFlow.update { current ->
current.copy(...) } 형태로 현재 상태를 콜백 안에서 직접 복사하도록 바꾸세요. 즉, savedFilter 같은 사전 계산값을
쓰지 말고 update 블록의 current를 기준으로 필요한 필드만 덮어써서, 정렬 변경과 상세 필터 변경이 서로 유실되지 않게 수정하세요.
In
`@domain/library/src/main/java/com/into/websoso/domain/library/model/RatingFilter.kt`:
- Around line 23-27: The RatingFilter update function is using an expression
body format that violates ktlint and fails CI, so adjust the function
signature/body formatting to satisfy the rule. Update the affected function in
RatingFilter to use either a multiline expression body or convert it to a block
body, keeping the existing copy logic and identifiers like RatingFilter, copy,
and the update method unchanged.
- Around line 20-27: `RatingFilter.setRange()` currently clamps each bound
independently but can still persist an invalid reversed range when `newMin >
newMax`, which then flows into `chipLabel` and request params. Update
`setRange()` in `RatingFilter` to guarantee `min <= max` by either ordering the
two inputs before copying or rejecting reversed input explicitly, while keeping
the existing clamp and `isRatingless = false` behavior.
In
`@domain/library/src/main/java/com/into/websoso/domain/library/model/SortCriteria.kt`:
- Around line 7-16: `SortCriteria.from()` currently only matches the stored key,
so legacy enum names like RECENT and OLD fall back to RECENT; update the lookup
in SortCriteria.from to accept both the enum key and the enum name for backward
compatibility, while keeping RECENT as the default when no match is found.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterChip.kt`:
- Around line 81-95: The LibraryFilterChip composable currently relies only on
visual styling, so add accessibility semantics to the chip’s clickable
container. Update the Box in LibraryFilterChip to expose a selected state for
selected chips and provide an onClickLabel that describes the remove action for
removable chips, using the existing label/onClick behavior as the reference.
Keep the semantics attached to the clickable modifier path so assistive
technologies can distinguish selection state and understand the chip’s action.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterTabRow.kt`:
- Around line 3-28: import ordering in LibraryFilterTabRow is violating ktlint
standard:import-ordering, so reorder the imports to match the project’s standard
grouping and alphabetical order; use the existing imports in
LibraryFilterTabRow.kt as the target set and sort them consistently (including
androidx, com.into, and any other groups) so CI can pass.
- Around line 60-88: The LibraryFilterTabRow tab item currently exposes only a
click action via debouncedClickable, so the selected state is not announced to
accessibility services. Update the tab container in LibraryFilterTabRow to
expose selection semantics by using selectable(selected = isSelected, role =
Role.Tab) or an equivalent Tab-based component, and keep onClick wired through
the same tab item so screen readers and keyboard users can detect the current
selected tab.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/filter/component/RatingRangeSlider.kt`:
- Around line 74-75: The RatingRangeSlider state keeps stale snapped bounds
after the parent resets min/max, so the first drag can send the old minimum
back. Update the remember state for lastMinSnapped and lastMaxSnapped in
RatingRangeSlider to be keyed or otherwise synchronized with the incoming
min/max props, and make sure the onValueChange logic around latestMin/latestMax
uses the refreshed snapped values instead of the previous remembered ones.
---
Nitpick comments:
In
`@feature/library/src/main/java/com/into/websoso/feature/library/component/LibrarySortBottomSheet.kt`:
- Around line 84-107: The sort option row in LibrarySortBottomSheet is only
visually indicating selection, so TalkBack cannot announce the current state.
Update the Row building this item to expose selection semantics by setting the
selected state and a single-choice role on the clickable container, using the
existing isSelected and onClick setup. Keep the visual behavior unchanged, but
ensure the item’s accessibility metadata reflects that it is a selectable
radio-style option.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/component/LibraryTopBar.kt`:
- Around line 48-50: The search prompt text in LibraryTopBar is hardcoded, so
move it out of the Text call and into a string resource to make updates and
localization easier. Update the Text in LibraryTopBar to use the corresponding
string resource via the existing Compose resource access pattern, and add a new
resource entry for the “작품을 검색해보세요” copy.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.kt`:
- Around line 84-88: The hardcoded Toast message in LibraryScreen’s keyword
limit event handler should be moved to a string resource. Update the
collectAsEventWithLifecycle block that uses LocalContext.current and
latestKeywordLimitEvent to reference an R.string entry instead of an inline
literal, so the message is easier to maintain and translate.
In
`@feature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.kt`:
- Line 61: `LibraryViewModel`의 `novels`가 `MutableStateFlow`로 공개되어 있어 외부에서 상태를 직접
변경할 수 있습니다. `novels`를 private backing property로 숨기고, 외부에는 `StateFlow` 또는 읽기 전용
타입만 노출하도록 `LibraryViewModel`의 선언과 접근 방식을 정리해 페이징 상태가 내부에서만 갱신되게 수정하세요.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: edf463e6-5759-4ab2-b760-aa5f6d887cfe
📒 Files selected for processing (45)
core/datastore/src/main/java/com/into/websoso/core/datastore/datasource/library/DefaultLibraryFilterDataSource.ktcore/datastore/src/main/java/com/into/websoso/core/datastore/datasource/library/mapper/LibraryFilterMapper.ktcore/datastore/src/main/java/com/into/websoso/core/datastore/datasource/library/model/LibraryFilterPreferences.ktcore/network/src/main/java/com/into/websoso/core/network/datasource/library/DefaultLibraryDataSource.ktcore/network/src/main/java/com/into/websoso/core/network/datasource/library/LibraryApi.ktcore/network/src/main/java/com/into/websoso/core/network/datasource/library/model/response/UserNovelKeywordsResponseDto.ktcore/network/src/main/java/com/into/websoso/core/network/datasource/library/model/response/UserNovelsResponseDto.ktcore/resource/src/main/res/drawable/ic_library_sort_check.xmldata/library/src/main/java/com/into/websoso/data/filter/FilterRepository.ktdata/library/src/main/java/com/into/websoso/data/filter/model/LibraryFilter.ktdata/library/src/main/java/com/into/websoso/data/filter/repository/MyLibraryFilterRepository.ktdata/library/src/main/java/com/into/websoso/data/filter/repository/UserLibraryFilterRepository.ktdata/library/src/main/java/com/into/websoso/data/library/LibraryRepository.ktdata/library/src/main/java/com/into/websoso/data/library/datasource/LibraryRemoteDataSource.ktdata/library/src/main/java/com/into/websoso/data/library/model/LibraryKeywordEntity.ktdata/library/src/main/java/com/into/websoso/data/library/model/NovelEntity.ktdata/library/src/main/java/com/into/websoso/data/library/paging/LibraryPagingSource.ktdata/library/src/main/java/com/into/websoso/data/library/repository/MyLibraryRepository.ktdata/library/src/main/java/com/into/websoso/data/library/repository/UserLibraryRepository.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/Genre.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/Genres.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/Keyword.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/Keywords.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/RatingFilter.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/SeriesStatus.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/SeriesStatuses.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/SortCriteria.ktfeature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.ktfeature/library/src/main/java/com/into/websoso/feature/library/LibraryViewModel.ktfeature/library/src/main/java/com/into/websoso/feature/library/component/LibraryListItem.ktfeature/library/src/main/java/com/into/websoso/feature/library/component/LibrarySortBottomSheet.ktfeature/library/src/main/java/com/into/websoso/feature/library/component/LibraryTopBar.ktfeature/library/src/main/java/com/into/websoso/feature/library/component/LibrayFilterTopBar.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/LibraryFilterBottomSheetScreen.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/LibraryFilterTab.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetGenre.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetKeyword.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetRating.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetSeriesStatus.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterChip.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterSelectedChips.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterTabRow.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/RatingRangeSlider.ktfeature/library/src/main/java/com/into/websoso/feature/library/model/LibraryFilterUiModel.kt
💤 Files with no reviewable changes (1)
- feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterBottomSheetNovelRatingGrid.kt
devfeijoa
left a comment
There was a problem hiding this comment.
PR 제목 팀 형식과 ktlint 통과 여부 리뷰 요청 전에 확인 부탁드립니다!
물론 간단한 기능이면 스크린샷만으로도 확인 가능하지만요..!
pr 본문이 없어서 어떤 부분들이 수정 되었는지 매번 노션과 피그마를 왔다갔다하며 확인해야해서요 🥲
본문도 의미있게 작성해주시면 감사하겠습니다..🙇🏻♀️
There was a problem hiding this comment.
🧹 Nitpick comments (1)
core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.kt (1)
21-41: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win디바운스 로직 중복 - 공통 헬퍼로 추출 고려
debouncedClickable과debouncedSelectable이lastClickTime/interactionSource상태 관리와 디바운스 조건 로직을 그대로 복제하고 있습니다. 디바운스 정책이 바뀔 경우 두 곳을 모두 수정해야 하는 부담이 있습니다.♻️ 공통 헬퍼 추출 예시
+@Composable +private fun rememberDebouncedOnClick(debounceTime: Long, onClick: () -> Unit): () -> Unit { + var lastClickTime by remember { mutableLongStateOf(0L) } + return { + val currentTime = SystemClock.elapsedRealtime() + if (currentTime - lastClickTime >= debounceTime) { + lastClickTime = currentTime + onClick() + } + } +}이후
debouncedClickable/debouncedSelectable모두에서 이 헬퍼를 사용하도록 리팩터링할 수 있습니다.Also applies to: 53-77
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.kt` around lines 21 - 41, `debouncedClickable` and `debouncedSelectable` are duplicating the same debounce state and timing logic, so extract that shared behavior into a common helper in `ComposeExtension.kt`. Refactor the repeated `lastClickTime` and `MutableInteractionSource` handling into one reusable function, then have both `debouncedClickable` and `debouncedSelectable` delegate to it while preserving their current `Modifier` behavior and click/select callbacks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In
`@core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.kt`:
- Around line 21-41: `debouncedClickable` and `debouncedSelectable` are
duplicating the same debounce state and timing logic, so extract that shared
behavior into a common helper in `ComposeExtension.kt`. Refactor the repeated
`lastClickTime` and `MutableInteractionSource` handling into one reusable
function, then have both `debouncedClickable` and `debouncedSelectable` delegate
to it while preserving their current `Modifier` behavior and click/select
callbacks.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: ece5fff3-1240-41a6-b178-bdf8f4cc4418
📒 Files selected for processing (5)
core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.ktdata/library/src/main/java/com/into/websoso/data/filter/repository/UserLibraryFilterRepository.ktdomain/library/src/main/java/com/into/websoso/domain/library/model/SortCriteria.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterTabRow.ktfeature/library/src/main/java/com/into/websoso/feature/library/filter/component/RatingRangeSlider.kt
🚧 Files skipped from review as they are similar to previous changes (2)
- feature/library/src/main/java/com/into/websoso/feature/library/filter/component/LibraryFilterTabRow.kt
- feature/library/src/main/java/com/into/websoso/feature/library/filter/component/RatingRangeSlider.kt
넵 다음에는 좀더 확인해보겠습니다 lint는 왠지 모르겠는데 제 pc에서는 계속 통과라 뜨네요... |
| /** | ||
| * 리플 효과가 없고 디바운스(중복 클릭 방지)가 적용된 선택 Modifier | ||
| * | ||
| * [selected] 상태를 접근성 트리에 노출하므로 탭/라디오처럼 선택 상태가 있는 요소에 사용한다. | ||
| * | ||
| * @param selected 현재 선택 여부 (스크린리더/키보드에 전달) | ||
| * @param debounceTime 클릭 간격 제한 시간 (기본 500ms) | ||
| * @param role 접근성 역할 (기본 [Role.Tab]) | ||
| * @param onClick 선택 시 실행할 로직 | ||
| */ |
There was a problem hiding this comment.
이 주석은 의도적으로 남겨두신걸까요? debounceTime 클릭 간격 제한 시간을 기본 500ms 로 둔 기준이 궁금합니다!
그전에 디바운스가 적용된 선택 modifier가 무엇인지 왜 이걸 선택하여 구현하셨는지도 궁금합니다!
There was a problem hiding this comment.
동시에 여러번 클릭시 예기치 못한 오류가 발생할 수 있을 것 같아 Debounce로 클릭시 처리를 방지했고, 500ms로 잡은 이유는 임시로 잡았습니다. 처음 추가된 extension이라 남겨놨습니다.
There was a problem hiding this comment.
@Sadturtleman 이제 보았는데, ComposeExtension 이라는 네이밍에 대해서는 약간 의문이 들긴 하네요..🤔
Compose에서 쓰이는 모든 익스텐션을 모아두기엔 범위가 너무 큰 것 같아보이고, Modifier 관련만 모아둔 것처럼 보이는데 modifier 익스텐션이나 혹은 차라리 서재 필터 관련 익스텐션이라고 네이밍 짓는건 어떨까요? 물론 이 부분에 대해서는 팀 컨벤션을 정한 후 수정하는것이 좋아보입니다! 하루의 의견도 궁금해요!
https://www.figma.com/design/QLYZA00K5EIozTroOTDYAU/%EC%9B%B9%EC%86%8C%EC%86%8C-%EB%94%94%EC%9E%90%EC%9D%B8?node-id=24269-73344&t=4zgwr55CcfgSub6Y-1 피그마의 서재 탭 그리드 뷰(2-1-1)에서는 읽기 상태 -> 장르 -> 연재 상태 -> 별점 순 이지만 피그마의 서재 탭 리스트 뷰(2-1-1)에서는 읽기 상태 -> 매력 포인트 -> 연재 상태 로 가는것 같습니다. 그래서 일단 notion에 올라와 있는 사진 기준으로 변경하였고 기획 QA 올릴 때 한번 여쭤보려합니다. |
노션에도 피그마에도 적혀있듯이 '필터 등록을 안 한 경우'의 요구사항이라 '관심, 읽기상태, 장르, 연재상태, 별점, 그리고 잘렸지만 매력포인트와 키워드까지 가로 스크롤이 되는것'이라고 생각했어요. 그래서 필터없이 나오는 부분이 관심, 읽기상태, 매력포인트, 별점만 보여서 요청 드린것이었고요! 알려주신 피그마의 서재 탭 그리드 뷰(2-1-1)에서는 '필터 등록이 안 한 경우'이고 피그마의 서재 탭 리스트 뷰(2-1-1)에서는 '필터 등록을 한 경우' 처럼 보입니다.
이 부분이 잘 이해 안가기도 해서, QA 전에 기획팀과 디자인 팀에게 먼저 물어보고 요구사항을 확실하게 하는게 좋을 것 같습니다!
|
저도 처음에 그렇게 생각했었는데 2번째 사진을 보시면 필터 등록하고 선택한것과 선택하지 않은 것이 그냥 고정 위치로 나오는것 같아서요! 리스트뷰의 연재 상태 칩을 보면 설정을 안했고 그 다음 칩은 선택했는데 순서가 고정인것같습니다 |
|
@devfeijoa 수정했습니다! |
| Text( | ||
| text = "서재", | ||
| style = WebsosoTheme.typography.headline1, | ||
| color = Black, | ||
| ) | ||
| Box( | ||
| modifier = Modifier | ||
| .debouncedClickable(onClick = onSearchClick) | ||
| .padding(horizontal = 20.dp, vertical = 8.dp), | ||
| ) { | ||
| Image( | ||
| painter = painterResource(id = ic_common_search), | ||
| imageVector = ImageVector.vectorResource(id = ic_plus_novel), |
There was a problem hiding this comment.
헤더에 서재 아이콘이 일반검색으로 이동된다고 PR 본문에도 적혀있고, 요구사항도 같은걸로 아는데 왜 다시 서재 아이콘을 헤더에 넣은건지 알 수 있을까요??







📌𝘐𝘴𝘴𝘶𝘦𝘴
📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯
서재 필터 UX를 정책에 맞춰 전면 개편했습니다.
헤더
필터 (탭형 바텀시트)
X초기화보기 / 정렬
데이터
서재 v2 목록 조회 API 및 커서 기반 페이지네이션 연동
필터 도메인 모델 및 정렬 기준 확장, 필터 로컬 저장·조회 연동
정책: https://www.notion.so/kimmjabc/6-UX-35a9e64a453280d8814df5a2692be4cf?source=copy_link
📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵
💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴
Summary by CodeRabbit
Summary by CodeRabbit