Skip to content

Commit 94bd731

Browse files
committed
Corrected merge errors
1 parent 857849e commit 94bd731

File tree

5 files changed

+151
-9
lines changed

5 files changed

+151
-9
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package dev.snipme.snipmeapp.channel
2+
3+
import io.flutter.embedding.engine.plugins.FlutterPlugin
4+
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding
5+
import io.flutter.plugin.common.BinaryMessenger
6+
import kotlinx.coroutines.CoroutineScope
7+
import kotlinx.coroutines.Dispatchers
8+
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
9+
import kotlinx.coroutines.flow.Flow
10+
import kotlinx.coroutines.flow.MutableSharedFlow
11+
import kotlinx.coroutines.flow.launchIn
12+
import kotlinx.coroutines.flow.onEach
13+
import org.koin.core.component.KoinComponent
14+
import org.koin.core.component.inject
15+
16+
class FlowChannelEventStreamHandler : ChannelEventStreamHandler() {
17+
private val scope = CoroutineScope(Dispatchers.Main)
18+
private val sinkFlow = MutableSharedFlow<ModelEventData>(
19+
replay = 3,
20+
onBufferOverflow = DROP_OLDEST
21+
)
22+
23+
fun onSetup(messenger: BinaryMessenger) {
24+
register(messenger, this)
25+
}
26+
27+
override fun onListen(p0: Any?, sink: PigeonEventSink<ModelEventData>) {
28+
sinkFlow.onEach { sink.success(it) }.launchIn(scope)
29+
}
30+
31+
override fun onCancel(p0: Any?) {
32+
sinkFlow.resetReplayCache()
33+
}
34+
35+
fun zip(flow: Flow<ModelEventData>) {
36+
flow.onEach { sinkFlow.emit(it) }.launchIn(scope)
37+
}
38+
}
39+
40+
class EventStreamHandlerPlugin : FlutterPlugin, KoinComponent {
41+
private val eventStream by inject<FlowChannelEventStreamHandler>()
42+
43+
override fun onAttachedToEngine(binding: FlutterPluginBinding) {
44+
eventStream.onSetup(binding.binaryMessenger)
45+
}
46+
47+
override fun onDetachedFromEngine(binding: FlutterPluginBinding) {}
48+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package dev.snipme.snipmeapp.channel.details
2+
3+
import dev.snipme.snipmeapp.channel.ChannelDetailsModel
4+
import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler
5+
import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler
6+
import dev.snipme.snipmeapp.channel.ModelPlugin
7+
import dev.snipme.snipmeapp.channel.toModelData
8+
import io.flutter.plugin.common.BinaryMessenger
9+
import kotlinx.coroutines.flow.map
10+
import org.koin.core.component.inject
11+
import dev.snipme.snipmeapp.channel.DetailsModelEvent as ChannelDetailsModelEvent
12+
import dev.snipme.snipmeapp.channel.DetailsModelEventData as ChannelDetailsModelEventData
13+
import dev.snipme.snipmeapp.channel.DetailsModelStateData as ChannelDetailsModelStateData
14+
import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState
15+
16+
class DetailsModelPlugin : ModelPlugin<ChannelDetailsModel>(), ChannelDetailsModel {
17+
private val model: DetailsModel by inject()
18+
private val channelStateFlow by inject<FlowChannelStateStreamHandler>()
19+
private val channelEventFlow by inject<FlowChannelEventStreamHandler>()
20+
21+
override fun onSetup(messenger: BinaryMessenger, channelModel: ChannelDetailsModel?) {
22+
ChannelDetailsModel.setUp(messenger, channelModel)
23+
channelStateFlow.zip(model.state.map { getModelState(it) })
24+
channelEventFlow.zip(model.event.map { getModelEvent(it) })
25+
}
26+
27+
override fun resetEvent() {
28+
model.event.value = Idle
29+
}
30+
31+
override fun load(uuid: String) {
32+
model.load(uuid)
33+
}
34+
35+
override fun toggleFavorite() {
36+
model.toggleFavorite()
37+
}
38+
39+
override fun saveImage(image: ByteArray) {
40+
model.save(image)
41+
}
42+
43+
override fun copyToClipboard() {
44+
model.copyToClipboard()
45+
}
46+
47+
override fun shareImage(image: ByteArray) {
48+
model.share(image)
49+
}
50+
51+
override fun delete() {
52+
model.delete()
53+
}
54+
55+
private fun getModelState(viewState: DetailsViewState): ChannelDetailsModelStateData {
56+
return ChannelDetailsModelStateData(
57+
state = viewState.toModelState(),
58+
isLoading = viewState is Loading,
59+
data = (viewState as? Loaded)?.snippet?.toModelData(),
60+
)
61+
}
62+
63+
private fun getModelEvent(event: DetailsEvent): ChannelDetailsModelEventData {
64+
return ChannelDetailsModelEventData(
65+
event = event.toModelEvent(),
66+
value = (event as? Alert)?.message.orEmpty()
67+
)
68+
}
69+
70+
private fun DetailsViewState.toModelState() =
71+
when (this) {
72+
Loading -> ChannelModelState.LOADING
73+
is Loaded -> ChannelModelState.LOADED
74+
else -> ChannelModelState.ERROR
75+
}
76+
77+
private fun DetailsEvent.toModelEvent() =
78+
when (this) {
79+
is Deleted -> ChannelDetailsModelEvent.DELETED
80+
is Alert -> ChannelDetailsModelEvent.ALERT
81+
else -> ChannelDetailsModelEvent.NONE
82+
}
83+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.snipme.snipmeapp.di
2+
3+
import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler
4+
import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler
5+
import dev.snipme.snipmeapp.channel.details.DetailsModel
6+
import dev.snipme.snipmeapp.channel.login.LoginModel
7+
import dev.snipme.snipmeapp.channel.main.MainModel
8+
import dev.snipme.snipmeapp.channel.session.SessionModel
9+
import org.koin.dsl.module
10+
11+
internal val channelModule = module {
12+
single { FlowChannelStateStreamHandler() }
13+
single { FlowChannelEventStreamHandler() }
14+
single { SessionModel(get()) }
15+
single { LoginModel(get(), get(), get()) }
16+
single { MainModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) }
17+
single { DetailsModel(get(), get(), get(), get(), get(), get(), get(), get(), get()) }
18+
}

flutter_module/channel/contract.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,6 @@ abstract class ChannelModelEventApi {
160160
ModelEventData channelEvent();
161161
}
162162

163-
@EventChannelApi()
164-
abstract class ChannelModelEventApi {
165-
ModelStateData channelState();
166-
167-
ModelEventData channelEvent();
168-
}
169-
170163
@HostApi()
171164
abstract class ChannelMainModel {
172165
void resetEvent();

flutter_module/lib/generated/data_model.g.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ Stream<ModelStateData> channelState( {String instanceName = ''}) {
647647
return event as ModelStateData;
648648
});
649649
}
650-
650+
651651
Stream<ModelEventData> channelEvent( {String instanceName = ''}) {
652652
if (instanceName.isNotEmpty) {
653653
instanceName = '.$instanceName';
@@ -658,7 +658,7 @@ Stream<ModelEventData> channelEvent( {String instanceName = ''}) {
658658
return event as ModelEventData;
659659
});
660660
}
661-
661+
662662

663663
class ChannelMainModel {
664664
/// Constructor for [ChannelMainModel]. The [binaryMessenger] named argument is

0 commit comments

Comments
 (0)