Skip to content

Instantly share code, notes, and snippets.

View sergenes's full-sized avatar
🏠
Working from home

Sergey Neskoromny sergenes

🏠
Working from home
View GitHub Profile
fun addNewRow(runAfter: () -> Unit) {
onAction(ListScreenActions.OnAddNewRow, runAfter = runAfter)
}
fun editNewRow() { onAction(ListScreenActions.OnAddNewRowChanged) }
fun editName() { onAction(ListScreenActions.OnNameEdit) }
fun editNameChanged() { onAction(ListScreenActions.OnNameChanged)}
private fun onAction( action: ListScreenActions,
runBefore: () -> Unit = {},
runAfter: () -> Unit = {}
) {
if (state() == action.source) {
runBefore()
screenState.value = action.target
runAfter()
}
}
class ScreenModel {
private lateinit var screenState: MutableState<ListScreenState>
@Composable
fun Init(state: ListScreenState = Idle) {
screenState = remember {
mutableStateOf(state)
}
}
sealed class ListScreenActions(
val source: ListScreenState,
val target: ListScreenState
) {
object OnNameEdit : ListScreenActions(Idle, NameEdit)
object OnNameChanged : ListScreenActions(NameEdit, NameChanged)
object OnAddNewRow : ListScreenActions(Idle, RowNew)
object RowEditChanged : ListScreenState(RowEdit) {
override val editButtonTitle = "Save"
override val isAddButtonVisible = false
override val isTableVisible = false
}
object RowNewChanged : ListScreenState(RowNew) {
override val editButtonTitle = "Save"
override val isAddButtonVisible = false
override val isTableVisible = false
object RowEdit : ListScreenState() {
override val editButtonTitle = "Done"
override val isAddButtonVisible = false
override val isTableVisible = false
}
object RowNew : ListScreenState() {
override val editButtonTitle = "Done"
override val isAddButtonVisible = false
override val isTableVisible = false
object NameChanged : ListScreenState(NameEdit) {
override val editButtonTitle = "Save"
override val isAddButtonVisible = false
override val isEditNameMode = true
}
object NameEdit : ListScreenState() {
override val editButtonTitle = "Done"
override val isAddButtonVisible = false
override val isEditNameMode = true
}
@sergenes
sergenes / Code2FSMSealed.kt
Last active August 3, 2021 19:52
Code2 FSM Sealed Base class
sealed class ListScreenState(
val back: ListScreenState? = Idle
){
open val editButtonTitle = "Edit"
open val isAddButtonVisible = true
open val isEditNameMode = false
open val isTableVisible= true
object Idle : ListScreenState()