Skip to content

Commit

Permalink
feat: Lấy thông tin chi tiết của study set sau khi tạo
Browse files Browse the repository at this point in the history
  • Loading branch information
nqmgaming committed Sep 30, 2024
1 parent 2b034ce commit 9dbe188
Show file tree
Hide file tree
Showing 10 changed files with 138 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -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,
)
11 changes: 10 additions & 1 deletion app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt
Original file line number Diff line number Diff line change
@@ -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")
Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -29,4 +31,20 @@ class StudySetRepositoryImpl @Inject constructor(
}
}
}

override suspend fun getStudySetById(
token: String,
studySetId: String
): Flow<Resources<GetStudySetResponseModel>> {
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()))
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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
)
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -11,5 +12,8 @@ interface StudySetRepository {
createStudySetRequestModel: CreateStudySetRequestModel
): Flow<Resources<CreateStudySetResponseModel>>


suspend fun getStudySetById(
token: String,
studySetId: String
): Flow<Resources<GetStudySetResponseModel>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -32,23 +34,27 @@ 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
)
}

@OptIn(ExperimentalMaterial3Api::class)
@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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.pwhs.quickmem.presentation.app.study_set.detail

sealed class StudySetDetailUiAction {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.pwhs.quickmem.presentation.app.study_set.detail

sealed class StudySetDetailUiEvent {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.pwhs.quickmem.presentation.app.study_set.detail

data class StudySetDetailUiState(
val title: String = "",
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<StudySetDetailUiEvent>()
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")
}
}

}
}
}
}

0 comments on commit 9dbe188

Please sign in to comment.