package oppen.ariane.ui import android.net.Uri import androidx.lifecycle.ViewModel import oppen.ariane.Ariane import oppen.ariane.io.gemini.Datasource import oppen.ariane.io.GemState import oppen.ariane.io.bookmarks.BookmarksDatasource import java.net.URI class GemViewModel: ViewModel() { private lateinit var gemini: Datasource private lateinit var bookmarks: BookmarksDatasource private var onState: (state: GemState) -> Unit = {} private val history = mutableListOf() fun initialise(home: String, gemini: Datasource, bookmarks: BookmarksDatasource, onState: (state: GemState) -> Unit){ this.gemini = gemini this.bookmarks = bookmarks this.onState = onState request(home) } fun request(address: String) { request(URI.create(address)) } fun request(uri: URI){ gemini.request(uri){ state -> if(state is GemState.ResponseGemtext) { when { history.isEmpty() -> history.add(uri) !history.takeLast(5).contains(uri) -> { println("Adding $uri to runtime history") history.add(uri) } } } onState(state) } } fun requestBinaryDownload(uri: URI) { gemini.request(uri, true){ state -> onState(state) } } //todo - same action as above... refactor fun requestInlineImage(uri: URI, onImageReady: (cacheUri: Uri?) -> Unit){ gemini.request(uri){ state -> when (state) { is GemState.ResponseImage -> onImageReady(state.cacheUri) else -> onState(state) } } } fun canGoBack(): Boolean = history.size > 1 @ExperimentalStdlibApi fun goBack(){ when { history.size >= 2 -> { logHistory() val previous = history[history.size - 2] history.removeLast() println("Requesting history item: $previous") request(previous) logHistory() } } } private fun logHistory(){ history.forEach { uri -> println("History: $uri") } } }