Use ReadonlyArrays in conversation model and redux

This commit is contained in:
Fedor Indutny 2022-12-21 16:07:02 -08:00 committed by GitHub
parent ecbf84638d
commit dec23725e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
55 changed files with 173 additions and 162 deletions

View file

@ -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;

View file

@ -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) {

View file

@ -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;

View file

@ -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 || '');

View file

@ -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;

View file

@ -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'>;

View file

@ -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({

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
} = {}

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
};

View file

@ -48,7 +48,7 @@ type StateType = {
maximumGroupSizeModalState: OneTimeModalState;
recommendedGroupSizeModalState: OneTimeModalState;
searchTerm: string;
selectedConversationIds: Array<string>;
selectedConversationIds: ReadonlyArray<string>;
stage: Stage;
};

View file

@ -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;

View file

@ -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;
};

View file

@ -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;
};

View file

@ -19,7 +19,7 @@ export type Props = {
showAllMedia: () => void;
showLightboxWithMedia: (
selectedAttachmentPath: string | undefined,
media: Array<MediaItemType>
media: ReadonlyArray<MediaItemType>
) => void;
};

View file

@ -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;

View file

@ -41,7 +41,7 @@ type PropsType = {
deleteAvatarFromDisk: DeleteAvatarFromDiskActionType;
replaceAvatar: ReplaceAvatarActionType;
saveAvatarToDisk: SaveAvatarToDiskActionType;
userAvatarData: Array<AvatarDataType>;
userAvatarData: ReadonlyArray<AvatarDataType>;
};
export function EditConversationAttributesModal({

View file

@ -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;

View file

@ -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';
};

View file

@ -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);

View file

@ -19,7 +19,7 @@ export type GroupListItemConversationType = Pick<
> & {
disabledReason: DisabledReason | undefined;
membersCount: number;
memberships: Array<{
memberships: ReadonlyArray<{
uuid: UUIDStringType;
isAdmin: boolean;
}>;

View file

@ -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;
};