🛠️ MainViewModel reformat

* Reformatted MainEvent
* Changed various variables names

Thanks for idea:
Co-authored-by: Ridho Pratama <dhoable@gmail.com>
This commit is contained in:
Acclorite 2024-10-01 22:51:49 +03:00
parent 3d3d85415e
commit f888c3b0c7
14 changed files with 358 additions and 500 deletions

View file

@ -162,7 +162,7 @@ class BookRepositoryImpl @Inject constructor(
*
* @return If [Resource.Success] and returns null, then the book is up-to-date.
*/
override suspend fun checkTextForUpdate(bookId: Int): Resource<Pair<List<String>, List<Chapter>>?> {
override suspend fun checkForTextUpdate(bookId: Int): Resource<Pair<List<String>, List<Chapter>>?> {
yield()
try {

View file

@ -31,7 +31,7 @@ interface BookRepository {
textPath: String
): List<AnnotatedString>
suspend fun checkTextForUpdate(bookId: Int): Resource<Pair<List<String>, List<Chapter>>?>
suspend fun checkForTextUpdate(bookId: Int): Resource<Pair<List<String>, List<Chapter>>?>
suspend fun insertBook(
bookWithTextAndCover: BookWithTextAndCover

View file

@ -5,9 +5,9 @@ import ua.acclorite.book_story.domain.repository.BookRepository
import ua.acclorite.book_story.domain.util.Resource
import javax.inject.Inject
class CheckTextForUpdate @Inject constructor(private val repository: BookRepository) {
class CheckForTextUpdate @Inject constructor(private val repository: BookRepository) {
suspend fun execute(bookId: Int): Resource<Pair<List<String>, List<Chapter>>?> {
return repository.checkTextForUpdate(bookId)
return repository.checkForTextUpdate(bookId)
}
}

View file

@ -4,43 +4,43 @@ import androidx.compose.runtime.Immutable
@Immutable
sealed class MainEvent {
data class OnChangeLanguage(val lang: String) : MainEvent()
data class OnChangeTheme(val theme: String) : MainEvent()
data class OnChangeDarkTheme(val darkTheme: String) : MainEvent()
data class OnChangePureDark(val pureDark: String) : MainEvent()
data class OnChangeThemeContrast(val themeContrast: String) : MainEvent()
data class OnChangeFontFamily(val fontFamily: String) : MainEvent()
data class OnChangeFontStyle(val fontStyle: Boolean) : MainEvent()
data class OnChangeFontSize(val fontSize: Int) : MainEvent()
data class OnChangeLineHeight(val lineHeight: Int) : MainEvent()
data class OnChangeParagraphHeight(val paragraphHeight: Int) : MainEvent()
data class OnChangeParagraphIndentation(val indentation: Int) : MainEvent()
data class OnChangeShowStartScreen(val bool: Boolean) : MainEvent()
data class OnChangeCheckForUpdates(val bool: Boolean) : MainEvent()
data class OnChangeSidePadding(val sidePadding: Int) : MainEvent()
data class OnChangeDoubleClickTranslation(val bool: Boolean) : MainEvent()
data class OnChangeFastColorPresetChange(val bool: Boolean) : MainEvent()
data class OnChangeBrowseFilesStructure(val structure: String) : MainEvent()
data class OnChangeBrowseLayout(val layout: String) : MainEvent()
data class OnChangeBrowseAutoGridSize(val bool: Boolean) : MainEvent()
data class OnChangeBrowseGridSize(val size: Int) : MainEvent()
data class OnChangeBrowsePinFavoriteDirectories(val bool: Boolean) : MainEvent()
data class OnChangeBrowseSortOrder(val order: String) : MainEvent()
data class OnChangeBrowseSortOrderDescending(val bool: Boolean) : MainEvent()
data class OnChangeBrowseIncludedFilterItem(val item: String) : MainEvent()
data class OnChangeTextAlignment(val alignment: String) : MainEvent()
data class OnChangeDoublePressExit(val bool: Boolean) : MainEvent()
data class OnChangeLetterSpacing(val spacing: Int) : MainEvent()
data class OnChangeAbsoluteDark(val bool: Boolean) : MainEvent()
data class OnChangeCutoutPadding(val bool: Boolean) : MainEvent()
data class OnChangeFullscreen(val bool: Boolean) : MainEvent()
data class OnChangeKeepScreenOn(val bool: Boolean) : MainEvent()
data class OnChangeVerticalPadding(val padding: Int) : MainEvent()
data class OnChangeHideBarsOnFastScroll(val bool: Boolean) : MainEvent()
data class OnChangePerceptionExpander(val bool: Boolean) : MainEvent()
data class OnChangePerceptionExpanderPadding(val padding: Int) : MainEvent()
data class OnChangePerceptionExpanderThickness(val thickness: Int) : MainEvent()
data class OnChangeCheckForTextUpdate(val bool: Boolean) : MainEvent()
data class OnChangeCheckForTextUpdateToast(val bool: Boolean) : MainEvent()
data class OnChangeScreenOrientation(val orientation: String) : MainEvent()
data class OnChangeLanguage(val value: String) : MainEvent()
data class OnChangeTheme(val value: String) : MainEvent()
data class OnChangeDarkTheme(val value: String) : MainEvent()
data class OnChangePureDark(val value: String) : MainEvent()
data class OnChangeThemeContrast(val value: String) : MainEvent()
data class OnChangeFontFamily(val value: String) : MainEvent()
data class OnChangeFontStyle(val value: Boolean) : MainEvent()
data class OnChangeFontSize(val value: Int) : MainEvent()
data class OnChangeLineHeight(val value: Int) : MainEvent()
data class OnChangeParagraphHeight(val value: Int) : MainEvent()
data class OnChangeParagraphIndentation(val value: Int) : MainEvent()
data class OnChangeShowStartScreen(val value: Boolean) : MainEvent()
data class OnChangeCheckForUpdates(val value: Boolean) : MainEvent()
data class OnChangeSidePadding(val value: Int) : MainEvent()
data class OnChangeDoubleClickTranslation(val value: Boolean) : MainEvent()
data class OnChangeFastColorPresetChange(val value: Boolean) : MainEvent()
data class OnChangeBrowseFilesStructure(val value: String) : MainEvent()
data class OnChangeBrowseLayout(val value: String) : MainEvent()
data class OnChangeBrowseAutoGridSize(val value: Boolean) : MainEvent()
data class OnChangeBrowseGridSize(val value: Int) : MainEvent()
data class OnChangeBrowsePinFavoriteDirectories(val value: Boolean) : MainEvent()
data class OnChangeBrowseSortOrder(val value: String) : MainEvent()
data class OnChangeBrowseSortOrderDescending(val value: Boolean) : MainEvent()
data class OnChangeBrowseIncludedFilterItem(val value: String) : MainEvent()
data class OnChangeTextAlignment(val value: String) : MainEvent()
data class OnChangeDoublePressExit(val value: Boolean) : MainEvent()
data class OnChangeLetterSpacing(val value: Int) : MainEvent()
data class OnChangeAbsoluteDark(val value: Boolean) : MainEvent()
data class OnChangeCutoutPadding(val value: Boolean) : MainEvent()
data class OnChangeFullscreen(val value: Boolean) : MainEvent()
data class OnChangeKeepScreenOn(val value: Boolean) : MainEvent()
data class OnChangeVerticalPadding(val value: Int) : MainEvent()
data class OnChangeHideBarsOnFastScroll(val value: Boolean) : MainEvent()
data class OnChangePerceptionExpander(val value: Boolean) : MainEvent()
data class OnChangePerceptionExpanderPadding(val value: Int) : MainEvent()
data class OnChangePerceptionExpanderThickness(val value: Int) : MainEvent()
data class OnChangeCheckForTextUpdate(val value: Boolean) : MainEvent()
data class OnChangeCheckForTextUpdateToast(val value: Boolean) : MainEvent()
data class OnChangeScreenOrientation(val value: String) : MainEvent()
}

View file

@ -13,9 +13,9 @@ import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseSortOrder
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseFilesStructure
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseLayout
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseSortOrder
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toFilesStructure
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderScreenOrientation
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toReaderScreenOrientation
@ -187,7 +187,7 @@ data class MainState(
) { fastColorPresetChange },
browseFilesStructure = provideValue(
BROWSE_FILES_STRUCTURE, convert = { toFilesStructure() }
BROWSE_FILES_STRUCTURE, convert = { toBrowseFilesStructure() }
) { browseFilesStructure },
browseLayout = provideValue(

View file

@ -1,5 +1,6 @@
package ua.acclorite.book_story.presentation.data
import androidx.datastore.preferences.core.Preferences
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
@ -11,6 +12,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import ua.acclorite.book_story.domain.use_case.ChangeLanguage
import ua.acclorite.book_story.domain.use_case.CheckForUpdates
import ua.acclorite.book_story.domain.use_case.GetAllSettings
@ -20,9 +22,9 @@ import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
import ua.acclorite.book_story.presentation.core.util.BaseViewModel
import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel
import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseFilesStructure
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseLayout
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseSortOrder
import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toFilesStructure
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toReaderScreenOrientation
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toTextAlignment
import ua.acclorite.book_story.presentation.ui.toDarkTheme
@ -31,9 +33,7 @@ import ua.acclorite.book_story.presentation.ui.toTheme
import ua.acclorite.book_story.presentation.ui.toThemeContrast
import javax.inject.Inject
/**
* Stores all variables such as theme, language etc
*/
@HiltViewModel
class MainViewModel @Inject constructor(
private val stateHandle: SavedStateHandle,
@ -56,494 +56,312 @@ class MainViewModel @Inject constructor(
override val state = _state.asStateFlow()
override fun onEvent(event: MainEvent) {
when (event) {
is MainEvent.OnChangeLanguage -> {
viewModelScope.launch(Dispatchers.Main) {
changeLanguage.execute(event.lang)
updateStateWithSavedHandle {
it.copy(
language = event.lang
)
}
}
}
viewModelScope.launch(Dispatchers.IO) {
when (event) {
is MainEvent.OnChangeLanguage -> handleLanguageUpdate(event.value)
is MainEvent.OnChangeDarkTheme -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.DARK_THEME, event.darkTheme)
updateStateWithSavedHandle {
it.copy(
darkTheme = event.darkTheme.toDarkTheme()
)
is MainEvent.OnChangeDarkTheme -> handleDatastoreUpdate(
key = DataStoreConstants.DARK_THEME,
value = event.value,
updateState = {
it.copy(darkTheme = toDarkTheme())
}
}
}
)
is MainEvent.OnChangePureDark -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.PURE_DARK, event.pureDark)
updateStateWithSavedHandle {
it.copy(
pureDark = event.pureDark.toPureDark()
)
is MainEvent.OnChangePureDark -> handleDatastoreUpdate(
key = DataStoreConstants.PURE_DARK,
value = event.value,
updateState = {
it.copy(pureDark = toPureDark())
}
}
}
)
is MainEvent.OnChangeThemeContrast -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.THEME_CONTRAST, event.themeContrast)
updateStateWithSavedHandle {
it.copy(
themeContrast = event.themeContrast.toThemeContrast()
)
is MainEvent.OnChangeThemeContrast -> handleDatastoreUpdate(
key = DataStoreConstants.THEME_CONTRAST,
value = event.value,
updateState = {
it.copy(themeContrast = toThemeContrast())
}
}
}
)
is MainEvent.OnChangeTheme -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.THEME, event.theme)
updateStateWithSavedHandle {
it.copy(
theme = event.theme.toTheme()
)
is MainEvent.OnChangeTheme -> handleDatastoreUpdate(
key = DataStoreConstants.THEME,
value = event.value,
updateState = {
it.copy(theme = toTheme())
}
}
}
)
is MainEvent.OnChangeFontFamily -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.FONT, event.fontFamily)
updateStateWithSavedHandle {
is MainEvent.OnChangeFontFamily -> handleDatastoreUpdate(
key = DataStoreConstants.FONT,
value = event.value,
updateState = {
it.copy(
fontFamily = Constants.FONTS.find { font -> font.id == event.fontFamily }?.id
fontFamily = Constants.FONTS.find { font -> font.id == event.value }?.id
?: Constants.FONTS[0].id
)
}
}
}
)
is MainEvent.OnChangeFontStyle -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.IS_ITALIC, event.fontStyle)
updateStateWithSavedHandle {
it.copy(
isItalic = event.fontStyle
)
is MainEvent.OnChangeFontStyle -> handleDatastoreUpdate(
key = DataStoreConstants.IS_ITALIC,
value = event.value,
updateState = {
it.copy(isItalic = this)
}
}
}
)
is MainEvent.OnChangeFontSize -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.FONT_SIZE, event.fontSize)
updateStateWithSavedHandle {
it.copy(
fontSize = event.fontSize
)
is MainEvent.OnChangeFontSize -> handleDatastoreUpdate(
key = DataStoreConstants.FONT_SIZE,
value = event.value,
updateState = {
it.copy(fontSize = this)
}
}
}
)
is MainEvent.OnChangeLineHeight -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.LINE_HEIGHT, event.lineHeight)
updateStateWithSavedHandle {
it.copy(
lineHeight = event.lineHeight
)
is MainEvent.OnChangeLineHeight -> handleDatastoreUpdate(
key = DataStoreConstants.LINE_HEIGHT,
value = event.value,
updateState = {
it.copy(lineHeight = this)
}
}
}
)
is MainEvent.OnChangeParagraphHeight -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.PARAGRAPH_HEIGHT, event.paragraphHeight)
updateStateWithSavedHandle {
it.copy(
paragraphHeight = event.paragraphHeight
)
is MainEvent.OnChangeParagraphHeight -> handleDatastoreUpdate(
key = DataStoreConstants.PARAGRAPH_HEIGHT,
value = event.value,
updateState = {
it.copy(paragraphHeight = this)
}
}
}
)
is MainEvent.OnChangeParagraphIndentation -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.PARAGRAPH_INDENTATION,
event.indentation
)
updateStateWithSavedHandle {
it.copy(
paragraphIndentation = event.indentation
)
is MainEvent.OnChangeParagraphIndentation -> handleDatastoreUpdate(
key = DataStoreConstants.PARAGRAPH_INDENTATION,
value = event.value,
updateState = {
it.copy(paragraphIndentation = this)
}
}
}
)
is MainEvent.OnChangeShowStartScreen -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.SHOW_START_SCREEN, event.bool)
updateStateWithSavedHandle {
it.copy(
showStartScreen = event.bool
)
is MainEvent.OnChangeShowStartScreen -> handleDatastoreUpdate(
key = DataStoreConstants.SHOW_START_SCREEN,
value = event.value,
updateState = {
it.copy(showStartScreen = this)
}
}
}
)
is MainEvent.OnChangeCheckForUpdates -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.CHECK_FOR_UPDATES, event.bool)
updateStateWithSavedHandle {
it.copy(
checkForUpdates = event.bool
)
is MainEvent.OnChangeCheckForUpdates -> handleDatastoreUpdate(
key = DataStoreConstants.CHECK_FOR_UPDATES,
value = event.value,
updateState = {
it.copy(checkForUpdates = this)
}
}
}
)
is MainEvent.OnChangeSidePadding -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.SIDE_PADDING, event.sidePadding)
updateStateWithSavedHandle {
it.copy(
sidePadding = event.sidePadding
)
is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate(
key = DataStoreConstants.SIDE_PADDING,
value = event.value,
updateState = {
it.copy(sidePadding = this)
}
}
}
)
is MainEvent.OnChangeDoubleClickTranslation -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.DOUBLE_CLICK_TRANSLATION, event.bool)
updateStateWithSavedHandle {
it.copy(
doubleClickTranslation = event.bool
)
is MainEvent.OnChangeDoubleClickTranslation -> handleDatastoreUpdate(
key = DataStoreConstants.DOUBLE_CLICK_TRANSLATION,
value = event.value,
updateState = {
it.copy(doubleClickTranslation = this)
}
}
}
)
is MainEvent.OnChangeFastColorPresetChange -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.FAST_COLOR_PRESET_CHANGE, event.bool)
updateStateWithSavedHandle {
it.copy(
fastColorPresetChange = event.bool
)
is MainEvent.OnChangeFastColorPresetChange -> handleDatastoreUpdate(
key = DataStoreConstants.FAST_COLOR_PRESET_CHANGE,
value = event.value,
updateState = {
it.copy(fastColorPresetChange = this)
}
}
}
)
is MainEvent.OnChangeBrowseFilesStructure -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.BROWSE_FILES_STRUCTURE, event.structure)
updateStateWithSavedHandle {
it.copy(
browseFilesStructure = event.structure.toFilesStructure()
)
is MainEvent.OnChangeBrowseFilesStructure -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_FILES_STRUCTURE,
value = event.value,
updateState = {
it.copy(browseFilesStructure = toBrowseFilesStructure())
}
}
}
)
is MainEvent.OnChangeBrowseLayout -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.BROWSE_LAYOUT, event.layout)
updateStateWithSavedHandle {
it.copy(
browseLayout = event.layout.toBrowseLayout()
)
is MainEvent.OnChangeBrowseLayout -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_LAYOUT,
value = event.value,
updateState = {
it.copy(browseLayout = toBrowseLayout())
}
}
}
)
is MainEvent.OnChangeBrowseAutoGridSize -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.BROWSE_AUTO_GRID_SIZE, event.bool)
updateStateWithSavedHandle {
it.copy(
browseAutoGridSize = event.bool
)
is MainEvent.OnChangeBrowseAutoGridSize -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_AUTO_GRID_SIZE,
value = event.value,
updateState = {
it.copy(browseAutoGridSize = this)
}
}
}
)
is MainEvent.OnChangeBrowseGridSize -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.BROWSE_GRID_SIZE, event.size)
updateStateWithSavedHandle {
it.copy(
browseGridSize = event.size
)
is MainEvent.OnChangeBrowseGridSize -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_GRID_SIZE,
value = event.value,
updateState = {
it.copy(browseGridSize = this)
}
}
}
)
is MainEvent.OnChangeBrowsePinFavoriteDirectories -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.BROWSE_PIN_FAVORITE_DIRECTORIES,
event.bool
)
updateStateWithSavedHandle {
it.copy(
browsePinFavoriteDirectories = event.bool
)
is MainEvent.OnChangeBrowsePinFavoriteDirectories -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_PIN_FAVORITE_DIRECTORIES,
value = event.value,
updateState = {
it.copy(browsePinFavoriteDirectories = this)
}
}
}
)
is MainEvent.OnChangeBrowseSortOrder -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(DataStoreConstants.BROWSE_SORT_ORDER, event.order)
updateStateWithSavedHandle {
it.copy(
browseSortOrder = event.order.toBrowseSortOrder()
)
is MainEvent.OnChangeBrowseSortOrder -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_SORT_ORDER,
value = event.value,
updateState = {
it.copy(browseSortOrder = toBrowseSortOrder())
}
}
}
)
is MainEvent.OnChangeBrowseSortOrderDescending -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.BROWSE_SORT_ORDER_DESCENDING,
event.bool
)
updateStateWithSavedHandle {
it.copy(
browseSortOrderDescending = event.bool
)
is MainEvent.OnChangeBrowseSortOrderDescending -> handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_SORT_ORDER_DESCENDING,
value = event.value,
updateState = {
it.copy(browseSortOrderDescending = this)
}
}
}
)
is MainEvent.OnChangeBrowseIncludedFilterItem -> {
viewModelScope.launch(Dispatchers.IO) {
val set = _state.value.browseIncludedFilterItems.toMutableSet()
if (!set.add(event.item)) {
set.remove(event.item)
}
is MainEvent.OnChangeBrowseIncludedFilterItem -> handleBrowseIncludedFilterItemUpdate(
event.value
)
setDatastore.execute(DataStoreConstants.BROWSE_INCLUDED_FILTER_ITEMS, set)
updateStateWithSavedHandle {
it.copy(
browseIncludedFilterItems = set.toList()
)
is MainEvent.OnChangeTextAlignment -> handleDatastoreUpdate(
key = DataStoreConstants.TEXT_ALIGNMENT,
value = event.value,
updateState = {
it.copy(textAlignment = toTextAlignment())
}
}
}
)
is MainEvent.OnChangeTextAlignment -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.TEXT_ALIGNMENT,
event.alignment
)
updateStateWithSavedHandle {
it.copy(
textAlignment = event.alignment.toTextAlignment()
)
is MainEvent.OnChangeDoublePressExit -> handleDatastoreUpdate(
key = DataStoreConstants.DOUBLE_PRESS_EXIT,
value = event.value,
updateState = {
it.copy(doublePressExit = this)
}
}
}
)
is MainEvent.OnChangeDoublePressExit -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.DOUBLE_PRESS_EXIT,
event.bool
)
updateStateWithSavedHandle {
it.copy(
doublePressExit = event.bool
)
is MainEvent.OnChangeLetterSpacing -> handleDatastoreUpdate(
key = DataStoreConstants.LETTER_SPACING,
value = event.value,
updateState = {
it.copy(letterSpacing = this)
}
}
}
)
is MainEvent.OnChangeLetterSpacing -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.LETTER_SPACING,
event.spacing
)
updateStateWithSavedHandle {
it.copy(
letterSpacing = event.spacing
)
is MainEvent.OnChangeAbsoluteDark -> handleDatastoreUpdate(
key = DataStoreConstants.ABSOLUTE_DARK,
value = event.value,
updateState = {
it.copy(absoluteDark = this)
}
}
}
)
is MainEvent.OnChangeAbsoluteDark -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.ABSOLUTE_DARK,
event.bool
)
updateStateWithSavedHandle {
it.copy(
absoluteDark = event.bool
)
is MainEvent.OnChangeCutoutPadding -> handleDatastoreUpdate(
key = DataStoreConstants.CUTOUT_PADDING,
value = event.value,
updateState = {
it.copy(cutoutPadding = this)
}
}
}
)
is MainEvent.OnChangeCutoutPadding -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.CUTOUT_PADDING,
event.bool
)
updateStateWithSavedHandle {
it.copy(
cutoutPadding = event.bool
)
is MainEvent.OnChangeFullscreen -> handleDatastoreUpdate(
key = DataStoreConstants.FULLSCREEN,
value = event.value,
updateState = {
it.copy(fullscreen = this)
}
}
}
)
is MainEvent.OnChangeFullscreen -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.FULLSCREEN,
event.bool
)
updateStateWithSavedHandle {
it.copy(
fullscreen = event.bool
)
is MainEvent.OnChangeKeepScreenOn -> handleDatastoreUpdate(
key = DataStoreConstants.KEEP_SCREEN_ON,
value = event.value,
updateState = {
it.copy(keepScreenOn = this)
}
}
}
)
is MainEvent.OnChangeKeepScreenOn -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.KEEP_SCREEN_ON,
event.bool
)
updateStateWithSavedHandle {
it.copy(
keepScreenOn = event.bool
)
is MainEvent.OnChangeVerticalPadding -> handleDatastoreUpdate(
key = DataStoreConstants.VERTICAL_PADDING,
value = event.value,
updateState = {
it.copy(verticalPadding = this)
}
}
}
)
is MainEvent.OnChangeVerticalPadding -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.VERTICAL_PADDING,
event.padding
)
updateStateWithSavedHandle {
it.copy(
verticalPadding = event.padding
)
is MainEvent.OnChangeHideBarsOnFastScroll -> handleDatastoreUpdate(
key = DataStoreConstants.HIDE_BARS_ON_FAST_SCROLL,
value = event.value,
updateState = {
it.copy(hideBarsOnFastScroll = this)
}
}
}
)
is MainEvent.OnChangeHideBarsOnFastScroll -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.HIDE_BARS_ON_FAST_SCROLL,
event.bool
)
updateStateWithSavedHandle {
it.copy(
hideBarsOnFastScroll = event.bool
)
is MainEvent.OnChangePerceptionExpander -> handleDatastoreUpdate(
key = DataStoreConstants.PERCEPTION_EXPANDER,
value = event.value,
updateState = {
it.copy(perceptionExpander = this)
}
}
}
)
is MainEvent.OnChangePerceptionExpander -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.PERCEPTION_EXPANDER,
event.bool
)
updateStateWithSavedHandle {
it.copy(
perceptionExpander = event.bool
)
is MainEvent.OnChangePerceptionExpanderPadding -> handleDatastoreUpdate(
key = DataStoreConstants.PERCEPTION_EXPANDER_PADDING,
value = event.value,
updateState = {
it.copy(perceptionExpanderPadding = this)
}
}
}
)
is MainEvent.OnChangePerceptionExpanderPadding -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.PERCEPTION_EXPANDER_PADDING,
event.padding
)
updateStateWithSavedHandle {
it.copy(
perceptionExpanderPadding = event.padding
)
is MainEvent.OnChangePerceptionExpanderThickness -> handleDatastoreUpdate(
key = DataStoreConstants.PERCEPTION_EXPANDER_THICKNESS,
value = event.value,
updateState = {
it.copy(perceptionExpanderThickness = this)
}
}
}
)
is MainEvent.OnChangePerceptionExpanderThickness -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.PERCEPTION_EXPANDER_THICKNESS,
event.thickness
)
updateStateWithSavedHandle {
it.copy(
perceptionExpanderThickness = event.thickness
)
is MainEvent.OnChangeCheckForTextUpdate -> handleDatastoreUpdate(
key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE,
value = event.value,
updateState = {
it.copy(checkForTextUpdate = this)
}
}
}
)
is MainEvent.OnChangeCheckForTextUpdate -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.CHECK_FOR_TEXT_UPDATE,
event.bool
)
updateStateWithSavedHandle {
it.copy(
checkForTextUpdate = event.bool
)
is MainEvent.OnChangeCheckForTextUpdateToast -> handleDatastoreUpdate(
key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE_TOAST,
value = event.value,
updateState = {
it.copy(checkForTextUpdateToast = this)
}
}
}
)
is MainEvent.OnChangeCheckForTextUpdateToast -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.CHECK_FOR_TEXT_UPDATE_TOAST,
event.bool
)
updateStateWithSavedHandle {
it.copy(
checkForTextUpdateToast = event.bool
)
is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate(
key = DataStoreConstants.SCREEN_ORIENTATION,
value = event.value,
updateState = {
it.copy(screenOrientation = toReaderScreenOrientation())
}
}
}
is MainEvent.OnChangeScreenOrientation -> {
viewModelScope.launch(Dispatchers.IO) {
setDatastore.execute(
DataStoreConstants.SCREEN_ORIENTATION,
event.orientation
)
updateStateWithSavedHandle {
it.copy(
screenOrientation = event.orientation.toReaderScreenOrientation()
)
}
}
)
}
}
}
@ -565,6 +383,7 @@ class MainViewModel @Inject constructor(
)
}
}
/* - - - - - - - - - - - */
updateStateWithSavedHandle { settings }
isSettingsReady.update { true }
@ -602,6 +421,29 @@ class MainViewModel @Inject constructor(
}
}
private suspend fun handleLanguageUpdate(value: String) {
withContext(Dispatchers.Main) {
changeLanguage.execute(value)
updateStateWithSavedHandle {
it.copy(language = value)
}
}
}
private suspend fun handleBrowseIncludedFilterItemUpdate(value: String) {
val set = _state.value.browseIncludedFilterItems.toMutableSet()
if (!set.add(value)) {
set.remove(value)
}
handleDatastoreUpdate(
key = DataStoreConstants.BROWSE_INCLUDED_FILTER_ITEMS,
value = set,
updateState = {
it.copy(browseIncludedFilterItems = toList())
}
)
}
/**
* Updates [MainState] along with [SavedStateHandle].
*/
@ -613,4 +455,20 @@ class MainViewModel @Inject constructor(
function(it)
}
}
/**
* Handles and updates Datastore.
*/
private suspend fun <V> handleDatastoreUpdate(
key: Preferences.Key<V>,
value: V,
updateState: V.(MainState) -> MainState
) {
withContext(Dispatchers.IO) {
setDatastore.execute(key = key, value = value)
updateStateWithSavedHandle {
value.updateState(it)
}
}
}
}

View file

@ -102,7 +102,7 @@ private fun BookInfoScreen(snackbarState: SnackbarHostState) {
refreshing = state.value.updating || state.value.checkingForUpdate,
onRefresh = {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState,
context
)
@ -122,7 +122,7 @@ private fun BookInfoScreen(snackbarState: SnackbarHostState) {
if (state.value.showMoveDialog) {
BookInfoMoveDialog()
}
if (state.value.showConfirmUpdateDialog) {
if (state.value.showConfirmTextUpdateDialog) {
BookInfoConfirmUpdateDialog(snackbarHostState = snackbarState)
}
@ -261,7 +261,7 @@ private fun BookInfoScreen(snackbarState: SnackbarHostState) {
}
if (!state.value.updating) {
onEvent(BookInfoEvent.OnCancelUpdate)
onEvent(BookInfoEvent.OnCancelTextUpdate)
onNavigate {
navigateBack()
}

View file

@ -89,7 +89,7 @@ fun BookInfoTopBar(
}
} else {
GoBackButton(onNavigate = onNavigate, enabled = !state.value.updating) {
onEvent(BookInfoEvent.OnCancelUpdate)
onEvent(BookInfoEvent.OnCancelTextUpdate)
}
}
},
@ -114,7 +114,7 @@ fun BookInfoTopBar(
enabled = !state.value.updating && !state.value.checkingForUpdate
) {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState,
context
)

View file

@ -36,10 +36,10 @@ fun BookInfoConfirmUpdateDialog(snackbarHostState: SnackbarHostState) {
),
actionText = stringResource(id = R.string.confirm),
isActionEnabled = true,
onDismiss = { onEvent(BookInfoEvent.OnDismissConfirmUpdateDialog) },
onDismiss = { onEvent(BookInfoEvent.OnDismissConfirmTextUpdateDialog) },
onAction = {
onEvent(
BookInfoEvent.OnConfirmUpdate(
BookInfoEvent.OnConfirmTextUpdate(
snackbarState = snackbarHostState,
context = context,
refreshList = {

View file

@ -101,25 +101,25 @@ sealed class BookInfoEvent {
val snackbarState: SnackbarHostState
) : BookInfoEvent()
data class OnCheckForUpdate(
val snackbarState: SnackbarHostState,
val context: Context
) : BookInfoEvent()
data class OnNavigateToReaderScreen(
val onNavigate: OnNavigate
) : BookInfoEvent()
data object OnDismissConfirmUpdateDialog : BookInfoEvent()
data class OnCheckForTextUpdate(
val snackbarState: SnackbarHostState,
val context: Context
) : BookInfoEvent()
data class OnShowConfirmUpdateDialog(
data object OnDismissConfirmTextUpdateDialog : BookInfoEvent()
data class OnShowConfirmTextUpdateDialog(
val updatedText: List<String>,
val updatedChapters: List<Chapter>
) : BookInfoEvent()
data object OnCancelUpdate : BookInfoEvent()
data object OnCancelTextUpdate : BookInfoEvent()
data class OnConfirmUpdate(
data class OnConfirmTextUpdate(
val snackbarState: SnackbarHostState,
val context: Context,
val refreshList: (Book) -> Unit

View file

@ -13,7 +13,7 @@ data class BookInfoState(
val checkingForUpdate: Boolean = false,
val updating: Boolean = false,
val showConfirmUpdateDialog: Boolean = false,
val showConfirmTextUpdateDialog: Boolean = false,
val updatedText: List<String>? = null,
val updatedChapters: List<Chapter>? = null,

View file

@ -26,7 +26,7 @@ import ua.acclorite.book_story.domain.model.BookWithText
import ua.acclorite.book_story.domain.model.Category
import ua.acclorite.book_story.domain.model.History
import ua.acclorite.book_story.domain.use_case.CanResetCover
import ua.acclorite.book_story.domain.use_case.CheckTextForUpdate
import ua.acclorite.book_story.domain.use_case.CheckForTextUpdate
import ua.acclorite.book_story.domain.use_case.DeleteBooks
import ua.acclorite.book_story.domain.use_case.GetBookById
import ua.acclorite.book_story.domain.use_case.InsertHistory
@ -54,7 +54,7 @@ class BookInfoViewModel @Inject constructor(
private val getBookById: GetBookById,
private val canResetCover: CanResetCover,
private val resetCoverImage: ResetCoverImage,
private val checkTextForUpdate: CheckTextForUpdate,
private val checkForTextUpdate: CheckForTextUpdate,
) : BaseViewModel<BookInfoState, BookInfoEvent>() {
private val _state = MutableStateFlow(BookInfoState())
@ -450,12 +450,12 @@ class BookInfoViewModel @Inject constructor(
}
}
is BookInfoEvent.OnCheckForUpdate -> {
is BookInfoEvent.OnCheckForTextUpdate -> {
updateJob?.cancel()
updateJob = launch(Dispatchers.IO) {
_state.update {
it.copy(
showConfirmUpdateDialog = false,
showConfirmTextUpdateDialog = false,
checkingForUpdate = true,
editTitle = false,
editAuthor = false,
@ -465,7 +465,7 @@ class BookInfoViewModel @Inject constructor(
yield()
val result = checkTextForUpdate.execute(bookId = _state.value.book.id)
val result = checkForTextUpdate.execute(bookId = _state.value.book.id)
when (result) {
is Resource.Success -> {
if (result.data == null) {
@ -486,7 +486,7 @@ class BookInfoViewModel @Inject constructor(
return@launch
} else {
onEvent(
BookInfoEvent.OnShowConfirmUpdateDialog(
BookInfoEvent.OnShowConfirmTextUpdateDialog(
updatedText = result.data.first,
updatedChapters = result.data.second
)
@ -508,7 +508,7 @@ class BookInfoViewModel @Inject constructor(
action = event.context.getString(R.string.retry),
onAction = {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState = event.snackbarState,
context = event.context
)
@ -531,32 +531,32 @@ class BookInfoViewModel @Inject constructor(
}
}
is BookInfoEvent.OnDismissConfirmUpdateDialog -> {
is BookInfoEvent.OnDismissConfirmTextUpdateDialog -> {
_state.update {
it.copy(
showConfirmUpdateDialog = false,
showConfirmTextUpdateDialog = false,
updatedText = null,
updatedChapters = null
)
}
}
is BookInfoEvent.OnShowConfirmUpdateDialog -> {
is BookInfoEvent.OnShowConfirmTextUpdateDialog -> {
_state.update {
it.copy(
showConfirmUpdateDialog = true,
showConfirmTextUpdateDialog = true,
updatedText = event.updatedText,
updatedChapters = event.updatedChapters
)
}
}
is BookInfoEvent.OnConfirmUpdate -> {
is BookInfoEvent.OnConfirmTextUpdate -> {
launch(Dispatchers.IO) {
_state.update {
it.copy(
updating = true,
showConfirmUpdateDialog = false
showConfirmTextUpdateDialog = false
)
}
@ -569,7 +569,7 @@ class BookInfoViewModel @Inject constructor(
action = event.context.getString(R.string.retry),
onAction = {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState = event.snackbarState,
context = event.context
)
@ -614,7 +614,7 @@ class BookInfoViewModel @Inject constructor(
action = event.context.getString(R.string.retry),
onAction = {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState = event.snackbarState,
context = event.context
)
@ -646,7 +646,7 @@ class BookInfoViewModel @Inject constructor(
action = event.context.getString(R.string.retry),
onAction = {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState = event.snackbarState,
context = event.context
)
@ -696,12 +696,12 @@ class BookInfoViewModel @Inject constructor(
}
}
is BookInfoEvent.OnCancelUpdate -> {
is BookInfoEvent.OnCancelTextUpdate -> {
_state.update {
updateJob?.cancel()
it.copy(
showConfirmUpdateDialog = false,
showConfirmTextUpdateDialog = false,
checkingForUpdate = false,
updatedText = null,
updatedChapters = null
@ -711,7 +711,7 @@ class BookInfoViewModel @Inject constructor(
is BookInfoEvent.OnNavigateToReaderScreen -> {
launch {
onEvent(BookInfoEvent.OnCancelUpdate)
onEvent(BookInfoEvent.OnCancelTextUpdate)
_state.value.book.id.let {
insertHistory.execute(
History(
@ -757,7 +757,7 @@ class BookInfoViewModel @Inject constructor(
if (screen.startUpdate) {
onEvent(
BookInfoEvent.OnCheckForUpdate(
BookInfoEvent.OnCheckForTextUpdate(
snackbarState = snackbarState,
context = context
)

View file

@ -26,7 +26,7 @@ import kotlinx.coroutines.withContext
import kotlinx.coroutines.yield
import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.model.Book
import ua.acclorite.book_story.domain.use_case.CheckTextForUpdate
import ua.acclorite.book_story.domain.use_case.CheckForTextUpdate
import ua.acclorite.book_story.domain.use_case.GetBookById
import ua.acclorite.book_story.domain.use_case.GetLatestHistory
import ua.acclorite.book_story.domain.use_case.GetText
@ -47,7 +47,7 @@ class ReaderViewModel @Inject constructor(
private val getText: GetText,
private val getLatestHistory: GetLatestHistory,
private val getBookById: GetBookById,
private val checkTextForUpdate: CheckTextForUpdate
private val checkForTextUpdate: CheckForTextUpdate
) : BaseViewModel<ReaderState, ReaderEvent>() {
private val _state = MutableStateFlow(ReaderState())
@ -420,7 +420,7 @@ class ReaderViewModel @Inject constructor(
yield()
val result = checkTextForUpdate.execute(bookId = _state.value.book.id)
val result = checkForTextUpdate.execute(bookId = _state.value.book.id)
when (result) {
is Resource.Success -> {
if (result.data == null) {

View file

@ -7,6 +7,6 @@ enum class BrowseFilesStructure {
ALL_FILES, DIRECTORIES
}
fun String.toFilesStructure(): BrowseFilesStructure {
fun String.toBrowseFilesStructure(): BrowseFilesStructure {
return BrowseFilesStructure.valueOf(this)
}