Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into feat/#92-intern-info
Browse files Browse the repository at this point in the history
# Conflicts:
#	app/src/main/java/com/terning/point/di/DataSourceModule.kt
#	app/src/main/java/com/terning/point/di/RepositoryModule.kt
#	app/src/main/java/com/terning/point/di/ServiceModule.kt
  • Loading branch information
arinming committed Jul 17, 2024
2 parents 825e810 + a9555a4 commit 96e303b
Show file tree
Hide file tree
Showing 14 changed files with 214 additions and 187 deletions.
6 changes: 6 additions & 0 deletions app/src/main/java/com/terning/point/di/DataSourceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import com.terning.data.datasource.AuthDataSource
import com.terning.data.datasource.CalendarDataSource
import com.terning.data.datasource.FilteringDataSource
import com.terning.data.datasource.InternDataSource
import com.terning.data.datasource.HomeDataSource
import com.terning.data.datasource.SearchDataSource
import com.terning.data.datasource.TokenReissueDataSource
import com.terning.data.datasourceimpl.AuthDataSourceImpl
import com.terning.data.datasourceimpl.CalendarDataSourceImpl
import com.terning.data.datasourceimpl.FilteringDataSourceImpl
import com.terning.data.datasourceimpl.InternDataSourceImpl
import com.terning.data.datasourceimpl.HomeDataSourceImpl
import com.terning.data.datasourceimpl.SearchDataSourceImpl
import com.terning.data.datasourceimpl.TokenReissueDataSourceImpl
import dagger.Binds
Expand Down Expand Up @@ -47,4 +49,8 @@ abstract class DataSourceModule {
@Binds
@Singleton
abstract fun bindFilteringDataSource(filteringDataSourceImpl: FilteringDataSourceImpl): FilteringDataSource

@Binds
@Singleton
abstract fun bindHomeDataSource(homeDataSourceImpl: HomeDataSourceImpl): HomeDataSource
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/terning/point/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import com.terning.data.repositoryimpl.AuthRepositoryImpl
import com.terning.data.repositoryimpl.CalendarRepositoryImpl
import com.terning.data.repositoryimpl.FilteringRepositoryImpl
import com.terning.data.repositoryimpl.InternRepositoryImpl
import com.terning.data.repositoryimpl.HomeRepositoryImpl
import com.terning.data.repositoryimpl.SearchRepositoryImpl
import com.terning.data.repositoryimpl.TokenReissueRepositoryImpl
import com.terning.data.repositoryimpl.TokenRepositoryImpl
import com.terning.domain.repository.AuthRepository
import com.terning.domain.repository.CalendarRepository
import com.terning.domain.repository.FilteringRepository
import com.terning.domain.repository.InternRepository
import com.terning.domain.repository.HomeRepository
import com.terning.domain.repository.SearchRepository
import com.terning.domain.repository.TokenReissueRepository
import com.terning.domain.repository.TokenRepository
Expand Down Expand Up @@ -51,4 +53,8 @@ abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindFilteringRepository(filteringRepositoryImpl: FilteringRepositoryImpl): FilteringRepository

@Binds
@Singleton
abstract fun bindHomeRepository(homeRepositoryImpl: HomeRepositoryImpl): HomeRepository
}
8 changes: 7 additions & 1 deletion app/src/main/java/com/terning/point/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.terning.point.di

import com.terning.data.service.AuthService
import com.terning.data.service.FilteringService
import com.terning.data.service.CalendarService
import com.terning.data.service.InternService
import com.terning.data.service.FilteringService
import com.terning.data.service.HomeService
import com.terning.data.service.SearchService
import com.terning.data.service.TokenReissueService
import com.terning.point.di.qualifier.JWT
Expand Down Expand Up @@ -49,4 +50,9 @@ object ServiceModule {
@Singleton
fun provideFilteringService(@JWT retrofit: Retrofit): FilteringService =
retrofit.create(FilteringService::class.java)

@Provides
@Singleton
fun provideHomeService(@JWT retrofit: Retrofit): HomeService =
retrofit.create(HomeService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.terning.data.datasource

import com.terning.data.dto.BaseResponse
import com.terning.data.dto.response.HomeTodayInternResponseDto

interface HomeDataSource {
suspend fun getTodayIntern(): BaseResponse<List<HomeTodayInternResponseDto>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.terning.data.datasourceimpl

import com.terning.data.datasource.HomeDataSource
import com.terning.data.dto.BaseResponse
import com.terning.data.dto.response.HomeTodayInternResponseDto
import com.terning.data.service.HomeService
import javax.inject.Inject

class HomeDataSourceImpl @Inject constructor(
private val homeService: HomeService,
) : HomeDataSource {
override suspend fun getTodayIntern(): BaseResponse<List<HomeTodayInternResponseDto>> =
homeService.getHomeTodayIntern()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.terning.data.dto.response

import com.terning.domain.entity.response.HomeTodayInternModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class HomeTodayInternResponseDto(
@SerialName("scrapId")
val scrapId: Long,
@SerialName("internshipAnnouncementId")
val internshipAnnouncementId: Long,
@SerialName("companyImage")
val companyImage: String,
@SerialName("title")
val title: String,
@SerialName("dDay")
val dDay: String,
@SerialName("deadline")
val deadline: String,
@SerialName("workingPeriod")
val workingPeriod: String,
@SerialName("color")
val color: String,
@SerialName("startYearMonth")
val startYearMonth: String,

) {
fun toHomeTodayInternList(): HomeTodayInternModel =
HomeTodayInternModel(
scrapId = this.scrapId,
internshipAnnouncementId = this.internshipAnnouncementId,
companyImage = this.companyImage,
title = this.title,
dDay = this.dDay,
deadline = this.deadline,
workingPeriod = this.workingPeriod,
startYearMonth = this.startYearMonth,
color = this.color,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.terning.data.repositoryimpl

import com.terning.data.datasource.HomeDataSource
import com.terning.domain.entity.response.HomeTodayInternModel
import com.terning.domain.repository.HomeRepository
import javax.inject.Inject

class HomeRepositoryImpl @Inject constructor(
private val homeDataSource: HomeDataSource,
) : HomeRepository {
override suspend fun getHomeTodayInternList(): Result<List<HomeTodayInternModel>> =
runCatching {
homeDataSource.getTodayIntern().result.map {
it.toHomeTodayInternList()
}
}
}
10 changes: 10 additions & 0 deletions data/src/main/java/com/terning/data/service/HomeService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.terning.data.service

import com.terning.data.dto.BaseResponse
import com.terning.data.dto.response.HomeTodayInternResponseDto
import retrofit2.http.GET

interface HomeService {
@GET("api/v1/home/today")
suspend fun getHomeTodayIntern(): BaseResponse<List<HomeTodayInternResponseDto>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.terning.domain.entity.response

data class HomeTodayInternModel(
val scrapId: Long,
val internshipAnnouncementId: Long,
val companyImage: String,
val title: String,
val dDay: String,
val deadline: String,
val workingPeriod: String,
val color: String,
val startYearMonth: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.terning.domain.repository

import com.terning.domain.entity.response.HomeTodayInternModel

interface HomeRepository {
suspend fun getHomeTodayInternList(): Result<List<HomeTodayInternModel>>
}
74 changes: 40 additions & 34 deletions feature/src/main/java/com/terning/feature/home/home/HomeRoute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.terning.feature.home.home
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
Expand All @@ -16,48 +15,78 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.flowWithLifecycle
import androidx.navigation.NavHostController
import com.terning.core.designsystem.component.bottomsheet.SortingBottomSheet
import com.terning.core.designsystem.component.button.SortingButton
import com.terning.core.designsystem.component.item.InternItemWithShadow
import com.terning.core.designsystem.component.topappbar.LogoTopAppBar
import com.terning.core.designsystem.theme.Black
import com.terning.core.designsystem.theme.Grey150
import com.terning.core.designsystem.theme.TerningTheme
import com.terning.core.designsystem.theme.White
import com.terning.core.extension.toast
import com.terning.core.state.UiState
import com.terning.domain.entity.response.HomeTodayInternModel
import com.terning.feature.R
import com.terning.feature.home.changefilter.navigation.navigateChangeFilter
import com.terning.feature.home.home.component.HomeFilteringEmptyIntern
import com.terning.feature.home.home.component.HomeFilteringScreen
import com.terning.feature.home.home.component.HomeRecommendEmptyIntern
import com.terning.feature.home.home.component.HomeTodayEmptyIntern
import com.terning.feature.home.home.component.HomeTodayIntern
import com.terning.feature.home.home.model.UserNameState
import com.terning.feature.home.home.model.UserScrapState

const val NAME_START_LENGTH = 7
const val NAME_END_LENGTH = 12

@Composable
fun HomeRoute(
navController: NavHostController
navController: NavHostController,
viewModel: HomeViewModel = hiltViewModel()
) {
val currentSortBy: MutableState<Int> = remember {
mutableIntStateOf(0)
}

val lifecycleOwner = LocalLifecycleOwner.current
val context = LocalContext.current

val homeTodayState by viewModel.homeTodayState.collectAsStateWithLifecycle()

LaunchedEffect(viewModel.homeSideEffect, lifecycleOwner) {
viewModel.homeSideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle)
.collect { sideEffect ->
when (sideEffect) {
is HomeSideEffect.ShowToast -> context.toast(sideEffect.message)
is HomeSideEffect.NavigateToChangeFilter -> navController.navigateChangeFilter()
}
}
}

val homeTodayInternList = when (homeTodayState) {
is UiState.Success -> {
(homeTodayState as UiState.Success<List<HomeTodayInternModel>>).data
}

else -> emptyList()
}

HomeScreen(
currentSortBy,
homeTodayInternList,
onChangeFilterClick = { navController.navigateChangeFilter() }
)
}
Expand All @@ -66,12 +95,11 @@ fun HomeRoute(
@Composable
fun HomeScreen(
currentSortBy: MutableState<Int>,
homeTodayInternList: List<HomeTodayInternModel>,
onChangeFilterClick: () -> Unit,
viewModel: HomeViewModel = hiltViewModel(),
) {
val userNameState = viewModel.userName
val userScrapState by viewModel.scrapData.collectAsStateWithLifecycle()
val recommendInternData by viewModel.recommendInternData.collectAsStateWithLifecycle()
var sheetState by remember { mutableStateOf(false) }

if (sheetState) {
Expand Down Expand Up @@ -108,7 +136,7 @@ fun HomeScreen(
.padding(bottom = 16.dp)
) {
ShowMainTitleWithName(userNameState)
ShowTodayIntern(userScrapState = userScrapState)
ShowTodayIntern(homeTodayInternList = homeTodayInternList)
}
}
stickyHeader {
Expand Down Expand Up @@ -141,22 +169,6 @@ fun HomeScreen(
}
}
}

if (userNameState.internFilter != null && recommendInternData.isNotEmpty()) {
items(recommendInternData.size) { index ->
Box(
modifier = Modifier.padding(horizontal = 24.dp)
) {
InternItemWithShadow(
imageUrl = recommendInternData[index].imgUrl,
title = recommendInternData[index].title,
dateDeadline = recommendInternData[index].dDay.toString(),
workingPeriod = recommendInternData[index].workingPeriod.toString(),
isScraped = recommendInternData[index].isScrapped,
)
}
}
}
}

if (userNameState.internFilter == null) {
Expand All @@ -165,8 +177,6 @@ fun HomeScreen(
.padding(horizontal = 24.dp)
.fillMaxSize()
)
} else if (recommendInternData.isEmpty()) {
HomeRecommendEmptyIntern()
}
}
}
Expand All @@ -189,15 +199,11 @@ private fun ShowMainTitleWithName(userNameState: UserNameState) {
}

@Composable
private fun ShowTodayIntern(userScrapState: UserScrapState) {
if (userScrapState.isScrapExist) {
if (userScrapState.scrapData == null) {
HomeTodayEmptyIntern(isButtonExist = true)
} else {
HomeTodayIntern(userScrapState.scrapData)
}
} else {
private fun ShowTodayIntern(homeTodayInternList: List<HomeTodayInternModel>) {
if (homeTodayInternList.isEmpty()) {
HomeTodayEmptyIntern(isButtonExist = false)
} else {
HomeTodayIntern(internList = homeTodayInternList)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.terning.feature.home.home

import androidx.annotation.StringRes

sealed class HomeSideEffect {
data object NavigateToChangeFilter : HomeSideEffect()
data class ShowToast(@StringRes val message: Int) : HomeSideEffect()
}
Loading

0 comments on commit 96e303b

Please sign in to comment.