diff --git a/ts/components/basic/SessionRadioGroup.tsx b/ts/components/basic/SessionRadioGroup.tsx
index e9c50212c9..1d118e7fca 100644
--- a/ts/components/basic/SessionRadioGroup.tsx
+++ b/ts/components/basic/SessionRadioGroup.tsx
@@ -10,6 +10,7 @@ export type SessionRadioItems = Array<{
label: string;
inputDataTestId: SessionDataTestId;
labelDataTestId: SessionDataTestId;
+ disabled?: boolean;
}>;
interface Props {
@@ -50,6 +51,7 @@ export const SessionRadioGroup = (props: Props) => {
label={item.label}
active={itemIsActive}
value={item.value}
+ disabled={item.disabled}
inputDataTestId={item.inputDataTestId}
labelDataTestId={item.labelDataTestId}
inputName={group}
diff --git a/ts/components/conversation/header/ConversationHeaderSelectionOverlay.tsx b/ts/components/conversation/header/ConversationHeaderSelectionOverlay.tsx
index b5a695f6a5..d266be9a91 100644
--- a/ts/components/conversation/header/ConversationHeaderSelectionOverlay.tsx
+++ b/ts/components/conversation/header/ConversationHeaderSelectionOverlay.tsx
@@ -3,13 +3,9 @@ import { useSelector } from 'react-redux';
import useKey from 'react-use/lib/useKey';
import { getAppDispatch } from '../../../state/dispatch';
-import { deleteMessagesForX } from '../../../interactions/conversations/unsendingInteractions';
import { resetSelectedMessageIds } from '../../../state/ducks/conversations';
import { getSelectedMessageIds } from '../../../state/selectors/conversations';
-import {
- useSelectedConversationKey,
- useSelectedIsPublic,
-} from '../../../state/selectors/selectedConversation';
+import { useSelectedConversationKey } from '../../../state/selectors/selectedConversation';
import {
SessionButton,
SessionButtonColor,
@@ -21,11 +17,12 @@ import { tr } from '../../../localization/localeTools';
import { SessionLucideIconButton } from '../../icon/SessionIconButton';
import { LUCIDE_ICONS_UNICODE } from '../../icon/lucide';
import { isBackspace, isDeleteKey, isEscapeKey } from '../../../util/keyboardShortcuts';
+import { useDeleteMessagesCb } from '../../menuAndSettingsHooks/useDeleteMessagesCb';
export const SelectionOverlay = () => {
const selectedMessageIds = useSelector(getSelectedMessageIds);
const selectedConversationKey = useSelectedConversationKey();
- const isPublic = useSelectedIsPublic();
+ const deleteMessagesCb = useDeleteMessagesCb(selectedConversationKey);
const dispatch = getAppDispatch();
const ref = useRef(null);
@@ -51,8 +48,8 @@ export const SelectionOverlay = () => {
return true;
case 'Backspace':
case 'Delete':
- if (selectionMode && selectedConversationKey) {
- void deleteMessagesForX(selectedMessageIds, selectedConversationKey, isPublic);
+ if (selectionMode) {
+ void deleteMessagesCb?.(selectedMessageIds);
}
return true;
default:
@@ -61,12 +58,6 @@ export const SelectionOverlay = () => {
}
);
- // `enforceDeleteServerSide` should check for message statuses too, but when we have multiple selected,
- // some might be sent and some in an error state. We default to trying to delete all of them server side first,
- // which might fail. If that fails, the user will need to do a delete for all the ones sent already, and a manual delete
- // for each ones which is in an error state.
- const enforceDeleteServerSide = isPublic;
-
return (
ref.current}
@@ -97,13 +88,7 @@ export const SelectionOverlay = () => {
buttonType={SessionButtonType.Solid}
text={tr('delete')}
onClick={async () => {
- if (selectedConversationKey) {
- await deleteMessagesForX(
- selectedMessageIds,
- selectedConversationKey,
- enforceDeleteServerSide
- );
- }
+ void deleteMessagesCb?.(selectedMessageIds);
}}
/>
diff --git a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
index 4b83c69441..306466792d 100644
--- a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
+++ b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx
@@ -17,7 +17,6 @@ import {
replyToMessage,
resendMessage,
} from '../../../../../interactions/conversationInteractions';
-import { deleteMessagesById } from '../../../../../interactions/conversations/unsendingInteractions';
import {
useMessageAttachments,
useMessageBody,
@@ -55,6 +54,7 @@ import { tr } from '../../../../../localization/localeTools';
import { AppDispatch } from '../../../../../state/createStore';
import { useKeyboardShortcut } from '../../../../../hooks/useKeyboardShortcut';
import { KbdShortcut } from '../../../../../util/keyboardShortcuts';
+import { useDeleteMessagesCb } from '../../../../menuAndSettingsHooks/useDeleteMessagesCb';
// NOTE we override the default max-widths when in the detail isDetailView
const StyledMessageBody = styled.div`
@@ -295,6 +295,8 @@ export const OverlayMessageInfo = () => {
const messageId = useMessageId();
const messageInfo = useMessageInfo(messageId);
+ const selectedConversationKey = useSelectedConversationKey();
+ const deleteMessagesCb = useDeleteMessagesCb(selectedConversationKey);
const {
rightOverlayMode,
@@ -430,14 +432,14 @@ export const OverlayMessageInfo = () => {
/>
)}
{/* Deleting messages sends a "delete message" message so it must be disabled for message requests. */}
- {isDeletable && !isLegacyGroup && !isIncomingMessageRequest && (
+ {isDeletable && !isLegacyGroup && !isIncomingMessageRequest && deleteMessagesCb && (
}
color={'var(--danger-color)'}
dataTestId="delete-from-details"
onClick={() => {
- void deleteMessagesById([messageId], convoId);
+ void deleteMessagesCb?.(messageId);
}}
/>
)}
diff --git a/ts/components/menu/items/DeleteMessage/DeleteMessageMenuItem.tsx b/ts/components/menu/items/DeleteMessage/DeleteMessageMenuItem.tsx
index c89b921d4f..795197c517 100644
--- a/ts/components/menu/items/DeleteMessage/DeleteMessageMenuItem.tsx
+++ b/ts/components/menu/items/DeleteMessage/DeleteMessageMenuItem.tsx
@@ -2,21 +2,15 @@ import styled from 'styled-components';
import { isEmpty } from 'lodash';
import useUpdate from 'react-use/lib/useUpdate';
import useInterval from 'react-use/lib/useInterval';
-import {
- useMessageIsDeletable,
- useMessageIsDeletableForEveryone,
-} from '../../../../state/selectors';
-import {
- useSelectedConversationKey,
- useSelectedIsPublic,
-} from '../../../../state/selectors/selectedConversation';
+import { useMessageStatus } from '../../../../state/selectors';
+import { useSelectedConversationKey } from '../../../../state/selectors/selectedConversation';
import { MenuItem } from '../MenuItem';
import { tr } from '../../../../localization/localeTools';
import { LUCIDE_ICONS_UNICODE } from '../../../icon/lucide';
import { DURATION } from '../../../../session/constants';
import { formatAbbreviatedExpireDoubleTimer } from '../../../../util/i18n/formatting/expirationTimer';
import { useMessageExpirationPropsById } from '../../../../hooks/useParamSelector';
-import { useMessageInteractions } from '../../../../hooks/useMessageInteractions';
+import { useDeleteMessagesCb } from '../../../menuAndSettingsHooks/useDeleteMessagesCb';
const StyledDeleteItemContent = styled.span`
display: flex;
@@ -93,24 +87,34 @@ const ExpiresInItem = ({ messageId }: { messageId: string }) => {
return {formatTimeLeft({ timeLeftMs })};
};
-export const DeleteItem = ({ messageId }: { messageId: string }) => {
+function useDelete(messageId?: string) {
const convoId = useSelectedConversationKey();
- const isPublic = useSelectedIsPublic();
+ const messageStatus = useMessageStatus(messageId);
+ const deleteMessageCb = useDeleteMessagesCb(convoId);
+
+ console.warn('fixme allow ot delete a message to a sogs that failed to send via', messageStatus);
+ return deleteMessageCb
+ ? () => {
+ void deleteMessageCb?.(messageId);
+ }
+ : null;
+}
- const isDeletable = useMessageIsDeletable(messageId);
- const isDeletableForEveryone = useMessageIsDeletableForEveryone(messageId);
+export const DeleteItem = ({ messageId }: { messageId: string }) => {
+ const convoId = useSelectedConversationKey();
- const { deleteFromConvo } = useMessageInteractions(messageId);
- const onClick = () => {
- deleteFromConvo(isPublic, convoId);
- };
+ const deleteMessagesCb = useDelete(convoId);
- if (!convoId || (isPublic && !isDeletableForEveryone) || (!isPublic && !isDeletable)) {
+ if (!deleteMessagesCb) {
return null;
}
return (
-