Skip to content

Commit

Permalink
Improve search and add new search keys (#318)
Browse files Browse the repository at this point in the history
* Improve search and add new search keys

* Add search keys buttons

* Add new search keys tags

* Fix test
  • Loading branch information
alexandregpereira authored Aug 16, 2024
1 parent d784799 commit c7cebe3
Show file tree
Hide file tree
Showing 26 changed files with 607 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ internal class AppEventDispatcherImpl(
private fun observeShareContentEvents() {
shareContentEventDispatcher.events.filterIsInstance<ShareContentEvent.Import.OnFinish>()
.onEach {
monsterEventDispatcher.dispatchEvent(MonsterEvent.OnCompendiumChanges)
monsterEventDispatcher.dispatchEvent(MonsterEvent.OnCompendiumChanges())
}.launchIn(scope)
}
}
1 change: 1 addition & 0 deletions domain/monster/event/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
multiplatform {
commonMain {
implementation(project(":feature:sync:event"))
implementation(project(":feature:monster-registration:event"))
implementation(libs.koin.core)
implementation(libs.kotlin.coroutines.core)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package br.alexandregpereira.hunter.monster.event

import br.alexandregpereira.hunter.event.EventListener
import br.alexandregpereira.hunter.monster.event.MonsterEvent.OnVisibilityChanges
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationResult
import br.alexandregpereira.hunter.monster.registration.event.collectOnSaved
import br.alexandregpereira.hunter.sync.event.SyncEventListener
import br.alexandregpereira.hunter.sync.event.collectSyncFinishedEvents
import kotlinx.coroutines.MainScope
Expand All @@ -9,7 +12,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
Expand All @@ -35,11 +37,12 @@ sealed class MonsterEvent {
val monsterIndex: String
) : MonsterEvent()

data object OnCompendiumChanges : MonsterEvent()
data class OnCompendiumChanges(val monsterIndex: String? = null) : MonsterEvent()
}

internal fun MonsterEventDispatcher(
syncEventListener: SyncEventListener,
monsterRegistrationEventListener: EventListener<MonsterRegistrationResult>,
): MonsterEventDispatcher = object : MonsterEventDispatcher {
private val _events: MutableSharedFlow<MonsterEvent> = MutableSharedFlow(
extraBufferCapacity = 10,
Expand All @@ -51,7 +54,11 @@ internal fun MonsterEventDispatcher(

init {
syncEventListener.collectSyncFinishedEvents {
dispatchEvent(MonsterEvent.OnCompendiumChanges)
dispatchEvent(MonsterEvent.OnCompendiumChanges())
}.launchIn(scope)

monsterRegistrationEventListener.collectOnSaved { index ->
dispatchEvent(MonsterEvent.OnCompendiumChanges(index))
}.launchIn(scope)
}

Expand All @@ -73,9 +80,9 @@ fun MonsterEventDispatcher.collectOnMonsterPageChanges(
}

fun MonsterEventDispatcher.collectOnMonsterCompendiumChanges(
action: () -> Unit
): Flow<Unit> {
return events.filter { it is MonsterEvent.OnCompendiumChanges }.map { action() }
action: (MonsterEvent.OnCompendiumChanges) -> Unit
): Flow<MonsterEvent.OnCompendiumChanges> {
return events.map { it as? MonsterEvent.OnCompendiumChanges }.filterNotNull().onEach(action)
}

fun emptyMonsterEventDispatcher(): MonsterEventDispatcher {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package br.alexandregpereira.hunter.monster.event

import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEventListener
import org.koin.dsl.module

val monsterEventModule = module {
single<MonsterEventDispatcher> { MonsterEventDispatcher(get()) }
single<MonsterEventDispatcher> {
MonsterEventDispatcher(get(), get<MonsterRegistrationEventListener>())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package br.alexandregpereira.hunter.monster.compendium.state
import br.alexandregpereira.hunter.domain.sync.IsFirstTime
import br.alexandregpereira.hunter.domain.usecase.GetLastCompendiumScrollItemPositionUseCase
import br.alexandregpereira.hunter.domain.usecase.SaveCompendiumScrollItemPositionUseCase
import br.alexandregpereira.hunter.event.EventListener
import br.alexandregpereira.hunter.folder.preview.event.FolderPreviewEvent
import br.alexandregpereira.hunter.folder.preview.event.FolderPreviewEventDispatcher
import br.alexandregpereira.hunter.localization.AppLocalization
Expand All @@ -35,8 +34,6 @@ import br.alexandregpereira.hunter.monster.event.MonsterEvent.OnVisibilityChange
import br.alexandregpereira.hunter.monster.event.MonsterEventDispatcher
import br.alexandregpereira.hunter.monster.event.collectOnMonsterCompendiumChanges
import br.alexandregpereira.hunter.monster.event.collectOnMonsterPageChanges
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationResult
import br.alexandregpereira.hunter.monster.registration.event.collectOnSaved
import br.alexandregpereira.hunter.state.MutableActionHandler
import br.alexandregpereira.hunter.state.UiModel
import br.alexandregpereira.hunter.sync.event.SyncEventDispatcher
Expand All @@ -60,7 +57,6 @@ class MonsterCompendiumStateHolder internal constructor(
private val folderPreviewEventDispatcher: FolderPreviewEventDispatcher,
private val monsterEventDispatcher: MonsterEventDispatcher,
private val syncEventDispatcher: SyncEventDispatcher,
private val monsterRegistrationEventListener: EventListener<MonsterRegistrationResult>,
private val dispatcher: CoroutineDispatcher,
private val analytics: MonsterCompendiumAnalytics,
private val isFirstTime: IsFirstTime,
Expand Down Expand Up @@ -232,13 +228,11 @@ class MonsterCompendiumStateHolder internal constructor(
}.launchIn(scope)

monsterEventDispatcher.collectOnMonsterCompendiumChanges {
loadMonsters()
}.launchIn(scope)

monsterRegistrationEventListener.collectOnSaved { monsterIndex ->
scope.launch {
fetchMonsterCompendium()
navigateToCompendiumIndexFromMonsterIndex(monsterIndex, shouldAnimate = false)
it.monsterIndex?.let { monsterIndex ->
navigateToCompendiumIndexFromMonsterIndex(monsterIndex, shouldAnimate = false)
}
}
}.launchIn(scope)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package br.alexandregpereira.hunter.monster.compendium.state.di

import br.alexandregpereira.hunter.monster.compendium.state.MonsterCompendiumAnalytics
import br.alexandregpereira.hunter.monster.compendium.state.MonsterCompendiumStateHolder
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEventListener
import org.koin.dsl.module
import kotlin.native.HiddenFromObjC

Expand All @@ -32,7 +31,6 @@ val monsterCompendiumModule = module {
folderPreviewEventDispatcher = get(),
monsterEventDispatcher = get(),
syncEventDispatcher = get(),
monsterRegistrationEventListener = get<MonsterRegistrationEventListener>(),
dispatcher = get(),
analytics = MonsterCompendiumAnalytics(get()),
appLocalization = get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@ import br.alexandregpereira.hunter.monster.compendium.state.MonsterCompendiumSta
import br.alexandregpereira.hunter.monster.compendium.state.MonsterPreviewState
import br.alexandregpereira.hunter.monster.event.MonsterEventDispatcher
import br.alexandregpereira.hunter.monster.event.emptyMonsterEventDispatcher
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEventListener
import br.alexandregpereira.hunter.monster.registration.event.emptyMonsterRegistrationEventListener
import br.alexandregpereira.hunter.sync.event.SyncEventDispatcher
import br.alexandregpereira.hunter.sync.event.emptySyncEventDispatcher
import kotlinx.coroutines.Dispatchers
Expand All @@ -68,7 +66,6 @@ class MonsterCompendiumStateHolderTest {
private val folderPreviewEventDispatcher: FolderPreviewEventDispatcher = emptyFolderPreviewEventDispatcher()
private val monsterDetailEventDispatcher: MonsterEventDispatcher = emptyMonsterEventDispatcher()
private val syncEventDispatcher: SyncEventDispatcher = emptySyncEventDispatcher()
private val monsterRegistrationEventListener: MonsterRegistrationEventListener = emptyMonsterRegistrationEventListener()

private lateinit var stateHolder: MonsterCompendiumStateHolder

Expand Down Expand Up @@ -354,7 +351,6 @@ class MonsterCompendiumStateHolderTest {
folderPreviewEventDispatcher = folderPreviewEventDispatcher,
monsterEventDispatcher = monsterDetailEventDispatcher,
syncEventDispatcher = syncEventDispatcher,
monsterRegistrationEventListener = monsterRegistrationEventListener,
dispatcher = testCoroutineDispatcher,
analytics = MonsterCompendiumAnalytics(analytics = EmptyAnalytics()),
appLocalization = object : AppLocalization {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ import br.alexandregpereira.hunter.monster.event.collectOnMonsterCompendiumChang
import br.alexandregpereira.hunter.monster.event.collectOnVisibilityChanges
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEvent
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationResult
import br.alexandregpereira.hunter.monster.registration.event.collectOnSaved
import br.alexandregpereira.hunter.spell.detail.event.SpellDetailEvent
import br.alexandregpereira.hunter.spell.detail.event.SpellDetailEventDispatcher
import br.alexandregpereira.hunter.state.UiModel
Expand Down Expand Up @@ -86,7 +85,6 @@ class MonsterDetailStateHolder internal constructor(
private val monsterLoreDetailEventDispatcher: MonsterLoreDetailEventDispatcher,
private val folderInsertEventDispatcher: FolderInsertEventDispatcher,
private val monsterRegistrationEventDispatcher: EventDispatcher<MonsterRegistrationEvent>,
private val monsterRegistrationEventListener: EventListener<MonsterRegistrationResult>,
private val syncEventDispatcher: SyncEventDispatcher,
private val dispatcher: CoroutineDispatcher,
private val analytics: MonsterDetailAnalytics,
Expand Down Expand Up @@ -139,10 +137,6 @@ class MonsterDetailStateHolder internal constructor(
}
}.launchIn(scope)

monsterRegistrationEventListener.collectOnSaved {
getMonstersByInitialIndex(monsterIndex, monsterIndexes, invalidateCache = true)
}.launchIn(scope)

monsterEventDispatcher.collectOnMonsterCompendiumChanges {
getMonstersByInitialIndex(monsterIndex, monsterIndexes, invalidateCache = true)
}.launchIn(scope)
Expand Down Expand Up @@ -360,7 +354,7 @@ class MonsterDetailStateHolder internal constructor(
.map { (state, monsterIndex) ->
onMonsterChanged(monsterIndex, scrolled = true)
if (monsterIndexes.isNotEmpty()) {
monsterEventDispatcher.dispatchEvent(OnCompendiumChanges)
monsterEventDispatcher.dispatchEvent(OnCompendiumChanges())
}
state
}
Expand All @@ -371,7 +365,7 @@ class MonsterDetailStateHolder internal constructor(
private fun deleteMonster() {
deleteMonster(monsterIndex)
.onEach {
monsterEventDispatcher.dispatchEvent(OnCompendiumChanges)
monsterEventDispatcher.dispatchEvent(OnCompendiumChanges())
monsterEventDispatcher.dispatchEvent(Hide)
}
.flowOn(dispatcher)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import br.alexandregpereira.hunter.monster.detail.domain.DeleteMonsterUseCase
import br.alexandregpereira.hunter.monster.detail.domain.GetMonsterDetailUseCase
import br.alexandregpereira.hunter.monster.detail.domain.ResetMonsterToOriginal
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEventDispatcher
import br.alexandregpereira.hunter.monster.registration.event.MonsterRegistrationEventListener
import br.alexandregpereira.hunter.ui.StateRecovery
import org.koin.core.qualifier.named
import org.koin.dsl.module
Expand All @@ -45,7 +44,6 @@ val monsterDetailModule = module {
monsterLoreDetailEventDispatcher = get(),
folderInsertEventDispatcher = get(),
monsterRegistrationEventDispatcher = get<MonsterRegistrationEventDispatcher>(),
monsterRegistrationEventListener = get<MonsterRegistrationEventListener>(),
dispatcher = get(),
analytics = MonsterDetailAnalytics(get()),
appLocalization = get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ internal data class MonsterRegistrationEnStrings(
override val add: String = "Add",
override val remove: String = "Remove",
override val imageFormTitle: String = "Image",
override val imageHorizontalSwitchLabel: String = "Horizontal Image",
override val imageHorizontalSwitchLabel: String = "Landscape Image",
override val darkThemeSwitchLabel: String = "Preview Dark Theme",
override val imageProportion: (String) -> String = { "Proportion - $it" },
) : MonsterRegistrationStrings
Expand Down Expand Up @@ -337,7 +337,7 @@ internal data class MonsterRegistrationPtStrings(
override val add: String = "Adicionar",
override val remove: String = "Remover",
override val imageFormTitle: String = "Imagem",
override val imageHorizontalSwitchLabel: String = "Imagem Horizontal",
override val imageHorizontalSwitchLabel: String = "Imagem Landscape",
override val darkThemeSwitchLabel: String = "Pré visualizar em Tema Escuro",
override val imageProportion: (String) -> String = { "Proporção - $it" },
) : MonsterRegistrationStrings
Expand Down
1 change: 1 addition & 0 deletions feature/search/compose/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ multiplatform {
implementation(project(":core:state-holder"))
implementation(project(":core:search"))
implementation(project(":domain:monster:core"))
implementation(project(":domain:monster-lore:core"))
implementation(project(":domain:spell:core"))
implementation(project(":feature:folder-preview:event"))
implementation(project(":domain:monster:event"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@

package br.alexandregpereira.hunter.search

import br.alexandregpereira.hunter.search.domain.SearchKey
import br.alexandregpereira.hunter.search.domain.SearchMonsterResult
import br.alexandregpereira.hunter.search.domain.SearchValueType
import br.alexandregpereira.hunter.search.ui.SearchKeyState
import br.alexandregpereira.hunter.ui.compendium.monster.ColorState
import br.alexandregpereira.hunter.ui.compendium.monster.MonsterCardState
import br.alexandregpereira.hunter.ui.compendium.monster.MonsterImageState
Expand Down Expand Up @@ -45,3 +48,21 @@ internal fun List<SearchMonsterResult>.asMonsterCardStates(): List<MonsterCardSt
)
}
}

internal fun List<SearchKey>.toState(): List<SearchKeyState> {
return this.associateWith { searchKey ->
val symbols = when (searchKey.valueType) {
SearchValueType.String -> listOf("=")
SearchValueType.Boolean -> listOf("!")
SearchValueType.Float -> listOf(">", "<", "=")
}
symbols
}.map { (searchKey, symbols) ->
symbols.map { symbol ->
SearchKeyState(
key = searchKey.key,
symbol = symbol,
)
}
}.flatten()
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ fun SearchScreenFeature(
onSearchValueChange = viewModel::onSearchValueChange,
onCardClick = viewModel::onItemClick,
onCardLongClick = viewModel::onItemLongClick,
onSearchKeyClick = viewModel::onSearchKeyClick,
)
}
Loading

0 comments on commit c7cebe3

Please sign in to comment.