Skip to content

Commit 29e2ac1

Browse files
authored
Merge pull request #701 from Daily-DAYO/bug/issue-696
Update Search screen UI to match design requirements
2 parents 36b49b8 + 6cff078 commit 29e2ac1

File tree

12 files changed

+143
-74
lines changed

12 files changed

+143
-74
lines changed

data/src/main/java/daily/dayo/data/datasource/remote/search/SearchApiService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import retrofit2.http.Query
66

77
interface SearchApiService {
88

9-
@GET("/api/v1/search")
9+
@GET("/api/v2/search")
1010
suspend fun requestSearchTag(
1111
@Query("tag") tag: String,
12-
@Query("end") end: Int
12+
@Query("end") end: Int,
13+
@Query("order") order: String
1314
): NetworkResponse<SearchResultResponse>
1415

1516
@GET("/api/v1/search/member")

data/src/main/java/daily/dayo/data/datasource/remote/search/SearchPagingSource.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ import androidx.paging.PagingState
55
import daily.dayo.data.mapper.toSearch
66
import daily.dayo.domain.model.NetworkResponse
77
import daily.dayo.domain.model.Search
8+
import daily.dayo.domain.model.SearchOrder
89

910
class SearchPagingSource(
1011
private val apiService: SearchApiService,
1112
private val size: Int,
12-
private val tag: String
13+
private val tag: String,
14+
private val searchOrder: SearchOrder
1315
) : PagingSource<Int, Search>() {
1416

1517
override suspend fun load(
1618
params: LoadParams<Int>
1719
): LoadResult<Int, Search> {
1820
val nextPageNumber = params.key ?: 0
19-
apiService.requestSearchTag(tag = tag, end = nextPageNumber).let { ApiResponse ->
21+
apiService.requestSearchTag(tag = tag, end = nextPageNumber, order = searchOrder.toString()).let { ApiResponse ->
2022
return try {
2123
when (ApiResponse) {
2224
is NetworkResponse.Success -> {

data/src/main/java/daily/dayo/data/repository/SearchRepositoryImpl.kt

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import androidx.paging.PagingData
77
import daily.dayo.data.datasource.local.SharedManager
88
import daily.dayo.data.datasource.remote.search.SearchApiService
99
import daily.dayo.data.datasource.remote.search.SearchFollowUserPagingSource
10-
import daily.dayo.data.datasource.remote.search.SearchUserPagingSource
1110
import daily.dayo.data.datasource.remote.search.SearchPagingSource
11+
import daily.dayo.data.datasource.remote.search.SearchUserPagingSource
1212
import daily.dayo.domain.model.NetworkResponse
1313
import daily.dayo.domain.model.Search
1414
import daily.dayo.domain.model.SearchHistory
1515
import daily.dayo.domain.model.SearchHistoryDetail
1616
import daily.dayo.domain.model.SearchHistoryType
17+
import daily.dayo.domain.model.SearchOrder
1718
import daily.dayo.domain.model.SearchUser
1819
import daily.dayo.domain.repository.SearchRepository
1920
import kotlinx.coroutines.flow.Flow
@@ -47,10 +48,11 @@ class SearchRepositoryImpl @Inject constructor(
4748
override fun updateSearchKeywordRecentList(keyword: String, requestSearchType: SearchHistoryType) {
4849
SharedManager(context = context).updateSearchHistory(
4950
SearchHistoryDetail(
50-
history = keyword,
51-
searchHistoryType = requestSearchType,
52-
searchId = 0
53-
))
51+
history = keyword,
52+
searchHistoryType = requestSearchType,
53+
searchId = 0
54+
)
55+
)
5456
}
5557

5658
override fun requestSearchUser(nickname: String): Flow<PagingData<SearchUser>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
@@ -61,35 +63,43 @@ class SearchRepositoryImpl @Inject constructor(
6163
SearchFollowUserPagingSource(searchApiService, SEARCH_PAGE_SIZE, nickname)
6264
}.flow
6365

64-
override fun requestSearchTag(tag: String): Flow<PagingData<Search>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
65-
SearchPagingSource(searchApiService, SEARCH_PAGE_SIZE, tag)
66+
override fun requestSearchTag(tag: String, searchOrder: SearchOrder): Flow<PagingData<Search>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
67+
SearchPagingSource(searchApiService, SEARCH_PAGE_SIZE, tag, searchOrder)
6668
}.flow
6769

68-
override suspend fun requestSearchTotalCount(tag: String, end: Int, searchHistoryType: SearchHistoryType) : Int =
69-
when (searchHistoryType) {
70-
SearchHistoryType.TAG -> {
71-
searchApiService.requestSearchTag(tag, end).let { ApiResponse ->
72-
when(ApiResponse) {
73-
is NetworkResponse.Success -> {
74-
return ApiResponse.body!!.totalCount
75-
}
76-
else -> return 0
70+
override suspend fun requestSearchTotalCount(
71+
tag: String,
72+
end: Int,
73+
searchHistoryType: SearchHistoryType,
74+
searchOrder: SearchOrder
75+
): Int = when (searchHistoryType) {
76+
SearchHistoryType.TAG -> {
77+
searchApiService.requestSearchTag(tag, end, searchOrder.toString()).let { ApiResponse ->
78+
when (ApiResponse) {
79+
is NetworkResponse.Success -> {
80+
return ApiResponse.body!!.totalCount
7781
}
82+
83+
else -> return 0
7884
}
7985
}
80-
SearchHistoryType.USER -> {
81-
searchApiService.requestSearchUser(tag, end).let { ApiResponse ->
82-
when(ApiResponse) {
83-
is NetworkResponse.Success -> {
84-
return ApiResponse.body!!.totalCount
85-
}
86-
else -> return 0
86+
}
87+
88+
SearchHistoryType.USER -> {
89+
searchApiService.requestSearchUser(tag, end).let { ApiResponse ->
90+
when (ApiResponse) {
91+
is NetworkResponse.Success -> {
92+
return ApiResponse.body!!.totalCount
8793
}
94+
95+
else -> return 0
8896
}
8997
}
90-
else -> 0
9198
}
9299

100+
else -> 0
101+
}
102+
93103
companion object {
94104
private const val SEARCH_PAGE_SIZE = 10
95105
}

domain/src/main/java/daily/dayo/domain/model/Search.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ data class SearchHistoryDetail(
2727
enum class SearchHistoryType {
2828
USER,
2929
TAG
30-
}
30+
}
31+
32+
enum class SearchOrder {
33+
NEW, OLD;
34+
35+
override fun toString(): String {
36+
return name.lowercase()
37+
}
38+
}

domain/src/main/java/daily/dayo/domain/repository/SearchRepository.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import androidx.paging.PagingData
44
import daily.dayo.domain.model.Search
55
import daily.dayo.domain.model.SearchHistory
66
import daily.dayo.domain.model.SearchHistoryType
7+
import daily.dayo.domain.model.SearchOrder
78
import daily.dayo.domain.model.SearchUser
89
import kotlinx.coroutines.flow.Flow
910

1011
interface SearchRepository {
11-
fun requestSearchTag(tag: String): Flow<PagingData<Search>>
12+
fun requestSearchTag(tag: String, searchOrder: SearchOrder): Flow<PagingData<Search>>
1213
fun requestSearchUser(nickname: String): Flow<PagingData<SearchUser>>
1314
fun requestSearchFollowUser(nickname: String): Flow<PagingData<SearchUser>>
1415
fun requestSearchKeywordRecentList(): SearchHistory
@@ -22,6 +23,7 @@ interface SearchRepository {
2223
suspend fun requestSearchTotalCount(
2324
tag: String,
2425
end: Int,
25-
searchHistoryType: SearchHistoryType
26+
searchHistoryType: SearchHistoryType,
27+
searchOrder: SearchOrder
2628
): Int
2729
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package daily.dayo.domain.usecase.search
22

3+
import daily.dayo.domain.model.SearchOrder
34
import daily.dayo.domain.repository.SearchRepository
45
import javax.inject.Inject
56

67
class RequestSearchTagUseCase @Inject constructor(
78
private val searchRepository: SearchRepository
89
) {
9-
operator fun invoke(tag: String) = searchRepository.requestSearchTag(tag)
10+
operator fun invoke(tag: String, searchOrder: SearchOrder) = searchRepository.requestSearchTag(tag, searchOrder)
1011
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package daily.dayo.domain.usecase.search
22

33
import daily.dayo.domain.model.SearchHistoryType
4+
import daily.dayo.domain.model.SearchOrder
45
import daily.dayo.domain.repository.SearchRepository
56
import javax.inject.Inject
67

78
class RequestSearchTotalCountUseCase @Inject constructor(
89
private val searchRepository: SearchRepository
910
) {
10-
suspend operator fun invoke(tag: String, searchHistoryType: SearchHistoryType) =
11-
searchRepository.requestSearchTotalCount(tag, 0, searchHistoryType)
11+
suspend operator fun invoke(
12+
tag: String,
13+
searchHistoryType: SearchHistoryType,
14+
searchOrder: SearchOrder = SearchOrder.NEW
15+
) = searchRepository.requestSearchTotalCount(tag, 0, searchHistoryType, searchOrder)
1216
}

presentation/src/main/java/daily/dayo/presentation/screen/search/SearchPostHashtagScreen.kt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ import androidx.compose.material3.Text
2020
import androidx.compose.runtime.Composable
2121
import androidx.compose.runtime.LaunchedEffect
2222
import androidx.compose.runtime.getValue
23-
import androidx.compose.runtime.mutableStateOf
2423
import androidx.compose.runtime.remember
25-
import androidx.compose.runtime.saveable.rememberSaveable
2624
import androidx.compose.ui.Alignment
2725
import androidx.compose.ui.Modifier
2826
import androidx.compose.ui.platform.LocalContext
2927
import androidx.compose.ui.res.painterResource
28+
import androidx.compose.ui.res.stringResource
3029
import androidx.compose.ui.unit.dp
3130
import androidx.hilt.navigation.compose.hiltViewModel
3231
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3332
import androidx.paging.compose.collectAsLazyPagingItems
3433
import androidx.paging.compose.itemKey
34+
import daily.dayo.domain.model.SearchOrder
3535
import daily.dayo.presentation.BuildConfig
3636
import daily.dayo.presentation.R
3737
import daily.dayo.presentation.common.extension.clickableSingle
@@ -51,13 +51,13 @@ fun SearchPostHashtagScreen(
5151
onPostClick: (Long) -> Unit,
5252
searchViewModel: SearchViewModel = hiltViewModel()
5353
) {
54-
val isLatest by rememberSaveable { mutableStateOf(true) } // TODO api 수정 후 구현
54+
val searchHashtagOrder by searchViewModel.searchHashtagOrder.collectAsStateWithLifecycle()
5555
val hashtagPosts = searchViewModel.searchTagList.collectAsLazyPagingItems()
5656
val hashtagPostsCount by searchViewModel.searchTagTotalCount.collectAsStateWithLifecycle(0)
5757

5858
LaunchedEffect(Unit) {
5959
with(searchViewModel) {
60-
searchHashtag(hashtag = hashtag)
60+
searchHashtag(hashtag = hashtag, searchOrder = searchHashtagOrder)
6161
}
6262
}
6363

@@ -94,7 +94,11 @@ fun SearchPostHashtagScreen(
9494
) {
9595
// description
9696
item(span = { GridItemSpan(2) }) {
97-
SearchResultDescription(hashtagPostsCount, isLatest)
97+
SearchResultDescription(
98+
resultCount = hashtagPostsCount,
99+
searchOrder = searchHashtagOrder,
100+
onClickSort = { searchViewModel.toggleSearchHashtagOrder(hashtag) }
101+
)
98102
}
99103

100104
// posts
@@ -125,7 +129,16 @@ fun SearchPostHashtagScreen(
125129
}
126130

127131
@Composable
128-
private fun SearchResultDescription(resultCount: Int, isLatest: Boolean) {
132+
private fun SearchResultDescription(
133+
resultCount: Int,
134+
searchOrder: SearchOrder,
135+
onClickSort: () -> Unit
136+
) {
137+
val sortResId = when (searchOrder) {
138+
SearchOrder.NEW -> R.string.search_hashtag_sort_newest
139+
SearchOrder.OLD -> R.string.search_hashtag_sort_oldest
140+
}
141+
129142
Row(modifier = Modifier.fillMaxWidth()) {
130143
Row(
131144
verticalAlignment = Alignment.CenterVertically,
@@ -149,16 +162,16 @@ private fun SearchResultDescription(resultCount: Int, isLatest: Boolean) {
149162
horizontalArrangement = Arrangement.End,
150163
modifier = Modifier
151164
.padding(vertical = 12.dp)
152-
.weight(1f)
165+
.clickableSingle { onClickSort() }
153166
) {
154167
Icon(
155168
painter = painterResource(id = R.drawable.ic_swap_vertical),
156-
contentDescription = if (isLatest) "최신순" else "오래된순",
169+
contentDescription = stringResource(id = sortResId),
157170
tint = Gray1_50545B
158171
)
159172
Text(
160173
style = DayoTheme.typography.caption1.copy(color = Gray2_767B83),
161-
text = if (isLatest) "최신순" else "오래된순"
174+
text = stringResource(id = sortResId)
162175
)
163176
}
164177
}

presentation/src/main/java/daily/dayo/presentation/screen/search/SearchResultScreen.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import androidx.compose.foundation.layout.fillMaxSize
1818
import androidx.compose.foundation.layout.fillMaxWidth
1919
import androidx.compose.foundation.layout.height
2020
import androidx.compose.foundation.layout.padding
21+
import androidx.compose.foundation.layout.statusBarsPadding
2122
import androidx.compose.foundation.layout.width
2223
import androidx.compose.foundation.layout.wrapContentHeight
2324
import androidx.compose.foundation.lazy.LazyColumn
@@ -30,6 +31,7 @@ import androidx.compose.foundation.pager.rememberPagerState
3031
import androidx.compose.foundation.shape.CircleShape
3132
import androidx.compose.foundation.shape.RoundedCornerShape
3233
import androidx.compose.material3.Divider
34+
import androidx.compose.material3.Scaffold
3335
import androidx.compose.material3.Surface
3436
import androidx.compose.material3.Tab
3537
import androidx.compose.material3.TabRow
@@ -204,21 +206,24 @@ fun SearchResultScreen(
204206
val coroutineScope = rememberCoroutineScope()
205207
val pagerState = rememberPagerState { 2 }
206208

207-
Surface(
208-
color = colorResource(id = R.color.white_FFFFFF),
209-
modifier = Modifier.fillMaxSize()
210-
) {
211-
Column(
212-
modifier = Modifier.fillMaxSize()
213-
) {
209+
Scaffold(
210+
topBar = {
214211
SearchActionbarLayout(
212+
modifier = Modifier.statusBarsPadding(),
215213
initialKeyword = searchKeyword,
216214
onBackClick = onBackClick,
217215
onSearchClick = { keyword ->
218216
onSearchClick(keyword)
219217
}
220218
)
221-
219+
},
220+
containerColor = DayoTheme.colorScheme.background
221+
) { innerPadding ->
222+
Column(
223+
modifier = Modifier
224+
.fillMaxSize()
225+
.padding(innerPadding)
226+
) {
222227
TabRow(
223228
selectedTabIndex = pagerState.currentPage,
224229
containerColor = White,
@@ -415,6 +420,7 @@ fun SearchResultTagView(
415420
imageDescription = "searched Image",
416421
modifier = Modifier
417422
.matchParentSize()
423+
.aspectRatio(1f)
418424
.clickableSingle(
419425
interactionSource = imageInteractionSource,
420426
indication = null,

0 commit comments

Comments
 (0)