Skip to content

Commit 9a5800d

Browse files
tmaxxddtomkad99
andauthored
Introduce riverpod (#30)
* Updated to flutter 3.27.0 * Migrated login to provider * Added other providers * Handled providers in pages * Migrate to new pigeon (#29) * Corrected naming * Corrected types --------- Co-authored-by: Tomasz Kądziołka <tomasz.kadziolka@iteo.com>
1 parent 77bc015 commit 9a5800d

31 files changed

+6148
-2894
lines changed

app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java

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

app/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.kt

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@ import org.koin.core.component.KoinComponent
1010
import dev.snipme.snipmeapp.domain.reaction.UserReaction
1111
import dev.snipme.snipmeapp.domain.snippets.*
1212
import java.util.*
13-
14-
/*
15-
flutter pub run pigeon \
16-
--input bridge/main_model.dart \
17-
--dart_out lib/model/main_model.dart \
18-
--java_out ../app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java \
19-
--java_package "dev.snipme.snipmeapp.bridge"
20-
*/
13+
import dev.snipme.snipmeapp.channel.Snippet as ChannelSnippet
14+
import dev.snipme.snipmeapp.channel.SnippetCode as ChannelSnippetCode
15+
import dev.snipme.snipmeapp.channel.SnippetLanguage as ChannelSnippetLanguage
16+
import dev.snipme.snipmeapp.channel.SnippetLanguageType as ChannelSnippetLanguageType
17+
import dev.snipme.snipmeapp.channel.UserReaction as ChannelUserReaction
18+
import dev.snipme.snipmeapp.channel.SyntaxToken as ChannelSyntaxToken
19+
import dev.snipme.snipmeapp.channel.Owner as ChannelOwner
2120

2221
abstract class ModelPlugin<T> : FlutterPlugin, KoinComponent {
2322

@@ -32,58 +31,49 @@ abstract class ModelPlugin<T> : FlutterPlugin, KoinComponent {
3231
}
3332
}
3433

35-
fun Snippet.toModelData(): Bridge.Snippet {
36-
val it = this
37-
return Bridge.Snippet().apply {
38-
uuid = it.uuid
39-
title = it.title
40-
code = it.code.toModelSnippetCode()
41-
language = it.language.toModelSnippetLanguage()
42-
owner = it.owner.toModelOwner()
43-
isOwner = it.isOwner
44-
voteResult = (it.numberOfLikes - it.numberOfDislikes).toLong()
45-
userReaction = it.userReaction.toModelUserReaction()
46-
isLiked = it.userReaction.toModelReactionState(UserReaction.LIKE)
47-
isDisliked = it.userReaction.toModelReactionState(UserReaction.DISLIKE)
48-
isPrivate = it.visibility == SnippetVisibility.PRIVATE
49-
isSaved = calculateSavedState(it.isOwner, it.visibility)
50-
isToDelete = it.isOwner
34+
fun Snippet.toModelData(): ChannelSnippet =
35+
ChannelSnippet(
36+
uuid = uuid,
37+
title = title,
38+
code = code.toModelSnippetCode(),
39+
language = language.toModelSnippetLanguage(),
40+
owner = owner.toModelOwner(),
41+
isOwner = isOwner,
42+
voteResult = (numberOfLikes - numberOfDislikes).toLong(),
43+
userReaction = userReaction.toModelUserReaction(),
44+
isLiked = userReaction.toModelReactionState(UserReaction.LIKE),
45+
isDisliked = userReaction.toModelReactionState(UserReaction.DISLIKE),
46+
isPrivate = visibility == SnippetVisibility.PRIVATE,
47+
isSaved = calculateSavedState(isOwner, visibility),
48+
isToDelete = isOwner,
5149
timeAgo = DateUtils.getRelativeTimeSpanString(
52-
it.modifiedAt.time,
50+
modifiedAt.time,
5351
Date().time,
5452
DateUtils.SECOND_IN_MILLIS
5553
).toString()
56-
}
57-
}
54+
)
5855

59-
private fun Owner.toModelOwner() =
60-
Bridge.Owner().let {
61-
it.id = id.toLong()
62-
it.login = login
63-
it
64-
}
56+
private fun Owner.toModelOwner() = ChannelOwner(id = id.toLong(), login = login)
6557

6658
private fun SnippetCode.toModelSnippetCode() =
67-
Bridge.SnippetCode().let {
68-
it.raw = raw
69-
it.tokens = highlighted.getSpans<ForegroundColorSpan>().map { span ->
59+
ChannelSnippetCode(
60+
raw = raw,
61+
tokens = highlighted.getSpans<ForegroundColorSpan>().map { span ->
7062
span.toSyntaxToken(highlighted)
71-
}
72-
it
73-
}
63+
},
64+
)
7465

7566
private fun SnippetLanguage.toModelSnippetLanguage() =
76-
Bridge.SnippetLanguage().let {
77-
it.raw = raw
78-
it.type = Bridge.SnippetLanguageType.valueOf(type.name)
79-
it
80-
}
67+
ChannelSnippetLanguage(
68+
raw = raw,
69+
type = ChannelSnippetLanguageType.valueOf(type.name),
70+
)
8171

82-
private fun UserReaction.toModelUserReaction(): Bridge.UserReaction =
72+
private fun UserReaction.toModelUserReaction(): ChannelUserReaction =
8373
when (this) {
84-
UserReaction.LIKE -> Bridge.UserReaction.LIKE
85-
UserReaction.DISLIKE -> Bridge.UserReaction.DISLIKE
86-
else -> Bridge.UserReaction.NONE
74+
UserReaction.LIKE -> ChannelUserReaction.LIKE
75+
UserReaction.DISLIKE -> ChannelUserReaction.DISLIKE
76+
else -> ChannelUserReaction.NONE
8777
}
8878

8979
private fun UserReaction.toModelReactionState(reaction: UserReaction) =
@@ -98,9 +88,8 @@ private fun calculateSavedState(
9888
}
9989

10090
private fun ForegroundColorSpan.toSyntaxToken(spannable: Spanned) =
101-
Bridge.SyntaxToken().let {
102-
it.start = spannable.getSpanStart(this).toLong()
103-
it.end = spannable.getSpanEnd(this).toLong()
104-
it.color = foregroundColor.toLong()
105-
it
106-
}
91+
ChannelSyntaxToken(
92+
start = spannable.getSpanStart(this).toLong(),
93+
end = spannable.getSpanEnd(this).toLong(),
94+
color = foregroundColor.toLong(),
95+
)

app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModelPlugin.kt

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,29 @@ package dev.snipme.snipmeapp.bridge.detail
22

33
import io.flutter.plugin.common.BinaryMessenger
44
import org.koin.core.component.inject
5-
import dev.snipme.snipmeapp.bridge.Bridge
65
import dev.snipme.snipmeapp.bridge.ModelPlugin
76
import dev.snipme.snipmeapp.bridge.toModelData
7+
import dev.snipme.snipmeapp.channel.DetailModelBridge as ChannelDetailModelBridge
8+
import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState
9+
import dev.snipme.snipmeapp.channel.DetailModelStateData as ChannelDetailModelStateData
10+
import dev.snipme.snipmeapp.channel.DetailModelEvent as ChannelDetailModelEvent
11+
import dev.snipme.snipmeapp.channel.DetailModelEventData as ChannelDetailModelEventData
812

9-
class DetailModelPlugin : ModelPlugin<Bridge.DetailModelBridge>(), Bridge.DetailModelBridge {
13+
class DetailModelPlugin : ModelPlugin<ChannelDetailModelBridge>(), ChannelDetailModelBridge {
1014
private val model: DetailModel by inject()
1115
private var oldEvent: DetailEvent? = null
1216
private var oldState: DetailViewState? = null
1317

14-
override fun getState(): Bridge.DetailModelStateData = getData(model.state.value)
18+
override fun getState(): ChannelDetailModelStateData = getData(model.state.value)
1519

16-
override fun getEvent(): Bridge.DetailModelEventData = getEvent(model.event.value)
20+
override fun getEvent(): ChannelDetailModelEventData = getEvent(model.event.value)
1721

1822
override fun resetEvent() {
1923
model.event.value = Idle
2024
}
2125

22-
override fun onSetup(messenger: BinaryMessenger, bridge: Bridge.DetailModelBridge?) {
23-
Bridge.DetailModelBridge.setUp(messenger, bridge)
26+
override fun onSetup(messenger: BinaryMessenger, bridge: ChannelDetailModelBridge?) {
27+
ChannelDetailModelBridge.setUp(messenger, bridge)
2428
}
2529

2630
override fun load(uuid: String) {
@@ -51,40 +55,40 @@ class DetailModelPlugin : ModelPlugin<Bridge.DetailModelBridge>(), Bridge.Detail
5155
model.delete()
5256
}
5357

54-
private fun getData(viewState: DetailViewState): Bridge.DetailModelStateData {
55-
return Bridge.DetailModelStateData().apply {
56-
state = viewState.toModelState()
57-
isLoading = viewState is Loading
58-
data = (viewState as? Loaded)?.snippet?.toModelData()
59-
oldHash = oldState?.hashCode()?.toLong()
60-
newHash = viewState.hashCode().toLong()
61-
}.also {
58+
private fun getData(viewState: DetailViewState): ChannelDetailModelStateData {
59+
return ChannelDetailModelStateData(
60+
state = viewState.toModelState(),
61+
isLoading = viewState is Loading,
62+
data = (viewState as? Loaded)?.snippet?.toModelData(),
63+
oldHash = oldState?.hashCode()?.toLong(),
64+
newHash = viewState.hashCode().toLong(),
65+
).also {
6266
oldState = viewState
6367
}
6468
}
6569

66-
private fun getEvent(detailEvent: DetailEvent): Bridge.DetailModelEventData {
67-
return Bridge.DetailModelEventData().apply {
68-
event = detailEvent.toModelEvent()
69-
value = (detailEvent as? Saved)?.snippetId.toString()
70-
oldHash = oldEvent?.hashCode()?.toLong()
71-
newHash = detailEvent.hashCode().toLong()
72-
}.also {
70+
private fun getEvent(detailEvent: DetailEvent): ChannelDetailModelEventData {
71+
return ChannelDetailModelEventData(
72+
event = detailEvent.toModelEvent(),
73+
value = (detailEvent as? Saved)?.snippetId.toString(),
74+
oldHash = oldEvent?.hashCode()?.toLong(),
75+
newHash = detailEvent.hashCode().toLong(),
76+
).also {
7377
oldEvent = detailEvent
7478
}
7579
}
7680

7781
private fun DetailViewState.toModelState() =
7882
when (this) {
79-
Loading -> Bridge.ModelState.LOADING
80-
is Loaded -> Bridge.ModelState.LOADED
81-
else -> Bridge.ModelState.ERROR
83+
Loading -> ChannelModelState.LOADING
84+
is Loaded -> ChannelModelState.LOADED
85+
else -> ChannelModelState.ERROR
8286
}
8387

8488
private fun DetailEvent.toModelEvent() =
8589
when (this) {
86-
is Saved -> Bridge.DetailModelEvent.SAVED
87-
is Deleted -> Bridge.DetailModelEvent.DELETED
88-
else -> Bridge.DetailModelEvent.NONE
90+
is Saved -> ChannelDetailModelEvent.SAVED
91+
is Deleted -> ChannelDetailModelEvent.DELETED
92+
else -> ChannelDetailModelEvent.NONE
8993
}
9094
}

app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModelPlugin.kt

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,28 @@ package dev.snipme.snipmeapp.bridge.login
22

33
import io.flutter.plugin.common.BinaryMessenger
44
import org.koin.core.component.inject
5-
import dev.snipme.snipmeapp.bridge.Bridge
65
import dev.snipme.snipmeapp.bridge.ModelPlugin
6+
import dev.snipme.snipmeapp.channel.LoginModelBridge as ChannelLoginModelBridge
7+
import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState
8+
import dev.snipme.snipmeapp.channel.LoginModelStateData as ChannelLoginModelStateData
9+
import dev.snipme.snipmeapp.channel.LoginModelEvent as ChannelLoginModelEvent
10+
import dev.snipme.snipmeapp.channel.LoginModelEventData as ChannelLoginModelEventData
711

8-
class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginModelBridge {
12+
class LoginModelPlugin : ModelPlugin<ChannelLoginModelBridge>(), ChannelLoginModelBridge {
913
private var oldEvent: LoginEvent? = null
1014
private var oldState: LoginState? = null
1115
private val model: LoginModel by inject()
1216

13-
override fun getState(): Bridge.LoginModelStateData = getModelState(model.state.value)
17+
override fun getState(): ChannelLoginModelStateData = getModelState(model.state.value)
1418

15-
override fun getEvent(): Bridge.LoginModelEventData = getModelEvent(model.event.value)
19+
override fun getEvent(): ChannelLoginModelEventData = getModelEvent(model.event.value)
1620

1721
override fun resetEvent() {
1822
model.event.value = Idle
1923
}
2024

21-
override fun onSetup(messenger: BinaryMessenger, bridge: Bridge.LoginModelBridge?) {
22-
Bridge.LoginModelBridge.setUp(messenger, bridge)
25+
override fun onSetup(messenger: BinaryMessenger, bridge: ChannelLoginModelBridge?) {
26+
ChannelLoginModelBridge.setUp(messenger, bridge)
2327
}
2428

2529
override fun checkLoginState() {
@@ -30,35 +34,35 @@ class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginMod
3034
model.loginOrRegister(email, password)
3135
}
3236

33-
private fun getModelEvent(loginEvent: LoginEvent): Bridge.LoginModelEventData {
34-
return Bridge.LoginModelEventData().apply {
35-
event = loginEvent.toModelLoginEvent()
36-
oldHash = oldEvent?.hashCode()?.toLong() ?: 0
37-
newHash = loginEvent.hashCode().toLong()
38-
}.also {
37+
private fun getModelEvent(loginEvent: LoginEvent): ChannelLoginModelEventData {
38+
return ChannelLoginModelEventData(
39+
event = loginEvent.toModelLoginEvent(),
40+
oldHash = oldEvent?.hashCode()?.toLong() ?: 0,
41+
newHash = loginEvent.hashCode().toLong(),
42+
).also {
3943
oldEvent = loginEvent
4044
}
4145
}
4246

43-
private fun getModelState(loginState: LoginState): Bridge.LoginModelStateData {
44-
return Bridge.LoginModelStateData().apply {
45-
state = loginState.toModelLoginState()
46-
oldHash = oldState?.hashCode()?.toLong() ?: 0
47-
newHash = loginState.hashCode().toLong()
48-
}.also {
47+
private fun getModelState(loginState: LoginState): ChannelLoginModelStateData {
48+
return ChannelLoginModelStateData(
49+
state = loginState.toModelLoginState(),
50+
oldHash = oldState?.hashCode()?.toLong() ?: 0,
51+
newHash = loginState.hashCode().toLong(),
52+
).also {
4953
oldState = loginState
5054
}
5155
}
5256

5357
private fun LoginState.toModelLoginState() =
5458
when (this) {
55-
Loaded -> Bridge.ModelState.LOADED
56-
else -> Bridge.ModelState.LOADING
59+
Loaded -> ChannelModelState.LOADED
60+
else -> ChannelModelState.LOADING
5761
}
5862

5963
private fun LoginEvent.toModelLoginEvent() =
6064
when (this) {
61-
Logged -> Bridge.LoginModelEvent.LOGGED
62-
else -> Bridge.LoginModelEvent.NONE
65+
Logged -> ChannelLoginModelEvent.LOGGED
66+
else -> ChannelLoginModelEvent.NONE
6367
}
6468
}

0 commit comments

Comments
 (0)