main #6
@@ -19,6 +19,8 @@ import kotlinx.serialization.json.Json
|
|||||||
import ru.myitschool.work.core.Constants
|
import ru.myitschool.work.core.Constants
|
||||||
import ru.myitschool.work.data.entity.Employee
|
import ru.myitschool.work.data.entity.Employee
|
||||||
import kotlinx.serialization.json.*
|
import kotlinx.serialization.json.*
|
||||||
|
import ru.myitschool.work.App
|
||||||
|
import ru.myitschool.work.R
|
||||||
import ru.myitschool.work.data.entity.Booking
|
import ru.myitschool.work.data.entity.Booking
|
||||||
import ru.myitschool.work.data.entity.Place
|
import ru.myitschool.work.data.entity.Place
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
@@ -45,11 +47,12 @@ object NetworkDataSource {
|
|||||||
|
|
||||||
when (response.status) {
|
when (response.status) {
|
||||||
HttpStatusCode.OK -> true
|
HttpStatusCode.OK -> true
|
||||||
HttpStatusCode.Unauthorized -> error("Wrong code!")
|
HttpStatusCode.Unauthorized -> error(App.context.getString(R.string.auth_wrong_code))
|
||||||
else -> error("Request error: ${response.bodyAsText()}")
|
else -> error(App.context.getString(R.string.error_request, response.bodyAsText()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getUserInfo(code: String): Result<Employee> = withContext(Dispatchers.IO) {
|
suspend fun getUserInfo(code: String): Result<Employee> = withContext(Dispatchers.IO) {
|
||||||
return@withContext runCatching {
|
return@withContext runCatching {
|
||||||
val response = client.get(getUrl(code, Constants.INFO_URL))
|
val response = client.get(getUrl(code, Constants.INFO_URL))
|
||||||
@@ -58,21 +61,21 @@ object NetworkDataSource {
|
|||||||
HttpStatusCode.OK -> {
|
HttpStatusCode.OK -> {
|
||||||
val json = response.bodyAsText()
|
val json = response.bodyAsText()
|
||||||
if (json.isBlank()) {
|
if (json.isBlank()) {
|
||||||
error("Пустой ответ от сервера")
|
error(App.context.getString(R.string.error_empty_server_response))
|
||||||
}
|
}
|
||||||
|
|
||||||
val jsonObject = try {
|
val jsonObject = try {
|
||||||
Json.parseToJsonElement(json).jsonObject
|
Json.parseToJsonElement(json).jsonObject
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
error("Ошибка парсинга: ${e.message}")
|
error(App.context.getString(R.string.error_parsing, e.message))
|
||||||
}
|
}
|
||||||
val name = jsonObject["name"]?.jsonPrimitive?.content
|
val name = jsonObject["name"]?.jsonPrimitive?.content
|
||||||
?: error("Отсутствует поле 'name'")
|
?: error(App.context.getString(R.string.error_missing_name_field))
|
||||||
val photoUrl = jsonObject["photoUrl"]?.jsonPrimitive?.content
|
val photoUrl = jsonObject["photoUrl"]?.jsonPrimitive?.content
|
||||||
?: error("Отсутствует поле 'photoUrl'")
|
?: error(App.context.getString(R.string.error_missing_photo_url_field))
|
||||||
|
|
||||||
val bookingJson = jsonObject["booking"]?.jsonObject
|
val bookingJson = jsonObject["booking"]?.jsonObject
|
||||||
?: error("Отсутствует поле 'booking' в ответе")
|
?: error(App.context.getString(R.string.error_missing_booking_field))
|
||||||
|
|
||||||
val employee = Employee(
|
val employee = Employee(
|
||||||
name = name,
|
name = name,
|
||||||
@@ -85,12 +88,12 @@ object NetworkDataSource {
|
|||||||
val date = LocalDate.parse(dateString)
|
val date = LocalDate.parse(dateString)
|
||||||
val bookingObj = bookingElement.jsonObject
|
val bookingObj = bookingElement.jsonObject
|
||||||
val bookingId = bookingObj["id"]?.jsonPrimitive?.long
|
val bookingId = bookingObj["id"]?.jsonPrimitive?.long
|
||||||
?: error("Отсутствует поле id")
|
?: error(App.context.getString(R.string.error_missing_id_field))
|
||||||
val placeString = bookingObj["place"]?.jsonPrimitive?.content
|
val placeString = bookingObj["place"]?.jsonPrimitive?.content
|
||||||
?: error("Отсутствует поле 'place' $dateString")
|
?: error(App.context.getString(R.string.error_missing_place_field, dateString))
|
||||||
|
|
||||||
if (placeString.isBlank()) {
|
if (placeString.isBlank()) {
|
||||||
error("Пустое поле 'place' $dateString")
|
error(App.context.getString(R.string.error_empty_place_field, dateString))
|
||||||
}
|
}
|
||||||
|
|
||||||
val placeId = bookingId
|
val placeId = bookingId
|
||||||
@@ -104,9 +107,9 @@ object NetworkDataSource {
|
|||||||
)
|
)
|
||||||
bookingList.add(booking)
|
bookingList.add(booking)
|
||||||
}
|
}
|
||||||
if (bookingList.isEmpty()) {
|
/* if (bookingList.isEmpty()) {
|
||||||
error("Список бронирований пуст")
|
error(App.context.getString(R.string.error_booking_list_empty))
|
||||||
}
|
}*/
|
||||||
employee.bookingList.addAll(bookingList)
|
employee.bookingList.addAll(bookingList)
|
||||||
employee
|
employee
|
||||||
}
|
}
|
||||||
@@ -130,9 +133,9 @@ object NetworkDataSource {
|
|||||||
val places = placesArray.jsonArray.map { placeElement ->
|
val places = placesArray.jsonArray.map { placeElement ->
|
||||||
val placeObj = placeElement.jsonObject
|
val placeObj = placeElement.jsonObject
|
||||||
val id = placeObj["id"]?.jsonPrimitive?.long
|
val id = placeObj["id"]?.jsonPrimitive?.long
|
||||||
?: error("Missing 'id' in place")
|
?: error(App.context.getString(R.string.error_missing_id_in_place))
|
||||||
val placeName = placeObj["place"]?.jsonPrimitive?.content
|
val placeName = placeObj["place"]?.jsonPrimitive?.content
|
||||||
?: error("Missing 'place' in place")
|
?: error(App.context.getString(R.string.error_missing_place_in_place))
|
||||||
Place(id, placeName)
|
Place(id, placeName)
|
||||||
}
|
}
|
||||||
if (places.isNotEmpty()) {
|
if (places.isNotEmpty()) {
|
||||||
@@ -142,7 +145,7 @@ object NetworkDataSource {
|
|||||||
availableBookings.toSortedMap()
|
availableBookings.toSortedMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> error("Request error: ${response.bodyAsText()}")
|
else -> error(App.context.getString(R.string.error_request, response.bodyAsText()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -162,9 +165,12 @@ object NetworkDataSource {
|
|||||||
|
|
||||||
when (response.status) {
|
when (response.status) {
|
||||||
HttpStatusCode.OK -> true
|
HttpStatusCode.OK -> true
|
||||||
else -> error("Ошибка бронирования: ${response.bodyAsText()}")
|
else -> {
|
||||||
|
val errorBody = response.bodyAsText()
|
||||||
|
error(if (errorBody.isNotBlank()) App.context.getString(R.string.error_booking, errorBody) else App.context.getString(R.string.error_booking_default))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private fun getUrl(code: String, targetUrl: String) = "${Constants.HOST}/api/$code$targetUrl"
|
private fun getUrl(code: String, targetUrl: String) = "${Constants.HOST}/api/$code$targetUrl"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import kotlinx.coroutines.flow.asSharedFlow
|
|||||||
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.App
|
||||||
|
import ru.myitschool.work.R
|
||||||
import ru.myitschool.work.data.entity.Place
|
import ru.myitschool.work.data.entity.Place
|
||||||
import ru.myitschool.work.data.repo.BookingRepository
|
import ru.myitschool.work.data.repo.BookingRepository
|
||||||
import ru.myitschool.work.domain.book.CreateBookingUseCase
|
import ru.myitschool.work.domain.book.CreateBookingUseCase
|
||||||
@@ -55,7 +57,7 @@ class BookViewModel : ViewModel() {
|
|||||||
_uiState.update {
|
_uiState.update {
|
||||||
BookState.Data(
|
BookState.Data(
|
||||||
isError = true,
|
isError = true,
|
||||||
errorMessage = "Нет доступных дат для бронирования"
|
errorMessage = App.context.getString(R.string.error_no_available_dates)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -77,7 +79,7 @@ class BookViewModel : ViewModel() {
|
|||||||
_uiState.update {
|
_uiState.update {
|
||||||
BookState.Data(
|
BookState.Data(
|
||||||
isError = true,
|
isError = true,
|
||||||
errorMessage = error.message ?: "Ошибка загрузки данных"
|
errorMessage = error.message ?: App.context.getString(R.string.error_loading_data)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,10 +113,9 @@ class BookViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun bookPlace() {
|
private fun bookPlace() {
|
||||||
// Раскомментируйте и измените этот блок
|
|
||||||
val currentState = _uiState.value
|
val currentState = _uiState.value
|
||||||
if (currentState is BookState.Data && currentState.selectedPlace != null && currentState.selectedDate != null) {
|
if (currentState is BookState.Data && currentState.selectedPlace != null && currentState.selectedDate != null) {
|
||||||
val placeId = selectedPlaceId ?: return // Дополнительная проверка
|
val placeId = selectedPlaceId ?: return
|
||||||
val date = currentState.selectedDate
|
val date = currentState.selectedDate
|
||||||
|
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
@@ -124,7 +125,7 @@ class BookViewModel : ViewModel() {
|
|||||||
},
|
},
|
||||||
onFailure = { error ->
|
onFailure = { error ->
|
||||||
error.printStackTrace()
|
error.printStackTrace()
|
||||||
_actionFlow.emit(BookAction.ShowError(error.message ?: "Ошибка бронирования"))
|
_actionFlow.emit(BookAction.ShowError(error.message ?: App.context.getString(R.string.error_booking_default)))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ import ru.myitschool.work.ui.screen.auth.AuthIntent
|
|||||||
import ru.myitschool.work.ui.screen.auth.AuthState
|
import ru.myitschool.work.ui.screen.auth.AuthState
|
||||||
|
|
||||||
class MainViewModel : ViewModel() {
|
class MainViewModel : ViewModel() {
|
||||||
init {
|
|
||||||
loadData()
|
|
||||||
}
|
|
||||||
private val repository by lazy{ MainRepository() }
|
private val repository by lazy{ MainRepository() }
|
||||||
private val getUserDataUseCase by lazy { GetUserDataUseCase(repository) }
|
private val getUserDataUseCase by lazy { GetUserDataUseCase(repository) }
|
||||||
|
|
||||||
@@ -31,6 +28,10 @@ class MainViewModel : ViewModel() {
|
|||||||
private val _actionFlow: MutableSharedFlow<MainAction> = MutableSharedFlow()
|
private val _actionFlow: MutableSharedFlow<MainAction> = MutableSharedFlow()
|
||||||
val actionFlow: SharedFlow<MainAction> = _actionFlow
|
val actionFlow: SharedFlow<MainAction> = _actionFlow
|
||||||
|
|
||||||
|
init {
|
||||||
|
loadData()
|
||||||
|
}
|
||||||
|
|
||||||
fun onIntent(intent: MainIntent) {
|
fun onIntent(intent: MainIntent) {
|
||||||
when (intent) {
|
when (intent) {
|
||||||
is MainIntent.LoadData -> {
|
is MainIntent.LoadData -> {
|
||||||
@@ -59,6 +60,7 @@ class MainViewModel : ViewModel() {
|
|||||||
if (error.message != null) {
|
if (error.message != null) {
|
||||||
_actionFlow.emit(MainAction.ShowError(error.message.toString()))
|
_actionFlow.emit(MainAction.ShowError(error.message.toString()))
|
||||||
}
|
}
|
||||||
|
_uiState.update { MainState.Data(null) }
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,4 +6,23 @@
|
|||||||
<string name="auth_sign_in">Войти</string>
|
<string name="auth_sign_in">Войти</string>
|
||||||
<string name="auth_wrong_code">Введён неверный код</string>
|
<string name="auth_wrong_code">Введён неверный код</string>
|
||||||
<string name="auth_nasty_code">Неправильный формат кода</string>
|
<string name="auth_nasty_code">Неправильный формат кода</string>
|
||||||
|
|
||||||
|
<string name="error_request">Ошибка запроса</string>
|
||||||
|
<string name="error_empty_server_response">Пустой ответ от сервера</string>
|
||||||
|
<string name="error_parsing">Ошибка парсинга</string>
|
||||||
|
<string name="error_missing_name_field">В ответе отсутствует поле name</string>
|
||||||
|
<string name="error_missing_photo_url_field">В ответе отсутствует поле photoUrl</string>
|
||||||
|
<string name="error_missing_booking_field">В ответе отсутствует поле booking</string>
|
||||||
|
<string name="error_missing_id_field">В ответе отсутствует поле id</string>
|
||||||
|
<string name="error_missing_place_field">В ответе отсутствует поле place для даты</string>
|
||||||
|
<string name="error_empty_place_field">В ответе поле place пусто для даты</string>
|
||||||
|
<string name="error_booking_list_empty">Список бронирований пуст</string>
|
||||||
|
<string name="error_missing_id_in_place">В информации о месте отсутствует id</string>
|
||||||
|
<string name="error_missing_place_in_place">В информации о месте отсутствует place</string>
|
||||||
|
<string name="error_booking">Ошибка бронирования</string>
|
||||||
|
<string name="error_booking_default">Ошибка бронирования</string>
|
||||||
|
|
||||||
|
<string name="error_no_available_dates">Нет доступных дат для бронирования</string>
|
||||||
|
<string name="error_loading_data">Ошибка загрузки данных</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user