SCRUM-282 design: add blocked user management screen#64
Conversation
Move the local action button component to the shared core design system directory as FeelinActionButton. Replace its usage in UserInfoScreen
Integrate BlockedUsersScreen into the mypage navigation graph. Add the destination to FeelinDestination, connect it in FeelinNavHost with mock data, and expose a menu item in SettingScreen.
Create BlockedUsersUiState and BlockedUsersViewModel to manage state. Update FeelinNavHost to inject the ViewModel within the MyPageGraph scope and collect its state, migrating away from the hardcoded list.
📝 WalkthroughWalkthroughThis PR adds a "Blocked Users" feature to the MyPage section: a new screen, ViewModel, UI state, and list-item data model, backed by two new design-system components (FeelinActionButton, FeelinSnackbar). Navigation wiring connects Settings to the new screen, and existing SettingInfoActionButton usage is replaced with FeelinActionButton. ChangesBlocked Users Feature
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant SettingScreen
participant FeelinNavHost
participant BlockedUsersViewModel
participant BlockedUsersScreen
SettingScreen->>FeelinNavHost: onBlockedUsersClick()
FeelinNavHost->>FeelinNavHost: navigate(BlockedUsers.route)
FeelinNavHost->>BlockedUsersViewModel: collect uiState
FeelinNavHost->>BlockedUsersScreen: render(blockedUsers)
BlockedUsersScreen->>BlockedUsersScreen: onUnblockClick -> show snackbar
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 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.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d3cce7ccb1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| * (Figma component name Button_Copy) | ||
| */ | ||
| @Composable | ||
| fun FeelinActionButton( |
There was a problem hiding this comment.
제가 rg "FeelinActionButton"로 확인한 현재 호출부는 mypage/blockedusers와 mypage/userinfo뿐입니다. 그런데 app/src/main/java/com/lyrics/feelin/core/AGENTS.md는 “New shared UI belongs here only if reused across multiple features”라고 하고, app/src/main/java/com/lyrics/feelin/presentation/view/mypage/AGENTS.md도 “Do not move mypage-only rows into core/designsystem unless another feature truly reuses them”라고 합니다. 이 상태로 core에 공개하면 마이페이지 설정용 trailing 버튼이 전역 디자인 시스템 API가 되어 feature-agnostic 경계가 흐려지므로, 다른 기능에서 실제로 재사용될 때까지 mypage 컴포넌트로 두는 편이 안전합니다.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (7)
app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinSnackbar.kt (2)
81-86: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueIcon is hardcoded to a success checkmark for all snackbars.
Icons.Filled.CheckCircleis baked into the shared component regardless of message semantics. Since this snackbar is a general-purpose design-system component (already used for the unblock-success message), a future error/warning snackbar reusing this component would show a misleading success icon. Consider parameterizing the icon or adding atype/variantparam.🤖 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 `@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinSnackbar.kt` around lines 81 - 86, The snackbar icon is hardcoded to Icons.Filled.CheckCircle in the shared FeelinSnackbar component, so all snackbar variants show a success symbol. Update FeelinSnackbar to accept an icon-related parameter or a type/variant value, and use that instead of the fixed checkmark so callers can supply the appropriate icon for success, warning, or error states.
63-94: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winFixed-height Surface will clip longer messages.
The
Surfaceis a fixedheight(56.dp)and clipped toRoundedCornerShape(8.dp). Since the messageTexthas nomaxLines/overflowhandling, any message that wraps to more than one line will be clipped by the shape rather than the container growing to fit it.♻️ Suggested fix
Surface( modifier = modifier .fillMaxWidth() - .height(56.dp) + .heightIn(min = 56.dp) .shadow(Text( text = message, style = FeelinTypography.body2, - color = textColor + color = textColor, + maxLines = 2, + overflow = TextOverflow.Ellipsis )🤖 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 `@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinSnackbar.kt` around lines 63 - 94, The Snackbar layout in FeelinSnackbar is forcing a fixed height, which can clip multi-line messages. Update the Surface/Row sizing so the container can expand with content instead of using a hardcoded 56.dp height, and add appropriate text handling in the Text composable (for example line limits or overflow behavior) so longer messages are displayed cleanly without being cut off.app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinActionButton.kt (2)
24-46: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winText can clip inside the fixed-size box; no accessibility role.
The button's
Boxhas a hardcoded68.dp x 28.dpsize with nomaxLines/overflowhandling on the innerText— longer localized strings than "복사"/"차단 해제" will get clipped by the rounded-corner clip. Also,clickable(onClick = onClick)doesn't setrole = Role.Button, so screen readers won't announce this as an actionable button.♻️ Suggested improvements
Text( text = text, style = FeelinTypography.body2.copy(color = feelinColors.brandPrimary), + maxLines = 1, + overflow = TextOverflow.Ellipsis, ).background(color = feelinColors.brandSecondary) - .clickable(onClick = onClick) + .clickable(role = Role.Button, onClick = onClick)🤖 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 `@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinActionButton.kt` around lines 24 - 46, The FeelinActionButton composable is using a fixed-size Box that can clip longer localized labels and its clickable modifier is missing a button accessibility role. Update FeelinActionButton so the inner Text can safely fit or truncate by handling text overflow/max lines instead of relying on the hardcoded size, and keep the layout flexible enough for translations. Also change the Box click handling to use an explicit Role.Button in clickable so screen readers announce it as a button.
24-28: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueParameter order deviates from lambda-last convention.
onClick(a lambda) is placed beforemodifier. Reordering to(text, modifier, onClick)follows the trailing-lambda convention used elsewhere and matches the project's stated composable parameter ordering preference for lambdas.🤖 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 `@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinActionButton.kt` around lines 24 - 28, Reorder the FeelinActionButton composable parameters to follow the lambda-last convention by moving onClick after modifier, matching the project's composable ordering style used elsewhere. Update the FeelinActionButton function signature so it reads text, modifier, then onClick, and keep all call sites aligned with the new parameter order.app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersUiState.kt (1)
6-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove the unused
initial()factory.
BlockedUsersViewModelconstructsBlockedUsersUiStatedirectly, and there are no call sites forBlockedUsersUiState.initial(). Drop the factory or make the ViewModel use it as the base state.🤖 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 `@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersUiState.kt` around lines 6 - 8, The BlockedUsersUiState companion object exposes an unused initial() factory that is not referenced anywhere, while BlockedUsersViewModel already creates BlockedUsersUiState directly. Remove the initial() method from BlockedUsersUiState, or alternatively update BlockedUsersViewModel to use BlockedUsersUiState.initial() consistently as its base state so there is a single construction path.app/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.kt (1)
350-350: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff
@Suppress("LongMethod")masks growing complexity inmyPageNavGraph.Each new destination adds to the same function; consider extracting each
composable(...)block (e.g.,settingComposable,blockedUsersComposable) into private extension functions instead of suppressing the lint rule.🤖 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 `@app/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.kt` at line 350, The `@Suppress("LongMethod")` on `myPageNavGraph` is hiding increasing complexity in the navigation setup. Remove the suppression and refactor the large `myPageNavGraph` function by extracting individual `composable(...)` blocks into private helper/extension functions such as `settingComposable` and `blockedUsersComposable`, then keep `myPageNavGraph` focused on wiring the graph together.app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.kt (1)
51-59: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winLocalize
contentDescriptionand add a placeholder forAsyncImage.
"Profile Image"is a hardcoded English string while the rest of the screen is Korean, and there's no placeholder/error drawable whenprofileImageUrlisnullor fails to load.🤖 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 `@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.kt` around lines 51 - 59, Update BlockedUserListItem’s AsyncImage so the contentDescription is pulled from localized resources instead of the hardcoded English string, and add placeholder/error drawables for the image loading state. Use the AsyncImage call in BlockedUserListItem and the surrounding image modifier setup to wire in a fallback when data.profileImageUrl is null or fails to load, while keeping the existing size/clip/background styling.
🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreen.kt`:
- Around line 38-42: The BlockedUsersScreen composable has the lambda parameter
ordered before modifier, which conflicts with the composable parameter ordering
guidelines. Update the BlockedUsersScreen signature so modifier is the first
optional parameter after required data parameters, and move onBackClick to the
end of the parameter list to keep the lambda last.
In
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.kt`:
- Around line 10-22: The BlockedUsersViewModel currently exposes only a
read-only uiState, so blockedUsers never changes after an unblock action. Add a
state-update method on BlockedUsersViewModel that removes the matching
BlockedUserListItemData from the current BlockedUsersUiState, then update
BlockedUsersScreen and FeelinNavHost to invoke that method from onUnblockClick
so the UI reflects the removal immediately.
In
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.kt`:
- Around line 32-36: The Composable signature for BlockedUserListItem should
follow the standard parameter order by moving modifier before the lambda so the
optional modifier comes first and onUnblockClick is last. Update the
BlockedUserListItem declaration accordingly, and keep the same ordering pattern
anywhere this composable is called to match the intended Compose API style.
---
Nitpick comments:
In
`@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinActionButton.kt`:
- Around line 24-46: The FeelinActionButton composable is using a fixed-size Box
that can clip longer localized labels and its clickable modifier is missing a
button accessibility role. Update FeelinActionButton so the inner Text can
safely fit or truncate by handling text overflow/max lines instead of relying on
the hardcoded size, and keep the layout flexible enough for translations. Also
change the Box click handling to use an explicit Role.Button in clickable so
screen readers announce it as a button.
- Around line 24-28: Reorder the FeelinActionButton composable parameters to
follow the lambda-last convention by moving onClick after modifier, matching the
project's composable ordering style used elsewhere. Update the
FeelinActionButton function signature so it reads text, modifier, then onClick,
and keep all call sites aligned with the new parameter order.
In
`@app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinSnackbar.kt`:
- Around line 81-86: The snackbar icon is hardcoded to Icons.Filled.CheckCircle
in the shared FeelinSnackbar component, so all snackbar variants show a success
symbol. Update FeelinSnackbar to accept an icon-related parameter or a
type/variant value, and use that instead of the fixed checkmark so callers can
supply the appropriate icon for success, warning, or error states.
- Around line 63-94: The Snackbar layout in FeelinSnackbar is forcing a fixed
height, which can clip multi-line messages. Update the Surface/Row sizing so the
container can expand with content instead of using a hardcoded 56.dp height, and
add appropriate text handling in the Text composable (for example line limits or
overflow behavior) so longer messages are displayed cleanly without being cut
off.
In `@app/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.kt`:
- Line 350: The `@Suppress("LongMethod")` on `myPageNavGraph` is hiding
increasing complexity in the navigation setup. Remove the suppression and
refactor the large `myPageNavGraph` function by extracting individual
`composable(...)` blocks into private helper/extension functions such as
`settingComposable` and `blockedUsersComposable`, then keep `myPageNavGraph`
focused on wiring the graph together.
In
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersUiState.kt`:
- Around line 6-8: The BlockedUsersUiState companion object exposes an unused
initial() factory that is not referenced anywhere, while BlockedUsersViewModel
already creates BlockedUsersUiState directly. Remove the initial() method from
BlockedUsersUiState, or alternatively update BlockedUsersViewModel to use
BlockedUsersUiState.initial() consistently as its base state so there is a
single construction path.
In
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.kt`:
- Around line 51-59: Update BlockedUserListItem’s AsyncImage so the
contentDescription is pulled from localized resources instead of the hardcoded
English string, and add placeholder/error drawables for the image loading state.
Use the AsyncImage call in BlockedUserListItem and the surrounding image
modifier setup to wire in a fallback when data.profileImageUrl is null or fails
to load, while keeping the existing size/clip/background styling.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 3dbc3c41-f30e-4a9e-8ce6-8aa1a6b365c5
📒 Files selected for processing (13)
app/src/androidTest/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreenTest.ktapp/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinActionButton.ktapp/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinSnackbar.ktapp/src/main/java/com/lyrics/feelin/navigation/FeelinDestination.ktapp/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUserListItemData.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreen.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersUiState.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/component/SettingInfoItem.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/setting/SettingScreen.ktapp/src/main/java/com/lyrics/feelin/presentation/view/mypage/userinfo/UserInfoScreen.kt
💤 Files with no reviewable changes (1)
- app/src/main/java/com/lyrics/feelin/presentation/view/mypage/component/SettingInfoItem.kt
| fun BlockedUsersScreen( | ||
| blockedUsers: List<BlockedUserListItemData>, | ||
| onBackClick: () -> Unit, | ||
| modifier: Modifier = Modifier | ||
| ) { |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Same parameter-order issue: lambda should be last, not modifier.
onBackClick precedes modifier, which contradicts "Keep lambda parameters as the last parameter in Composable functions" and "Keep modifier as the first optional parameter in Composable functions" per path instructions.
♻️ Proposed fix
fun BlockedUsersScreen(
blockedUsers: List<BlockedUserListItemData>,
- onBackClick: () -> Unit,
- modifier: Modifier = Modifier
+ modifier: Modifier = Modifier,
+ onBackClick: () -> Unit
) {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| fun BlockedUsersScreen( | |
| blockedUsers: List<BlockedUserListItemData>, | |
| onBackClick: () -> Unit, | |
| modifier: Modifier = Modifier | |
| ) { | |
| fun BlockedUsersScreen( | |
| blockedUsers: List<BlockedUserListItemData>, | |
| modifier: Modifier = Modifier, | |
| onBackClick: () -> Unit | |
| ) { |
🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreen.kt`
around lines 38 - 42, The BlockedUsersScreen composable has the lambda parameter
ordered before modifier, which conflicts with the composable parameter ordering
guidelines. Update the BlockedUsersScreen signature so modifier is the first
optional parameter after required data parameters, and move onBackClick to the
end of the parameter list to keep the lambda last.
Source: Path instructions
| @HiltViewModel | ||
| class BlockedUsersViewModel @Inject constructor() : ViewModel() { | ||
| private val _uiState: MutableStateFlow<BlockedUsersUiState> = MutableStateFlow( | ||
| BlockedUsersUiState( | ||
| blockedUsers = listOf( | ||
| BlockedUserListItemData(userId = 1, nickname = "username01", profileImageUrl = null), | ||
| BlockedUserListItemData(userId = 2, nickname = "username02", profileImageUrl = null), | ||
| BlockedUserListItemData(userId = 3, nickname = "username03", profileImageUrl = null), | ||
| ) | ||
| ) | ||
| ) | ||
| val uiState: StateFlow<BlockedUsersUiState> = _uiState.asStateFlow() | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Map the relevant files first
git ls-files 'app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/*'
# Show outlines for the ViewModel and screen
ast-grep outline app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.kt --view expanded
ast-grep outline app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreen.kt --view expanded
# Read the relevant sections with line numbers
cat -n app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.kt
printf '\n====\n'
cat -n app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersScreen.ktRepository: project-lyrics/app-Android
Length of output: 8792
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Find all references to this screen / view model / unblock action
rg -n "BlockedUsersScreen|BlockedUsersViewModel|onUnblockClick|unblockUser|blockedUsers" app/src/main/java
# Inspect the state holder and any route/parent that feeds the screen
cat -n app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersUiState.kt
printf '\n====\n'
cat -n app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUserListItemData.ktRepository: project-lyrics/app-Android
Length of output: 5294
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the nav host route that owns this screen
sed -n '405,435p' app/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.kt
# Show the list item implementation to confirm the action surface
cat -n app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.ktRepository: project-lyrics/app-Android
Length of output: 5909
Add an unblock mutation to the blocked-users state
app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.kt:10-22 currently exposes only a read-only StateFlow, so the UI can show “차단 해제되었습니다” without ever removing that user from blockedUsers. Add a state update method here and wire BlockedUsersScreen/FeelinNavHost to call it from onUnblockClick.
🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/BlockedUsersViewModel.kt`
around lines 10 - 22, The BlockedUsersViewModel currently exposes only a
read-only uiState, so blockedUsers never changes after an unblock action. Add a
state-update method on BlockedUsersViewModel that removes the matching
BlockedUserListItemData from the current BlockedUsersUiState, then update
BlockedUsersScreen and FeelinNavHost to invoke that method from onUnblockClick
so the UI reflects the removal immediately.
| fun BlockedUserListItem( | ||
| data: BlockedUserListItemData, | ||
| onUnblockClick: () -> Unit, | ||
| modifier: Modifier = Modifier | ||
| ) { |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Reorder parameters: lambda should be last, not modifier.
onUnblockClick (a lambda) currently precedes modifier. As per path instructions, "Keep lambda parameters as the last parameter in Composable functions" and "Keep modifier as the first optional parameter in Composable functions".
♻️ Proposed fix
fun BlockedUserListItem(
data: BlockedUserListItemData,
- onUnblockClick: () -> Unit,
- modifier: Modifier = Modifier
+ modifier: Modifier = Modifier,
+ onUnblockClick: () -> Unit
) {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| fun BlockedUserListItem( | |
| data: BlockedUserListItemData, | |
| onUnblockClick: () -> Unit, | |
| modifier: Modifier = Modifier | |
| ) { | |
| fun BlockedUserListItem( | |
| data: BlockedUserListItemData, | |
| modifier: Modifier = Modifier, | |
| onUnblockClick: () -> Unit | |
| ) { |
🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/mypage/blockedusers/component/BlockedUserListItem.kt`
around lines 32 - 36, The Composable signature for BlockedUserListItem should
follow the standard parameter order by moving modifier before the lambda so the
optional modifier comes first and onUnblockClick is last. Update the
BlockedUserListItem declaration accordingly, and keep the same ordering pattern
anywhere this composable is called to match the intended Compose API style.
Source: Path instructions
Please check if the PR fulfills these requirements
What kind of change does this PR introduce?
What is the current behavior?
마이페이지 설정 메뉴 내에 차단된 유저를 관리할 수 있는 화면으로의 진입점이 없으며, 관련 기능을 위한 화면 UI가 구현되어 있지 않은 상태입니다.
What is the new behavior (if this is a feature change)?
차단된 유저 목록을 확인하고 관리할 수 있는 화면을 신규 구현했습니다.
FeelinActionButton과FeelinSnackbar를 신규 구현하거나 추출하여 적용했습니다.Does this PR introduce a breaking change? (What changes might users need to make in their application due to this PR?)
없음.
ScreenShots (If needed)
Light mode
Dark mode
Other information:
AI Agent
./gradlew detekt및./gradlew :app:assembleDebug명령을 통해 코드 품질 및 빌드 정상 여부를 확인했습니다.BlockedUsersScreen.kt: 차단 목록 UI 및 화면 상태 분기 처리.BlockedUsersViewModel.kt: UI 상태 및 목업 데이터 관리.FeelinActionButton.kt: 여러 화면에서 공통으로 사용할 수 있도록 추출한 버튼 컴포넌트.FeelinSnackbar.kt: 커스텀 디자인이 적용된 신규 공통 스낵바.FeelinNavHost.kt,FeelinDestination.kt: 남비게이션 경로 정의 및 마이페이지 그래프 연결.BlockedUsersScreenTest.kt: 리스트 아이템 및 스낵바 노출 여부에 대한 UI 테스트 추가.User
이번에 추가한 스낵바가 시스템 내비바가 3버튼으로 표시될 경우에 앱 하단바와 겹쳐 표시되는 문제가 있습니다. 추후 스낵바를 전역으로 표시하는 등의 조치를 통해 이를 수정하겠습니다.