Skip to content

Commit 1d283e3

Browse files
committed
SUGGESTIONS NOW ADDED!
finally this is a semi usable app now.
1 parent afc7292 commit 1d283e3

File tree

4 files changed

+143
-24
lines changed

4 files changed

+143
-24
lines changed

app/src/main/java/com/kip/reykunyu/data/dict/Suggestions.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.kip.reykunyu.data.dict
22

33
import android.util.Log
4+
import com.kip.reykunyu.R
45
import com.kip.reykunyu.data.api.ReykunyuApi
56
import kotlinx.serialization.Serializable
67

@@ -36,7 +37,11 @@ data class NaviSuggestion(
3637
val word: String,
3738
val type: String? = null,
3839
val explanation: String? = null
39-
)
40+
){
41+
fun typeDetails(): Int {
42+
return typeInfoMap[typeMap.entries.find { it.value == type }?.key] ?: R.string.unknown
43+
}
44+
}
4045

4146
enum class SuggestionsStatus{
4247
Standby,
@@ -68,9 +73,9 @@ object UniversalSuggestionsRepository: SuggestionsRepository {
6873
): SuggestionsResult {
6974
return when(mode){
7075
SearchMode.Translate -> TranslateSuggestionsProvider().suggest(query, language)
71-
SearchMode.Sentence -> TODO()
72-
SearchMode.Annotated -> TODO()
73-
SearchMode.Rhymes -> TODO()
76+
SearchMode.Sentence -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
77+
SearchMode.Annotated -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
78+
SearchMode.Rhymes -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
7479
SearchMode.Offline -> SuggestionsResult(SuggestionsStatus.Success) //No suggestions for offline mode
7580
}
7681
}

app/src/main/java/com/kip/reykunyu/ui/components/NaviCard.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ fun NaviCard(navi: Navi, language: Language, naviClick: (String) -> Unit, expand
523523
}
524524

525525
@Composable
526-
private fun WordTypeCard(typeDetails: Int, typeDisplay: String) {
526+
public fun WordTypeCard(typeDetails: Int, typeDisplay: String) {
527527
var showTypeInfo by remember { mutableStateOf(false) }
528528
Card(
529529
onClick = {

app/src/main/java/com/kip/reykunyu/ui/screens/DictionaryScreen.kt

Lines changed: 131 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
package com.kip.reykunyu.ui.screens
44

5-
import android.util.Log
65
import androidx.compose.animation.AnimatedContent
76
import androidx.compose.animation.Crossfade
87
import androidx.compose.animation.ExperimentalAnimationApi
@@ -16,6 +15,7 @@ import androidx.compose.foundation.BorderStroke
1615
import androidx.compose.foundation.ExperimentalFoundationApi
1716
import androidx.compose.foundation.background
1817
import androidx.compose.foundation.border
18+
import androidx.compose.foundation.clickable
1919
import androidx.compose.foundation.layout.Arrangement
2020
import androidx.compose.foundation.layout.Box
2121
import androidx.compose.foundation.layout.Column
@@ -38,7 +38,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
3838
import androidx.compose.material.icons.Icons
3939
import androidx.compose.material.icons.filled.Menu
4040
import androidx.compose.material.icons.filled.Search
41-
import androidx.compose.material.icons.filled.Star
41+
import androidx.compose.material.icons.filled.Warning
4242
import androidx.compose.material.icons.rounded.Info
4343
import androidx.compose.material.icons.rounded.Search
4444
import androidx.compose.material3.Button
@@ -95,8 +95,12 @@ import androidx.lifecycle.viewmodel.compose.viewModel
9595
import com.kip.reykunyu.R
9696
import com.kip.reykunyu.data.dict.Language
9797
import com.kip.reykunyu.data.dict.Navi
98+
import com.kip.reykunyu.data.dict.NaviSuggestion
9899
import com.kip.reykunyu.data.dict.SearchMode
100+
import com.kip.reykunyu.data.dict.SuggestionsResult
101+
import com.kip.reykunyu.data.dict.SuggestionsStatus
99102
import com.kip.reykunyu.ui.components.NaviCard
103+
import com.kip.reykunyu.ui.components.WordTypeCard
100104
import com.kip.reykunyu.viewmodels.DictionarySearchViewModel
101105
import com.kip.reykunyu.viewmodels.OfflineDictState
102106
import com.kip.reykunyu.viewmodels.OfflineDictionaryViewModel
@@ -119,28 +123,36 @@ fun DictionaryScreen(
119123
val dictState = offlineDictViewModel.offlineDictState
120124
val preferenceState = preferenceViewModel.preferenceState.collectAsState().value
121125

126+
val onQueryUpdate = { text: String ->
127+
searchViewModel.updateSearchInput(text)
128+
searchViewModel.updateSuggestions(preferenceState.searchLanguage)
129+
}
122130
val onSearch = {
123131
focusManager.clearFocus()
124132
searchViewModel.search(preferenceState.searchLanguage)
125133
}
126134

127-
Box (Modifier.fillMaxSize().semantics { isTraversalGroup = true })
135+
Box (
136+
Modifier
137+
.fillMaxSize()
138+
.semantics { isTraversalGroup = true })
128139
{
129140
DictionarySearchBar(
130141
searchString = searchViewModel.searchInput,
131142
enabled = (dictState == OfflineDictState.Loaded),
132-
onInputChanged = {
133-
searchViewModel.updateSearchInput(it)
134-
searchViewModel.updateSuggestions(preferenceState.searchLanguage)
135-
},
143+
onInputChanged = onQueryUpdate,
144+
suggestions = searchViewModel.searchSuggestions,
136145
focusManager = focusManager,
137146
onSearch = onSearch,
147+
onSuggestionSelect = {
148+
onQueryUpdate(it)
149+
onSearch()
150+
},
138151
modifier = Modifier
139152
.align(Alignment.TopCenter)
140153
.semantics { traversalIndex = -1f }
141154
.padding(top = 57.dp)
142155
.padding(horizontal = 50.dp)
143-
144156
)
145157

146158
Scaffold(
@@ -208,8 +220,7 @@ fun DictionaryScreen(
208220
toNavi = state.result.toNavi,
209221
language = preferenceState.searchLanguage,
210222
naviAction = {
211-
Log.i("REYKUNYU", "NAVI REF: $it")
212-
searchViewModel.updateSearchInput(it)
223+
onQueryUpdate(it)
213224
onSearch()
214225
}
215226
)
@@ -406,10 +417,39 @@ fun DictionarySearchBar(
406417
enabled: Boolean,
407418
onInputChanged: (String) -> Unit,
408419
onSearch: () -> Unit,
420+
suggestions: SuggestionsResult,
421+
onSuggestionSelect: (String) -> Unit,
409422
focusManager: FocusManager,
410423
modifier: Modifier = Modifier
411424
) {
425+
@Composable
426+
fun SuggestionItem(suggestion: NaviSuggestion, onSuggestionSelect: (String) -> Unit){
427+
ListItem(
428+
headlineContent = { Text(suggestion.word) },
429+
supportingContent = {
430+
suggestion.explanation?.let {
431+
Text(
432+
text = it
433+
)
434+
}
435+
},
436+
leadingContent = {
437+
suggestion.type?.let {
438+
WordTypeCard(
439+
typeDetails = suggestion.typeDetails(),
440+
typeDisplay = it
441+
)
442+
}
443+
},
444+
modifier = Modifier.clickable{onSuggestionSelect(suggestion.word)}
445+
)
446+
}
447+
412448
var active by rememberSaveable { mutableStateOf(false) }
449+
val suggestionSelectAction = { text:String ->
450+
onSuggestionSelect(text)
451+
active = false
452+
}
413453

414454
//Search bar
415455
ProvideTextStyle(value = MaterialTheme.typography.titleMedium.copy(fontSize = 20.sp)) {
@@ -448,19 +488,89 @@ fun DictionarySearchBar(
448488

449489

450490
) {
451-
repeat(4) { idx ->
452-
val resultText = "Suggestion $idx"
453-
ListItem(
454-
headlineContent = { Text(resultText) },
455-
supportingContent = { Text("Additional info") },
456-
leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
457-
modifier = Modifier
491+
when(suggestions.status){
492+
SuggestionsStatus.Standby -> {
493+
Box(contentAlignment = Alignment.Center, modifier = Modifier
458494
.fillMaxWidth()
459-
// .padding(horizontal = 16.dp, vertical = 4.dp)
460-
)
495+
.padding(top = 100.dp)){
496+
Text(text = "No suggestions...")
497+
}
498+
}
499+
SuggestionsStatus.Loading -> {
500+
Box(contentAlignment = Alignment.Center, modifier = Modifier
501+
.fillMaxWidth()
502+
.padding(top = 100.dp)){
503+
CircularProgressIndicator()
504+
}
505+
}
506+
SuggestionsStatus.Success -> {
507+
if(suggestions.fromNavi.isNullOrEmpty() && suggestions.toNavi.isNullOrEmpty()){
508+
Box(contentAlignment = Alignment.Center, modifier = Modifier
509+
.fillMaxWidth()
510+
.padding(top = 100.dp)){
511+
Text(text = "No suggestions...")
512+
}
513+
}
514+
515+
val state: LazyListState = rememberLazyListState()
516+
LazyColumn(
517+
state = state,
518+
modifier = Modifier.simpleVerticalScrollbar(state)
519+
) {
520+
if(!suggestions.fromNavi.isNullOrEmpty()){
521+
item{
522+
Spacer(Modifier.padding(7.dp))
523+
Text(
524+
text = "from Na'vi",
525+
style = MaterialTheme.typography.labelLarge,
526+
modifier = Modifier.padding(horizontal = 20.dp)
527+
)
528+
529+
}
530+
for (suggestion in suggestions.fromNavi) {
531+
item {
532+
SuggestionItem(suggestion = suggestion, onSuggestionSelect = suggestionSelectAction)
533+
}
534+
}
535+
}
536+
537+
if(!suggestions.toNavi.isNullOrEmpty()){
538+
item{
539+
Spacer(Modifier.padding(7.dp))
540+
Text(
541+
text = "to Na'vi",
542+
style = MaterialTheme.typography.labelLarge,
543+
modifier = Modifier.padding(horizontal = 20.dp)
544+
)
545+
546+
}
547+
548+
for (suggestion in suggestions.toNavi) {
549+
item {
550+
SuggestionItem(suggestion = suggestion, onSuggestionSelect = suggestionSelectAction)
551+
}
552+
}
553+
554+
555+
}
556+
557+
}
558+
559+
560+
}
561+
SuggestionsStatus.Error -> {
562+
ListItem(
563+
headlineContent = { Text(stringResource(id = R.string.error)) },
564+
supportingContent = { Text(text = suggestions.info ?: "")},
565+
leadingContent = { Icon(Icons.Filled.Warning, contentDescription = null)}
566+
)
567+
}
461568
}
462569

570+
463571
}
572+
573+
464574
}
465575

466576
// OutlinedTextField(
@@ -750,3 +860,5 @@ fun FancyIndicator(color: Color, modifier: Modifier = Modifier) {
750860
.border(BorderStroke(2.dp, color), RoundedCornerShape(5.dp))
751861
)
752862
}
863+
864+

app/src/main/java/com/kip/reykunyu/viewmodels/DictionarySearchViewModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class DictionarySearchViewModel: ViewModel() {
6060
searchSuggestions = UniversalSuggestionsRepository.suggest(
6161
query = searchInput, language = language, mode = searchMode)
6262
}
63+
}else{
64+
searchSuggestions = SuggestionsResult(SuggestionsStatus.Standby)
6365
}
6466
}
6567

0 commit comments

Comments
 (0)