Use ReadonlyArrays in conversation model and redux
This commit is contained in:
parent
ecbf84638d
commit
dec23725e5
55 changed files with 173 additions and 162 deletions
|
@ -49,7 +49,7 @@ export type Props = {
|
|||
noteToSelf?: boolean;
|
||||
phoneNumber?: string;
|
||||
profileName?: string;
|
||||
sharedGroupNames: Array<string>;
|
||||
sharedGroupNames: ReadonlyArray<string>;
|
||||
size: AvatarSize;
|
||||
title: string;
|
||||
unblurredAvatarPath?: string;
|
||||
|
|
|
@ -79,7 +79,7 @@ export type Props = Readonly<{
|
|||
moduleClassName?: string;
|
||||
theme: ThemeType;
|
||||
placeholder?: string;
|
||||
sortedGroupMembers?: Array<ConversationType>;
|
||||
sortedGroupMembers?: ReadonlyArray<ConversationType>;
|
||||
scrollerRef?: React.RefObject<HTMLDivElement>;
|
||||
onDirtyChange?(dirty: boolean): unknown;
|
||||
onEditorStateChange?(
|
||||
|
@ -488,7 +488,9 @@ export function CompositionInput(props: Props): React.ReactElement {
|
|||
[]
|
||||
);
|
||||
|
||||
const removeStaleMentions = (currentMembers: Array<ConversationType>) => {
|
||||
const removeStaleMentions = (
|
||||
currentMembers: ReadonlyArray<ConversationType>
|
||||
) => {
|
||||
const quill = quillRef.current;
|
||||
|
||||
if (quill === undefined) {
|
||||
|
|
|
@ -20,12 +20,12 @@ import { offsetDistanceModifier } from '../util/popperUtil';
|
|||
import { handleOutsideClick } from '../util/handleOutsideClick';
|
||||
|
||||
type PropsType = {
|
||||
draftPreferredReactions: Array<string>;
|
||||
draftPreferredReactions: ReadonlyArray<string>;
|
||||
hadSaveError: boolean;
|
||||
i18n: LocalizerType;
|
||||
isSaving: boolean;
|
||||
originalPreferredReactions: Array<string>;
|
||||
recentEmojis: Array<string>;
|
||||
originalPreferredReactions: ReadonlyArray<string>;
|
||||
recentEmojis: ReadonlyArray<string>;
|
||||
selectedDraftEmojiIndex: undefined | number;
|
||||
skinTone: number;
|
||||
|
||||
|
|
|
@ -40,12 +40,12 @@ import {
|
|||
} from '../util/shouldNeverBeCalled';
|
||||
|
||||
export type DataPropsType = {
|
||||
attachments?: Array<AttachmentType>;
|
||||
attachments?: ReadonlyArray<AttachmentType>;
|
||||
candidateConversations: ReadonlyArray<ConversationType>;
|
||||
doForwardMessage: (
|
||||
selectedContacts: Array<string>,
|
||||
messageBody?: string,
|
||||
attachments?: Array<AttachmentType>,
|
||||
attachments?: ReadonlyArray<AttachmentType>,
|
||||
linkPreview?: LinkPreviewType
|
||||
) => void;
|
||||
getPreferredBadge: PreferredBadgeSelectorType;
|
||||
|
@ -102,7 +102,7 @@ export function ForwardMessageModal({
|
|||
filterAndSortConversationsByRecent(candidateConversations, '', regionCode)
|
||||
);
|
||||
const [attachmentsToForward, setAttachmentsToForward] = useState<
|
||||
Array<AttachmentType>
|
||||
ReadonlyArray<AttachmentType>
|
||||
>(attachments || []);
|
||||
const [isEditingMessage, setIsEditingMessage] = useState(false);
|
||||
const [messageBodyText, setMessageBodyText] = useState(messageBody || '');
|
||||
|
|
|
@ -29,7 +29,7 @@ export type PropsType = {
|
|||
getConversation?: (id: string) => ConversationType;
|
||||
i18n: LocalizerType;
|
||||
isViewOnce?: boolean;
|
||||
media: Array<MediaItemType>;
|
||||
media: ReadonlyArray<MediaItemType>;
|
||||
saveAttachment: SaveAttachmentActionCreatorType;
|
||||
selectedIndex?: number;
|
||||
toggleForwardMessageModal: (messageId: string) => unknown;
|
||||
|
|
|
@ -69,7 +69,7 @@ export type PropsDataType = {
|
|||
firstName: string;
|
||||
i18n: LocalizerType;
|
||||
isUsernameFlagEnabled: boolean;
|
||||
userAvatarData: Array<AvatarDataType>;
|
||||
userAvatarData: ReadonlyArray<AvatarDataType>;
|
||||
username?: string;
|
||||
usernameEditState: UsernameEditState;
|
||||
} & Pick<EmojiButtonProps, 'recentEmojis' | 'skinTone'>;
|
||||
|
|
|
@ -11,7 +11,7 @@ import type { LocalizerType } from '../types/Util';
|
|||
type PropsType = {
|
||||
i18n: LocalizerType;
|
||||
nameClassName?: string;
|
||||
sharedGroupNames: Array<string>;
|
||||
sharedGroupNames: ReadonlyArray<string>;
|
||||
};
|
||||
|
||||
export function SharedGroupNames({
|
||||
|
|
|
@ -96,9 +96,9 @@ export type PropsType = {
|
|||
story: StoryViewType
|
||||
) => unknown;
|
||||
onUseEmoji: (_: EmojiPickDataType) => unknown;
|
||||
preferredReactionEmoji: Array<string>;
|
||||
preferredReactionEmoji: ReadonlyArray<string>;
|
||||
queueStoryDownload: (storyId: string) => unknown;
|
||||
recentEmojis?: Array<string>;
|
||||
recentEmojis?: ReadonlyArray<string>;
|
||||
renderEmojiPicker: (props: RenderEmojiPickerProps) => JSX.Element;
|
||||
replyState?: ReplyStateType;
|
||||
retryMessageSend: (messageId: string) => unknown;
|
||||
|
|
|
@ -98,14 +98,14 @@ export type PropsType = {
|
|||
onSetSkinTone: (tone: number) => unknown;
|
||||
onTextTooLong: () => unknown;
|
||||
onUseEmoji: (_: EmojiPickDataType) => unknown;
|
||||
preferredReactionEmoji: Array<string>;
|
||||
recentEmojis?: Array<string>;
|
||||
preferredReactionEmoji: ReadonlyArray<string>;
|
||||
recentEmojis?: ReadonlyArray<string>;
|
||||
renderEmojiPicker: (props: RenderEmojiPickerProps) => JSX.Element;
|
||||
replies: ReadonlyArray<ReplyType>;
|
||||
skinTone?: number;
|
||||
sortedGroupMembers?: Array<ConversationType>;
|
||||
sortedGroupMembers?: ReadonlyArray<ConversationType>;
|
||||
storyPreviewAttachment?: AttachmentType;
|
||||
views: Array<StorySendStateType>;
|
||||
views: ReadonlyArray<StorySendStateType>;
|
||||
viewTarget: StoryViewTargetType;
|
||||
onChangeViewTarget: (target: StoryViewTargetType) => unknown;
|
||||
deleteGroupStoryReply: (id: string) => void;
|
||||
|
|
|
@ -29,7 +29,7 @@ export type Props = {
|
|||
membersCount?: number;
|
||||
name?: string;
|
||||
phoneNumber?: string;
|
||||
sharedGroupNames?: Array<string>;
|
||||
sharedGroupNames?: ReadonlyArray<string>;
|
||||
unblurAvatar: (conversationId: string) => void;
|
||||
unblurredAvatarPath?: string;
|
||||
updateSharedGroups: (conversationId: string) => unknown;
|
||||
|
|
|
@ -43,11 +43,11 @@ const renderChange = (
|
|||
groupName,
|
||||
areWeAdmin = true,
|
||||
}: {
|
||||
groupMemberships?: Array<{
|
||||
groupMemberships?: ReadonlyArray<{
|
||||
uuid: UUIDStringType;
|
||||
isAdmin: boolean;
|
||||
}>;
|
||||
groupBannedMemberships?: Array<UUIDStringType>;
|
||||
groupBannedMemberships?: ReadonlyArray<UUIDStringType>;
|
||||
groupName?: string;
|
||||
areWeAdmin?: boolean;
|
||||
} = {}
|
||||
|
|
|
@ -25,11 +25,11 @@ import { ConfirmationDialog } from '../ConfirmationDialog';
|
|||
export type PropsDataType = {
|
||||
areWeAdmin: boolean;
|
||||
conversationId: string;
|
||||
groupMemberships?: Array<{
|
||||
groupMemberships?: ReadonlyArray<{
|
||||
uuid: UUIDStringType;
|
||||
isAdmin: boolean;
|
||||
}>;
|
||||
groupBannedMemberships?: Array<UUIDStringType>;
|
||||
groupBannedMemberships?: ReadonlyArray<UUIDStringType>;
|
||||
groupName?: string;
|
||||
ourACI?: UUIDStringType;
|
||||
ourPNI?: UUIDStringType;
|
||||
|
@ -155,11 +155,11 @@ function GroupV2Detail({
|
|||
conversationId: string;
|
||||
detail: GroupV2ChangeDetailType;
|
||||
isLastText: boolean;
|
||||
groupMemberships?: Array<{
|
||||
groupMemberships?: ReadonlyArray<{
|
||||
uuid: UUIDStringType;
|
||||
isAdmin: boolean;
|
||||
}>;
|
||||
groupBannedMemberships?: Array<UUIDStringType>;
|
||||
groupBannedMemberships?: ReadonlyArray<UUIDStringType>;
|
||||
groupName?: string;
|
||||
i18n: LocalizerType;
|
||||
fromId?: UUIDStringType;
|
||||
|
|
|
@ -21,7 +21,7 @@ import type { LocalizerType, ThemeType } from '../../types/Util';
|
|||
export type DirectionType = 'incoming' | 'outgoing';
|
||||
|
||||
export type Props = {
|
||||
attachments: Array<AttachmentType>;
|
||||
attachments: ReadonlyArray<AttachmentType>;
|
||||
bottomOverlay?: boolean;
|
||||
direction: DirectionType;
|
||||
isSticker?: boolean;
|
||||
|
|
|
@ -223,7 +223,7 @@ export type PropsData = {
|
|||
>;
|
||||
reducedMotion?: boolean;
|
||||
conversationType: ConversationTypeType;
|
||||
attachments?: Array<AttachmentType>;
|
||||
attachments?: ReadonlyArray<AttachmentType>;
|
||||
giftBadge?: GiftBadgeType;
|
||||
payment?: AnyPaymentEvent;
|
||||
quote?: {
|
||||
|
@ -255,7 +255,7 @@ export type PropsData = {
|
|||
storyId?: string;
|
||||
text: string;
|
||||
};
|
||||
previews: Array<LinkPreviewType>;
|
||||
previews: ReadonlyArray<LinkPreviewType>;
|
||||
|
||||
isTapToView?: boolean;
|
||||
isTapToViewExpired?: boolean;
|
||||
|
|
|
@ -28,7 +28,7 @@ export type OwnProps = {
|
|||
onPick: (emoji: string) => unknown;
|
||||
onSetSkinTone: (tone: number) => unknown;
|
||||
openCustomizePreferredReactionsModal?: () => unknown;
|
||||
preferredReactionEmoji: Array<string>;
|
||||
preferredReactionEmoji: ReadonlyArray<string>;
|
||||
renderEmojiPicker: (props: RenderEmojiPickerProps) => React.ReactElement;
|
||||
};
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ type StateType = {
|
|||
maximumGroupSizeModalState: OneTimeModalState;
|
||||
recommendedGroupSizeModalState: OneTimeModalState;
|
||||
searchTerm: string;
|
||||
selectedConversationIds: Array<string>;
|
||||
selectedConversationIds: ReadonlyArray<string>;
|
||||
stage: Stage;
|
||||
};
|
||||
|
||||
|
|
|
@ -74,14 +74,14 @@ export type StateProps = {
|
|||
i18n: LocalizerType;
|
||||
isAdmin: boolean;
|
||||
isGroup: boolean;
|
||||
groupsInCommon: Array<ConversationType>;
|
||||
groupsInCommon: ReadonlyArray<ConversationType>;
|
||||
maxGroupSize: number;
|
||||
maxRecommendedGroupSize: number;
|
||||
memberships: Array<GroupV2Membership>;
|
||||
memberships: ReadonlyArray<GroupV2Membership>;
|
||||
pendingApprovalMemberships: ReadonlyArray<GroupV2RequestingMembership>;
|
||||
pendingMemberships: ReadonlyArray<GroupV2PendingMembership>;
|
||||
theme: ThemeType;
|
||||
userAvatarData: Array<AvatarDataType>;
|
||||
userAvatarData: ReadonlyArray<AvatarDataType>;
|
||||
renderChooseGroupMembersModal: (
|
||||
props: SmartChooseGroupMembersModalPropsType
|
||||
) => JSX.Element;
|
||||
|
|
|
@ -15,7 +15,7 @@ import { PanelSection } from './PanelSection';
|
|||
type Props = {
|
||||
contactId: string;
|
||||
i18n: LocalizerType;
|
||||
groupsInCommon: Array<ConversationType>;
|
||||
groupsInCommon: ReadonlyArray<ConversationType>;
|
||||
toggleAddUserToAnotherGroupModal: (contactId?: string) => void;
|
||||
showConversation: ShowConversationType;
|
||||
};
|
||||
|
|
|
@ -24,7 +24,7 @@ export type Props = {
|
|||
i18n: LocalizerType;
|
||||
isGroup: boolean;
|
||||
isMe: boolean;
|
||||
memberships: Array<GroupV2Membership>;
|
||||
memberships: ReadonlyArray<GroupV2Membership>;
|
||||
startEditing: (isGroupTitle: boolean) => void;
|
||||
theme: ThemeType;
|
||||
};
|
||||
|
|
|
@ -19,7 +19,7 @@ export type Props = {
|
|||
showAllMedia: () => void;
|
||||
showLightboxWithMedia: (
|
||||
selectedAttachmentPath: string | undefined,
|
||||
media: Array<MediaItemType>
|
||||
media: ReadonlyArray<MediaItemType>
|
||||
) => void;
|
||||
};
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ export type Props = {
|
|||
getPreferredBadge: PreferredBadgeSelectorType;
|
||||
i18n: LocalizerType;
|
||||
maxShownMemberCount?: number;
|
||||
memberships: Array<GroupV2Membership>;
|
||||
memberships: ReadonlyArray<GroupV2Membership>;
|
||||
showContactModal: (contactId: string, conversationId?: string) => void;
|
||||
startAddingNewMembers?: () => void;
|
||||
theme: ThemeType;
|
||||
|
|
|
@ -41,7 +41,7 @@ type PropsType = {
|
|||
deleteAvatarFromDisk: DeleteAvatarFromDiskActionType;
|
||||
replaceAvatar: ReplaceAvatarActionType;
|
||||
saveAvatarToDisk: SaveAvatarToDiskActionType;
|
||||
userAvatarData: Array<AvatarDataType>;
|
||||
userAvatarData: ReadonlyArray<AvatarDataType>;
|
||||
};
|
||||
|
||||
export function EditConversationAttributesModal({
|
||||
|
|
|
@ -34,7 +34,7 @@ type PropsActionType = {
|
|||
) => void;
|
||||
readonly revokePendingMembershipsFromGroupV2: (
|
||||
conversationId: string,
|
||||
memberIds: Array<string>
|
||||
memberIds: ReadonlyArray<string>
|
||||
) => void;
|
||||
};
|
||||
|
||||
|
@ -193,14 +193,14 @@ function MembershipActionConfirmation({
|
|||
) => void;
|
||||
conversation: ConversationType;
|
||||
i18n: LocalizerType;
|
||||
members: Array<ConversationType>;
|
||||
members: ReadonlyArray<ConversationType>;
|
||||
onClose: () => void;
|
||||
ourUuid: string;
|
||||
revokePendingMembershipsFromGroupV2: (
|
||||
conversationId: string,
|
||||
memberIds: Array<string>
|
||||
memberIds: ReadonlyArray<string>
|
||||
) => void;
|
||||
stagedMemberships: Array<StagedMembershipType>;
|
||||
stagedMemberships: ReadonlyArray<StagedMembershipType>;
|
||||
}) {
|
||||
const revokeStagedMemberships = () => {
|
||||
if (!stagedMemberships) {
|
||||
|
@ -424,7 +424,7 @@ function MembersPendingProfileKey({
|
|||
conversation: ConversationType;
|
||||
getPreferredBadge: PreferredBadgeSelectorType;
|
||||
i18n: LocalizerType;
|
||||
members: Array<ConversationType>;
|
||||
members: ReadonlyArray<ConversationType>;
|
||||
memberships: ReadonlyArray<GroupV2PendingMembership>;
|
||||
ourUuid: string;
|
||||
setStagedMemberships: (stagedMembership: Array<StagedMembershipType>) => void;
|
||||
|
|
|
@ -14,7 +14,7 @@ import { missingCaseError } from '../../../util/missingCaseError';
|
|||
export type Props = {
|
||||
header?: string;
|
||||
i18n: LocalizerType;
|
||||
mediaItems: Array<MediaItemType>;
|
||||
mediaItems: ReadonlyArray<MediaItemType>;
|
||||
onItemClick: (event: ItemClickEvent) => unknown;
|
||||
type: 'media' | 'documents';
|
||||
};
|
||||
|
|
|
@ -15,7 +15,7 @@ type YearMonthSectionType = 'yearMonth';
|
|||
|
||||
type GenericSection<T> = {
|
||||
type: T;
|
||||
mediaItems: Array<MediaItemType>;
|
||||
mediaItems: ReadonlyArray<MediaItemType>;
|
||||
};
|
||||
type StaticSection = GenericSection<StaticSectionType>;
|
||||
type YearMonthSection = GenericSection<YearMonthSectionType> & {
|
||||
|
@ -25,7 +25,7 @@ type YearMonthSection = GenericSection<YearMonthSectionType> & {
|
|||
export type Section = StaticSection | YearMonthSection;
|
||||
export const groupMediaItemsByDate = (
|
||||
timestamp: number,
|
||||
mediaItems: Array<MediaItemType>
|
||||
mediaItems: ReadonlyArray<MediaItemType>
|
||||
): Array<Section> => {
|
||||
const referenceDateTime = moment.utc(timestamp);
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ export type GroupListItemConversationType = Pick<
|
|||
> & {
|
||||
disabledReason: DisabledReason | undefined;
|
||||
membersCount: number;
|
||||
memberships: Array<{
|
||||
memberships: ReadonlyArray<{
|
||||
uuid: UUIDStringType;
|
||||
isAdmin: boolean;
|
||||
}>;
|
||||
|
|
|
@ -36,7 +36,7 @@ export type OwnProps = {
|
|||
readonly doSend?: () => unknown;
|
||||
readonly skinTone?: number;
|
||||
readonly onSetSkinTone?: (tone: number) => unknown;
|
||||
readonly recentEmojis?: Array<string>;
|
||||
readonly recentEmojis?: ReadonlyArray<string>;
|
||||
readonly onClickSettings?: () => unknown;
|
||||
readonly onClose?: () => unknown;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue