package org.thoughtcrime.securesms.mediasend.v2.text.send import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.subjects.PublishSubject import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.database.model.IdentityRecord import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryPostCreationState import org.thoughtcrime.securesms.util.livedata.Store class TextStoryPostSendViewModel(private val repository: TextStoryPostSendRepository) : ViewModel() { private val store = Store(TextStoryPostSendState.INIT) private val untrustedIdentitySubject = PublishSubject.create>() private val disposables = CompositeDisposable() val state: LiveData = store.stateLiveData val untrustedIdentities: Observable> = untrustedIdentitySubject override fun onCleared() { disposables.clear() } fun onSending() { store.update { TextStoryPostSendState.SENDING } } fun onSendCancelled() { store.update { TextStoryPostSendState.INIT } } fun onSend(contactSearchKeys: Set, textStoryPostCreationState: TextStoryPostCreationState, linkPreview: LinkPreview?) { store.update { TextStoryPostSendState.SENDING } disposables += repository.send(contactSearchKeys, textStoryPostCreationState, linkPreview).subscribeBy( onSuccess = { when (it) { is TextStoryPostSendResult.Success -> { store.update { TextStoryPostSendState.SENT } } is TextStoryPostSendResult.UntrustedRecordsError -> { untrustedIdentitySubject.onNext(it.untrustedRecords) store.update { TextStoryPostSendState.INIT } } } }, onError = { // TODO [stories] -- Error of some sort. store.update { TextStoryPostSendState.INIT } } ) } class Factory(private val repository: TextStoryPostSendRepository) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return modelClass.cast(TextStoryPostSendViewModel(repository)) as T } } }