booking fix + ui

This commit is contained in:
solovushka56
2025-12-11 22:48:32 +03:00
parent 79650a94e8
commit cd70c1cd20
5 changed files with 21 additions and 15 deletions

View File

@@ -1,11 +1,10 @@
package ru.myitschool.work.data.model package ru.myitschool.work.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable
data class BookingInfoResponse( typealias BookingInfoResponse = Map<String, List<PlaceInfo>>
val dates: Map<String, List<PlaceInfo>>? = null // can be nil because web api
)
@Serializable @Serializable
data class PlaceInfo( data class PlaceInfo(

View File

@@ -1,12 +1,12 @@
package ru.myitschool.work.data.repo package ru.myitschool.work.data.repo
import ru.myitschool.work.data.model.BookingInfoResponse import ru.myitschool.work.data.model.PlaceInfo
import ru.myitschool.work.data.source.AuthException import ru.myitschool.work.data.source.AuthException
import ru.myitschool.work.data.source.NetworkDataSource import ru.myitschool.work.data.source.NetworkDataSource
class BookRepository(private val authRepository: AuthRepository) { class BookRepository(private val authRepository: AuthRepository) {
suspend fun getAvailableBookings(): Result<BookingInfoResponse> { suspend fun getAvailableBookings(): Result<Map<String, List<PlaceInfo>>> {
val code = authRepository.getCurrentCode() val code = authRepository.getCurrentCode()
return if (code != null) { return if (code != null) {
NetworkDataSource.getBookingInfo(code) NetworkDataSource.getBookingInfo(code)

View File

@@ -20,7 +20,7 @@ import kotlinx.coroutines.withContext
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import ru.myitschool.work.core.Constants import ru.myitschool.work.core.Constants
import ru.myitschool.work.data.model.BookingInfoResponse import ru.myitschool.work.data.model.PlaceInfo
import ru.myitschool.work.data.model.UserInfoResponse import ru.myitschool.work.data.model.UserInfoResponse
import java.net.ConnectException import java.net.ConnectException
import java.net.SocketTimeoutException import java.net.SocketTimeoutException
@@ -133,26 +133,24 @@ object NetworkDataSource {
} }
} }
suspend fun getBookingInfo(code: String): Result<BookingInfoResponse> = withContext(Dispatchers.IO) { suspend fun getBookingInfo(code: String): Result<Map<String, List<PlaceInfo>>> = withContext(Dispatchers.IO) {
return@withContext runCatching { return@withContext runCatching {
val response = client.get(getUrl(code, Constants.BOOKING_URL)) val response = client.get(getUrl(code, Constants.BOOKING_URL))
when (response.status) { when (response.status) {
HttpStatusCode.OK -> { HttpStatusCode.OK -> {
try { try {
val body = response.body<BookingInfoResponse>() val body = response.body<Map<String, List<PlaceInfo>>>()
println("Parsed response: $body") println("Parsed response: $body")
body body
} catch (e: Exception) { } catch (e: Exception) {
println("Parsing error: ${e.message}") println("Parsing error: ${e.message}")
BookingInfoResponse(emptyMap()) emptyMap()
} }
} }
HttpStatusCode.NoContent -> { HttpStatusCode.NoContent -> {
println("No content received") println("No content received")
BookingInfoResponse(emptyMap()) emptyMap()
} }
else -> { else -> {
val errorMsg = response.body<String>().ifBlank { val errorMsg = response.body<String>().ifBlank {
@@ -163,6 +161,7 @@ object NetworkDataSource {
} }
} }
} }
suspend fun book(code: String, date: String, placeId: Int): Result<Unit> = withContext(Dispatchers.IO) { suspend fun book(code: String, date: String, placeId: Int): Result<Unit> = withContext(Dispatchers.IO) {
return@withContext runCatching { return@withContext runCatching {
val response = client.post(getUrl(code, Constants.BOOK_URL)) { val response = client.post(getUrl(code, Constants.BOOK_URL)) {

View File

@@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import ru.myitschool.work.data.model.PlaceInfo
import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.AuthRepository
import ru.myitschool.work.data.repo.BookRepository import ru.myitschool.work.data.repo.BookRepository
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@@ -71,7 +72,7 @@ class BookViewModel(private val bookRepo: BookRepository) : ViewModel() {
bookRepo.getAvailableBookings().fold( bookRepo.getAvailableBookings().fold(
onSuccess = { response -> onSuccess = { response ->
val datesMap = response.dates ?: emptyMap() val datesMap = response ?: emptyMap()
val dateItems = datesMap.entries val dateItems = datesMap.entries
.sortedBy { (date, _) -> parseDate(date) } .sortedBy { (date, _) -> parseDate(date) }
@@ -101,7 +102,6 @@ class BookViewModel(private val bookRepo: BookRepository) : ViewModel() {
} }
}, },
onFailure = { error -> onFailure = { error ->
println("Error loading bookings: ${error.message}")
_uiState.update { _uiState.update {
BookState.Data( BookState.Data(
error = error.message ?: "Ошибка загрузки данных" error = error.message ?: "Ошибка загрузки данных"

View File

@@ -113,6 +113,14 @@ fun MainScreen(
Column( Column(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
Text(
text = "",
color = Color.Red,
modifier = Modifier
.testTag(TestIds.Main.ERROR)
.height(0.dp)
)
Card( Card(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()