diff --git a/build.gradle.kts b/build.gradle.kts index bf6d606c..81e2264f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -72,7 +72,7 @@ subprojects { "ca/gosyer/jui/*/build", "**/generated/**", "ca/gosyer/jui/data/graphql", - "ca/gosyer/jui/uicore/icons/juiassets", + "ca/gosyer/jui/desktop/InjectAppComponent.kt" ) } plugins.withType { diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/state/SavedStateHandleFlow.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/state/SavedStateHandleFlow.kt index d5b71eb4..ddd6f29c 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/state/SavedStateHandleFlow.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/state/SavedStateHandleFlow.kt @@ -46,10 +46,6 @@ class SavedStateHandleStateFlow( ) : StateFlow by stateFlow { override var value: T get() = stateFlow.value - - /** - * May have to be called on the main thread if there is a livedata with the same [key] - */ set(value) = savedStateHandle.set(key, value) fun asStateFlow() = stateFlow diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/MangaScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/MangaScreenViewModel.kt index d623bd3e..f3b5eefd 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/MangaScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/MangaScreenViewModel.kt @@ -83,8 +83,8 @@ class MangaScreenViewModel( private val _chapters = MutableStateFlow>(persistentListOf()) val chapters = _chapters.asStateFlow() - private val _selectedIds = MutableStateFlow>(persistentListOf()) - val selectedItems = combine(chapters, _selectedIds) { chapters, selecteditems -> + private val selectedIds = MutableStateFlow>(persistentListOf()) + val selectedItems = combine(chapters, selectedIds) { chapters, selecteditems -> chapters.filter { it.isSelected(selecteditems) }.toImmutableList() }.stateIn(scope, SharingStarted.Eagerly, persistentListOf()) @@ -110,7 +110,7 @@ class MangaScreenViewModel( val categoriesExist = categories.map { it.isNotEmpty() } .stateIn(scope, SharingStarted.Eagerly, true) - val inActionMode = _selectedIds.map { it.isNotEmpty() } + val inActionMode = selectedIds.map { it.isNotEmpty() } .stateIn(scope, SharingStarted.Eagerly, false) private val chooseCategoriesFlow = MutableSharedFlow() @@ -292,15 +292,15 @@ class MangaScreenViewModel( scope.launch { manga.value?.let { updateChapter.await(chapterIds, read = read, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() loadChapters() } } } - fun markRead(id: Long?) = setRead(listOfNotNull(id).ifEmpty { _selectedIds.value }, true) + fun markRead(id: Long?) = setRead(listOfNotNull(id).ifEmpty { selectedIds.value }, true) - fun markUnread(id: Long?) = setRead(listOfNotNull(id).ifEmpty { _selectedIds.value }, false) + fun markUnread(id: Long?) = setRead(listOfNotNull(id).ifEmpty { selectedIds.value }, false) private fun setBookmarked( chapterIds: List, @@ -309,15 +309,15 @@ class MangaScreenViewModel( scope.launch { manga.value?.let { updateChapter.await(chapterIds, bookmarked = bookmark, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() loadChapters() } } } - fun bookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { _selectedIds.value }, true) + fun bookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { selectedIds.value }, true) - fun unBookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { _selectedIds.value }, false) + fun unBookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { selectedIds.value }, false) fun markPreviousRead(index: Int) { scope.launch { @@ -326,7 +326,7 @@ class MangaScreenViewModel( .sortedBy { it.chapter.index } .subList(0, index).map { it.chapter.id } // todo test updateChapter.await(chapters, read = true, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() loadChapters() } } @@ -339,12 +339,12 @@ class MangaScreenViewModel( fun deleteDownload(id: Long?) { scope.launch { if (id == null) { - val chapterIds = _selectedIds.value + val chapterIds = selectedIds.value deleteChapterDownload.await(chapterIds, onError = { toast(it.message.orEmpty()) }) selectedItems.value.forEach { it.setNotDownloaded() } - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() } else { chapters.value.find { it.chapter.id == id } ?.deleteDownload(deleteChapterDownload) @@ -361,38 +361,38 @@ class MangaScreenViewModel( fun selectAll() { scope.launch { - _selectedIds.value = chapters.value.map { it.chapter.id }.toImmutableList() + selectedIds.value = chapters.value.map { it.chapter.id }.toImmutableList() } } fun invertSelection() { scope.launch { - _selectedIds.value = chapters.value.map { it.chapter.id }.minus(_selectedIds.value).toImmutableList() + selectedIds.value = chapters.value.map { it.chapter.id }.minus(selectedIds.value).toImmutableList() } } fun selectChapter(id: Long) { scope.launch { - _selectedIds.value = _selectedIds.value.plus(id).toImmutableList() + selectedIds.value = selectedIds.value.plus(id).toImmutableList() } } fun unselectChapter(id: Long) { scope.launch { - _selectedIds.value = _selectedIds.value.minus(id).toImmutableList() + selectedIds.value = selectedIds.value.minus(id).toImmutableList() } } fun clearSelection() { scope.launch { - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() } } fun downloadChapters() { scope.launch { - batchChapterDownload.await(_selectedIds.value) - _selectedIds.value = persistentListOf() + batchChapterDownload.await(selectedIds.value) + selectedIds.value = persistentListOf() } } diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt index 1c146d40..4978fe4e 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt @@ -84,7 +84,7 @@ class ReaderMenuViewModel( @Assisted private val params: Params, ) : ViewModel(contextWrapper) { override val scope = MainScope() - private val _manga = MutableStateFlow(null) + private val manga = MutableStateFlow(null) private val viewerChapters = MutableStateFlow(ViewerChapters(null, null, null)) val previousChapter = viewerChapters.map { it.prevChapter }.stateIn(scope, SharingStarted.Eagerly, null) val chapter = viewerChapters.map { it.currChapter }.stateIn(scope, SharingStarted.Eagerly, null) @@ -133,7 +133,7 @@ class ReaderMenuViewModel( .getAsFlow() .map { it.toImmutableList() } .stateIn(scope, SharingStarted.Eagerly, persistentListOf()) - val readerMode = combine(readerPreferences.mode().getAsFlow(), _manga) { mode, manga -> + val readerMode = combine(readerPreferences.mode().getAsFlow(), manga) { mode, manga -> val mangaMode = manga?.meta?.juiReaderMode?.decodeURLQueryComponent() if ( mangaMode != null && @@ -258,7 +258,7 @@ class ReaderMenuViewModel( fun setMangaReaderMode(mode: String) { scope.launchDefault { - _manga.value?.let { + manga.value?.let { updateMangaMeta.await(it, mode, onError = { toast(it.message.orEmpty()) }) } initManga(params.mangaId) @@ -301,7 +301,7 @@ class ReaderMenuViewModel( getManga.asFlow(mangaId) .take(1) .onEach { - _manga.value = it + manga.value = it } .catch { _state.value = ReaderChapter.State.Error(it) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/settings/SettingsBackupScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/settings/SettingsBackupScreen.kt index 164c740d..fb5fcd19 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/settings/SettingsBackupScreen.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/settings/SettingsBackupScreen.kt @@ -107,8 +107,8 @@ class SettingsBackupScreen : Screen { SettingsBackupScreenContent( restoreStatus = vm.restoreStatus.collectAsState().value, creatingStatus = vm.creatingStatus.collectAsState().value, - missingSourceFlowHolder = vm.missingSourceFlowHolder, - createFlowHolder = vm.createFlowHolder, + missingSourceFlowHolder = vm.missingSourceFlow, + createFlowHolder = vm.createFlow, restoreFile = vm::restoreFile, restoreBackup = vm::restoreBackup, stopRestore = vm::stopRestore, @@ -129,12 +129,12 @@ class SettingsBackupViewModel( val restoreStatus = _restoreStatus.asStateFlow() private val _missingSourceFlow = MutableSharedFlow>>() - val missingSourceFlowHolder = StableHolder(_missingSourceFlow.asSharedFlow()) + val missingSourceFlow = StableHolder(_missingSourceFlow.asSharedFlow()) private val _creatingStatus = MutableStateFlow(Status.Nothing) val creatingStatus = _creatingStatus.asStateFlow() private val _createFlow = MutableSharedFlow() - val createFlowHolder = StableHolder(_createFlow.asSharedFlow()) + val createFlow = StableHolder(_createFlow.asSharedFlow()) fun restoreFile(source: Source) { scope.launch { diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/browse/SourceScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/browse/SourceScreenViewModel.kt index aaa2cf0d..51db2bf6 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/browse/SourceScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/browse/SourceScreenViewModel.kt @@ -76,13 +76,13 @@ class SourceScreenViewModel( private val _isLatest by savedStateHandle.getStateFlow { false } val isLatest = _isLatest.asStateFlow() - private val _usingFilters by savedStateHandle.getStateFlow { false } + private val usingFilters by savedStateHandle.getStateFlow { false } private val filters = MutableStateFlow?>(null) - private val _sourceSearchQuery by savedStateHandle.getStateFlow { initialQuery } + private val _sourceSearchQuery by savedStateHandle.getStateFlow { initialQuery } val sourceSearchQuery = _sourceSearchQuery.asStateFlow() - private val _query = MutableStateFlow(sourceSearchQuery.value) + private val query = MutableStateFlow(sourceSearchQuery.value) private val pager = MutableStateFlow(getPager()) @@ -104,19 +104,19 @@ class SourceScreenViewModel( fun setMode(toLatest: Boolean) { if (isLatest.value != toLatest) { _isLatest.value = toLatest - _query.value = null + query.value = null updatePager() } } private fun getPager(): SourcePager { val fetcher: suspend (page: Int) -> MangaPage? = when { - _query.value != null || _usingFilters.value -> { + query.value != null || usingFilters.value -> { { page -> getSearchManga.await( sourceId = source.id, page = page, - searchTerm = _query.value, + searchTerm = query.value, filters = filters.value, onError = { toast(it.message.orEmpty()) }, ) @@ -154,12 +154,12 @@ class SourceScreenViewModel( } fun startSearch(query: String?) { - _query.value = query + this.query.value = query updatePager() } fun setUsingFilters(usingFilters: Boolean) { - _usingFilters.value = usingFilters + this.usingFilters.value = usingFilters } fun search(query: String) { diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/updates/UpdatesScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/updates/UpdatesScreenViewModel.kt index 83249fa4..20e6416c 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/updates/UpdatesScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/updates/UpdatesScreenViewModel.kt @@ -64,8 +64,8 @@ class UpdatesScreenViewModel( }.toImmutableList() }.stateIn(scope, SharingStarted.Eagerly, persistentListOf()) - private val _selectedIds = MutableStateFlow>(persistentListOf()) - val selectedItems = combine(updates, _selectedIds) { updates, selectedItems -> + private val selectedIds = MutableStateFlow>(persistentListOf()) + val selectedItems = combine(updates, selectedIds) { updates, selectedItems -> updates.asSequence() .filterIsInstance() .filter { it.chapterDownloadItem.isSelected(selectedItems) } @@ -73,7 +73,7 @@ class UpdatesScreenViewModel( .toImmutableList() }.stateIn(scope, SharingStarted.Eagerly, persistentListOf()) - val inActionMode = _selectedIds.map { it.isNotEmpty() } + val inActionMode = selectedIds.map { it.isNotEmpty() } .stateIn(scope, SharingStarted.Eagerly, false) init { @@ -119,13 +119,13 @@ class UpdatesScreenViewModel( ) { scope.launch { updateChapter.await(chapterIds, read = read, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() } } - fun markRead(id: Long?) = setRead(listOfNotNull(id).ifEmpty { _selectedIds.value }, true) + fun markRead(id: Long?) = setRead(listOfNotNull(id).ifEmpty { selectedIds.value }, true) - fun markUnread(id: Long?) = setRead(listOfNotNull(id).ifEmpty { _selectedIds.value }, false) + fun markUnread(id: Long?) = setRead(listOfNotNull(id).ifEmpty { selectedIds.value }, false) private fun setBookmarked( chapterIds: List, @@ -133,20 +133,20 @@ class UpdatesScreenViewModel( ) { scope.launch { updateChapter.await(chapterIds, bookmarked = bookmark, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() } } - fun bookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { _selectedIds.value }, true) + fun bookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { selectedIds.value }, true) - fun unBookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { _selectedIds.value }, false) + fun unBookmarkChapter(id: Long?) = setBookmarked(listOfNotNull(id).ifEmpty { selectedIds.value }, false) fun downloadChapter(chapter: Chapter?) { scope.launch { if (chapter == null) { - val selectedIds = _selectedIds.value + val selectedIds = selectedIds.value batchChapterDownload.await(selectedIds, onError = { toast(it.message.orEmpty()) }) - _selectedIds.value = persistentListOf() + this@UpdatesScreenViewModel.selectedIds.value = persistentListOf() return@launch } queueChapterDownload.await(chapter.id, onError = { toast(it.message.orEmpty()) }) @@ -156,12 +156,12 @@ class UpdatesScreenViewModel( fun deleteDownloadedChapter(chapter: Chapter?) { scope.launchDefault { if (chapter == null) { - val selectedIds = _selectedIds.value + val selectedIds = selectedIds.value deleteChapterDownload.await(selectedIds, onError = { toast(it.message.orEmpty()) }) selectedItems.value.forEach { it.setNotDownloaded() } - _selectedIds.value = persistentListOf() + this@UpdatesScreenViewModel.selectedIds.value = persistentListOf() return@launchDefault } updates.value @@ -190,7 +190,7 @@ class UpdatesScreenViewModel( fun selectAll() { scope.launchDefault { - _selectedIds.value = updates.value.filterIsInstance() + selectedIds.value = updates.value.filterIsInstance() .map { it.chapterDownloadItem.chapter.id } .toImmutableList() } @@ -198,28 +198,28 @@ class UpdatesScreenViewModel( fun invertSelection() { scope.launchDefault { - _selectedIds.value = updates.value.filterIsInstance() + selectedIds.value = updates.value.filterIsInstance() .map { it.chapterDownloadItem.chapter.id } - .minus(_selectedIds.value) + .minus(selectedIds.value) .toImmutableList() } } fun selectChapter(id: Long) { scope.launchDefault { - _selectedIds.value = _selectedIds.value.plus(id).toImmutableList() + selectedIds.value = selectedIds.value.plus(id).toImmutableList() } } fun unselectChapter(id: Long) { scope.launchDefault { - _selectedIds.value = _selectedIds.value.minus(id).toImmutableList() + selectedIds.value = selectedIds.value.minus(id).toImmutableList() } } fun clearSelection() { scope.launchDefault { - _selectedIds.value = persistentListOf() + selectedIds.value = persistentListOf() } }