Do not allow caption on audio files.
Regular files are not previewed, but prevent caption as well there.
This commit is contained in:
parent
b8afe8afa5
commit
b92f21fb75
5 changed files with 93 additions and 78 deletions
|
|
@ -9,6 +9,9 @@ package io.element.android.features.messages.impl.attachments.preview
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import io.element.android.features.messages.impl.attachments.Attachment
|
import io.element.android.features.messages.impl.attachments.Attachment
|
||||||
|
import io.element.android.libraries.core.bool.orFalse
|
||||||
|
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage
|
||||||
|
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo
|
||||||
import io.element.android.libraries.textcomposer.model.TextEditorState
|
import io.element.android.libraries.textcomposer.model.TextEditorState
|
||||||
|
|
||||||
data class AttachmentsPreviewState(
|
data class AttachmentsPreviewState(
|
||||||
|
|
@ -16,7 +19,11 @@ data class AttachmentsPreviewState(
|
||||||
val sendActionState: SendActionState,
|
val sendActionState: SendActionState,
|
||||||
val textEditorState: TextEditorState,
|
val textEditorState: TextEditorState,
|
||||||
val eventSink: (AttachmentsPreviewEvents) -> Unit
|
val eventSink: (AttachmentsPreviewEvents) -> Unit
|
||||||
)
|
) {
|
||||||
|
val allowCaption: Boolean = (attachment as? Attachment.Media)?.localMedia?.info?.mimeType?.let {
|
||||||
|
it.isMimeTypeImage() || it.isMimeTypeVideo()
|
||||||
|
}.orFalse()
|
||||||
|
}
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
sealed interface SendActionState {
|
sealed interface SendActionState {
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,7 @@ private fun AttachmentsPreviewBottomActions(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
state = state.textEditorState,
|
state = state.textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
composerMode = MessageComposerMode.Caption,
|
composerMode = MessageComposerMode.Attachment(state.allowCaption),
|
||||||
onRequestFocus = {},
|
onRequestFocus = {},
|
||||||
onSendMessage = onSendClick,
|
onSendMessage = onSendClick,
|
||||||
showTextFormatting = false,
|
showTextFormatting = false,
|
||||||
|
|
|
||||||
|
|
@ -436,7 +436,7 @@ class MessageComposerPresenter @Inject constructor(
|
||||||
// Reset composer right away
|
// Reset composer right away
|
||||||
resetComposer(markdownTextEditorState, richTextEditorState, fromEdit = capturedMode is MessageComposerMode.Edit)
|
resetComposer(markdownTextEditorState, richTextEditorState, fromEdit = capturedMode is MessageComposerMode.Edit)
|
||||||
when (capturedMode) {
|
when (capturedMode) {
|
||||||
is MessageComposerMode.Caption,
|
is MessageComposerMode.Attachment,
|
||||||
is MessageComposerMode.Normal -> room.sendMessage(
|
is MessageComposerMode.Normal -> room.sendMessage(
|
||||||
body = message.markdown,
|
body = message.markdown,
|
||||||
htmlBody = message.html,
|
htmlBody = message.html,
|
||||||
|
|
@ -606,7 +606,7 @@ class MessageComposerPresenter @Inject constructor(
|
||||||
): ComposerDraft? {
|
): ComposerDraft? {
|
||||||
val message = currentComposerMessage(markdownTextEditorState, richTextEditorState, withMentions = false)
|
val message = currentComposerMessage(markdownTextEditorState, richTextEditorState, withMentions = false)
|
||||||
val draftType = when (val mode = messageComposerContext.composerMode) {
|
val draftType = when (val mode = messageComposerContext.composerMode) {
|
||||||
is MessageComposerMode.Caption,
|
is MessageComposerMode.Attachment,
|
||||||
is MessageComposerMode.Normal -> ComposerDraftType.NewMessage
|
is MessageComposerMode.Normal -> ComposerDraftType.NewMessage
|
||||||
is MessageComposerMode.Edit -> {
|
is MessageComposerMode.Edit -> {
|
||||||
mode.eventOrTransactionId.eventId?.let { eventId -> ComposerDraftType.Edit(eventId) }
|
mode.eventOrTransactionId.eventId?.let { eventId -> ComposerDraftType.Edit(eventId) }
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ import io.element.android.wysiwyg.compose.RichTextEditorState
|
||||||
import io.element.android.wysiwyg.display.TextDisplay
|
import io.element.android.wysiwyg.display.TextDisplay
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
import uniffi.wysiwyg_composer.MenuAction
|
import uniffi.wysiwyg_composer.MenuAction
|
||||||
import kotlin.time.Duration.Companion.seconds
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
|
|
@ -120,12 +121,12 @@ fun TextComposer(
|
||||||
}
|
}
|
||||||
|
|
||||||
val layoutModifier = modifier
|
val layoutModifier = modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.height(IntrinsicSize.Min)
|
.height(IntrinsicSize.Min)
|
||||||
|
|
||||||
val composerOptionsButton: @Composable () -> Unit = remember {
|
val composerOptionsButton: @Composable () -> Unit = remember {
|
||||||
@Composable {
|
@Composable {
|
||||||
if (composerMode == MessageComposerMode.Caption) {
|
if (composerMode is MessageComposerMode.Attachment) {
|
||||||
Spacer(modifier = Modifier.width(9.dp))
|
Spacer(modifier = Modifier.width(9.dp))
|
||||||
} else {
|
} else {
|
||||||
ComposerOptionsButton(
|
ComposerOptionsButton(
|
||||||
|
|
@ -139,54 +140,60 @@ fun TextComposer(
|
||||||
|
|
||||||
val placeholder = if (composerMode.inThread) {
|
val placeholder = if (composerMode.inThread) {
|
||||||
stringResource(id = CommonStrings.action_reply_in_thread)
|
stringResource(id = CommonStrings.action_reply_in_thread)
|
||||||
} else if (composerMode == MessageComposerMode.Caption) {
|
} else if (composerMode is MessageComposerMode.Attachment) {
|
||||||
stringResource(id = R.string.rich_text_editor_composer_caption_placeholder)
|
stringResource(id = R.string.rich_text_editor_composer_caption_placeholder)
|
||||||
} else {
|
} else {
|
||||||
stringResource(id = R.string.rich_text_editor_composer_placeholder)
|
stringResource(id = R.string.rich_text_editor_composer_placeholder)
|
||||||
}
|
}
|
||||||
val textInput: @Composable () -> Unit = when (state) {
|
val textInput: @Composable () -> Unit = if ((composerMode as? MessageComposerMode.Attachment)?.allowCaption == false) {
|
||||||
is TextEditorState.Rich -> {
|
{
|
||||||
remember(state.richTextEditorState, subcomposing, composerMode, onResetComposerMode, onError) {
|
// No text input when in attachment mode and caption not allowed.
|
||||||
@Composable {
|
}
|
||||||
TextInput(
|
} else {
|
||||||
state = state.richTextEditorState,
|
when (state) {
|
||||||
subcomposing = subcomposing,
|
is TextEditorState.Rich -> {
|
||||||
placeholder = placeholder,
|
remember(state.richTextEditorState, subcomposing, composerMode, onResetComposerMode, onError) {
|
||||||
composerMode = composerMode,
|
@Composable {
|
||||||
onResetComposerMode = onResetComposerMode,
|
TextInput(
|
||||||
resolveMentionDisplay = resolveMentionDisplay,
|
state = state.richTextEditorState,
|
||||||
resolveRoomMentionDisplay = { resolveMentionDisplay("@room", "#") },
|
subcomposing = subcomposing,
|
||||||
onError = onError,
|
placeholder = placeholder,
|
||||||
onTyping = onTyping,
|
composerMode = composerMode,
|
||||||
onSelectRichContent = onSelectRichContent,
|
onResetComposerMode = onResetComposerMode,
|
||||||
)
|
resolveMentionDisplay = resolveMentionDisplay,
|
||||||
|
resolveRoomMentionDisplay = { resolveMentionDisplay("@room", "#") },
|
||||||
|
onError = onError,
|
||||||
|
onTyping = onTyping,
|
||||||
|
onSelectRichContent = onSelectRichContent,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
is TextEditorState.Markdown -> {
|
||||||
is TextEditorState.Markdown -> {
|
@Composable {
|
||||||
@Composable {
|
val style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus())
|
||||||
val style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus())
|
TextInputBox(
|
||||||
TextInputBox(
|
composerMode = composerMode,
|
||||||
composerMode = composerMode,
|
onResetComposerMode = onResetComposerMode,
|
||||||
onResetComposerMode = onResetComposerMode,
|
placeholder = placeholder,
|
||||||
placeholder = placeholder,
|
showPlaceholder = { state.state.text.value().isEmpty() },
|
||||||
showPlaceholder = { state.state.text.value().isEmpty() },
|
|
||||||
subcomposing = subcomposing,
|
|
||||||
) {
|
|
||||||
MarkdownTextInput(
|
|
||||||
state = state.state,
|
|
||||||
subcomposing = subcomposing,
|
subcomposing = subcomposing,
|
||||||
onTyping = onTyping,
|
) {
|
||||||
onReceiveSuggestion = onReceiveSuggestion,
|
MarkdownTextInput(
|
||||||
richTextEditorStyle = style,
|
state = state.state,
|
||||||
onSelectRichContent = onSelectRichContent,
|
subcomposing = subcomposing,
|
||||||
)
|
onTyping = onTyping,
|
||||||
|
onReceiveSuggestion = onReceiveSuggestion,
|
||||||
|
richTextEditorStyle = style,
|
||||||
|
onSelectRichContent = onSelectRichContent,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val canSendMessage = markdown.isNotBlank() || composerMode == MessageComposerMode.Caption
|
val canSendMessage = markdown.isNotBlank() || composerMode is MessageComposerMode.Attachment
|
||||||
val sendButton = @Composable {
|
val sendButton = @Composable {
|
||||||
SendButton(
|
SendButton(
|
||||||
canSendMessage = canSendMessage,
|
canSendMessage = canSendMessage,
|
||||||
|
|
@ -324,8 +331,8 @@ private fun StandardLayout(
|
||||||
if (voiceMessageState is VoiceMessageState.Preview || voiceMessageState is VoiceMessageState.Recording) {
|
if (voiceMessageState is VoiceMessageState.Preview || voiceMessageState is VoiceMessageState.Recording) {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(bottom = 5.dp, top = 5.dp, end = 3.dp, start = 3.dp)
|
.padding(bottom = 5.dp, top = 5.dp, end = 3.dp, start = 3.dp)
|
||||||
.size(48.dp),
|
.size(48.dp),
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
voiceDeleteButton()
|
voiceDeleteButton()
|
||||||
|
|
@ -335,8 +342,8 @@ private fun StandardLayout(
|
||||||
}
|
}
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(bottom = 8.dp, top = 8.dp)
|
.padding(bottom = 8.dp, top = 8.dp)
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
) {
|
) {
|
||||||
voiceRecording()
|
voiceRecording()
|
||||||
}
|
}
|
||||||
|
|
@ -349,16 +356,16 @@ private fun StandardLayout(
|
||||||
}
|
}
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(bottom = 8.dp, top = 8.dp)
|
.padding(bottom = 8.dp, top = 8.dp)
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
) {
|
) {
|
||||||
textInput()
|
textInput()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Box(
|
Box(
|
||||||
Modifier
|
Modifier
|
||||||
.padding(bottom = 5.dp, top = 5.dp, end = 6.dp, start = 6.dp)
|
.padding(bottom = 5.dp, top = 5.dp, end = 6.dp, start = 6.dp)
|
||||||
.size(48.dp),
|
.size(48.dp),
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
endButton()
|
endButton()
|
||||||
|
|
@ -380,8 +387,8 @@ private fun TextFormattingLayout(
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
.padding(horizontal = 12.dp)
|
.padding(horizontal = 12.dp)
|
||||||
) {
|
) {
|
||||||
textInput()
|
textInput()
|
||||||
}
|
}
|
||||||
|
|
@ -425,11 +432,11 @@ private fun TextInputBox(
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(roundedCorners)
|
.clip(roundedCorners)
|
||||||
.border(0.5.dp, borderColor, roundedCorners)
|
.border(0.5.dp, borderColor, roundedCorners)
|
||||||
.background(color = bgColor)
|
.background(color = bgColor)
|
||||||
.requiredHeightIn(min = 42.dp)
|
.requiredHeightIn(min = 42.dp)
|
||||||
.fillMaxSize(),
|
.fillMaxSize(),
|
||||||
) {
|
) {
|
||||||
if (composerMode is MessageComposerMode.Special) {
|
if (composerMode is MessageComposerMode.Special) {
|
||||||
ComposerModeView(
|
ComposerModeView(
|
||||||
|
|
@ -440,9 +447,9 @@ private fun TextInputBox(
|
||||||
val defaultTypography = ElementTheme.typography.fontBodyLgRegular
|
val defaultTypography = ElementTheme.typography.fontBodyLgRegular
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(top = 4.dp, bottom = 4.dp, start = 12.dp, end = 12.dp)
|
.padding(top = 4.dp, bottom = 4.dp, start = 12.dp, end = 12.dp)
|
||||||
// Apply test tag only once, otherwise 2 nodes will have it (both the normal and subcomposing one) and tests will fail
|
// Apply test tag only once, otherwise 2 nodes will have it (both the normal and subcomposing one) and tests will fail
|
||||||
.then(if (!subcomposing) Modifier.testTag(TestTags.textEditor) else Modifier),
|
.then(if (!subcomposing) Modifier.testTag(TestTags.textEditor) else Modifier),
|
||||||
contentAlignment = Alignment.CenterStart,
|
contentAlignment = Alignment.CenterStart,
|
||||||
) {
|
) {
|
||||||
// Placeholder
|
// Placeholder
|
||||||
|
|
@ -488,8 +495,8 @@ private fun TextInput(
|
||||||
// This prevents it gaining focus and mutating the state.
|
// This prevents it gaining focus and mutating the state.
|
||||||
registerStateUpdates = !subcomposing,
|
registerStateUpdates = !subcomposing,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(top = 6.dp, bottom = 6.dp)
|
.padding(top = 6.dp, bottom = 6.dp)
|
||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus),
|
style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus),
|
||||||
resolveMentionDisplay = resolveMentionDisplay,
|
resolveMentionDisplay = resolveMentionDisplay,
|
||||||
resolveRoomMentionDisplay = resolveRoomMentionDisplay,
|
resolveRoomMentionDisplay = resolveRoomMentionDisplay,
|
||||||
|
|
@ -525,7 +532,7 @@ private fun aTextEditorStateRichList() = persistentListOf(
|
||||||
internal fun TextComposerSimplePreview() = ElementPreview {
|
internal fun TextComposerSimplePreview() = ElementPreview {
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateMarkdownList()
|
items = aTextEditorStateMarkdownList()
|
||||||
) { textEditorState ->
|
) { _, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
|
|
@ -540,7 +547,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
|
||||||
internal fun TextComposerFormattingPreview() = ElementPreview {
|
internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateRichList()
|
items = aTextEditorStateRichList()
|
||||||
) { textEditorState ->
|
) { _, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
|
|
@ -556,7 +563,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
internal fun TextComposerEditPreview() = ElementPreview {
|
internal fun TextComposerEditPreview() = ElementPreview {
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateRichList()
|
items = aTextEditorStateRichList()
|
||||||
) { textEditorState ->
|
) { _, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
|
|
@ -571,7 +578,7 @@ internal fun TextComposerEditPreview() = ElementPreview {
|
||||||
internal fun MarkdownTextComposerEditPreview() = ElementPreview {
|
internal fun MarkdownTextComposerEditPreview() = ElementPreview {
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateMarkdownList()
|
items = aTextEditorStateMarkdownList()
|
||||||
) { textEditorState ->
|
) { _, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
|
|
@ -586,7 +593,7 @@ internal fun MarkdownTextComposerEditPreview() = ElementPreview {
|
||||||
internal fun TextComposerReplyPreview(@PreviewParameter(InReplyToDetailsProvider::class) inReplyToDetails: InReplyToDetails) = ElementPreview {
|
internal fun TextComposerReplyPreview(@PreviewParameter(InReplyToDetailsProvider::class) inReplyToDetails: InReplyToDetails) = ElementPreview {
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateRichList()
|
items = aTextEditorStateRichList()
|
||||||
) { textEditorState ->
|
) { _, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
|
|
@ -601,13 +608,14 @@ internal fun TextComposerReplyPreview(@PreviewParameter(InReplyToDetailsProvider
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TextComposerCaptionPreview() = ElementPreview {
|
internal fun TextComposerCaptionPreview() = ElementPreview {
|
||||||
|
val list = aTextEditorStateMarkdownList()
|
||||||
PreviewColumn(
|
PreviewColumn(
|
||||||
items = aTextEditorStateMarkdownList()
|
items = (list + aTextEditorStateMarkdown(initialText = "NO_CAPTION", initialFocus = true)).toPersistentList()
|
||||||
) { textEditorState ->
|
) { index, textEditorState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = textEditorState,
|
state = textEditorState,
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
composerMode = MessageComposerMode.Caption,
|
composerMode = MessageComposerMode.Attachment(allowCaption = index < list.size),
|
||||||
enableVoiceMessages = false,
|
enableVoiceMessages = false,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -644,7 +652,7 @@ internal fun TextComposerVoicePreview() = ElementPreview {
|
||||||
playbackProgress = 0.0f
|
playbackProgress = 0.0f
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
) { voiceMessageState ->
|
) { _, voiceMessageState ->
|
||||||
ATextComposer(
|
ATextComposer(
|
||||||
state = aTextEditorStateRich(initialFocus = true),
|
state = aTextEditorStateRich(initialFocus = true),
|
||||||
voiceMessageState = voiceMessageState,
|
voiceMessageState = voiceMessageState,
|
||||||
|
|
@ -657,14 +665,14 @@ internal fun TextComposerVoicePreview() = ElementPreview {
|
||||||
@Composable
|
@Composable
|
||||||
private fun <T> PreviewColumn(
|
private fun <T> PreviewColumn(
|
||||||
items: ImmutableList<T>,
|
items: ImmutableList<T>,
|
||||||
view: @Composable (T) -> Unit,
|
view: @Composable (Int, T) -> Unit,
|
||||||
) {
|
) {
|
||||||
Column {
|
Column {
|
||||||
items.forEach { item ->
|
items.forEachIndexed { index, item ->
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.height(IntrinsicSize.Min)
|
modifier = Modifier.height(IntrinsicSize.Min)
|
||||||
) {
|
) {
|
||||||
view(item)
|
view(index, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import io.element.android.libraries.matrix.ui.messages.reply.eventId
|
||||||
sealed interface MessageComposerMode {
|
sealed interface MessageComposerMode {
|
||||||
data object Normal : MessageComposerMode
|
data object Normal : MessageComposerMode
|
||||||
|
|
||||||
data object Caption : MessageComposerMode
|
data class Attachment(val allowCaption: Boolean) : MessageComposerMode
|
||||||
|
|
||||||
sealed interface Special : MessageComposerMode
|
sealed interface Special : MessageComposerMode
|
||||||
|
|
||||||
|
|
@ -37,7 +37,7 @@ sealed interface MessageComposerMode {
|
||||||
val relatedEventId: EventId?
|
val relatedEventId: EventId?
|
||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
is Normal,
|
is Normal,
|
||||||
is Caption -> null
|
is Attachment -> null
|
||||||
is Edit -> eventOrTransactionId.eventId
|
is Edit -> eventOrTransactionId.eventId
|
||||||
is Reply -> eventId
|
is Reply -> eventId
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue