ReaderStateReducer.kt
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package mozilla.components.browser.state.reducer
import mozilla.components.browser.state.action.EngineAction
import mozilla.components.browser.state.action.ReaderAction
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.ReaderState
internal object ReaderStateReducer {
/**
* [EngineAction] Reducer function for modifying a specific [ReaderState]
* of a [BrowserState].
*/
fun reduce(state: BrowserState, action: ReaderAction): BrowserState = when (action) {
is ReaderAction.UpdateReaderableAction -> state.copyWithReaderState(action.tabId) {
it.copy(readerable = action.readerable)
}
is ReaderAction.UpdateReaderActiveAction -> state.copyWithReaderState(action.tabId) {
it.copy(active = action.active)
}
is ReaderAction.UpdateReaderableCheckRequiredAction -> state.copyWithReaderState(action.tabId) {
it.copy(checkRequired = action.checkRequired)
}
is ReaderAction.UpdateReaderConnectRequiredAction -> state.copyWithReaderState(action.tabId) {
it.copy(connectRequired = action.connectRequired)
}
is ReaderAction.UpdateReaderBaseUrlAction -> state.copyWithReaderState(action.tabId) {
it.copy(baseUrl = action.baseUrl)
}
is ReaderAction.UpdateReaderActiveUrlAction -> state.copyWithReaderState(action.tabId) {
it.copy(activeUrl = action.activeUrl)
}
is ReaderAction.ClearReaderActiveUrlAction -> state.copyWithReaderState(action.tabId) {
it.copy(activeUrl = null)
}
is ReaderAction.UpdateReaderScrollYAction -> state.copyWithReaderState(action.tabId) {
if (it.active) {
it.copy(scrollY = action.scrollY)
} else {
it
}
}
}
}
private fun BrowserState.copyWithReaderState(
tabId: String,
update: (ReaderState) -> ReaderState,
): BrowserState {
return copy(
tabs = tabs.updateTabs(tabId) { current ->
current.copy(readerState = update.invoke(current.readerState))
} ?: tabs,
)
}