Add app room state model

This commit is contained in:
Adam Brown 2023-01-25 19:44:19 +00:00
parent 8312c20d5d
commit 6a1d360036
6 changed files with 63 additions and 16 deletions

View File

@ -1,18 +1,18 @@
CREATE TABLE dbStRoomMeta (
CREATE TABLE dbAppRoom (
room_id TEXT NOT NULL,
is_bubble INTEGER AS Int NOT NULL DEFAULT 0,
PRIMARY KEY (room_id)
);
markBubble:
INSERT OR REPLACE INTO dbStRoomMeta(room_id, is_bubble)
INSERT OR REPLACE INTO dbAppRoom(room_id, is_bubble)
VALUES (?,?);
unmarkBubble:
INSERT OR REPLACE INTO dbStRoomMeta(room_id, is_bubble)
INSERT OR REPLACE INTO dbAppRoom(room_id, is_bubble)
VALUES (?,?);
select:
SELECT is_bubble
FROM dbStRoomMeta
FROM dbAppRoom
WHERE room_id = ?;

View File

@ -52,6 +52,8 @@ import app.dapk.st.matrix.common.RichText
import app.dapk.st.matrix.common.UserId
import app.dapk.st.messenger.gallery.ImageGalleryActivityPayload
import app.dapk.st.messenger.state.*
import app.dapk.st.messenger.state.ScreenAction.ChatBubble
import app.dapk.st.messenger.state.ScreenAction.MuteNotifications
import app.dapk.st.navigator.Navigator
import coil.compose.rememberAsyncImagePainter
import coil.request.ImageRequest
@ -115,8 +117,15 @@ internal fun MessengerScreen(
OverflowMenu {
BooleanOption(value = it.isMuted, trueText = "Unmute notifications", falseText = "Mute notifications") {
val action = when (it) {
true -> ScreenAction.Notifications.Unmute
false -> ScreenAction.Notifications.Unmute
true -> MuteNotifications.Unmute
false -> MuteNotifications.Mute
}
viewModel.dispatch(action)
}
BooleanOption(value = it.isMuted, trueText = "Disable bubble", falseText = "Enable bubble") {
val action = when (it) {
true -> ChatBubble.Disable
false -> ChatBubble.Enable
}
viewModel.dispatch(action)
}

View File

@ -12,9 +12,14 @@ sealed interface ScreenAction : Action {
object OpenGalleryPicker : ScreenAction
object LeaveRoom : ScreenAction
sealed interface Notifications : ScreenAction {
object Mute : Notifications
object Unmute : Notifications
sealed interface MuteNotifications : ScreenAction {
object Mute : MuteNotifications
object Unmute : MuteNotifications
}
sealed interface ChatBubble : ScreenAction {
object Enable: ChatBubble
object Disable: ChatBubble
}
sealed interface LeaveRoomConfirmation : ScreenAction {
@ -33,6 +38,7 @@ sealed interface ComponentLifecycle : Action {
sealed interface MessagesStateChange : Action {
data class Content(val content: MessengerPageState) : MessagesStateChange
data class MuteContent(val isMuted: Boolean) : MessagesStateChange
data class ChatBubbleContent(val isChatBubble: Boolean) : MessagesStateChange
}
sealed interface ComposerStateChange : Action {

View File

@ -38,6 +38,7 @@ internal fun messengerReducer(
composerState = initialComposerState(initialAttachments),
viewerState = null,
dialogState = null,
appRoomState = Lce.Loading(),
),
async(ComponentLifecycle::class) { action ->
@ -156,22 +157,46 @@ internal fun messengerReducer(
}
},
async(ScreenAction.Notifications::class) { action ->
async(ScreenAction.MuteNotifications::class) { action ->
when (action) {
ScreenAction.Notifications.Mute -> chatEngine.muteRoom(roomId)
ScreenAction.Notifications.Unmute -> chatEngine.unmuteRoom(roomId)
ScreenAction.MuteNotifications.Mute -> chatEngine.muteRoom(roomId)
ScreenAction.MuteNotifications.Unmute -> chatEngine.unmuteRoom(roomId)
}
dispatch(
MessagesStateChange.MuteContent(
isMuted = when (action) {
ScreenAction.Notifications.Mute -> true
ScreenAction.Notifications.Unmute -> false
ScreenAction.MuteNotifications.Mute -> true
ScreenAction.MuteNotifications.Unmute -> false
}
)
)
},
async(ScreenAction.ChatBubble::class) { action ->
when (action) {
ScreenAction.ChatBubble.Disable -> {}
ScreenAction.ChatBubble.Enable -> {}
}
dispatch(
MessagesStateChange.ChatBubbleContent(
isChatBubble = when (action) {
ScreenAction.ChatBubble.Enable -> true
ScreenAction.ChatBubble.Disable -> false
}
)
)
},
change(MessagesStateChange.ChatBubbleContent::class) { action, state ->
when (val appRoomState = state.appRoomState) {
is Lce.Content -> state.copy(appRoomState = appRoomState.copy(value = appRoomState.value.copy(isChatBubble = action.isChatBubble)))
is Lce.Error -> state
is Lce.Loading -> state
}
},
change(ScreenAction.UpdateDialogState::class) { action, state ->
state.copy(dialogState = action.dialogState)
},

View File

@ -17,6 +17,11 @@ data class MessengerScreenState(
val composerState: ComposerState,
val viewerState: ViewerState?,
val dialogState: DialogState?,
val appRoomState: Lce<AppRoomState>,
)
data class AppRoomState(
val isChatBubble: Boolean
)
data class ViewerState(

View File

@ -15,7 +15,6 @@ import fake.FakeChatEngine
import fake.FakeJobBag
import fake.FakeMessageOptionsStore
import fixture.*
import io.mockk.coEvery
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.flow.flowOf
@ -77,6 +76,7 @@ class MessengerReducerTest {
composerState = ComposerState.Text(value = "", reply = null),
viewerState = null,
dialogState = null,
appRoomState = Lce.Loading(),
)
)
}
@ -90,6 +90,7 @@ class MessengerReducerTest {
composerState = ComposerState.Text(value = "", reply = null),
viewerState = null,
dialogState = null,
appRoomState = Lce.Loading(),
)
)
}
@ -103,6 +104,7 @@ class MessengerReducerTest {
composerState = ComposerState.Attachments(listOf(A_MESSAGE_ATTACHMENT), reply = null),
viewerState = null,
dialogState = null,
appRoomState = Lce.Loading(),
)
)
}