Simplified deletion dialog to be reused for note to self and the rest as only the labels change

pull/1696/head
ThomasSession 7 months ago
parent 541c6221d6
commit cf344b7180

@ -19,6 +19,8 @@ import network.loki.messenger.R
import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.EMOJI_KEY import org.session.libsession.utilities.StringSubstitutionConstants.EMOJI_KEY
import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.* import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.*
import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.DeleteForEveryoneDialogData
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.DialogButtonModel import org.thoughtcrime.securesms.ui.DialogButtonModel
import org.thoughtcrime.securesms.ui.GetString import org.thoughtcrime.securesms.ui.GetString
@ -48,9 +50,10 @@ fun ConversationV2Dialogs(
) )
} }
// delete message(s) for everyone // delete message(s)
if(dialogsState.deleteEveryone != null){ if(dialogsState.deleteEveryone != null){
var deleteForEveryone by remember { mutableStateOf(dialogsState.deleteEveryone.defaultToEveryone)} val data = dialogsState.deleteEveryone
var deleteForEveryone by remember { mutableStateOf(data.defaultToEveryone)}
AlertDialog( AlertDialog(
onDismissRequest = { onDismissRequest = {
@ -59,17 +62,17 @@ fun ConversationV2Dialogs(
}, },
title = pluralStringResource( title = pluralStringResource(
R.plurals.deleteMessage, R.plurals.deleteMessage,
dialogsState.deleteEveryone.messages.size, data.messages.size,
dialogsState.deleteEveryone.messages.size data.messages.size
), ),
text = pluralStringResource( text = pluralStringResource(
R.plurals.deleteMessageConfirm, R.plurals.deleteMessageConfirm,
dialogsState.deleteEveryone.messages.size, data.messages.size,
dialogsState.deleteEveryone.messages.size data.messages.size
), ),
content = { content = {
// add warning text, if any // add warning text, if any
dialogsState.deleteEveryone.warning?.let { data.warning?.let {
Text( Text(
text = it, text = it,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
@ -103,9 +106,9 @@ fun ConversationV2Dialogs(
), ),
option = RadioOption( option = RadioOption(
value = Unit, value = Unit,
title = GetString(stringResource(R.string.deleteMessageEveryone)), title = GetString(data.deleteForEveryoneLabel),
selected = deleteForEveryone, selected = deleteForEveryone,
enabled = dialogsState.deleteEveryone.everyoneEnabled enabled = data.everyoneEnabled
) )
) { ) {
deleteForEveryone = true deleteForEveryone = true
@ -119,9 +122,9 @@ fun ConversationV2Dialogs(
// delete messages based on chosen option // delete messages based on chosen option
sendCommand( sendCommand(
if(deleteForEveryone) MarkAsDeletedForEveryone( if(deleteForEveryone) MarkAsDeletedForEveryone(
dialogsState.deleteEveryone.copy(defaultToEveryone = deleteForEveryone) data.copy(defaultToEveryone = deleteForEveryone)
) )
else MarkAsDeletedLocally(dialogsState.deleteEveryone.messages) else MarkAsDeletedLocally(data.messages)
) )
} }
), ),
@ -132,76 +135,6 @@ fun ConversationV2Dialogs(
) )
} }
// delete message(s) for all my devices
if(dialogsState.deleteAllDevices != null){
var deleteAllDevices by remember { mutableStateOf(dialogsState.deleteAllDevices.defaultToEveryone) }
AlertDialog(
onDismissRequest = {
// hide dialog
sendCommand(HideDeleteAllDevicesDialog)
},
title = pluralStringResource(
R.plurals.deleteMessage,
dialogsState.deleteAllDevices.messages.size,
dialogsState.deleteAllDevices.messages.size
),
text = pluralStringResource(
R.plurals.deleteMessageConfirm,
dialogsState.deleteAllDevices.messages.size,
dialogsState.deleteAllDevices.messages.size
),
content = {
TitledRadioButton(
contentPadding = PaddingValues(
horizontal = LocalDimensions.current.xxsSpacing,
vertical = 0.dp
),
option = RadioOption(
value = Unit,
title = GetString(stringResource(R.string.deleteMessageDeviceOnly)),
selected = !deleteAllDevices
)
) {
deleteAllDevices = false
}
TitledRadioButton(
contentPadding = PaddingValues(
horizontal = LocalDimensions.current.xxsSpacing,
vertical = 0.dp
),
option = RadioOption(
value = Unit,
title = GetString(stringResource(R.string.deleteMessageDevicesAll)),
selected = deleteAllDevices
)
) {
deleteAllDevices = true
}
},
buttons = listOf(
DialogButtonModel(
text = GetString(stringResource(id = R.string.delete)),
color = LocalColors.current.danger,
onClick = {
// delete messages based on chosen option
sendCommand(
if(deleteAllDevices) MarkAsDeletedForEveryone(
dialogsState.deleteAllDevices.copy(defaultToEveryone = deleteAllDevices)
)
else MarkAsDeletedLocally(dialogsState.deleteAllDevices.messages)
)
}
),
DialogButtonModel(
GetString(stringResource(R.string.cancel))
)
)
)
}
// Clear emoji // Clear emoji
if(dialogsState.clearAllEmoji != null){ if(dialogsState.clearAllEmoji != null){
AlertDialog( AlertDialog(

@ -245,12 +245,12 @@ class ConversationViewModel(
// hashes are required if wanting to delete messages from the 'storage server' // hashes are required if wanting to delete messages from the 'storage server'
// They are not required for communities OR if all messages are outgoing // They are not required for communities OR if all messages are outgoing
// also we can only delete deleted messages (marked as deleted) locally // also we can only delete deleted messages and control messages (marked as deleted) locally
val canDeleteForEveryone = messages.all{ !it.isDeleted && !it.isControlMessage } && ( val canDeleteForEveryone = messages.all{ !it.isDeleted && !it.isControlMessage } && (
messages.all { it.isOutgoing } || messages.all { it.isOutgoing } ||
conversationType == MessageType.COMMUNITY || conversationType == MessageType.COMMUNITY ||
messages.all { lokiMessageDb.getMessageServerHash(it.id, it.isMms) != null messages.all { lokiMessageDb.getMessageServerHash(it.id, it.isMms) != null }
}) )
// There are three types of dialogs for deletion: // There are three types of dialogs for deletion:
// 1- Delete on device only OR all devices - Used for Note to self // 1- Delete on device only OR all devices - Used for Note to self
@ -260,11 +260,16 @@ class ConversationViewModel(
// the conversation is a note to self // the conversation is a note to self
conversationType == MessageType.NOTE_TO_SELF -> { conversationType == MessageType.NOTE_TO_SELF -> {
_dialogsState.update { _dialogsState.update {
it.copy(deleteAllDevices = DeleteForEveryoneDialogData( it.copy(deleteEveryone = DeleteForEveryoneDialogData(
messages = messages, messages = messages,
defaultToEveryone = false, defaultToEveryone = false,
everyoneEnabled = true, everyoneEnabled = canDeleteForEveryone,
messageType = conversationType messageType = conversationType,
deleteForEveryoneLabel = application.getString(R.string.deleteMessageDevicesAll),
warning = if(canDeleteForEveryone) null else
application.resources.getQuantityString(
R.plurals.deleteMessageNoteToSelfWarning, messages.count(), messages.count()
)
) )
) )
} }
@ -278,6 +283,7 @@ class ConversationViewModel(
messages = messages, messages = messages,
defaultToEveryone = isAdmin.value, defaultToEveryone = isAdmin.value,
everyoneEnabled = true, everyoneEnabled = true,
deleteForEveryoneLabel = application.getString(R.string.deleteMessageEveryone),
messageType = conversationType messageType = conversationType
) )
) )
@ -293,6 +299,7 @@ class ConversationViewModel(
defaultToEveryone = false, defaultToEveryone = false,
everyoneEnabled = false, // disable 'delete for everyone' - can only delete locally in this case everyoneEnabled = false, // disable 'delete for everyone' - can only delete locally in this case
messageType = conversationType, messageType = conversationType,
deleteForEveryoneLabel = application.getString(R.string.deleteMessageEveryone),
warning = application.resources.getQuantityString( warning = application.resources.getQuantityString(
R.plurals.deleteMessageWarning, messages.count(), messages.count() R.plurals.deleteMessageWarning, messages.count(), messages.count()
) )
@ -548,7 +555,7 @@ class ConversationViewModel(
).show() ).show()
} }
_dialogsState.update { it.copy(deleteAllDevices = data) } _dialogsState.update { it.copy(deleteEveryone = data) }
} }
// hide loading indicator // hide loading indicator
@ -731,12 +738,6 @@ class ConversationViewModel(
} }
} }
is Commands.HideDeleteAllDevicesDialog -> {
_dialogsState.update {
it.copy(deleteAllDevices = null)
}
}
is Commands.MarkAsDeletedLocally -> { is Commands.MarkAsDeletedLocally -> {
// hide dialog first // hide dialog first
_dialogsState.update { _dialogsState.update {
@ -818,8 +819,7 @@ class ConversationViewModel(
data class DialogsState( data class DialogsState(
val openLinkDialogUrl: String? = null, val openLinkDialogUrl: String? = null,
val clearAllEmoji: ClearAllEmoji? = null, val clearAllEmoji: ClearAllEmoji? = null,
val deleteEveryone: DeleteForEveryoneDialogData? = null, val deleteEveryone: DeleteForEveryoneDialogData? = null
val deleteAllDevices: DeleteForEveryoneDialogData? = null,
) )
data class DeleteForEveryoneDialogData( data class DeleteForEveryoneDialogData(
@ -827,6 +827,7 @@ class ConversationViewModel(
val messageType: MessageType, val messageType: MessageType,
val defaultToEveryone: Boolean, val defaultToEveryone: Boolean,
val everyoneEnabled: Boolean, val everyoneEnabled: Boolean,
val deleteForEveryoneLabel: String,
val warning: String? = null val warning: String? = null
) )
@ -841,7 +842,6 @@ class ConversationViewModel(
data class ClearEmoji(val emoji:String, val messageId: MessageId) : Commands() data class ClearEmoji(val emoji:String, val messageId: MessageId) : Commands()
data object HideDeleteEveryoneDialog : Commands() data object HideDeleteEveryoneDialog : Commands()
data object HideDeleteAllDevicesDialog : Commands()
data object HideClearEmoji : Commands() data object HideClearEmoji : Commands()
data class MarkAsDeletedLocally(val messages: Set<MessageRecord>): Commands() data class MarkAsDeletedLocally(val messages: Set<MessageRecord>): Commands()

Loading…
Cancel
Save