From 4373380d4160a9dfb1258a525dbd8187ea0c6376 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 14 Jul 2024 01:41:35 +0900 Subject: [PATCH 01/43] =?UTF-8?q?[FEAT/#72]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/data/dto/NonDataBaseResponse.kt | 2 -- .../entity/request/SignInRequestModel.kt | 5 +++ .../entity/response/SignInResponseModel.kt | 8 +++++ .../domain/repository/AuthRepository.kt | 11 +++++++ .../domain/repository/TokenRepository.kt | 13 ++++++++ .../onboarding/signin/SignInSideEffect.kt | 1 + .../onboarding/signin/SignInViewModel.kt | 32 +++++++++++++++---- feature/src/main/res/values/strings.xml | 2 +- 8 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt create mode 100644 domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt create mode 100644 domain/src/main/java/com/terning/domain/repository/AuthRepository.kt create mode 100644 domain/src/main/java/com/terning/domain/repository/TokenRepository.kt diff --git a/data/src/main/java/com/terning/data/dto/NonDataBaseResponse.kt b/data/src/main/java/com/terning/data/dto/NonDataBaseResponse.kt index 34db1f722..ddc6d1a70 100644 --- a/data/src/main/java/com/terning/data/dto/NonDataBaseResponse.kt +++ b/data/src/main/java/com/terning/data/dto/NonDataBaseResponse.kt @@ -7,8 +7,6 @@ import kotlinx.serialization.Serializable data class NonDataBaseResponse( @SerialName("status") val status: Int, - @SerialName("code") - val code: String, @SerialName("message") val message: String, ) diff --git a/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt b/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt new file mode 100644 index 000000000..ad63a7ac1 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt @@ -0,0 +1,5 @@ +package com.terning.domain.entity.request + +data class SignInRequestModel( + val platform: String +) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt new file mode 100644 index 000000000..e0f3f1655 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt @@ -0,0 +1,8 @@ +package com.terning.domain.entity.response + +data class SignInResponseModel( + val accessToken: String, + val refreshToken: String, + val userId: Long, + val authType: String +) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt b/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt new file mode 100644 index 000000000..49a77c6a9 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt @@ -0,0 +1,11 @@ +package com.terning.domain.repository + +import com.terning.domain.entity.request.SignInRequestModel +import com.terning.domain.entity.response.SignInResponseModel + +interface AuthRepository { + suspend fun postSignIn( + authorization: String, + data: SignInRequestModel + ): Result +} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/TokenRepository.kt b/domain/src/main/java/com/terning/domain/repository/TokenRepository.kt new file mode 100644 index 000000000..d55d469ef --- /dev/null +++ b/domain/src/main/java/com/terning/domain/repository/TokenRepository.kt @@ -0,0 +1,13 @@ +package com.terning.domain.repository + +interface TokenRepository { + fun getAccessToken(): String + + fun getRefreshToken(): String + + fun setTokens(accessToken: String, refreshToken: String) + + fun setUserId(userId: Long) + + fun clearInfo() +} diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInSideEffect.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInSideEffect.kt index 412652e66..ef9f7dc62 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInSideEffect.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInSideEffect.kt @@ -4,5 +4,6 @@ import androidx.annotation.StringRes sealed class SignInSideEffect { data object NavigateToHome : SignInSideEffect() + data object NavigateSignUp : SignInSideEffect() data class ShowToast(@StringRes val message: Int) : SignInSideEffect() } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 639b9eb71..2fb514545 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -7,7 +7,9 @@ import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.common.model.ClientError import com.kakao.sdk.common.model.ClientErrorCause import com.kakao.sdk.user.UserApiClient -import com.terning.core.state.UiState +import com.terning.domain.entity.request.SignInRequestModel +import com.terning.domain.repository.AuthRepository +import com.terning.domain.repository.TokenRepository import com.terning.feature.R import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow @@ -20,7 +22,10 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class SignInViewModel @Inject constructor() : ViewModel() { +class SignInViewModel @Inject constructor( + private val authRepository: AuthRepository, + private val tokenRepository: TokenRepository +) : ViewModel() { private val _signInState = MutableStateFlow(SignInState()) val signInState: StateFlow @@ -47,7 +52,7 @@ class SignInViewModel @Inject constructor() : ViewModel() { if (error != null) { signInFailure(context, error) } else if (token != null) { - signInSuccess(token) + signInSuccess(token.accessToken) } } } @@ -72,15 +77,28 @@ class SignInViewModel @Inject constructor() : ViewModel() { } } - private fun signInSuccess(token: OAuthToken) { + private fun signInSuccess( + accessToken: String, + platform: String = KAKAO + ) { viewModelScope.launch { - _signInState.value = - _signInState.value.copy(accessToken = UiState.Success(token.accessToken)) - _signInSideEffects.emit(SignInSideEffect.NavigateToHome) + authRepository.postSignIn( + accessToken, + SignInRequestModel(platform) + ).onSuccess { response -> + tokenRepository.setTokens(response.accessToken, response.refreshToken) + tokenRepository.setUserId(response.userId) + + if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + }.onFailure { + _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) + } } } companion object { private const val KAKAO_NOT_LOGGED_IN = "statusCode=302" + private const val KAKAO = "KAKAO" } } diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index 3dad158b1..db88a4468 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ Terning-Android 서버통신 성공 - 서버통신 실패 + 서버통신에 실패했어요 From fdee2d743340f1a5226e03055dcb521f6e2be2cc Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 14 Jul 2024 01:44:07 +0900 Subject: [PATCH 02/43] =?UTF-8?q?[FEAT/#72]=20string=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index db88a4468..4b631eab6 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ Terning-Android - 서버통신 성공 + 서버통신에 성공했어요 서버통신에 실패했어요 From 2565fb5514285242eaf9595809872819b1ae6171 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 14 Jul 2024 04:32:11 +0900 Subject: [PATCH 03/43] =?UTF-8?q?[FEAT/#72]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EC=84=9C=EB=B2=84=ED=86=B5=EC=8B=A0=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/point/di/DataSourceModule.kt | 6 +++++ .../com/terning/point/di/RepositoryModule.kt | 6 +++++ .../com/terning/point/di/RetrofitModule.kt | 13 +++++++++++ .../com/terning/point/di/ServiceModule.kt | 6 +++++ .../point/di/qualifier/RetrofitQualifier.kt | 6 ++++- .../terning/data/datasource/AuthDataSource.kt | 12 ++++++++++ .../data/datasourceimpl/AuthDataSourceImpl.kt | 17 ++++++++++++++ .../data/dto/request/SignInRequestDto.kt | 14 ++++++++++++ .../data/dto/response/SignInResponseDto.kt | 20 +++++++++++++++++ .../data/repositoryimpl/AuthRepositoryImpl.kt | 22 +++++++++++++++++++ .../repositoryimpl/TokenRepositoryImpl.kt | 4 ++++ .../com/terning/data/service/AuthService.kt | 16 ++++++++++++++ .../entity/response/SignInResponseModel.kt | 8 +++---- .../feature/onboarding/signin/SignInRoute.kt | 1 + .../onboarding/signin/SignInViewModel.kt | 10 +++++---- 15 files changed, 152 insertions(+), 9 deletions(-) create mode 100644 data/src/main/java/com/terning/data/datasource/AuthDataSource.kt create mode 100644 data/src/main/java/com/terning/data/datasourceimpl/AuthDataSourceImpl.kt create mode 100644 data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt create mode 100644 data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt create mode 100644 data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt create mode 100644 data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt create mode 100644 data/src/main/java/com/terning/data/service/AuthService.kt diff --git a/app/src/main/java/com/terning/point/di/DataSourceModule.kt b/app/src/main/java/com/terning/point/di/DataSourceModule.kt index c1541df6a..f176ed995 100644 --- a/app/src/main/java/com/terning/point/di/DataSourceModule.kt +++ b/app/src/main/java/com/terning/point/di/DataSourceModule.kt @@ -1,6 +1,8 @@ package com.terning.point.di +import com.terning.data.datasource.AuthDataSource import com.terning.data.datasource.MockDataSource +import com.terning.data.datasourceimpl.AuthDataSourceImpl import com.terning.data.datasourceimpl.MockDataSourceImpl import dagger.Binds import dagger.Module @@ -15,4 +17,8 @@ abstract class DataSourceModule { @Binds @Singleton abstract fun bindMockDataSource(mockDataSourceImpl: MockDataSourceImpl): MockDataSource + + @Binds + @Singleton + abstract fun bindAuthDataSource(authDataSourceImpl: AuthDataSourceImpl): AuthDataSource } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index 9de02a07a..3f21a05d3 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,6 +1,8 @@ package com.terning.point.di +import com.terning.data.repositoryimpl.AuthRepositoryImpl import com.terning.data.repositoryimpl.MockRepositoryImpl +import com.terning.domain.repository.AuthRepository import com.terning.domain.repository.MockRepository import dagger.Binds import dagger.Module @@ -15,4 +17,8 @@ abstract class RepositoryModule { @Binds @Singleton abstract fun bindMockRepository(mockRepositoryImpl: MockRepositoryImpl): MockRepository + + @Binds + @Singleton + abstract fun bindAuthRepository(authRepositoryImpl: AuthRepositoryImpl): AuthRepository } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RetrofitModule.kt b/app/src/main/java/com/terning/point/di/RetrofitModule.kt index 961fa891b..9b1a199d6 100644 --- a/app/src/main/java/com/terning/point/di/RetrofitModule.kt +++ b/app/src/main/java/com/terning/point/di/RetrofitModule.kt @@ -3,6 +3,7 @@ package com.terning.point.di import com.terning.core.extension.isJsonArray import com.terning.core.extension.isJsonObject import com.terning.point.BuildConfig +import com.terning.point.di.qualifier.JWT import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides @@ -75,4 +76,16 @@ object RetrofitModule { .client(client) .build() + @Provides + @Singleton + @JWT + fun provideJWTRetrofit( + client: OkHttpClient, + factory: Converter.Factory + ): Retrofit = Retrofit.Builder() + .baseUrl(BuildConfig.BASE_URL) + .addConverterFactory(factory) + .client(client) + .build() + } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/ServiceModule.kt b/app/src/main/java/com/terning/point/di/ServiceModule.kt index 317c02f92..fc756252a 100644 --- a/app/src/main/java/com/terning/point/di/ServiceModule.kt +++ b/app/src/main/java/com/terning/point/di/ServiceModule.kt @@ -1,6 +1,8 @@ package com.terning.point.di +import com.terning.data.service.AuthService import com.terning.data.service.MockService +import com.terning.point.di.qualifier.JWT import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides @@ -18,4 +20,8 @@ object ServiceModule { fun provideMockService(@OPEN retrofit: Retrofit): MockService = retrofit.create(MockService::class.java) + @Provides + @Singleton + fun provideAuthService(@JWT retrofit: Retrofit): AuthService = + retrofit.create(AuthService::class.java) } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt b/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt index fe7176d0b..5ff55db11 100644 --- a/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt +++ b/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt @@ -5,4 +5,8 @@ import javax.inject.Qualifier @Qualifier @Retention(AnnotationRetention.BINARY) -annotation class OPEN \ No newline at end of file +annotation class OPEN + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class JWT \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasource/AuthDataSource.kt b/data/src/main/java/com/terning/data/datasource/AuthDataSource.kt new file mode 100644 index 000000000..362d71b23 --- /dev/null +++ b/data/src/main/java/com/terning/data/datasource/AuthDataSource.kt @@ -0,0 +1,12 @@ +package com.terning.data.datasource + +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.SignInRequestDto +import com.terning.data.dto.response.SignInResponseDto + +interface AuthDataSource { + suspend fun postSignIn( + authorization: String, + platform: SignInRequestDto + ): BaseResponse +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/AuthDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/AuthDataSourceImpl.kt new file mode 100644 index 000000000..cbb8ca54f --- /dev/null +++ b/data/src/main/java/com/terning/data/datasourceimpl/AuthDataSourceImpl.kt @@ -0,0 +1,17 @@ +package com.terning.data.datasourceimpl + +import com.terning.data.datasource.AuthDataSource +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.SignInRequestDto +import com.terning.data.dto.response.SignInResponseDto +import com.terning.data.service.AuthService +import javax.inject.Inject + +class AuthDataSourceImpl @Inject constructor( + private val authService: AuthService +) : AuthDataSource { + override suspend fun postSignIn( + authorization: String, + platform: SignInRequestDto + ): BaseResponse = authService.postSignIn(authorization, platform) +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt b/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt new file mode 100644 index 000000000..89fdb99ad --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt @@ -0,0 +1,14 @@ +package com.terning.data.dto.request + +import com.terning.domain.entity.request.SignInRequestModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SignInRequestDto( + @SerialName("platform") + val platform: String +) + +fun SignInRequestModel.toSignInRequestDto(): SignInRequestDto = + SignInRequestDto(platform = platform) \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt new file mode 100644 index 000000000..b742c96e3 --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt @@ -0,0 +1,20 @@ +package com.terning.data.dto.response + +import com.terning.domain.entity.response.SignInResponseModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SignInResponseDto( + @SerialName("accessToken") + val platform: String, + @SerialName("id") + val id: Long, + @SerialName("createdAt") + val createdAt: String, +// @SerialName("authType") +// val authType: String +) { + fun toSignInModel() = SignInResponseModel(platform, id, createdAt, ) + //authType) +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt new file mode 100644 index 000000000..5248b6bad --- /dev/null +++ b/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt @@ -0,0 +1,22 @@ +package com.terning.data.repositoryimpl + +import com.terning.data.datasource.AuthDataSource +import com.terning.data.dto.request.toSignInRequestDto +import com.terning.domain.entity.request.SignInRequestModel +import com.terning.domain.entity.response.SignInResponseModel +import com.terning.domain.repository.AuthRepository +import javax.inject.Inject + +class AuthRepositoryImpl @Inject constructor( + private val authDataSource: AuthDataSource +) : AuthRepository { + override suspend fun postSignIn( + authorization: String, + signInRequestModel: SignInRequestModel + ): Result = kotlin.runCatching { + authDataSource.postSignIn( + authorization, + signInRequestModel.toSignInRequestDto() + ).result.toSignInModel() + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt new file mode 100644 index 000000000..1bbbb3f2b --- /dev/null +++ b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt @@ -0,0 +1,4 @@ +package com.terning.data.repositoryimpl + +class TokenRepositoryImpl { +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/AuthService.kt b/data/src/main/java/com/terning/data/service/AuthService.kt new file mode 100644 index 000000000..0e8aeba61 --- /dev/null +++ b/data/src/main/java/com/terning/data/service/AuthService.kt @@ -0,0 +1,16 @@ +package com.terning.data.service + +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.SignInRequestDto +import com.terning.data.dto.response.SignInResponseDto +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface AuthService { + @POST("api/v1/auth/sign-in") + suspend fun postSignIn( + @Header("Authorization") authorization: String, + @Body body: SignInRequestDto, + ): BaseResponse +} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt index e0f3f1655..36a93f56e 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt @@ -1,8 +1,8 @@ package com.terning.domain.entity.response data class SignInResponseModel( - val accessToken: String, - val refreshToken: String, - val userId: Long, - val authType: String + val platform: String, + val id: Long, + val createdAt: String, + // val authType: String ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt index eef3a7100..e0dcafa6f 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt @@ -42,6 +42,7 @@ fun SignInRoute( when (sideEffect) { is SignInSideEffect.ShowToast -> context.toast(sideEffect.message) is SignInSideEffect.NavigateToHome -> navController.navigateSignUp() + is SignInSideEffect.NavigateSignUp -> navController.navigateSignUp() } } } diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 2fb514545..8dc03e4e9 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -1,6 +1,7 @@ package com.terning.feature.onboarding.signin import android.content.Context +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.sdk.auth.model.OAuthToken @@ -24,7 +25,7 @@ import javax.inject.Inject @HiltViewModel class SignInViewModel @Inject constructor( private val authRepository: AuthRepository, - private val tokenRepository: TokenRepository + // private val tokenRepository: TokenRepository ) : ViewModel() { private val _signInState = MutableStateFlow(SignInState()) @@ -81,15 +82,16 @@ class SignInViewModel @Inject constructor( accessToken: String, platform: String = KAKAO ) { + Log.d("LYB", accessToken.toString()) viewModelScope.launch { authRepository.postSignIn( accessToken, SignInRequestModel(platform) ).onSuccess { response -> - tokenRepository.setTokens(response.accessToken, response.refreshToken) - tokenRepository.setUserId(response.userId) +// tokenRepository.setTokens(response.accessToken, response.refreshToken) +// tokenRepository.setUserId(response.userId) - if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + if (response.createdAt == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) }.onFailure { _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) From 783674c6d934c60d566012df052095f7ea8214b0 Mon Sep 17 00:00:00 2001 From: arinming Date: Mon, 15 Jul 2024 23:44:20 +0900 Subject: [PATCH 04/43] =?UTF-8?q?[FEAT/#79]=20SearchService,=20DTO=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/SearchViewsResponseDto.kt | 30 +++++++++++++++++++ .../com/terning/data/service/SearchService.kt | 12 ++++++++ 2 files changed, 42 insertions(+) create mode 100644 data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt create mode 100644 data/src/main/java/com/terning/data/service/SearchService.kt diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt new file mode 100644 index 000000000..55f247fac --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -0,0 +1,30 @@ +package com.terning.data.dto.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SearchViewsResponseDto( + @SerialName("status") + val status: Int, + @SerialName("message") + val message: String, + @SerialName("result") + val result: Result +) { + @Serializable + data class Result( + @SerialName("accountments") + val accountments: List + ) + + @Serializable + data class SearchViewsData( + @SerialName("internshipAnnouncementId") + val internshipAnnouncementId: Long, + @SerialName("companyImage") + val companyImage: String, + @SerialName("title") + val title: String + ) +} diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt new file mode 100644 index 000000000..3d588cb2d --- /dev/null +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -0,0 +1,12 @@ +package com.terning.data.service + +import com.terning.data.dto.response.SearchViewsResponseDto +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchService { + @GET("api/v1/search/views") + suspend fun getSearchViewsList( + @Query("page") page: Int, + ): SearchViewsResponseDto +} \ No newline at end of file From a6ebc71ee34601e799544be804ca924da1098795 Mon Sep 17 00:00:00 2001 From: arinming Date: Mon, 15 Jul 2024 23:59:48 +0900 Subject: [PATCH 05/43] =?UTF-8?q?[FEAT/#79]=20=EC=A1=B0=ED=9A=8C=EC=88=98?= =?UTF-8?q?=20=EB=A7=8E=EC=9D=80=20=EA=B3=B5=EA=B3=A0=20data=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/SearchViewsDataSource.kt | 7 +++++++ .../datasourceimpl/SearchViewsDataSourceImpl.kt | 13 +++++++++++++ .../data/dto/response/SearchViewsResponseDto.kt | 15 ++++++++++++--- .../repositoryimpl/SearchViewsRepositoryImpl.kt | 15 +++++++++++++++ .../com/terning/data/service/SearchService.kt | 5 +---- .../entity/response/SearchViewsResponseModel.kt | 7 +++++++ .../domain/repository/SearchViewsRepository.kt | 7 +++++++ 7 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt create mode 100644 data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt create mode 100644 data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt create mode 100644 domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt create mode 100644 domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt diff --git a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt new file mode 100644 index 000000000..727cf9671 --- /dev/null +++ b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt @@ -0,0 +1,7 @@ +package com.terning.data.datasource + +import com.terning.data.dto.response.SearchViewsResponseDto + +interface SearchViewsDataSource { + suspend fun getSearchViews(): SearchViewsResponseDto +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt new file mode 100644 index 000000000..075e657bf --- /dev/null +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -0,0 +1,13 @@ +package com.terning.data.datasourceimpl + +import com.terning.data.datasource.SearchViewsDataSource +import com.terning.data.dto.response.SearchViewsResponseDto +import com.terning.data.service.SearchService +import javax.inject.Inject + +class SearchViewsDataSourceImpl @Inject constructor( + private val searchService: SearchService +): SearchViewsDataSource { + override suspend fun getSearchViews(): SearchViewsResponseDto = + searchService.getSearchViewsList() +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index 55f247fac..38ee2544f 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -1,5 +1,6 @@ package com.terning.data.dto.response +import com.terning.domain.entity.response.SearchViewsResponseModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -10,12 +11,12 @@ data class SearchViewsResponseDto( @SerialName("message") val message: String, @SerialName("result") - val result: Result + val result: Result, ) { @Serializable data class Result( @SerialName("accountments") - val accountments: List + val accountments: List, ) @Serializable @@ -25,6 +26,14 @@ data class SearchViewsResponseDto( @SerialName("companyImage") val companyImage: String, @SerialName("title") - val title: String + val title: String, ) + + fun toMockEntity(): List = result.accountments.map { + SearchViewsResponseModel( + title = it.title, + companyImage = it.companyImage, + announcementId = it.internshipAnnouncementId + ) + } } diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt new file mode 100644 index 000000000..73e5b99a5 --- /dev/null +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -0,0 +1,15 @@ +package com.terning.data.repositoryimpl + +import com.terning.data.datasource.SearchViewsDataSource +import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.repository.SearchViewsRepository +import javax.inject.Inject + +class SearchViewsRepositoryImpl @Inject constructor( + private val searchViewsDataSource: SearchViewsDataSource, +) : SearchViewsRepository { + override suspend fun getSearchViewsList(): Result> = + runCatching { + searchViewsDataSource.getSearchViews().toMockEntity() + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt index 3d588cb2d..bfdddc887 100644 --- a/data/src/main/java/com/terning/data/service/SearchService.kt +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -2,11 +2,8 @@ package com.terning.data.service import com.terning.data.dto.response.SearchViewsResponseDto import retrofit2.http.GET -import retrofit2.http.Query interface SearchService { @GET("api/v1/search/views") - suspend fun getSearchViewsList( - @Query("page") page: Int, - ): SearchViewsResponseDto + suspend fun getSearchViewsList(): SearchViewsResponseDto } \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt new file mode 100644 index 000000000..0877ecf4a --- /dev/null +++ b/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt @@ -0,0 +1,7 @@ +package com.terning.domain.entity.response + +data class SearchViewsResponseModel( + val title: String, + val companyImage: String, + val announcementId: Long, +) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt new file mode 100644 index 000000000..3e64e61a0 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt @@ -0,0 +1,7 @@ +package com.terning.domain.repository + +import com.terning.domain.entity.response.SearchViewsResponseModel + +interface SearchViewsRepository { + suspend fun getSearchViewsList(): Result> +} \ No newline at end of file From a6883252cde0fb0f8ad311986776a2614f8ccd5e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 00:02:15 +0900 Subject: [PATCH 06/43] =?UTF-8?q?[CHORE/#72]=20=EB=AA=85=EC=84=B8=EC=84=9C?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/TokenReissueDataSource.kt | 5 +++++ .../TokenReissueDataSourceImpl.kt | 4 ++++ .../data/dto/request/SignInRequestDto.kt | 6 ++--- .../data/dto/response/SignInResponseDto.kt | 22 +++++++++++-------- .../repositoryimpl/TokenRepositoryImpl.kt | 7 +++++- .../entity/request/SignInRequestModel.kt | 2 +- .../entity/response/SignInResponseModel.kt | 8 +++---- .../onboarding/signin/SignInViewModel.kt | 10 ++++----- 8 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt create mode 100644 data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt diff --git a/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt b/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt new file mode 100644 index 000000000..a5af3170c --- /dev/null +++ b/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt @@ -0,0 +1,5 @@ +package com.terning.data.datasource + +class TokenReissueDataSource { + +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt new file mode 100644 index 000000000..24337179f --- /dev/null +++ b/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt @@ -0,0 +1,4 @@ +package com.terning.data.datasourceimpl + +class TokenReissueDataSourceImpl { +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt b/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt index 89fdb99ad..f87431913 100644 --- a/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt +++ b/data/src/main/java/com/terning/data/dto/request/SignInRequestDto.kt @@ -6,9 +6,9 @@ import kotlinx.serialization.Serializable @Serializable data class SignInRequestDto( - @SerialName("platform") - val platform: String + @SerialName("authType") + val authType: String ) fun SignInRequestModel.toSignInRequestDto(): SignInRequestDto = - SignInRequestDto(platform = platform) \ No newline at end of file + SignInRequestDto(authType = authType) \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt index b742c96e3..eabc0ea67 100644 --- a/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SignInResponseDto.kt @@ -7,14 +7,18 @@ import kotlinx.serialization.Serializable @Serializable data class SignInResponseDto( @SerialName("accessToken") - val platform: String, - @SerialName("id") - val id: Long, - @SerialName("createdAt") - val createdAt: String, -// @SerialName("authType") -// val authType: String + val accessToken: String, + @SerialName("refreshToken") + val refreshToken: String, + @SerialName("userId") + val userId: Long, + @SerialName("authType") + val authType: String, ) { - fun toSignInModel() = SignInResponseModel(platform, id, createdAt, ) - //authType) + fun toSignInModel() = SignInResponseModel( + accessToken = accessToken, + refreshToken = refreshToken, + userId = userId, + authType = authType + ) } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt index 1bbbb3f2b..7cf08001e 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt @@ -1,4 +1,9 @@ package com.terning.data.repositoryimpl -class TokenRepositoryImpl { +import com.terning.data.datasource.TokenReissueDataSource +import javax.inject.Inject + +class TokenRepositoryImpl @Inject constructor( + private val tokenReissueDataSource : TokenReissueDataSource +) { } \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt b/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt index ad63a7ac1..c51066a71 100644 --- a/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/request/SignInRequestModel.kt @@ -1,5 +1,5 @@ package com.terning.domain.entity.request data class SignInRequestModel( - val platform: String + val authType: String ) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt index 36a93f56e..558aaf19e 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt @@ -1,8 +1,8 @@ package com.terning.domain.entity.response data class SignInResponseModel( - val platform: String, - val id: Long, - val createdAt: String, - // val authType: String + val accessToken : String, + val refreshToken : String, + val userId : Long, + val authType: String ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 8dc03e4e9..2fb514545 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -1,7 +1,6 @@ package com.terning.feature.onboarding.signin import android.content.Context -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.sdk.auth.model.OAuthToken @@ -25,7 +24,7 @@ import javax.inject.Inject @HiltViewModel class SignInViewModel @Inject constructor( private val authRepository: AuthRepository, - // private val tokenRepository: TokenRepository + private val tokenRepository: TokenRepository ) : ViewModel() { private val _signInState = MutableStateFlow(SignInState()) @@ -82,16 +81,15 @@ class SignInViewModel @Inject constructor( accessToken: String, platform: String = KAKAO ) { - Log.d("LYB", accessToken.toString()) viewModelScope.launch { authRepository.postSignIn( accessToken, SignInRequestModel(platform) ).onSuccess { response -> -// tokenRepository.setTokens(response.accessToken, response.refreshToken) -// tokenRepository.setUserId(response.userId) + tokenRepository.setTokens(response.accessToken, response.refreshToken) + tokenRepository.setUserId(response.userId) - if (response.createdAt == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) }.onFailure { _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) From a759a73d38f4f8fca7ee1ecdc160d0f2dfa31768 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 00:10:29 +0900 Subject: [PATCH 07/43] =?UTF-8?q?[FEAT/#79]=20=EC=A1=B0=ED=9A=8C=EC=88=98?= =?UTF-8?q?=20=EB=A7=8E=EC=9D=80=20=EA=B3=B5=EA=B3=A0=20ViewModel=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/point/di/RepositoryModule.kt | 6 +++ .../feature/search/search/SearchViewModel.kt | 49 +++++++++++++++++++ .../search/search/SearchViewsSideEffect.kt | 7 +++ .../feature/search/search/SearchViewsState.kt | 8 +++ 4 files changed, 70 insertions(+) create mode 100644 feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt create mode 100644 feature/src/main/java/com/terning/feature/search/search/SearchViewsSideEffect.kt create mode 100644 feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index 9de02a07a..c70b1bcd4 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,7 +1,9 @@ package com.terning.point.di import com.terning.data.repositoryimpl.MockRepositoryImpl +import com.terning.data.repositoryimpl.SearchViewsRepositoryImpl import com.terning.domain.repository.MockRepository +import com.terning.domain.repository.SearchViewsRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -15,4 +17,8 @@ abstract class RepositoryModule { @Binds @Singleton abstract fun bindMockRepository(mockRepositoryImpl: MockRepositoryImpl): MockRepository + + @Binds + @Singleton + abstract fun bindSearchViewsRepository(searchViewsRepositoryImpl: SearchViewsRepositoryImpl): SearchViewsRepository } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt new file mode 100644 index 000000000..e1b1ddf10 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -0,0 +1,49 @@ +package com.terning.feature.search.search + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.terning.core.state.UiState +import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.repository.SearchViewsRepository +import com.terning.feature.R +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SearchViewModel @Inject constructor( + private val searchViewsRepository: SearchViewsRepository, +) : ViewModel() { + private val _state: MutableStateFlow = MutableStateFlow(SearchViewsState()) + val state: StateFlow = _state.asStateFlow() + + private val _sideEffect: MutableSharedFlow = MutableSharedFlow() + + init { + getSearchViews() + } + + private fun getSearchViews() { + viewModelScope.launch { + searchViewsRepository.getSearchViewsList().onSuccess { response -> + val searchViewsList = response.map { entity -> + SearchViewsResponseModel( + title = entity.title, + companyImage = entity.companyImage, + announcementId = entity.announcementId + ) + } + _state.value = _state.value.copy( + searchViewsList = UiState.Success(searchViewsList) + ) + _sideEffect.emit(SearchViewsSideEffect.Toast(R.string.server_success)) + }.onFailure { + _sideEffect.emit(SearchViewsSideEffect.Toast(R.string.server_failure)) + } + } + } +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewsSideEffect.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewsSideEffect.kt new file mode 100644 index 000000000..208b1fad3 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewsSideEffect.kt @@ -0,0 +1,7 @@ +package com.terning.feature.search.search + +import androidx.annotation.StringRes + +sealed class SearchViewsSideEffect { + data class Toast(@StringRes val message: Int) : SearchViewsSideEffect() +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt new file mode 100644 index 000000000..93e2a9b5a --- /dev/null +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt @@ -0,0 +1,8 @@ +package com.terning.feature.search.search + +import com.terning.core.state.UiState +import com.terning.domain.entity.response.SearchViewsResponseModel + +data class SearchViewsState( + var searchViewsList: UiState> = UiState.Loading, +) \ No newline at end of file From 70735e009c9439cc5d61020ba5794b78b8f1a94f Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 00:35:31 +0900 Subject: [PATCH 08/43] =?UTF-8?q?[DEL/#72]=20=EA=B8=B0=EC=A1=B4=20Mock=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/point/di/DataSourceModule.kt | 6 - .../com/terning/point/di/DataStoreModule.kt | 11 ++ .../com/terning/point/di/RepositoryModule.kt | 10 +- .../com/terning/point/di/RetrofitModule.kt | 13 --- .../com/terning/point/di/ServiceModule.kt | 7 -- .../point/di/qualifier/RetrofitQualifier.kt | 4 - .../terning/data/datasource/MockDataSource.kt | 14 +-- .../data/datasource/TokenReissueDataSource.kt | 5 - .../data/datasourceimpl/MockDataSourceImpl.kt | 26 ++--- .../TokenReissueDataSourceImpl.kt | 4 - .../data/dto/response/MockResponseDto.kt | 106 +++++++++--------- .../terning/data/local/TerningDataStore.kt | 8 ++ .../data/local/TerningDataStoreImpl.kt | 4 + .../data/repositoryimpl/MockRepositoryImpl.kt | 28 ++--- .../repositoryimpl/TokenRepositoryImpl.kt | 4 +- .../com/terning/data/service/MockService.kt | 24 ++-- .../entity/response/MockResponseModel.kt | 16 +-- .../domain/repository/MockRepository.kt | 14 +-- .../terning/feature/mypage/MyPageViewModel.kt | 3 +- .../onboarding/signin/SignInViewModel.kt | 8 +- 20 files changed, 149 insertions(+), 166 deletions(-) create mode 100644 app/src/main/java/com/terning/point/di/DataStoreModule.kt delete mode 100644 data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt delete mode 100644 data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt create mode 100644 data/src/main/java/com/terning/data/local/TerningDataStore.kt create mode 100644 data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt diff --git a/app/src/main/java/com/terning/point/di/DataSourceModule.kt b/app/src/main/java/com/terning/point/di/DataSourceModule.kt index f176ed995..1e4fafac6 100644 --- a/app/src/main/java/com/terning/point/di/DataSourceModule.kt +++ b/app/src/main/java/com/terning/point/di/DataSourceModule.kt @@ -1,9 +1,7 @@ package com.terning.point.di import com.terning.data.datasource.AuthDataSource -import com.terning.data.datasource.MockDataSource import com.terning.data.datasourceimpl.AuthDataSourceImpl -import com.terning.data.datasourceimpl.MockDataSourceImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -14,10 +12,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) abstract class DataSourceModule { - @Binds - @Singleton - abstract fun bindMockDataSource(mockDataSourceImpl: MockDataSourceImpl): MockDataSource - @Binds @Singleton abstract fun bindAuthDataSource(authDataSourceImpl: AuthDataSourceImpl): AuthDataSource diff --git a/app/src/main/java/com/terning/point/di/DataStoreModule.kt b/app/src/main/java/com/terning/point/di/DataStoreModule.kt new file mode 100644 index 000000000..d21d799e2 --- /dev/null +++ b/app/src/main/java/com/terning/point/di/DataStoreModule.kt @@ -0,0 +1,11 @@ +package com.terning.point.di + +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +object DataStoreModule{ + +} \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index 3f21a05d3..aba433004 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,9 +1,7 @@ package com.terning.point.di import com.terning.data.repositoryimpl.AuthRepositoryImpl -import com.terning.data.repositoryimpl.MockRepositoryImpl import com.terning.domain.repository.AuthRepository -import com.terning.domain.repository.MockRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -14,11 +12,11 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) abstract class RepositoryModule { - @Binds - @Singleton - abstract fun bindMockRepository(mockRepositoryImpl: MockRepositoryImpl): MockRepository - @Binds @Singleton abstract fun bindAuthRepository(authRepositoryImpl: AuthRepositoryImpl): AuthRepository +// +// @Binds +// @Singleton +// abstract fun bindTokenRepository(tokenRepositoryImpl: TokenRepositoryImpl): TokenRepository } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RetrofitModule.kt b/app/src/main/java/com/terning/point/di/RetrofitModule.kt index 9b1a199d6..d605f0245 100644 --- a/app/src/main/java/com/terning/point/di/RetrofitModule.kt +++ b/app/src/main/java/com/terning/point/di/RetrofitModule.kt @@ -4,7 +4,6 @@ import com.terning.core.extension.isJsonArray import com.terning.core.extension.isJsonObject import com.terning.point.BuildConfig import com.terning.point.di.qualifier.JWT -import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -64,18 +63,6 @@ object RetrofitModule { .addInterceptor(loggingInterceptor) .build() - @Provides - @Singleton - @OPEN - fun provideOpenRetrofit( - client: OkHttpClient, - factory: Converter.Factory - ): Retrofit = Retrofit.Builder() - .baseUrl(BuildConfig.BASE_URL) - .addConverterFactory(factory) - .client(client) - .build() - @Provides @Singleton @JWT diff --git a/app/src/main/java/com/terning/point/di/ServiceModule.kt b/app/src/main/java/com/terning/point/di/ServiceModule.kt index fc756252a..b62e3c64b 100644 --- a/app/src/main/java/com/terning/point/di/ServiceModule.kt +++ b/app/src/main/java/com/terning/point/di/ServiceModule.kt @@ -1,9 +1,7 @@ package com.terning.point.di import com.terning.data.service.AuthService -import com.terning.data.service.MockService import com.terning.point.di.qualifier.JWT -import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -15,11 +13,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object ServiceModule { - @Provides - @Singleton - fun provideMockService(@OPEN retrofit: Retrofit): MockService = - retrofit.create(MockService::class.java) - @Provides @Singleton fun provideAuthService(@JWT retrofit: Retrofit): AuthService = diff --git a/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt b/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt index 5ff55db11..11956ab89 100644 --- a/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt +++ b/app/src/main/java/com/terning/point/di/qualifier/RetrofitQualifier.kt @@ -3,10 +3,6 @@ package com.terning.point.di.qualifier import javax.inject.Qualifier -@Qualifier -@Retention(AnnotationRetention.BINARY) -annotation class OPEN - @Qualifier @Retention(AnnotationRetention.BINARY) annotation class JWT \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasource/MockDataSource.kt b/data/src/main/java/com/terning/data/datasource/MockDataSource.kt index 468b21bca..a2f2674a0 100644 --- a/data/src/main/java/com/terning/data/datasource/MockDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/MockDataSource.kt @@ -1,7 +1,7 @@ -package com.terning.data.datasource - -import com.terning.data.dto.response.MockResponseDto - -interface MockDataSource { - suspend fun getMock(page: Int): MockResponseDto -} \ No newline at end of file +//package com.terning.data.datasource +// +//import com.terning.data.dto.response.MockResponseDto +// +//interface MockDataSource { +// suspend fun getMock(page: Int): MockResponseDto +//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt b/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt deleted file mode 100644 index a5af3170c..000000000 --- a/data/src/main/java/com/terning/data/datasource/TokenReissueDataSource.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.terning.data.datasource - -class TokenReissueDataSource { - -} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt index 12aa9731f..2dfa63612 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt @@ -1,13 +1,13 @@ -package com.terning.data.datasourceimpl - -import com.terning.data.datasource.MockDataSource -import com.terning.data.dto.response.MockResponseDto -import com.terning.data.service.MockService -import javax.inject.Inject - -class MockDataSourceImpl @Inject constructor( - private val mockService: MockService -) : MockDataSource { - override suspend fun getMock(page: Int): MockResponseDto = - mockService.getMockListFromServer(page) -} \ No newline at end of file +//package com.terning.data.datasourceimpl +// +//import com.terning.data.datasource.MockDataSource +//import com.terning.data.dto.response.MockResponseDto +//import com.terning.data.service.MockService +//import javax.inject.Inject +// +//class MockDataSourceImpl @Inject constructor( +// private val mockService: MockService +//) : MockDataSource { +// override suspend fun getMock(page: Int): MockResponseDto = +// mockService.getMockListFromServer(page) +//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt deleted file mode 100644 index 24337179f..000000000 --- a/data/src/main/java/com/terning/data/datasourceimpl/TokenReissueDataSourceImpl.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.terning.data.datasourceimpl - -class TokenReissueDataSourceImpl { -} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt index 6163bd8bd..e15d1c870 100644 --- a/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt @@ -1,53 +1,53 @@ -package com.terning.data.dto.response - -import com.terning.domain.entity.response.MockResponseModel -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class MockResponseDto( - @SerialName("page") - val page: Int, - @SerialName("per_page") - val per_page: Int, - @SerialName("total") - val total: Int, - @SerialName("total_pages") - val total_pages: Int, - @SerialName("data") - val data: List, - @SerialName("support") - val support: Support, -) { - @Serializable - data class MockData( - @SerialName("id") - val id: Int, - @SerialName("email") - val email: String, - @SerialName("first_name") - val first_name: String, - @SerialName("last_name") - val last_name: String, - @SerialName("avatar") - val avatar: String - ) - - @Serializable - data class Support( - @SerialName("url") - val url: String, - @SerialName("text") - val text: String, - ) - - fun toMockEntity(): List = data.map { - MockResponseModel( - avatar = it.avatar, - email = it.email, - firstName = it.first_name, - lastName = it.last_name - ) - } - -} \ No newline at end of file +//package com.terning.data.dto.response +// +//import com.terning.domain.entity.response.MockResponseModel +//import kotlinx.serialization.SerialName +//import kotlinx.serialization.Serializable +// +//@Serializable +//data class MockResponseDto( +// @SerialName("page") +// val page: Int, +// @SerialName("per_page") +// val per_page: Int, +// @SerialName("total") +// val total: Int, +// @SerialName("total_pages") +// val total_pages: Int, +// @SerialName("data") +// val data: List, +// @SerialName("support") +// val support: Support, +//) { +// @Serializable +// data class MockData( +// @SerialName("id") +// val id: Int, +// @SerialName("email") +// val email: String, +// @SerialName("first_name") +// val first_name: String, +// @SerialName("last_name") +// val last_name: String, +// @SerialName("avatar") +// val avatar: String +// ) +// +// @Serializable +// data class Support( +// @SerialName("url") +// val url: String, +// @SerialName("text") +// val text: String, +// ) +// +// fun toMockEntity(): List = data.map { +// MockResponseModel( +// avatar = it.avatar, +// email = it.email, +// firstName = it.first_name, +// lastName = it.last_name +// ) +// } +// +//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/local/TerningDataStore.kt b/data/src/main/java/com/terning/data/local/TerningDataStore.kt new file mode 100644 index 000000000..23e6af70a --- /dev/null +++ b/data/src/main/java/com/terning/data/local/TerningDataStore.kt @@ -0,0 +1,8 @@ +package com.terning.data.local + +interface TerningDataStore { + var accessToken: String + var refreshToken: String + var userId: Long + fun clearInfo() +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt b/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt new file mode 100644 index 000000000..6be7460ec --- /dev/null +++ b/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt @@ -0,0 +1,4 @@ +package com.terning.data.local + +class TerningDataStoreImpl { +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt index d8cd7b4fa..a160b75bf 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt @@ -1,14 +1,14 @@ -package com.terning.data.repositoryimpl - -import com.terning.data.datasource.MockDataSource -import com.terning.domain.entity.response.MockResponseModel -import com.terning.domain.repository.MockRepository -import javax.inject.Inject - -class MockRepositoryImpl @Inject constructor(private val mockDataSource: MockDataSource) : - MockRepository { - override suspend fun getMockList(page: Int): Result> = - runCatching { - mockDataSource.getMock(page).toMockEntity() - } -} \ No newline at end of file +//package com.terning.data.repositoryimpl +// +//import com.terning.data.datasource.MockDataSource +//import com.terning.domain.entity.response.MockResponseModel +//import com.terning.domain.repository.MockRepository +//import javax.inject.Inject +// +//class MockRepositoryImpl @Inject constructor(private val mockDataSource: MockDataSource) : +// MockRepository { +// override suspend fun getMockList(page: Int): Result> = +// runCatching { +// mockDataSource.getMock(page).toMockEntity() +// } +//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt index 7cf08001e..9cd14cd8f 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt @@ -1,9 +1,9 @@ package com.terning.data.repositoryimpl -import com.terning.data.datasource.TokenReissueDataSource +import com.terning.data.local.TerningDataStore import javax.inject.Inject class TokenRepositoryImpl @Inject constructor( - private val tokenReissueDataSource : TokenReissueDataSource + private val terningDataStore: TerningDataStore ) { } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/MockService.kt b/data/src/main/java/com/terning/data/service/MockService.kt index fddfe0b4b..c2e4c3dfa 100644 --- a/data/src/main/java/com/terning/data/service/MockService.kt +++ b/data/src/main/java/com/terning/data/service/MockService.kt @@ -1,12 +1,12 @@ -package com.terning.data.service - -import com.terning.data.dto.response.MockResponseDto -import retrofit2.http.GET -import retrofit2.http.Query - -interface MockService { - @GET("api/users") - suspend fun getMockListFromServer( - @Query("page") page: Int, - ): MockResponseDto -} \ No newline at end of file +//package com.terning.data.service +// +//import com.terning.data.dto.response.MockResponseDto +//import retrofit2.http.GET +//import retrofit2.http.Query +// +//interface MockService { +// @GET("api/users") +// suspend fun getMockListFromServer( +// @Query("page") page: Int, +// ): MockResponseDto +//} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt index 5b272ff6b..a8f46254d 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt @@ -1,8 +1,8 @@ -package com.terning.domain.entity.response - -data class MockResponseModel( - val avatar: String, - val email: String, - val firstName: String, - val lastName: String, -) \ No newline at end of file +//package com.terning.domain.entity.response +// +//data class MockResponseModel( +// val avatar: String, +// val email: String, +// val firstName: String, +// val lastName: String, +//) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/MockRepository.kt b/domain/src/main/java/com/terning/domain/repository/MockRepository.kt index ca5e06da8..a7d2ac173 100644 --- a/domain/src/main/java/com/terning/domain/repository/MockRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/MockRepository.kt @@ -1,7 +1,7 @@ -package com.terning.domain.repository - -import com.terning.domain.entity.response.MockResponseModel - -interface MockRepository { - suspend fun getMockList(page: Int): Result> -} \ No newline at end of file +//package com.terning.domain.repository +// +//import com.terning.domain.entity.response.MockResponseModel +// +//interface MockRepository { +// suspend fun getMockList(page: Int): Result> +//} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/mypage/MyPageViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/MyPageViewModel.kt index c64ae552b..50efca522 100644 --- a/feature/src/main/java/com/terning/feature/mypage/MyPageViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/MyPageViewModel.kt @@ -1,12 +1,11 @@ package com.terning.feature.mypage import androidx.lifecycle.ViewModel -import com.terning.domain.repository.MockRepository import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class MyPageViewModel @Inject constructor(private val repository: MockRepository) : ViewModel() { +class MyPageViewModel @Inject constructor() : ViewModel() { } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 2fb514545..4df9219dd 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -1,6 +1,7 @@ package com.terning.feature.onboarding.signin import android.content.Context +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.sdk.auth.model.OAuthToken @@ -24,7 +25,7 @@ import javax.inject.Inject @HiltViewModel class SignInViewModel @Inject constructor( private val authRepository: AuthRepository, - private val tokenRepository: TokenRepository + // private val tokenRepository: TokenRepository ) : ViewModel() { private val _signInState = MutableStateFlow(SignInState()) @@ -82,12 +83,13 @@ class SignInViewModel @Inject constructor( platform: String = KAKAO ) { viewModelScope.launch { + Log.d("LYB", accessToken.toString()) authRepository.postSignIn( accessToken, SignInRequestModel(platform) ).onSuccess { response -> - tokenRepository.setTokens(response.accessToken, response.refreshToken) - tokenRepository.setUserId(response.userId) +// tokenRepository.setTokens(response.accessToken, response.refreshToken) +// tokenRepository.setUserId(response.userId) if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) From 9eeedf7e17fd008a80dd0e76039071b9b84223f7 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 00:50:24 +0900 Subject: [PATCH 09/43] =?UTF-8?q?[FEAT/#79]=20=EC=A1=B0=ED=9A=8C=EC=88=98?= =?UTF-8?q?=20=EB=A7=8E=EC=9D=80=20=EA=B3=B5=EA=B3=A0=20=EB=B7=B0=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=ED=98=B8=EC=B6=9C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/point/di/DataSourceModule.kt | 7 ++++ .../com/terning/point/di/ServiceModule.kt | 5 +++ .../feature/search/search/SearchRoute.kt | 42 +++++++++++++++++-- .../feature/search/search/SearchViewModel.kt | 4 +- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/terning/point/di/DataSourceModule.kt b/app/src/main/java/com/terning/point/di/DataSourceModule.kt index c1541df6a..612d0d0ef 100644 --- a/app/src/main/java/com/terning/point/di/DataSourceModule.kt +++ b/app/src/main/java/com/terning/point/di/DataSourceModule.kt @@ -1,7 +1,9 @@ package com.terning.point.di import com.terning.data.datasource.MockDataSource +import com.terning.data.datasource.SearchViewsDataSource import com.terning.data.datasourceimpl.MockDataSourceImpl +import com.terning.data.datasourceimpl.SearchViewsDataSourceImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -15,4 +17,9 @@ abstract class DataSourceModule { @Binds @Singleton abstract fun bindMockDataSource(mockDataSourceImpl: MockDataSourceImpl): MockDataSource + + @Binds + @Singleton + abstract fun bindSearchViewsDataSource(searchViewsDataSourceImpl: SearchViewsDataSourceImpl): + SearchViewsDataSource } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/ServiceModule.kt b/app/src/main/java/com/terning/point/di/ServiceModule.kt index 317c02f92..a4c281b3b 100644 --- a/app/src/main/java/com/terning/point/di/ServiceModule.kt +++ b/app/src/main/java/com/terning/point/di/ServiceModule.kt @@ -1,6 +1,7 @@ package com.terning.point.di import com.terning.data.service.MockService +import com.terning.data.service.SearchService import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides @@ -18,4 +19,8 @@ object ServiceModule { fun provideMockService(@OPEN retrofit: Retrofit): MockService = retrofit.create(MockService::class.java) + @Provides + @Singleton + fun provideSearchService(@OPEN retrofit: Retrofit): SearchService = + retrofit.create(SearchService::class.java) } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 17becd309..20ab506b2 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -10,9 +10,15 @@ 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.getValue import androidx.compose.ui.Modifier 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.textfield.SearchTextField import com.terning.core.designsystem.component.topappbar.LogoTopAppBar @@ -20,6 +26,8 @@ import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable +import com.terning.core.state.UiState +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R import com.terning.feature.search.search.component.ImageSlider import com.terning.feature.search.search.component.InternListType @@ -29,16 +37,44 @@ import com.terning.feature.search.searchprocess.navigation.navigateSearchProcess @Composable fun SearchRoute( navController: NavHostController, + viewModel: SearchViewModel = hiltViewModel(), ) { - SearchScreen( - navController = navController - ) + val lifecycleOwner = LocalLifecycleOwner.current + + val state by viewModel.state.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner) + + LaunchedEffect(key1 = true) { + viewModel.getSearchViews() + } + + LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { + viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) + .collect { sideEffect -> + when (sideEffect) { + is SearchViewsSideEffect.Toast -> {} + } + } + } + + when (state.searchViewsList) { + is UiState.Loading -> {} + is UiState.Empty -> {} + is UiState.Failure -> {} + is UiState.Success -> { + SearchScreen( + navController = navController, + searchViewsList = (state.searchViewsList as UiState.Success>).data + ) + } + + } } @Composable fun SearchScreen( modifier: Modifier = Modifier, navController: NavHostController, + searchViewsList: List, ) { val images = listOf( R.drawable.ic_nav_search, diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt index e1b1ddf10..d55431d8c 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -22,12 +23,13 @@ class SearchViewModel @Inject constructor( val state: StateFlow = _state.asStateFlow() private val _sideEffect: MutableSharedFlow = MutableSharedFlow() + val sideEffect = _sideEffect.asSharedFlow() init { getSearchViews() } - private fun getSearchViews() { + fun getSearchViews() { viewModelScope.launch { searchViewsRepository.getSearchViewsList().onSuccess { response -> val searchViewsList = response.map { entity -> From 0b3d0f331c982296a396d50c2e42c681811eae0e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 01:06:43 +0900 Subject: [PATCH 10/43] =?UTF-8?q?[FEAT/#72]=20Token=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/point/di/AuthInterceptor.kt | 4 ++ .../com/terning/point/di/DataStoreModule.kt | 18 ++++++- .../com/terning/point/di/RepositoryModule.kt | 10 ++-- .../terning/data/datasource/MockDataSource.kt | 7 --- .../data/datasourceimpl/MockDataSourceImpl.kt | 13 ----- .../data/dto/response/MockResponseDto.kt | 53 ------------------- .../data/local/TerningDataStoreImpl.kt | 29 +++++++++- .../data/repositoryimpl/MockRepositoryImpl.kt | 14 ----- .../repositoryimpl/TokenRepositoryImpl.kt | 20 ++++++- .../com/terning/data/service/MockService.kt | 12 ----- .../entity/response/MockResponseModel.kt | 8 --- .../domain/repository/MockRepository.kt | 7 --- .../onboarding/signin/SignInViewModel.kt | 9 ++-- 13 files changed, 78 insertions(+), 126 deletions(-) create mode 100644 app/src/main/java/com/terning/point/di/AuthInterceptor.kt delete mode 100644 data/src/main/java/com/terning/data/datasource/MockDataSource.kt delete mode 100644 data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt delete mode 100644 data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt delete mode 100644 data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt delete mode 100644 data/src/main/java/com/terning/data/service/MockService.kt delete mode 100644 domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt delete mode 100644 domain/src/main/java/com/terning/domain/repository/MockRepository.kt diff --git a/app/src/main/java/com/terning/point/di/AuthInterceptor.kt b/app/src/main/java/com/terning/point/di/AuthInterceptor.kt new file mode 100644 index 000000000..f51aebaef --- /dev/null +++ b/app/src/main/java/com/terning/point/di/AuthInterceptor.kt @@ -0,0 +1,4 @@ +package com.terning.point.di + +class AuthInterceptor { +} \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/DataStoreModule.kt b/app/src/main/java/com/terning/point/di/DataStoreModule.kt index d21d799e2..ca4b09d65 100644 --- a/app/src/main/java/com/terning/point/di/DataStoreModule.kt +++ b/app/src/main/java/com/terning/point/di/DataStoreModule.kt @@ -1,11 +1,27 @@ package com.terning.point.di +import android.content.Context +import android.content.SharedPreferences +import com.terning.data.local.TerningDataStore +import com.terning.data.local.TerningDataStoreImpl import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object DataStoreModule{ +object DataStoreModule { + @Provides + @Singleton + fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences = + context.getSharedPreferences(context.packageName, Context.MODE_PRIVATE) + + @Provides + @Singleton + fun provideTerningDataStore(dataStoreImpl: TerningDataStoreImpl): TerningDataStore = + dataStoreImpl } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index aba433004..d18703ccf 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,7 +1,9 @@ package com.terning.point.di import com.terning.data.repositoryimpl.AuthRepositoryImpl +import com.terning.data.repositoryimpl.TokenRepositoryImpl import com.terning.domain.repository.AuthRepository +import com.terning.domain.repository.TokenRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -15,8 +17,8 @@ abstract class RepositoryModule { @Binds @Singleton abstract fun bindAuthRepository(authRepositoryImpl: AuthRepositoryImpl): AuthRepository -// -// @Binds -// @Singleton -// abstract fun bindTokenRepository(tokenRepositoryImpl: TokenRepositoryImpl): TokenRepository + + @Binds + @Singleton + abstract fun bindTokenRepository(tokenRepositoryImpl: TokenRepositoryImpl): TokenRepository } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasource/MockDataSource.kt b/data/src/main/java/com/terning/data/datasource/MockDataSource.kt deleted file mode 100644 index a2f2674a0..000000000 --- a/data/src/main/java/com/terning/data/datasource/MockDataSource.kt +++ /dev/null @@ -1,7 +0,0 @@ -//package com.terning.data.datasource -// -//import com.terning.data.dto.response.MockResponseDto -// -//interface MockDataSource { -// suspend fun getMock(page: Int): MockResponseDto -//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt deleted file mode 100644 index 2dfa63612..000000000 --- a/data/src/main/java/com/terning/data/datasourceimpl/MockDataSourceImpl.kt +++ /dev/null @@ -1,13 +0,0 @@ -//package com.terning.data.datasourceimpl -// -//import com.terning.data.datasource.MockDataSource -//import com.terning.data.dto.response.MockResponseDto -//import com.terning.data.service.MockService -//import javax.inject.Inject -// -//class MockDataSourceImpl @Inject constructor( -// private val mockService: MockService -//) : MockDataSource { -// override suspend fun getMock(page: Int): MockResponseDto = -// mockService.getMockListFromServer(page) -//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt deleted file mode 100644 index e15d1c870..000000000 --- a/data/src/main/java/com/terning/data/dto/response/MockResponseDto.kt +++ /dev/null @@ -1,53 +0,0 @@ -//package com.terning.data.dto.response -// -//import com.terning.domain.entity.response.MockResponseModel -//import kotlinx.serialization.SerialName -//import kotlinx.serialization.Serializable -// -//@Serializable -//data class MockResponseDto( -// @SerialName("page") -// val page: Int, -// @SerialName("per_page") -// val per_page: Int, -// @SerialName("total") -// val total: Int, -// @SerialName("total_pages") -// val total_pages: Int, -// @SerialName("data") -// val data: List, -// @SerialName("support") -// val support: Support, -//) { -// @Serializable -// data class MockData( -// @SerialName("id") -// val id: Int, -// @SerialName("email") -// val email: String, -// @SerialName("first_name") -// val first_name: String, -// @SerialName("last_name") -// val last_name: String, -// @SerialName("avatar") -// val avatar: String -// ) -// -// @Serializable -// data class Support( -// @SerialName("url") -// val url: String, -// @SerialName("text") -// val text: String, -// ) -// -// fun toMockEntity(): List = data.map { -// MockResponseModel( -// avatar = it.avatar, -// email = it.email, -// firstName = it.first_name, -// lastName = it.last_name -// ) -// } -// -//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt b/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt index 6be7460ec..573cc8f27 100644 --- a/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt +++ b/data/src/main/java/com/terning/data/local/TerningDataStoreImpl.kt @@ -1,4 +1,31 @@ package com.terning.data.local -class TerningDataStoreImpl { +import android.content.SharedPreferences +import androidx.core.content.edit +import javax.inject.Inject + +class TerningDataStoreImpl @Inject constructor( + private val dataStore: SharedPreferences, +) : TerningDataStore { + override var accessToken: String + get() = dataStore.getString(ACCESS_TOKEN, "") ?: "" + set(value) = dataStore.edit { putString(ACCESS_TOKEN, value) } + + override var refreshToken: String + get() = dataStore.getString(REFRESH_TOKEN, "") ?: "" + set(value) = dataStore.edit { putString(REFRESH_TOKEN, value) } + + override var userId: Long + get() = dataStore.getLong(USER_ID, 0L) + set(value) = dataStore.edit { putLong(USER_ID, value) } + + override fun clearInfo() { + dataStore.edit().clear().commit() + } + + companion object { + private const val ACCESS_TOKEN = "ACCESS_TOKEN" + private const val REFRESH_TOKEN = "REFRESH_TOKEN" + private const val USER_ID = "USER_ID" + } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt deleted file mode 100644 index a160b75bf..000000000 --- a/data/src/main/java/com/terning/data/repositoryimpl/MockRepositoryImpl.kt +++ /dev/null @@ -1,14 +0,0 @@ -//package com.terning.data.repositoryimpl -// -//import com.terning.data.datasource.MockDataSource -//import com.terning.domain.entity.response.MockResponseModel -//import com.terning.domain.repository.MockRepository -//import javax.inject.Inject -// -//class MockRepositoryImpl @Inject constructor(private val mockDataSource: MockDataSource) : -// MockRepository { -// override suspend fun getMockList(page: Int): Result> = -// runCatching { -// mockDataSource.getMock(page).toMockEntity() -// } -//} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt index 9cd14cd8f..13b1a3031 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/TokenRepositoryImpl.kt @@ -1,9 +1,27 @@ package com.terning.data.repositoryimpl import com.terning.data.local.TerningDataStore +import com.terning.domain.repository.TokenRepository import javax.inject.Inject class TokenRepositoryImpl @Inject constructor( private val terningDataStore: TerningDataStore -) { +) : TokenRepository { + override fun getAccessToken(): String = terningDataStore.accessToken + + override fun getRefreshToken(): String = terningDataStore.refreshToken + + override fun setTokens(accessToken: String, refreshToken: String) { + terningDataStore.accessToken = accessToken + terningDataStore.refreshToken = refreshToken + } + + override fun setUserId(userId: Long) { + terningDataStore.userId = userId + } + + override fun clearInfo() { + terningDataStore.clearInfo() + } + } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/MockService.kt b/data/src/main/java/com/terning/data/service/MockService.kt deleted file mode 100644 index c2e4c3dfa..000000000 --- a/data/src/main/java/com/terning/data/service/MockService.kt +++ /dev/null @@ -1,12 +0,0 @@ -//package com.terning.data.service -// -//import com.terning.data.dto.response.MockResponseDto -//import retrofit2.http.GET -//import retrofit2.http.Query -// -//interface MockService { -// @GET("api/users") -// suspend fun getMockListFromServer( -// @Query("page") page: Int, -// ): MockResponseDto -//} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt deleted file mode 100644 index a8f46254d..000000000 --- a/domain/src/main/java/com/terning/domain/entity/response/MockResponseModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -//package com.terning.domain.entity.response -// -//data class MockResponseModel( -// val avatar: String, -// val email: String, -// val firstName: String, -// val lastName: String, -//) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/MockRepository.kt b/domain/src/main/java/com/terning/domain/repository/MockRepository.kt deleted file mode 100644 index a7d2ac173..000000000 --- a/domain/src/main/java/com/terning/domain/repository/MockRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -//package com.terning.domain.repository -// -//import com.terning.domain.entity.response.MockResponseModel -// -//interface MockRepository { -// suspend fun getMockList(page: Int): Result> -//} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 4df9219dd..7ecbd767d 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -1,7 +1,6 @@ package com.terning.feature.onboarding.signin import android.content.Context -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.sdk.auth.model.OAuthToken @@ -25,7 +24,7 @@ import javax.inject.Inject @HiltViewModel class SignInViewModel @Inject constructor( private val authRepository: AuthRepository, - // private val tokenRepository: TokenRepository + private val tokenRepository: TokenRepository ) : ViewModel() { private val _signInState = MutableStateFlow(SignInState()) @@ -83,13 +82,13 @@ class SignInViewModel @Inject constructor( platform: String = KAKAO ) { viewModelScope.launch { - Log.d("LYB", accessToken.toString()) + // Log.d("LYB", accessToken.toString()) authRepository.postSignIn( accessToken, SignInRequestModel(platform) ).onSuccess { response -> -// tokenRepository.setTokens(response.accessToken, response.refreshToken) -// tokenRepository.setUserId(response.userId) + tokenRepository.setTokens(response.accessToken, response.refreshToken) + tokenRepository.setUserId(response.userId) if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) From 37568729017c3abca9a0b6e911c337ca22882ff5 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 01:09:42 +0900 Subject: [PATCH 11/43] =?UTF-8?q?[FEAT/#79]=20=EC=9D=B8=ED=84=B4=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=97=90=20searchViewsList?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/search/search/SearchRoute.kt | 10 +++++-- .../search/search/component/SearchIntern.kt | 27 ++++++++++++------- .../search/component/SearchInternList.kt | 8 ++++-- feature/src/main/res/values/strings.xml | 1 + 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 20ab506b2..d024b6f42 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -127,13 +127,19 @@ fun SearchScreen( color = Black ) - SearchInternList(type = InternListType.VIEW) + SearchInternList( + type = InternListType.VIEW, + searchViewsList = searchViewsList + ) HorizontalDivider( thickness = 4.dp, modifier = Modifier.padding(vertical = 8.dp), color = Grey100, ) - SearchInternList(type = InternListType.SCRAP) + SearchInternList( + type = InternListType.SCRAP, + searchViewsList = searchViewsList + ) } } } diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index e2b6109f5..1101ce7b6 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -1,6 +1,5 @@ package com.terning.feature.search.search.component -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -13,17 +12,23 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import coil.request.ImageRequest import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R @Composable -fun SearchIntern() { +fun SearchIntern( + searchViews: SearchViewsResponseModel, +) { Column( verticalArrangement = Arrangement.spacedBy( 10.dp, @@ -43,16 +48,20 @@ fun SearchIntern() { ) .padding(vertical = 8.dp) ) { - Image( - painter = painterResource(id = R.drawable.ic_nav_search), - contentDescription = null, + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(searchViews.companyImage) + .crossfade(true) + .build(), + contentDescription = stringResource(id = R.string.search_image), modifier = Modifier .fillMaxWidth() .padding(16.dp) - .background(Grey400) - ) + .background(Grey400), + + ) Text( - text = "[유한킴벌리]\n그린캠프 w. 대학생 숲 \n활동가 모집", + text = searchViews.title, modifier = Modifier.padding(horizontal = 8.dp), style = TerningTheme.typography.body6, color = Black, diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt index 0060685c0..3a03eaac7 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt @@ -11,11 +11,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R @Composable fun SearchInternList( type: InternListType, + searchViewsList: List, ) { Column(modifier = Modifier.padding(horizontal = 24.dp)) { Text( @@ -33,8 +35,10 @@ fun SearchInternList( modifier = Modifier.padding(vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(12.dp), ) { - items(5) { - SearchIntern() + items(searchViewsList.size) { index -> + SearchIntern( + searchViews = searchViewsList[index] + ) } } } diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index d89353a51..b70bd83d7 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -31,6 +31,7 @@ 관심있는 인턴 공고 키워드를 검색해 보세요 요즘 대학생들에게 인기 있는 공고 지금 조회수가 많은 공고들이에요 + 공고 이미지 지금 스크랩수가 많은 공고들이에요 From 334658a4ef0b7ed3768d89365a3950b5b84c0682 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 01:10:32 +0900 Subject: [PATCH 12/43] =?UTF-8?q?[FEAT/#72]=20BASE=5FURL=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/terning/point/di/RetrofitModule.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/terning/point/di/RetrofitModule.kt b/app/src/main/java/com/terning/point/di/RetrofitModule.kt index d605f0245..c5840f081 100644 --- a/app/src/main/java/com/terning/point/di/RetrofitModule.kt +++ b/app/src/main/java/com/terning/point/di/RetrofitModule.kt @@ -2,7 +2,7 @@ package com.terning.point.di import com.terning.core.extension.isJsonArray import com.terning.core.extension.isJsonObject -import com.terning.point.BuildConfig +import com.terning.point.BuildConfig.BASE_URL import com.terning.point.di.qualifier.JWT import dagger.Module import dagger.Provides @@ -70,7 +70,7 @@ object RetrofitModule { client: OkHttpClient, factory: Converter.Factory ): Retrofit = Retrofit.Builder() - .baseUrl(BuildConfig.BASE_URL) + .baseUrl(BASE_URL) .addConverterFactory(factory) .client(client) .build() From 87546c699a7476061ab043778e6aa1c23763d4b7 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 01:12:56 +0900 Subject: [PATCH 13/43] =?UTF-8?q?[CHORE/#72]=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20data=20->=20request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/data/repositoryimpl/AuthRepositoryImpl.kt | 4 ++-- .../main/java/com/terning/domain/repository/AuthRepository.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt index 5248b6bad..f5b5c1df7 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/AuthRepositoryImpl.kt @@ -12,11 +12,11 @@ class AuthRepositoryImpl @Inject constructor( ) : AuthRepository { override suspend fun postSignIn( authorization: String, - signInRequestModel: SignInRequestModel + request: SignInRequestModel ): Result = kotlin.runCatching { authDataSource.postSignIn( authorization, - signInRequestModel.toSignInRequestDto() + request.toSignInRequestDto() ).result.toSignInModel() } } \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt b/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt index 49a77c6a9..7176db213 100644 --- a/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/AuthRepository.kt @@ -6,6 +6,6 @@ import com.terning.domain.entity.response.SignInResponseModel interface AuthRepository { suspend fun postSignIn( authorization: String, - data: SignInRequestModel + request: SignInRequestModel ): Result } \ No newline at end of file From 396e4f74390e5e9bb9126a2424765ee0dc6b551a Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 01:27:02 +0900 Subject: [PATCH 14/43] =?UTF-8?q?[FEAT/#79]=20=EB=8D=94=EB=AF=B8=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchViewsDataSourceImpl.kt | 22 +++++++++++++++++-- .../dto/response/SearchViewsResponseDto.kt | 2 +- .../SearchViewsRepositoryImpl.kt | 2 +- .../com/terning/data/service/SearchService.kt | 22 ++++++++++++++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt index 075e657bf..e20473fbd 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -8,6 +8,24 @@ import javax.inject.Inject class SearchViewsDataSourceImpl @Inject constructor( private val searchService: SearchService ): SearchViewsDataSource { - override suspend fun getSearchViews(): SearchViewsResponseDto = - searchService.getSearchViewsList() + override suspend fun getSearchViews(): SearchViewsResponseDto { + return SearchViewsResponseDto( + status = 200, + message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", + result = SearchViewsResponseDto.Result( + accountments = listOf( + SearchViewsResponseDto.SearchViewsData( + internshipAnnouncementId = 23L, + companyImage = "https://www.google.co.kr/url?sa=i&url=https%3A%2F%2Fm.blog.naver.com%2F41minit%2F222640892626&psig=AOvVaw37hxkUffP2inv54ayG_I3K&ust=1721147168119000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCMjD_f66qYcDFQAAAAAdAAAAABAE", + title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" + ), + SearchViewsResponseDto.SearchViewsData( + internshipAnnouncementId = 3L, + companyImage = "https://www.google.co.kr/url?sa=i&url=https%3A%2F%2Fm.blog.naver.com%2F41minit%2F222640892626&psig=AOvVaw37hxkUffP2inv54ayG_I3K&ust=1721147168119000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCMjD_f66qYcDFQAAAAAdAAAAABAE", + title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" + ) + ) + ) + ) + } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index 38ee2544f..e21a39387 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -29,7 +29,7 @@ data class SearchViewsResponseDto( val title: String, ) - fun toMockEntity(): List = result.accountments.map { + fun toSearchViewsEntity(): List = result.accountments.map { SearchViewsResponseModel( title = it.title, companyImage = it.companyImage, diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 73e5b99a5..24110f2bd 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -10,6 +10,6 @@ class SearchViewsRepositoryImpl @Inject constructor( ) : SearchViewsRepository { override suspend fun getSearchViewsList(): Result> = runCatching { - searchViewsDataSource.getSearchViews().toMockEntity() + searchViewsDataSource.getSearchViews().toSearchViewsEntity() } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt index bfdddc887..b4a38f501 100644 --- a/data/src/main/java/com/terning/data/service/SearchService.kt +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -5,5 +5,25 @@ import retrofit2.http.GET interface SearchService { @GET("api/v1/search/views") - suspend fun getSearchViewsList(): SearchViewsResponseDto + suspend fun getSearchViewsList(): SearchViewsResponseDto { + return SearchViewsResponseDto( + status = 200, + message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", + result = SearchViewsResponseDto.Result( + accountments = listOf( + SearchViewsResponseDto.SearchViewsData( + internshipAnnouncementId = 23, + companyImage = "https://example.com/image1.jpg", + title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" + ), + SearchViewsResponseDto.SearchViewsData( + internshipAnnouncementId = 3, + companyImage = "https://example.com/image2.jpg", + title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" + ) + ) + ) + ) + } + } \ No newline at end of file From b5bb2cdebdc5ce4a83de5a4539f54f1662ec8f1a Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 01:53:51 +0900 Subject: [PATCH 15/43] =?UTF-8?q?[FEAT/#79]=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchViewsDataSourceImpl.kt | 4 +- .../search/search/component/SearchIntern.kt | 38 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt index e20473fbd..ff92130ac 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -16,12 +16,12 @@ class SearchViewsDataSourceImpl @Inject constructor( accountments = listOf( SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 23L, - companyImage = "https://www.google.co.kr/url?sa=i&url=https%3A%2F%2Fm.blog.naver.com%2F41minit%2F222640892626&psig=AOvVaw37hxkUffP2inv54ayG_I3K&ust=1721147168119000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCMjD_f66qYcDFQAAAAAdAAAAABAE", + companyImage = "https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" ), SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 3L, - companyImage = "https://www.google.co.kr/url?sa=i&url=https%3A%2F%2Fm.blog.naver.com%2F41minit%2F222640892626&psig=AOvVaw37hxkUffP2inv54ayG_I3K&ust=1721147168119000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCMjD_f66qYcDFQAAAAAdAAAAABAE", + companyImage = "https://https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" ) ) diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index 1101ce7b6..8c9c45462 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -3,15 +3,17 @@ package com.terning.feature.search.search.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.shadow -import androidx.compose.ui.graphics.Color +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow @@ -19,9 +21,9 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import coil.request.ImageRequest import com.terning.core.designsystem.theme.Black -import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White +import com.terning.core.extension.customShadow import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R @@ -36,12 +38,7 @@ fun SearchIntern( ), horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .shadow( - elevation = 4.dp, - // TODO 효빈 그림자 PR 풀 받아서 바꾸기 - spotColor = Color(0x26DDDDDD), - ambientColor = Color(0x26DDDDDD) - ) + .width(140.dp) .background( color = White, shape = RoundedCornerShape(size = 5.dp) @@ -54,15 +51,22 @@ fun SearchIntern( .crossfade(true) .build(), contentDescription = stringResource(id = R.string.search_image), + contentScale = ContentScale.Crop, modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .background(Grey400), - - ) + .height(76.dp) + .wrapContentSize() + .clip( + RoundedCornerShape( + topStart = 5.dp, + topEnd = 5.dp + ) + ) + ) Text( - text = searchViews.title, - modifier = Modifier.padding(horizontal = 8.dp), + text = "${searchViews.title} ${searchViews.title}${searchViews.title}${searchViews.title}", + modifier = Modifier + .padding(horizontal = 8.dp) + .wrapContentSize(), style = TerningTheme.typography.body6, color = Black, overflow = TextOverflow.Ellipsis, From 4dad80422fedc9c2001caa3087f741405cbcb604 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 02:01:46 +0900 Subject: [PATCH 16/43] =?UTF-8?q?[FEAT/#79]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/terning/feature/intern/InternRoute.kt | 4 +++- .../java/com/terning/feature/search/search/SearchRoute.kt | 6 ++++-- .../feature/search/search/component/SearchIntern.kt | 8 +++++++- .../feature/search/search/component/SearchInternList.kt | 5 ++++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index 198943c7a..8a035648a 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -71,7 +71,9 @@ fun InternScreen( color = Grey200, offsetY = 2.dp ), - onBackButtonClick = {}, + onBackButtonClick = { + navController.navigateUp() + }, ) }, bottomBar = { diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index d024b6f42..9b3784b25 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -129,7 +129,8 @@ fun SearchScreen( SearchInternList( type = InternListType.VIEW, - searchViewsList = searchViewsList + searchViewsList = searchViewsList, + navController = navController ) HorizontalDivider( thickness = 4.dp, @@ -138,7 +139,8 @@ fun SearchScreen( ) SearchInternList( type = InternListType.SCRAP, - searchViewsList = searchViewsList + searchViewsList = searchViewsList, + navController = navController ) } } diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index 8c9c45462..f192453f4 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -18,18 +18,21 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController import coil.compose.AsyncImage import coil.request.ImageRequest import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White -import com.terning.core.extension.customShadow +import com.terning.core.extension.noRippleClickable import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R +import com.terning.feature.intern.navigation.navigateIntern @Composable fun SearchIntern( searchViews: SearchViewsResponseModel, + navController: NavHostController, ) { Column( verticalArrangement = Arrangement.spacedBy( @@ -44,6 +47,9 @@ fun SearchIntern( shape = RoundedCornerShape(size = 5.dp) ) .padding(vertical = 8.dp) + .noRippleClickable { + navController.navigateIntern() + } ) { AsyncImage( model = ImageRequest.Builder(LocalContext.current) diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt index 3a03eaac7..e76f9f3b0 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.domain.entity.response.SearchViewsResponseModel @@ -18,6 +19,7 @@ import com.terning.feature.R fun SearchInternList( type: InternListType, searchViewsList: List, + navController: NavHostController ) { Column(modifier = Modifier.padding(horizontal = 24.dp)) { Text( @@ -37,7 +39,8 @@ fun SearchInternList( ) { items(searchViewsList.size) { index -> SearchIntern( - searchViews = searchViewsList[index] + searchViews = searchViewsList[index], + navController = navController ) } } From 572efd4fc34c18aa2429522c61080f98f87ea219 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 02:14:14 +0900 Subject: [PATCH 17/43] =?UTF-8?q?[RENAME/#79]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20DTO=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/data/datasource/SearchViewsDataSource.kt | 4 ++-- .../data/datasourceimpl/SearchViewsDataSourceImpl.kt | 12 ++++++------ ...sponseDto.kt => InternAnnouncementResponseDto.kt} | 12 ++++++------ .../data/repositoryimpl/SearchViewsRepositoryImpl.kt | 6 +++--- .../java/com/terning/data/service/SearchService.kt | 12 ++++++------ ...seModel.kt => InternAnnouncementResponseModel.kt} | 2 +- .../domain/repository/SearchViewsRepository.kt | 4 ++-- .../com/terning/feature/search/search/SearchRoute.kt | 6 +++--- .../terning/feature/search/search/SearchViewModel.kt | 4 ++-- .../feature/search/search/SearchViewsState.kt | 4 ++-- .../feature/search/search/component/SearchIntern.kt | 4 ++-- .../search/search/component/SearchInternList.kt | 4 ++-- 12 files changed, 37 insertions(+), 37 deletions(-) rename data/src/main/java/com/terning/data/dto/response/{SearchViewsResponseDto.kt => InternAnnouncementResponseDto.kt} (68%) rename domain/src/main/java/com/terning/domain/entity/response/{SearchViewsResponseModel.kt => InternAnnouncementResponseModel.kt} (74%) diff --git a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt index 727cf9671..139c5d971 100644 --- a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt @@ -1,7 +1,7 @@ package com.terning.data.datasource -import com.terning.data.dto.response.SearchViewsResponseDto +import com.terning.data.dto.response.InternAnnouncementResponseDto interface SearchViewsDataSource { - suspend fun getSearchViews(): SearchViewsResponseDto + suspend fun getSearchViews(): InternAnnouncementResponseDto } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt index ff92130ac..26c00e999 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -1,25 +1,25 @@ package com.terning.data.datasourceimpl import com.terning.data.datasource.SearchViewsDataSource -import com.terning.data.dto.response.SearchViewsResponseDto +import com.terning.data.dto.response.InternAnnouncementResponseDto import com.terning.data.service.SearchService import javax.inject.Inject class SearchViewsDataSourceImpl @Inject constructor( private val searchService: SearchService ): SearchViewsDataSource { - override suspend fun getSearchViews(): SearchViewsResponseDto { - return SearchViewsResponseDto( + override suspend fun getSearchViews(): InternAnnouncementResponseDto { + return InternAnnouncementResponseDto( status = 200, message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = SearchViewsResponseDto.Result( + result = InternAnnouncementResponseDto.Result( accountments = listOf( - SearchViewsResponseDto.SearchViewsData( + InternAnnouncementResponseDto.InternAnnouncementData( internshipAnnouncementId = 23L, companyImage = "https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" ), - SearchViewsResponseDto.SearchViewsData( + InternAnnouncementResponseDto.InternAnnouncementData( internshipAnnouncementId = 3L, companyImage = "https://https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt similarity index 68% rename from data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt rename to data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt index e21a39387..8830fc32d 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt @@ -1,11 +1,11 @@ package com.terning.data.dto.response -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class SearchViewsResponseDto( +data class InternAnnouncementResponseDto( @SerialName("status") val status: Int, @SerialName("message") @@ -16,11 +16,11 @@ data class SearchViewsResponseDto( @Serializable data class Result( @SerialName("accountments") - val accountments: List, + val accountments: List, ) @Serializable - data class SearchViewsData( + data class InternAnnouncementData( @SerialName("internshipAnnouncementId") val internshipAnnouncementId: Long, @SerialName("companyImage") @@ -29,8 +29,8 @@ data class SearchViewsResponseDto( val title: String, ) - fun toSearchViewsEntity(): List = result.accountments.map { - SearchViewsResponseModel( + fun toInternAnnouncementEntity(): List = result.accountments.map { + InternAnnouncementResponseModel( title = it.title, companyImage = it.companyImage, announcementId = it.internshipAnnouncementId diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 24110f2bd..8036b4b79 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -1,15 +1,15 @@ package com.terning.data.repositoryimpl import com.terning.data.datasource.SearchViewsDataSource -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import com.terning.domain.repository.SearchViewsRepository import javax.inject.Inject class SearchViewsRepositoryImpl @Inject constructor( private val searchViewsDataSource: SearchViewsDataSource, ) : SearchViewsRepository { - override suspend fun getSearchViewsList(): Result> = + override suspend fun getSearchViewsList(): Result> = runCatching { - searchViewsDataSource.getSearchViews().toSearchViewsEntity() + searchViewsDataSource.getSearchViews().toInternAnnouncementEntity() } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt index b4a38f501..2282ac28f 100644 --- a/data/src/main/java/com/terning/data/service/SearchService.kt +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -1,22 +1,22 @@ package com.terning.data.service -import com.terning.data.dto.response.SearchViewsResponseDto +import com.terning.data.dto.response.InternAnnouncementResponseDto import retrofit2.http.GET interface SearchService { @GET("api/v1/search/views") - suspend fun getSearchViewsList(): SearchViewsResponseDto { - return SearchViewsResponseDto( + suspend fun getSearchViewsList(): InternAnnouncementResponseDto { + return InternAnnouncementResponseDto( status = 200, message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = SearchViewsResponseDto.Result( + result = InternAnnouncementResponseDto.Result( accountments = listOf( - SearchViewsResponseDto.SearchViewsData( + InternAnnouncementResponseDto.InternAnnouncementData( internshipAnnouncementId = 23, companyImage = "https://example.com/image1.jpg", title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" ), - SearchViewsResponseDto.SearchViewsData( + InternAnnouncementResponseDto.InternAnnouncementData( internshipAnnouncementId = 3, companyImage = "https://example.com/image2.jpg", title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" diff --git a/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt similarity index 74% rename from domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt rename to domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt index 0877ecf4a..f20adf48d 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt @@ -1,6 +1,6 @@ package com.terning.domain.entity.response -data class SearchViewsResponseModel( +data class InternAnnouncementResponseModel( val title: String, val companyImage: String, val announcementId: Long, diff --git a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt index 3e64e61a0..0a1d00237 100644 --- a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt @@ -1,7 +1,7 @@ package com.terning.domain.repository -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel interface SearchViewsRepository { - suspend fun getSearchViewsList(): Result> + suspend fun getSearchViewsList(): Result> } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 9b3784b25..93c3c5fda 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -27,7 +27,7 @@ import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import com.terning.feature.R import com.terning.feature.search.search.component.ImageSlider import com.terning.feature.search.search.component.InternListType @@ -63,7 +63,7 @@ fun SearchRoute( is UiState.Success -> { SearchScreen( navController = navController, - searchViewsList = (state.searchViewsList as UiState.Success>).data + searchViewsList = (state.searchViewsList as UiState.Success>).data ) } @@ -74,7 +74,7 @@ fun SearchRoute( fun SearchScreen( modifier: Modifier = Modifier, navController: NavHostController, - searchViewsList: List, + searchViewsList: List, ) { val images = listOf( R.drawable.ic_nav_search, diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt index d55431d8c..fa528ce90 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -3,7 +3,7 @@ package com.terning.feature.search.search import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import com.terning.domain.repository.SearchViewsRepository import com.terning.feature.R import dagger.hilt.android.lifecycle.HiltViewModel @@ -33,7 +33,7 @@ class SearchViewModel @Inject constructor( viewModelScope.launch { searchViewsRepository.getSearchViewsList().onSuccess { response -> val searchViewsList = response.map { entity -> - SearchViewsResponseModel( + InternAnnouncementResponseModel( title = entity.title, companyImage = entity.companyImage, announcementId = entity.announcementId diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt index 93e2a9b5a..543a107fe 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt @@ -1,8 +1,8 @@ package com.terning.feature.search.search import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel data class SearchViewsState( - var searchViewsList: UiState> = UiState.Loading, + var searchViewsList: UiState> = UiState.Loading, ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index f192453f4..44a60c298 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -25,13 +25,13 @@ import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.noRippleClickable -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import com.terning.feature.R import com.terning.feature.intern.navigation.navigateIntern @Composable fun SearchIntern( - searchViews: SearchViewsResponseModel, + searchViews: InternAnnouncementResponseModel, navController: NavHostController, ) { Column( diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt index e76f9f3b0..f8eecdea6 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternAnnouncementResponseModel import com.terning.feature.R @Composable fun SearchInternList( type: InternListType, - searchViewsList: List, + searchViewsList: List, navController: NavHostController ) { Column(modifier = Modifier.padding(horizontal = 24.dp)) { From 2f21b38c7dd9db2640479c4042e4e03cccf5865f Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 02:39:23 +0900 Subject: [PATCH 18/43] =?UTF-8?q?[CHORE/#72]=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/onboarding/signin/SignInViewModel.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 7ecbd767d..09175b768 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -27,6 +27,10 @@ class SignInViewModel @Inject constructor( private val tokenRepository: TokenRepository ) : ViewModel() { + init { + tokenRepository.clearInfo() + } + private val _signInState = MutableStateFlow(SignInState()) val signInState: StateFlow get() = _signInState.asStateFlow() @@ -82,7 +86,6 @@ class SignInViewModel @Inject constructor( platform: String = KAKAO ) { viewModelScope.launch { - // Log.d("LYB", accessToken.toString()) authRepository.postSignIn( accessToken, SignInRequestModel(platform) @@ -91,7 +94,7 @@ class SignInViewModel @Inject constructor( tokenRepository.setUserId(response.userId) if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) - else _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + else _signInSideEffects.emit(SignInSideEffect.NavigateToHome) }.onFailure { _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) } From 4e528547982488629b741387522155a9fbf818fd Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 03:07:29 +0900 Subject: [PATCH 19/43] =?UTF-8?q?[CHORE/#72]=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/terning/point/di/AuthInterceptor.kt | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 app/src/main/java/com/terning/point/di/AuthInterceptor.kt diff --git a/app/src/main/java/com/terning/point/di/AuthInterceptor.kt b/app/src/main/java/com/terning/point/di/AuthInterceptor.kt deleted file mode 100644 index f51aebaef..000000000 --- a/app/src/main/java/com/terning/point/di/AuthInterceptor.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.terning.point.di - -class AuthInterceptor { -} \ No newline at end of file From 3375f8d37d46fdd3f1c92f98d6d6dcdceb9e401a Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 03:40:59 +0900 Subject: [PATCH 20/43] =?UTF-8?q?[RENAME/#79]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20DTO=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/SearchViewsDataSource.kt | 4 ++-- .../SearchViewsDataSourceImpl.kt | 12 +++++----- ...sponseDto.kt => SearchViewsResponseDto.kt} | 23 ++++++++++--------- .../SearchViewsRepositoryImpl.kt | 6 ++--- .../com/terning/data/service/SearchService.kt | 12 +++++----- ...seModel.kt => SearchViewsResponseModel.kt} | 2 +- .../repository/SearchViewsRepository.kt | 4 ++-- .../feature/search/search/SearchRoute.kt | 6 ++--- .../feature/search/search/SearchViewModel.kt | 4 ++-- .../feature/search/search/SearchViewsState.kt | 4 ++-- .../search/search/component/SearchIntern.kt | 4 ++-- .../search/component/SearchInternList.kt | 4 ++-- 12 files changed, 43 insertions(+), 42 deletions(-) rename data/src/main/java/com/terning/data/dto/response/{InternAnnouncementResponseDto.kt => SearchViewsResponseDto.kt} (55%) rename domain/src/main/java/com/terning/domain/entity/response/{InternAnnouncementResponseModel.kt => SearchViewsResponseModel.kt} (74%) diff --git a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt index 139c5d971..727cf9671 100644 --- a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt @@ -1,7 +1,7 @@ package com.terning.data.datasource -import com.terning.data.dto.response.InternAnnouncementResponseDto +import com.terning.data.dto.response.SearchViewsResponseDto interface SearchViewsDataSource { - suspend fun getSearchViews(): InternAnnouncementResponseDto + suspend fun getSearchViews(): SearchViewsResponseDto } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt index 26c00e999..ff92130ac 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -1,25 +1,25 @@ package com.terning.data.datasourceimpl import com.terning.data.datasource.SearchViewsDataSource -import com.terning.data.dto.response.InternAnnouncementResponseDto +import com.terning.data.dto.response.SearchViewsResponseDto import com.terning.data.service.SearchService import javax.inject.Inject class SearchViewsDataSourceImpl @Inject constructor( private val searchService: SearchService ): SearchViewsDataSource { - override suspend fun getSearchViews(): InternAnnouncementResponseDto { - return InternAnnouncementResponseDto( + override suspend fun getSearchViews(): SearchViewsResponseDto { + return SearchViewsResponseDto( status = 200, message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = InternAnnouncementResponseDto.Result( + result = SearchViewsResponseDto.Result( accountments = listOf( - InternAnnouncementResponseDto.InternAnnouncementData( + SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 23L, companyImage = "https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" ), - InternAnnouncementResponseDto.InternAnnouncementData( + SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 3L, companyImage = "https://https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" diff --git a/data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt similarity index 55% rename from data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt rename to data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index 8830fc32d..061070b0f 100644 --- a/data/src/main/java/com/terning/data/dto/response/InternAnnouncementResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -1,11 +1,11 @@ package com.terning.data.dto.response -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class InternAnnouncementResponseDto( +data class SearchViewsResponseDto( @SerialName("status") val status: Int, @SerialName("message") @@ -16,11 +16,11 @@ data class InternAnnouncementResponseDto( @Serializable data class Result( @SerialName("accountments") - val accountments: List, + val accountments: List, ) @Serializable - data class InternAnnouncementData( + data class SearchViewsData( @SerialName("internshipAnnouncementId") val internshipAnnouncementId: Long, @SerialName("companyImage") @@ -29,11 +29,12 @@ data class InternAnnouncementResponseDto( val title: String, ) - fun toInternAnnouncementEntity(): List = result.accountments.map { - InternAnnouncementResponseModel( - title = it.title, - companyImage = it.companyImage, - announcementId = it.internshipAnnouncementId - ) - } + fun toSearchViewsEntity(): List = + result.accountments.map { + SearchViewsResponseModel( + title = it.title, + companyImage = it.companyImage, + announcementId = it.internshipAnnouncementId + ) + } } diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 8036b4b79..24110f2bd 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -1,15 +1,15 @@ package com.terning.data.repositoryimpl import com.terning.data.datasource.SearchViewsDataSource -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.domain.repository.SearchViewsRepository import javax.inject.Inject class SearchViewsRepositoryImpl @Inject constructor( private val searchViewsDataSource: SearchViewsDataSource, ) : SearchViewsRepository { - override suspend fun getSearchViewsList(): Result> = + override suspend fun getSearchViewsList(): Result> = runCatching { - searchViewsDataSource.getSearchViews().toInternAnnouncementEntity() + searchViewsDataSource.getSearchViews().toSearchViewsEntity() } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt index 2282ac28f..b4a38f501 100644 --- a/data/src/main/java/com/terning/data/service/SearchService.kt +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -1,22 +1,22 @@ package com.terning.data.service -import com.terning.data.dto.response.InternAnnouncementResponseDto +import com.terning.data.dto.response.SearchViewsResponseDto import retrofit2.http.GET interface SearchService { @GET("api/v1/search/views") - suspend fun getSearchViewsList(): InternAnnouncementResponseDto { - return InternAnnouncementResponseDto( + suspend fun getSearchViewsList(): SearchViewsResponseDto { + return SearchViewsResponseDto( status = 200, message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = InternAnnouncementResponseDto.Result( + result = SearchViewsResponseDto.Result( accountments = listOf( - InternAnnouncementResponseDto.InternAnnouncementData( + SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 23, companyImage = "https://example.com/image1.jpg", title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" ), - InternAnnouncementResponseDto.InternAnnouncementData( + SearchViewsResponseDto.SearchViewsData( internshipAnnouncementId = 3, companyImage = "https://example.com/image2.jpg", title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" diff --git a/domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt similarity index 74% rename from domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt rename to domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt index f20adf48d..0877ecf4a 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/InternAnnouncementResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt @@ -1,6 +1,6 @@ package com.terning.domain.entity.response -data class InternAnnouncementResponseModel( +data class SearchViewsResponseModel( val title: String, val companyImage: String, val announcementId: Long, diff --git a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt index 0a1d00237..3e64e61a0 100644 --- a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt @@ -1,7 +1,7 @@ package com.terning.domain.repository -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel interface SearchViewsRepository { - suspend fun getSearchViewsList(): Result> + suspend fun getSearchViewsList(): Result> } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 93c3c5fda..9b3784b25 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -27,7 +27,7 @@ import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable import com.terning.core.state.UiState -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R import com.terning.feature.search.search.component.ImageSlider import com.terning.feature.search.search.component.InternListType @@ -63,7 +63,7 @@ fun SearchRoute( is UiState.Success -> { SearchScreen( navController = navController, - searchViewsList = (state.searchViewsList as UiState.Success>).data + searchViewsList = (state.searchViewsList as UiState.Success>).data ) } @@ -74,7 +74,7 @@ fun SearchRoute( fun SearchScreen( modifier: Modifier = Modifier, navController: NavHostController, - searchViewsList: List, + searchViewsList: List, ) { val images = listOf( R.drawable.ic_nav_search, diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt index fa528ce90..d55431d8c 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -3,7 +3,7 @@ package com.terning.feature.search.search import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.domain.repository.SearchViewsRepository import com.terning.feature.R import dagger.hilt.android.lifecycle.HiltViewModel @@ -33,7 +33,7 @@ class SearchViewModel @Inject constructor( viewModelScope.launch { searchViewsRepository.getSearchViewsList().onSuccess { response -> val searchViewsList = response.map { entity -> - InternAnnouncementResponseModel( + SearchViewsResponseModel( title = entity.title, companyImage = entity.companyImage, announcementId = entity.announcementId diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt index 543a107fe..93e2a9b5a 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt @@ -1,8 +1,8 @@ package com.terning.feature.search.search import com.terning.core.state.UiState -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel data class SearchViewsState( - var searchViewsList: UiState> = UiState.Loading, + var searchViewsList: UiState> = UiState.Loading, ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index 44a60c298..f192453f4 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -25,13 +25,13 @@ import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.noRippleClickable -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R import com.terning.feature.intern.navigation.navigateIntern @Composable fun SearchIntern( - searchViews: InternAnnouncementResponseModel, + searchViews: SearchViewsResponseModel, navController: NavHostController, ) { Column( diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt index f8eecdea6..e76f9f3b0 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme -import com.terning.domain.entity.response.InternAnnouncementResponseModel +import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R @Composable fun SearchInternList( type: InternListType, - searchViewsList: List, + searchViewsList: List, navController: NavHostController ) { Column(modifier = Modifier.padding(horizontal = 24.dp)) { From a939cffff6e04ceae7ee596876494aab4008ad16 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 04:36:46 +0900 Subject: [PATCH 21/43] =?UTF-8?q?[FEAT/#79]=20=EB=B9=88=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/textfield/TerningBasicTextField.kt | 8 +++++--- .../feature/search/search/component/SearchIntern.kt | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt index 5fcea5394..d9526c2f8 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt @@ -68,9 +68,11 @@ fun TerningBasicTextField( keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions( onDone = { - keyboardController?.hide() - focusManager.clearFocus() - onDoneAction?.invoke() + if (value.isNotEmpty() && value.isNotBlank()) { + keyboardController?.hide() + focusManager.clearFocus() + onDoneAction?.invoke() + } } ), diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index f192453f4..c1265dedd 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -24,6 +24,7 @@ import coil.request.ImageRequest import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White +import com.terning.core.extension.customShadow import com.terning.core.extension.noRippleClickable import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.feature.R @@ -60,6 +61,7 @@ fun SearchIntern( contentScale = ContentScale.Crop, modifier = Modifier .height(76.dp) + .customShadow(offsetY = 3.dp) .wrapContentSize() .clip( RoundedCornerShape( @@ -68,6 +70,7 @@ fun SearchIntern( ) ) ) + Text( text = "${searchViews.title} ${searchViews.title}${searchViews.title}${searchViews.title}", modifier = Modifier From f0debfcce1395904e730f34ce65a441bc06f35d5 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Tue, 16 Jul 2024 05:16:17 +0900 Subject: [PATCH 22/43] =?UTF-8?q?[CHORE/#72]=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/response/SignInResponseModel.kt | 4 ++-- .../onboarding/signin/SignInViewModel.kt | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt index 558aaf19e..4ffe25fa8 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/SignInResponseModel.kt @@ -1,8 +1,8 @@ package com.terning.domain.entity.response data class SignInResponseModel( - val accessToken : String, - val refreshToken : String, + val accessToken : String? , + val refreshToken : String?, val userId : Long, val authType: String ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index 09175b768..bf86e8391 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -7,6 +7,7 @@ import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.common.model.ClientError import com.kakao.sdk.common.model.ClientErrorCause import com.kakao.sdk.user.UserApiClient +import com.terning.core.state.UiState import com.terning.domain.entity.request.SignInRequestModel import com.terning.domain.repository.AuthRepository import com.terning.domain.repository.TokenRepository @@ -90,12 +91,21 @@ class SignInViewModel @Inject constructor( accessToken, SignInRequestModel(platform) ).onSuccess { response -> - tokenRepository.setTokens(response.accessToken, response.refreshToken) - tokenRepository.setUserId(response.userId) + when { + response.accessToken == null -> _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) - if (response.accessToken == null) _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) - else _signInSideEffects.emit(SignInSideEffect.NavigateToHome) + else -> { + tokenRepository.setTokens( + response.accessToken ?: return@launch, + response.refreshToken ?: return@onSuccess + ) + tokenRepository.setUserId(response.userId) + + _signInSideEffects.emit(SignInSideEffect.NavigateToHome) + } + } }.onFailure { + _signInState.value = SignInState(UiState.Failure(it.message.toString())) _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) } } From 08d7b39191687b096657ef6f75c97e0a44009689 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 17:44:54 +0900 Subject: [PATCH 23/43] =?UTF-8?q?[REFACTOR/#79]=20BaseResponse=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/SearchViewsDataSource.kt | 3 +- .../SearchViewsDataSourceImpl.kt | 27 +++----------- .../dto/response/SearchViewsResponseDto.kt | 37 ++++++------------- .../SearchViewsRepositoryImpl.kt | 5 ++- .../com/terning/data/service/SearchService.kt | 23 +----------- 5 files changed, 24 insertions(+), 71 deletions(-) diff --git a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt index 727cf9671..1eb55bce1 100644 --- a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt @@ -1,7 +1,8 @@ package com.terning.data.datasource +import com.terning.data.dto.BaseResponse import com.terning.data.dto.response.SearchViewsResponseDto interface SearchViewsDataSource { - suspend fun getSearchViews(): SearchViewsResponseDto + suspend fun getSearchViews(): BaseResponse } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt index ff92130ac..bf82feb99 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt @@ -1,31 +1,14 @@ package com.terning.data.datasourceimpl import com.terning.data.datasource.SearchViewsDataSource +import com.terning.data.dto.BaseResponse import com.terning.data.dto.response.SearchViewsResponseDto import com.terning.data.service.SearchService import javax.inject.Inject class SearchViewsDataSourceImpl @Inject constructor( - private val searchService: SearchService -): SearchViewsDataSource { - override suspend fun getSearchViews(): SearchViewsResponseDto { - return SearchViewsResponseDto( - status = 200, - message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = SearchViewsResponseDto.Result( - accountments = listOf( - SearchViewsResponseDto.SearchViewsData( - internshipAnnouncementId = 23L, - companyImage = "https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", - title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" - ), - SearchViewsResponseDto.SearchViewsData( - internshipAnnouncementId = 3L, - companyImage = "https://https://image.dongascience.com/Photo/2019/09/d2468576cecf1313437de5a883bfa2ed.jpg", - title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" - ) - ) - ) - ) - } + private val searchService: SearchService, +) : SearchViewsDataSource { + override suspend fun getSearchViews(): BaseResponse = + searchService.getSearchViewsList() } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index 061070b0f..f7f00d309 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -6,35 +6,20 @@ import kotlinx.serialization.Serializable @Serializable data class SearchViewsResponseDto( - @SerialName("status") - val status: Int, - @SerialName("message") - val message: String, - @SerialName("result") - val result: Result, + @SerialName("internshipAnnouncementId") + val internshipAnnouncementId: Long, + @SerialName("companyImage") + val companyImage: String, + @SerialName("title") + val title: String, ) { - @Serializable - data class Result( - @SerialName("accountments") - val accountments: List, - ) - - @Serializable - data class SearchViewsData( - @SerialName("internshipAnnouncementId") - val internshipAnnouncementId: Long, - @SerialName("companyImage") - val companyImage: String, - @SerialName("title") - val title: String, - ) fun toSearchViewsEntity(): List = - result.accountments.map { + listOf( SearchViewsResponseModel( - title = it.title, - companyImage = it.companyImage, - announcementId = it.internshipAnnouncementId + announcementId = internshipAnnouncementId, + companyImage = companyImage, + title = title, ) - } + ) } diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 24110f2bd..162eb6f26 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -10,6 +10,9 @@ class SearchViewsRepositoryImpl @Inject constructor( ) : SearchViewsRepository { override suspend fun getSearchViewsList(): Result> = runCatching { - searchViewsDataSource.getSearchViews().toSearchViewsEntity() + searchViewsDataSource + .getSearchViews() + .result + .toSearchViewsEntity() } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/SearchService.kt b/data/src/main/java/com/terning/data/service/SearchService.kt index b4a38f501..e6f3e27d1 100644 --- a/data/src/main/java/com/terning/data/service/SearchService.kt +++ b/data/src/main/java/com/terning/data/service/SearchService.kt @@ -1,29 +1,10 @@ package com.terning.data.service +import com.terning.data.dto.BaseResponse import com.terning.data.dto.response.SearchViewsResponseDto import retrofit2.http.GET interface SearchService { @GET("api/v1/search/views") - suspend fun getSearchViewsList(): SearchViewsResponseDto { - return SearchViewsResponseDto( - status = 200, - message = "탐색 > 조회수 많은 공고를 조회하는데 성공했습니다", - result = SearchViewsResponseDto.Result( - accountments = listOf( - SearchViewsResponseDto.SearchViewsData( - internshipAnnouncementId = 23, - companyImage = "https://example.com/image1.jpg", - title = "[유한킴벌리]그린캠프 w. 대학생 숲 활동가 모집" - ), - SearchViewsResponseDto.SearchViewsData( - internshipAnnouncementId = 3, - companyImage = "https://example.com/image2.jpg", - title = "[Someone] 콘텐츠 마케터 대학생 인턴 채용" - ) - ) - ) - ) - } - + suspend fun getSearchViewsList(): BaseResponse } \ No newline at end of file From afd35a67bf826c730046e6979975764231135b05 Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 18:47:48 +0900 Subject: [PATCH 24/43] =?UTF-8?q?[REFACTOR/#79]=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20DTO=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EB=A6=AC=EB=84=A4=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/point/di/DataSourceModule.kt | 8 ++++---- .../java/com/terning/point/di/RepositoryModule.kt | 4 ++-- .../component/textfield/TerningBasicTextField.kt | 6 ++++-- ...archViewsDataSource.kt => SearchDataSource.kt} | 2 +- ...sDataSourceImpl.kt => SearchDataSourceImpl.kt} | 6 +++--- .../data/dto/response/SearchViewsResponseDto.kt | 8 +++++--- .../repositoryimpl/SearchViewsRepositoryImpl.kt | 15 ++++++--------- ...archViewsRepository.kt => SearchRepository.kt} | 2 +- .../terning/feature/search/search/SearchRoute.kt | 4 +++- .../feature/search/search/SearchViewModel.kt | 14 +++----------- 10 files changed, 32 insertions(+), 37 deletions(-) rename data/src/main/java/com/terning/data/datasource/{SearchViewsDataSource.kt => SearchDataSource.kt} (86%) rename data/src/main/java/com/terning/data/datasourceimpl/{SearchViewsDataSourceImpl.kt => SearchDataSourceImpl.kt} (73%) rename domain/src/main/java/com/terning/domain/repository/{SearchViewsRepository.kt => SearchRepository.kt} (84%) diff --git a/app/src/main/java/com/terning/point/di/DataSourceModule.kt b/app/src/main/java/com/terning/point/di/DataSourceModule.kt index 612d0d0ef..96ae882bc 100644 --- a/app/src/main/java/com/terning/point/di/DataSourceModule.kt +++ b/app/src/main/java/com/terning/point/di/DataSourceModule.kt @@ -1,9 +1,9 @@ package com.terning.point.di import com.terning.data.datasource.MockDataSource -import com.terning.data.datasource.SearchViewsDataSource +import com.terning.data.datasource.SearchDataSource import com.terning.data.datasourceimpl.MockDataSourceImpl -import com.terning.data.datasourceimpl.SearchViewsDataSourceImpl +import com.terning.data.datasourceimpl.SearchDataSourceImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -20,6 +20,6 @@ abstract class DataSourceModule { @Binds @Singleton - abstract fun bindSearchViewsDataSource(searchViewsDataSourceImpl: SearchViewsDataSourceImpl): - SearchViewsDataSource + abstract fun bindSearchViewsDataSource(searchViewsDataSourceImpl: SearchDataSourceImpl): + SearchDataSource } \ No newline at end of file diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index c70b1bcd4..7369a65d7 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -3,7 +3,7 @@ package com.terning.point.di import com.terning.data.repositoryimpl.MockRepositoryImpl import com.terning.data.repositoryimpl.SearchViewsRepositoryImpl import com.terning.domain.repository.MockRepository -import com.terning.domain.repository.SearchViewsRepository +import com.terning.domain.repository.SearchRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -20,5 +20,5 @@ abstract class RepositoryModule { @Binds @Singleton - abstract fun bindSearchViewsRepository(searchViewsRepositoryImpl: SearchViewsRepositoryImpl): SearchViewsRepository + abstract fun bindSearchViewsRepository(searchViewsRepositoryImpl: SearchViewsRepositoryImpl): SearchRepository } \ No newline at end of file diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt index d9526c2f8..d30599864 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt @@ -68,10 +68,12 @@ fun TerningBasicTextField( keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions( onDone = { - if (value.isNotEmpty() && value.isNotBlank()) { + if (value.isNotBlank()) { keyboardController?.hide() focusManager.clearFocus() - onDoneAction?.invoke() + if (onDoneAction != null) { + onDoneAction() + } } } ), diff --git a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt b/data/src/main/java/com/terning/data/datasource/SearchDataSource.kt similarity index 86% rename from data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt rename to data/src/main/java/com/terning/data/datasource/SearchDataSource.kt index 1eb55bce1..cc15b29b6 100644 --- a/data/src/main/java/com/terning/data/datasource/SearchViewsDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/SearchDataSource.kt @@ -3,6 +3,6 @@ package com.terning.data.datasource import com.terning.data.dto.BaseResponse import com.terning.data.dto.response.SearchViewsResponseDto -interface SearchViewsDataSource { +interface SearchDataSource { suspend fun getSearchViews(): BaseResponse } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/SearchDataSourceImpl.kt similarity index 73% rename from data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt rename to data/src/main/java/com/terning/data/datasourceimpl/SearchDataSourceImpl.kt index bf82feb99..7a5872e56 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/SearchViewsDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/SearchDataSourceImpl.kt @@ -1,14 +1,14 @@ package com.terning.data.datasourceimpl -import com.terning.data.datasource.SearchViewsDataSource +import com.terning.data.datasource.SearchDataSource import com.terning.data.dto.BaseResponse import com.terning.data.dto.response.SearchViewsResponseDto import com.terning.data.service.SearchService import javax.inject.Inject -class SearchViewsDataSourceImpl @Inject constructor( +class SearchDataSourceImpl @Inject constructor( private val searchService: SearchService, -) : SearchViewsDataSource { +) : SearchDataSource { override suspend fun getSearchViews(): BaseResponse = searchService.getSearchViewsList() } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index f7f00d309..a01922c7a 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -14,12 +14,14 @@ data class SearchViewsResponseDto( val title: String, ) { - fun toSearchViewsEntity(): List = - listOf( + + fun toSearchViewsEntity(): List { + return listOf( SearchViewsResponseModel( announcementId = internshipAnnouncementId, companyImage = companyImage, title = title, ) ) -} + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 162eb6f26..9ae8429c8 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -1,18 +1,15 @@ package com.terning.data.repositoryimpl -import com.terning.data.datasource.SearchViewsDataSource +import com.terning.data.datasource.SearchDataSource import com.terning.domain.entity.response.SearchViewsResponseModel -import com.terning.domain.repository.SearchViewsRepository +import com.terning.domain.repository.SearchRepository import javax.inject.Inject class SearchViewsRepositoryImpl @Inject constructor( - private val searchViewsDataSource: SearchViewsDataSource, -) : SearchViewsRepository { + private val searchDataSource: SearchDataSource, +) : SearchRepository { override suspend fun getSearchViewsList(): Result> = runCatching { - searchViewsDataSource - .getSearchViews() - .result - .toSearchViewsEntity() + searchDataSource.getSearchViews().result.toSearchViewsEntity() } -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt b/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt similarity index 84% rename from domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt rename to domain/src/main/java/com/terning/domain/repository/SearchRepository.kt index 3e64e61a0..5ff6e0e52 100644 --- a/domain/src/main/java/com/terning/domain/repository/SearchViewsRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt @@ -2,6 +2,6 @@ package com.terning.domain.repository import com.terning.domain.entity.response.SearchViewsResponseModel -interface SearchViewsRepository { +interface SearchRepository { suspend fun getSearchViewsList(): Result> } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 9b3784b25..720e58869 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -51,7 +51,9 @@ fun SearchRoute( viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> when (sideEffect) { - is SearchViewsSideEffect.Toast -> {} + is SearchViewsSideEffect.Toast -> { + sideEffect.message + } } } } diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt index d55431d8c..f9736104d 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState import com.terning.domain.entity.response.SearchViewsResponseModel -import com.terning.domain.repository.SearchViewsRepository +import com.terning.domain.repository.SearchRepository import com.terning.feature.R import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow @@ -17,7 +17,7 @@ import javax.inject.Inject @HiltViewModel class SearchViewModel @Inject constructor( - private val searchViewsRepository: SearchViewsRepository, + private val searchRepository: SearchRepository, ) : ViewModel() { private val _state: MutableStateFlow = MutableStateFlow(SearchViewsState()) val state: StateFlow = _state.asStateFlow() @@ -31,18 +31,10 @@ class SearchViewModel @Inject constructor( fun getSearchViews() { viewModelScope.launch { - searchViewsRepository.getSearchViewsList().onSuccess { response -> - val searchViewsList = response.map { entity -> - SearchViewsResponseModel( - title = entity.title, - companyImage = entity.companyImage, - announcementId = entity.announcementId - ) - } + searchRepository.getSearchViewsList().onSuccess { searchViewsList -> _state.value = _state.value.copy( searchViewsList = UiState.Success(searchViewsList) ) - _sideEffect.emit(SearchViewsSideEffect.Toast(R.string.server_success)) }.onFailure { _sideEffect.emit(SearchViewsSideEffect.Toast(R.string.server_failure)) } From 4d3990d407059dc5c79931b8069a6648cc7bad1b Mon Sep 17 00:00:00 2001 From: arinming Date: Tue, 16 Jul 2024 21:31:36 +0900 Subject: [PATCH 25/43] =?UTF-8?q?[RENAME/#79]=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=EB=A6=AC=EB=84=A4=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/data/dto/response/SearchViewsResponseDto.kt | 6 +++--- .../data/repositoryimpl/SearchViewsRepositoryImpl.kt | 4 ++-- ...earchViewsResponseModel.kt => InternshipAnnouncement.kt} | 2 +- .../java/com/terning/domain/repository/SearchRepository.kt | 4 ++-- .../java/com/terning/feature/search/search/SearchRoute.kt | 6 +++--- .../com/terning/feature/search/search/SearchViewModel.kt | 1 - .../com/terning/feature/search/search/SearchViewsState.kt | 4 ++-- .../terning/feature/search/search/component/SearchIntern.kt | 4 ++-- .../feature/search/search/component/SearchInternList.kt | 4 ++-- 9 files changed, 17 insertions(+), 18 deletions(-) rename domain/src/main/java/com/terning/domain/entity/response/{SearchViewsResponseModel.kt => InternshipAnnouncement.kt} (77%) diff --git a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt index a01922c7a..1f928b498 100644 --- a/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/SearchViewsResponseDto.kt @@ -1,6 +1,6 @@ package com.terning.data.dto.response -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,9 +15,9 @@ data class SearchViewsResponseDto( ) { - fun toSearchViewsEntity(): List { + fun toSearchViewsEntity(): List { return listOf( - SearchViewsResponseModel( + InternshipAnnouncement( announcementId = internshipAnnouncementId, companyImage = companyImage, title = title, diff --git a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt index 9ae8429c8..3900c1f5e 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/SearchViewsRepositoryImpl.kt @@ -1,14 +1,14 @@ package com.terning.data.repositoryimpl import com.terning.data.datasource.SearchDataSource -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement import com.terning.domain.repository.SearchRepository import javax.inject.Inject class SearchViewsRepositoryImpl @Inject constructor( private val searchDataSource: SearchDataSource, ) : SearchRepository { - override suspend fun getSearchViewsList(): Result> = + override suspend fun getSearchViewsList(): Result> = runCatching { searchDataSource.getSearchViews().result.toSearchViewsEntity() } diff --git a/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt b/domain/src/main/java/com/terning/domain/entity/response/InternshipAnnouncement.kt similarity index 77% rename from domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt rename to domain/src/main/java/com/terning/domain/entity/response/InternshipAnnouncement.kt index 0877ecf4a..c090f25a9 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/SearchViewsResponseModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/InternshipAnnouncement.kt @@ -1,6 +1,6 @@ package com.terning.domain.entity.response -data class SearchViewsResponseModel( +data class InternshipAnnouncement( val title: String, val companyImage: String, val announcementId: Long, diff --git a/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt b/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt index 5ff6e0e52..c4b83bdb6 100644 --- a/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/SearchRepository.kt @@ -1,7 +1,7 @@ package com.terning.domain.repository -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement interface SearchRepository { - suspend fun getSearchViewsList(): Result> + suspend fun getSearchViewsList(): Result> } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 720e58869..f554ba8eb 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -27,7 +27,7 @@ import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement import com.terning.feature.R import com.terning.feature.search.search.component.ImageSlider import com.terning.feature.search.search.component.InternListType @@ -65,7 +65,7 @@ fun SearchRoute( is UiState.Success -> { SearchScreen( navController = navController, - searchViewsList = (state.searchViewsList as UiState.Success>).data + searchViewsList = (state.searchViewsList as UiState.Success>).data ) } @@ -76,7 +76,7 @@ fun SearchRoute( fun SearchScreen( modifier: Modifier = Modifier, navController: NavHostController, - searchViewsList: List, + searchViewsList: List, ) { val images = listOf( R.drawable.ic_nav_search, diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt index f9736104d..d99b6894b 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewModel.kt @@ -3,7 +3,6 @@ package com.terning.feature.search.search import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel import com.terning.domain.repository.SearchRepository import com.terning.feature.R import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt index 93e2a9b5a..d9cf41ed8 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchViewsState.kt @@ -1,8 +1,8 @@ package com.terning.feature.search.search import com.terning.core.state.UiState -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement data class SearchViewsState( - var searchViewsList: UiState> = UiState.Loading, + var searchViewsList: UiState> = UiState.Loading, ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt index c1265dedd..96e1c551a 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchIntern.kt @@ -26,13 +26,13 @@ import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.customShadow import com.terning.core.extension.noRippleClickable -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement import com.terning.feature.R import com.terning.feature.intern.navigation.navigateIntern @Composable fun SearchIntern( - searchViews: SearchViewsResponseModel, + searchViews: InternshipAnnouncement, navController: NavHostController, ) { Column( diff --git a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt index e76f9f3b0..f8abf167e 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/SearchInternList.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme -import com.terning.domain.entity.response.SearchViewsResponseModel +import com.terning.domain.entity.response.InternshipAnnouncement import com.terning.feature.R @Composable fun SearchInternList( type: InternListType, - searchViewsList: List, + searchViewsList: List, navController: NavHostController ) { Column(modifier = Modifier.padding(horizontal = 24.dp)) { From adedaf56d2507028df4f29b3783779726f2dc21f Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Wed, 17 Jul 2024 00:00:10 +0900 Subject: [PATCH 26/43] [CHORE/#72] solving conflict --- .../onboarding/signin/SignInViewModel.kt | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt index bf86e8391..cb09c9e94 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInViewModel.kt @@ -82,33 +82,32 @@ class SignInViewModel @Inject constructor( } } - private fun signInSuccess( + private suspend fun signInSuccess( accessToken: String, platform: String = KAKAO ) { - viewModelScope.launch { - authRepository.postSignIn( - accessToken, - SignInRequestModel(platform) - ).onSuccess { response -> - when { - response.accessToken == null -> _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) + authRepository.postSignIn( + accessToken, + SignInRequestModel(platform) + ).onSuccess { response -> + when { + response.accessToken == null -> _signInSideEffects.emit(SignInSideEffect.NavigateSignUp) - else -> { - tokenRepository.setTokens( - response.accessToken ?: return@launch, - response.refreshToken ?: return@onSuccess - ) - tokenRepository.setUserId(response.userId) + else -> { + tokenRepository.setTokens( + response.accessToken ?: return, + response.refreshToken ?: return + ) + tokenRepository.setUserId(response.userId) - _signInSideEffects.emit(SignInSideEffect.NavigateToHome) - } + _signInSideEffects.emit(SignInSideEffect.NavigateToHome) } - }.onFailure { - _signInState.value = SignInState(UiState.Failure(it.message.toString())) - _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) } + }.onFailure { + _signInState.value = SignInState(UiState.Failure(it.message.toString())) + _signInSideEffects.emit(SignInSideEffect.ShowToast(R.string.server_failure)) } + } companion object { From 605a5f8f20b0851833dd2dcb97f6f50ac92a5f8f Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Wed, 17 Jul 2024 00:09:54 +0900 Subject: [PATCH 27/43] [CHORE/#72] solving conflict --- .../src/main/java/com/terning/feature/main/MainNavigator.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/src/main/java/com/terning/feature/main/MainNavigator.kt index 361fb6103..b538c3e58 100644 --- a/feature/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -11,10 +11,8 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import com.terning.feature.calendar.navigation.navigateCalendar import com.terning.feature.home.home.navigation.navigateHome -import com.terning.feature.intern.navigation.Intern import com.terning.feature.mypage.navigation.navigateMyPage import com.terning.feature.onboarding.signin.navigation.SignIn -import com.terning.feature.search.search.navigation.Search import com.terning.feature.search.search.navigation.navigateSearch class MainNavigator( @@ -24,7 +22,7 @@ class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = Search + val startDestination = SignIn val currentTab: MainTab? @Composable get() = MainTab.find { tab -> From 8988ae864d067bbc0f5817f78f40a3ee0f03e14f Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 00:37:41 +0900 Subject: [PATCH 28/43] =?UTF-8?q?[FEAT/#91]=20Dto=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CalendarDayListRequestDto.kt | 5 + .../request/CalendarMonthListRequestDto.kt | 13 + ...questDto.kt => CalendarMonthRequestDto.kt} | 2 +- .../dto/response/CalendarListResponseDto.kt | 49 +++ .../dto/response/CalendarMonthResponseDto.kt | 33 ++ .../data/dto/response/ScrapResponseDto.kt | 328 ------------------ 6 files changed, 101 insertions(+), 329 deletions(-) create mode 100644 data/src/main/java/com/terning/data/dto/request/CalendarDayListRequestDto.kt create mode 100644 data/src/main/java/com/terning/data/dto/request/CalendarMonthListRequestDto.kt rename data/src/main/java/com/terning/data/dto/request/{ScrapRequestDto.kt => CalendarMonthRequestDto.kt} (86%) create mode 100644 data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt create mode 100644 data/src/main/java/com/terning/data/dto/response/CalendarMonthResponseDto.kt delete mode 100644 data/src/main/java/com/terning/data/dto/response/ScrapResponseDto.kt diff --git a/data/src/main/java/com/terning/data/dto/request/CalendarDayListRequestDto.kt b/data/src/main/java/com/terning/data/dto/request/CalendarDayListRequestDto.kt new file mode 100644 index 000000000..857b75029 --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/request/CalendarDayListRequestDto.kt @@ -0,0 +1,5 @@ +package com.terning.data.dto.request + +data class CalendarDayListRequestDto( + val date: String +) \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/request/CalendarMonthListRequestDto.kt b/data/src/main/java/com/terning/data/dto/request/CalendarMonthListRequestDto.kt new file mode 100644 index 000000000..6a951d73d --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/request/CalendarMonthListRequestDto.kt @@ -0,0 +1,13 @@ +package com.terning.data.dto.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CalendarMonthListRequestDto( + @SerialName("deadline") + val year: Int, + @SerialName("scraps") + val month: Int +) + diff --git a/data/src/main/java/com/terning/data/dto/request/ScrapRequestDto.kt b/data/src/main/java/com/terning/data/dto/request/CalendarMonthRequestDto.kt similarity index 86% rename from data/src/main/java/com/terning/data/dto/request/ScrapRequestDto.kt rename to data/src/main/java/com/terning/data/dto/request/CalendarMonthRequestDto.kt index f93df1059..00eaf4696 100644 --- a/data/src/main/java/com/terning/data/dto/request/ScrapRequestDto.kt +++ b/data/src/main/java/com/terning/data/dto/request/CalendarMonthRequestDto.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class ScrapRequestDto( +data class CalendarMonthRequestDto( @SerialName("year") val year: Int, @SerialName("month") diff --git a/data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt new file mode 100644 index 000000000..16e426a60 --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt @@ -0,0 +1,49 @@ +package com.terning.data.dto.response + +import com.terning.domain.entity.response.CalendarScrapDetailModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CalendarListResponseDto( + @SerialName("deadline") + val deadline: String, + @SerialName("scraps") + val scraps: List +) { + @Serializable + data class Scrap( + @SerialName("scrapId") + val scrapId: Long, + @SerialName("internshipAnnouncementId") + val internshipAnnouncementId: Long, + @SerialName("title") + val title: String, + @SerialName("dDay") + val dDay: String, + @SerialName("workingPeriod") + val workingPeriod: String, + @SerialName("color") + val color: String, + @SerialName("companyImage") + val companyImage: String, + @SerialName("startYear") + val startYear: Int, + @SerialName("startMonth") + val startMonth: Int + ) + + fun toScrapDetailModelList(): List = scraps.map { scrap -> + CalendarScrapDetailModel( + scrapId = scrap.scrapId, + internshipAnnouncementId = scrap.internshipAnnouncementId, + title = scrap.title, + dDay = scrap.dDay, + workingPeriod = scrap.workingPeriod, + color = scrap.color, + companyImage = scrap.companyImage, + startYear = scrap.startYear, + startMonth = scrap.startMonth + ) + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/CalendarMonthResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/CalendarMonthResponseDto.kt new file mode 100644 index 000000000..2af310d95 --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/response/CalendarMonthResponseDto.kt @@ -0,0 +1,33 @@ +package com.terning.data.dto.response + +import com.terning.domain.entity.response.CalendarScrapModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CalendarMonthResponseDto( + @SerialName("deadline") + val deadline: String, + @SerialName("scraps") + val scraps: List +) { + @Serializable + data class Scrap( + @SerialName("scrapId") + val scrapId: Long, + @SerialName("title") + val title: String, + @SerialName("color") + val color: String + ) + + fun toScrapModelList(): List = scraps.map { scrap -> + CalendarScrapModel( + scrapId = scrap.scrapId, + title = scrap.title, + color = scrap.color, + deadLine = deadline, + isScrapped = true + ) + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/ScrapResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/ScrapResponseDto.kt deleted file mode 100644 index 1a44012a9..000000000 --- a/data/src/main/java/com/terning/data/dto/response/ScrapResponseDto.kt +++ /dev/null @@ -1,328 +0,0 @@ -package com.terning.data.dto.response - -import com.terning.domain.entity.response.ScrapModel -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ScrapResponseDto( - @SerialName("deadline") - val deadline: String, - @SerialName("scraps") - val scraps: List -) { - @Serializable - data class Scrap( - @SerialName("scrapId") - val scrapId: Long, - @SerialName("title") - val title: String, - @SerialName("color") - val color: String - ) - - fun toScrapModelList(): List = scraps.map { scrap -> - ScrapModel( - scrapId = scrap.scrapId, - title = scrap.title, - color = scrap.color, - deadLine = deadline, - isScrapped = true - ) - } -} - -fun getMockScrapList(year: Int, month: Int): List { - val deadline = month.toString().padStart(2, '0') - - return when (month % 4) { - 0 -> { - listOf( - ScrapResponseDto( - deadline = "${year}-${deadline}-13", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFED4E54" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 3, - title = "제목3", - color = "#FF9B64E2" - ), - ScrapResponseDto.Scrap( - scrapId = 4, - title = "제목4", - color = "#FFF260AC" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-17", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FF45D0CC" - ), - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-23", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF5397F3" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-30", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF45D0CC" - ) - ) - ) - ) - } - - 1 -> { - listOf( - ScrapResponseDto( - deadline = "${year}-${deadline}-01", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFED4E54" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 3, - title = "제목3", - color = "#FF9B64E2" - ), - ScrapResponseDto.Scrap( - scrapId = 4, - title = "제목4", - color = "#FFF260AC" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-02", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FF9B64E2" - ), - ScrapResponseDto.Scrap( - scrapId = 3, - title = "제목3", - color = "#FFED4E54" - ), - ScrapResponseDto.Scrap( - scrapId = 4, - title = "제목4", - color = "#FFF260AC" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-12", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FF45D0CC" - ), - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-27", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF5397F3" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-29", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF45D0CC" - ) - ) - ) - ) - } - - 2 -> { - listOf( - ScrapResponseDto( - deadline = "${year}-${deadline}-02", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFED4E54" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 3, - title = "제목3", - color = "#FF9B64E2" - ), - ScrapResponseDto.Scrap( - scrapId = 4, - title = "제목4", - color = "#FFF260AC" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-18", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FF45D0CC" - ), - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-20", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF5397F3" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-29", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF45D0CC" - ) - ) - ) - ) - } - - 3 -> { - listOf( - ScrapResponseDto( - deadline = "${year}-${deadline}-05", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFED4E54" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FFC4E953" - )/*, - ScrapResponsesDto.Scrap( - scrapId = 3, - title = "제목3", - color = "#FF9B64E2" - ), - ScrapResponsesDto.Scrap( - scrapId = 4, - title = "제목4", - color = "#FFF260AC" - )*/ - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-11", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FFC4E953" - ), - ScrapResponseDto.Scrap( - scrapId = 2, - title = "제목2", - color = "#FF45D0CC" - ), - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-19", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF5397F3" - ) - ) - ), - ScrapResponseDto( - deadline = "${year}-${deadline}-28", - scraps = listOf( - ScrapResponseDto.Scrap( - scrapId = 1, - title = "제목1", - color = "#FF45D0CC" - ) - ) - ) - ) - } - - else -> { - listOf() - } - } -} \ No newline at end of file From 59ca4f5ef68cfcfcc340c16b1eee62f27e491f51 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 00:40:17 +0900 Subject: [PATCH 29/43] =?UTF-8?q?[RENAME/#91]=20=ED=86=B5=EC=8B=A0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/CalendarDataSource.kt | 12 + .../data/datasource/ScrapDataSource.kt | 9 - .../datasourceimpl/CalendarDataSourceImpl.kt | 31 + .../data/datasourceimpl/CalendarList.kt | 792 ++++++++++++++++++ .../datasourceimpl/ScrapDataSourceImpl.kt | 20 - .../repositoryimpl/CalendarRepositoryImpl.kt | 27 + .../repositoryimpl/ScrapRepositoryImpl.kt | 27 - .../terning/data/service/CalendarService.kt | 28 + .../response/CalendarScrapDetailModel.kt | 13 + .../{ScrapModel.kt => CalendarScrapModel.kt} | 2 +- .../domain/repository/CalendarRepository.kt | 7 + .../domain/repository/ScrapRepository.kt | 7 - .../calendar/calendar/CalendarViewModel.kt | 6 +- .../feature/calendar/month/CalendarMonth.kt | 4 +- .../calendar/month/CalendarMonthScreen.kt | 4 +- .../calendar/month/ScrapCalendarState.kt | 4 +- .../calendar/scrap/CalendarMonthScrap.kt | 4 +- 17 files changed, 922 insertions(+), 75 deletions(-) create mode 100644 data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt delete mode 100644 data/src/main/java/com/terning/data/datasource/ScrapDataSource.kt create mode 100644 data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt create mode 100644 data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt delete mode 100644 data/src/main/java/com/terning/data/datasourceimpl/ScrapDataSourceImpl.kt create mode 100644 data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt delete mode 100644 data/src/main/java/com/terning/data/repositoryimpl/ScrapRepositoryImpl.kt create mode 100644 data/src/main/java/com/terning/data/service/CalendarService.kt create mode 100644 domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt rename domain/src/main/java/com/terning/domain/entity/response/{ScrapModel.kt => CalendarScrapModel.kt} (84%) create mode 100644 domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt delete mode 100644 domain/src/main/java/com/terning/domain/repository/ScrapRepository.kt diff --git a/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt new file mode 100644 index 000000000..be62daa3a --- /dev/null +++ b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt @@ -0,0 +1,12 @@ +package com.terning.data.datasource + +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.CalendarMonthListRequestDto +import com.terning.data.dto.request.CalendarMonthRequestDto +import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarMonthResponseDto + +interface CalendarDataSource { + suspend fun getScrapMonth(request: CalendarMonthRequestDto): BaseResponse> + suspend fun getScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasource/ScrapDataSource.kt b/data/src/main/java/com/terning/data/datasource/ScrapDataSource.kt deleted file mode 100644 index 97e893cda..000000000 --- a/data/src/main/java/com/terning/data/datasource/ScrapDataSource.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.terning.data.datasource - -import com.terning.data.dto.BaseResponse -import com.terning.data.dto.request.ScrapRequestDto -import com.terning.data.dto.response.ScrapResponseDto - -interface ScrapDataSource { - suspend fun getScrapMonth(request: ScrapRequestDto): BaseResponse> -} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt new file mode 100644 index 000000000..4a219bd54 --- /dev/null +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt @@ -0,0 +1,31 @@ +package com.terning.data.datasourceimpl + +import com.terning.data.datasource.CalendarDataSource +import com.terning.data.datasourceimpl.CalendarList.getMockScrapList +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.CalendarMonthListRequestDto +import com.terning.data.dto.request.CalendarMonthRequestDto +import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarMonthResponseDto +import javax.inject.Inject + +class CalendarDataSourceImpl @Inject constructor( + +) : CalendarDataSource { + override suspend fun getScrapMonth(request: CalendarMonthRequestDto): BaseResponse> = + BaseResponse( + status = 200, + message = "캘린더 > (월간) 스크랩 된 공고 정보 (리스트) 불러오기를 성공했습니다", + result = getMockScrapList(request.year, request.month) + ) + + override suspend fun getScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> { + return BaseResponse( + status = 200, + message = "캘린더 > (월간) 스크랩 된 공고 정보 (리스트) 불러오기를 성공했습니다", + result = getMockScrapDetailList(request.year, request.month) + ) + } + + +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt new file mode 100644 index 000000000..be7d920b9 --- /dev/null +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt @@ -0,0 +1,792 @@ +package com.terning.data.datasourceimpl + +import com.terning.data.dto.request.CalendarMonthListRequestDto +import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarMonthResponseDto + +object CalendarList { + fun getMockScrapList(year: Int, month: Int): List { + val deadline = month.toString().padStart(2, '0') + return when (month % 4) { + 0 -> { + listOf( + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-13", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFED4E54" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FF9B64E2" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-17", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FF45D0CC" + ), + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-23", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF5397F3" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-30", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF45D0CC" + ) + ) + ) + ) + } + + 1 -> { + listOf( + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-01", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFED4E54" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FF9B64E2" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-02", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FF9B64E2" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FFED4E54" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-12", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FF45D0CC" + ), + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-27", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF5397F3" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-29", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF45D0CC" + ) + ) + ) + ) + } + + 2 -> { + listOf( + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-02", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFED4E54" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FF9B64E2" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-18", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FF45D0CC" + ), + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-20", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF5397F3" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-29", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF45D0CC" + ) + ) + ) + ) + } + + 3 -> { + listOf( + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-05", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFED4E54" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FFC4E953" + )/*, + ScrapResponsesDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FF9B64E2" + ), + ScrapResponsesDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC" + )*/ + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-11", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFC4E953" + ), + CalendarMonthResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FF45D0CC" + ), + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-19", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF5397F3" + ) + ) + ), + CalendarMonthResponseDto( + deadline = "${year}-${deadline}-28", + scraps = listOf( + CalendarMonthResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FF45D0CC" + ) + ) + ) + ) + } + + else -> { + listOf() + } + } + } +} + + +/*************************MockDataType***************************/ + +fun getMockScrapDetailList(year: Int, month: Int): List { + val deadline = month.toString().padStart(2, '0') + return when (month % 4) { + 0 -> { + listOf( + CalendarListResponseDto( + deadline = "${year}-${deadline}-13", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 1, + title = "제목1", + color = "#FFED4E54", + internshipAnnouncementId = 1, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 2, + title = "제목2", + color = "#FFC4E953", + internshipAnnouncementId = 2, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 3, + title = "제목3", + color = "#FF9B64E2", + internshipAnnouncementId = 3, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 4, + title = "제목4", + color = "#FFF260AC", + internshipAnnouncementId = 3, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-17", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 5, + title = "제목5", + color = "#FFC4E953", + internshipAnnouncementId = 5, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 6, + title = "제목6", + color = "#FF45D0CC", + internshipAnnouncementId = 6, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-23", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 7, + title = "제목7", + color = "#FF5397F3", + internshipAnnouncementId = 7, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-30", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 8, + title = "제목8", + color = "#FF45D0CC", + internshipAnnouncementId = 8, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ) + ) + } + + 1 -> { + listOf( + CalendarListResponseDto( + deadline = "${year}-${deadline}-01", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 9, + title = "제목9", + color = "#FFED4E54", + internshipAnnouncementId = 9, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 10, + title = "제목10", + color = "#FFC4E953", + internshipAnnouncementId = 10, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 11, + title = "제목11", + color = "#FF9B64E2", + internshipAnnouncementId = 11, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 12, + title = "제목12", + color = "#FFF260AC", + internshipAnnouncementId = 12, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-02", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 13, + title = "제목13", + color = "#FFC4E953", + internshipAnnouncementId = 13, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 14, + title = "제목14", + color = "#FF9B64E2", + internshipAnnouncementId = 14, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 15, + title = "제목15", + color = "#FFED4E54", + internshipAnnouncementId = 15, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 16, + title = "제목16", + color = "#FFF260AC", + internshipAnnouncementId = 16, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-12", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 17, + title = "제목17", + color = "#FFC4E953", + internshipAnnouncementId = 17, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 18, + title = "제목18", + color = "#FF45D0CC", + internshipAnnouncementId = 18, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-27", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 19, + title = "제목19", + color = "#FF5397F3", + internshipAnnouncementId = 19, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-29", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 20, + title = "제목20", + color = "#FF45D0CC", + internshipAnnouncementId = 20, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ) + ) + } + + 2 -> { + listOf( + CalendarListResponseDto( + deadline = "${year}-${deadline}-02", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 21, + title = "제목1", + color = "#FFED4E54", + internshipAnnouncementId = 21, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 22, + title = "제목22", + color = "#FFC4E953", + internshipAnnouncementId = 22, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 23, + title = "제목23", + color = "#FF9B64E2", + internshipAnnouncementId = 23, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 24, + title = "제목24", + color = "#FFF260AC", + internshipAnnouncementId = 24, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-18", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 25, + title = "제목25", + color = "#FFC4E953", + internshipAnnouncementId =25, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 26, + title = "제목26", + color = "#FF45D0CC", + internshipAnnouncementId = 26, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-20", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 27, + title = "제목27", + color = "#FF5397F3", + internshipAnnouncementId = 27, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-29", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 28, + title = "제목28", + color = "#FF45D0CC", + internshipAnnouncementId = 28, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ) + ) + } + + 3 -> { + listOf( + CalendarListResponseDto( + deadline = "${year}-${deadline}-05", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 29, + title = "제목29", + color = "#FFED4E54", + internshipAnnouncementId = 29, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 30, + title = "제목30", + color = "#FFC4E953", + internshipAnnouncementId = 30, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-11", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 31, + title = "제목31", + color = "#FFC4E953", + internshipAnnouncementId = 31, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarListResponseDto.Scrap( + scrapId = 32, + title = "제목32", + color = "#FF45D0CC", + internshipAnnouncementId = 32, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-19", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 33, + title = "제목33", + color = "#FF5397F3", + internshipAnnouncementId = 33, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ), + CalendarListResponseDto( + deadline = "${year}-${deadline}-28", + scraps = listOf( + CalendarListResponseDto.Scrap( + scrapId = 34, + title = "제목34", + color = "#FF45D0CC", + internshipAnnouncementId = 34, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ) + ) + ) + ) + } + + else -> { + listOf() + } + } +} diff --git a/data/src/main/java/com/terning/data/datasourceimpl/ScrapDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/ScrapDataSourceImpl.kt deleted file mode 100644 index 5b4afdf5e..000000000 --- a/data/src/main/java/com/terning/data/datasourceimpl/ScrapDataSourceImpl.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.terning.data.datasourceimpl - -import com.terning.data.datasource.ScrapDataSource -import com.terning.data.dto.BaseResponse -import com.terning.data.dto.request.ScrapRequestDto -import com.terning.data.dto.response.ScrapResponseDto -import com.terning.data.dto.response.getMockScrapList -import javax.inject.Inject - -class ScrapDataSourceImpl @Inject constructor( - -) : ScrapDataSource { - override suspend fun getScrapMonth(request: ScrapRequestDto): BaseResponse> = - BaseResponse( - status = 200, - message = "(월간) 스크랩된 공고 정보가 성공적으로 로드되었습니다.", - result = getMockScrapList(request.year, request.month) - ) - -} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt new file mode 100644 index 000000000..1264b2d7d --- /dev/null +++ b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt @@ -0,0 +1,27 @@ +package com.terning.data.repositoryimpl + +import com.terning.data.datasource.CalendarDataSource +import com.terning.data.dto.request.CalendarMonthRequestDto +import com.terning.domain.entity.response.CalendarScrapModel +import com.terning.domain.repository.CalendarRepository +import javax.inject.Inject + +class CalendarRepositoryImpl @Inject constructor( + private val calendarDataSource: CalendarDataSource +): CalendarRepository { + override suspend fun getScrapMonth(year: Int, month: Int): Result>> = + runCatching { + val result = calendarDataSource.getScrapMonth( + request = CalendarMonthRequestDto( + year = year, + month = month + ) + ).result + + val scrapModelMapByDeadLine = result.flatMap{ dto -> + dto.toScrapModelList() + }.groupBy { it.deadLine } + + scrapModelMapByDeadLine + } +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/ScrapRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/ScrapRepositoryImpl.kt deleted file mode 100644 index 686cdf29a..000000000 --- a/data/src/main/java/com/terning/data/repositoryimpl/ScrapRepositoryImpl.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.terning.data.repositoryimpl - -import com.terning.data.datasource.ScrapDataSource -import com.terning.data.dto.request.ScrapRequestDto -import com.terning.domain.entity.response.ScrapModel -import com.terning.domain.repository.ScrapRepository -import javax.inject.Inject - -class ScrapRepositoryImpl @Inject constructor( - private val scrapDataSource: ScrapDataSource -): ScrapRepository { - override suspend fun getScrapMonth(year: Int, month: Int): Result>> = - runCatching { - val result = scrapDataSource.getScrapMonth( - request = ScrapRequestDto( - year = year, - month = month - ) - ).result - - val scrapModelMapByDeadLine = result.flatMap{ dto -> - dto.toScrapModelList() - }.groupBy { it.deadLine } - - scrapModelMapByDeadLine - } -} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/service/CalendarService.kt b/data/src/main/java/com/terning/data/service/CalendarService.kt new file mode 100644 index 000000000..a28e7a443 --- /dev/null +++ b/data/src/main/java/com/terning/data/service/CalendarService.kt @@ -0,0 +1,28 @@ +package com.terning.data.service + +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarMonthResponseDto +import retrofit2.http.GET +import retrofit2.http.Query + +interface CalendarService{ + @GET("/api/v1/calendar/monthly-default") + suspend fun getCalendarScrapMonth( + @Query("year") year: Int, + @Query("month") month: Int + ): BaseResponse> + + @GET("/api/v1/calendar/monthly-list") + suspend fun getCalendarScrapMonthList( + @Query("year") year: Int, + @Query("month") month: Int + ): BaseResponse> + + @GET("/api/v1/calendar/daily") + suspend fun getCalendarScrapDayList( + @Query("year") year: Int, + @Query("month") month: Int, + @Query("day") day: Int + ): BaseResponse> +} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt new file mode 100644 index 000000000..ed48cf0e7 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt @@ -0,0 +1,13 @@ +package com.terning.domain.entity.response + +data class CalendarScrapDetailModel( + val scrapId: Long, + val internshipAnnouncementId: Long, + val title: String, + val dDay: String, + val workingPeriod: String, + val color: String, + val companyImage: String, + val startYear: Int, + val startMonth: Int +) diff --git a/domain/src/main/java/com/terning/domain/entity/response/ScrapModel.kt b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapModel.kt similarity index 84% rename from domain/src/main/java/com/terning/domain/entity/response/ScrapModel.kt rename to domain/src/main/java/com/terning/domain/entity/response/CalendarScrapModel.kt index 8b68bbe35..162b4544d 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/ScrapModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapModel.kt @@ -1,6 +1,6 @@ package com.terning.domain.entity.response -data class ScrapModel( +data class CalendarScrapModel( val scrapId: Long, val title: String, val deadLine: String, diff --git a/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt new file mode 100644 index 000000000..f69338cb5 --- /dev/null +++ b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt @@ -0,0 +1,7 @@ +package com.terning.domain.repository + +import com.terning.domain.entity.response.CalendarScrapModel + +interface CalendarRepository{ + suspend fun getScrapMonth(year: Int, month: Int): Result>> +} \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/repository/ScrapRepository.kt b/domain/src/main/java/com/terning/domain/repository/ScrapRepository.kt deleted file mode 100644 index bc13c9639..000000000 --- a/domain/src/main/java/com/terning/domain/repository/ScrapRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.terning.domain.repository - -import com.terning.domain.entity.response.ScrapModel - -interface ScrapRepository{ - suspend fun getScrapMonth(year: Int, month: Int): Result>> -} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 2f6d7ad04..854707f6a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -10,7 +10,7 @@ import com.terning.core.designsystem.theme.CalPurple import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState -import com.terning.domain.repository.ScrapRepository +import com.terning.domain.repository.CalendarRepository import com.terning.feature.R import com.terning.feature.calendar.month.ScrapCalendarState import com.terning.feature.calendar.scrap.model.Scrap @@ -28,7 +28,7 @@ import javax.inject.Inject @HiltViewModel class CalendarViewModel @Inject constructor( - private val scrapRepository: ScrapRepository + private val calendarRepository: CalendarRepository ) : ViewModel() { private var _selectedDate:MutableStateFlow = MutableStateFlow( @@ -83,7 +83,7 @@ class CalendarViewModel @Inject constructor( year: Int, month: Int ) = viewModelScope.launch { withContext(Dispatchers.IO) { - scrapRepository.getScrapMonth(year, month) + calendarRepository.getScrapMonth(year, month) }.fold( onSuccess = { _scrapCalendarState.update { currentState -> diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt index dad61a86e..59eaabcb4 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey150 import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.extension.isToday -import com.terning.domain.entity.response.ScrapModel +import com.terning.domain.entity.response.CalendarScrapModel import com.terning.feature.calendar.calendar.CalendarUiState import com.terning.feature.calendar.month.component.CalendarDay import com.terning.feature.calendar.month.model.MonthData @@ -27,7 +27,7 @@ fun CalendarMonth( monthData: MonthData, onDateSelected: (LocalDate) -> Unit, calendarUiState: CalendarUiState, - scrapMap: Map> = mapOf() + scrapMap: Map> = mapOf() ) { Column( modifier = modifier diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index 4e36aefca..d6ff63ad9 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import com.terning.core.designsystem.theme.White import com.terning.core.state.UiState -import com.terning.domain.entity.response.ScrapModel +import com.terning.domain.entity.response.CalendarScrapModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage import com.terning.feature.calendar.calendar.CalendarViewModel @@ -66,7 +66,7 @@ fun HorizontalCalendar( pages: Int, listState: LazyListState, calendarUiState: CalendarUiState, - scrapMap: Map>, + scrapMap: Map>, onDateSelected: (LocalDate) -> Unit, modifier: Modifier = Modifier, ) { diff --git a/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt b/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt index c332a75a9..49e1058a4 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt @@ -1,8 +1,8 @@ package com.terning.feature.calendar.month import com.terning.core.state.UiState -import com.terning.domain.entity.response.ScrapModel +import com.terning.domain.entity.response.CalendarScrapModel data class ScrapCalendarState ( - val loadState: UiState>> = UiState.Loading + val loadState: UiState>> = UiState.Loading ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarMonthScrap.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarMonthScrap.kt index c07a9ea52..900bf6d5a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarMonthScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarMonthScrap.kt @@ -15,12 +15,12 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White -import com.terning.domain.entity.response.ScrapModel +import com.terning.domain.entity.response.CalendarScrapModel @Composable fun CalendarScrapStrip( modifier: Modifier = Modifier, - scrapLists: List + scrapLists: List ) { LazyColumn( modifier = modifier.fillMaxWidth() From 5302933e02d049876bc734b7b580bc47f0d79b92 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 00:41:35 +0900 Subject: [PATCH 30/43] =?UTF-8?q?[FEAT/#91]=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/terning/point/di/DataSourceModule.kt | 8 +++----- .../main/java/com/terning/point/di/RepositoryModule.kt | 6 +++--- app/src/main/java/com/terning/point/di/ServiceModule.kt | 6 ++++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/terning/point/di/DataSourceModule.kt b/app/src/main/java/com/terning/point/di/DataSourceModule.kt index 1c395b630..46a21ec83 100644 --- a/app/src/main/java/com/terning/point/di/DataSourceModule.kt +++ b/app/src/main/java/com/terning/point/di/DataSourceModule.kt @@ -1,11 +1,9 @@ package com.terning.point.di import com.terning.data.datasource.MockDataSource -import com.terning.data.datasource.ScrapDataSource +import com.terning.data.datasource.CalendarDataSource import com.terning.data.datasourceimpl.MockDataSourceImpl -import com.terning.data.datasourceimpl.ScrapDataSourceImpl -import com.terning.data.repositoryimpl.ScrapRepositoryImpl -import com.terning.domain.repository.ScrapRepository +import com.terning.data.datasourceimpl.CalendarDataSourceImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -18,7 +16,7 @@ abstract class DataSourceModule { @Binds @Singleton - abstract fun bindScrapRepository(scrapDataSourceImpl: ScrapDataSourceImpl): ScrapDataSource + abstract fun bindCalendarRepository(calendarDataSourceImpl: CalendarDataSourceImpl): CalendarDataSource @Binds @Singleton diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index 9aa69d3a6..54c54b317 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,9 +1,9 @@ package com.terning.point.di import com.terning.data.repositoryimpl.MockRepositoryImpl -import com.terning.data.repositoryimpl.ScrapRepositoryImpl +import com.terning.data.repositoryimpl.CalendarRepositoryImpl import com.terning.domain.repository.MockRepository -import com.terning.domain.repository.ScrapRepository +import com.terning.domain.repository.CalendarRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -16,7 +16,7 @@ abstract class RepositoryModule { @Binds @Singleton - abstract fun scrapRepository(scrapRepositoryImpl: ScrapRepositoryImpl): ScrapRepository + abstract fun calendarRepository(calendarRepositoryImpl: CalendarRepositoryImpl): CalendarRepository @Binds @Singleton diff --git a/app/src/main/java/com/terning/point/di/ServiceModule.kt b/app/src/main/java/com/terning/point/di/ServiceModule.kt index 317c02f92..1c5c7297d 100644 --- a/app/src/main/java/com/terning/point/di/ServiceModule.kt +++ b/app/src/main/java/com/terning/point/di/ServiceModule.kt @@ -1,5 +1,6 @@ package com.terning.point.di +import com.terning.data.service.CalendarService import com.terning.data.service.MockService import com.terning.point.di.qualifier.OPEN import dagger.Module @@ -18,4 +19,9 @@ object ServiceModule { fun provideMockService(@OPEN retrofit: Retrofit): MockService = retrofit.create(MockService::class.java) + @Provides + @Singleton + fun provideCalendarService(@OPEN retrofit: Retrofit): CalendarService = + retrofit.create(CalendarService::class.java) + } \ No newline at end of file From 3565d93f674df452592b2103b5eecf84902f882b Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 00:58:01 +0900 Subject: [PATCH 31/43] =?UTF-8?q?[FEAT/#91]=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/CalendarDataSource.kt | 6 ++-- .../datasourceimpl/CalendarDataSourceImpl.kt | 25 ++++++---------- .../data/datasourceimpl/CalendarList.kt | 30 +++++++++++++++++++ 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt index be62daa3a..209f50efe 100644 --- a/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt @@ -1,12 +1,14 @@ package com.terning.data.datasource import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto import com.terning.data.dto.response.CalendarListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto interface CalendarDataSource { - suspend fun getScrapMonth(request: CalendarMonthRequestDto): BaseResponse> - suspend fun getScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> + suspend fun getCalendarMonth(request: CalendarMonthRequestDto): BaseResponse> + suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> + suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt index 4a219bd54..6fe5bcfd4 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt @@ -1,31 +1,24 @@ package com.terning.data.datasourceimpl import com.terning.data.datasource.CalendarDataSource -import com.terning.data.datasourceimpl.CalendarList.getMockScrapList import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto import com.terning.data.dto.response.CalendarListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto +import com.terning.data.service.CalendarService import javax.inject.Inject class CalendarDataSourceImpl @Inject constructor( - + private val calendarService: CalendarService ) : CalendarDataSource { - override suspend fun getScrapMonth(request: CalendarMonthRequestDto): BaseResponse> = - BaseResponse( - status = 200, - message = "캘린더 > (월간) 스크랩 된 공고 정보 (리스트) 불러오기를 성공했습니다", - result = getMockScrapList(request.year, request.month) - ) - - override suspend fun getScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> { - return BaseResponse( - status = 200, - message = "캘린더 > (월간) 스크랩 된 공고 정보 (리스트) 불러오기를 성공했습니다", - result = getMockScrapDetailList(request.year, request.month) - ) - } + override suspend fun getCalendarMonth(request: CalendarMonthRequestDto): BaseResponse> = + CalendarList.getCalendarScrapMonth(request) + override suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> = + CalendarList.getCalendarScrapMonthList(request) + override suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> = + CalendarList.getCalendarScrapDayList(request) } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt index be7d920b9..19aec20db 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt @@ -1,10 +1,36 @@ package com.terning.data.datasourceimpl +import com.terning.data.dto.BaseResponse +import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto +import com.terning.data.dto.request.CalendarMonthRequestDto import com.terning.data.dto.response.CalendarListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto object CalendarList { + fun getCalendarScrapMonth(request: CalendarMonthRequestDto): BaseResponse> = + BaseResponse( + status = 200, + message = "캘린더 > (월간) 스크랩 된 공고 정보 불러오기를 성공했습니다", + result = getMockScrapList(request.year, request.month) + ) + + fun getCalendarScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> = + BaseResponse( + status = 200, + message = "캘린더 > (월간) 스크랩 된 공고 정보 불러오기를 성공했습니다", + result = getMockScrapDetailList(request.year, request.month) + ) + + fun getCalendarScrapDayList(requestDto: CalendarDayListRequestDto): BaseResponse> = + BaseResponse( + status = 200, + message = "캘린더 > (일간) 스크랩 된 공고 정보 불러오기를 성공했습니다", + result = getMockDayList(requestDto.date) + ) + + + fun getMockScrapList(year: Int, month: Int): List { val deadline = month.toString().padStart(2, '0') return when (month % 4) { @@ -790,3 +816,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List } } } + +/******************DayList******************/ + +fun getMockDayList(request: String): List = listOf() From 2db05f0ba101060a72e515fdfb81fe35bb84e223 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 01:23:37 +0900 Subject: [PATCH 32/43] =?UTF-8?q?[FEAT/#91]=20=EB=A0=88=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/CalendarDataSource.kt | 7 +- .../datasourceimpl/CalendarDataSourceImpl.kt | 7 +- .../data/datasourceimpl/CalendarList.kt | 113 +++++++++--------- .../response/CalendarDayListResponseDto.kt | 42 +++++++ ...Dto.kt => CalendarMonthListResponseDto.kt} | 5 +- .../repositoryimpl/CalendarRepositoryImpl.kt | 60 ++++++++-- .../terning/data/service/CalendarService.kt | 6 +- .../response/CalendarScrapDetailModel.kt | 3 +- .../domain/repository/CalendarRepository.kt | 3 + 9 files changed, 169 insertions(+), 77 deletions(-) create mode 100644 data/src/main/java/com/terning/data/dto/response/CalendarDayListResponseDto.kt rename data/src/main/java/com/terning/data/dto/response/{CalendarListResponseDto.kt => CalendarMonthListResponseDto.kt} (92%) diff --git a/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt index 209f50efe..609019fa8 100644 --- a/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt +++ b/data/src/main/java/com/terning/data/datasource/CalendarDataSource.kt @@ -4,11 +4,12 @@ import com.terning.data.dto.BaseResponse import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto -import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarDayListResponseDto +import com.terning.data.dto.response.CalendarMonthListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto interface CalendarDataSource { suspend fun getCalendarMonth(request: CalendarMonthRequestDto): BaseResponse> - suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> - suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> + suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> + suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt index 6fe5bcfd4..eddcecef0 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarDataSourceImpl.kt @@ -5,7 +5,8 @@ import com.terning.data.dto.BaseResponse import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto -import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarDayListResponseDto +import com.terning.data.dto.response.CalendarMonthListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto import com.terning.data.service.CalendarService import javax.inject.Inject @@ -16,9 +17,9 @@ class CalendarDataSourceImpl @Inject constructor( override suspend fun getCalendarMonth(request: CalendarMonthRequestDto): BaseResponse> = CalendarList.getCalendarScrapMonth(request) - override suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> = + override suspend fun getCalendarMonthList(request: CalendarMonthListRequestDto): BaseResponse> = CalendarList.getCalendarScrapMonthList(request) - override suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> = + override suspend fun getCalendarDayList(request: CalendarDayListRequestDto): BaseResponse> = CalendarList.getCalendarScrapDayList(request) } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt index 19aec20db..a61cc128e 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt @@ -4,7 +4,8 @@ import com.terning.data.dto.BaseResponse import com.terning.data.dto.request.CalendarDayListRequestDto import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto -import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarDayListResponseDto +import com.terning.data.dto.response.CalendarMonthListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto object CalendarList { @@ -15,14 +16,14 @@ object CalendarList { result = getMockScrapList(request.year, request.month) ) - fun getCalendarScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> = + fun getCalendarScrapMonthList(request: CalendarMonthListRequestDto): BaseResponse> = BaseResponse( status = 200, message = "캘린더 > (월간) 스크랩 된 공고 정보 불러오기를 성공했습니다", result = getMockScrapDetailList(request.year, request.month) ) - fun getCalendarScrapDayList(requestDto: CalendarDayListRequestDto): BaseResponse> = + fun getCalendarScrapDayList(requestDto: CalendarDayListRequestDto): BaseResponse> = BaseResponse( status = 200, message = "캘린더 > (일간) 스크랩 된 공고 정보 불러오기를 성공했습니다", @@ -329,15 +330,15 @@ object CalendarList { /*************************MockDataType***************************/ -fun getMockScrapDetailList(year: Int, month: Int): List { +fun getMockScrapDetailList(year: Int, month: Int): List { val deadline = month.toString().padStart(2, '0') return when (month % 4) { 0 -> { listOf( - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-13", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 1, title = "제목1", color = "#FFED4E54", @@ -348,7 +349,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 2, title = "제목2", color = "#FFC4E953", @@ -359,7 +360,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 3, title = "제목3", color = "#FF9B64E2", @@ -370,7 +371,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 4, title = "제목4", color = "#FFF260AC", @@ -383,10 +384,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-17", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 5, title = "제목5", color = "#FFC4E953", @@ -397,7 +398,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 6, title = "제목6", color = "#FF45D0CC", @@ -410,10 +411,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ), ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-23", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 7, title = "제목7", color = "#FF5397F3", @@ -426,10 +427,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-30", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 8, title = "제목8", color = "#FF45D0CC", @@ -447,10 +448,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List 1 -> { listOf( - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-01", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 9, title = "제목9", color = "#FFED4E54", @@ -461,7 +462,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 10, title = "제목10", color = "#FFC4E953", @@ -472,7 +473,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 11, title = "제목11", color = "#FF9B64E2", @@ -483,7 +484,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 12, title = "제목12", color = "#FFF260AC", @@ -496,10 +497,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-02", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 13, title = "제목13", color = "#FFC4E953", @@ -510,7 +511,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 14, title = "제목14", color = "#FF9B64E2", @@ -521,7 +522,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 15, title = "제목15", color = "#FFED4E54", @@ -532,7 +533,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 16, title = "제목16", color = "#FFF260AC", @@ -545,10 +546,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-12", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 17, title = "제목17", color = "#FFC4E953", @@ -559,7 +560,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 18, title = "제목18", color = "#FF45D0CC", @@ -572,10 +573,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ), ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-27", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 19, title = "제목19", color = "#FF5397F3", @@ -588,10 +589,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-29", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 20, title = "제목20", color = "#FF45D0CC", @@ -609,10 +610,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List 2 -> { listOf( - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-02", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 21, title = "제목1", color = "#FFED4E54", @@ -623,7 +624,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 22, title = "제목22", color = "#FFC4E953", @@ -634,7 +635,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 23, title = "제목23", color = "#FF9B64E2", @@ -645,7 +646,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 24, title = "제목24", color = "#FFF260AC", @@ -658,10 +659,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-18", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 25, title = "제목25", color = "#FFC4E953", @@ -672,7 +673,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 26, title = "제목26", color = "#FF45D0CC", @@ -685,10 +686,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ), ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-20", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 27, title = "제목27", color = "#FF5397F3", @@ -701,10 +702,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-29", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 28, title = "제목28", color = "#FF45D0CC", @@ -722,10 +723,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List 3 -> { listOf( - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-05", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 29, title = "제목29", color = "#FFED4E54", @@ -736,7 +737,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 30, title = "제목30", color = "#FFC4E953", @@ -749,10 +750,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-11", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 31, title = "제목31", color = "#FFC4E953", @@ -763,7 +764,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List startYear = 2024, startMonth = 8 ), - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 32, title = "제목32", color = "#FF45D0CC", @@ -776,10 +777,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ), ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-19", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 33, title = "제목33", color = "#FF5397F3", @@ -792,10 +793,10 @@ fun getMockScrapDetailList(year: Int, month: Int): List ) ) ), - CalendarListResponseDto( + CalendarMonthListResponseDto( deadline = "${year}-${deadline}-28", scraps = listOf( - CalendarListResponseDto.Scrap( + CalendarMonthListResponseDto.Scrap( scrapId = 34, title = "제목34", color = "#FF45D0CC", @@ -819,4 +820,4 @@ fun getMockScrapDetailList(year: Int, month: Int): List /******************DayList******************/ -fun getMockDayList(request: String): List = listOf() +fun getMockDayList(request: String): List = listOf() diff --git a/data/src/main/java/com/terning/data/dto/response/CalendarDayListResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/CalendarDayListResponseDto.kt new file mode 100644 index 000000000..e2d23afb1 --- /dev/null +++ b/data/src/main/java/com/terning/data/dto/response/CalendarDayListResponseDto.kt @@ -0,0 +1,42 @@ +package com.terning.data.dto.response + +import com.terning.domain.entity.response.CalendarScrapDetailModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CalendarDayListResponseDto( + @SerialName("scrapId") + val scrapId: Long, + @SerialName("internshipAnnouncementId") + val internshipAnnouncementId: Long, + @SerialName("title") + val title: String, + @SerialName("dDay") + val dDay: String, + @SerialName("workingPeriod") + val workingPeriod: String, + @SerialName("color") + val color: String, + @SerialName("companyImage") + val companyImage: String, + @SerialName("startYear") + val startYear: Int, + @SerialName("startMonth") + val startMonth: Int +){ + fun toScrapDetailModelList(): CalendarScrapDetailModel = + CalendarScrapDetailModel( + scrapId = scrapId, + internshipAnnouncementId = internshipAnnouncementId, + title = title, + dDay = dDay, + workingPeriod = workingPeriod, + color = color, + companyImage = companyImage, + startYear = startYear, + startMonth = startMonth, + deadLine = "" + ) + +} \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/CalendarMonthListResponseDto.kt similarity index 92% rename from data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt rename to data/src/main/java/com/terning/data/dto/response/CalendarMonthListResponseDto.kt index 16e426a60..1aa7ac882 100644 --- a/data/src/main/java/com/terning/data/dto/response/CalendarListResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/CalendarMonthListResponseDto.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class CalendarListResponseDto( +data class CalendarMonthListResponseDto( @SerialName("deadline") val deadline: String, @SerialName("scraps") @@ -43,7 +43,8 @@ data class CalendarListResponseDto( color = scrap.color, companyImage = scrap.companyImage, startYear = scrap.startYear, - startMonth = scrap.startMonth + startMonth = scrap.startMonth, + deadLine = deadline ) } } \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt index 1264b2d7d..6968766e7 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt @@ -1,27 +1,69 @@ package com.terning.data.repositoryimpl import com.terning.data.datasource.CalendarDataSource +import com.terning.data.dto.request.CalendarDayListRequestDto +import com.terning.data.dto.request.CalendarMonthListRequestDto import com.terning.data.dto.request.CalendarMonthRequestDto +import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.entity.response.CalendarScrapModel import com.terning.domain.repository.CalendarRepository import javax.inject.Inject class CalendarRepositoryImpl @Inject constructor( private val calendarDataSource: CalendarDataSource -): CalendarRepository { - override suspend fun getScrapMonth(year: Int, month: Int): Result>> = +) : CalendarRepository { + override suspend fun getScrapMonth( + year: Int, + month: Int + ): Result>> = runCatching { - val result = calendarDataSource.getScrapMonth( - request = CalendarMonthRequestDto( - year = year, - month = month - ) + val result = calendarDataSource.getCalendarMonth( + request = CalendarMonthRequestDto( + year = year, + month = month + ) ).result - val scrapModelMapByDeadLine = result.flatMap{ dto -> + val scrapModelMapByDeadLine = result.flatMap { dto -> dto.toScrapModelList() }.groupBy { it.deadLine } scrapModelMapByDeadLine } -} \ No newline at end of file + + override suspend fun getScrapMonthList( + year: Int, + month: Int + ): Result>> = + runCatching { + val result = calendarDataSource.getCalendarMonthList( + request = CalendarMonthListRequestDto( + year = year, + month = month + ) + ).result + + val scrapModelMapByDeadLine = result.flatMap { dto -> + dto.toScrapDetailModelList() + }.groupBy { it.deadLine } + + scrapModelMapByDeadLine + } + + override suspend fun getScrapDayList( + year: Int, + month: Int, + day: Int + ): Result> = + runCatching { + val monthString = month.toString().padStart(2, '0') + val request = CalendarDayListRequestDto("$year-$monthString-$day") + val response = calendarDataSource.getCalendarDayList(request) + val scrapModelList = response.result.map { scrap -> + scrap.toScrapDetailModelList() + } + scrapModelList + } + + +} diff --git a/data/src/main/java/com/terning/data/service/CalendarService.kt b/data/src/main/java/com/terning/data/service/CalendarService.kt index a28e7a443..57a21408e 100644 --- a/data/src/main/java/com/terning/data/service/CalendarService.kt +++ b/data/src/main/java/com/terning/data/service/CalendarService.kt @@ -1,7 +1,7 @@ package com.terning.data.service import com.terning.data.dto.BaseResponse -import com.terning.data.dto.response.CalendarListResponseDto +import com.terning.data.dto.response.CalendarMonthListResponseDto import com.terning.data.dto.response.CalendarMonthResponseDto import retrofit2.http.GET import retrofit2.http.Query @@ -17,12 +17,12 @@ interface CalendarService{ suspend fun getCalendarScrapMonthList( @Query("year") year: Int, @Query("month") month: Int - ): BaseResponse> + ): BaseResponse> @GET("/api/v1/calendar/daily") suspend fun getCalendarScrapDayList( @Query("year") year: Int, @Query("month") month: Int, @Query("day") day: Int - ): BaseResponse> + ): BaseResponse> } \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt index ed48cf0e7..23fe46357 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt @@ -9,5 +9,6 @@ data class CalendarScrapDetailModel( val color: String, val companyImage: String, val startYear: Int, - val startMonth: Int + val startMonth: Int, + val deadLine: String ) diff --git a/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt index f69338cb5..d6adeb490 100644 --- a/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt @@ -1,7 +1,10 @@ package com.terning.domain.repository +import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.entity.response.CalendarScrapModel interface CalendarRepository{ suspend fun getScrapMonth(year: Int, month: Int): Result>> + suspend fun getScrapMonthList(year: Int, month: Int): Result>> + suspend fun getScrapDayList(year: Int, month: Int, day: Int): Result> } \ No newline at end of file From 79a3ed2323fddbe39306b9aae9e066a0c2bedd58 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 01:25:16 +0900 Subject: [PATCH 33/43] =?UTF-8?q?[RENAME/#91]=20State=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/calendar/calendar/CalendarViewModel.kt | 8 ++++---- .../{ScrapCalendarState.kt => CalendarMonthState.kt} | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename feature/src/main/java/com/terning/feature/calendar/month/{ScrapCalendarState.kt => CalendarMonthState.kt} (87%) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 854707f6a..5af16f9df 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -12,7 +12,7 @@ import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState import com.terning.domain.repository.CalendarRepository import com.terning.feature.R -import com.terning.feature.calendar.month.ScrapCalendarState +import com.terning.feature.calendar.month.CalendarMonthState import com.terning.feature.calendar.scrap.model.Scrap import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -40,8 +40,8 @@ class CalendarViewModel @Inject constructor( val selectedDate get() = _selectedDate.asStateFlow() - private val _scrapCalendarState = MutableStateFlow(ScrapCalendarState()) - val scrapCalendarState = _scrapCalendarState.asStateFlow() + private val _CalendarMonthState = MutableStateFlow(CalendarMonthState()) + val scrapCalendarState = _CalendarMonthState.asStateFlow() private val _calendarSideEffect:MutableSharedFlow = MutableSharedFlow() val calendarSideEffect = _calendarSideEffect.asSharedFlow() @@ -86,7 +86,7 @@ class CalendarViewModel @Inject constructor( calendarRepository.getScrapMonth(year, month) }.fold( onSuccess = { - _scrapCalendarState.update { currentState -> + _CalendarMonthState.update { currentState -> currentState.copy( loadState = UiState.Success(it) ) diff --git a/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthState.kt similarity index 87% rename from feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt rename to feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthState.kt index 49e1058a4..acd6b1bde 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/ScrapCalendarState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthState.kt @@ -3,6 +3,6 @@ package com.terning.feature.calendar.month import com.terning.core.state.UiState import com.terning.domain.entity.response.CalendarScrapModel -data class ScrapCalendarState ( +data class CalendarMonthState ( val loadState: UiState>> = UiState.Loading ) \ No newline at end of file From 88684e75fc6febf4cd20740485ead852c62ec1f3 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 01:34:03 +0900 Subject: [PATCH 34/43] =?UTF-8?q?[FEAT/#91]=20=EB=B7=B0=EB=AA=A8=EB=8D=B8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarViewModel.kt | 36 +++++++++++++++++-- .../calendar/month/CalendarMonthScreen.kt | 2 +- .../calendar/scrap/CalendarListState.kt | 8 +++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListState.kt diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 5af16f9df..7d89f652b 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -10,9 +10,11 @@ import com.terning.core.designsystem.theme.CalPurple import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState +import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.repository.CalendarRepository import com.terning.feature.R import com.terning.feature.calendar.month.CalendarMonthState +import com.terning.feature.calendar.scrap.CalendarListState import com.terning.feature.calendar.scrap.model.Scrap import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -40,8 +42,11 @@ class CalendarViewModel @Inject constructor( val selectedDate get() = _selectedDate.asStateFlow() - private val _CalendarMonthState = MutableStateFlow(CalendarMonthState()) - val scrapCalendarState = _CalendarMonthState.asStateFlow() + private val _calendarMonthState = MutableStateFlow(CalendarMonthState()) + val calendarMonthState = _calendarMonthState.asStateFlow() + + private val _calendarListState = MutableStateFlow(CalendarListState()) + val calendarListState = _calendarListState.asStateFlow() private val _calendarSideEffect:MutableSharedFlow = MutableSharedFlow() val calendarSideEffect = _calendarSideEffect.asSharedFlow() @@ -86,7 +91,7 @@ class CalendarViewModel @Inject constructor( calendarRepository.getScrapMonth(year, month) }.fold( onSuccess = { - _CalendarMonthState.update { currentState -> + _calendarMonthState.update { currentState -> currentState.copy( loadState = UiState.Success(it) ) @@ -99,6 +104,31 @@ class CalendarViewModel @Inject constructor( ) } + fun getScrapMonthList( + year: Int, month: Int + ) = viewModelScope.launch { + withContext(Dispatchers.IO) { + calendarRepository.getScrapMonthList(year, month) + }.fold( + onSuccess = { + _calendarListState.update { currentState -> + currentState.copy( + loadState = UiState.Success(it) + ) + } + }, + onFailure = { + _calendarListState.update { currentState -> + currentState.copy( + loadState = UiState.Failure(it.message.toString()) + ) + + } + _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_failure)) + } + ) + } + //To be erased in future val mockScrapList: List> diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index d6ff63ad9..b9a931ce1 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -31,7 +31,7 @@ fun CalendarMonthScreen( modifier: Modifier = Modifier, viewModel: CalendarViewModel = hiltViewModel() ) { - val scrapState by viewModel.scrapCalendarState.collectAsState() + val scrapState by viewModel.calendarMonthState.collectAsState() LaunchedEffect(key1 = listState) { snapshotFlow { listState.firstVisibleItemIndex } diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListState.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListState.kt new file mode 100644 index 000000000..958a020e8 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListState.kt @@ -0,0 +1,8 @@ +package com.terning.feature.calendar.scrap + +import com.terning.core.state.UiState +import com.terning.domain.entity.response.CalendarScrapDetailModel + +data class CalendarListState ( + val loadState: UiState>> = UiState.Loading +) \ No newline at end of file From 55be60d7cc1a5f048a9cc3a20b1376a3c5c0cec7 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 02:29:33 +0900 Subject: [PATCH 35/43] =?UTF-8?q?[FEAT/#91]=20=EC=9B=94=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/core/extension/Map.kt | 3 + .../response/CalendarScrapDetailModel.kt | 3 +- .../calendar/calendar/CalendarRoute.kt | 1 + .../calendar/month/CalendarMonthScreen.kt | 31 +++- .../calendar/scrap/CalendarScrapList.kt | 150 ++++++++++++++---- .../calendar/scrap/component/CalendarScrap.kt | 24 +++ 6 files changed, 170 insertions(+), 42 deletions(-) create mode 100644 core/src/main/java/com/terning/core/extension/Map.kt diff --git a/core/src/main/java/com/terning/core/extension/Map.kt b/core/src/main/java/com/terning/core/extension/Map.kt new file mode 100644 index 000000000..fab779e23 --- /dev/null +++ b/core/src/main/java/com/terning/core/extension/Map.kt @@ -0,0 +1,3 @@ +package com.terning.core.extension + +fun List?.isListNotEmpty():Boolean = this.orEmpty().isNotEmpty() diff --git a/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt index 23fe46357..881c4623b 100644 --- a/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt +++ b/domain/src/main/java/com/terning/domain/entity/response/CalendarScrapDetailModel.kt @@ -10,5 +10,6 @@ data class CalendarScrapDetailModel( val companyImage: String, val startYear: Int, val startMonth: Int, - val deadLine: String + val deadLine: String, + val isScrapped: Boolean = true ) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index d6b1135c5..5730d7d85 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -186,6 +186,7 @@ fun CalendarScreen( scrapList = viewModel.mockScrapList, listState = listState, pages = state.getPageCount(), + viewModel = viewModel, modifier = Modifier .fillMaxSize() .padding(top = paddingValues.calculateTopPadding()) diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index b9a931ce1..aa7511daf 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -48,14 +48,29 @@ fun CalendarMonthScreen( UiState.Empty -> {} is UiState.Failure -> {} is UiState.Success -> { - HorizontalCalendar( - pages = pages, - modifier = modifier, - calendarUiState = calendarUiState, - onDateSelected = onDateSelected, - listState = listState, - scrapMap = (scrapState.loadState as UiState.Success).data - ) + val scrapMap = (scrapState.loadState as UiState.Success).data + LazyRow( + modifier = modifier + .background(White), + state = listState, + userScrollEnabled = true, + flingBehavior = flingBehavior( + state = listState + ) + ) { + items(pages) { page -> + val date = getDateByPage(page) + val monthData = MonthData(YearMonth.of(date.year, date.month)) + + CalendarMonth( + modifier = Modifier.fillParentMaxSize(), + calendarUiState = calendarUiState, + onDateSelected = onDateSelected, + monthData = monthData, + scrapMap = scrapMap + ) + } + } } } } diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt index 099df3971..2b732d1df 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt @@ -14,63 +14,99 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.getDateStringInKorean +import com.terning.core.extension.isListNotEmpty +import com.terning.core.state.UiState +import com.terning.domain.entity.response.CalendarScrapDetailModel +import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage import com.terning.feature.calendar.scrap.component.CalendarScrap import com.terning.feature.calendar.scrap.model.Scrap +import kotlinx.coroutines.flow.distinctUntilChanged import java.time.LocalDate +import java.time.format.DateTimeFormatter @Composable fun CalendarScrapList( scrapList: List>, pages: Int, listState: LazyListState, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + viewModel: CalendarViewModel = hiltViewModel() ) { - LazyRow( - modifier = modifier - .background(White), - state = listState, - userScrollEnabled = true, - flingBehavior = flingBehavior( - state = listState - ) - ) { - items(pages) { page -> - val getDate = getDateByPage(page) + val lifecycleOwner = LocalLifecycleOwner.current + val scrapState by viewModel.calendarListState.collectAsStateWithLifecycle(lifecycleOwner) + + LaunchedEffect(key1 = listState) { + snapshotFlow { listState.firstVisibleItemIndex } + .distinctUntilChanged() + .collect { + val page = listState.firstVisibleItemIndex + val date = getDateByPage(page) + viewModel.getScrapMonthList(date.year, date.monthValue) + } + } - LazyColumn( - modifier = Modifier - .fillParentMaxWidth() - .fillMaxHeight() - .background(Back) + when (scrapState.loadState) { + UiState.Loading -> {} + UiState.Empty -> {} + is UiState.Failure -> {} + is UiState.Success -> { + val scrapMap = (scrapState.loadState as UiState.Success).data + + LazyRow( + modifier = modifier + .background(White), + state = listState, + userScrollEnabled = true, + flingBehavior = flingBehavior( + state = listState + ) ) { - items(scrapList.size) { day -> - runCatching { - LocalDate.of(getDate.year, getDate.monthValue, day + 1) - }.onSuccess { - CalendarScrapList( - selectedDate = it, - scrapLists = scrapList, - isFromList = true, - noScrapScreen = {}) + items(pages) { page -> + val getDate = getDateByPage(page) + + LazyColumn( + modifier = Modifier + .fillParentMaxWidth() + .fillMaxHeight() + .background(Back) + ) { + items(scrapList.size) { day -> + runCatching { + LocalDate.of(getDate.year, getDate.monthValue, day + 1) + }.onSuccess { + CalendarScrapList( + selectedDate = it, + //scrapLists = scrapList, + scrapMap = scrapMap, + isFromList = true, + noScrapScreen = {}) - if (scrapList[day].isNotEmpty()) { - Spacer( - modifier = Modifier - .height(4.dp) - .fillMaxWidth() - .background(Grey200) - ) + if (scrapList[day].isNotEmpty()) { + Spacer( + modifier = Modifier + .height(4.dp) + .fillMaxWidth() + .background(Grey200) + ) + } + } } } } @@ -123,3 +159,51 @@ fun CalendarScrapList( } } } + +@Composable +fun CalendarScrapList( + selectedDate: LocalDate, + scrapMap: Map>, + isFromList: Boolean = false, + noScrapScreen: @Composable () -> Unit +) { + val scrollState = rememberScrollState() + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val scrapList = scrapMap[selectedDate.format(formatter)] + + if (scrapList.isListNotEmpty()) { + Text( + text = selectedDate.getDateStringInKorean(), + style = TerningTheme.typography.title5, + color = Black, + modifier = Modifier.padding(start = 24.dp, top = 16.dp, bottom = 15.dp) + ) + } + val topModifier = if (!isFromList) { + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .verticalScroll(scrollState) + } else { + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + } + + if (!scrapList.isListNotEmpty()) { + noScrapScreen() + } else { + Column( + modifier = topModifier + ) { + for (scrap in scrapMap[selectedDate.format(formatter)].orEmpty()) { + CalendarScrap( + scrap = scrap + ) + Spacer( + modifier = Modifier.height(12.dp) + ) + } + } + } +} diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt index 2989c59f7..538c2737f 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt @@ -2,9 +2,12 @@ package com.terning.feature.calendar.scrap.component import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.dp import com.terning.core.designsystem.component.item.InternItem import com.terning.core.designsystem.component.item.ScrapBox +import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.feature.calendar.scrap.model.Scrap @Composable @@ -26,4 +29,25 @@ fun CalendarScrap( isScraped = scrap.isScraped ) } +} + +@Composable +fun CalendarScrap( + scrap: CalendarScrapDetailModel, + modifier: Modifier = Modifier, +) { + ScrapBox( + modifier = modifier, + cornerRadius = 10.dp, + scrapColor = Color(android.graphics.Color.parseColor(scrap.color)), + elevation = 1.dp, + ) { + InternItem( + imageUrl = scrap.companyImage.orEmpty(), + title = scrap.title, + dateDeadline = scrap.dDay, + workingPeriod = scrap.workingPeriod, + isScraped = scrap.isScrapped + ) + } } \ No newline at end of file From b64665bf2fcd39b7586296ef562f46424816bb62 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 03:20:15 +0900 Subject: [PATCH 36/43] =?UTF-8?q?[CHORE/#91]=20=EC=9B=94=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/core/extension/LocalDateExt.kt | 6 ++++ .../calendar/scrap/CalendarScrapList.kt | 34 ++++++++++--------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/terning/core/extension/LocalDateExt.kt b/core/src/main/java/com/terning/core/extension/LocalDateExt.kt index 702ea1182..1f8d4355f 100644 --- a/core/src/main/java/com/terning/core/extension/LocalDateExt.kt +++ b/core/src/main/java/com/terning/core/extension/LocalDateExt.kt @@ -1,6 +1,7 @@ package com.terning.core.extension import java.time.LocalDate +import java.time.format.DateTimeFormatter import java.time.format.TextStyle import java.util.Locale @@ -10,6 +11,11 @@ fun LocalDate.getStringAsTitle(): String = fun LocalDate.getDateStringInKorean(): String = "${monthValue}월 ${dayOfMonth}일 ${dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN)}" +fun LocalDate.getDateAsMapString(): String { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + return format(formatter) +} + fun LocalDate.getWeekIndexContainingSelectedDate(inDays: Int): Int = (inDays + dayOfMonth - 1) / 7 fun LocalDate.isToday(): Boolean = this == LocalDate.now() \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt index 2b732d1df..c25159f84 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt @@ -1,9 +1,11 @@ package com.terning.feature.calendar.scrap import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -27,6 +29,7 @@ import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White +import com.terning.core.extension.getDateAsMapString import com.terning.core.extension.getDateStringInKorean import com.terning.core.extension.isListNotEmpty import com.terning.core.state.UiState @@ -37,6 +40,7 @@ import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDa import com.terning.feature.calendar.scrap.component.CalendarScrap import com.terning.feature.calendar.scrap.model.Scrap import kotlinx.coroutines.flow.distinctUntilChanged +import timber.log.Timber import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -62,7 +66,9 @@ fun CalendarScrapList( } when (scrapState.loadState) { - UiState.Loading -> {} + UiState.Loading -> { + Box(modifier = Modifier.background(color = White).fillMaxSize()) + } UiState.Empty -> {} is UiState.Failure -> {} is UiState.Success -> { @@ -86,26 +92,18 @@ fun CalendarScrapList( .fillMaxHeight() .background(Back) ) { - items(scrapList.size) { day -> - runCatching { - LocalDate.of(getDate.year, getDate.monthValue, day + 1) - }.onSuccess { + items(getDate.lengthOfMonth()) { day -> + val currentDate = LocalDate.of(getDate.year, getDate.monthValue, day+1) + val dateIndex = currentDate.getDateAsMapString() + Timber.tag("CalendarScreen").d(dateIndex) + + if(scrapMap[dateIndex].isListNotEmpty()){ CalendarScrapList( - selectedDate = it, + selectedDate = currentDate, //scrapLists = scrapList, scrapMap = scrapMap, isFromList = true, noScrapScreen = {}) - - - if (scrapList[day].isNotEmpty()) { - Spacer( - modifier = Modifier - .height(4.dp) - .fillMaxWidth() - .background(Grey200) - ) - } } } } @@ -197,6 +195,10 @@ fun CalendarScrapList( modifier = topModifier ) { for (scrap in scrapMap[selectedDate.format(formatter)].orEmpty()) { + Timber.tag("CalendarScreen").d( + " ${scrap}, amount = ${scrapMap[selectedDate.format(formatter)].orEmpty().size}" + ) + CalendarScrap( scrap = scrap ) From 35e5ac28fa562d5897c6fddad1738e6c27ff4342 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 03:32:02 +0900 Subject: [PATCH 37/43] =?UTF-8?q?[CHORE/#91]=20=EC=9B=94=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 11 ++-------- ...crapList.kt => CalendarScrapListScreen.kt} | 22 +++++-------------- .../calendar/week/CalendarWeekWithScrap.kt | 4 ++-- 3 files changed, 9 insertions(+), 28 deletions(-) rename feature/src/main/java/com/terning/feature/calendar/scrap/{CalendarScrapList.kt => CalendarScrapListScreen.kt} (88%) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 5730d7d85..f430fb4f1 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -1,8 +1,6 @@ package com.terning.feature.calendar.calendar import androidx.activity.compose.BackHandler -import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.SizeTransform import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally @@ -11,7 +9,6 @@ import androidx.compose.animation.togetherWith import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold @@ -26,7 +23,6 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow 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 @@ -37,16 +33,14 @@ import androidx.navigation.compose.rememberNavController import com.terning.core.designsystem.component.topappbar.CalendarTopAppBar import com.terning.core.designsystem.theme.Grey200 import com.terning.core.extension.toast -import com.terning.feature.R import com.terning.feature.calendar.calendar.component.ScreenTransition import com.terning.feature.calendar.calendar.component.WeekDaysHeader import com.terning.feature.calendar.calendar.model.CalendarState import com.terning.feature.calendar.month.CalendarMonthScreen -import com.terning.feature.calendar.scrap.CalendarScrapList +import com.terning.feature.calendar.scrap.CalendarScrapListScreen import com.terning.feature.calendar.week.CalendarWeekWithScrap import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch -import java.time.LocalDate import java.time.YearMonth @Composable @@ -182,8 +176,7 @@ fun CalendarScreen( } }, contentTwo = { - CalendarScrapList( - scrapList = viewModel.mockScrapList, + CalendarScrapListScreen( listState = listState, pages = state.getPageCount(), viewModel = viewModel, diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt similarity index 88% rename from feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt rename to feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt index c25159f84..d531823a0 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapList.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt @@ -26,7 +26,6 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Black -import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.getDateAsMapString @@ -40,13 +39,10 @@ import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDa import com.terning.feature.calendar.scrap.component.CalendarScrap import com.terning.feature.calendar.scrap.model.Scrap import kotlinx.coroutines.flow.distinctUntilChanged -import timber.log.Timber import java.time.LocalDate -import java.time.format.DateTimeFormatter @Composable -fun CalendarScrapList( - scrapList: List>, +fun CalendarScrapListScreen( pages: Int, listState: LazyListState, modifier: Modifier = Modifier, @@ -95,13 +91,11 @@ fun CalendarScrapList( items(getDate.lengthOfMonth()) { day -> val currentDate = LocalDate.of(getDate.year, getDate.monthValue, day+1) val dateIndex = currentDate.getDateAsMapString() - Timber.tag("CalendarScreen").d(dateIndex) if(scrapMap[dateIndex].isListNotEmpty()){ CalendarScrapList( selectedDate = currentDate, - //scrapLists = scrapList, - scrapMap = scrapMap, + scrapList = scrapMap[dateIndex].orEmpty(), isFromList = true, noScrapScreen = {}) } @@ -114,7 +108,7 @@ fun CalendarScrapList( } @Composable -fun CalendarScrapList( +fun CalendarScrapListss( selectedDate: LocalDate, scrapLists: List>, isFromList: Boolean = false, @@ -161,13 +155,11 @@ fun CalendarScrapList( @Composable fun CalendarScrapList( selectedDate: LocalDate, - scrapMap: Map>, + scrapList: List, isFromList: Boolean = false, noScrapScreen: @Composable () -> Unit ) { val scrollState = rememberScrollState() - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val scrapList = scrapMap[selectedDate.format(formatter)] if (scrapList.isListNotEmpty()) { Text( @@ -194,11 +186,7 @@ fun CalendarScrapList( Column( modifier = topModifier ) { - for (scrap in scrapMap[selectedDate.format(formatter)].orEmpty()) { - Timber.tag("CalendarScreen").d( - " ${scrap}, amount = ${scrapMap[selectedDate.format(formatter)].orEmpty().size}" - ) - + for (scrap in scrapList) { CalendarScrap( scrap = scrap ) diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt index 6745379f9..d3e27d412 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt @@ -22,7 +22,7 @@ import com.terning.core.designsystem.theme.White import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarUiState import com.terning.feature.calendar.scrap.model.Scrap -import com.terning.feature.calendar.scrap.CalendarScrapList +import com.terning.feature.calendar.scrap.CalendarScrapListss import java.time.LocalDate @Composable @@ -58,7 +58,7 @@ fun CalendarWeekWithScrap( onDateSelected = onDateSelected ) } - CalendarScrapList( + CalendarScrapListss( selectedDate = selectedDate.selectedDate, scrapLists = scrapLists, noScrapScreen = { From 9cf9e7f97d56f5917ccd7715c6d9810a65e0cc05 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 03:42:12 +0900 Subject: [PATCH 38/43] =?UTF-8?q?[FEAT/#91]=20=EC=9D=BC=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repositoryimpl/CalendarRepositoryImpl.kt | 12 ++++----- .../domain/repository/CalendarRepository.kt | 3 ++- .../calendar/calendar/CalendarViewModel.kt | 27 +++++++++++++++++++ .../calendar/week/CalendarWeekState.kt | 8 ++++++ .../calendar/week/CalendarWeekWithScrap.kt | 14 ++++++++++ 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekState.kt diff --git a/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt index 6968766e7..b9e0c308f 100644 --- a/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt +++ b/data/src/main/java/com/terning/data/repositoryimpl/CalendarRepositoryImpl.kt @@ -7,6 +7,8 @@ import com.terning.data.dto.request.CalendarMonthRequestDto import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.entity.response.CalendarScrapModel import com.terning.domain.repository.CalendarRepository +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject class CalendarRepositoryImpl @Inject constructor( @@ -51,19 +53,15 @@ class CalendarRepositoryImpl @Inject constructor( } override suspend fun getScrapDayList( - year: Int, - month: Int, - day: Int + currentDate: LocalDate ): Result> = runCatching { - val monthString = month.toString().padStart(2, '0') - val request = CalendarDayListRequestDto("$year-$monthString-$day") + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val request = CalendarDayListRequestDto(currentDate.format(formatter)) val response = calendarDataSource.getCalendarDayList(request) val scrapModelList = response.result.map { scrap -> scrap.toScrapDetailModelList() } scrapModelList } - - } diff --git a/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt index d6adeb490..2150e6864 100644 --- a/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt +++ b/domain/src/main/java/com/terning/domain/repository/CalendarRepository.kt @@ -2,9 +2,10 @@ package com.terning.domain.repository import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.entity.response.CalendarScrapModel +import java.time.LocalDate interface CalendarRepository{ suspend fun getScrapMonth(year: Int, month: Int): Result>> suspend fun getScrapMonthList(year: Int, month: Int): Result>> - suspend fun getScrapDayList(year: Int, month: Int, day: Int): Result> + suspend fun getScrapDayList(currentDate: LocalDate): Result> } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 7d89f652b..6ef0edf5d 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -16,6 +16,7 @@ import com.terning.feature.R import com.terning.feature.calendar.month.CalendarMonthState import com.terning.feature.calendar.scrap.CalendarListState import com.terning.feature.calendar.scrap.model.Scrap +import com.terning.feature.calendar.week.CalendarWeekState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow @@ -48,6 +49,9 @@ class CalendarViewModel @Inject constructor( private val _calendarListState = MutableStateFlow(CalendarListState()) val calendarListState = _calendarListState.asStateFlow() + private val _calendarWeekState = MutableStateFlow(CalendarWeekState()) + val calendarWeekState = _calendarWeekState.asStateFlow() + private val _calendarSideEffect:MutableSharedFlow = MutableSharedFlow() val calendarSideEffect = _calendarSideEffect.asSharedFlow() @@ -129,6 +133,29 @@ class CalendarViewModel @Inject constructor( ) } + fun getScrapWeekList() = viewModelScope.launch { + withContext(Dispatchers.IO) { + calendarRepository.getScrapDayList(_selectedDate.value.selectedDate) + }.fold( + onSuccess = { + _calendarWeekState.update { currentState -> + currentState.copy( + loadState = UiState.Success(it) + ) + } + }, + onFailure = { + _calendarListState.update { currentState -> + currentState.copy( + loadState = UiState.Failure(it.message.toString()) + ) + + } + _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_failure)) + } + ) + } + //To be erased in future val mockScrapList: List> diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekState.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekState.kt new file mode 100644 index 000000000..8c661ee2e --- /dev/null +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekState.kt @@ -0,0 +1,8 @@ +package com.terning.feature.calendar.week + +import com.terning.core.state.UiState +import com.terning.domain.entity.response.CalendarScrapDetailModel + +data class CalendarWeekState ( + val loadState: UiState> = UiState.Loading +) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt index d3e27d412..fe1ba8b27 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt @@ -14,6 +14,9 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey400 @@ -21,10 +24,21 @@ import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarUiState +import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.scrap.model.Scrap import com.terning.feature.calendar.scrap.CalendarScrapListss import java.time.LocalDate +@Composable +fun CalendarWeekScreen( + modifier: Modifier = Modifier, + viewModel: CalendarViewModel = hiltViewModel() +) { + val lifecycleOwner = LocalLifecycleOwner.current + val uiState = viewModel.selectedDate.collectAsStateWithLifecycle(lifecycleOwner) + +} + @Composable fun CalendarWeekWithScrap( modifier: Modifier = Modifier, From c22a402f1355aca4275b01c5e2bf042998a15932 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 04:16:46 +0900 Subject: [PATCH 39/43] =?UTF-8?q?[CHORE/#91]=20=EC=9D=BC=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasourceimpl/CalendarList.kt | 26 +++- .../calendar/calendar/CalendarRoute.kt | 9 +- .../calendar/calendar/CalendarViewModel.kt | 131 ++---------------- ...WeekWithScrap.kt => CalendarWeekScreen.kt} | 58 +++++--- 4 files changed, 78 insertions(+), 146 deletions(-) rename feature/src/main/java/com/terning/feature/calendar/week/{CalendarWeekWithScrap.kt => CalendarWeekScreen.kt} (62%) diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt index a61cc128e..d7f66e76b 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt @@ -820,4 +820,28 @@ fun getMockScrapDetailList(year: Int, month: Int): List = listOf() +fun getMockDayList(request: String): List = listOf( + /*CalendarDayListResponseDto( + scrapId = 34, + title = "제목34", + color = "#FF45D0CC", + internshipAnnouncementId = 34, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ), + CalendarDayListResponseDto( + scrapId = 34, + title = "제목34", + color = "#FF45D0CC", + internshipAnnouncementId = 34, + dDay = "10", + workingPeriod = "10", + companyImage = "", + startYear = 2024, + startMonth = 8 + ),*/ + +) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index f430fb4f1..a1ce3c968 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -38,6 +38,7 @@ import com.terning.feature.calendar.calendar.component.WeekDaysHeader import com.terning.feature.calendar.calendar.model.CalendarState import com.terning.feature.calendar.month.CalendarMonthScreen import com.terning.feature.calendar.scrap.CalendarScrapListScreen +import com.terning.feature.calendar.week.CalendarWeekScreen import com.terning.feature.calendar.week.CalendarWeekWithScrap import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch @@ -162,14 +163,10 @@ fun CalendarScreen( ) }, contentTwo = { - CalendarWeekWithScrap( + CalendarWeekScreen( modifier = Modifier .fillMaxSize(), - selectedDate = calendarUiState, - scrapLists = viewModel.mockScrapList, - onDateSelected = { - viewModel.updateSelectedDate(it) - } + viewModel = viewModel ) } ) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 6ef0edf5d..8388ca0f4 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -26,6 +26,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -34,7 +35,7 @@ class CalendarViewModel @Inject constructor( private val calendarRepository: CalendarRepository ) : ViewModel() { - private var _selectedDate:MutableStateFlow = MutableStateFlow( + private var _selectedDate: MutableStateFlow = MutableStateFlow( CalendarUiState( selectedDate = LocalDate.now(), isListEnabled = false @@ -52,7 +53,7 @@ class CalendarViewModel @Inject constructor( private val _calendarWeekState = MutableStateFlow(CalendarWeekState()) val calendarWeekState = _calendarWeekState.asStateFlow() - private val _calendarSideEffect:MutableSharedFlow = MutableSharedFlow() + private val _calendarSideEffect: MutableSharedFlow = MutableSharedFlow() val calendarSideEffect = _calendarSideEffect.asSharedFlow() fun updateSelectedDate(date: LocalDate) = viewModelScope.launch { @@ -63,6 +64,7 @@ class CalendarViewModel @Inject constructor( isWeekEnabled = true ) } + getScrapWeekList() } else { _selectedDate.update { currentState -> currentState.copy( @@ -100,7 +102,6 @@ class CalendarViewModel @Inject constructor( loadState = UiState.Success(it) ) } - _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_success)) }, onFailure = { _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_failure)) @@ -139,13 +140,16 @@ class CalendarViewModel @Inject constructor( }.fold( onSuccess = { _calendarWeekState.update { currentState -> + Timber.tag("CalendarScreen").d(" $it") currentState.copy( + /*loadState = if (it.isNotEmpty()) UiState.Success(it) else UiState.Empty*/ loadState = UiState.Success(it) ) } + _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_success)) }, onFailure = { - _calendarListState.update { currentState -> + _calendarWeekState.update { currentState -> currentState.copy( loadState = UiState.Failure(it.message.toString()) ) @@ -155,123 +159,4 @@ class CalendarViewModel @Inject constructor( } ) } - - - //To be erased in future - val mockScrapList: List> - get() { - val list: MutableList> = mutableListOf() - for (i in 0..30) { - when (i % 6) { - 0 -> { - list.add( - i, - listOf() - ) - } - - 1 -> { - list.add( - i, - listOf( - Scrap( - "Task1_1", - CalBlue1, - dDay = "1", - period = "3", - isScraped = true - ), - ) - ) - } - - 2 -> { - list.add( - i, - listOf( - Scrap( - "Task2_1", - CalPink, - dDay = "2", - period = "3", - isScraped = true - ), - Scrap( - "Task2_2", - CalGreen1, - dDay = "2", - period = "3", - isScraped = true - ) - ) - ) - } - - 3 -> { - list.add( - i, - listOf() - ) - } - - 4 -> { - list.add( - i, - listOf() - ) - } - - 5 -> { - list.add( - i, - listOf( - Scrap( - "Task3_1", - CalPink, - dDay = "5", - period = "3", - isScraped = true - ), - Scrap( - "Task3_2", - CalPurple, - dDay = "5", - period = "3", - isScraped = true - ), - Scrap( - "Task3_3", - CalRed, - dDay = "5", - period = "3", - isScraped = true - ), - Scrap( - "Task3_4", - CalBlue1, - dDay = "5", - period = "3", - isScraped = true - ), - Scrap( - "Task3_5", - CalGreen2, - dDay = "5", - period = "3", - isScraped = true - ), - Scrap( - "Task3_6", - CalYellow, - dDay = "5", - period = "3", - isScraped = true - ) - ) - ) - } - } - } - return list.toList() - } } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt similarity index 62% rename from feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt rename to feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index fe1ba8b27..babb3bf12 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekWithScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -9,6 +9,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow import androidx.compose.ui.res.stringResource @@ -22,11 +24,15 @@ import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White +import com.terning.core.state.UiState +import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarUiState import com.terning.feature.calendar.calendar.CalendarViewModel +import com.terning.feature.calendar.scrap.CalendarScrapList import com.terning.feature.calendar.scrap.model.Scrap import com.terning.feature.calendar.scrap.CalendarScrapListss +import timber.log.Timber import java.time.LocalDate @Composable @@ -36,6 +42,29 @@ fun CalendarWeekScreen( ) { val lifecycleOwner = LocalLifecycleOwner.current val uiState = viewModel.selectedDate.collectAsStateWithLifecycle(lifecycleOwner) + val calendarWeekState by viewModel.calendarWeekState.collectAsStateWithLifecycle(lifecycleOwner) + + LaunchedEffect(uiState.value.selectedDate) { + viewModel.getScrapWeekList() + } + + when(calendarWeekState.loadState) { + is UiState.Loading -> {} + is UiState.Empty -> {} + is UiState.Failure -> {} + is UiState.Success -> { + val scrapList = (calendarWeekState.loadState as UiState.Success).data + + CalendarWeekWithScrap( + modifier = modifier, + selectedDate = uiState.value, + scrapList = scrapList, + onDateSelected = { + viewModel.updateSelectedDate(it) + } + ) + } + } } @@ -43,7 +72,7 @@ fun CalendarWeekScreen( fun CalendarWeekWithScrap( modifier: Modifier = Modifier, selectedDate: CalendarUiState, - scrapLists: List> = listOf(), + scrapList: List, onDateSelected: (LocalDate) -> Unit ) { Column( @@ -72,21 +101,18 @@ fun CalendarWeekWithScrap( onDateSelected = onDateSelected ) } - CalendarScrapListss( - selectedDate = selectedDate.selectedDate, - scrapLists = scrapLists, - noScrapScreen = { - Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_empty_scrap), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - ) - } - ) + CalendarScrapList(selectedDate = selectedDate.selectedDate, scrapList = scrapList) { + //Timber.tag("CalendarScreen").d(" ${selectedDate.selectedDate}") + Text( + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } } } From 02009461732025e5516ac475621f937eed838fd6 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 04:35:31 +0900 Subject: [PATCH 40/43] =?UTF-8?q?[FEAT/#91]=20=EC=9D=BC=EA=B0=84=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EB=AA=A9=EB=A1=9D=20=EB=B9=88?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasourceimpl/CalendarList.kt | 7 +- .../calendar/calendar/CalendarRoute.kt | 1 - .../calendar/calendar/CalendarViewModel.kt | 3 +- .../calendar/scrap/CalendarScrapListScreen.kt | 49 ++----------- .../calendar/week/CalendarWeekScreen.kt | 68 ++++++++----------- 5 files changed, 39 insertions(+), 89 deletions(-) diff --git a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt index d7f66e76b..74b1ff8e0 100644 --- a/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt +++ b/data/src/main/java/com/terning/data/datasourceimpl/CalendarList.kt @@ -332,7 +332,7 @@ object CalendarList { fun getMockScrapDetailList(year: Int, month: Int): List { val deadline = month.toString().padStart(2, '0') - return when (month % 4) { + return when (month % 5) { 0 -> { listOf( CalendarMonthListResponseDto( @@ -821,7 +821,7 @@ fun getMockScrapDetailList(year: Int, month: Int): List = listOf( - /*CalendarDayListResponseDto( + CalendarDayListResponseDto( scrapId = 34, title = "제목34", color = "#FF45D0CC", @@ -842,6 +842,5 @@ fun getMockDayList(request: String): List = listOf( companyImage = "", startYear = 2024, startMonth = 8 - ),*/ - + ) ) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index a1ce3c968..7dc8e9c8e 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -39,7 +39,6 @@ import com.terning.feature.calendar.calendar.model.CalendarState import com.terning.feature.calendar.month.CalendarMonthScreen import com.terning.feature.calendar.scrap.CalendarScrapListScreen import com.terning.feature.calendar.week.CalendarWeekScreen -import com.terning.feature.calendar.week.CalendarWeekWithScrap import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import java.time.YearMonth diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 8388ca0f4..4abca00cd 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -118,7 +118,8 @@ class CalendarViewModel @Inject constructor( onSuccess = { _calendarListState.update { currentState -> currentState.copy( - loadState = UiState.Success(it) + loadState = if (it.isNotEmpty()) UiState.Success(it) else UiState.Empty + //loadState = UiState.Success(it) ) } }, diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt index d531823a0..7783ea75a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt @@ -20,12 +20,15 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Black +import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.getDateAsMapString @@ -33,6 +36,7 @@ import com.terning.core.extension.getDateStringInKorean import com.terning.core.extension.isListNotEmpty import com.terning.core.state.UiState import com.terning.domain.entity.response.CalendarScrapDetailModel +import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage @@ -107,51 +111,6 @@ fun CalendarScrapListScreen( } } -@Composable -fun CalendarScrapListss( - selectedDate: LocalDate, - scrapLists: List>, - isFromList: Boolean = false, - noScrapScreen: @Composable () -> Unit -) { - val scrollState = rememberScrollState() - if (scrapLists[selectedDate.dayOfMonth - 1].isNotEmpty()) { - Text( - text = selectedDate.getDateStringInKorean(), - style = TerningTheme.typography.title5, - color = Black, - modifier = Modifier.padding(start = 24.dp, top = 16.dp, bottom = 15.dp) - ) - } - val topModifier = if (!isFromList) { - Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - .verticalScroll(scrollState) - } else { - Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - } - - if (scrapLists[selectedDate.dayOfMonth - 1].isEmpty()) { - noScrapScreen() - } else { - Column( - modifier = topModifier - ) { - for (scrap in scrapLists[selectedDate.dayOfMonth - 1]) { - CalendarScrap( - scrap = scrap - ) - Spacer( - modifier = Modifier.height(12.dp) - ) - } - } - } -} - @Composable fun CalendarScrapList( selectedDate: LocalDate, diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index babb3bf12..5945c201a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -30,9 +30,6 @@ import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarUiState import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.scrap.CalendarScrapList -import com.terning.feature.calendar.scrap.model.Scrap -import com.terning.feature.calendar.scrap.CalendarScrapListss -import timber.log.Timber import java.time.LocalDate @Composable @@ -41,40 +38,13 @@ fun CalendarWeekScreen( viewModel: CalendarViewModel = hiltViewModel() ) { val lifecycleOwner = LocalLifecycleOwner.current - val uiState = viewModel.selectedDate.collectAsStateWithLifecycle(lifecycleOwner) + val uiState by viewModel.selectedDate.collectAsStateWithLifecycle(lifecycleOwner) val calendarWeekState by viewModel.calendarWeekState.collectAsStateWithLifecycle(lifecycleOwner) - LaunchedEffect(uiState.value.selectedDate) { + LaunchedEffect(uiState.selectedDate) { viewModel.getScrapWeekList() } - when(calendarWeekState.loadState) { - is UiState.Loading -> {} - is UiState.Empty -> {} - is UiState.Failure -> {} - is UiState.Success -> { - val scrapList = (calendarWeekState.loadState as UiState.Success).data - - CalendarWeekWithScrap( - modifier = modifier, - selectedDate = uiState.value, - scrapList = scrapList, - onDateSelected = { - viewModel.updateSelectedDate(it) - } - ) - } - } - -} - -@Composable -fun CalendarWeekWithScrap( - modifier: Modifier = Modifier, - selectedDate: CalendarUiState, - scrapList: List, - onDateSelected: (LocalDate) -> Unit -) { Column( modifier = modifier .background(Back) @@ -97,13 +67,17 @@ fun CalendarWeekWithScrap( modifier = Modifier .fillMaxWidth() .background(White), - selectedDate = selectedDate, - onDateSelected = onDateSelected + selectedDate = uiState, + onDateSelected = { + viewModel.updateSelectedDate(it) + } ) } - CalendarScrapList(selectedDate = selectedDate.selectedDate, scrapList = scrapList) { - //Timber.tag("CalendarScreen").d(" ${selectedDate.selectedDate}") - Text( + + when (calendarWeekState.loadState) { + is UiState.Loading -> {} + is UiState.Empty -> { + Text( modifier = Modifier .padding(top = 42.dp) .fillMaxWidth(), @@ -111,10 +85,28 @@ fun CalendarWeekWithScrap( textAlign = TextAlign.Center, style = TerningTheme.typography.body5, color = Grey400 - ) + )} + is UiState.Failure -> {} + is UiState.Success -> { + val scrapList = (calendarWeekState.loadState as UiState.Success).data + + CalendarScrapList(selectedDate = uiState.selectedDate, scrapList = scrapList) { + //Timber.tag("CalendarScreen").d(" ${selectedDate.selectedDate}") + Text( + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } + } } } } + From e0db6a1f2e19f3ffeeb0310e0834f3189a7def4b Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 05:00:18 +0900 Subject: [PATCH 41/43] =?UTF-8?q?[REFACTOR/#91]=20=EC=BA=98=EB=A6=B0?= =?UTF-8?q?=EB=8D=94=20=EC=A0=84=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 6 +- .../calendar/calendar/CalendarViewModel.kt | 1 - .../feature/calendar/month/CalendarMonth.kt | 3 +- .../calendar/month/CalendarMonthScreen.kt | 29 ++------ ...rapListScreen.kt => CalendarListScreen.kt} | 68 +++++++++++-------- .../calendar/week/CalendarWeekScreen.kt | 19 +++--- 6 files changed, 62 insertions(+), 64 deletions(-) rename feature/src/main/java/com/terning/feature/calendar/scrap/{CalendarScrapListScreen.kt => CalendarListScreen.kt} (74%) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 7dc8e9c8e..a64244d21 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -37,7 +37,7 @@ import com.terning.feature.calendar.calendar.component.ScreenTransition import com.terning.feature.calendar.calendar.component.WeekDaysHeader import com.terning.feature.calendar.calendar.model.CalendarState import com.terning.feature.calendar.month.CalendarMonthScreen -import com.terning.feature.calendar.scrap.CalendarScrapListScreen +import com.terning.feature.calendar.scrap.CalendarListScreen import com.terning.feature.calendar.week.CalendarWeekScreen import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch @@ -53,7 +53,7 @@ fun CalendarRoute( } @Composable -fun CalendarScreen( +private fun CalendarScreen( modifier: Modifier = Modifier, navController: NavController = rememberNavController(), viewModel: CalendarViewModel = hiltViewModel() @@ -172,7 +172,7 @@ fun CalendarScreen( } }, contentTwo = { - CalendarScrapListScreen( + CalendarListScreen( listState = listState, pages = state.getPageCount(), viewModel = viewModel, diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 4abca00cd..acda2aa4c 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -141,7 +141,6 @@ class CalendarViewModel @Inject constructor( }.fold( onSuccess = { _calendarWeekState.update { currentState -> - Timber.tag("CalendarScreen").d(" $it") currentState.copy( /*loadState = if (it.isNotEmpty()) UiState.Success(it) else UiState.Empty*/ loadState = UiState.Success(it) diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt index 59eaabcb4..4fa0f6f50 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonth.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey150 import com.terning.core.designsystem.theme.TerningPointTheme +import com.terning.core.extension.getDateAsMapString import com.terning.core.extension.isToday import com.terning.domain.entity.response.CalendarScrapModel import com.terning.feature.calendar.calendar.CalendarUiState @@ -53,7 +54,7 @@ fun CalendarMonth( onDateSelected = onDateSelected ) if(!day.isOutDate) { - val index = day.date.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd")) + val index = day.date.getDateAsMapString() CalendarScrapStrip( scrapLists = scrapMap[index].orEmpty() ) diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index aa7511daf..c1b62c67d 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -49,33 +49,18 @@ fun CalendarMonthScreen( is UiState.Failure -> {} is UiState.Success -> { val scrapMap = (scrapState.loadState as UiState.Success).data - LazyRow( + HorizontalCalendar( + pages = pages, + listState = listState, + calendarUiState = calendarUiState, + scrapMap = scrapMap, + onDateSelected = onDateSelected, modifier = modifier - .background(White), - state = listState, - userScrollEnabled = true, - flingBehavior = flingBehavior( - state = listState - ) - ) { - items(pages) { page -> - val date = getDateByPage(page) - val monthData = MonthData(YearMonth.of(date.year, date.month)) - - CalendarMonth( - modifier = Modifier.fillParentMaxSize(), - calendarUiState = calendarUiState, - onDateSelected = onDateSelected, - monthData = monthData, - scrapMap = scrapMap - ) - } - } + ) } } } - @Composable fun HorizontalCalendar( pages: Int, diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt similarity index 74% rename from feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt rename to feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt index 7783ea75a..49d99e93b 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarScrapListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt @@ -41,12 +41,11 @@ import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage import com.terning.feature.calendar.scrap.component.CalendarScrap -import com.terning.feature.calendar.scrap.model.Scrap import kotlinx.coroutines.flow.distinctUntilChanged import java.time.LocalDate @Composable -fun CalendarScrapListScreen( +fun CalendarListScreen( pages: Int, listState: LazyListState, modifier: Modifier = Modifier, @@ -65,42 +64,55 @@ fun CalendarScrapListScreen( } } - when (scrapState.loadState) { - UiState.Loading -> { - Box(modifier = Modifier.background(color = White).fillMaxSize()) - } - UiState.Empty -> {} - is UiState.Failure -> {} - is UiState.Success -> { - val scrapMap = (scrapState.loadState as UiState.Success).data - LazyRow( - modifier = modifier - .background(White), - state = listState, - userScrollEnabled = true, - flingBehavior = flingBehavior( - state = listState - ) + LazyRow( + modifier = modifier + .background(White), + state = listState, + userScrollEnabled = true, + flingBehavior = flingBehavior( + state = listState + ) + ) { + items(pages) { page -> + val getDate = getDateByPage(page) + + LazyColumn( + modifier = Modifier + .fillParentMaxWidth() + .fillMaxHeight() + .background(Back) ) { - items(pages) { page -> - val getDate = getDateByPage(page) + when (scrapState.loadState) { + UiState.Loading -> {} + UiState.Empty -> { + item { + Text( + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } + } - LazyColumn( - modifier = Modifier - .fillParentMaxWidth() - .fillMaxHeight() - .background(Back) - ) { + is UiState.Failure -> {} + is UiState.Success -> { items(getDate.lengthOfMonth()) { day -> - val currentDate = LocalDate.of(getDate.year, getDate.monthValue, day+1) + val scrapMap = (scrapState.loadState as UiState.Success).data + val currentDate = + LocalDate.of(getDate.year, getDate.monthValue, day + 1) val dateIndex = currentDate.getDateAsMapString() - if(scrapMap[dateIndex].isListNotEmpty()){ + if (scrapMap[dateIndex].isListNotEmpty()) { CalendarScrapList( selectedDate = currentDate, scrapList = scrapMap[dateIndex].orEmpty(), isFromList = true, + noScrapScreen = {}) } } diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index 5945c201a..56b882ff9 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -78,20 +78,21 @@ fun CalendarWeekScreen( is UiState.Loading -> {} is UiState.Empty -> { Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_empty_scrap), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - )} + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } + is UiState.Failure -> {} is UiState.Success -> { val scrapList = (calendarWeekState.loadState as UiState.Success).data CalendarScrapList(selectedDate = uiState.selectedDate, scrapList = scrapList) { - //Timber.tag("CalendarScreen").d(" ${selectedDate.selectedDate}") Text( modifier = Modifier .padding(top = 42.dp) From 5717f6ee752caf291f9f9d13a0ad2dba15a406a0 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 05:15:05 +0900 Subject: [PATCH 42/43] =?UTF-8?q?[CHORE/#91]=20=EC=BB=A8=ED=94=8C=EB=A6=AD?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/terning/point/di/RepositoryModule.kt | 6 ++---- app/src/main/java/com/terning/point/di/ServiceModule.kt | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/terning/point/di/RepositoryModule.kt b/app/src/main/java/com/terning/point/di/RepositoryModule.kt index c9771426c..bf31bd876 100644 --- a/app/src/main/java/com/terning/point/di/RepositoryModule.kt +++ b/app/src/main/java/com/terning/point/di/RepositoryModule.kt @@ -1,13 +1,11 @@ package com.terning.point.di -import com.terning.data.repositoryimpl.MockRepositoryImpl -import com.terning.data.repositoryimpl.CalendarRepositoryImpl -import com.terning.domain.repository.MockRepository -import com.terning.domain.repository.CalendarRepository import com.terning.data.repositoryimpl.AuthRepositoryImpl +import com.terning.data.repositoryimpl.CalendarRepositoryImpl import com.terning.data.repositoryimpl.SearchViewsRepositoryImpl import com.terning.data.repositoryimpl.TokenRepositoryImpl import com.terning.domain.repository.AuthRepository +import com.terning.domain.repository.CalendarRepository import com.terning.domain.repository.SearchRepository import com.terning.domain.repository.TokenRepository import dagger.Binds diff --git a/app/src/main/java/com/terning/point/di/ServiceModule.kt b/app/src/main/java/com/terning/point/di/ServiceModule.kt index ee344feef..fcb0ced95 100644 --- a/app/src/main/java/com/terning/point/di/ServiceModule.kt +++ b/app/src/main/java/com/terning/point/di/ServiceModule.kt @@ -1,10 +1,9 @@ package com.terning.point.di import com.terning.data.service.AuthService +import com.terning.data.service.CalendarService import com.terning.data.service.SearchService import com.terning.point.di.qualifier.JWT -import com.terning.data.service.CalendarService -import com.terning.point.di.qualifier.OPEN import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -28,7 +27,7 @@ object ServiceModule { @Provides @Singleton - fun provideCalendarService(@OPEN retrofit: Retrofit): CalendarService = + fun provideCalendarService(@JWT retrofit: Retrofit): CalendarService = retrofit.create(CalendarService::class.java) } \ No newline at end of file From 76093d181c5511f540224ac966a9119924948484 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 17 Jul 2024 14:21:01 +0900 Subject: [PATCH 43/43] =?UTF-8?q?[REFACTOR/#91]=20=EC=9E=84=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarViewModel.kt | 14 +--- .../calendar/month/CalendarMonthScreen.kt | 4 +- .../calendar/scrap/CalendarListScreen.kt | 78 ++++--------------- .../calendar/scrap/component/CalendarScrap.kt | 23 ------ .../scrap/component/CalendarScrapList.kt | 65 ++++++++++++++++ .../calendar/week/CalendarWeekScreen.kt | 61 +++++++++------ ...endarWeek.kt => HorizontalCalendarWeek.kt} | 2 +- 7 files changed, 122 insertions(+), 125 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrapList.kt rename feature/src/main/java/com/terning/feature/calendar/week/{CalendarWeek.kt => HorizontalCalendarWeek.kt} (98%) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index acda2aa4c..0c11f4792 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -2,20 +2,11 @@ package com.terning.feature.calendar.calendar import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.terning.core.designsystem.theme.CalBlue1 -import com.terning.core.designsystem.theme.CalGreen1 -import com.terning.core.designsystem.theme.CalGreen2 -import com.terning.core.designsystem.theme.CalPink -import com.terning.core.designsystem.theme.CalPurple -import com.terning.core.designsystem.theme.CalRed -import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState -import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.domain.repository.CalendarRepository import com.terning.feature.R import com.terning.feature.calendar.month.CalendarMonthState import com.terning.feature.calendar.scrap.CalendarListState -import com.terning.feature.calendar.scrap.model.Scrap import com.terning.feature.calendar.week.CalendarWeekState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -26,7 +17,6 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -142,8 +132,8 @@ class CalendarViewModel @Inject constructor( onSuccess = { _calendarWeekState.update { currentState -> currentState.copy( - /*loadState = if (it.isNotEmpty()) UiState.Success(it) else UiState.Empty*/ - loadState = UiState.Success(it) + loadState = if (it.isNotEmpty()) UiState.Success(it) else UiState.Empty + //loadState = UiState.Success(it) ) } _calendarSideEffect.emit(CalendarSideEffect.ShowToast(R.string.server_success)) diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index c1b62c67d..06fb41092 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -13,11 +13,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.terning.core.designsystem.theme.White import com.terning.core.state.UiState import com.terning.domain.entity.response.CalendarScrapModel +import com.terning.feature.calendar.calendar.CalendarUiState +import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage -import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.month.model.MonthData -import com.terning.feature.calendar.calendar.CalendarUiState import kotlinx.coroutines.flow.distinctUntilChanged import java.time.LocalDate import java.time.YearMonth diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt index 49d99e93b..04bdf8532 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/CalendarListScreen.kt @@ -2,23 +2,19 @@ package com.terning.feature.calendar.scrap import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -27,20 +23,17 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.terning.core.designsystem.theme.Back -import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.getDateAsMapString -import com.terning.core.extension.getDateStringInKorean import com.terning.core.extension.isListNotEmpty import com.terning.core.state.UiState -import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.feature.R import com.terning.feature.calendar.calendar.CalendarViewModel import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarState.Companion.getDateByPage -import com.terning.feature.calendar.scrap.component.CalendarScrap +import com.terning.feature.calendar.scrap.component.CalendarScrapList import kotlinx.coroutines.flow.distinctUntilChanged import java.time.LocalDate @@ -87,15 +80,20 @@ fun CalendarListScreen( UiState.Loading -> {} UiState.Empty -> { item { - Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_empty_scrap), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - ) + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } } } @@ -123,48 +121,4 @@ fun CalendarListScreen( } } -@Composable -fun CalendarScrapList( - selectedDate: LocalDate, - scrapList: List, - isFromList: Boolean = false, - noScrapScreen: @Composable () -> Unit -) { - val scrollState = rememberScrollState() - if (scrapList.isListNotEmpty()) { - Text( - text = selectedDate.getDateStringInKorean(), - style = TerningTheme.typography.title5, - color = Black, - modifier = Modifier.padding(start = 24.dp, top = 16.dp, bottom = 15.dp) - ) - } - val topModifier = if (!isFromList) { - Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - .verticalScroll(scrollState) - } else { - Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - } - - if (!scrapList.isListNotEmpty()) { - noScrapScreen() - } else { - Column( - modifier = topModifier - ) { - for (scrap in scrapList) { - CalendarScrap( - scrap = scrap - ) - Spacer( - modifier = Modifier.height(12.dp) - ) - } - } - } -} diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt index 538c2737f..239618a87 100644 --- a/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrap.kt @@ -3,33 +3,10 @@ package com.terning.feature.calendar.scrap.component import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.dp import com.terning.core.designsystem.component.item.InternItem import com.terning.core.designsystem.component.item.ScrapBox import com.terning.domain.entity.response.CalendarScrapDetailModel -import com.terning.feature.calendar.scrap.model.Scrap - -@Composable -fun CalendarScrap( - scrap: Scrap, - modifier: Modifier = Modifier, -) { - ScrapBox( - modifier = modifier, - cornerRadius = 10.dp, - scrapColor = scrap.backgroundColor, - elevation = 1.dp, - ) { - InternItem( - imageUrl = scrap.image.orEmpty(), - title = scrap.text, - dateDeadline = scrap.dDay, - workingPeriod = scrap.period, - isScraped = scrap.isScraped - ) - } -} @Composable fun CalendarScrap( diff --git a/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrapList.kt b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrapList.kt new file mode 100644 index 000000000..844e4e523 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/calendar/scrap/component/CalendarScrapList.kt @@ -0,0 +1,65 @@ +package com.terning.feature.calendar.scrap.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.terning.core.designsystem.theme.Black +import com.terning.core.designsystem.theme.TerningTheme +import com.terning.core.extension.getDateStringInKorean +import com.terning.core.extension.isListNotEmpty +import com.terning.domain.entity.response.CalendarScrapDetailModel +import java.time.LocalDate + +@Composable +fun CalendarScrapList( + selectedDate: LocalDate, + scrapList: List, + isFromList: Boolean = false, + noScrapScreen: @Composable () -> Unit +) { + val scrollState = rememberScrollState() + + if (scrapList.isListNotEmpty()) { + Text( + text = selectedDate.getDateStringInKorean(), + style = TerningTheme.typography.title5, + color = Black, + modifier = Modifier.padding(start = 24.dp, top = 16.dp, bottom = 15.dp) + ) + } + val topModifier = if (!isFromList) { + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .verticalScroll(scrollState) + } else { + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + } + + if (!scrapList.isListNotEmpty()) { + noScrapScreen() + } else { + Column( + modifier = topModifier + ) { + for (scrap in scrapList) { + CalendarScrap( + scrap = scrap + ) + Spacer( + modifier = Modifier.height(12.dp) + ) + } + } + } +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index 56b882ff9..b22a15f9a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -2,6 +2,7 @@ package com.terning.feature.calendar.week import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -11,6 +12,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow import androidx.compose.ui.res.stringResource @@ -27,9 +29,8 @@ import com.terning.core.designsystem.theme.White import com.terning.core.state.UiState import com.terning.domain.entity.response.CalendarScrapDetailModel import com.terning.feature.R -import com.terning.feature.calendar.calendar.CalendarUiState import com.terning.feature.calendar.calendar.CalendarViewModel -import com.terning.feature.calendar.scrap.CalendarScrapList +import com.terning.feature.calendar.scrap.component.CalendarScrapList import java.time.LocalDate @Composable @@ -63,7 +64,7 @@ fun CalendarWeekScreen( shape = RoundedCornerShape(bottomStart = 20.dp, bottomEnd = 20.dp), ) { - CalendarWeek( + HorizontalCalendarWeek( modifier = Modifier .fillMaxWidth() .background(White), @@ -77,37 +78,47 @@ fun CalendarWeekScreen( when (calendarWeekState.loadState) { is UiState.Loading -> {} is UiState.Empty -> { - Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_empty_scrap), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - ) + CalendarWeekEmpty() } - is UiState.Failure -> {} is UiState.Success -> { val scrapList = (calendarWeekState.loadState as UiState.Success).data - - CalendarScrapList(selectedDate = uiState.selectedDate, scrapList = scrapList) { - Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_empty_scrap), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - ) - } + CalendarWeekSuccess(scrapList = scrapList, selectedDate = uiState.selectedDate) } } } } +@Composable +fun CalendarWeekEmpty( + modifier: Modifier = Modifier +) { + Box( + contentAlignment = Alignment.Center + ) { + + + Text( + modifier = Modifier + .padding(top = 42.dp) + .fillMaxWidth(), + text = stringResource(id = R.string.calendar_empty_scrap), + textAlign = TextAlign.Center, + style = TerningTheme.typography.body5, + color = Grey400 + ) + } +} + +@Composable +fun CalendarWeekSuccess( + scrapList: List, + selectedDate: LocalDate, +) { + + CalendarScrapList(selectedDate = selectedDate, scrapList = scrapList) {} +} + diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeek.kt b/feature/src/main/java/com/terning/feature/calendar/week/HorizontalCalendarWeek.kt similarity index 98% rename from feature/src/main/java/com/terning/feature/calendar/week/CalendarWeek.kt rename to feature/src/main/java/com/terning/feature/calendar/week/HorizontalCalendarWeek.kt index 7ed5bf177..4bfe69ba4 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeek.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/HorizontalCalendarWeek.kt @@ -19,7 +19,7 @@ import java.time.LocalDate import java.time.YearMonth @Composable -fun CalendarWeek( +fun HorizontalCalendarWeek( selectedDate: CalendarUiState, modifier: Modifier = Modifier, onDateSelected: (LocalDate) -> Unit = {}