mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-17 23:34:14 +01:00
Add debug message option to MessageContextMenu
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
This commit is contained in:
@@ -73,6 +73,7 @@ export const CallingNotification: React.FC<PropsType> = React.memo(
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
shouldShowAdditional={false}
|
shouldShowAdditional={false}
|
||||||
|
onDebugMessage={null}
|
||||||
onDownload={null}
|
onDownload={null}
|
||||||
onEdit={null}
|
onEdit={null}
|
||||||
onReplyToMessage={null}
|
onReplyToMessage={null}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
import React, { useRef, type ReactNode } from 'react';
|
import React, { useRef, type ReactNode } from 'react';
|
||||||
import type { LocalizerType } from '../../types/I18N.std.js';
|
import type { LocalizerType } from '../../types/I18N.std.js';
|
||||||
import { AxoMenuBuilder } from '../../axo/AxoMenuBuilder.dom.js';
|
import { AxoMenuBuilder } from '../../axo/AxoMenuBuilder.dom.js';
|
||||||
|
import { isInternalFeaturesEnabled } from '../../util/isInternalFeaturesEnabled.dom.js';
|
||||||
|
|
||||||
type MessageContextMenuProps = Readonly<{
|
type MessageContextMenuProps = Readonly<{
|
||||||
i18n: LocalizerType;
|
i18n: LocalizerType;
|
||||||
@@ -11,6 +12,7 @@ type MessageContextMenuProps = Readonly<{
|
|||||||
onOpenChange?: (open: boolean) => void;
|
onOpenChange?: (open: boolean) => void;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
shouldShowAdditional: boolean;
|
shouldShowAdditional: boolean;
|
||||||
|
onDebugMessage: (() => void) | null;
|
||||||
onDownload: (() => void) | null;
|
onDownload: (() => void) | null;
|
||||||
onEdit: (() => void) | null;
|
onEdit: (() => void) | null;
|
||||||
onReplyToMessage: (() => void) | null;
|
onReplyToMessage: (() => void) | null;
|
||||||
@@ -34,6 +36,7 @@ export function MessageContextMenu({
|
|||||||
onOpenChange,
|
onOpenChange,
|
||||||
disabled,
|
disabled,
|
||||||
shouldShowAdditional,
|
shouldShowAdditional,
|
||||||
|
onDebugMessage,
|
||||||
onDownload,
|
onDownload,
|
||||||
onEdit,
|
onEdit,
|
||||||
onReplyToMessage,
|
onReplyToMessage,
|
||||||
@@ -162,6 +165,17 @@ export function MessageContextMenu({
|
|||||||
{i18n('icu:retryDeleteForEveryone')}
|
{i18n('icu:retryDeleteForEveryone')}
|
||||||
</AxoMenuBuilder.Item>
|
</AxoMenuBuilder.Item>
|
||||||
)}
|
)}
|
||||||
|
{isInternalFeaturesEnabled() && onDebugMessage && (
|
||||||
|
<>
|
||||||
|
<AxoMenuBuilder.Separator />
|
||||||
|
<AxoMenuBuilder.Group>
|
||||||
|
<AxoMenuBuilder.Label>Internal</AxoMenuBuilder.Label>
|
||||||
|
<AxoMenuBuilder.Item symbol="copy" onSelect={onDebugMessage}>
|
||||||
|
Copy & debug message
|
||||||
|
</AxoMenuBuilder.Item>
|
||||||
|
</AxoMenuBuilder.Group>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</AxoMenuBuilder.Content>
|
</AxoMenuBuilder.Content>
|
||||||
</AxoMenuBuilder.Root>
|
</AxoMenuBuilder.Root>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ const defaultMessageProps: TimelineMessagesProps = {
|
|||||||
isSMS: false,
|
isSMS: false,
|
||||||
isSpoilerExpanded: {},
|
isSpoilerExpanded: {},
|
||||||
isVoiceMessagePlayed: false,
|
isVoiceMessagePlayed: false,
|
||||||
|
handleDebugMessage: action('debugMessage'),
|
||||||
toggleSelectMessage: action('toggleSelectMessage'),
|
toggleSelectMessage: action('toggleSelectMessage'),
|
||||||
cancelAttachmentDownload: action('default--cancelAttachmentDownload'),
|
cancelAttachmentDownload: action('default--cancelAttachmentDownload'),
|
||||||
kickOffAttachmentDownload: action('default--kickOffAttachmentDownload'),
|
kickOffAttachmentDownload: action('default--kickOffAttachmentDownload'),
|
||||||
|
|||||||
@@ -374,6 +374,7 @@ const renderItem = ({
|
|||||||
containerWidthBreakpoint={containerWidthBreakpoint}
|
containerWidthBreakpoint={containerWidthBreakpoint}
|
||||||
conversationId=""
|
conversationId=""
|
||||||
item={items[messageId]}
|
item={items[messageId]}
|
||||||
|
handleDebugMessage={action('handleDebugMessage')}
|
||||||
renderAudioAttachment={() => <div>*AudioAttachment*</div>}
|
renderAudioAttachment={() => <div>*AudioAttachment*</div>}
|
||||||
renderContact={() => <div>*ContactName*</div>}
|
renderContact={() => <div>*ContactName*</div>}
|
||||||
renderReactionPicker={() => <div />}
|
renderReactionPicker={() => <div />}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ const getDefaultProps = () => ({
|
|||||||
interactionMode: 'keyboard' as const,
|
interactionMode: 'keyboard' as const,
|
||||||
theme: ThemeType.light,
|
theme: ThemeType.light,
|
||||||
platform: 'darwin',
|
platform: 'darwin',
|
||||||
|
handleDebugMessage: action('handleDebugMessage'),
|
||||||
targetMessage: action('targetMessage'),
|
targetMessage: action('targetMessage'),
|
||||||
toggleSelectMessage: action('toggleSelectMessage'),
|
toggleSelectMessage: action('toggleSelectMessage'),
|
||||||
endPoll: action('endPoll'),
|
endPoll: action('endPoll'),
|
||||||
|
|||||||
@@ -268,6 +268,7 @@ const createProps = (overrideProps: Partial<Props> = {}): Props => ({
|
|||||||
expirationTimestamp: overrideProps.expirationTimestamp ?? 0,
|
expirationTimestamp: overrideProps.expirationTimestamp ?? 0,
|
||||||
getPreferredBadge: overrideProps.getPreferredBadge || (() => undefined),
|
getPreferredBadge: overrideProps.getPreferredBadge || (() => undefined),
|
||||||
giftBadge: overrideProps.giftBadge,
|
giftBadge: overrideProps.giftBadge,
|
||||||
|
handleDebugMessage: action('handleDebugMessage'),
|
||||||
i18n,
|
i18n,
|
||||||
platform: 'darwin',
|
platform: 'darwin',
|
||||||
id: overrideProps.id ?? 'random-message-id',
|
id: overrideProps.id ?? 'random-message-id',
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export type PropsActions = {
|
|||||||
messageId: string,
|
messageId: string,
|
||||||
isPinningDisappearingMessage: boolean
|
isPinningDisappearingMessage: boolean
|
||||||
) => void;
|
) => void;
|
||||||
|
handleDebugMessage: () => void;
|
||||||
} & Omit<MessagePropsActions, 'onToggleSelect' | 'onReplyToMessage'>;
|
} & Omit<MessagePropsActions, 'onToggleSelect' | 'onReplyToMessage'>;
|
||||||
|
|
||||||
export type Props = PropsData &
|
export type Props = PropsData &
|
||||||
@@ -125,6 +126,7 @@ export function TimelineMessage(props: Props): React.JSX.Element {
|
|||||||
copyMessageText,
|
copyMessageText,
|
||||||
endPoll,
|
endPoll,
|
||||||
expirationLength,
|
expirationLength,
|
||||||
|
handleDebugMessage,
|
||||||
onPinnedMessageRemove,
|
onPinnedMessageRemove,
|
||||||
pushPanelForConversation,
|
pushPanelForConversation,
|
||||||
reactToMessage,
|
reactToMessage,
|
||||||
@@ -367,6 +369,7 @@ export function TimelineMessage(props: Props): React.JSX.Element {
|
|||||||
args: { messageId: id },
|
args: { messageId: id },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
onDebugMessage={handleDebugMessage}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</MessageContextMenu>
|
</MessageContextMenu>
|
||||||
@@ -383,6 +386,7 @@ export function TimelineMessage(props: Props): React.JSX.Element {
|
|||||||
canRetryDeleteForEveryone,
|
canRetryDeleteForEveryone,
|
||||||
conversationId,
|
conversationId,
|
||||||
copyMessageText,
|
copyMessageText,
|
||||||
|
handleDebugMessage,
|
||||||
handleDownload,
|
handleDownload,
|
||||||
handleReact,
|
handleReact,
|
||||||
handleOpenPinMessageDialog,
|
handleOpenPinMessageDialog,
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ import { renderReactionPicker } from './renderReactionPicker.dom.js';
|
|||||||
import type { MessageRequestState } from '../../components/conversation/MessageRequestActionsConfirmation.dom.js';
|
import type { MessageRequestState } from '../../components/conversation/MessageRequestActionsConfirmation.dom.js';
|
||||||
import { TargetedMessageSource } from '../ducks/conversationsEnums.std.js';
|
import { TargetedMessageSource } from '../ducks/conversationsEnums.std.js';
|
||||||
import type { MessageInteractivity } from '../../components/conversation/Message.dom.js';
|
import type { MessageInteractivity } from '../../components/conversation/Message.dom.js';
|
||||||
|
import { DataReader } from '../../sql/Client.preload.js';
|
||||||
|
import { isInternalFeaturesEnabled } from '../../util/isInternalFeaturesEnabled.dom.js';
|
||||||
|
|
||||||
export type SmartTimelineItemProps = {
|
export type SmartTimelineItemProps = {
|
||||||
containerElementRef: RefObject<HTMLElement>;
|
containerElementRef: RefObject<HTMLElement>;
|
||||||
@@ -195,6 +197,18 @@ export const SmartTimelineItem = memo(function SmartTimelineItem(
|
|||||||
[conversationId, toggleMessageRequestActionsConfirmation]
|
[conversationId, toggleMessageRequestActionsConfirmation]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const handleDebugMessage = useCallback(async () => {
|
||||||
|
if (!isInternalFeaturesEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const message = await DataReader.getMessageById(messageId);
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.debug(message);
|
||||||
|
await window.navigator.clipboard.writeText(
|
||||||
|
JSON.stringify(message, null, 2)
|
||||||
|
);
|
||||||
|
}, [messageId]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TimelineItem
|
<TimelineItem
|
||||||
item={item}
|
item={item}
|
||||||
@@ -235,6 +249,7 @@ export const SmartTimelineItem = memo(function SmartTimelineItem(
|
|||||||
endPoll={endPoll}
|
endPoll={endPoll}
|
||||||
reactToMessage={reactToMessage}
|
reactToMessage={reactToMessage}
|
||||||
copyMessageText={copyMessageText}
|
copyMessageText={copyMessageText}
|
||||||
|
handleDebugMessage={handleDebugMessage}
|
||||||
onOpenEditNicknameAndNoteModal={onOpenEditNicknameAndNoteModal}
|
onOpenEditNicknameAndNoteModal={onOpenEditNicknameAndNoteModal}
|
||||||
onOpenMessageRequestActionsConfirmation={
|
onOpenMessageRequestActionsConfirmation={
|
||||||
onOpenMessageRequestActionsConfirmation
|
onOpenMessageRequestActionsConfirmation
|
||||||
|
|||||||
Reference in New Issue
Block a user