Skip to content

Commit 84789e0

Browse files
authored
Merge pull request #4410 from CruGlobal/toolCardEventsCleanup
Refactor ToolCard event types and introduce ToolCardPresenter interface
2 parents 1536e64 + f437d3a commit 84789e0

33 files changed

Lines changed: 510 additions & 503 deletions

app/src/main/kotlin/org/cru/godtools/ui/dashboard/home/AllFavoritesPresenter.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ import org.cru.godtools.db.repository.ToolsRepository
3232
import org.cru.godtools.model.Tool
3333
import org.cru.godtools.ui.dashboard.home.AllFavoritesPresenter.UiState
3434
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen
35-
import org.cru.godtools.ui.tools.ToolCard
3635
import org.cru.godtools.ui.tools.ToolCardPresenter
36+
import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
3737
import org.cru.godtools.util.createToolIntent
3838
import org.greenrobot.eventbus.EventBus
3939

@@ -48,7 +48,7 @@ class AllFavoritesPresenter @AssistedInject constructor(
4848
) : Presenter<UiState> {
4949
@ConsistentCopyVisibility
5050
data class UiState internal constructor(
51-
val tools: List<ToolCard.State> = emptyList(),
51+
val tools: List<ToolCardPresenter.UiState> = emptyList(),
5252
internal val eventSink: (UiEvent) -> Unit = {},
5353
) : CircuitUiState
5454

@@ -66,11 +66,11 @@ class AllFavoritesPresenter @AssistedInject constructor(
6666
tools = tools.mapNotNull { tool ->
6767
val toolCode = tool.code ?: return@mapNotNull null
6868
key(toolCode) {
69-
lateinit var state: ToolCard.State
69+
lateinit var state: ToolCardPresenter.UiState
7070
state = toolCardPresenter.present(tool) {
7171
when (it) {
72-
ToolCard.Event.Click,
73-
ToolCard.Event.OpenTool -> {
72+
ToolCardEvent.Click,
73+
ToolCardEvent.OpenTool -> {
7474
val intent = context.createToolIntent(
7575
tool = tool,
7676
languages = listOfNotNull(
@@ -88,15 +88,12 @@ class AllFavoritesPresenter @AssistedInject constructor(
8888
}
8989
}
9090

91-
ToolCard.Event.OpenToolDetails -> {
91+
ToolCardEvent.OpenToolDetails -> {
9292
eventBus.post(
9393
OpenAnalyticsActionEvent(ACTION_OPEN_TOOL_DETAILS, toolCode, SOURCE_FAVORITE)
9494
)
9595
navigator.goTo(ToolDetailsScreen(toolCode))
9696
}
97-
98-
ToolCard.Event.PinTool,
99-
ToolCard.Event.UnpinTool -> error("$it should be handled by the ToolCardPresenter")
10097
}
10198
}
10299
state

app/src/main/kotlin/org/cru/godtools/ui/dashboard/home/HomePresenter.kt

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ import org.cru.godtools.ui.banner.BannerPresenter
3535
import org.cru.godtools.ui.banner.tutorial.TutorialFeaturesBannerPresenter
3636
import org.cru.godtools.ui.dashboard.home.HomePresenter.UiState
3737
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen
38-
import org.cru.godtools.ui.tools.ToolCard
3938
import org.cru.godtools.ui.tools.ToolCardPresenter
39+
import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
4040
import org.cru.godtools.util.createToolIntent
4141
import org.greenrobot.eventbus.EventBus
4242

@@ -54,8 +54,8 @@ class HomePresenter @AssistedInject constructor(
5454
data class UiState(
5555
val dataLoaded: Boolean = true,
5656
val banner: Banner.UiState? = null,
57-
val spotlightLessons: List<ToolCard.State> = emptyList(),
58-
val favoriteTools: List<ToolCard.State> = emptyList(),
57+
val spotlightLessons: List<ToolCardPresenter.UiState> = emptyList(),
58+
val favoriteTools: List<ToolCardPresenter.UiState> = emptyList(),
5959
val eventSink: (UiEvent) -> Unit = {},
6060
) : CircuitUiState
6161

@@ -91,10 +91,10 @@ class HomePresenter @AssistedInject constructor(
9191
val lessonCode = lesson.code ?: return@mapNotNull null
9292

9393
key(lessonCode) {
94-
lateinit var lessonState: ToolCard.State
94+
lateinit var lessonState: ToolCardPresenter.UiState
9595
lessonState = toolCardPresenter.present(lesson) {
9696
when (it) {
97-
ToolCard.Event.Click -> {
97+
ToolCardEvent.Click -> {
9898
val intent = context.createToolIntent(
9999
tool = lesson,
100100
languages = listOfNotNull(lessonState.translation?.languageCode),
@@ -130,11 +130,11 @@ class HomePresenter @AssistedInject constructor(
130130
val toolCode = tool.code ?: return@mapNotNull null
131131

132132
key(toolCode) {
133-
lateinit var state: ToolCard.State
133+
lateinit var state: ToolCardPresenter.UiState
134134
state = toolCardPresenter.present(tool) {
135135
when (it) {
136-
ToolCard.Event.Click,
137-
ToolCard.Event.OpenTool -> {
136+
ToolCardEvent.Click,
137+
ToolCardEvent.OpenTool -> {
138138
val intent = context.createToolIntent(
139139
tool = tool,
140140
languages = listOfNotNull(
@@ -152,15 +152,12 @@ class HomePresenter @AssistedInject constructor(
152152
}
153153
}
154154

155-
ToolCard.Event.OpenToolDetails -> {
155+
ToolCardEvent.OpenToolDetails -> {
156156
eventBus.post(
157157
OpenAnalyticsActionEvent(ACTION_OPEN_TOOL_DETAILS, toolCode, SOURCE_FAVORITE)
158158
)
159159
navigator.goTo(ToolDetailsScreen(toolCode))
160160
}
161-
162-
ToolCard.Event.PinTool,
163-
ToolCard.Event.UnpinTool -> error("$it should be handled by the ToolCardPresenter")
164161
}
165162
}
166163
state

app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ import org.cru.godtools.model.Language
4545
import org.cru.godtools.model.Language.Companion.filterByDisplayAndNativeName
4646
import org.cru.godtools.ui.dashboard.filters.FilterMenu
4747
import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState
48-
import org.cru.godtools.ui.tools.ToolCard
4948
import org.cru.godtools.ui.tools.ToolCardPresenter
49+
import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
5050
import org.cru.godtools.util.createToolIntent
5151
import org.greenrobot.eventbus.EventBus
5252

@@ -65,7 +65,7 @@ class LessonsPresenter @AssistedInject constructor(
6565
// region UiState
6666
data class UiState(
6767
val languageFilter: FilterMenu.UiState<Language> = FilterMenu.UiState(),
68-
val lessons: List<ToolCard.State> = emptyList(),
68+
val lessons: List<ToolCardPresenter.UiState> = emptyList(),
6969
) : CircuitUiState
7070
// endregion UiState
7171

@@ -140,21 +140,21 @@ class LessonsPresenter @AssistedInject constructor(
140140
}
141141

142142
@Composable
143-
private fun rememberLessons(locale: Locale): List<ToolCard.State> {
143+
private fun rememberLessons(locale: Locale): List<ToolCardPresenter.UiState> {
144144
val lessons by remember(locale) {
145145
toolsRepository.getLessonsFlowByLanguage(locale)
146146
.map { it.filterNot { it.isHidden }.sortedBy { it.defaultOrder } }
147147
}.collectAsState(emptyList())
148148

149149
return lessons.map { tool ->
150150
key(tool.code) {
151-
lateinit var toolState: ToolCard.State
151+
lateinit var toolState: ToolCardPresenter.UiState
152152
toolState = toolCardPresenter.present(
153153
tool = tool,
154154
customLocale = locale,
155155
eventSink = {
156156
when (it) {
157-
ToolCard.Event.Click -> {
157+
ToolCardEvent.Click, ToolCardEvent.OpenTool -> {
158158
eventBus.post(OpenAnalyticsActionEvent(ACTION_OPEN_LESSON, tool.code, SOURCE_LESSONS))
159159
navigator.goTo(
160160
IntentScreen(
@@ -167,10 +167,7 @@ class LessonsPresenter @AssistedInject constructor(
167167
)
168168
}
169169

170-
ToolCard.Event.OpenTool,
171-
ToolCard.Event.OpenToolDetails,
172-
ToolCard.Event.PinTool,
173-
ToolCard.Event.UnpinTool -> Unit
170+
ToolCardEvent.OpenToolDetails -> Unit
174171
}
175172
}
176173
)

app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiEvent
3434
import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState
3535
import org.cru.godtools.ui.tools.SquareToolCard
3636
import org.cru.godtools.ui.tools.ToolCard
37+
import org.cru.godtools.ui.tools.ToolCardPresenter
3738

3839
internal val MARGIN_TOOLS_LAYOUT_HORIZONTAL = 16.dp
3940

@@ -163,7 +164,7 @@ private fun ToolsHeader(mode: UiState.Mode, modifier: Modifier = Modifier) = Col
163164
}
164165

165166
@Composable
166-
private fun ToolSpotlight(tools: List<ToolCard.State>, modifier: Modifier = Modifier) {
167+
private fun ToolSpotlight(tools: List<ToolCardPresenter.UiState>, modifier: Modifier = Modifier) {
167168
Column(modifier = modifier.fillMaxWidth()) {
168169
Text(
169170
stringResource(R.string.dashboard_tools_section_spotlight_label),

app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ import org.cru.godtools.ui.dashboard.tools.ToolFiltersStateProducer.Filters
4444
import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState
4545
import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState.Mode
4646
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen
47-
import org.cru.godtools.ui.tools.ToolCard
4847
import org.cru.godtools.ui.tools.ToolCardPresenter
48+
import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
4949
import org.greenrobot.eventbus.EventBus
5050

5151
class ToolsPresenter @AssistedInject internal constructor(
@@ -66,9 +66,9 @@ class ToolsPresenter @AssistedInject internal constructor(
6666
val mode: Mode = Mode.ALL_TOOLS,
6767
val banner: Banner.UiState? = null,
6868
val dataLoaded: Boolean = true,
69-
val spotlightTools: List<ToolCard.State> = emptyList(),
69+
val spotlightTools: List<ToolCardPresenter.UiState> = emptyList(),
7070
val filters: Filters = Filters(),
71-
val tools: List<ToolCard.State> = emptyList(),
71+
val tools: List<ToolCardPresenter.UiState> = emptyList(),
7272
// TODO: temporary until personalization is rolled out to everyone,
7373
// then this can be removed and the mode logic simplified
7474
val isPersonalizationEnabled: Boolean = false,
@@ -151,7 +151,7 @@ class ToolsPresenter @AssistedInject internal constructor(
151151
private fun rememberSpotlightTools(
152152
secondLanguage: Language?,
153153
eventSink: (UiEvent) -> Unit,
154-
): List<ToolCard.State>? {
154+
): List<ToolCardPresenter.UiState>? {
155155
val tools by remember {
156156
toolsRepository.getNormalToolsFlow()
157157
.map { it.filter { !it.isHidden && it.isSpotlight }.sortedWith(Tool.COMPARATOR_DEFAULT_ORDER) }
@@ -166,13 +166,10 @@ class ToolsPresenter @AssistedInject internal constructor(
166166
secondLanguage = secondLanguage,
167167
eventSink = {
168168
when (it) {
169-
ToolCard.Event.Click,
170-
ToolCard.Event.OpenTool,
171-
ToolCard.Event.OpenToolDetails ->
169+
ToolCardEvent.Click,
170+
ToolCardEvent.OpenTool,
171+
ToolCardEvent.OpenToolDetails ->
172172
toolCode?.let { eventSink(UiEvent.OpenToolDetails(it, SOURCE_SPOTLIGHT)) }
173-
174-
ToolCard.Event.PinTool,
175-
ToolCard.Event.UnpinTool -> error("$it should be handled by the ToolCardPresenter")
176173
}
177174
}
178175
)
@@ -185,7 +182,7 @@ class ToolsPresenter @AssistedInject internal constructor(
185182
category: String?,
186183
language: Language?,
187184
eventSink: (UiEvent) -> Unit,
188-
): List<ToolCard.State>? {
185+
): List<ToolCardPresenter.UiState>? {
189186
val locale = language?.code
190187
val tools by remember(mode, category, locale) { filteredToolsFlowProducer.getFlow(mode, category, locale) }
191188
.collectAsState(null)
@@ -199,13 +196,10 @@ class ToolsPresenter @AssistedInject internal constructor(
199196
secondLanguage = language,
200197
eventSink = {
201198
when (it) {
202-
ToolCard.Event.Click,
203-
ToolCard.Event.OpenTool,
204-
ToolCard.Event.OpenToolDetails ->
199+
ToolCardEvent.Click,
200+
ToolCardEvent.OpenTool,
201+
ToolCardEvent.OpenToolDetails ->
205202
toolCode?.let { eventSink(UiEvent.OpenToolDetails(it, SOURCE_ALL_TOOLS)) }
206-
207-
ToolCard.Event.PinTool,
208-
ToolCard.Event.UnpinTool -> error("$it should be handled by the ToolCardPresenter")
209203
}
210204
}
211205
)

app/src/main/kotlin/org/cru/godtools/ui/tooldetails/ToolDetailsLayout.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import org.cru.godtools.ui.tooldetails.ToolDetailsScreen.UiState
7575
import org.cru.godtools.ui.tooldetails.analytics.model.ToolDetailsScreenEvent
7676
import org.cru.godtools.ui.tools.AvailableInLanguage
7777
import org.cru.godtools.ui.tools.DownloadProgressIndicator
78+
import org.cru.godtools.ui.tools.ToolCardPresenter
7879
import org.cru.godtools.ui.tools.VariantToolCard
7980

8081
private val TOOL_DETAILS_HORIZONTAL_MARGIN = 32.dp

app/src/main/kotlin/org/cru/godtools/ui/tooldetails/ToolDetailsPresenter.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ import org.cru.godtools.ui.drawer.DrawerMenuPresenter
7171
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen.Page
7272
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen.UiEvent
7373
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen.UiState
74-
import org.cru.godtools.ui.tools.ToolCard
7574
import org.cru.godtools.ui.tools.ToolCardPresenter
75+
import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
7676
import org.cru.godtools.util.createToolIntent
7777
import org.greenrobot.eventbus.EventBus
7878

@@ -221,7 +221,7 @@ class ToolDetailsPresenter @AssistedInject constructor(
221221
metaToolCode: String?,
222222
secondLanguage: Language?,
223223
onVariantSelect: (String) -> Unit,
224-
): ImmutableList<ToolCard.State> {
224+
): List<ToolCardPresenter.UiState> {
225225
if (metaToolCode == null) return persistentListOf()
226226

227227
val onVariantSelect by rememberUpdatedState(onVariantSelect)
@@ -237,14 +237,13 @@ class ToolDetailsPresenter @AssistedInject constructor(
237237
loadAvailableLanguages = true,
238238
eventSink = {
239239
when (it) {
240-
ToolCard.Event.Click -> tool.code?.let { onVariantSelect(it) }
240+
ToolCardEvent.Click -> tool.code?.let { onVariantSelect(it) }
241241
else -> Unit
242242
}
243243
}
244244
)
245245
}
246246
}
247-
.toImmutableList()
248247
}
249248

250249
@Composable

app/src/main/kotlin/org/cru/godtools/ui/tooldetails/ToolDetailsScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.cru.godtools.model.Language
1515
import org.cru.godtools.model.Tool
1616
import org.cru.godtools.model.Translation
1717
import org.cru.godtools.ui.drawer.DrawerMenuScreen
18-
import org.cru.godtools.ui.tools.ToolCard
18+
import org.cru.godtools.ui.tools.ToolCardPresenter
1919

2020
@Parcelize
2121
data class ToolDetailsScreen(val initialTool: String, val secondLanguage: Locale? = null) : Screen {
@@ -32,7 +32,7 @@ data class ToolDetailsScreen(val initialTool: String, val secondLanguage: Locale
3232
val secondLanguage: Language? = null,
3333
val pages: ImmutableList<Page> = persistentListOf(Page.DESCRIPTION),
3434
val availableLanguages: ImmutableList<String> = persistentListOf(),
35-
val variants: ImmutableList<ToolCard.State> = persistentListOf(),
35+
val variants: List<ToolCardPresenter.UiState> = listOf(),
3636
val drawerState: DrawerMenuScreen.State = DrawerMenuScreen.State(),
3737
val eventSink: (UiEvent) -> Unit = {},
3838
) : CircuitUiState

0 commit comments

Comments
 (0)