|
1 | 1 | package org.cru.godtools.ui.dashboard.lessons |
2 | 2 |
|
3 | | -import androidx.compose.foundation.ExperimentalFoundationApi |
4 | 3 | import androidx.compose.foundation.layout.Row |
5 | | -import androidx.compose.foundation.layout.fillMaxWidth |
6 | 4 | import androidx.compose.foundation.layout.padding |
7 | | -import androidx.compose.foundation.layout.sizeIn |
8 | | -import androidx.compose.foundation.layout.wrapContentWidth |
9 | | -import androidx.compose.foundation.lazy.itemsIndexed |
10 | | -import androidx.compose.material3.ElevatedButton |
11 | | -import androidx.compose.material3.ExperimentalMaterial3Api |
12 | | -import androidx.compose.material3.ExposedDropdownMenuDefaults |
13 | | -import androidx.compose.material3.HorizontalDivider |
14 | | -import androidx.compose.material3.MenuDefaults |
15 | | -import androidx.compose.material3.SearchBar |
16 | | -import androidx.compose.material3.Surface |
17 | 5 | import androidx.compose.material3.Text |
18 | 6 | import androidx.compose.runtime.Composable |
19 | | -import androidx.compose.runtime.collectAsState |
20 | | -import androidx.compose.runtime.getValue |
21 | | -import androidx.compose.runtime.mutableStateOf |
22 | | -import androidx.compose.runtime.remember |
23 | | -import androidx.compose.runtime.setValue |
24 | 7 | import androidx.compose.ui.Modifier |
25 | 8 | import androidx.compose.ui.platform.LocalContext |
26 | 9 | import androidx.compose.ui.res.pluralStringResource |
27 | 10 | import androidx.compose.ui.res.stringResource |
28 | | -import androidx.compose.ui.semantics.Role |
29 | | -import androidx.compose.ui.semantics.role |
30 | | -import androidx.compose.ui.semantics.semantics |
31 | | -import androidx.compose.ui.text.style.TextOverflow |
32 | 11 | import androidx.compose.ui.unit.dp |
33 | | -import androidx.lifecycle.viewmodel.compose.viewModel |
34 | | -import java.util.Locale |
35 | | -import org.ccci.gto.android.common.androidx.compose.material3.ui.list.ListItemStartPadding |
36 | | -import org.ccci.gto.android.common.androidx.compose.material3.ui.menu.LazyDropdownMenu |
37 | 12 | import org.cru.godtools.R |
38 | 13 | import org.cru.godtools.base.LocalAppLanguage |
39 | | -import org.cru.godtools.base.ui.theme.GodToolsTheme |
40 | | -import org.cru.godtools.model.Language |
41 | | -import org.cru.godtools.ui.dashboard.filters.FilterMenuItem |
| 14 | +import org.cru.godtools.ui.dashboard.filters.LazyFilterMenu |
42 | 15 | import org.cru.godtools.ui.languages.LanguageName |
43 | 16 |
|
44 | | -private val DROPDOWN_LESSON_MAX_HEIGHT = 700.dp |
45 | | -private val DROPDOWN_LESSON_MAX_WIDTH = 350.dp |
46 | | - |
47 | 17 | @Composable |
48 | | -fun LessonFilters(modifier: Modifier = Modifier) { |
| 18 | +internal fun LessonFilters(state: LessonsScreen.UiState, modifier: Modifier = Modifier) { |
49 | 19 | Row(modifier = modifier) { |
50 | 20 | Text( |
51 | 21 | stringResource(R.string.dashboard_lessons_section_filter_label), |
52 | 22 | modifier = Modifier |
53 | 23 | .alignByBaseline() |
54 | 24 | .padding(end = 36.dp) |
55 | 25 | ) |
56 | | - LessonLanguageFilter( |
| 26 | + LazyFilterMenu( |
| 27 | + state.languageFilter, |
| 28 | + buttonLabelText = state.languageFilter.selectedItem |
| 29 | + ?.getDisplayName(LocalContext.current, LocalAppLanguage.current).orEmpty(), |
| 30 | + itemKey = { (it) -> it.code }, |
| 31 | + itemLabel = { LanguageName(it.item.code) }, |
| 32 | + itemSupportingText = { (_, count) -> |
| 33 | + pluralStringResource(R.plurals.dashboard_lessons_section_filter_available_lessons, count, count) |
| 34 | + }, |
57 | 35 | modifier = Modifier |
58 | 36 | .weight(1f) |
59 | 37 | .alignByBaseline() |
60 | 38 | ) |
61 | 39 | } |
62 | 40 | } |
63 | | - |
64 | | -@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) |
65 | | -@Composable |
66 | | -internal fun LessonLanguageFilter(modifier: Modifier = Modifier, viewModel: LessonsViewModel = viewModel()) { |
67 | | - val context = LocalContext.current |
68 | | - val selectedLanguage by viewModel.selectedLanguage.collectAsState(initial = Language(Locale.getDefault())) |
69 | | - |
70 | | - val lessonLanguages by viewModel.filteredLanguages.collectAsState(emptyList()) |
71 | | - var expanded by remember { mutableStateOf(false) } |
72 | | - |
73 | | - ElevatedButton( |
74 | | - onClick = { expanded = true }, |
75 | | - modifier = modifier.semantics { role = Role.DropdownList } |
76 | | - ) { |
77 | | - Text( |
78 | | - selectedLanguage.getDisplayName(context, LocalAppLanguage.current), |
79 | | - maxLines = 1, |
80 | | - overflow = TextOverflow.Ellipsis, |
81 | | - modifier = Modifier.weight(1f), |
82 | | - ) |
83 | | - ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) |
84 | | - LazyDropdownMenu( |
85 | | - expanded = expanded, |
86 | | - onDismissRequest = { expanded = false }, |
87 | | - modifier = Modifier.sizeIn(maxHeight = DROPDOWN_LESSON_MAX_HEIGHT, maxWidth = DROPDOWN_LESSON_MAX_WIDTH) |
88 | | - ) { |
89 | | - stickyHeader { |
90 | | - Surface(color = MenuDefaults.containerColor) { |
91 | | - val query by viewModel.query.collectAsState("") |
92 | | - SearchBar( |
93 | | - query = query, |
94 | | - onQueryChange = { change -> |
95 | | - viewModel.query.value = change |
96 | | - }, |
97 | | - onSearch = {}, |
98 | | - active = false, |
99 | | - onActiveChange = {}, |
100 | | - colors = GodToolsTheme.searchBarColors, |
101 | | - placeholder = { |
102 | | - Text(stringResource(R.string.language_settings_downloadable_languages_search)) |
103 | | - }, |
104 | | - content = {}, |
105 | | - modifier = Modifier |
106 | | - .padding(horizontal = 8.dp) |
107 | | - .fillMaxWidth() |
108 | | - .wrapContentWidth() |
109 | | - ) |
110 | | - } |
111 | | - } |
112 | | - |
113 | | - itemsIndexed(lessonLanguages, key = { _, (language) -> language.code }) { index, (lang, count) -> |
114 | | - if (index > 0) { |
115 | | - HorizontalDivider(Modifier.padding(start = ListItemStartPadding, end = ListItemStartPadding)) |
116 | | - } |
117 | | - FilterMenuItem( |
118 | | - label = { LanguageName(lang) }, |
119 | | - supportingText = pluralStringResource( |
120 | | - R.plurals.dashboard_lessons_section_filter_available_lessons, |
121 | | - count, |
122 | | - count, |
123 | | - ), |
124 | | - onClick = { |
125 | | - expanded = false |
126 | | - viewModel.updateSelectedLanguage(lang) |
127 | | - viewModel.query.value = "" |
128 | | - }, |
129 | | - // TODO: Animate item placement - Add back when Compose version 1.7 is released |
130 | | -// modifier = Modifier.animateItemPlacement() |
131 | | - ) |
132 | | - } |
133 | | - } |
134 | | - } |
135 | | -} |
0 commit comments