@ -5,17 +5,20 @@
package org.mozilla.fenix.translations
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.mapNotNull
import mozilla.components.browser.state.selector.findTab
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.translate.initialFromLanguage
import mozilla.components.concept.engine.translate.initialToLanguage
import mozilla.components.lib.state.helpers.AbstractBinding
/ * *
* Helper for observing Translation state from [ BrowserStore ] .
* Helper for observing Translation state from both [ BrowserState . translationEngine ]
* and [ TabSessionState . translationsState ] .
* /
class TranslationsDialogBinding (
browserStore : BrowserStore ,
@ -24,17 +27,59 @@ class TranslationsDialogBinding(
private val getTranslatedPageTitle : ( localizedFrom : String ? , localizedTo : String ? ) -> String ,
) : AbstractBinding < BrowserState > ( browserStore ) {
@Suppress ( " LongMethod " )
override suspend fun onState ( flow : Flow < BrowserState > ) {
flow . mapNotNull { state -> state . findTab ( sessionId ) }
// Browser level flows
val browserFlow = flow . mapNotNull { state -> state }
. distinctUntilChangedBy {
it . translationEngine
}
// Session level flows
val sessionFlow = flow . mapNotNull { state -> state . findTab ( sessionId ) }
. distinctUntilChangedBy {
it . translationsState
}
. collect { sessionState ->
val translationsState = sessionState . translationsState
// Applying the flows together
sessionFlow
. combine ( browserFlow ) { sessionState , browserState -> TranslationsFlowState ( sessionState , browserState ) }
. collect {
state ->
// Browser Translations State Behavior (Global)
val browserTranslationsState = state . browserState . translationEngine
val translateFromLanguages =
browserTranslationsState . supportedLanguages ?. fromLanguages
translateFromLanguages ?. let {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslateFromLanguages (
translateFromLanguages ,
) ,
)
}
val translateToLanguages =
browserTranslationsState . supportedLanguages ?. toLanguages
translateToLanguages ?. let {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslateToLanguages (
translateToLanguages ,
) ,
)
}
// Dispatch engine level errors
if ( browserTranslationsState . engineError != null ) {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslationError ( browserTranslationsState . engineError ) ,
)
}
// Session Translations State Behavior (Tab)
val sessionTranslationsState = state . sessionState . translationsState
val fromSelected =
translationsState . translationEngineState ?. initialFromLanguage (
translationsState . supportedLanguages ?. fromLanguages ,
sessionT ranslationsState. translationEngineState ?. initialFromLanguage (
translat eF romLanguages,
)
fromSelected ?. let {
@ -46,8 +91,8 @@ class TranslationsDialogBinding(
}
val toSelected =
t ranslationsState. translationEngineState ?. initialToLanguage (
translat ionsState. supportedLanguages ?. t oLanguages,
sessionT ranslationsState. translationEngineState ?. initialToLanguage (
translat eT oLanguages,
)
toSelected ?. let {
translationsDialogStore . dispatch (
@ -71,35 +116,18 @@ class TranslationsDialogBinding(
)
}
val translateFromLanguages = translationsState . supportedLanguages ?. fromLanguages
translateFromLanguages ?. let {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslateFromLanguages (
translateFromLanguages ,
) ,
)
}
val translateToLanguages = translationsState . supportedLanguages ?. toLanguages
translateToLanguages ?. let {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslateToLanguages (
translateToLanguages ,
) ,
)
}
if ( translationsState . isTranslateProcessing ) {
if ( sessionTranslationsState . isTranslateProcessing ) {
updateStoreIfIsTranslateProcessing ( )
}
if ( translationsState. isTranslated && ! t ranslationsState. isTranslateProcessing ) {
if ( sessionTranslationsState . isTranslated && ! sessionTranslationsState . isTranslateProcessing ) {
updateStoreIfTranslated ( )
}
if ( translationsState . translationError != null ) {
// A session error may override a browser error
if ( sessionTranslationsState . translationError != null ) {
translationsDialogStore . dispatch (
TranslationsDialogAction . UpdateTranslationError ( t ranslationsState. translationError ) ,
TranslationsDialogAction . UpdateTranslationError ( sessionTranslationsState . translationError ) ,
)
}
}