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