Skip to content

Commit 86e087f

Browse files
authored
Merge pull request #320 from teamterning/feat/#306-search
2 parents ed9c027 + a4d4f6f commit 86e087f

20 files changed

Lines changed: 169 additions & 124 deletions

File tree

โ€Ždata/search/src/main/java/com/terning/data/search/datasource/SearchDataSource.ktโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package com.terning.data.search.datasource
33
import com.terning.core.network.BaseResponse
44
import com.terning.data.search.dto.request.SearchRequestDto
55
import com.terning.data.search.dto.response.SearchAnnouncementResponseDto
6+
import com.terning.data.search.dto.response.SearchBannersResponseDto
67
import com.terning.data.search.dto.response.SearchResultResponseDto
78

89
interface SearchDataSource {
910
suspend fun getSearch(request: SearchRequestDto): BaseResponse<SearchResultResponseDto>
1011
suspend fun getSearchViews(): BaseResponse<SearchAnnouncementResponseDto>
1112
suspend fun getSearchScraps(): BaseResponse<SearchAnnouncementResponseDto>
13+
suspend fun getSearchBanners(): BaseResponse<SearchBannersResponseDto>
1214
}

โ€Ždata/search/src/main/java/com/terning/data/search/datasourceimpl/SearchDataSourceImpl.ktโ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.terning.core.network.BaseResponse
44
import com.terning.data.search.datasource.SearchDataSource
55
import com.terning.data.search.dto.request.SearchRequestDto
66
import com.terning.data.search.dto.response.SearchAnnouncementResponseDto
7+
import com.terning.data.search.dto.response.SearchBannersResponseDto
78
import com.terning.data.search.dto.response.SearchResultResponseDto
89
import com.terning.data.search.service.SearchService
910
import javax.inject.Inject
@@ -26,4 +27,7 @@ class SearchDataSourceImpl @Inject constructor(
2627

2728
override suspend fun getSearchScraps(): BaseResponse<SearchAnnouncementResponseDto> =
2829
searchService.getSearchScrapsList()
30+
31+
override suspend fun getSearchBanners(): BaseResponse<SearchBannersResponseDto> =
32+
searchService.getSearchBannerList()
2933
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.terning.data.search.dto.response
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class SearchBannersResponseDto(
8+
@SerialName("banners")
9+
val banners: List<BannerDto>,
10+
) {
11+
@Serializable
12+
data class BannerDto(
13+
@SerialName("imageUrl")
14+
val imageUrl: String,
15+
@SerialName("link")
16+
val link: String,
17+
)
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.terning.data.search.mapper
2+
3+
import com.terning.data.search.dto.response.SearchBannersResponseDto
4+
import com.terning.domain.search.entity.SearchBanner
5+
6+
fun SearchBannersResponseDto.toSearchBannerList(): List<SearchBanner> {
7+
return banners.map {
8+
SearchBanner(
9+
imageUrl = it.imageUrl,
10+
url = it.link,
11+
)
12+
}
13+
}

โ€Ždata/search/src/main/java/com/terning/data/search/repositoryimpl/SearchRepositoryImpl.ktโ€Ž

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package com.terning.data.search.repositoryimpl
22

33
import com.terning.data.search.datasource.SearchDataSource
44
import com.terning.data.search.dto.request.SearchRequestDto
5+
import com.terning.data.search.mapper.toSearchBannerList
56
import com.terning.data.search.mapper.toSearchPopularAnnouncementList
67
import com.terning.data.search.mapper.toSearchResultList
8+
import com.terning.domain.search.entity.SearchBanner
79
import com.terning.domain.search.entity.SearchPopularAnnouncement
810
import com.terning.domain.search.entity.SearchResult
911
import com.terning.domain.search.repository.SearchRepository
@@ -39,4 +41,9 @@ class SearchRepositoryImpl @Inject constructor(
3941
runCatching {
4042
searchDataSource.getSearchScraps().result.toSearchPopularAnnouncementList()
4143
}
44+
45+
override suspend fun getSearchBannersList(): Result<List<SearchBanner>> =
46+
kotlin.runCatching {
47+
searchDataSource.getSearchBanners().result.toSearchBannerList()
48+
}
4249
}

โ€Ždata/search/src/main/java/com/terning/data/search/service/SearchService.ktโ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.terning.data.search.service
22

33
import com.terning.core.network.BaseResponse
44
import com.terning.data.search.dto.response.SearchAnnouncementResponseDto
5+
import com.terning.data.search.dto.response.SearchBannersResponseDto
56
import com.terning.data.search.dto.response.SearchResultResponseDto
67
import retrofit2.http.GET
78
import retrofit2.http.Query
@@ -20,4 +21,7 @@ interface SearchService {
2021

2122
@GET("api/v1/search/scraps")
2223
suspend fun getSearchScrapsList(): BaseResponse<SearchAnnouncementResponseDto>
24+
25+
@GET("api/v1/search/banners")
26+
suspend fun getSearchBannerList(): BaseResponse<SearchBannersResponseDto>
2327
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.terning.domain.search.entity
22

33
data class SearchBanner(
4-
val imageRes: Int,
5-
val url: String
4+
val imageUrl: String,
5+
val url: String,
66
)

โ€Ždomain/search/src/main/java/com/terning/domain/search/repository/SearchRepository.ktโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.terning.domain.search.repository
22

3+
import com.terning.domain.search.entity.SearchBanner
34
import com.terning.domain.search.entity.SearchPopularAnnouncement
45
import com.terning.domain.search.entity.SearchResult
56

@@ -10,6 +11,8 @@ interface SearchRepository {
1011
page: Int,
1112
size: Int,
1213
): Result<List<SearchResult>>
14+
1315
suspend fun getSearchViewsList(): Result<List<SearchPopularAnnouncement>>
1416
suspend fun getSearchScrapsList(): Result<List<SearchPopularAnnouncement>>
17+
suspend fun getSearchBannersList(): Result<List<SearchBanner>>
1518
}

โ€Žfeature/search/src/main/java/com/terning/feature/search/search/SearchRoute.ktโ€Ž

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import androidx.browser.customtabs.CustomTabsIntent
44
import androidx.compose.foundation.background
55
import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.PaddingValues
78
import androidx.compose.foundation.layout.Spacer
8-
import androidx.compose.foundation.layout.fillMaxSize
99
import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.foundation.lazy.LazyColumn
@@ -30,22 +30,26 @@ import com.terning.core.designsystem.state.UiState
3030
import com.terning.core.designsystem.theme.Black
3131
import com.terning.core.designsystem.theme.TerningTheme
3232
import com.terning.core.designsystem.theme.White
33+
import com.terning.domain.search.entity.SearchBanner
34+
import com.terning.domain.search.entity.SearchPopularAnnouncement
3335
import com.terning.feature.search.R
3436
import com.terning.feature.search.search.component.ImageSlider
3537
import com.terning.feature.search.search.component.InternListType
3638
import com.terning.feature.search.search.component.SearchInternList
37-
import okhttp3.internal.toImmutableList
39+
import kotlinx.collections.immutable.ImmutableList
40+
import kotlinx.collections.immutable.toImmutableList
3841

3942
@Composable
4043
fun SearchRoute(
41-
modifier: Modifier,
44+
paddingValues: PaddingValues,
4245
navigateToSearchProcess: () -> Unit,
4346
navigateToIntern: (Long) -> Unit,
4447
viewModel: SearchViewModel = hiltViewModel(),
4548
) {
4649
val lifecycleOwner = LocalLifecycleOwner.current
4750
val context = LocalContext.current
4851

52+
val bannerState by viewModel.bannerState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner)
4953
val viewState by viewModel.viewState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner)
5054
val scrapState by viewModel.scrapState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner)
5155

@@ -54,32 +58,38 @@ fun SearchRoute(
5458
LaunchedEffect(key1 = true) {
5559
viewModel.getSearchViews()
5660
viewModel.getSearchScraps()
61+
viewModel.getSearchBanners()
5762
}
5863

5964
LaunchedEffect(viewModel.sideEffect, lifecycleOwner) {
6065
viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle)
6166
.collect { sideEffect ->
6267
when (sideEffect) {
63-
is SearchSideEffect.Toast -> {
68+
is SearchSideEffect.ShowToast -> {
6469
sideEffect.message
6570
}
6671
}
6772
}
6873
}
6974

75+
val bannerList = when (bannerState.searchBannersList) {
76+
is UiState.Success -> (bannerState.searchBannersList as UiState.Success<List<SearchBanner>>).data.toImmutableList()
77+
else -> emptyList<SearchBanner>().toImmutableList()
78+
}
79+
7080
val searchViewsList = when (viewState.searchViewsList) {
71-
is UiState.Success -> (viewState.searchViewsList as UiState.Success<List<com.terning.domain.search.entity.SearchPopularAnnouncement>>).data.toImmutableList()
72-
else -> emptyList()
81+
is UiState.Success -> (viewState.searchViewsList as UiState.Success<List<SearchPopularAnnouncement>>).data.toImmutableList()
82+
else -> emptyList<SearchPopularAnnouncement>().toImmutableList()
7383
}
7484

7585
val searchScrapsList = when (scrapState.searchScrapsList) {
76-
is UiState.Success -> (scrapState.searchScrapsList as UiState.Success<List<com.terning.domain.search.entity.SearchPopularAnnouncement>>).data.toImmutableList()
77-
else -> emptyList()
86+
is UiState.Success -> (scrapState.searchScrapsList as UiState.Success<List<SearchPopularAnnouncement>>).data.toImmutableList()
87+
else -> emptyList<SearchPopularAnnouncement>().toImmutableList()
7888
}
7989

8090
SearchScreen(
81-
modifier = modifier,
82-
bannerList = SearchViewModel.bannerList,
91+
paddingValues = paddingValues,
92+
bannerList = bannerList,
8393
searchViewsList = searchViewsList,
8494
searchScrapsList = searchScrapsList,
8595
navigateToSearchProcess = {
@@ -96,25 +106,25 @@ fun SearchRoute(
96106
name = "quest_banner"
97107
)
98108
CustomTabsIntent.Builder().build()
99-
.launchUrl(context, SearchViewModel.bannerList[pageIndex].url.toUri())
109+
.launchUrl(context, bannerList[pageIndex].url.toUri())
100110
}
101111
)
102112
}
103113

104114
@Composable
105115
fun SearchScreen(
106-
modifier: Modifier = Modifier,
107-
bannerList: List<com.terning.domain.search.entity.SearchBanner>,
108-
searchViewsList: List<com.terning.domain.search.entity.SearchPopularAnnouncement>,
109-
searchScrapsList: List<com.terning.domain.search.entity.SearchPopularAnnouncement>,
116+
paddingValues: PaddingValues,
117+
bannerList: ImmutableList<SearchBanner>,
118+
searchViewsList: ImmutableList<SearchPopularAnnouncement>,
119+
searchScrapsList: ImmutableList<SearchPopularAnnouncement>,
110120
navigateToSearchProcess: () -> Unit,
111121
navigateToIntern: (Long) -> Unit,
112122
onAdvertisementClick: (Int) -> Unit,
113123
) {
114124
Column(
115-
modifier = modifier
116-
.fillMaxSize()
125+
modifier = Modifier
117126
.background(White)
127+
.padding(paddingValues)
118128
) {
119129
TerningImage(
120130
painter = R.drawable.ic_terning_logo_typo,
@@ -145,7 +155,7 @@ fun SearchScreen(
145155
LazyColumn {
146156
item {
147157
ImageSlider(
148-
images = bannerList,
158+
searchBanners = bannerList,
149159
onAdvertisementClick = onAdvertisementClick,
150160
)
151161

โ€Žfeature/search/src/main/java/com/terning/feature/search/search/SearchSideEffect.ktโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ package com.terning.feature.search.search
33
import androidx.annotation.StringRes
44

55
sealed class SearchSideEffect {
6-
data class Toast(@StringRes val message: Int) : SearchSideEffect()
6+
data class ShowToast(@StringRes val message: Int) : SearchSideEffect()
77
}

0 commit comments

Comments
ย (0)