feat(search): init
This commit is contained in:
parent
09fd24b3ec
commit
55d0f53958
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -169,4 +169,5 @@ include(
|
|||
"database:core",
|
||||
"database:impl",
|
||||
"model",
|
||||
"search",
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue