This commit is contained in:
student-d-sherstnev 2026-02-25 17:55:46 +03:00
parent a39fc9ab15
commit a45d21216b
11 changed files with 69 additions and 28 deletions

View File

@ -0,0 +1,12 @@
package ru.myitschool.work.data.dto
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class RoomBookingsDto(
@SerialName("name")
val name: String,
@SerialName("data")
val data: Map<String, String?>
)

View File

@ -8,10 +8,10 @@ import ru.myitschool.work.domain.room.entities.RoomEntity
class RoomBookingRepository( class RoomBookingRepository(
private val authRepository: AuthRepository private val authRepository: AuthRepository
) { ) {
suspend fun getRoomBookings(): Result<RoomEntity> { suspend fun getRoomBookings(roomId: Int): Result<RoomEntity> {
val token = authRepository.getToken() ?: return getNoAuthResult() val token = authRepository.getToken() ?: return getNoAuthResult()
return NetworkDataSource.getRoomBookings(token).mapCatching { dto -> return NetworkDataSource.getRoomBookings(token, roomId = roomId).mapCatching { dto ->
RoomEntity(dto) RoomEntity(name=dto.name, data=dto.data)
} }
} }

View File

@ -23,8 +23,10 @@ import ru.myitschool.work.data.dto.AuthResponseDto
import ru.myitschool.work.data.dto.PlaceDto import ru.myitschool.work.data.dto.PlaceDto
import ru.myitschool.work.data.dto.BookRequestDto import ru.myitschool.work.data.dto.BookRequestDto
import ru.myitschool.work.data.dto.RoomBookingRequestDto import ru.myitschool.work.data.dto.RoomBookingRequestDto
import ru.myitschool.work.data.dto.RoomBookingsDto
import ru.myitschool.work.data.dto.UserDto import ru.myitschool.work.data.dto.UserDto
import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.AuthRepository
import ru.myitschool.work.domain.room.entities.RoomEntity
object NetworkDataSource { object NetworkDataSource {
private val client by lazy { private val client by lazy {
@ -116,15 +118,15 @@ object NetworkDataSource {
} }
} }
suspend fun getRoomBookings(token: String): Result<Map<String, String?>> = withContext(Dispatchers.IO) { suspend fun getRoomBookings(token: String, roomId: Int): Result<RoomBookingsDto> = withContext(Dispatchers.IO) {
return@withContext runCatching { return@withContext runCatching {
val response = client.get(getUrl(Constants.ROOM_BOOKING_URL)) { val response = client.get(getUrl("$Constants.ROOM_BOOKING_URL/$roomId")) {
headers { headers {
append("Authorization", "Bearer $token") append("Authorization", "Bearer $token")
} }
} }
if (response.status == HttpStatusCode.OK) { if (response.status == HttpStatusCode.OK) {
response.body<Map<String, String?>>() response.body<RoomBookingsDto>()
} else { } else {
if (response.status == HttpStatusCode.Unauthorized) { if (response.status == HttpStatusCode.Unauthorized) {
AuthRepository.logout() AuthRepository.logout()

View File

@ -6,7 +6,7 @@ import ru.myitschool.work.domain.room.entities.RoomEntity
class GetRoomBookingsUseCase( class GetRoomBookingsUseCase(
private val repository: RoomBookingRepository private val repository: RoomBookingRepository
) { ) {
suspend operator fun invoke(): Result<RoomEntity> { suspend operator fun invoke(roomId: Int): Result<RoomEntity> {
return repository.getRoomBookings() return repository.getRoomBookings(roomId = roomId)
} }
} }

View File

@ -2,5 +2,6 @@ package ru.myitschool.work.domain.room.entities
class RoomEntity ( class RoomEntity (
val name: String,
val data: Map<String, String?> val data: Map<String, String?>
) )

View File

@ -3,4 +3,4 @@ package ru.myitschool.work.ui.nav
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data object RoomScreenDestination: AppDestination data class RoomScreenDestination(val roomId: Int): AppDestination

View File

@ -10,9 +10,12 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import androidx.navigation.toRoute
import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.AuthRepository
import ru.myitschool.work.domain.auth.GetTokenUseCase import ru.myitschool.work.domain.auth.GetTokenUseCase
import ru.myitschool.work.domain.room.GetRoleUseCase import ru.myitschool.work.domain.room.GetRoleUseCase
@ -35,13 +38,13 @@ fun AppNavHost(
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
val code = GetTokenUseCase(AuthRepository).invoke() val code = GetTokenUseCase(AuthRepository).invoke()
val role = GetRoleUseCase(AuthRepository).invoke() val role = GetRoleUseCase(AuthRepository).invoke()
destination = if (code == null) { destination = (if (code == null) {
AuthScreenDestination AuthScreenDestination
} else if (role == "room") { } else if (role == "ROOM") {
RoomScreenDestination RoomScreenDestination
} else { } else {
MainScreenDestination MainScreenDestination
} }) as AppDestination?
} }
if (destination != null) { if (destination != null) {
NavHost( NavHost(
@ -60,8 +63,12 @@ fun AppNavHost(
composable<BookScreenDestination> { composable<BookScreenDestination> {
BookScreen(navController = navController) BookScreen(navController = navController)
} }
composable<RoomScreenDestination> { composable<RoomScreenDestination> { backStackEntry ->
RoomScreen(navController = navController) val room: RoomScreenDestination = backStackEntry.toRoute()
RoomScreen(
roomId = room.roomId,
navController = navController
)
} }
} }
} }

View File

@ -1,7 +1,7 @@
package ru.myitschool.work.ui.screen.room package ru.myitschool.work.ui.screen.room
sealed interface RoomIntent { sealed interface RoomIntent {
data object Refresh: RoomIntent data class Refresh(val placeId: Int): RoomIntent
data class Booking(val placeId: Int, val date: String): RoomIntent data class Booking(val placeId: Int, val date: String): RoomIntent
data class UnBook(val placeId: Int, val date: String): RoomIntent data class UnBook(val placeId: Int, val date: String): RoomIntent
} }

View File

@ -7,6 +7,7 @@ import ru.myitschool.work.ui.screen.auth.AuthViewModel
@Composable @Composable
fun RoomScreen( fun RoomScreen(
roomId: Int,
viewModel: AuthViewModel = viewModel(), viewModel: AuthViewModel = viewModel(),
navController: NavController navController: NavController
) { ) {

View File

@ -9,6 +9,7 @@ sealed interface RoomState {
val error: String val error: String
): RoomState ): RoomState
data class Data( data class Data(
val data: RoomEntity val data: Map<String, String?>,
val name: String
): RoomState ): RoomState
} }

View File

@ -1,7 +1,10 @@
package ru.myitschool.work.ui.screen.room package ru.myitschool.work.ui.screen.room
import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
@ -12,8 +15,14 @@ import ru.myitschool.work.data.repo.RoomBookingRepository
import ru.myitschool.work.domain.room.DeleteRoomBookingsUseCase import ru.myitschool.work.domain.room.DeleteRoomBookingsUseCase
import ru.myitschool.work.domain.room.GetRoomBookingsUseCase import ru.myitschool.work.domain.room.GetRoomBookingsUseCase
import ru.myitschool.work.domain.room.SendRoomBookingRequestUseCase import ru.myitschool.work.domain.room.SendRoomBookingRequestUseCase
import ru.myitschool.work.ui.nav.RoomScreenDestination
class RoomViewModel : ViewModel() {
class RoomViewModel(
savedStateHandle: SavedStateHandle,
): ViewModel() {
private val roomScreen = savedStateHandle.toRoute<RoomScreenDestination>()
private val roomBookingRepository = RoomBookingRepository( private val roomBookingRepository = RoomBookingRepository(
AuthRepository AuthRepository
@ -40,13 +49,18 @@ class RoomViewModel : ViewModel() {
val uiState: StateFlow<RoomState> = _uiState.asStateFlow() val uiState: StateFlow<RoomState> = _uiState.asStateFlow()
init { init {
refresh() refresh(roomScreen.roomId)
// Timer().schedule(object : TimerTask() {
// override fun run() {
// Log.d("mytimer", "A Kiss every 5 seconds")
// }
// }, 0, 5000)
} }
fun onIntent(intent: RoomIntent) { fun onIntent(intent: RoomIntent) {
when (intent) { when (intent) {
is RoomIntent.Refresh -> { is RoomIntent.Refresh -> {
refresh() refresh(intent.placeId)
} }
is RoomIntent.Booking -> { is RoomIntent.Booking -> {
@ -56,11 +70,12 @@ class RoomViewModel : ViewModel() {
intent.date intent.date
).fold( ).fold(
onSuccess = { onSuccess = {
// _actionFlow.emit(BookAction.BackWithSuccess) refresh(intent.placeId)
refresh()
}, },
onFailure = { error -> onFailure = { error ->
error.printStackTrace() RoomState.Error(
error = error.message.orEmpty()
)
} }
) )
} }
@ -73,11 +88,12 @@ class RoomViewModel : ViewModel() {
intent.date intent.date
).fold( ).fold(
onSuccess = { onSuccess = {
// _actionFlow.emit(BookAction.BackWithSuccess) refresh(intent.placeId)
refresh()
}, },
onFailure = { error -> onFailure = { error ->
error.printStackTrace() RoomState.Error(
error = error.message.orEmpty()
)
} }
) )
} }
@ -85,14 +101,15 @@ class RoomViewModel : ViewModel() {
} }
} }
private fun refresh() { private fun refresh(roomId: Int) {
viewModelScope.launch { viewModelScope.launch {
_uiState.update { RoomState.Loading } _uiState.update { RoomState.Loading }
_uiState.update { _uiState.update {
getRoomBookingsDataUseCase.invoke().fold( getRoomBookingsDataUseCase.invoke(roomId = roomId).fold(
onSuccess = { data -> onSuccess = { data ->
RoomState.Data( RoomState.Data(
data = data data = data.data,
name = data.name
) )
}, },
onFailure = { error -> onFailure = { error ->