ariane/app/src/main/java/oppen/tva/ui/TvaViewModel.kt

62 lines
1.7 KiB
Kotlin

package oppen.tva.ui
import androidx.lifecycle.ViewModel
import oppen.tva.io.Datasource
import oppen.tva.io.TvaState
import oppen.tva.io.history.CacheInterface
import oppen.tva.io.history.Tab
import java.net.URI
class TvaViewModel: ViewModel() {
private val gemini = Datasource.factory()
private var onState: (state: TvaState) -> Unit = {}
private var activeTab = 0
private lateinit var cache: CacheInterface
private var tabs = mutableListOf<Tab>()
fun initialise(cache: CacheInterface, onState: (state: TvaState) -> Unit){
this.cache = cache
this.onState = onState
cache.getTabs { tabs, activeIndex ->
this.tabs.addAll(tabs)
if(tabs.isEmpty()){
this.tabs.add(Tab(0))
activeTab = 0
request(URI.create("gemini://gemini.circumlunar.space/"))
}else{
activeTab = activeIndex
request(tabs[activeTab].history.last())
}
}
}
fun request(address: String) {
request(URI.create(address))
}
fun request(uri: URI){
gemini.request(uri){ state ->
when(state){
is TvaState.Requesting -> {}
is TvaState.AppQuery -> {}
is TvaState.NotGeminiRequest -> {}
is TvaState.GeminiResponse -> renderGemini(state)
TvaState.GeminiPrintWriterError -> {}
}
}
}
private fun renderGemini(state: TvaState.GeminiResponse) {
if(tabs[activeTab].history.isEmpty() || tabs[activeTab].history.last() != state.uri){
tabs[activeTab].add(state.uri)
cache.update(tabs, activeTab)
}
onState(state)
}
}