Skip to content

Commit 55257df

Browse files
committed
use Circuit to render the dashboard lessons UI
1 parent 39e63c7 commit 55257df

4 files changed

Lines changed: 6 additions & 355 deletions

File tree

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ import org.cru.godtools.model.Tool
5858
import org.cru.godtools.shared.analytics.AnalyticsScreenNames
5959
import org.cru.godtools.ui.dashboard.home.AllFavoritesScreen
6060
import org.cru.godtools.ui.dashboard.home.HomeScreen
61-
import org.cru.godtools.ui.dashboard.lessons.DashboardLessonsEvent
62-
import org.cru.godtools.ui.dashboard.lessons.LessonsLayout
61+
import org.cru.godtools.ui.dashboard.lessons.LessonsScreen
6362
import org.cru.godtools.ui.dashboard.tools.ToolsScreen
6463
import org.cru.godtools.ui.drawer.DrawerMenuLayout
6564
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen
@@ -68,7 +67,6 @@ internal sealed interface DashboardEvent {
6867
class OpenIntent(val intent: Intent) : DashboardEvent
6968
open class OpenTool(val tool: String?, val type: Tool.Type?, val lang1: Locale?, val lang2: Locale? = null) :
7069
DashboardEvent
71-
class OpenLesson(lesson: String?, lang: Locale?) : OpenTool(lesson, Tool.Type.LESSON, lang)
7270
class OpenToolDetails(val tool: String?, val lang: Locale? = null) : DashboardEvent
7371
}
7472

@@ -120,20 +118,13 @@ internal fun DashboardLayout(onEvent: (DashboardEvent) -> Unit, viewModel: Dashb
120118
Crossfade(currentPage, label = "Main Content Crossfade") { page ->
121119
saveableStateHolder.SaveableStateProvider(page) {
122120
when (page) {
123-
Page.LESSONS -> LessonsLayout(
124-
onEvent = {
125-
when (it) {
126-
is DashboardLessonsEvent.OpenLesson ->
127-
onEvent(DashboardEvent.OpenLesson(it.lesson, it.lang))
128-
}
129-
},
130-
)
131-
121+
Page.LESSONS,
132122
Page.HOME,
133123
Page.FAVORITE_TOOLS,
134124
Page.ALL_TOOLS -> {
135125
CircuitContent(
136126
screen = when (page) {
127+
Page.LESSONS -> LessonsScreen
137128
Page.HOME -> HomeScreen
138129
Page.FAVORITE_TOOLS -> AllFavoritesScreen
139130
Page.ALL_TOOLS -> ToolsScreen

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

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,70 +9,17 @@ import androidx.compose.material3.HorizontalDivider
99
import androidx.compose.material3.MaterialTheme
1010
import androidx.compose.material3.Text
1111
import androidx.compose.runtime.Composable
12-
import androidx.compose.runtime.LaunchedEffect
13-
import androidx.compose.runtime.collectAsState
14-
import androidx.compose.runtime.key
15-
import androidx.compose.runtime.mutableStateOf
16-
import androidx.compose.runtime.saveable.rememberSaveable
1712
import androidx.compose.ui.Modifier
1813
import androidx.compose.ui.res.stringResource
1914
import androidx.compose.ui.tooling.preview.Preview
2015
import androidx.compose.ui.unit.dp
21-
import androidx.lifecycle.viewmodel.compose.viewModel
22-
import java.util.Locale
23-
import kotlinx.collections.immutable.persistentListOf
24-
import kotlinx.collections.immutable.toImmutableList
16+
import com.slack.circuit.codegen.annotations.CircuitInject
17+
import dagger.hilt.components.SingletonComponent
2518
import org.cru.godtools.R
26-
import org.cru.godtools.ui.dashboard.filters.FilterMenu
2719
import org.cru.godtools.ui.tools.LessonToolCard
28-
import org.cru.godtools.ui.tools.ToolCard
29-
import org.cru.godtools.ui.tools.toolViewModels
30-
31-
internal sealed interface DashboardLessonsEvent {
32-
class OpenLesson(val lesson: String?, val lang: Locale?) : DashboardLessonsEvent
33-
}
34-
35-
@Composable
36-
internal fun LessonsLayout(viewModel: LessonsViewModel = viewModel(), onEvent: (DashboardLessonsEvent) -> Unit = {}) {
37-
val languageFilter = FilterMenu.UiState(
38-
menuExpanded = rememberSaveable { mutableStateOf(false) },
39-
query = rememberSaveable { mutableStateOf("") },
40-
items = viewModel.filteredLanguages.collectAsState(persistentListOf()).value,
41-
selectedItem = viewModel.selectedLanguage.collectAsState().value,
42-
eventSink = {
43-
when (it) {
44-
is FilterMenu.Event.SelectItem -> it.item?.let { viewModel.updateSelectedLanguage(it) }
45-
}
46-
}
47-
)
48-
LaunchedEffect(languageFilter.query.value) { viewModel.query.value = languageFilter.query.value }
49-
50-
val state = LessonsScreen.UiState(
51-
languageFilter = languageFilter,
52-
lessons = viewModel.lessons.collectAsState().value
53-
.map { lesson ->
54-
key(lesson) {
55-
lateinit var state: ToolCard.State
56-
state = toolViewModels[lesson].toState(language = languageFilter.selectedItem) {
57-
when (it) {
58-
ToolCard.Event.Click -> {
59-
viewModel.recordOpenLessonInAnalytics(lesson)
60-
onEvent(DashboardLessonsEvent.OpenLesson(lesson, state.translation?.languageCode))
61-
}
62-
63-
else -> TODO()
64-
}
65-
}
66-
state
67-
}
68-
}
69-
.toImmutableList()
70-
)
71-
72-
LessonsLayout(state)
73-
}
7420

7521
@Composable
22+
@CircuitInject(LessonsScreen::class, SingletonComponent::class)
7623
internal fun LessonsLayout(state: LessonsScreen.UiState, modifier: Modifier = Modifier) {
7724
LazyColumn(contentPadding = PaddingValues(16.dp), modifier = modifier) {
7825
item("header", "header") {

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

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

0 commit comments

Comments
 (0)