Skip to content

Commit b2ca1c8

Browse files
committed
render the dashboard home UI using Circuit
1 parent fede62f commit b2ca1c8

3 files changed

Lines changed: 13 additions & 160 deletions

File tree

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ import org.cru.godtools.base.ui.theme.GodToolsTheme
5757
import org.cru.godtools.model.Tool
5858
import org.cru.godtools.shared.analytics.AnalyticsScreenNames
5959
import org.cru.godtools.ui.dashboard.home.AllFavoritesScreen
60-
import org.cru.godtools.ui.dashboard.home.DashboardHomeEvent
61-
import org.cru.godtools.ui.dashboard.home.HomeContent
60+
import org.cru.godtools.ui.dashboard.home.HomeScreen
6261
import org.cru.godtools.ui.dashboard.lessons.DashboardLessonsEvent
6362
import org.cru.godtools.ui.dashboard.lessons.LessonsLayout
6463
import org.cru.godtools.ui.dashboard.tools.ToolsScreen
@@ -130,33 +129,23 @@ internal fun DashboardLayout(onEvent: (DashboardEvent) -> Unit, viewModel: Dashb
130129
},
131130
)
132131

133-
Page.HOME -> HomeContent(
134-
onEvent = {
135-
when (it) {
136-
DashboardHomeEvent.ViewAllFavorites -> {
137-
saveableStateHolder.removeState(Page.FAVORITE_TOOLS)
138-
viewModel.updateCurrentPage(Page.FAVORITE_TOOLS, false)
139-
}
140-
DashboardHomeEvent.ViewAllTools -> viewModel.updateCurrentPage(Page.ALL_TOOLS)
141-
is DashboardHomeEvent.OpenTool ->
142-
onEvent(DashboardEvent.OpenTool(it.tool, it.type, it.lang1, it.lang2))
143-
is DashboardHomeEvent.OpenToolDetails ->
144-
onEvent(DashboardEvent.OpenToolDetails(it.tool))
145-
}
146-
}
147-
)
148-
132+
Page.HOME,
149133
Page.FAVORITE_TOOLS,
150134
Page.ALL_TOOLS -> {
151135
CircuitContent(
152136
screen = when (page) {
137+
Page.HOME -> HomeScreen
153138
Page.FAVORITE_TOOLS -> AllFavoritesScreen
154139
Page.ALL_TOOLS -> ToolsScreen
155140
else -> error("Page $page is not converted to Circuit yet")
156141
},
157142
onNavEvent = {
158143
when (it) {
159144
is NavEvent.GoTo -> when (val screen = it.screen) {
145+
AllFavoritesScreen -> {
146+
saveableStateHolder.removeState(Page.FAVORITE_TOOLS)
147+
viewModel.updateCurrentPage(Page.FAVORITE_TOOLS, false)
148+
}
160149
is IntentScreen -> onEvent(DashboardEvent.OpenIntent(screen.intent))
161150
is ToolDetailsScreen -> onEvent(
162151
DashboardEvent.OpenToolDetails(
@@ -165,6 +154,9 @@ internal fun DashboardLayout(onEvent: (DashboardEvent) -> Unit, viewModel: Dashb
165154
)
166155
)
167156
}
157+
is NavEvent.ResetRoot -> when (it.newRoot) {
158+
ToolsScreen -> viewModel.updateCurrentPage(Page.ALL_TOOLS)
159+
}
168160
else -> Unit
169161
}
170162
},

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

Lines changed: 3 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -21,121 +21,27 @@ import androidx.compose.material3.Surface
2121
import androidx.compose.material3.Text
2222
import androidx.compose.runtime.Composable
2323
import androidx.compose.runtime.LaunchedEffect
24-
import androidx.compose.runtime.collectAsState
2524
import androidx.compose.runtime.getValue
26-
import androidx.compose.runtime.key
2725
import androidx.compose.runtime.rememberUpdatedState
2826
import androidx.compose.ui.Alignment
2927
import androidx.compose.ui.Modifier
3028
import androidx.compose.ui.graphics.RectangleShape
3129
import androidx.compose.ui.res.stringResource
3230
import androidx.compose.ui.text.style.TextAlign
3331
import androidx.compose.ui.unit.dp
34-
import androidx.lifecycle.viewmodel.compose.viewModel
35-
import java.util.Locale
36-
import org.cru.godtools.BuildConfig
32+
import com.slack.circuit.codegen.annotations.CircuitInject
33+
import dagger.hilt.components.SingletonComponent
3734
import org.cru.godtools.R
38-
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_LESSON
39-
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_TOOL
40-
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_TOOL_DETAILS
41-
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_FAVORITE
42-
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_FEATURED
43-
import org.cru.godtools.model.Tool
4435
import org.cru.godtools.ui.banner.Banners
4536
import org.cru.godtools.ui.dashboard.home.HomeScreen.UiEvent
4637
import org.cru.godtools.ui.dashboard.home.HomeScreen.UiState
4738
import org.cru.godtools.ui.tools.LessonToolCard
4839
import org.cru.godtools.ui.tools.SquareToolCard
49-
import org.cru.godtools.ui.tools.ToolCard
50-
import org.cru.godtools.ui.tools.ToolCardEvent
51-
import org.cru.godtools.ui.tools.toolViewModels
5240

5341
private val PADDING_HORIZONTAL = 16.dp
5442

55-
internal sealed interface DashboardHomeEvent {
56-
open class OpenTool(val tool: String?, val type: Tool.Type?, val lang1: Locale?, val lang2: Locale? = null) :
57-
DashboardHomeEvent {
58-
constructor(event: ToolCardEvent) : this(event.tool, event.toolType, event.lang1, event.lang2)
59-
}
60-
open class OpenToolDetails(val tool: String?) : DashboardHomeEvent {
61-
constructor(event: ToolCardEvent.OpenToolDetails) : this(event.tool)
62-
}
63-
class OpenLesson(event: ToolCardEvent) : OpenTool(event.tool, Tool.Type.LESSON, event.lang1)
64-
data object ViewAllFavorites : DashboardHomeEvent
65-
data object ViewAllTools : DashboardHomeEvent
66-
}
67-
68-
@Composable
69-
internal fun HomeContent(onEvent: (DashboardHomeEvent) -> Unit, viewModel: HomeViewModel = viewModel()) {
70-
val favoriteTools by viewModel.favoriteTools.collectAsState()
71-
72-
val state = UiState(
73-
banner = viewModel.banner.collectAsState().value,
74-
spotlightLessons = viewModel.spotlightLessons.collectAsState().value.mapNotNull { lesson ->
75-
key(lesson) {
76-
lateinit var lessonState: ToolCard.State
77-
lessonState = toolViewModels[lesson.code ?: return@mapNotNull null, lesson].toState {
78-
when (it) {
79-
ToolCard.Event.Click -> {
80-
viewModel.recordOpenClickInAnalytics(ACTION_OPEN_LESSON, lesson.code, SOURCE_FEATURED)
81-
onEvent(
82-
DashboardHomeEvent.OpenLesson(
83-
ToolCardEvent.Click(
84-
lessonState.tool?.code,
85-
lessonState.tool?.type,
86-
lessonState.translation?.languageCode
87-
)
88-
)
89-
)
90-
}
91-
92-
else -> if (BuildConfig.DEBUG) error("$it is currently unsupported for Lesson Cards")
93-
}
94-
}
95-
lessonState
96-
}
97-
},
98-
favoriteTools = favoriteTools.orEmpty().take(5).mapNotNull { tool ->
99-
key(tool.code) {
100-
val toolViewModel = toolViewModels[tool.code ?: return@mapNotNull null, tool]
101-
lateinit var toolState: ToolCard.State
102-
toolState = toolViewModel.toState {
103-
when (it) {
104-
ToolCard.Event.Click, ToolCard.Event.OpenTool -> {
105-
viewModel.recordOpenClickInAnalytics(ACTION_OPEN_TOOL, tool.code, SOURCE_FAVORITE)
106-
onEvent(
107-
DashboardHomeEvent.OpenTool(
108-
ToolCardEvent.Click(
109-
tool = tool.code,
110-
type = tool.type,
111-
lang1 = toolState.translation?.languageCode,
112-
)
113-
)
114-
)
115-
}
116-
ToolCard.Event.OpenToolDetails -> {
117-
viewModel.recordOpenClickInAnalytics(ACTION_OPEN_TOOL_DETAILS, tool.code, SOURCE_FAVORITE)
118-
onEvent(DashboardHomeEvent.OpenToolDetails(tool.code))
119-
}
120-
ToolCard.Event.PinTool -> toolViewModel.pinTool()
121-
ToolCard.Event.UnpinTool -> toolViewModel.unpinTool()
122-
}
123-
}
124-
toolState
125-
}
126-
},
127-
favoriteToolsLoaded = favoriteTools != null,
128-
) {
129-
when (it) {
130-
UiEvent.ViewAllFavorites -> onEvent(DashboardHomeEvent.ViewAllFavorites)
131-
UiEvent.ViewAllTools -> onEvent(DashboardHomeEvent.ViewAllTools)
132-
}
133-
}
134-
135-
HomeLayout(state)
136-
}
137-
13843
@Composable
44+
@CircuitInject(HomeScreen::class, SingletonComponent::class)
13945
internal fun HomeLayout(state: UiState, modifier: Modifier = Modifier) {
14046
val banner by rememberUpdatedState(state.banner)
14147
val favoriteToolsLoaded by rememberUpdatedState(state.favoriteToolsLoaded)

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

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

0 commit comments

Comments
 (0)