Skip to content

Commit

Permalink
Add user feedback messages as toast (fixes #1 #10)
Browse files Browse the repository at this point in the history
Animations of grid will be addressed by #2
  • Loading branch information
opatry committed Jan 9, 2022
1 parent 4d21be4 commit 644c972
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ class WordleViewModel(private var rules: WordleRules) {
private set
var alphabet by mutableStateOf(emptyMap<Char, AnswerFlag>())

private val _userFeedback = mutableListOf<String>()
var userFeedback by mutableStateOf(_userFeedback.toList())
private set

init {
updateGrid()
updateAlphabet()
Expand Down Expand Up @@ -139,25 +143,38 @@ class WordleViewModel(private var rules: WordleRules) {
updateAlphabet()
}
InputState.NOT_IN_DICTIONARY -> {
// TODO send an EVENT to indicate the error cause (to display a Toast)
_userFeedback.add("Not in word list")
userFeedback = _userFeedback.toList()
updateGrid()
}
InputState.TOO_SHORT -> {
// TODO send an EVENT to indicate the error cause (to display a Toast)
_userFeedback.add("Not enough letters")
userFeedback = _userFeedback.toList()
updateGrid()
}
else -> Unit
}
victory = rules.state is State.Won
if (victory) {
_userFeedback.add("Genius")
userFeedback = _userFeedback.toList()
}
updateAnswer()
}

fun restart() {
rules = WordleRules(rules.words)
victory = rules.state is State.Won
userInput = ""
_userFeedback.clear()
userFeedback = _userFeedback.toList()
updateGrid()
updateAlphabet()
updateAnswer()
}

fun consumed(message: String) {
_userFeedback.remove(message)
userFeedback = _userFeedback.toList()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,21 @@ import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.loadXmlImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay
import net.opatry.game.wordle.ui.compose.component.Alphabet
import net.opatry.game.wordle.ui.compose.component.PopupOverlay
import net.opatry.game.wordle.ui.compose.component.WordleGrid
import net.opatry.game.wordle.ui.compose.theme.colorTone1
import net.opatry.game.wordle.ui.compose.theme.colorTone7
import org.xml.sax.InputSource

@ExperimentalAnimationApi
@ExperimentalComposeUiApi
@Composable
fun GameScreen(viewModel: WordleViewModel) {
val userFeedback by rememberUpdatedState(viewModel.userFeedback)
val userInput by rememberUpdatedState(viewModel.userInput)
var showHowTo by remember { mutableStateOf(false) }
var showSettings by remember { mutableStateOf(false) }
Expand Down Expand Up @@ -143,6 +148,14 @@ fun GameScreen(viewModel: WordleViewModel) {
Alphabet(viewModel.alphabet)
}

Column(Modifier.padding(top = 80.dp)) {
userFeedback.forEach { message ->
Toast(message, Modifier.padding(bottom = 4.dp)) {
viewModel.consumed(message)
}
}
}

AnimatedVisibility(
showHowTo,
enter = fadeIn() + slideInVertically(),
Expand Down Expand Up @@ -179,6 +192,33 @@ fun GameScreen(viewModel: WordleViewModel) {
}
}

@Composable
fun Toast(label: String, modifier: Modifier = Modifier, onDismiss: (String) -> Unit) {
var visible by remember { mutableStateOf(true) }
LaunchedEffect(label) {
delay(1000)
visible = false
delay(300)
onDismiss(label)
}

AnimatedVisibility(
visible,
enter = fadeIn(),
exit = fadeOut()
) {
Text(
label,
modifier
.clip(RoundedCornerShape(4.dp))
.background(colorTone1)
.padding(8.dp),
color = colorTone7,
style = MaterialTheme.typography.body1.copy(fontWeight = FontWeight.Bold)
)
}
}

@Composable
fun Toolbar(enabled: Boolean, onHowToClick: () -> Unit, onSettingsClick: () -> Unit) {
val density = LocalDensity.current
Expand Down

0 comments on commit 644c972

Please sign in to comment.