mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-05-08 08:58:38 +01:00
Sync my stories with primary device
This commit is contained in:
@@ -1,87 +1,124 @@
|
||||
// Copyright 2021 Signal Messenger, LLC
|
||||
// Copyright 2021-2022 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { connect } from 'react-redux';
|
||||
import type { AttachmentType } from '../../types/Attachment';
|
||||
import React from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import type { BodyRangeType } from '../../types/Util';
|
||||
import type { DataPropsType } from '../../components/ForwardMessageModal';
|
||||
import type { LinkPreviewType } from '../../types/message/LinkPreviews';
|
||||
import type { ForwardMessagePropsType } from '../ducks/globalModals';
|
||||
import type { StateType } from '../reducer';
|
||||
import * as log from '../../logging/log';
|
||||
import { ForwardMessageModal } from '../../components/ForwardMessageModal';
|
||||
import { LinkPreviewSourceType } from '../../types/LinkPreview';
|
||||
import { ToastMessageBodyTooLong } from '../../components/ToastMessageBodyTooLong';
|
||||
import { getAllComposableConversations } from '../selectors/conversations';
|
||||
import { getEmojiSkinTone } from '../selectors/items';
|
||||
import { getIntl, getTheme, getRegionCode } from '../selectors/user';
|
||||
import { getLinkPreview } from '../selectors/linkPreviews';
|
||||
import { getMessageById } from '../../messages/getMessageById';
|
||||
import { getPreferredBadgeSelector } from '../selectors/badges';
|
||||
import { mapDispatchToProps } from '../actions';
|
||||
import { maybeForwardMessage } from '../../util/maybeForwardMessage';
|
||||
import {
|
||||
maybeGrabLinkPreview,
|
||||
resetLinkPreview,
|
||||
} from '../../services/LinkPreview';
|
||||
import { selectRecentEmojis } from '../selectors/emojis';
|
||||
import { showToast } from '../../util/showToast';
|
||||
import { useActions as useEmojiActions } from '../ducks/emojis';
|
||||
import { useActions as useItemsActions } from '../ducks/items';
|
||||
import { useGlobalModalActions } from '../ducks/globalModals';
|
||||
import { useLinkPreviewActions } from '../ducks/linkPreviews';
|
||||
|
||||
export type SmartForwardMessageModalProps = {
|
||||
attachments?: Array<AttachmentType>;
|
||||
doForwardMessage: (
|
||||
selectedContacts: Array<string>,
|
||||
messageBody?: string,
|
||||
attachments?: Array<AttachmentType>,
|
||||
linkPreview?: LinkPreviewType
|
||||
) => void;
|
||||
hasContact: boolean;
|
||||
isSticker: boolean;
|
||||
messageBody?: string;
|
||||
onClose: () => void;
|
||||
onEditorStateChange: (
|
||||
messageText: string,
|
||||
bodyRanges: Array<BodyRangeType>,
|
||||
caretLocation?: number
|
||||
) => unknown;
|
||||
onTextTooLong: () => void;
|
||||
};
|
||||
export function SmartForwardMessageModal(): JSX.Element | null {
|
||||
const forwardMessageProps = useSelector<
|
||||
StateType,
|
||||
ForwardMessagePropsType | undefined
|
||||
>(state => state.globalModals.forwardMessageProps);
|
||||
const candidateConversations = useSelector(getAllComposableConversations);
|
||||
const getPreferredBadge = useSelector(getPreferredBadgeSelector);
|
||||
const i18n = useSelector(getIntl);
|
||||
const linkPreviewForSource = useSelector(getLinkPreview);
|
||||
const recentEmojis = useSelector(selectRecentEmojis);
|
||||
const regionCode = useSelector(getRegionCode);
|
||||
const skinTone = useSelector(getEmojiSkinTone);
|
||||
const theme = useSelector(getTheme);
|
||||
|
||||
const mapStateToProps = (
|
||||
state: StateType,
|
||||
props: SmartForwardMessageModalProps
|
||||
): DataPropsType => {
|
||||
const {
|
||||
attachments,
|
||||
doForwardMessage,
|
||||
hasContact,
|
||||
isSticker,
|
||||
messageBody,
|
||||
onClose,
|
||||
onEditorStateChange,
|
||||
onTextTooLong,
|
||||
} = props;
|
||||
const { removeLinkPreview } = useLinkPreviewActions();
|
||||
const { onUseEmoji: onPickEmoji } = useEmojiActions();
|
||||
const { onSetSkinTone } = useItemsActions();
|
||||
const { toggleForwardMessageModal } = useGlobalModalActions();
|
||||
|
||||
const candidateConversations = getAllComposableConversations(state);
|
||||
const recentEmojis = selectRecentEmojis(state);
|
||||
const skinTone = getEmojiSkinTone(state);
|
||||
const linkPreviewForSource = getLinkPreview(state);
|
||||
if (!forwardMessageProps) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
attachments,
|
||||
candidateConversations,
|
||||
doForwardMessage,
|
||||
getPreferredBadge: getPreferredBadgeSelector(state),
|
||||
hasContact,
|
||||
i18n: getIntl(state),
|
||||
isSticker,
|
||||
linkPreview: linkPreviewForSource(
|
||||
LinkPreviewSourceType.ForwardMessageModal
|
||||
),
|
||||
messageBody,
|
||||
onClose,
|
||||
onEditorStateChange,
|
||||
recentEmojis,
|
||||
skinTone,
|
||||
onTextTooLong,
|
||||
theme: getTheme(state),
|
||||
regionCode: getRegionCode(state),
|
||||
};
|
||||
};
|
||||
const { attachments = [] } = forwardMessageProps;
|
||||
|
||||
const smart = connect(mapStateToProps, {
|
||||
...mapDispatchToProps,
|
||||
onPickEmoji: mapDispatchToProps.onUseEmoji,
|
||||
});
|
||||
function closeModal() {
|
||||
resetLinkPreview();
|
||||
toggleForwardMessageModal();
|
||||
}
|
||||
|
||||
export const SmartForwardMessageModal = smart(ForwardMessageModal);
|
||||
return (
|
||||
<ForwardMessageModal
|
||||
attachments={attachments}
|
||||
candidateConversations={candidateConversations}
|
||||
doForwardMessage={async (
|
||||
conversationIds,
|
||||
messageBody,
|
||||
includedAttachments,
|
||||
linkPreview
|
||||
) => {
|
||||
try {
|
||||
const message = await getMessageById(forwardMessageProps.id);
|
||||
if (!message) {
|
||||
throw new Error('No message found');
|
||||
}
|
||||
|
||||
const didForwardSuccessfully = await maybeForwardMessage(
|
||||
message.attributes,
|
||||
conversationIds,
|
||||
messageBody,
|
||||
includedAttachments,
|
||||
linkPreview
|
||||
);
|
||||
|
||||
if (didForwardSuccessfully) {
|
||||
closeModal();
|
||||
}
|
||||
} catch (err) {
|
||||
log.warn('doForwardMessage', err && err.stack ? err.stack : err);
|
||||
}
|
||||
}}
|
||||
getPreferredBadge={getPreferredBadge}
|
||||
hasContact={Boolean(forwardMessageProps.contact)}
|
||||
i18n={i18n}
|
||||
isSticker={Boolean(forwardMessageProps.isSticker)}
|
||||
linkPreview={linkPreviewForSource(
|
||||
LinkPreviewSourceType.ForwardMessageModal
|
||||
)}
|
||||
messageBody={forwardMessageProps.text}
|
||||
onClose={closeModal}
|
||||
onEditorStateChange={(
|
||||
messageText: string,
|
||||
_: Array<BodyRangeType>,
|
||||
caretLocation?: number
|
||||
) => {
|
||||
if (!attachments.length) {
|
||||
maybeGrabLinkPreview(
|
||||
messageText,
|
||||
LinkPreviewSourceType.ForwardMessageModal,
|
||||
caretLocation
|
||||
);
|
||||
}
|
||||
}}
|
||||
onPickEmoji={onPickEmoji}
|
||||
onSetSkinTone={onSetSkinTone}
|
||||
onTextTooLong={() => showToast(ToastMessageBodyTooLong)}
|
||||
recentEmojis={recentEmojis}
|
||||
regionCode={regionCode}
|
||||
removeLinkPreview={removeLinkPreview}
|
||||
skinTone={skinTone}
|
||||
theme={theme}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user