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() 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 -> onState(state) 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) } fun canGoBack(): Boolean { println("canGoBack()...") tabs[activeTab].history.forEachIndexed{ index, uri -> println("canGoBack history $index: $uri") } return tabs[activeTab].history.size > 1 } @ExperimentalStdlibApi fun goBack(){ val previous = tabs[activeTab].getPrevious() if(previous == null){ println("Previous history URI is null") return } tabs[activeTab].history.removeLast() cache.update(tabs, activeTab) request(previous) } }