Migrate EmojiPickerPresenter to assisted-factory pattern with EmptyGetRecentEmojis

This commit is contained in:
ganfra
2026-07-22 15:31:40 +02:00
parent 5d8290b240
commit 93d6d5c84c
7 changed files with 38 additions and 15 deletions
+1 -1
View File
@@ -18,5 +18,5 @@ dependencies {
implementation(projects.libraries.matrix.api)
implementation(libs.kotlinx.collections.immutable)
implementation(libs.matrix.emojibase.bindings)
api(libs.matrix.emojibase.bindings)
}
@@ -8,5 +8,10 @@
package io.element.android.libraries.emoji.api.picker
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis
fun interface EmojiPickerPresenter : Presenter<EmojiPickerState>
fun interface EmojiPickerPresenter : Presenter<EmojiPickerState> {
fun interface Factory {
fun create(getRecentEmojis: GetRecentEmojis): EmojiPickerPresenter
}
}
@@ -9,6 +9,7 @@
package io.element.android.libraries.emoji.api.recentemojis
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
/**
* Returns the list of recently used emojis for reactions.
@@ -16,3 +17,11 @@ import kotlinx.collections.immutable.ImmutableList
fun interface GetRecentEmojis {
suspend operator fun invoke(): Result<ImmutableList<String>>
}
/**
* A [GetRecentEmojis] that never returns any recent emojis. Handy for pickers that don't want
* a "Recent" tab (e.g. the user-status picker).
*/
object EmptyGetRecentEmojis : GetRecentEmojis {
override suspend fun invoke(): Result<ImmutableList<String>> = Result.success(persistentListOf())
}
@@ -17,8 +17,10 @@ import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalInspectionMode
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import io.element.android.emojibasebindings.Emoji
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.designsystem.theme.components.IconSource
@@ -37,13 +39,18 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
import kotlin.time.Duration.Companion.milliseconds
@Inject
@ContributesBinding(SessionScope::class)
@AssistedInject
class DefaultEmojiPickerPresenter(
private val emojibaseProvider: EmojibaseProvider,
private val getRecentEmojis: GetRecentEmojis,
@Assisted private val getRecentEmojis: GetRecentEmojis,
private val coroutineDispatchers: CoroutineDispatchers,
) : EmojiPickerPresenter {
@AssistedFactory
@ContributesBinding(SessionScope::class)
interface Factory : EmojiPickerPresenter.Factory {
override fun create(getRecentEmojis: GetRecentEmojis): DefaultEmojiPickerPresenter
}
@Composable
override fun present(): EmojiPickerState {
val queryState = rememberTextFieldState()
@@ -86,7 +93,9 @@ class DefaultEmojiPickerPresenter(
val searchQuery = queryState.text.toString()
LaunchedEffect(searchQuery, data) {
if (searchQuery.isEmpty() || data.allEmojis.isEmpty()) {
emojiResults = SearchBarResultState.Initial()
if (emojiResults !is SearchBarResultState.Initial) {
emojiResults = SearchBarResultState.Initial()
}
return@LaunchedEffect
}
delay(100.milliseconds)