From 9dbe1880f7fb356f4496f829ff635e13f93b4eae Mon Sep 17 00:00:00 2001 From: Nguyen Quang Minh Date: Mon, 30 Sep 2024 14:47:10 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20L=E1=BA=A5y=20th=C3=B4ng=20tin=20chi=20?= =?UTF-8?q?ti=E1=BA=BFt=20c=E1=BB=A7a=20study=20set=20sau=20khi=20t?= =?UTF-8?q?=E1=BA=A1o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study_set/GetStudySetResponseMapper.kt | 32 +++++++++++++ .../pwhs/quickmem/data/remote/ApiService.kt | 11 ++++- .../repository/StudySetRepositoryImpl.kt | 18 ++++++++ .../study_set/GetStudySetResponseModel.kt | 8 ++-- .../domain/repository/StudySetRepository.kt | 6 ++- .../study_set/detail/StudySetDetailScreen.kt | 14 ++++-- .../detail/StudySetDetailUiAction.kt | 4 ++ .../study_set/detail/StudySetDetailUiEvent.kt | 5 ++ .../study_set/detail/StudySetDetailUiState.kt | 5 ++ .../detail/StudySetDetailViewModel.kt | 46 ++++++++++++++++++- 10 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/pwhs/quickmem/data/mapper/study_set/GetStudySetResponseMapper.kt create mode 100644 app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiAction.kt create mode 100644 app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiEvent.kt create mode 100644 app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiState.kt diff --git a/app/src/main/java/com/pwhs/quickmem/data/mapper/study_set/GetStudySetResponseMapper.kt b/app/src/main/java/com/pwhs/quickmem/data/mapper/study_set/GetStudySetResponseMapper.kt new file mode 100644 index 0000000..e43899d --- /dev/null +++ b/app/src/main/java/com/pwhs/quickmem/data/mapper/study_set/GetStudySetResponseMapper.kt @@ -0,0 +1,32 @@ +package com.pwhs.quickmem.data.mapper.study_set + +import com.pwhs.quickmem.data.dto.study_set.GetStudySetResponseDto +import com.pwhs.quickmem.data.mapper.color.toColorModel +import com.pwhs.quickmem.data.mapper.color.toColorResponseDto +import com.pwhs.quickmem.data.mapper.subject.toSubjectModel +import com.pwhs.quickmem.data.mapper.subject.toSubjectResponseDto +import com.pwhs.quickmem.domain.model.study_set.GetStudySetResponseModel + +fun GetStudySetResponseDto.toModel() = GetStudySetResponseModel( + color = color?.toColorModel(), + description = description, + id = id, + isPublic = isPublic, + ownerId = ownerId, + subject = subject?.toSubjectModel(), + title = title, + createdAt = createdAt, + updatedAt = updatedAt, +) + +fun GetStudySetResponseModel.toDto() = GetStudySetResponseDto( + color = color?.toColorResponseDto(), + description = description, + id = id, + isPublic = isPublic, + ownerId = ownerId, + subject = subject?.toSubjectResponseDto(), + title = title, + createdAt = createdAt, + updatedAt = updatedAt, +) \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt b/app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt index a6774e1..3cf0c04 100644 --- a/app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt +++ b/app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt @@ -1,17 +1,20 @@ package com.pwhs.quickmem.data.remote import com.pwhs.quickmem.data.dto.auth.AuthResponseDto -import com.pwhs.quickmem.data.dto.auth.OtpResponseDto import com.pwhs.quickmem.data.dto.auth.LoginRequestDto +import com.pwhs.quickmem.data.dto.auth.OtpResponseDto import com.pwhs.quickmem.data.dto.auth.ResendEmailRequestDto import com.pwhs.quickmem.data.dto.auth.SignupRequestDto import com.pwhs.quickmem.data.dto.auth.SignupResponseDto import com.pwhs.quickmem.data.dto.auth.VerifyEmailRequestDto import com.pwhs.quickmem.data.dto.study_set.CreateStudySetRequestDto import com.pwhs.quickmem.data.dto.study_set.CreateStudySetResponseDto +import com.pwhs.quickmem.data.dto.study_set.GetStudySetResponseDto import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.POST +import retrofit2.http.Path interface ApiService { @POST("auth/signup") @@ -32,4 +35,10 @@ interface ApiService { @Header("Authorization") token: String, @Body createStudySetRequestDto: CreateStudySetRequestDto ): CreateStudySetResponseDto + + @GET("study-set/{id}") + suspend fun getStudySetById( + @Header("Authorization") token: String, + @Path("id") id: String + ): GetStudySetResponseDto } \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/data/remote/repository/StudySetRepositoryImpl.kt b/app/src/main/java/com/pwhs/quickmem/data/remote/repository/StudySetRepositoryImpl.kt index 5e4a7aa..144acfb 100644 --- a/app/src/main/java/com/pwhs/quickmem/data/remote/repository/StudySetRepositoryImpl.kt +++ b/app/src/main/java/com/pwhs/quickmem/data/remote/repository/StudySetRepositoryImpl.kt @@ -7,9 +7,11 @@ import com.pwhs.quickmem.data.mapper.study_set.toModel import com.pwhs.quickmem.data.remote.ApiService import com.pwhs.quickmem.domain.model.study_set.CreateStudySetRequestModel import com.pwhs.quickmem.domain.model.study_set.CreateStudySetResponseModel +import com.pwhs.quickmem.domain.model.study_set.GetStudySetResponseModel import com.pwhs.quickmem.domain.repository.StudySetRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow +import timber.log.Timber import javax.inject.Inject class StudySetRepositoryImpl @Inject constructor( @@ -29,4 +31,20 @@ class StudySetRepositoryImpl @Inject constructor( } } } + + override suspend fun getStudySetById( + token: String, + studySetId: String + ): Flow> { + return flow { + emit(Resources.Loading()) + try { + val response = apiService.getStudySetById(token, studySetId) + emit(Resources.Success(response.toModel())) + } catch (e: Exception) { + Timber.e(e) + emit(Resources.Error(e.toString())) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/domain/model/study_set/GetStudySetResponseModel.kt b/app/src/main/java/com/pwhs/quickmem/domain/model/study_set/GetStudySetResponseModel.kt index aeaf653..6f140ff 100644 --- a/app/src/main/java/com/pwhs/quickmem/domain/model/study_set/GetStudySetResponseModel.kt +++ b/app/src/main/java/com/pwhs/quickmem/domain/model/study_set/GetStudySetResponseModel.kt @@ -1,7 +1,7 @@ package com.pwhs.quickmem.domain.model.study_set -import com.pwhs.quickmem.data.dto.color.ColorResponseDto -import com.pwhs.quickmem.data.dto.subject.SubjectResponseDto +import com.pwhs.quickmem.domain.model.color.ColorModel +import com.pwhs.quickmem.domain.model.subject.SubjectModel data class GetStudySetResponseModel( val id: String, @@ -11,6 +11,6 @@ data class GetStudySetResponseModel( val createdAt: String, val updatedAt: String, val ownerId: String, - val subject: SubjectResponseDto? = null, - val color: ColorResponseDto? = null + val subject: SubjectModel? = null, + val color: ColorModel? = null ) diff --git a/app/src/main/java/com/pwhs/quickmem/domain/repository/StudySetRepository.kt b/app/src/main/java/com/pwhs/quickmem/domain/repository/StudySetRepository.kt index 8fe5db8..0a69075 100644 --- a/app/src/main/java/com/pwhs/quickmem/domain/repository/StudySetRepository.kt +++ b/app/src/main/java/com/pwhs/quickmem/domain/repository/StudySetRepository.kt @@ -3,6 +3,7 @@ package com.pwhs.quickmem.domain.repository import com.pwhs.quickmem.core.utils.Resources import com.pwhs.quickmem.domain.model.study_set.CreateStudySetRequestModel import com.pwhs.quickmem.domain.model.study_set.CreateStudySetResponseModel +import com.pwhs.quickmem.domain.model.study_set.GetStudySetResponseModel import kotlinx.coroutines.flow.Flow interface StudySetRepository { @@ -11,5 +12,8 @@ interface StudySetRepository { createStudySetRequestModel: CreateStudySetRequestModel ): Flow> - + suspend fun getStudySetById( + token: String, + studySetId: String + ): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailScreen.kt index 831064c..99a5e1f 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailScreen.kt @@ -16,6 +16,8 @@ import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview @@ -32,8 +34,11 @@ fun StudySetDetailScreen( modifier: Modifier = Modifier, viewModel: StudySetDetailViewModel = hiltViewModel(), ) { - Text( - "Hello from StudySetDetailScreen!", + val uiState by viewModel.uiState.collectAsState() + StudySetDetail( + modifier = modifier, + onNavigateBack = { }, + title = uiState.title ) } @@ -41,14 +46,15 @@ fun StudySetDetailScreen( @Composable fun StudySetDetail( modifier: Modifier = Modifier, - onNavigateBack: () -> Unit = {} + onNavigateBack: () -> Unit = {}, + title: String = "" ) { Scaffold( modifier = modifier.gradientBackground(), containerColor = colorScheme.surface, topBar = { LargeTopAppBar( - title = { Text("Study Set Detail") }, + title = { Text(title) }, navigationIcon = { IconButton( onClick = onNavigateBack, diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiAction.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiAction.kt new file mode 100644 index 0000000..4e66f5a --- /dev/null +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiAction.kt @@ -0,0 +1,4 @@ +package com.pwhs.quickmem.presentation.app.study_set.detail + +sealed class StudySetDetailUiAction { +} \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiEvent.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiEvent.kt new file mode 100644 index 0000000..997f301 --- /dev/null +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiEvent.kt @@ -0,0 +1,5 @@ +package com.pwhs.quickmem.presentation.app.study_set.detail + +sealed class StudySetDetailUiEvent { + +} \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiState.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiState.kt new file mode 100644 index 0000000..3b0378f --- /dev/null +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailUiState.kt @@ -0,0 +1,5 @@ +package com.pwhs.quickmem.presentation.app.study_set.detail + +data class StudySetDetailUiState( + val title: String = "", +) \ No newline at end of file diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailViewModel.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailViewModel.kt index fcc142f..8f887f0 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailViewModel.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/StudySetDetailViewModel.kt @@ -2,16 +2,60 @@ package com.pwhs.quickmem.presentation.app.study_set.detail import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.pwhs.quickmem.core.datastore.TokenManager +import com.pwhs.quickmem.core.utils.Resources +import com.pwhs.quickmem.domain.repository.StudySetRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @HiltViewModel class StudySetDetailViewModel @Inject constructor( - private val savedStateHandle: SavedStateHandle + private val savedStateHandle: SavedStateHandle, + private val studySetRepository: StudySetRepository, + private val tokenManager: TokenManager ) : ViewModel() { + private val _uiState = MutableStateFlow(StudySetDetailUiState()) + val uiState = _uiState.asStateFlow() + + private val _uiEvent = Channel() + val uiEvent = _uiEvent.receiveAsFlow() + init { val id: String = savedStateHandle["id"] ?: "" Timber.d("StudySetDetailViewModel: $id") + getStudySetById(id) + } + + private fun getStudySetById(id: String) { + viewModelScope.launch { + val token = tokenManager.accessToken.firstOrNull() ?: "" + studySetRepository.getStudySetById(token, id).collect { resource -> + when (resource) { + is Resources.Loading -> { + Timber.d("Loading") + } + + is Resources.Success -> { + _uiState.update { + resource.data?.let { it1 -> it.copy(title = it1.title) }!! + } + } + + is Resources.Error -> { + Timber.d("Error") + } + } + + } + } } } \ No newline at end of file