Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
4e91599
feat: 책 검색 화면 초기 구조 추가
JangMuho Jan 6, 2026
5337b5f
feat: 책 검색 화면 Route 추가
JangMuho Jan 6, 2026
ef36a13
feat: 네이버 책 API 응답에 ISBN 필드 추가
JangMuho Jan 6, 2026
7b4dfb1
remove: BookSearchUiState에서 searchResults 제거
JangMuho Jan 6, 2026
0d7dc3d
refactor: NaverBookItem의 image 필드명을 thumbnail로 변경, isbn 필드 추가
JangMuho Jan 6, 2026
d04f231
refactor: BookUIModel의 authors 필드 타입을 ImmutableList에서 String으로 변경
JangMuho Jan 6, 2026
e3b3f16
remove: BookSearchUiState에서 불필요한 import 제거
JangMuho Jan 6, 2026
be6b317
refactor: NaverBookItem 매퍼 함수 분리
JangMuho Jan 6, 2026
df78bdd
feat: BookSearchRoute 구현 및 Screen의 메소드 시그니처 구상 및 NavGraph 연결
JangMuho Jan 6, 2026
b2a5d79
Merge branch 'dev' of https://github.com/boostcampwm2025/and03-boostc…
JangMuho Jan 6, 2026
1d2e86e
feat: 책 검색 화면에 임시로 사용할 TopAppBar 구현
JangMuho Jan 6, 2026
b1eb655
remove: BookSearchUiState에서 불필요한 페이징 관련 필드 제거
JangMuho Jan 6, 2026
c55055d
Merge branch 'dev' of https://github.com/boostcampwm2025/and03-boostc…
JangMuho Jan 6, 2026
d85faba
rename: SearchResultItem의 authors 파라미터를 author로 변경
JangMuho Jan 6, 2026
47a45e9
feat: SearchTopBar에 isSaveEnabled 필드 추가
JangMuho Jan 6, 2026
03f5a3a
feat: BookSearchScreen 구현
JangMuho Jan 6, 2026
26df943
remove: BookSearchUiState에서 불필요한 속성 제거
JangMuho Jan 6, 2026
e36568f
refactor: BookSearchScreen의 Preview 추가 및 MainNavigator를 사용하도록 BookSea…
JangMuho Jan 6, 2026
b9f591f
style: BookSearchScreen의 LazyColumn 패딩 값 수정
JangMuho Jan 6, 2026
8c25789
test: 책 검색 화면의 빈 검색어 Preview 추가
JangMuho Jan 6, 2026
ea53e13
feat: 책 검색 화면에서 검색어 상태를 UI 상태와 동기화
JangMuho Jan 6, 2026
7eb1a01
fix: NaverBookItem의 @SerialName에 불필요한 공백 제거
JangMuho Jan 6, 2026
c7c1881
refactor: BookSearchScreen의 LazyColumn items의 key 형태 수정
JangMuho Jan 6, 2026
11530a8
feat: BookRepository 의존성 주입을 위한 Hilt 모듈 추가
JangMuho Jan 6, 2026
3cfa111
style: SearchResultItem의 사진과 텍스트 사이 스페이싱 추가
JangMuho Jan 6, 2026
87cc1bb
refactor: snapshotFlow를 사용하여 검색어 입력 처리 방식 변경
JangMuho Jan 6, 2026
48ce98c
Merge branch 'dev' of https://github.com/boostcampwm2025/and03-boostc…
JangMuho Jan 6, 2026
d2866eb
Merge branch 'dev' of https://github.com/JangMuho/and03-boostcamp int…
JangMuho Jan 6, 2026
11b2c82
refactor: BookSearchScreen과 SearchResultItem에 And03Padding과 And03Spac…
JangMuho Jan 6, 2026
058150e
refactor: 책 저자 데이터 타입을 String에서 ImmutableList로 변경
JangMuho Jan 6, 2026
2561acd
chore: 불필요한 공백 라인 제거
JangMuho Jan 6, 2026
12a9686
style: SearchResultItem 컴포저블 코드 포맷 정리
JangMuho Jan 6, 2026
0759346
style: BookSearchScreen/ViewModel 코드 포맷 정리
JangMuho Jan 7, 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: 0 additions & 1 deletion app/src/main/java/com/boostcamp/and03/And03Application.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.boostcamp.and03


import android.app.Application
import dagger.hilt.android.HiltAndroidApp

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.boostcamp.and03.data.di

import com.boostcamp.and03.data.repository.book.BookRepository
import com.boostcamp.and03.data.repository.book.BookRepositoryImpl
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class BookRepositoryModule {

@Binds
@Singleton
abstract fun bindBookRepository(
impl: BookRepositoryImpl
): BookRepository
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.boostcamp.and03.data.model.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NaverBookItem(
val title: String,
val image: String,
val author: String,
val publisher: String,
@SerialName("title") val title: String,
@SerialName("image") val thumbnail: String,
@SerialName("author") val author: String,
@SerialName("publisher") val publisher: String,
@SerialName("isbn") val isbn: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.boostcamp.and03.data.repository.book

import com.boostcamp.and03.data.model.response.NaverBookItem
import com.boostcamp.and03.ui.screen.booklist.model.BookUIModel
import kotlinx.collections.immutable.toImmutableList

fun NaverBookItem.toUiModel() = BookUIModel(
title = title,
authors = author.split("^").toImmutableList(),
publisher = publisher,
thumbnail = thumbnail,
isbn = isbn
)
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import coil.compose.AsyncImage
import com.boostcamp.and03.ui.theme.And03Padding
import com.boostcamp.and03.ui.theme.And03Spacing
import com.boostcamp.and03.ui.theme.And03Theme
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf

private object SearchResultItemValues {
val borderWidth = 2.dp
Expand All @@ -36,7 +38,7 @@ private object SearchResultItemValues {
fun SearchResultItem(
thumbnail: String,
title: String,
authors: String,
authors: ImmutableList<String>,
publisher: String,
isSelected: Boolean,
modifier: Modifier = Modifier,
Expand Down Expand Up @@ -66,7 +68,8 @@ fun SearchResultItem(
) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(And03Spacing.SPACE_M)
) {
AsyncImage(
model = thumbnail,
Expand All @@ -77,9 +80,7 @@ fun SearchResultItem(
)

Column(
modifier = Modifier
.fillMaxHeight()
.padding(start = And03Padding.PADDING_M),
modifier = Modifier.fillMaxHeight(),
verticalArrangement = Arrangement.SpaceEvenly
) {
Text(
Expand All @@ -90,7 +91,7 @@ fun SearchResultItem(
)

Text(
text = authors,
text = authors.joinToString(", "),
style = And03Theme.typography.bodyMedium,
color = And03Theme.colors.onSurfaceVariant,
maxLines = SearchResultItemValues.AUTHOR_PUBLISHER_MAX_LINES,
Expand Down Expand Up @@ -119,7 +120,7 @@ private fun SearchResultItemPreview() {
SearchResultItem(
thumbnail = "",
title = "책 제목",
authors = "책 저자",
authors = persistentListOf("김김김", "앤앤앤", "장장장"),
publisher = "책 출판사",
isSelected = false,
onClick = {}
Expand All @@ -130,7 +131,7 @@ private fun SearchResultItemPreview() {
title = """
선택된 책 제목. 테두리 색이 바뀌었습니다. 그런데 여기서 개행을 해야 한다면...........????????????
""".trimIndent(),
authors = "선택된 책 저자",
authors = persistentListOf("패트", "매트"),
publisher = "선택된 책 출판사",
isSelected = true,
onClick = {}
Expand Down
63 changes: 63 additions & 0 deletions app/src/main/java/com/boostcamp/and03/ui/component/SearchTopBar.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.boostcamp.and03.ui.component

import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
import com.boostcamp.and03.R
import com.boostcamp.and03.ui.theme.And03Theme

// 임시로 사용할 탑 바
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchTopBar(
title: String,
onBackClick: () -> Unit,
onSaveClick: () -> Unit,
modifier: Modifier = Modifier,
isSaveEnabled: Boolean = false
) {
CenterAlignedTopAppBar(
title = { Text(text = title) },
navigationIcon = {
IconButton(
onClick = onBackClick
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_keyboard_arrow_left_filled),
contentDescription = stringResource(R.string.content_description_go_back)
)
}
},
actions = {
IconButton(
onClick = onSaveClick,
enabled = isSaveEnabled
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_check_filled),
contentDescription = stringResource(R.string.content_description_save_button)
)
}
}
)
}

@Preview
@Composable
private fun SearchTopBarPreview() {
And03Theme {
SearchTopBar(
title = "책 검색",
onBackClick = {},
onSaveClick = {}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.compose.ui.Modifier
import androidx.navigation.compose.NavHost
import com.boostcamp.and03.ui.screen.addbook.addBookNavGraph
import com.boostcamp.and03.ui.screen.booklist.booklistNavGraph
import com.boostcamp.and03.ui.screen.booksearch.bookSearchNavGraph
import com.boostcamp.and03.ui.screen.mypage.myPageNavGraph
import com.boostcamp.and03.ui.screen.prototype.screen.SnackBarEvent

Expand All @@ -26,6 +27,11 @@ fun MainNavHost(
onShowSnackBar = onShowSnackBar
)

bookSearchNavGraph(
navigator = navigator,
modifier = modifier.padding(paddingValues)
)

addBookNavGraph(modifier = modifier.padding(paddingValues))

myPageNavGraph(modifier = modifier.padding(paddingValues))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ class MainNavigator(
}

fun navigatePopBackStack() = navController.popBackStack()

}

@SuppressLint("ComposableNaming")
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/boostcamp/and03/ui/navigation/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ sealed interface Route {
@Serializable
data object Booklist : Route

@Serializable
data object BookSearch : Route

@Serializable
data object AddBook : Route

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.boostcamp.and03.ui.screen.booksearch

import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import com.boostcamp.and03.ui.navigation.MainNavigator
import com.boostcamp.and03.ui.navigation.Route

fun NavGraphBuilder.bookSearchNavGraph(
navigator: MainNavigator,
modifier: Modifier = Modifier
) {
composable<Route.BookSearch> {
BookSearchRoute(
onBackClick = navigator::navigatePopBackStack
)
}
}
Loading