@@ -21,121 +21,27 @@ import androidx.compose.material3.Surface
2121import androidx.compose.material3.Text
2222import androidx.compose.runtime.Composable
2323import androidx.compose.runtime.LaunchedEffect
24- import androidx.compose.runtime.collectAsState
2524import androidx.compose.runtime.getValue
26- import androidx.compose.runtime.key
2725import androidx.compose.runtime.rememberUpdatedState
2826import androidx.compose.ui.Alignment
2927import androidx.compose.ui.Modifier
3028import androidx.compose.ui.graphics.RectangleShape
3129import androidx.compose.ui.res.stringResource
3230import androidx.compose.ui.text.style.TextAlign
3331import 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
3734import 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
4435import org.cru.godtools.ui.banner.Banners
4536import org.cru.godtools.ui.dashboard.home.HomeScreen.UiEvent
4637import org.cru.godtools.ui.dashboard.home.HomeScreen.UiState
4738import org.cru.godtools.ui.tools.LessonToolCard
4839import 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
5341private 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 )
13945internal fun HomeLayout (state : UiState , modifier : Modifier = Modifier ) {
14046 val banner by rememberUpdatedState(state.banner)
14147 val favoriteToolsLoaded by rememberUpdatedState(state.favoriteToolsLoaded)
0 commit comments