From a45d21216b82869e0ee5ad3c47ea58c6da2d8de2 Mon Sep 17 00:00:00 2001 From: student-d-sherstnev Date: Wed, 25 Feb 2026 17:55:46 +0300 Subject: [PATCH] nav --- .../work/data/dto/RoomBookingsDto.kt | 12 ++++++ .../work/data/repo/RoomBookingRepository.kt | 6 +-- .../work/data/source/NetworkDataSource.kt | 8 ++-- .../domain/room/GetRoomBookingsUseCase.kt | 4 +- .../work/domain/room/entities/RoomEntity.kt | 1 + .../work/ui/nav/RoomScreenDestination.kt | 2 +- .../work/ui/screen/NavigationGraph.kt | 17 +++++--- .../work/ui/screen/room/RoomIntent.kt | 2 +- .../work/ui/screen/room/RoomScreen.kt | 1 + .../work/ui/screen/room/RoomState.kt | 3 +- .../work/ui/screen/room/RoomViewModel.kt | 41 +++++++++++++------ 11 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/data/dto/RoomBookingsDto.kt diff --git a/app/src/main/java/ru/myitschool/work/data/dto/RoomBookingsDto.kt b/app/src/main/java/ru/myitschool/work/data/dto/RoomBookingsDto.kt new file mode 100644 index 0000000..ece973b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/dto/RoomBookingsDto.kt @@ -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 +) diff --git a/app/src/main/java/ru/myitschool/work/data/repo/RoomBookingRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/RoomBookingRepository.kt index 545c778..1a38005 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/RoomBookingRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/RoomBookingRepository.kt @@ -8,10 +8,10 @@ import ru.myitschool.work.domain.room.entities.RoomEntity class RoomBookingRepository( private val authRepository: AuthRepository ) { - suspend fun getRoomBookings(): Result { + suspend fun getRoomBookings(roomId: Int): Result { val token = authRepository.getToken() ?: return getNoAuthResult() - return NetworkDataSource.getRoomBookings(token).mapCatching { dto -> - RoomEntity(dto) + return NetworkDataSource.getRoomBookings(token, roomId = roomId).mapCatching { dto -> + RoomEntity(name=dto.name, data=dto.data) } } diff --git a/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt index c7b2798..5473780 100644 --- a/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/source/NetworkDataSource.kt @@ -23,8 +23,10 @@ import ru.myitschool.work.data.dto.AuthResponseDto import ru.myitschool.work.data.dto.PlaceDto import ru.myitschool.work.data.dto.BookRequestDto 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.repo.AuthRepository +import ru.myitschool.work.domain.room.entities.RoomEntity object NetworkDataSource { private val client by lazy { @@ -116,15 +118,15 @@ object NetworkDataSource { } } - suspend fun getRoomBookings(token: String): Result> = withContext(Dispatchers.IO) { + suspend fun getRoomBookings(token: String, roomId: Int): Result = withContext(Dispatchers.IO) { return@withContext runCatching { - val response = client.get(getUrl(Constants.ROOM_BOOKING_URL)) { + val response = client.get(getUrl("$Constants.ROOM_BOOKING_URL/$roomId")) { headers { append("Authorization", "Bearer $token") } } if (response.status == HttpStatusCode.OK) { - response.body>() + response.body() } else { if (response.status == HttpStatusCode.Unauthorized) { AuthRepository.logout() diff --git a/app/src/main/java/ru/myitschool/work/domain/room/GetRoomBookingsUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/room/GetRoomBookingsUseCase.kt index 8fed7de..e959870 100644 --- a/app/src/main/java/ru/myitschool/work/domain/room/GetRoomBookingsUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/room/GetRoomBookingsUseCase.kt @@ -6,7 +6,7 @@ import ru.myitschool.work.domain.room.entities.RoomEntity class GetRoomBookingsUseCase( private val repository: RoomBookingRepository ) { - suspend operator fun invoke(): Result { - return repository.getRoomBookings() + suspend operator fun invoke(roomId: Int): Result { + return repository.getRoomBookings(roomId = roomId) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/room/entities/RoomEntity.kt b/app/src/main/java/ru/myitschool/work/domain/room/entities/RoomEntity.kt index fd16911..b41a65b 100644 --- a/app/src/main/java/ru/myitschool/work/domain/room/entities/RoomEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/room/entities/RoomEntity.kt @@ -2,5 +2,6 @@ package ru.myitschool.work.domain.room.entities class RoomEntity ( + val name: String, val data: Map ) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/nav/RoomScreenDestination.kt b/app/src/main/java/ru/myitschool/work/ui/nav/RoomScreenDestination.kt index 3d6a81c..0a4a1b3 100644 --- a/app/src/main/java/ru/myitschool/work/ui/nav/RoomScreenDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/nav/RoomScreenDestination.kt @@ -3,4 +3,4 @@ package ru.myitschool.work.ui.nav import kotlinx.serialization.Serializable @Serializable -data object RoomScreenDestination: AppDestination \ No newline at end of file +data class RoomScreenDestination(val roomId: Int): AppDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt index 1b6a611..94075b5 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt @@ -10,9 +10,12 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.navigation.NavHostController +import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import androidx.navigation.toRoute import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.domain.auth.GetTokenUseCase import ru.myitschool.work.domain.room.GetRoleUseCase @@ -35,13 +38,13 @@ fun AppNavHost( LaunchedEffect(Unit) { val code = GetTokenUseCase(AuthRepository).invoke() val role = GetRoleUseCase(AuthRepository).invoke() - destination = if (code == null) { + destination = (if (code == null) { AuthScreenDestination - } else if (role == "room") { + } else if (role == "ROOM") { RoomScreenDestination } else { MainScreenDestination - } + }) as AppDestination? } if (destination != null) { NavHost( @@ -60,8 +63,12 @@ fun AppNavHost( composable { BookScreen(navController = navController) } - composable { - RoomScreen(navController = navController) + composable { backStackEntry -> + val room: RoomScreenDestination = backStackEntry.toRoute() + RoomScreen( + roomId = room.roomId, + navController = navController + ) } } } diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomIntent.kt b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomIntent.kt index 95f0cd2..98f2fe0 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomIntent.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomIntent.kt @@ -1,7 +1,7 @@ package ru.myitschool.work.ui.screen.room 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 UnBook(val placeId: Int, val date: String): RoomIntent } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomScreen.kt index 5d61735..bd6bc24 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomScreen.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomScreen.kt @@ -7,6 +7,7 @@ import ru.myitschool.work.ui.screen.auth.AuthViewModel @Composable fun RoomScreen( + roomId: Int, viewModel: AuthViewModel = viewModel(), navController: NavController ) { diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomState.kt b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomState.kt index e487f42..746a1c5 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomState.kt @@ -9,6 +9,7 @@ sealed interface RoomState { val error: String ): RoomState data class Data( - val data: RoomEntity + val data: Map, + val name: String ): RoomState } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomViewModel.kt index 89cc022..201a626 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/room/RoomViewModel.kt @@ -1,7 +1,10 @@ package ru.myitschool.work.ui.screen.room +import android.util.Log +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import androidx.navigation.toRoute import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow 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.GetRoomBookingsUseCase 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() private val roomBookingRepository = RoomBookingRepository( AuthRepository @@ -40,13 +49,18 @@ class RoomViewModel : ViewModel() { val uiState: StateFlow = _uiState.asStateFlow() 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) { when (intent) { is RoomIntent.Refresh -> { - refresh() + refresh(intent.placeId) } is RoomIntent.Booking -> { @@ -56,11 +70,12 @@ class RoomViewModel : ViewModel() { intent.date ).fold( onSuccess = { -// _actionFlow.emit(BookAction.BackWithSuccess) - refresh() + refresh(intent.placeId) }, onFailure = { error -> - error.printStackTrace() + RoomState.Error( + error = error.message.orEmpty() + ) } ) } @@ -73,11 +88,12 @@ class RoomViewModel : ViewModel() { intent.date ).fold( onSuccess = { -// _actionFlow.emit(BookAction.BackWithSuccess) - refresh() + refresh(intent.placeId) }, 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 { _uiState.update { RoomState.Loading } _uiState.update { - getRoomBookingsDataUseCase.invoke().fold( + getRoomBookingsDataUseCase.invoke(roomId = roomId).fold( onSuccess = { data -> RoomState.Data( - data = data + data = data.data, + name = data.name ) }, onFailure = { error ->