Skip to content

Commit

Permalink
SUGGESTIONS NOW ADDED!
Browse files Browse the repository at this point in the history
finally this is a semi usable app now.
  • Loading branch information
KipJM committed Dec 17, 2023
1 parent afc7292 commit 1d283e3
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 24 deletions.
13 changes: 9 additions & 4 deletions app/src/main/java/com/kip/reykunyu/data/dict/Suggestions.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kip.reykunyu.data.dict

import android.util.Log
import com.kip.reykunyu.R
import com.kip.reykunyu.data.api.ReykunyuApi
import kotlinx.serialization.Serializable

Expand Down Expand Up @@ -36,7 +37,11 @@ data class NaviSuggestion(
val word: String,
val type: String? = null,
val explanation: String? = null
)
){
fun typeDetails(): Int {
return typeInfoMap[typeMap.entries.find { it.value == type }?.key] ?: R.string.unknown
}
}

enum class SuggestionsStatus{
Standby,
Expand Down Expand Up @@ -68,9 +73,9 @@ object UniversalSuggestionsRepository: SuggestionsRepository {
): SuggestionsResult {
return when(mode){
SearchMode.Translate -> TranslateSuggestionsProvider().suggest(query, language)
SearchMode.Sentence -> TODO()
SearchMode.Annotated -> TODO()
SearchMode.Rhymes -> TODO()
SearchMode.Sentence -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
SearchMode.Annotated -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
SearchMode.Rhymes -> SuggestionsResult(SuggestionsStatus.Error, info = "Coming soon!(TM)") //TODO
SearchMode.Offline -> SuggestionsResult(SuggestionsStatus.Success) //No suggestions for offline mode
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ fun NaviCard(navi: Navi, language: Language, naviClick: (String) -> Unit, expand
}

@Composable
private fun WordTypeCard(typeDetails: Int, typeDisplay: String) {
public fun WordTypeCard(typeDetails: Int, typeDisplay: String) {
var showTypeInfo by remember { mutableStateOf(false) }
Card(
onClick = {
Expand Down
150 changes: 131 additions & 19 deletions app/src/main/java/com/kip/reykunyu/ui/screens/DictionaryScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

package com.kip.reykunyu.ui.screens

import android.util.Log
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.Crossfade
import androidx.compose.animation.ExperimentalAnimationApi
Expand All @@ -16,6 +15,7 @@ import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand All @@ -38,7 +38,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Star
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.Button
Expand Down Expand Up @@ -95,8 +95,12 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import com.kip.reykunyu.R
import com.kip.reykunyu.data.dict.Language
import com.kip.reykunyu.data.dict.Navi
import com.kip.reykunyu.data.dict.NaviSuggestion
import com.kip.reykunyu.data.dict.SearchMode
import com.kip.reykunyu.data.dict.SuggestionsResult
import com.kip.reykunyu.data.dict.SuggestionsStatus
import com.kip.reykunyu.ui.components.NaviCard
import com.kip.reykunyu.ui.components.WordTypeCard
import com.kip.reykunyu.viewmodels.DictionarySearchViewModel
import com.kip.reykunyu.viewmodels.OfflineDictState
import com.kip.reykunyu.viewmodels.OfflineDictionaryViewModel
Expand All @@ -119,28 +123,36 @@ fun DictionaryScreen(
val dictState = offlineDictViewModel.offlineDictState
val preferenceState = preferenceViewModel.preferenceState.collectAsState().value

val onQueryUpdate = { text: String ->
searchViewModel.updateSearchInput(text)
searchViewModel.updateSuggestions(preferenceState.searchLanguage)
}
val onSearch = {
focusManager.clearFocus()
searchViewModel.search(preferenceState.searchLanguage)
}

Box (Modifier.fillMaxSize().semantics { isTraversalGroup = true })
Box (
Modifier
.fillMaxSize()
.semantics { isTraversalGroup = true })
{
DictionarySearchBar(
searchString = searchViewModel.searchInput,
enabled = (dictState == OfflineDictState.Loaded),
onInputChanged = {
searchViewModel.updateSearchInput(it)
searchViewModel.updateSuggestions(preferenceState.searchLanguage)
},
onInputChanged = onQueryUpdate,
suggestions = searchViewModel.searchSuggestions,
focusManager = focusManager,
onSearch = onSearch,
onSuggestionSelect = {
onQueryUpdate(it)
onSearch()
},
modifier = Modifier
.align(Alignment.TopCenter)
.semantics { traversalIndex = -1f }
.padding(top = 57.dp)
.padding(horizontal = 50.dp)

)

Scaffold(
Expand Down Expand Up @@ -208,8 +220,7 @@ fun DictionaryScreen(
toNavi = state.result.toNavi,
language = preferenceState.searchLanguage,
naviAction = {
Log.i("REYKUNYU", "NAVI REF: $it")
searchViewModel.updateSearchInput(it)
onQueryUpdate(it)
onSearch()
}
)
Expand Down Expand Up @@ -406,10 +417,39 @@ fun DictionarySearchBar(
enabled: Boolean,
onInputChanged: (String) -> Unit,
onSearch: () -> Unit,
suggestions: SuggestionsResult,
onSuggestionSelect: (String) -> Unit,
focusManager: FocusManager,
modifier: Modifier = Modifier
) {
@Composable
fun SuggestionItem(suggestion: NaviSuggestion, onSuggestionSelect: (String) -> Unit){
ListItem(
headlineContent = { Text(suggestion.word) },
supportingContent = {
suggestion.explanation?.let {
Text(
text = it
)
}
},
leadingContent = {
suggestion.type?.let {
WordTypeCard(
typeDetails = suggestion.typeDetails(),
typeDisplay = it
)
}
},
modifier = Modifier.clickable{onSuggestionSelect(suggestion.word)}
)
}

var active by rememberSaveable { mutableStateOf(false) }
val suggestionSelectAction = { text:String ->
onSuggestionSelect(text)
active = false
}

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


) {
repeat(4) { idx ->
val resultText = "Suggestion $idx"
ListItem(
headlineContent = { Text(resultText) },
supportingContent = { Text("Additional info") },
leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
modifier = Modifier
when(suggestions.status){
SuggestionsStatus.Standby -> {
Box(contentAlignment = Alignment.Center, modifier = Modifier
.fillMaxWidth()
// .padding(horizontal = 16.dp, vertical = 4.dp)
)
.padding(top = 100.dp)){
Text(text = "No suggestions...")
}
}
SuggestionsStatus.Loading -> {
Box(contentAlignment = Alignment.Center, modifier = Modifier
.fillMaxWidth()
.padding(top = 100.dp)){
CircularProgressIndicator()
}
}
SuggestionsStatus.Success -> {
if(suggestions.fromNavi.isNullOrEmpty() && suggestions.toNavi.isNullOrEmpty()){
Box(contentAlignment = Alignment.Center, modifier = Modifier
.fillMaxWidth()
.padding(top = 100.dp)){
Text(text = "No suggestions...")
}
}

val state: LazyListState = rememberLazyListState()
LazyColumn(
state = state,
modifier = Modifier.simpleVerticalScrollbar(state)
) {
if(!suggestions.fromNavi.isNullOrEmpty()){
item{
Spacer(Modifier.padding(7.dp))
Text(
text = "from Na'vi",
style = MaterialTheme.typography.labelLarge,
modifier = Modifier.padding(horizontal = 20.dp)
)

}
for (suggestion in suggestions.fromNavi) {
item {
SuggestionItem(suggestion = suggestion, onSuggestionSelect = suggestionSelectAction)
}
}
}

if(!suggestions.toNavi.isNullOrEmpty()){
item{
Spacer(Modifier.padding(7.dp))
Text(
text = "to Na'vi",
style = MaterialTheme.typography.labelLarge,
modifier = Modifier.padding(horizontal = 20.dp)
)

}

for (suggestion in suggestions.toNavi) {
item {
SuggestionItem(suggestion = suggestion, onSuggestionSelect = suggestionSelectAction)
}
}


}

}


}
SuggestionsStatus.Error -> {
ListItem(
headlineContent = { Text(stringResource(id = R.string.error)) },
supportingContent = { Text(text = suggestions.info ?: "")},
leadingContent = { Icon(Icons.Filled.Warning, contentDescription = null)}
)
}
}


}


}

// OutlinedTextField(
Expand Down Expand Up @@ -750,3 +860,5 @@ fun FancyIndicator(color: Color, modifier: Modifier = Modifier) {
.border(BorderStroke(2.dp, color), RoundedCornerShape(5.dp))
)
}


Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class DictionarySearchViewModel: ViewModel() {
searchSuggestions = UniversalSuggestionsRepository.suggest(
query = searchInput, language = language, mode = searchMode)
}
}else{
searchSuggestions = SuggestionsResult(SuggestionsStatus.Standby)
}
}

Expand Down

0 comments on commit 1d283e3

Please sign in to comment.