feat(search): init

This commit is contained in:
Harsh Shandilya 2023-11-15 00:46:49 +05:30
parent 09fd24b3ec
commit 55d0f53958
5 changed files with 100 additions and 0 deletions

View File

@ -115,6 +115,7 @@ unfurl = "me.saket.unfurl:unfurl:1.7.0"
android-test = { id = "com.android.test", version.ref = "agp" }
anvil = "com.squareup.anvil:2.4.8"
baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = "com.google.devtools.ksp:1.9.20-1.0.13"
licensee = "app.cash.licensee:1.8.0"

40
search/build.gradle.kts Normal file
View File

@ -0,0 +1,40 @@
/*
* Copyright © 2023 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
@file:Suppress("UnstableApiUsage")
plugins {
id("dev.msfjarvis.claw.android-library")
id("dev.msfjarvis.claw.kotlin-android")
id("kotlin-parcelize")
alias(libs.plugins.anvil)
}
android {
buildFeatures {
androidResources = true
compose = true
}
composeOptions {
useLiveLiterals = false
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
namespace = "dev.msfjarvis.claw.ui.search"
}
anvil { generateDaggerFactories.set(true) }
dependencies {
api(projects.api)
api(projects.database.core)
api(projects.model)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.circuit.runtime)
implementation(libs.circuit.runtime.presenter)
implementation(libs.javax.inject)
testImplementation(libs.circuit.test)
}

View File

@ -0,0 +1,34 @@
package dev.msfjarvis.claw.ui.search
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import com.slack.circuit.runtime.Navigator
import com.slack.circuit.runtime.presenter.Presenter
import dev.msfjarvis.claw.api.LobstersSearchApi
import dev.msfjarvis.claw.model.LobstersPost
import dev.msfjarvis.claw.ui.search.SearchScreen.Event
import dev.msfjarvis.claw.ui.search.SearchScreen.State
import javax.inject.Inject
class SearchPresenter
@Inject
constructor(
val navigator: Navigator,
val api: LobstersSearchApi,
) : Presenter<State> {
@Composable
override fun present(): State {
val searchResults = produceState<List<LobstersPost>?>(null) { value = emptyList() }.value
return when {
searchResults == null -> State.Loading
searchResults.isEmpty() -> State.NoResults
else -> State.Result(searchResults) { event ->
when (event) {
is Event.ScrollToPage -> TODO()
is Event.SubmitSearchQuery -> TODO()
}
}
}
}
}

View File

@ -0,0 +1,24 @@
package dev.msfjarvis.claw.ui.search
import android.os.Parcelable
import com.slack.circuit.runtime.CircuitUiEvent
import com.slack.circuit.runtime.CircuitUiState
import dev.msfjarvis.claw.model.LobstersPost
import kotlinx.parcelize.Parcelize
@Parcelize
data object SearchScreen : Parcelable {
sealed interface State : CircuitUiState {
data object Loading : State
data object NoResults : State
data class Result(
val list: List<LobstersPost>,
val eventSink: (Event) -> Unit,
): State
}
sealed interface Event : CircuitUiEvent {
data class SubmitSearchQuery(val query: String): Event
data class ScrollToPage(val nextPageNumber: Int): Event
}
}

View File

@ -169,4 +169,5 @@ include(
"database:core",
"database:impl",
"model",
"search",
)