@@ -21,6 +21,7 @@ import kotlinx.coroutines.flow.mapNotNull
2121import kotlinx.coroutines.flow.onEach
2222import xyz.flipchat.app.R
2323import xyz.flipchat.app.data.RoomInfo
24+ import xyz.flipchat.app.features.chat.conversation.ConversationViewModel.Event
2425import xyz.flipchat.app.features.login.register.onResult
2526import xyz.flipchat.app.util.IntentUtils
2627import xyz.flipchat.chat.RoomController
@@ -82,8 +83,9 @@ class ChatInfoViewModel @Inject constructor(
8283 data class OnJoiningStateChanged (val joining : Boolean , val joined : Boolean = false ) : Event
8384 data class OnBecameMember (val roomId : ID ) : Event
8485
85- data object CloseTemporarily : Event
86- data object Reopen : Event
86+ data object OnOpenStateChangedRequested : Event
87+ data class OnOpenRoom (val conversationId : ID ) : Event
88+ data class OnCloseRoom (val conversationId : ID ) : Event
8789
8890 data object LeaveRoom : Event
8991 data class OnLeavingStateChanged (val leaving : Boolean , val left : Boolean = false ) : Event
@@ -227,13 +229,78 @@ class ChatInfoViewModel @Inject constructor(
227229 }
228230 ).launchIn(viewModelScope)
229231
232+ eventFlow
233+ .filterIsInstance<Event .OnOpenStateChangedRequested >()
234+ .mapNotNull { stateFlow.value.roomInfo.id }
235+ .map { it to stateFlow.value.isOpen }
236+ .onEach { (conversationId, isOpen) ->
237+ confirmOpenStateChange(conversationId, isOpen)
238+ }
239+ .launchIn(viewModelScope)
240+
241+ eventFlow
242+ .filterIsInstance<Event .OnOpenRoom >()
243+ .map { it.conversationId }
244+ .map { roomController.enableChat(it) }
245+ .onResult(
246+ onError = {
247+ TopBarManager .showMessage(
248+ TopBarManager .TopBarMessage (
249+ resources.getString(R .string.error_title_failedToReopenRoom),
250+ resources.getString(R .string.error_description_failedToReopenRoom)
251+ )
252+ )
253+ },
254+ ).launchIn(viewModelScope)
255+
256+ eventFlow
257+ .filterIsInstance<Event .OnCloseRoom >()
258+ .map { it.conversationId }
259+ .map { roomController.disableChat(it) }
260+ .onResult(
261+ onError = {
262+ TopBarManager .showMessage(
263+ TopBarManager .TopBarMessage (
264+ resources.getString(R .string.error_title_failedToCloseRoom),
265+ resources.getString(R .string.error_description_failedToCloseRoom)
266+ )
267+ )
268+ },
269+ ).launchIn(viewModelScope)
270+
230271 eventFlow
231272 .filterIsInstance<Event .OnShareRoomClicked >()
232273 .map { IntentUtils .shareRoom(stateFlow.value.roomInfo.roomNumber) }
233274 .onEach { dispatchEvent(Event .ShareRoom (it)) }
234275 .launchIn(viewModelScope)
235276 }
236277
278+ private fun confirmOpenStateChange (conversationId : ID , isRoomOpen : Boolean ) {
279+ BottomBarManager .showMessage(
280+ BottomBarManager .BottomBarMessage (
281+ title = if (isRoomOpen) resources.getString(R .string.prompt_title_closeRoom) else resources.getString(
282+ R .string.prompt_title_reopenRoom
283+ ),
284+ subtitle = if (isRoomOpen) resources.getString(R .string.prompt_description_closeRoom) else resources.getString(
285+ R .string.prompt_description_reopenRoom
286+ ),
287+ positiveText = if (isRoomOpen) resources.getString(R .string.action_closeTemporarily) else resources.getString(
288+ R .string.action_reopenRoom
289+ ),
290+ tertiaryText = resources.getString(R .string.action_cancel),
291+ onPositive = {
292+ if (isRoomOpen) {
293+ dispatchEvent(Event .OnCloseRoom (conversationId))
294+ } else {
295+ dispatchEvent(Event .OnOpenRoom (conversationId))
296+ }
297+ },
298+ type = BottomBarManager .BottomBarMessageType .THEMED ,
299+ showScrim = true ,
300+ )
301+ )
302+ }
303+
237304 companion object {
238305 val updateStateForEvent: (Event ) -> ((State ) -> State ) = { event ->
239306 when (event) {
@@ -261,8 +328,9 @@ class ChatInfoViewModel @Inject constructor(
261328 is Event .ShareRoom ,
262329 is Event .OnListenToClicked ,
263330 is Event .OnBecameMember ,
264- is Event .CloseTemporarily ,
265- is Event .Reopen ,
331+ is Event .OnOpenStateChangedRequested ,
332+ is Event .OnCloseRoom ,
333+ is Event .OnOpenRoom ,
266334 Event .OnLeftRoom -> { state -> state }
267335
268336 is Event .OnHostStatusChanged -> { state -> state.copy(isHost = event.isHost) }
0 commit comments