Skip to content

Commit 075c60a

Browse files
committed
prepare new trace repository
1 parent 9a478a6 commit 075c60a

File tree

6 files changed

+104
-96
lines changed

6 files changed

+104
-96
lines changed

composeApp/src/commonMain/kotlin/dev/datlag/aniflow/module/NetworkModule.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import dev.datlag.aniflow.model.safeFirstOrNull
3232
import dev.datlag.aniflow.other.UserHelper
3333
import dev.datlag.aniflow.settings.Settings
3434
import dev.datlag.aniflow.trace.Trace
35-
import dev.datlag.aniflow.trace.TraceStateMachine
35+
import dev.datlag.aniflow.trace.TraceRepository
3636
import dev.datlag.tooling.async.suspendCatching
3737
import io.github.aakira.napier.Napier
3838
import kotlinx.coroutines.flow.map
@@ -113,12 +113,6 @@ data object NetworkModule {
113113
baseUrl("https://api.trace.moe/")
114114
}.create<Trace>()
115115
}
116-
bindProvider<TraceStateMachine> {
117-
TraceStateMachine(
118-
trace = instance(),
119-
crashlytics = nullableFirebaseInstance()?.crashlytics
120-
)
121-
}
122116
bindSingleton<TrendingRepository> {
123117
val appSettings = instance<Settings.PlatformAppSettings>()
124118

@@ -169,5 +163,10 @@ data object NetworkModule {
169163
fallbackClient = instance(Constants.AniList.FALLBACK_APOLLO_CLIENT)
170164
)
171165
}
166+
bindSingleton<TraceRepository> {
167+
TraceRepository(
168+
trace = instance(),
169+
)
170+
}
172171
}
173172
}

composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/home/HomeComponent.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import dev.datlag.aniflow.anilist.TrendingRepository
55
import dev.datlag.aniflow.anilist.model.Medium
66
import dev.datlag.aniflow.anilist.state.CollectionState
77
import dev.datlag.aniflow.anilist.type.MediaType
8+
import dev.datlag.aniflow.trace.TraceRepository
89
import dev.datlag.aniflow.ui.navigation.Component
910
import kotlinx.coroutines.flow.Flow
1011

@@ -16,9 +17,13 @@ interface HomeComponent : Component {
1617
val popularNow: Flow<CollectionState>
1718
val popularNext: Flow<CollectionState>
1819

20+
val traceState: Flow<TraceRepository.State>
21+
1922
fun viewProfile()
2023
fun viewAnime()
2124
fun viewManga()
2225

2326
fun details(medium: Medium)
27+
fun trace(byteArray: ByteArray)
28+
fun clearTrace()
2429
}

composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/home/HomeScreen.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.datlag.aniflow.ui.navigation.screen.home
22

3+
import androidx.compose.animation.AnimatedContent
34
import androidx.compose.animation.AnimatedVisibility
45
import androidx.compose.animation.core.LinearOutSlowInEasing
56
import androidx.compose.animation.core.tween
@@ -10,6 +11,8 @@ import androidx.compose.foundation.layout.fillMaxSize
1011
import androidx.compose.foundation.layout.fillMaxWidth
1112
import androidx.compose.foundation.lazy.LazyColumn
1213
import androidx.compose.foundation.lazy.rememberLazyListState
14+
import androidx.compose.material.icons.Icons
15+
import androidx.compose.material.icons.filled.CameraEnhance
1316
import androidx.compose.material3.*
1417
import androidx.compose.runtime.Composable
1518
import androidx.compose.runtime.CompositionLocalProvider
@@ -31,6 +34,8 @@ import dev.datlag.aniflow.anilist.type.MediaType
3134
import dev.datlag.aniflow.common.LocalPadding
3235
import dev.datlag.aniflow.common.isScrollingUp
3336
import dev.datlag.aniflow.other.StateSaver
37+
import dev.datlag.aniflow.other.rememberImagePickerState
38+
import dev.datlag.aniflow.trace.TraceRepository
3439
import dev.datlag.aniflow.ui.navigation.screen.component.CollapsingToolbar
3540
import dev.datlag.aniflow.ui.navigation.screen.component.HidingNavigationBar
3641
import dev.datlag.aniflow.ui.navigation.screen.home.component.AllLoadingView
@@ -46,6 +51,9 @@ fun HomeScreen(component: HomeComponent) {
4651
state = appBarState
4752
)
4853
val listState = rememberLazyListState()
54+
val imagePicker = rememberImagePickerState {
55+
it?.let(component::trace)
56+
}
4957

5058
Scaffold(
5159
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
@@ -60,7 +68,23 @@ fun HomeScreen(component: HomeComponent) {
6068
)
6169
},
6270
floatingActionButton = {
71+
val traceState by component.traceState.collectAsStateWithLifecycle(TraceRepository.State.None)
6372

73+
ExtendedFloatingActionButton(
74+
onClick = {
75+
imagePicker.launch()
76+
},
77+
expanded = listState.isScrollingUp(),
78+
icon = {
79+
Icon(
80+
imageVector = Icons.Filled.CameraEnhance,
81+
contentDescription = null
82+
)
83+
},
84+
text = {
85+
Text(text = "Scan")
86+
}
87+
)
6488
},
6589
bottomBar = {
6690
HidingNavigationBar(

composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/home/HomeScreenComponent.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import dev.datlag.aniflow.common.onRender
1717
import dev.datlag.aniflow.model.coroutines.Executor
1818
import dev.datlag.aniflow.other.StateSaver
1919
import dev.datlag.aniflow.settings.Settings
20+
import dev.datlag.aniflow.trace.TraceRepository
2021
import dev.datlag.tooling.decompose.ioScope
2122
import kotlinx.coroutines.flow.Flow
2223
import kotlinx.coroutines.flow.SharingStarted
@@ -79,6 +80,13 @@ class HomeScreenComponent(
7980
initialValue = CollectionState.None
8081
)
8182

83+
private val traceRepository by instance<TraceRepository>()
84+
override val traceState: Flow<TraceRepository.State> = traceRepository.response
85+
86+
init {
87+
traceRepository.clear()
88+
}
89+
8290
@Composable
8391
override fun render() {
8492
val haze = remember { HazeState() }
@@ -117,4 +125,12 @@ class HomeScreenComponent(
117125
override fun details(medium: Medium) {
118126
onMediumDetails(medium)
119127
}
128+
129+
override fun trace(byteArray: ByteArray) {
130+
traceRepository.search(byteArray)
131+
}
132+
133+
override fun clearTrace() {
134+
traceRepository.clear()
135+
}
120136
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package dev.datlag.aniflow.trace
2+
3+
import dev.datlag.aniflow.model.CatchResult
4+
import dev.datlag.aniflow.trace.model.SearchResponse
5+
import kotlinx.coroutines.flow.*
6+
import kotlinx.serialization.Serializable
7+
8+
class TraceRepository(
9+
private val trace: Trace
10+
) {
11+
12+
private val byteArray = MutableStateFlow<ByteArray?>(null)
13+
val response: Flow<State> = byteArray.transform {
14+
return@transform if (it == null || it.isEmpty()) {
15+
emit(State.None)
16+
} else {
17+
emit(
18+
State.fromResponse(
19+
CatchResult.repeat(2) {
20+
trace.search(it)
21+
}.asNullableSuccess()
22+
)
23+
)
24+
}
25+
}
26+
27+
fun clear() = byteArray.update { null }
28+
fun search(array: ByteArray) = byteArray.update { array }
29+
30+
@Serializable
31+
sealed interface State {
32+
@Serializable
33+
data object None : State
34+
35+
@Serializable
36+
data class Success(
37+
val response: SearchResponse,
38+
) : State
39+
40+
@Serializable
41+
data object Error : State
42+
43+
companion object {
44+
fun fromResponse(response: SearchResponse?): State {
45+
return if (response == null || response.isError) {
46+
Error
47+
} else {
48+
Success(response)
49+
}
50+
}
51+
}
52+
}
53+
}

trace/src/commonMain/kotlin/dev/datlag/aniflow/trace/TraceStateMachine.kt

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)