Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions app/src/main/java/com/codenames/frontend/ui/inputs/AppTextField.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ data class AppTextFieldKeyboard(
val actions: KeyboardActions = KeyboardActions.Default,
)

typealias InputFilter = (String) -> String

object InputFilters {
val NONE: InputFilter = { it }

val ALPHANUMERIC: InputFilter = {
it.filter { c -> c.isLetterOrDigit() || c.isWhitespace() }
}

val LOBBY_CODE: InputFilter = {
it
.filter { c -> c.isLetterOrDigit() }
.uppercase()
}

val DIGIT: InputFilter = {
it.filter { c -> c.isDigit() }
}
}

@Suppress("ktlint:standard:function-naming")
@Composable
fun AppTextField(
Expand All @@ -62,6 +82,7 @@ fun AppTextField(
state: AppTextFieldState = AppTextFieldState(),
style: AppTextFieldStyle = AppTextFieldStyle(),
keyboard: AppTextFieldKeyboard = AppTextFieldKeyboard(),
inputFilter: InputFilter = InputFilters.NONE,
) {
val resolvedContainerColor = resolveContainerColor(style.containerColor)
val resolvedContentColor = resolveContentColor(style.contentColor)
Expand All @@ -76,7 +97,10 @@ fun AppTextField(
AppTextFieldType.PRIMARY -> {
PrimaryAppTextField(
value = value,
onValueChange = onValueChange,
onValueChange = { newValue ->
val filtered = inputFilter.invoke(newValue)
onValueChange(filtered)
},
modifier = modifier,
state = state,
style = style,
Expand All @@ -90,7 +114,10 @@ fun AppTextField(
AppTextFieldType.SECONDARY -> {
SecondaryAppTextField(
value = value,
onValueChange = onValueChange,
onValueChange = { newValue ->
val filtered = inputFilter.invoke(newValue)
onValueChange(filtered)
},
modifier = modifier,
state = state,
style = style,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,14 @@ fun GameScreenWrapper(
navController.navigate(Screen.Settings.route)
},
onReturnToHome = {
navController.navigate(Screen.Start.route)
navController.navigate(Screen.Start.route) {
popUpTo(navController.graph.startDestinationId) {
inclusive = true
}
launchSingleTop = true
}
lobbyViewModel.cleanup()
chatViewModel.cleanup()
gameViewModel.resetGameState()
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ import com.codenames.frontend.ui.inputs.AppTextField
import com.codenames.frontend.ui.inputs.AppTextFieldKeyboard
import com.codenames.frontend.ui.inputs.AppTextFieldState
import com.codenames.frontend.ui.inputs.AppTextFieldStyle
import com.codenames.frontend.ui.inputs.InputFilters
import com.codenames.frontend.ui.roles.PlayerRoles
import com.codenames.frontend.ui.theme.AppBackground
import com.codenames.frontend.ui.theme.AppBlack
Expand Down Expand Up @@ -988,6 +989,7 @@ fun HintSection(
},
),
),
inputFilter = InputFilters.ALPHANUMERIC,
)

AppTextField(
Expand All @@ -1010,6 +1012,7 @@ fun HintSection(
keyboardType = KeyboardType.Number,
),
),
inputFilter = InputFilters.DIGIT,
)

AppSendButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import com.codenames.frontend.ui.inputs.AppTextFieldKeyboard
import com.codenames.frontend.ui.inputs.AppTextFieldState
import com.codenames.frontend.ui.inputs.AppTextFieldStyle
import com.codenames.frontend.ui.inputs.AppTextFieldType
import com.codenames.frontend.ui.inputs.InputFilters
import com.codenames.frontend.ui.navigation.Screen
import com.codenames.frontend.ui.theme.AppBackground
import com.codenames.frontend.ui.theme.AppInk
Expand Down Expand Up @@ -144,6 +145,7 @@ fun JoinlobbyScreen(
onDone = { submitJoin() },
),
),
inputFilter = InputFilters.LOBBY_CODE,
)

AppButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
Expand All @@ -30,6 +29,9 @@ import com.codenames.frontend.data.model.enums.ConnectionState
import com.codenames.frontend.ui.buttons.AppButton
import com.codenames.frontend.ui.buttons.AppButtonStyle
import com.codenames.frontend.ui.buttons.SettingsCornerButton
import com.codenames.frontend.ui.inputs.AppTextField
import com.codenames.frontend.ui.inputs.AppTextFieldState
import com.codenames.frontend.ui.inputs.InputFilters
import com.codenames.frontend.ui.navigation.Screen
import com.codenames.frontend.ui.roles.PlayerRoles
import com.codenames.frontend.ui.theme.AppBackground
Expand Down Expand Up @@ -105,11 +107,12 @@ fun UserNameScreen(
modifier = Modifier.padding(bottom = dimensions.sectionSpacing * 3),
)

TextField(
AppTextField(
value = username,
onValueChange = { username = it },
label = { Text("enter username") },
state = AppTextFieldState(label = "Enter username", placeholder = "user"),
modifier = Modifier.fillMaxWidth(if (dimensions.isNarrowWidth) 0.7f else 0.5f),
inputFilter = InputFilters.ALPHANUMERIC,
)

Spacer(modifier = Modifier.height(dimensions.itemSpacing))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,4 +212,15 @@ class ChatViewModel
private fun setError(error: Throwable) {
_errorMessage.value = ErrorMessageMapper.toUserMessage(error)
}

fun cleanup() {
viewModelScope.launch {
_errorMessage.update {
null
}
_chatState.update {
ChatLists()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test
import kotlin.collections.emptyList

@OptIn(ExperimentalCoroutinesApi::class)
class ChatViewModelTest {
Expand Down Expand Up @@ -338,4 +339,14 @@ class ChatViewModelTest {

assertNull(viewModel.errorMessage.value)
}

@Test
fun testClearChatState() =
runTest {
viewModel.cleanup()

assertEquals(emptyList<ChatDomainModel>(), viewModel.chatState.value.lobbyMessages)
assertEquals(emptyList<ChatDomainModel>(), viewModel.chatState.value.teamMessages)
assertEquals(emptyList<ChatDomainModel>(), viewModel.chatState.value.operativeMessages)
}
}
Loading