@@ -5,6 +5,7 @@ package xyz.flipchat.app.features.chat.conversation
55import android.os.Parcelable
66import android.widget.Toast
77import androidx.activity.compose.BackHandler
8+ import androidx.compose.animation.AnimatedContent
89import androidx.compose.animation.AnimatedVisibility
910import androidx.compose.animation.core.Spring
1011import androidx.compose.animation.core.spring
@@ -14,6 +15,7 @@ import androidx.compose.animation.scaleIn
1415import androidx.compose.animation.scaleOut
1516import androidx.compose.animation.slideInVertically
1617import androidx.compose.animation.slideOutVertically
18+ import androidx.compose.animation.togetherWith
1719import androidx.compose.foundation.ExperimentalFoundationApi
1820import androidx.compose.foundation.background
1921import androidx.compose.foundation.clickable
@@ -32,13 +34,15 @@ import androidx.compose.material.Divider
3234import androidx.compose.material.Text
3335import androidx.compose.runtime.Composable
3436import androidx.compose.runtime.LaunchedEffect
37+ import androidx.compose.runtime.SideEffect
3538import androidx.compose.runtime.collectAsState
3639import androidx.compose.runtime.getValue
3740import androidx.compose.ui.Alignment
3841import androidx.compose.ui.Modifier
3942import androidx.compose.ui.graphics.Color
4043import androidx.compose.ui.platform.LocalContext
4144import androidx.compose.ui.res.stringResource
45+ import androidx.compose.ui.text.style.TextAlign
4246import androidx.compose.ui.util.fastForEachIndexed
4347import androidx.lifecycle.Lifecycle
4448import androidx.paging.compose.LazyPagingItems
@@ -67,7 +71,9 @@ import com.getcode.ui.components.chat.messagecontents.MessageControlAction
6771import com.getcode.ui.components.chat.utils.ChatItem
6872import com.getcode.ui.components.chat.utils.HandleMessageChanges
6973import com.getcode.ui.theme.CodeScaffold
74+ import com.getcode.ui.utils.withTopBorder
7075import com.getcode.util.formatDateRelatively
76+ import com.google.accompanist.systemuicontroller.rememberSystemUiController
7177import kotlinx.coroutines.flow.filterIsInstance
7278import kotlinx.coroutines.flow.launchIn
7379import kotlinx.coroutines.flow.onEach
@@ -97,10 +103,12 @@ data class ConversationScreen(
97103 Lifecycle .Event .ON_RESUME -> {
98104 vm.dispatchEvent(ConversationViewModel .Event .ReopenStream )
99105 }
106+
100107 Lifecycle .Event .ON_STOP ,
101108 Lifecycle .Event .ON_DESTROY -> {
102109 vm.dispatchEvent(ConversationViewModel .Event .CloseStream )
103110 }
111+
104112 else -> Unit
105113 }
106114 }
@@ -207,12 +215,12 @@ private fun ConversationScreenContent(
207215 messages : LazyPagingItems <ChatItem >,
208216 dispatchEvent : (ConversationViewModel .Event ) -> Unit ,
209217) {
218+ val systemUiController = rememberSystemUiController()
210219 CodeScaffold (
211220 bottomBar = {
212221 Column (
213222 modifier = Modifier
214- .imePadding()
215- .navigationBarsPadding(),
223+ .imePadding(),
216224 verticalArrangement = Arrangement .spacedBy(CodeTheme .dimens.grid.x3),
217225 ) {
218226 AnimatedVisibility (
@@ -230,12 +238,53 @@ private fun ConversationScreenContent(
230238 .padding(horizontal = CodeTheme .dimens.grid.x2)
231239 )
232240 }
233- ChatInput (
234- state = state.textFieldState,
235- sendCashEnabled = false ,
236- onSendMessage = { dispatchEvent(ConversationViewModel .Event .SendMessage ) },
237- onSendCash = { dispatchEvent(ConversationViewModel .Event .SendCash ) }
238- )
241+
242+ AnimatedContent (
243+ targetState = state.chattableState,
244+ transitionSpec = {
245+ (slideInVertically(
246+ animationSpec = spring(
247+ dampingRatio = Spring .DampingRatioMediumBouncy ,
248+ stiffness = Spring .StiffnessLow
249+ )
250+ ) { it } + scaleIn() + fadeIn()).togetherWith(
251+ fadeOut() + scaleOut() + slideOutVertically { it }
252+ )
253+ },
254+ label = " chat input area"
255+ ) {
256+ when (it) {
257+ ChattableState .DisabledByMute -> {
258+ Text (
259+ modifier = Modifier
260+ .fillMaxWidth()
261+ .background(CodeTheme .colors.secondary)
262+ .withTopBorder(color = CodeTheme .colors.dividerVariant)
263+ .padding(
264+ top = CodeTheme .dimens.grid.x1,
265+ bottom = CodeTheme .dimens.grid.x3
266+ ).navigationBarsPadding(),
267+ textAlign = TextAlign .Center ,
268+ text = stringResource(R .string.title_youHaveBeenMuted),
269+ style = CodeTheme .typography.textSmall,
270+ color = CodeTheme .colors.textSecondary
271+ )
272+ }
273+
274+ ChattableState .Enabled -> {
275+ ChatInput (
276+ modifier = Modifier .navigationBarsPadding(),
277+ state = state.textFieldState,
278+ sendCashEnabled = false ,
279+ onSendMessage = { dispatchEvent(ConversationViewModel .Event .SendMessage ) },
280+ onSendCash = { dispatchEvent(ConversationViewModel .Event .SendCash ) }
281+ )
282+ }
283+
284+ ChattableState .Unknown -> Unit
285+ }
286+
287+ }
239288 }
240289 }
241290 ) { padding ->
@@ -287,8 +336,16 @@ private data class MessageActionContextSheet(val actions: List<MessageControlAct
287336 text = when (action) {
288337 is MessageControlAction .Copy -> stringResource(R .string.action_copyMessage)
289338 is MessageControlAction .Delete -> stringResource(R .string.action_deleteMessage)
290- is MessageControlAction .RemoveUser -> stringResource(R .string.action_removeUser, action.name)
339+ is MessageControlAction .RemoveUser -> stringResource(
340+ R .string.action_removeUser,
341+ action.name
342+ )
343+
291344 is MessageControlAction .ReportUserForMessage -> stringResource(R .string.action_report)
345+ is MessageControlAction .MuteUser -> stringResource(
346+ R .string.action_muteUser,
347+ action.name
348+ )
292349 },
293350 style = CodeTheme .typography.textMedium,
294351 modifier = Modifier
0 commit comments