Skip to content
Open
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
ed79214
feat: collection 피처 모듈 생성
devfeijoa Jul 28, 2026
8ef6498
feat: collection 모듈 내 Navigation Compose 의존성 추가
devfeijoa Jul 28, 2026
1d920b3
feat: 컬렉션 기능 구성을 위한 임시 화면 추가
devfeijoa Jul 28, 2026
d5613f6
feat: 컬렉션 기능 내 탐색을 위한 CollectionNavHost 구현
devfeijoa Jul 28, 2026
f86631e
feat: app 모듈 내 컬렉션 피처 모듈 의존성 추가
devfeijoa Jul 28, 2026
23a17d9
feat: Collection 화면 진입을 위한 CollectionActivity 추가
devfeijoa Jul 28, 2026
e1777ed
feat: `CollectionActivity` 내 `AndroidEntryPoint` 어노테이션 추가
devfeijoa Jul 28, 2026
89bbc45
feat: 컬렉션 화면 액티비티(CollectionActivity) 등록
devfeijoa Jul 28, 2026
5027cb0
feat: 컬렉션 목록 진입을 위한 CollectionEntry 컴포저블 추가
devfeijoa Jul 28, 2026
63b0259
feat: 마이페이지 내 컬렉션 진입 섹션 레이아웃 추가
devfeijoa Jul 28, 2026
233767c
feat: 마이페이지 내 컬렉션 진입부 추가
devfeijoa Jul 28, 2026
8e94a05
feat: 컬렉션 화면 내 상단 앱바 추가 및 구조 개선
devfeijoa Jul 28, 2026
e8ee43c
feat: 컬렉션 화면 내 탭 바 컴포저블 추가 및 적용
devfeijoa Jul 28, 2026
462a4b3
feat: 컬렉션 화면 내 탭 선택 기능 구현
devfeijoa Jul 28, 2026
82b98f0
feat: 컬렉션 생성 버튼 컴포넌트 추가 및 적용
devfeijoa Jul 28, 2026
55f7aab
fix: 컬렉션 화면 내 임시 레이아웃 제거
devfeijoa Jul 28, 2026
297de49
refactor: CollectionCreateButton 컴포저블 코드 스타일 및 포맷팅 수정
devfeijoa Jul 28, 2026
6444759
refactor: 코드 스타일 및 포맷팅 수정
devfeijoa Jul 28, 2026
a88bea1
feat: 컬렉션 생성 화면 추가 및 네비게이션 연결
devfeijoa Jul 28, 2026
e7c39cb
feat: 컬렉션 생성 버튼 내 클릭 상호작용 추가
devfeijoa Jul 28, 2026
142052d
feat: 컬렉션 화면 내 생성 화면 이동 로직 추가
devfeijoa Jul 28, 2026
bf8acfa
feat: 컬렉션 생성 화면 내 앱바 추가 및 레이아웃 수정
devfeijoa Jul 28, 2026
bccf4ef
refactor: 컬렉션 생성 화면 내 임시 플레이스홀더 제거
devfeijoa Jul 28, 2026
2b1a3b6
feat: 컬렉션 생성 화면 내 공개 여부 설정 컴포넌트 추가
devfeijoa Jul 28, 2026
33b02f9
feat: 컬렉션 생성 화면 내 이름 입력 컴포넌트 추가
devfeijoa Jul 28, 2026
4b72b18
feat: 컬렉션 생성 화면 내 설명 입력 필드 추가
devfeijoa Jul 29, 2026
a5add47
feat: 컬렉션 생성 화면 내 작품 리스트 섹션 추가
devfeijoa Jul 29, 2026
5c4c650
feat: 컬렉션 생성 내 작품 검색 화면 추가 및 내비게이션 연결
devfeijoa Jul 29, 2026
66f75e1
feat: 컬렉션 작품 검색 화면 내 검색 필드 추가 및 UI 수정
devfeijoa Jul 29, 2026
7618ed9
feat: 컬렉션 작품 검색 필드 입력 기능 및 자동 포커스 구현
devfeijoa Jul 29, 2026
5ca78ec
refactor: consolidate collection app bars
devfeijoa Jul 31, 2026
cf66bbb
feat: 컬렉션 내 서재 작품 선택 화면 추가 및 검색 화면 연동
devfeijoa Jul 31, 2026
8611773
feat: 필터 없는 서재 작품 조회 추가
devfeijoa Jul 31, 2026
40495c7
feat: 컬렉션 서재 작품 항목 추가
devfeijoa Jul 31, 2026
103e3d3
feat: 서재 작품 컬렉션 모델 변환 추가
devfeijoa Jul 31, 2026
fe6c6d7
feat: feature/collection 모듈 내 Navigation 및 Paging Compose 의존성 추가
devfeijoa Aug 1, 2026
c151f1a
feat: 컬렉션 생성 내 서재 작품 선택 기능 구현
devfeijoa Aug 1, 2026
6800b0d
feat: 컬렉션 서재 소설 선택 화면 내 로딩 인디케이터 추가
devfeijoa Aug 1, 2026
47ecaa8
feat: 컬렉션 서재 내 작품 선택 화면 하단 로딩 인디케이터 추가
devfeijoa Aug 1, 2026
f1c82ce
refactor: 서재 관련 레포지토리 내 함수 코드 포맷팅 수정
devfeijoa Aug 3, 2026
6f1ab63
feat: 서재 작품 선택 화면 내 데이터 로드 실패 대응 UI 추가
devfeijoa Aug 6, 2026
3f3190c
fix: 서재 작품 선택 화면 내 에러 상태 처리 로직 개선
devfeijoa Aug 11, 2026
8bd7f27
feat: novel 데이터 모듈 추가
devfeijoa Aug 12, 2026
a3e392b
feat: 작품 검색 엔티티 추가
devfeijoa Aug 12, 2026
9e36cde
feat: 작품 검색 응답 모델 추가
devfeijoa Aug 12, 2026
5ed8c99
feat: 작품 검색 API 추가
devfeijoa Aug 12, 2026
2f7fbf3
feat: 작품 검색 API 의존성 연결
devfeijoa Aug 12, 2026
21f62c0
feat: 작품 검색 PagingSource 기본 요청 구현
devfeijoa Aug 12, 2026
592c049
feat: 작품 검색 Paging 페이지 연결
devfeijoa Aug 12, 2026
9cf8a68
feat: 작품 검색 Paging 오류 처리
devfeijoa Aug 12, 2026
11b553e
feat: 컬렉션 작품 검색 화면 내 검색 및 선택 기능 구현
devfeijoa Aug 13, 2026
1c3f56e
fix: 검색 결과 다음 페이지 오류 시 기존 목록을 유지한다
devfeijoa Aug 13, 2026
f606ff5
feat: 작품 검색 결과 당겨서 새로고침을 지원
devfeijoa Aug 13, 2026
50450e1
feat: 컬렉션 내 소설 검색 및 선택 아이템 컴포저블 구현
devfeijoa Aug 13, 2026
d3f82c8
feat: 컬렉션 내 선택된 소설 정보를 담는 데이터 클래스 추가
devfeijoa Aug 13, 2026
8e279b3
feat: 작품 검색 관련 Repository 구현
devfeijoa Aug 13, 2026
b0b33ef
build: 컬렉션 모듈에 작품 데이터 의존성 추가
devfeijoa Aug 13, 2026
e7bb147
feat: 컬렉션 내 작품 검색을 위한 ViewModel 추가
devfeijoa Aug 13, 2026
88af5a2
feat: 컬렉션 공통 네트워크 오류 화면 구현
devfeijoa Aug 13, 2026
6d5131e
feat: 컬렉션 작품 검색 필드 내 검색 동작 추가 및 접근성 개선
devfeijoa Aug 13, 2026
be65f54
refactor: 컬렉션 서재 내 작품 선택 관리 로직을 ID에서 객체 기반으로 변경
devfeijoa Aug 14, 2026
16c62f2
refactor: 컬렉션 서재 화면의 선택 상태를 객체 기반으로 연결
devfeijoa Aug 14, 2026
952ae43
refactor: 서재 네트워크 오류 UI를 공통 컴포넌트로 대체
devfeijoa Aug 14, 2026
5e7ccea
feat: 검색과 서재의 작품 선택 상태를 통합
devfeijoa Aug 14, 2026
1e0de84
fix: 컬렉션 작품 검색 아이템 레이아웃 수정
devfeijoa Aug 14, 2026
572675f
refactor: CollectionNovelSearchItem 내 import 문 정렬
devfeijoa Aug 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ dependencies {
implementation(projects.feature.signin)
implementation(projects.feature.library)
implementation(projects.feature.feed)
implementation(projects.feature.collection)

// AndroidX 및 Jetpack 기본 라이브러리
implementation(libs.androidx.core.ktx)
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@
android:name=".ui.main.MainActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.collection.CollectionActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.notification.NotificationActivity"
android:exported="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.into.websoso.ui.collection

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.into.websoso.core.designsystem.theme.WebsosoTheme
import com.into.websoso.feature.collection.CollectionNavHost
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class CollectionActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContent {
WebsosoTheme {
CollectionNavHost(onNavigateBack = ::finish)
}
}
}

companion object {
fun getIntent(context: Context): Intent = Intent(context, CollectionActivity::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
Expand All @@ -28,11 +29,14 @@ import com.into.websoso.core.common.util.SingleEventHandler
import com.into.websoso.core.common.util.getS3ImageUrl
import com.into.websoso.core.common.util.setListViewHeightBasedOnChildren
import com.into.websoso.core.common.util.tracker.Tracker
import com.into.websoso.core.designsystem.theme.WebsosoTheme
import com.into.websoso.core.resource.R.drawable.img_loading_thumbnail
import com.into.websoso.core.resource.R.string.my_library_attractive_point_fixed_text
import com.into.websoso.data.model.GenrePreferenceEntity
import com.into.websoso.data.model.NovelPreferenceEntity
import com.into.websoso.databinding.FragmentMyPageBinding
import com.into.websoso.feature.collection.component.CollectionEntry
import com.into.websoso.ui.collection.CollectionActivity
import com.into.websoso.ui.main.MainViewModel
import com.into.websoso.ui.main.myPage.MyLibraryViewModel
import com.into.websoso.ui.main.myPage.adapter.RestGenrePreferenceAdapter
Expand Down Expand Up @@ -77,6 +81,7 @@ class MyPageFragment : BaseFragment<FragmentMyPageBinding>(fragment_my_page) {
setupObserver()
onProfileEditClick()
onStorageButtonClick()
setupCollectionEntry()
tracker.trackEvent("mypage")
}

Expand All @@ -92,6 +97,23 @@ class MyPageFragment : BaseFragment<FragmentMyPageBinding>(fragment_my_page) {
binding.lifecycleOwner = viewLifecycleOwner
}

private fun setupCollectionEntry() {
binding.cvMyPageCollectionEntry.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
WebsosoTheme {
CollectionEntry(onClick = ::navigateToCollection)
}
}
}
}

private fun navigateToCollection() {
singleEventHandler.throttleFirst {
startActivity(CollectionActivity.getIntent(requireContext()))
}
}

private fun setupRestGenrePreferenceAdapter() {
binding.lvMyLibraryRestGenre.adapter = restGenrePreferenceAdapter
}
Expand Down
21 changes: 19 additions & 2 deletions app/src/main/res/layout/fragment_my_page.xml
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,28 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_my_page_user_profile" />

<androidx.compose.ui.platform.ComposeView
android:id="@+id/cv_my_page_collection_entry"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider" />

<View
android:id="@+id/view_my_page_collection_divider"
android:layout_width="0dp"
android:layout_height="3dp"
android:background="@color/gray_50_F4F5F8"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cv_my_page_collection_entry" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_my_library_genre_preference"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider"
app:layout_constraintTop_toBottomOf="@id/view_my_page_collection_divider"
tools:layout_editor_absoluteX="0dp">

<TextView
Expand Down Expand Up @@ -447,7 +464,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider">
app:layout_constraintTop_toBottomOf="@id/view_my_page_collection_divider">

<TextView
android:id="@+id/tv_my_library_preference_analysis_title"
Expand Down
23 changes: 23 additions & 0 deletions core/resource/src/main/res/drawable/ic_collection_create.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="19.44"
android:viewportHeight="19.44">
<path
android:pathData="M9.707,0.36C14.838,0.36 19.08,4.593 19.08,9.716C19.08,14.847 14.847,19.08 9.716,19.08C4.593,19.08 0.36,14.847 0.36,9.716C0.36,4.594 4.584,0.36 9.707,0.36Z"
android:fillColor="#FFFFFF"
android:strokeColor="#EEEEF2"
android:strokeWidth="0.72" />
<path
android:pathData="M5.4,9.72L14.04,9.72"
android:fillColor="#00000000"
android:strokeColor="#6A5DFD"
android:strokeLineCap="round"
android:strokeWidth="2.254" />
<path
android:pathData="M9.72,5.4L9.72,14.04"
android:fillColor="#00000000"
android:strokeColor="#6A5DFD"
android:strokeLineCap="round"
android:strokeWidth="2.254" />
</vector>
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ interface LibraryRepository {

fun getLibraryFlow(): Flow<PagingData<NovelEntity>>

fun getUnfilteredLibraryFlow(): Flow<PagingData<NovelEntity>>

suspend fun getRegisteredKeywords(): List<LibraryKeywordEntity>

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,25 +39,10 @@ class MyLibraryRepository
@OptIn(ExperimentalCoroutinesApi::class)
override fun getLibraryFlow(): Flow<PagingData<NovelEntity>> =
filterRepository.filterFlow
.flatMapLatest { currentFilter ->
Pager(
config = PagingConfig(
pageSize = PAGE_SIZE,
enablePlaceholders = false,
),
pagingSourceFactory = {
LibraryPagingSource(
getNovels = { cursor ->
getUserNovels(cursor, currentFilter).also { result ->
_novelTotalCount.update {
result.getOrNull()?.userNovelCount ?: 0
}
}
},
)
},
).flow
}
.flatMapLatest(::createLibraryFlow)

override fun getUnfilteredLibraryFlow(): Flow<PagingData<NovelEntity>> =
createLibraryFlow(LibraryFilter())

override suspend fun getRegisteredKeywords(): List<LibraryKeywordEntity> {
val userId = accountRepository.userIdFlow.first { it != 0L }
Expand Down Expand Up @@ -87,6 +72,25 @@ class MyLibraryRepository
)
}

private fun createLibraryFlow(libraryFilter: LibraryFilter): Flow<PagingData<NovelEntity>> =
Pager(
config = PagingConfig(
pageSize = PAGE_SIZE,
enablePlaceholders = false,
),
pagingSourceFactory = {
LibraryPagingSource(
getNovels = { cursor ->
getUserNovels(cursor, libraryFilter).also { result ->
_novelTotalCount.update {
result.getOrNull()?.userNovelCount ?: 0
}
}
},
)
},
).flow

private fun LibraryFilter.toRatingRangeParams(): Pair<Float?, Float?> =
when {
isRatingless -> null to null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,25 +43,10 @@ internal class UserLibraryRepository
@OptIn(ExperimentalCoroutinesApi::class)
override fun getLibraryFlow(): Flow<PagingData<NovelEntity>> =
filterRepository.filterFlow
.flatMapLatest { currentFilter ->
Pager(
config = PagingConfig(
pageSize = PAGE_SIZE,
enablePlaceholders = false,
),
pagingSourceFactory = {
LibraryPagingSource(
getNovels = { cursor ->
getUserNovels(cursor, currentFilter).also { result ->
_novelTotalCount.update {
result.getOrNull()?.userNovelCount ?: 0
}
}
},
)
},
).flow
}
.flatMapLatest(::createLibraryFlow)

override fun getUnfilteredLibraryFlow(): Flow<PagingData<NovelEntity>> =
createLibraryFlow(LibraryFilter())

override suspend fun getRegisteredKeywords() = libraryRemoteDataSource.getUserNovelKeywords(userId = userId)

Expand All @@ -88,6 +73,25 @@ internal class UserLibraryRepository
)
}

private fun createLibraryFlow(libraryFilter: LibraryFilter): Flow<PagingData<NovelEntity>> =
Pager(
config = PagingConfig(
pageSize = PAGE_SIZE,
enablePlaceholders = false,
),
pagingSourceFactory = {
LibraryPagingSource(
getNovels = { cursor ->
getUserNovels(cursor, libraryFilter).also { result ->
_novelTotalCount.update {
result.getOrNull()?.userNovelCount ?: 0
}
}
},
)
},
).flow

private fun LibraryFilter.toRatingRangeParams(): Pair<Float?, Float?> =
when {
isRatingless -> null to null
Expand Down
16 changes: 16 additions & 0 deletions feature/collection/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import com.into.websoso.setNamespace

plugins {
id("websoso.android.feature")
}

android {
setNamespace("feature.collection")
}

dependencies {
implementation(projects.data.library)

implementation(libs.navigation.compose)
implementation(libs.paging.compose)
}
4 changes: 4 additions & 0 deletions feature/collection/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.into.websoso.feature.collection

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.into.websoso.core.designsystem.theme.WebsosoTheme
import com.into.websoso.core.designsystem.theme.White
import com.into.websoso.feature.collection.component.CollectionAppBar
import com.into.websoso.feature.collection.component.CollectionDescriptionInput
import com.into.websoso.feature.collection.component.CollectionNameInput
import com.into.websoso.feature.collection.component.CollectionNovelSection
import com.into.websoso.feature.collection.component.CollectionPrivacySetting

@Composable
internal fun CollectionCreateScreen(
onNavigateBack: () -> Unit,
onNavigateToNovelSearch: () -> Unit,
modifier: Modifier = Modifier,
) {
var isPrivate by rememberSaveable { mutableStateOf(false) }
var collectionName by rememberSaveable { mutableStateOf("") }
var collectionDescription by rememberSaveable { mutableStateOf("") }

Column(
modifier = modifier
.fillMaxSize()
.background(White)
.statusBarsPadding(),
) {
CollectionAppBar(
actionLabel = "완료",
onNavigateBack = onNavigateBack,
)
CollectionPrivacySetting(
isPrivate = isPrivate,
onPrivateChange = { isPrivate = it },
)
CollectionNameInput(
value = collectionName,
onValueChange = { collectionName = it },
modifier = Modifier.padding(
start = 20.dp,
top = 20.dp,
end = 20.dp,
),
)
CollectionDescriptionInput(
value = collectionDescription,
onValueChange = { collectionDescription = it },
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
CollectionNovelSection(
onAddNovelClick = onNavigateToNovelSearch,
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
Comment on lines +34 to +73

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate and inspect the target file and relevant Compose modifiers/usages.
target="feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionCreateScreen.kt"
if [ -f "$target" ]; then
  echo "== target file size =="
  wc -l "$target"
  echo
  echo "== imports/top-level relevant sections =="
  sed -n '1,140p' "$target" | cat -n
else
  echo "Target file not found: $target"
fi

echo
echo "== imports/usages in feature/collection collection screen files =="
if [ -d feature/collection/src/main/java/com/into/websoso/feature/collection ]; then
  rg -n "VerticalScroll|verticalScroll|Scrollable|imePadding|statusBarsPadding|fillMaxSize|Column\\(|CollectionPrivac|CollectionCreateAppBar|CollectionNovelSection" feature/collection/src/main/java/com/into/websoso/feature/collection || true
fi

echo
echo "== nearby layout declarations =="
rg -n "CollectionCreateScreen|Column\\(|fillMaxSize|verticalScroll|imePadding|keyboardActions|keyboardOptions" feature/collection/src/main/java || true

Repository: Team-WSS/WSS-Android

Length of output: 12417


폼 콘텐츠를 스크롤하고 IME에 대응해 주세요.

키보드가 열리거나 화면이 작을 때 현재 고정 높이 Column으로 인해 작품 추가 영역이 화면 밖으로 밀릴 수 있습니다. verticalScrollimePadding을 적용해 주세요.

수정 예시
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.foundation.layout.imePadding

     Column(
         modifier = modifier
             .fillMaxSize()
             .background(White)
             .statusBarsPadding()
+            .imePadding()
+            .verticalScroll(rememberScrollState()),
     ) {
📝 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
Column(
modifier = modifier
.fillMaxSize()
.background(White)
.statusBarsPadding(),
) {
CollectionCreateAppBar(onNavigateBack = onNavigateBack)
CollectionPrivacySetting(
isPrivate = isPrivate,
onPrivateChange = { isPrivate = it },
)
CollectionNameInput(
value = collectionName,
onValueChange = { collectionName = it },
modifier = Modifier.padding(
start = 20.dp,
top = 20.dp,
end = 20.dp,
),
)
CollectionDescriptionInput(
value = collectionDescription,
onValueChange = { collectionDescription = it },
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
CollectionNovelSection(
onAddNovelClick = onNavigateToNovelSearch,
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
Column(
modifier = modifier
.fillMaxSize()
.background(White)
.statusBarsPadding()
.imePadding()
.verticalScroll(rememberScrollState()),
) {
CollectionCreateAppBar(onNavigateBack = onNavigateBack)
CollectionPrivacySetting(
isPrivate = isPrivate,
onPrivateChange = { isPrivate = it },
)
CollectionNameInput(
value = collectionName,
onValueChange = { collectionName = it },
modifier = Modifier.padding(
start = 20.dp,
top = 20.dp,
end = 20.dp,
),
)
CollectionDescriptionInput(
value = collectionDescription,
onValueChange = { collectionDescription = it },
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
CollectionNovelSection(
onAddNovelClick = onNavigateToNovelSearch,
modifier = Modifier.padding(
start = 20.dp,
top = 30.dp,
end = 20.dp,
),
)
🤖 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/collection/src/main/java/com/into/websoso/feature/collection/CollectionCreateScreen.kt`
around lines 34 - 70, Update the main Column in CollectionCreateScreen to
support constrained screens by applying verticalScroll with a remembered scroll
state and imePadding alongside its existing modifiers. Preserve the current
content order and spacing while ensuring the collection novel section remains
reachable when the IME is visible.

}
}

@Preview(showBackground = true)
@Composable
private fun CollectionCreateScreenPreview() {
WebsosoTheme {
CollectionCreateScreen(
onNavigateBack = {},
onNavigateToNovelSearch = {},
)
}
}
Loading
Loading