/
TestViewModel.kt
115 lines (103 loc) · 3.59 KB
/
TestViewModel.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/
package com.icerockdev.library
import dev.icerock.moko.errors.MR
import dev.icerock.moko.errors.handler.ExceptionHandler
import dev.icerock.moko.errors.mappers.ExceptionMappersStorage
import dev.icerock.moko.errors.presenters.AlertErrorPresenter
import dev.icerock.moko.mvvm.livedata.LiveData
import dev.icerock.moko.mvvm.livedata.MutableLiveData
import dev.icerock.moko.mvvm.livedata.readOnly
import dev.icerock.moko.mvvm.viewmodel.ViewModel
import dev.icerock.moko.network.LanguageProvider
import dev.icerock.moko.network.features.LanguageFeature
import dev.icerock.moko.network.features.TokenFeature
import dev.icerock.moko.network.generated.apis.PetApi
import dev.icerock.moko.resources.desc.desc
import io.ktor.client.HttpClient
import io.ktor.client.features.logging.LogLevel
import io.ktor.client.features.logging.Logger
import io.ktor.client.features.logging.Logging
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import news.apis.NewsApi
class TestViewModel : ViewModel() {
val exceptionHandler = ExceptionHandler(
errorPresenter = AlertErrorPresenter(
// temporary fix https://youtrack.jetbrains.com/issue/KT-41823
alertTitle = MR.strings.moko_errors_presenters_alertDialogTitle.desc(),
positiveButtonText = MR.strings.moko_errors_presenters_alertPositiveButton.desc()
),
exceptionMapper = ExceptionMappersStorage.throwableMapper(),
onCatch = { it.printStackTrace() }
)
private val httpClient = HttpClient {
install(LanguageFeature) {
languageHeaderName = "X-Language"
languageCodeProvider = LanguageProvider()
}
install(Logging) {
level = LogLevel.INFO
logger = object : Logger {
override fun log(message: String) {
println(message)
}
}
}
install(TokenFeature) {
tokenHeaderName = "Authorization"
tokenProvider = object : TokenFeature.TokenProvider {
override fun getToken(): String? = "ed155d0a445e4b4fbd878fe1f3bc1b7f"
}
}
}
private val petApi = PetApi(
basePath = "https://petstore.swagger.io/v2/",
httpClient = httpClient,
json = Json {
ignoreUnknownKeys = true
}
)
private val newApi = NewsApi(
basePath = "https://newsapi.org/v2/",
httpClient = httpClient,
json = Json {
ignoreUnknownKeys = true
}
)
private val _petInfo = MutableLiveData<String?>(null)
val petInfo: LiveData<String?> = _petInfo.readOnly()
init {
reloadPet()
loadNews()
}
fun onRefreshPressed() {
reloadPet()
}
private fun reloadPet() {
viewModelScope.launch {
exceptionHandler.handle {
val pet = petApi.findPetsByStatus(listOf("available"))
_petInfo.value = pet.toString()
}.execute()
}
}
@Suppress("TooGenericExceptionCaught")
private fun loadNews() {
viewModelScope.launch {
try {
val response = newApi.topHeadlinesGet(
country = "ru",
category = null,
q = null,
pageSize = null,
page = null
)
println(response)
} catch (exception: Throwable) {
println("error to get news $exception")
}
}
}
}