From 9348940ecf6d717b86433d6bcec1678a6971aae2 Mon Sep 17 00:00:00 2001
From: Josh Perez <60019601+josh-signal@users.noreply.github.com>
Date: Mon, 5 Dec 2022 17:56:23 -0500
Subject: [PATCH] Moves parts of conversation view into redux
---
.../ToastDeleteForEveryoneFailed.stories.tsx | 28 --
.../ToastDeleteForEveryoneFailed.tsx | 18 -
ts/components/ToastManager.tsx | 4 +
.../ConversationHeader.stories.tsx | 4 +-
.../conversation/ConversationHeader.tsx | 63 ++-
ts/components/conversation/MessageDetail.tsx | 4 +-
.../conversation/TimelineMessage.tsx | 21 +-
.../ConversationDetails.tsx | 12 +-
.../ConversationDetailsMediaList.tsx | 6 +-
.../GroupV2Permissions.tsx | 22 +-
.../PendingInvites.stories.tsx | 8 +-
.../conversation-details/PendingInvites.tsx | 51 ++-
ts/models/conversations.ts | 153 +------
ts/state/ducks/conversations.ts | 388 +++++++++++++++++-
ts/state/ducks/toast.ts | 5 +-
ts/state/smart/ConversationDetails.tsx | 3 -
ts/state/smart/ConversationHeader.tsx | 3 -
ts/state/smart/GroupV2Permissions.tsx | 10 +-
ts/state/smart/PendingInvites.tsx | 6 +-
ts/state/smart/Timeline.tsx | 1 -
ts/util/denyPendingApprovalRequest.ts | 36 ++
ts/util/isMemberPending.ts | 25 ++
ts/util/isMemberRequestingToJoin.ts | 25 ++
ts/util/removePendingMember.ts | 42 ++
ts/util/showToast.tsx | 2 -
ts/util/startConversation.ts | 19 +
ts/views/conversation_view.tsx | 195 +--------
27 files changed, 693 insertions(+), 461 deletions(-)
delete mode 100644 ts/components/ToastDeleteForEveryoneFailed.stories.tsx
delete mode 100644 ts/components/ToastDeleteForEveryoneFailed.tsx
create mode 100644 ts/util/denyPendingApprovalRequest.ts
create mode 100644 ts/util/isMemberPending.ts
create mode 100644 ts/util/isMemberRequestingToJoin.ts
create mode 100644 ts/util/removePendingMember.ts
create mode 100644 ts/util/startConversation.ts
diff --git a/ts/components/ToastDeleteForEveryoneFailed.stories.tsx b/ts/components/ToastDeleteForEveryoneFailed.stories.tsx
deleted file mode 100644
index 150750458c..0000000000
--- a/ts/components/ToastDeleteForEveryoneFailed.stories.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2021 Signal Messenger, LLC
-// SPDX-License-Identifier: AGPL-3.0-only
-
-import React from 'react';
-import { action } from '@storybook/addon-actions';
-import { ToastDeleteForEveryoneFailed } from './ToastDeleteForEveryoneFailed';
-
-import { setupI18n } from '../util/setupI18n';
-import enMessages from '../../_locales/en/messages.json';
-
-const i18n = setupI18n('en', enMessages);
-
-const defaultProps = {
- i18n,
- onClose: action('onClose'),
-};
-
-export default {
- title: 'Components/ToastDeleteForEveryoneFailed',
-};
-
-export const _ToastDeleteForEveryoneFailed = (): JSX.Element => (
-
-);
-
-_ToastDeleteForEveryoneFailed.story = {
- name: 'ToastDeleteForEveryoneFailed',
-};
diff --git a/ts/components/ToastDeleteForEveryoneFailed.tsx b/ts/components/ToastDeleteForEveryoneFailed.tsx
deleted file mode 100644
index 3696d16c7a..0000000000
--- a/ts/components/ToastDeleteForEveryoneFailed.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2021 Signal Messenger, LLC
-// SPDX-License-Identifier: AGPL-3.0-only
-
-import React from 'react';
-import type { LocalizerType } from '../types/Util';
-import { Toast } from './Toast';
-
-type PropsType = {
- i18n: LocalizerType;
- onClose: () => unknown;
-};
-
-export function ToastDeleteForEveryoneFailed({
- i18n,
- onClose,
-}: PropsType): JSX.Element {
- return {i18n('deleteForEveryoneFailed')};
-}
diff --git a/ts/components/ToastManager.tsx b/ts/components/ToastManager.tsx
index e4676e7d81..339ad003eb 100644
--- a/ts/components/ToastManager.tsx
+++ b/ts/components/ToastManager.tsx
@@ -143,5 +143,9 @@ export function ToastManager({
);
}
+ if (toastType === ToastType.DeleteForEveryoneFailed) {
+ return {i18n('deleteForEveryoneFailed')};
+ }
+
throw missingCaseError(toastType);
}
diff --git a/ts/components/conversation/ConversationHeader.stories.tsx b/ts/components/conversation/ConversationHeader.stories.tsx
index 2847029e57..9b700b2252 100644
--- a/ts/components/conversation/ConversationHeader.stories.tsx
+++ b/ts/components/conversation/ConversationHeader.stories.tsx
@@ -38,8 +38,8 @@ const commonProps = {
i18n,
onShowConversationDetails: action('onShowConversationDetails'),
- onSetDisappearingMessages: action('onSetDisappearingMessages'),
- onDeleteMessages: action('onDeleteMessages'),
+ setDisappearingMessages: action('setDisappearingMessages'),
+ destroyMessages: action('destroyMessages'),
onSearchInConversation: action('onSearchInConversation'),
onSetMuteNotifications: action('onSetMuteNotifications'),
onOutgoingAudioCallInConversation: action(
diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx
index db9fc0f516..95f6bd092e 100644
--- a/ts/components/conversation/ConversationHeader.tsx
+++ b/ts/components/conversation/ConversationHeader.tsx
@@ -28,6 +28,7 @@ import * as expirationTimer from '../../util/expirationTimer';
import { missingCaseError } from '../../util/missingCaseError';
import { isInSystemContacts } from '../../util/isInSystemContacts';
import { isConversationMuted } from '../../util/isConversationMuted';
+import { ConfirmationDialog } from '../ConfirmationDialog';
import { DurationInSeconds } from '../../util/durations';
import {
useStartCallShortcuts,
@@ -80,8 +81,7 @@ export type PropsDataType = {
export type PropsActionsType = {
onSetMuteNotifications: (seconds: number) => void;
- onSetDisappearingMessages: (seconds: DurationInSeconds) => void;
- onDeleteMessages: () => void;
+ destroyMessages: (conversationId: string) => void;
onSearchInConversation: () => void;
onOutgoingAudioCallInConversation: () => void;
onOutgoingVideoCallInConversation: () => void;
@@ -95,6 +95,10 @@ export type PropsActionsType = {
onArchive: () => void;
onMarkUnread: () => void;
onMoveToInbox: () => void;
+ setDisappearingMessages: (
+ conversationId: string,
+ seconds: DurationInSeconds
+ ) => void;
viewUserStories: ViewUserStoriesActionCreatorType;
};
@@ -112,6 +116,7 @@ enum ModalState {
}
type StateType = {
+ hasDeleteMessagesConfirmation: boolean;
isNarrow: boolean;
modalState: ModalState;
};
@@ -130,7 +135,11 @@ export class ConversationHeader extends React.Component {
public constructor(props: PropsType) {
super(props);
- this.state = { isNarrow: false, modalState: ModalState.NothingOpen };
+ this.state = {
+ hasDeleteMessagesConfirmation: false,
+ isNarrow: false,
+ modalState: ModalState.NothingOpen,
+ };
this.menuTriggerRef = React.createRef();
this.headerRef = React.createRef();
@@ -329,6 +338,7 @@ export class ConversationHeader extends React.Component {
expireTimer,
groupVersion,
i18n,
+ id,
isArchived,
isMissingMandatoryProfileSharing,
isPinned,
@@ -337,15 +347,14 @@ export class ConversationHeader extends React.Component {
markedUnread,
muteExpiresAt,
onArchive,
- onDeleteMessages,
onMarkUnread,
onMoveToInbox,
- onSetDisappearingMessages,
onSetMuteNotifications,
onSetPin,
onShowAllMedia,
onShowConversationDetails,
onShowGroupMembers,
+ setDisappearingMessages,
type,
} = this.props;
@@ -425,7 +434,7 @@ export class ConversationHeader extends React.Component {
modalState: ModalState.CustomDisappearingTimeout,
});
} else {
- onSetDisappearingMessages(seconds);
+ setDisappearingMessages(id, seconds);
}
};
@@ -487,7 +496,11 @@ export class ConversationHeader extends React.Component {
) : (
)}
-
+
{isPinned ? (