Skip to content

Feature/#135 search UI#142

Closed
nagaeng wants to merge 6 commits intodevelopfrom
feature/#135-search-ui
Closed

Feature/#135 search UI#142
nagaeng wants to merge 6 commits intodevelopfrom
feature/#135-search-ui

Conversation

@nagaeng
Copy link
Copy Markdown
Contributor

@nagaeng nagaeng commented Sep 25, 2025

📌 PR 요약

🌱 작업한 내용

🌱 PR 포인트

📸 스크린샷

스크린샷
파일첨부바람

📮 관련 이슈

Summary by CodeRabbit

  • 신기능
    • 검색 화면 추가: 검색바, 결과 리스트, 장소 상세/미결과 이동 지원
    • 첫 실행 시 검색 화면으로 자동 진입
    • 메인에서 검색 화면으로 이동 가능한 네비게이션 추가
    • 디자인 시스템에 검색바 컴포넌트 도입
    • 검색 도메인/피처 모듈 신규 도입
  • 스타일
    • 장소 카드 아이콘 배경 색상 대비 강화
  • 작업
    • 신규 모듈 포함 및 의존성 추가
    • 불필요한 import 제거
    • .gitignore 및 ProGuard 규칙 파일 추가

@nagaeng nagaeng self-assigned this Sep 25, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Sep 25, 2025

Walkthrough

새 검색(feature/serach) 및 도메인(domain/search) 모듈을 추가하고, 메인 내비게이션에 검색 그래프를 연동했습니다. 첫 실행 시(Search 미진입 시) 검색 화면으로 이동하는 흐름을 도입했습니다. 디자인 시스템에 검색바 컴포넌트를 추가했고, PlaceCard 아이콘 배경색 매핑을 변경했습니다. Gradle 설정과 종속성도 갱신되었습니다.

Changes

Cohort / File(s) Summary
Project settings & wiring
settings.gradle.kts, app/build.gradle.kts, feature/main/build.gradle.kts
새 모듈 :feature:serach, :domain:search 포함 및 의존성 추가. 앱/메인 모듈에서 serach 모듈을 implementation으로 연결.
Design System updates
core/designsystem/.../card/SolplyPlaceCard.kt, core/designsystem/.../searchbar/SolplySearchBar.kt
PlaceCard 아이콘 배경색 매핑 상향(더 짙은 톤으로 변경). 신규 컴포저블 SolplySearchbar 및 프리뷰 추가.
Main feature navigation
feature/main/src/main/java/.../MainActivity.kt, .../MainNavigator.kt, .../MainScreen.kt
MainScreen에 isFreshLaunch 추가. 첫 실행 시 Search로 내비게이션 처리. navigateToSearch API 및 searchNavGraph 연결.
Search feature module
feature/serach/build.gradle.kts, feature/serach/src/main/AndroidManifest.xml, feature/serach/proguard-rules.pro, feature/serach/.gitignore
신규 모듈 생성 및 기본 설정/매니페스트/프로가드/(빌드) 무시 규칙 추가.
Search feature implementation
feature/serach/src/main/java/.../SearchContract.kt, .../SearchScreen.kt, .../SearchViewModel.kt, .../component/SearchItem.kt, .../navigation/SearchNavigation.kt
검색 상태/인텐트/사이드이펙트 계약 추가. 화면/라우트/뷰모델/아이템 컴포넌트 구현. NavController 확장 및 NavGraphBuilder 등록 제공.
Domain search module
domain/search/build.gradle.kts, domain/search/src/main/java/.../MyClass.kt, domain/search/.gitignore
신규 도메인 모듈 생성, 코어 모델/코루틴 의존성 추가. 플레이스홀더 클래스 추가. 빌드 디렉토리 무시.
Minor cleanups
feature/maps/.../PlaceDetailBottomSheet.kt, feature/place/.../PlaceScreen.kt
불필요한 Log import 제거.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Activity as MainActivity
  participant MainScreen
  participant Nav as NavController
  participant Search as SearchGraph

  User->>Activity: 앱 실행
  Activity->>MainScreen: setContent(isFreshLaunch = savedInstanceState == null)
  alt isFreshLaunch == true
    MainScreen->>Nav: observe current destination
    MainScreen->>Nav: navigateSearch(navOptions: popUpTo(0), launchSingleTop)
    Nav->>Search: show SearchRoute
  else 기존 흐름
    MainScreen->>Nav: 기존 그래프 유지
  end
Loading
sequenceDiagram
  autonumber
  actor User
  participant UI as SearchScreen
  participant VM as SearchViewModel
  participant Nav as NavController

  User->>UI: 텍스트 입력/수정
  UI->>VM: Intent.QueryChanged
  VM->>VM: 250ms 디바운스 후 검색
  VM->>UI: State(isLoading / results)
  User->>UI: 엔터/검색 아이콘
  UI->>VM: Intent.Submit
  VM->>UI: State 업데이트

  User->>UI: 결과 아이템 클릭
  UI->>VM: Intent.ClickItem(id)
  VM-->>UI: SideEffect.NavigateToPlaceDetail(townId, placeId)
  UI->>Nav: navigate to PlaceDetail

  User->>UI: "찾는 장소가 없어요" 클릭
  UI->>VM: Intent.ClickNoResult
  VM-->>UI: SideEffect.NavigateToNoResult
  UI->>Nav: navigate to NoResult
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

석찬🍚🦁

Suggested reviewers

  • leeseokchan00
  • 88guri

Poem

폴짝– 키보드에 수염 스치며, 검색의 길을 열었지
첫 실행바람 타고, 바로(Search!) 문을 두드리니
토글토글 결과들, 당근같이 줄 맞춰 서고
못 찾았냔 묻히면, 또 다른 길로 휙–
오늘도 토끼는 네비를 타고 뜀! 🐰🔎✨

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings)
Check name Status Explanation Resolution
Title Check ⚠️ Warning PR 제목에 브랜치명과 이슈 번호가 포함되어 있고 간결한 문장 구조가 아니어서 변경 내용의 핵심을 명확히 전달하지 못하고 있습니다. 제목을 ‘검색 UI 추가’ 혹은 ‘Add Search UI’와 같이 간결하고 명확한 문장으로 수정하여 변경사항의 주요 내용을 바로 파악할 수 있도록 해주세요.
Out of Scope Changes Check ⚠️ Warning 검색 뷰 구현 이외에 PlaceCard 색상 매핑 변경, MyClass 빈 클래스 추가, MainScreen 신선 실행 로직 도입 등 이슈 #135와 직접 관련 없는 수정사항이 함께 포함되어 있습니다. 검색 뷰 구현 관련 변경사항만을 포함하도록 PR을 분리하거나, 범위를 벗어난 변경사항을 별도의 PR로 분리해 주세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues Check ✅ Passed PR은 검색 화면 구현을 위해 SearchRoute, SearchScreen, SearchViewModel, SearchBar, SearchItem, 네비게이션 확장 함수 등을 추가하여 이슈 #135의 ‘검색 뷰 구현’ 목표를 충족하고 있습니다.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#135-search-ui

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


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.

Actionable comments posted: 6

🧹 Nitpick comments (9)
domain/search/src/main/java/com/teamsolply/solply/search/MyClass.kt (1)

3-3: 의미 없는 플레이스홀더 클래스 제거 검토

MyClass가 비어 있는 상태로 남아 있으면 추후 실제 구현과 충돌하거나 불필요한 참조가 생길 수 있습니다. 지금 단계에서 사용 목적이 없다면 파일을 제거하거나, 필요한 실제 도메인 로직/모델로 대체하는 편이 좋겠습니다.

feature/serach/src/main/java/com/teamsolply/solply/search/component/SearchItem.kt (1)

97-104: 프리뷰용 PlaceType 값 오타

실제 enum 값이 WALKING인데 "WALK"으로 찾고 있어 항상 PlaceType.ALL로 fallback 됩니다. 프리뷰라도 의도와 다르니 값 교정이 좋겠습니다.

-            val walk = PlaceType.entries.firstOrNull { it.name == "WALK" } ?: PlaceType.ALL
+            val walk = PlaceType.entries.firstOrNull { it.name == "WALKING" } ?: PlaceType.ALL
feature/main/build.gradle.kts (1)

14-14: 모듈 이름 철자 serachsearch로 정비 필요

새 기능이 “Search”를 의미하는데 모듈/의존성 이름이 모두 serach로 등록되어 있습니다. 지금 바로 정리하지 않으면 이후 레이어 전반에 오타가 굳어져 유지보수가 어려워집니다. 모듈 디렉터리와 Gradle 식별자를 search로 통일해 주세요.

feature/serach/src/main/java/com/teamsolply/solply/search/SearchContract.kt (2)

13-15: Public API에서 PersistentList 노출 지양(ImmutableList로 완화 권장)

구현 세부(퍼시스턴트 컬렉션) 노출을 줄이기 위해 PersistentList 대신 ImmutableList(또는 단순 List)로 표면화하는 것이 좋습니다. 기본값은 그대로 persistentListOf()를 사용해도 됩니다.

 import kotlinx.collections.immutable.PersistentList
+import kotlinx.collections.immutable.ImmutableList
 import kotlinx.collections.immutable.persistentListOf

 data class SearchState(
     val query: String = "",
     val isLoading: Boolean = false,
-    val results: PersistentList<SearchItemUi> = persistentListOf(),
+    val results: ImmutableList<SearchItemUi> = persistentListOf(),
     val selectedTownId: Long? = null
 )

Also applies to: 7-8


21-26: id 네이밍을 placeId로 명확화(가독성/일관성 향상)

SearchItemUi.idClickItem(id)는 의미상 장소 식별자이므로 placeId로 변경 시 의도가 선명해집니다. 초기 단계라면 지금 반영하는 편이 장기 유지보수에 유리합니다(호출부 전반 수정 필요).

 data class SearchItemUi(
-    val id: Long,
+    val placeId: Long,
     val name: String,
     val tag: PlaceType,
     val address: String,
     val imageUrl: String
 )

 sealed interface SearchIntent : UiIntent {
     data class QueryChanged(val value: String) : SearchIntent
     data object ClearQuery : SearchIntent
     data object Submit : SearchIntent
-    data class ClickItem(val id: Long) : SearchIntent
+    data class ClickItem(val placeId: Long) : SearchIntent
     data object ClickNoResult : SearchIntent
     data object Retry : SearchIntent
 }

Also applies to: 32-33

feature/serach/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (4)

41-50: LaunchedEffect 중복 및 키 보강(뷰모델에 바인딩하고 하나로 합치기)

동일 키(Unit)로 두 개의 LaunchedEffect를 사용 중입니다. viewModel을 키로 하나의 블록에 합치면 수명 관리가 명확해지고 재수집 이슈를 줄일 수 있습니다.

-    LaunchedEffect(Unit) {
-        viewModel.sideEffect.collectLatest { se ->
-            when (se) {
-                is SearchSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(se.townId, se.placeId)
-                SearchSideEffect.NavigateToNoResult -> onNoPlaceClick()
-            }
-        }
-    }
-    LaunchedEffect(Unit) { viewModel.sendIntent(SearchIntent.Retry) }
+    LaunchedEffect(viewModel) {
+        viewModel.sendIntent(SearchIntent.Retry)
+        viewModel.sideEffect.collectLatest { se ->
+            when (se) {
+                is SearchSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(se.townId, se.placeId)
+                SearchSideEffect.NavigateToNoResult -> onNoPlaceClick()
+            }
+        }
+    }

121-130: 불필요한 toImmutableList 제거 및 리스트 key 추가

이미 PersistentList이므로 복사/변환 불필요합니다. 또한 itemsIndexedkey를 제공해 항목 식별 안정성과 성능을 개선하세요.

-import kotlinx.collections.immutable.toImmutableList
@@
-                val items = state.results.toImmutableList()
-                itemsIndexed(items) { _, item ->
+                itemsIndexed(
+                    state.results,
+                    key = { _, item -> item.id } // placeId로 이름 변경 시 item.placeId
+                ) { _, item ->
                     SearchItem(
-                        placeName = item.name,
-                        placeTag = item.tag,
-                        placeAddress = item.address,
-                        placeImageUrl = item.imageUrl,
-                        onClick = { onClickItem(item.id) }
+                        placeName = item.name,
+                        placeTag = item.tag,
+                        placeAddress = item.address,
+                        placeImageUrl = item.imageUrl,
+                        onClick = { onClickItem(item.id) } // placeId로 이름 변경 시 item.placeId
                     )
                 }

Also applies to: 29-29


82-84: 하드코딩 문자열 → stringResource로 i18n/접근성 강화

문자열을 리소스로 분리하고 stringResource를 사용하세요. 접근성용 contentDescription도 리소스화 권장합니다.

 import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import com.teamsolply.solply.search.R
@@
-        SolplyTopBar(
-            barText = "검색하기",
+        SolplyTopBar(
+            barText = stringResource(R.string.search_title),
             onBackButtonClick = onBack
         )
@@
-            Text(
-                text = "검색 결과 ${state.resultCount}개",
+            Text(
+                text = stringResource(R.string.search_result_count, state.resultCount),
                 style = SolplyTheme.typography.button14M,
                 color = SolplyTheme.colors.gray800,
                 modifier = Modifier.padding(start = 20.dp, top = 32.dp, bottom = 16.dp)
             )
@@
-                        Text(
-                            text = "찾는 장소가 없어요",
+                        Text(
+                            text = stringResource(R.string.search_no_result),
                             style = SolplyTheme.typography.button14M,
                             color = SolplyTheme.colors.gray700,
                             modifier = Modifier.weight(1f)
                         )
                         Icon(
                             painter = painterResource(id = com.teamsolply.solply.designsystem.R.drawable.ic_arrow_right_icon),
-                            contentDescription = "arrow-right-icon",
+                            contentDescription = stringResource(R.string.cd_arrow_right),
                             tint = SolplyTheme.colors.gray700
                         )

추가 리소스(참고):

<!-- feature/serach/src/main/res/values/strings.xml -->
<resources>
    <string name="search_title">검색하기</string>
    <string name="search_result_count">검색 결과 %1$d개</string>
    <string name="search_no_result">찾는 장소가 없어요</string>
    <string name="cd_arrow_right">다음으로 이동</string>
</resources>

Also applies to: 101-106, 147-158, 21-22


1-1: 모듈 경로 오타: feature/serach → feature/search로 정리 권장

경로 오타는 IDE 검색/탐색, 스크립트, 신규 팀원의 탐색성을 해칩니다. 모듈/패키지/gradle 설정 일괄 리네임을 고려해주세요.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 769c77a and 3489f78.

📒 Files selected for processing (22)
  • app/build.gradle.kts (1 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt (1 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/searchbar/SolplySearchBar.kt (1 hunks)
  • domain/search/.gitignore (1 hunks)
  • domain/search/build.gradle.kts (1 hunks)
  • domain/search/src/main/java/com/teamsolply/solply/search/MyClass.kt (1 hunks)
  • feature/main/build.gradle.kts (1 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainActivity.kt (1 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (2 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (3 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt (0 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (0 hunks)
  • feature/serach/.gitignore (1 hunks)
  • feature/serach/build.gradle.kts (1 hunks)
  • feature/serach/proguard-rules.pro (1 hunks)
  • feature/serach/src/main/AndroidManifest.xml (1 hunks)
  • feature/serach/src/main/java/com/teamsolply/solply/search/SearchContract.kt (1 hunks)
  • feature/serach/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (1 hunks)
  • feature/serach/src/main/java/com/teamsolply/solply/search/SearchViewModel.kt (1 hunks)
  • feature/serach/src/main/java/com/teamsolply/solply/search/component/SearchItem.kt (1 hunks)
  • feature/serach/src/main/java/com/teamsolply/solply/search/navigation/SearchNavigation.kt (1 hunks)
  • settings.gradle.kts (1 hunks)
💤 Files with no reviewable changes (2)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt
👮 Files not reviewed due to content moderation or server errors (5)
  • app/build.gradle.kts
  • feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt
  • domain/search/build.gradle.kts
  • feature/main/src/main/java/com/teamsolply/solply/main/MainActivity.kt
  • feature/serach/build.gradle.kts
🧰 Additional context used
🧬 Code graph analysis (6)
feature/serach/src/main/java/com/teamsolply/solply/search/component/SearchItem.kt (4)
core/ui/src/main/java/com/teamsolply/solply/ui/text/TextUtil.kt (1)
  • formatTextToPlaceItemTitle (66-70)
core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt (1)
  • AdaptationImage (15-69)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/chip/PlaceTag.kt (1)
  • PlaceTag (15-54)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/theme/Theme.kt (1)
  • SolplyTheme (46-53)
feature/serach/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (3)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/topbar/SolplyTopBar.kt (1)
  • SolplyTopBar (21-54)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/searchbar/SolplySearchBar.kt (1)
  • SolplySearchbar (27-85)
feature/serach/src/main/java/com/teamsolply/solply/search/component/SearchItem.kt (1)
  • SearchItem (29-90)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/searchbar/SolplySearchBar.kt (1)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/theme/Theme.kt (1)
  • SolplyTheme (46-53)
feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (2)
feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (1)
  • rememberMainNavigator (151-156)
feature/serach/src/main/java/com/teamsolply/solply/search/navigation/SearchNavigation.kt (1)
  • searchNavGraph (16-30)
feature/serach/src/main/java/com/teamsolply/solply/search/navigation/SearchNavigation.kt (2)
feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (1)
  • navigate (38-75)
feature/serach/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (1)
  • SearchRoute (32-61)
feature/serach/src/main/java/com/teamsolply/solply/search/SearchViewModel.kt (1)
core/ui/src/main/java/com/teamsolply/solply/ui/base/BaseViewModel.kt (2)
  • reduce (44-46)
  • postSideEffect (48-52)
🔇 Additional comments (7)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt (1)

58-62: 기본 타입 배경색 변경 의도 확인 필요

기본(else) 케이스의 배경색을 purple500으로 바꾸면 아이콘 색(gray400)과의 대비가 줄어들어 가독성이 떨어질 수 있습니다. 의도된 디자인인지 한 번 더 확인해 주세요.

feature/serach/.gitignore (1)

1-1: /build 무시 규칙 추가 👍

새 모듈의 빌드 산출물을 깔끔하게 제외할 수 있어요. 잘 적용하셨습니다.

domain/search/.gitignore (1)

1-1: /build 무시 규칙 추가 👍

도메인 모듈에서도 동일한 제외 규칙이 필요했는데 잘 챙겨주셨습니다.

feature/serach/src/main/AndroidManifest.xml (1)

1-4: 빈 매니페스트 구성 OK

현재는 컴포넌트 선언이 없지만, 모듈 등록용 기본 매니페스트로 적절합니다.

feature/serach/proguard-rules.pro (1)

1-21: 프로가드 기본 템플릿 확보 완료

향후 난독화 규칙을 추가할 때 여기서 바로 관리할 수 있어 좋습니다.

settings.gradle.kts (1)

66-67: 모듈 include 이름도 search로 통일해야 합니다

위에서 언급한 대로 feature 모듈 철자 오타가 settings에도 반복되고 있습니다. 실제 기능명을 반영하도록 :feature:search로 정리해 주세요.

feature/serach/src/main/java/com/teamsolply/solply/search/SearchContract.kt (1)

37-40: 계약(사이드 이펙트) 정의 깔끔합니다

네이게이션 목적의 사이드 이펙트 분리와 페이로드 구성 모두 적절합니다.

Comment on lines +54 to +60
BasicTextField(
value = query,
onValueChange = onQueryChange,
modifier = modifier
.weight(1f)
.fillMaxWidth()
.focusRequester(focusRequester),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

weight import 누락으로 컴파일이 실패합니다.

Line 58에서 .weight(1f)를 호출하지만 androidx.compose.foundation.layout.weight import가 없어서 빌드가 멈춥니다. 아래처럼 import를 추가해 주세요.

+import androidx.compose.foundation.layout.weight
📝 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.

Suggested change
BasicTextField(
value = query,
onValueChange = onQueryChange,
modifier = modifier
.weight(1f)
.fillMaxWidth()
.focusRequester(focusRequester),
// Add at the top of SolplySearchBar.kt alongside the other Compose imports
import androidx.compose.foundation.layout.weight
🤖 Prompt for AI Agents
In
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/searchbar/SolplySearchBar.kt
around lines 54 to 60, the call to .weight(1f) causes a compile error because
the androidx.compose.foundation.layout.weight import is missing; add the import
statement for androidx.compose.foundation.layout.weight at the top of the file
(with the other imports) so Modifier.weight is resolved and the file compiles.

Comment on lines +71 to +87
LaunchedEffect(navController) {
val initialDestination = snapshotFlow { navController.currentBackStackEntry }
.filterNotNull()
.first()
.destination

if (!initialDestination.hasRoute(Search::class)) {
val initialNavOptions = navOptions {
popUpTo(0) {
inclusive = true
}
launchSingleTop = true
}
navigator.navigateToSearch(initialNavOptions)
}
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

초기 백스택 조회가 영원히 완료되지 않는 버그가 있습니다

navController.currentBackStackEntry는 Compose 스냅샷 상태가 아니어서 snapshotFlow가 이후 변경을 감지하지 못합니다. 첫 읽기가 null이면 filterNotNull().first()가 끝까지 대기하여 검색 화면으로의 초기 진입이 절대 실행되지 않습니다. 콜드 스타트에서 실제로 이런 상황이 발생하기 때문에 필수 수정이 필요합니다.

         LaunchedEffect(navController) {
-            val initialDestination = snapshotFlow { navController.currentBackStackEntry }
-                .filterNotNull()
-                .first()
-                .destination
+            val initialDestination = navController.currentBackStackEntryFlow
+                .filterNotNull()
+                .first()
+                .destination

import androidx.navigation.currentBackStackEntryFlow 추가도 함께 필요합니다.

🤖 Prompt for AI Agents
In feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt around
lines 71-87, the use of snapshotFlow { navController.currentBackStackEntry }
never observes later changes because currentBackStackEntry is not a Compose
snapshot state; replace it with navController.currentBackStackEntryFlow and
change the await to use filterNotNull().first() on that flow to obtain the
initial destination without hanging, and add the import
androidx.navigation.currentBackStackEntryFlow at the top of the file.

import com.teamsolply.solply.model.PlaceType
import com.teamsolply.solply.ui.extension.customClickable
import com.teamsolply.solply.ui.image.AdaptationImage
import formatTextToPlaceItemTitle
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

임포트 구문 때문에 컴파일이 실패합니다

Kotlin 최상위 함수는 FQCN으로 임포트해야 합니다. 현재 import formatTextToPlaceItemTitle는 패키지명이 없어 빌드 에러가 발생합니다.

적용 diff는 아래와 같습니다.

-import formatTextToPlaceItemTitle
+import com.teamsolply.solply.ui.text.formatTextToPlaceItemTitle
📝 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.

Suggested change
import formatTextToPlaceItemTitle
import com.teamsolply.solply.ui.text.formatTextToPlaceItemTitle
🤖 Prompt for AI Agents
In
feature/serach/src/main/java/com/teamsolply/solply/search/component/SearchItem.kt
around line 27, the import line "import formatTextToPlaceItemTitle" is missing
the package FQCN and causes a compile error; update the import to the function's
fully-qualified package name (e.g. import
com.teamsolply.solply.utils.formatTextToPlaceItemTitle or the actual package
where the top-level function is declared), save, and ensure the file compiles.

Comment on lines +12 to +14
fun NavController.navigateSearch(navOptions: NavOptions) {
navigate(Search, navOptions)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

navigate 확장 함수 import 누락으로 컴파일 오류 발생

Line 13에서 navigate(Search, navOptions)를 호출하지만, 이를 제공하는 com.teamsolply.solply.navigation.navigate 확장 함수를 import하지 않아 컴파일 단계에서 Unresolved reference: navigate 오류가 발생합니다. 아래와 같이 import를 추가해주세요.

 import androidx.navigation.compose.composable
 import com.teamsolply.solply.navigation.Route
+import com.teamsolply.solply.navigation.navigate
📝 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.

Suggested change
fun NavController.navigateSearch(navOptions: NavOptions) {
navigate(Search, navOptions)
}
import androidx.navigation.compose.composable
import com.teamsolply.solply.navigation.Route
import com.teamsolply.solply.navigation.navigate
🤖 Prompt for AI Agents
In
feature/serach/src/main/java/com/teamsolply/solply/search/navigation/SearchNavigation.kt
around lines 12 to 14, the call to navigate(Search, navOptions) fails to compile
because the extension function com.teamsolply.solply.navigation.navigate is not
imported; add an import for com.teamsolply.solply.navigation.navigate at the top
of the file so the extension function is resolved and the call compiles.

Comment on lines +91 to +96
onQueryChange = {
onQueryChanged(it)
if (it.isBlank()) {
onClearQuery()
}
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

빈 문자열 입력 시 이중 인텐트 전송 가능성 제거

현재 빈 문자열일 때 QueryChangedClearQuery가 모두 호출될 수 있습니다. 중복 요청/연산을 줄이도록 분기에서 하나만 보내세요.

-            onQueryChange = {
-                onQueryChanged(it)
-                if (it.isBlank()) {
-                    onClearQuery()
-                }
-            },
+            onQueryChange = { text ->
+                if (text.isBlank()) onClearQuery() else onQueryChanged(text)
+            },
📝 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.

Suggested change
onQueryChange = {
onQueryChanged(it)
if (it.isBlank()) {
onClearQuery()
}
},
onQueryChange = { text ->
if (text.isBlank()) onClearQuery() else onQueryChanged(text)
},
🤖 Prompt for AI Agents
feature/serach/src/main/java/com/teamsolply/solply/search/SearchScreen.kt around
lines 91-96: 현재 빈 문자열 입력 시 onQueryChanged와 onClearQuery가 둘 다 호출되어 중복 인텐트가 발생할 수
있으니, 입력이 빈 문자열인지 먼저 검사하여 빈 문자열이면 onClearQuery만 호출하고 그렇지 않으면 onQueryChanged를
호출하도록 분기 순서를 바꿔(또는 early return 사용) 한 번만 실행되게 수정하세요.

Comment on lines +104 to +108
id = 2,
name = "솔플리솔플리",
tag = PlaceType.BOOKSTORE,
imageUrl = ""
),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

필수 생성자 인자 누락으로 컴파일 에러가 납니다

SearchItemUiaddress가 필수 파라미터인데, 두 번째 더미 데이터에서 누락되어 컴파일이 실패합니다. 값 추가가 필요합니다.

다음 수정으로 해결할 수 있습니다:

             SearchItemUi(
                 id = 2,
                 name = "솔플리솔플리",
                 tag = PlaceType.BOOKSTORE,
-                imageUrl = ""
+                address = "주소주소주소주소",
+                imageUrl = ""
             ),
🤖 Prompt for AI Agents
In feature/serach/src/main/java/com/teamsolply/solply/search/SearchViewModel.kt
around lines 104 to 108, the second dummy SearchItemUi is missing the required
constructor parameter `address`, causing a compile error; add a suitable address
value (e.g., an empty string or realistic dummy address) to that SearchItemUi
instantiation so all required parameters match the class constructor.

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.

[Feature] 검색 뷰 구현

2 participants