@@ -11,9 +11,8 @@ import androidx.compose.material3.Text
1111import androidx.compose.runtime.Composable
1212import androidx.compose.runtime.LaunchedEffect
1313import androidx.compose.runtime.collectAsState
14- import androidx.compose.runtime.getValue
14+ import androidx.compose.runtime.key
1515import androidx.compose.runtime.mutableStateOf
16- import androidx.compose.runtime.rememberUpdatedState
1716import androidx.compose.runtime.saveable.rememberSaveable
1817import androidx.compose.ui.Modifier
1918import androidx.compose.ui.res.stringResource
@@ -22,6 +21,7 @@ import androidx.compose.ui.unit.dp
2221import androidx.lifecycle.viewmodel.compose.viewModel
2322import java.util.Locale
2423import kotlinx.collections.immutable.persistentListOf
24+ import kotlinx.collections.immutable.toImmutableList
2525import org.cru.godtools.R
2626import org.cru.godtools.ui.dashboard.filters.FilterMenu
2727import org.cru.godtools.ui.tools.LessonToolCard
@@ -34,45 +34,56 @@ internal sealed interface DashboardLessonsEvent {
3434
3535@Composable
3636internal 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+
3750 val state = LessonsScreen .UiState (
38- languageFilter = FilterMenu .UiState (
39- menuExpanded = rememberSaveable { mutableStateOf(false ) },
40- query = rememberSaveable { mutableStateOf(" " ) },
41- items = viewModel.filteredLanguages.collectAsState(persistentListOf()).value,
42- selectedItem = viewModel.selectedLanguage.collectAsState().value,
43- eventSink = {
44- when (it) {
45- is FilterMenu .Event .SelectItem -> it.item?.let { viewModel.updateSelectedLanguage(it) }
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
4667 }
4768 }
48- )
69+ .toImmutableList( )
4970 )
50- LaunchedEffect (state.languageFilter.query.value) { viewModel.query.value = state.languageFilter.query.value }
5171
52- val lessons by viewModel.lessons.collectAsState(emptyList() )
53- val selectedLanguage by rememberUpdatedState(state.languageFilter.selectedItem)
72+ LessonsLayout (state )
73+ }
5474
55- LazyColumn (contentPadding = PaddingValues (16 .dp)) {
75+ @Composable
76+ internal fun LessonsLayout (state : LessonsScreen .UiState , modifier : Modifier = Modifier ) {
77+ LazyColumn (contentPadding = PaddingValues (16 .dp), modifier = modifier) {
5678 item(" header" , " header" ) {
5779 LessonsHeader ()
5880 HorizontalDivider (modifier = Modifier .padding(vertical = 12 .dp))
5981 LessonFilters (state)
6082 }
6183
62- items(lessons, { it }, { " lesson" }) { lesson ->
63- lateinit var state: ToolCard .State
64- state = toolViewModels[lesson].toState(language = selectedLanguage) {
65- when (it) {
66- ToolCard .Event .Click -> {
67- viewModel.recordOpenLessonInAnalytics(lesson)
68- onEvent(DashboardLessonsEvent .OpenLesson (lesson, state.translation?.languageCode))
69- }
70- else -> TODO ()
71- }
72- }
73-
84+ items(state.lessons, { it.toolCode.orEmpty() }, { " lesson" }) { toolState ->
7485 LessonToolCard (
75- state ,
86+ toolState ,
7687 modifier = Modifier
7788 .animateItem()
7889 .padding(top = 16 .dp)
0 commit comments