2021-11-20 15:41:21 +00:00
|
|
|
// Copyright 2019-2021 Signal Messenger, LLC
|
2020-11-20 17:30:45 +00:00
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
import * as React from 'react';
|
2021-11-20 15:41:21 +00:00
|
|
|
import type { LocalizerType, ThemeType } from '../types/Util';
|
2021-10-26 19:15:33 +00:00
|
|
|
import type { ConversationType } from '../state/ducks/conversations';
|
2021-11-20 15:41:21 +00:00
|
|
|
import type { PreferredBadgeSelectorType } from '../state/selectors/badges';
|
2021-03-03 20:09:58 +00:00
|
|
|
import { GroupDialog } from './GroupDialog';
|
2020-12-03 17:24:44 +00:00
|
|
|
import { sortByTitle } from '../util/sortByTitle';
|
2020-11-20 17:30:45 +00:00
|
|
|
|
|
|
|
type CallbackType = () => unknown;
|
|
|
|
|
|
|
|
export type DataPropsType = {
|
2020-12-01 23:45:39 +00:00
|
|
|
readonly areWeInvited: boolean;
|
2020-11-20 17:30:45 +00:00
|
|
|
readonly droppedMembers: Array<ConversationType>;
|
|
|
|
readonly hasMigrated: boolean;
|
|
|
|
readonly invitedMembers: Array<ConversationType>;
|
|
|
|
readonly migrate: CallbackType;
|
|
|
|
readonly onClose: CallbackType;
|
|
|
|
};
|
|
|
|
|
|
|
|
export type HousekeepingPropsType = {
|
2021-11-20 15:41:21 +00:00
|
|
|
readonly getPreferredBadge: PreferredBadgeSelectorType;
|
2020-11-20 17:30:45 +00:00
|
|
|
readonly i18n: LocalizerType;
|
2021-11-20 15:41:21 +00:00
|
|
|
readonly theme: ThemeType;
|
2020-11-20 17:30:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export type PropsType = DataPropsType & HousekeepingPropsType;
|
|
|
|
|
2021-11-11 22:43:05 +00:00
|
|
|
export const GroupV1MigrationDialog: React.FunctionComponent<PropsType> =
|
|
|
|
React.memo((props: PropsType) => {
|
2021-03-03 20:09:58 +00:00
|
|
|
const {
|
|
|
|
areWeInvited,
|
|
|
|
droppedMembers,
|
2021-11-20 15:41:21 +00:00
|
|
|
getPreferredBadge,
|
2021-03-03 20:09:58 +00:00
|
|
|
hasMigrated,
|
|
|
|
i18n,
|
|
|
|
invitedMembers,
|
|
|
|
migrate,
|
|
|
|
onClose,
|
2021-11-20 15:41:21 +00:00
|
|
|
theme,
|
2021-03-03 20:09:58 +00:00
|
|
|
} = props;
|
2020-11-20 17:30:45 +00:00
|
|
|
|
2021-03-03 20:09:58 +00:00
|
|
|
const title = hasMigrated
|
|
|
|
? i18n('GroupV1--Migration--info--title')
|
|
|
|
: i18n('GroupV1--Migration--migrate--title');
|
|
|
|
const keepHistory = hasMigrated
|
|
|
|
? i18n('GroupV1--Migration--info--keep-history')
|
|
|
|
: i18n('GroupV1--Migration--migrate--keep-history');
|
|
|
|
const migrationKey = hasMigrated ? 'after' : 'before';
|
|
|
|
const droppedMembersKey = `GroupV1--Migration--info--removed--${migrationKey}`;
|
2020-11-20 17:30:45 +00:00
|
|
|
|
2021-03-03 20:09:58 +00:00
|
|
|
let primaryButtonText: string;
|
|
|
|
let onClickPrimaryButton: () => void;
|
|
|
|
let secondaryButtonProps:
|
|
|
|
| undefined
|
|
|
|
| {
|
|
|
|
secondaryButtonText: string;
|
|
|
|
onClickSecondaryButton: () => void;
|
|
|
|
};
|
|
|
|
if (hasMigrated) {
|
|
|
|
primaryButtonText = i18n('Confirmation--confirm');
|
|
|
|
onClickPrimaryButton = onClose;
|
|
|
|
} else {
|
|
|
|
primaryButtonText = i18n('GroupV1--Migration--migrate');
|
|
|
|
onClickPrimaryButton = migrate;
|
|
|
|
secondaryButtonProps = {
|
|
|
|
secondaryButtonText: i18n('cancel'),
|
|
|
|
onClickSecondaryButton: onClose,
|
|
|
|
};
|
|
|
|
}
|
2020-11-20 17:30:45 +00:00
|
|
|
|
2021-03-03 20:09:58 +00:00
|
|
|
return (
|
|
|
|
<GroupDialog
|
|
|
|
i18n={i18n}
|
|
|
|
onClickPrimaryButton={onClickPrimaryButton}
|
|
|
|
onClose={onClose}
|
|
|
|
primaryButtonText={primaryButtonText}
|
|
|
|
title={title}
|
|
|
|
{...secondaryButtonProps}
|
|
|
|
>
|
|
|
|
<GroupDialog.Paragraph>
|
|
|
|
{i18n('GroupV1--Migration--info--summary')}
|
|
|
|
</GroupDialog.Paragraph>
|
|
|
|
<GroupDialog.Paragraph>{keepHistory}</GroupDialog.Paragraph>
|
2020-12-01 23:45:39 +00:00
|
|
|
{areWeInvited ? (
|
2021-03-03 20:09:58 +00:00
|
|
|
<GroupDialog.Paragraph>
|
|
|
|
{i18n('GroupV1--Migration--info--invited--you')}
|
|
|
|
</GroupDialog.Paragraph>
|
2020-12-01 23:45:39 +00:00
|
|
|
) : (
|
|
|
|
<>
|
2021-11-20 15:41:21 +00:00
|
|
|
{renderMembers({
|
|
|
|
getPreferredBadge,
|
|
|
|
i18n,
|
|
|
|
members: invitedMembers,
|
|
|
|
prefix: 'GroupV1--Migration--info--invited',
|
|
|
|
theme,
|
|
|
|
})}
|
|
|
|
{renderMembers({
|
|
|
|
getPreferredBadge,
|
|
|
|
i18n,
|
|
|
|
members: droppedMembers,
|
|
|
|
prefix: droppedMembersKey,
|
|
|
|
theme,
|
|
|
|
})}
|
2020-12-01 23:45:39 +00:00
|
|
|
</>
|
2020-11-20 17:30:45 +00:00
|
|
|
)}
|
2021-03-03 20:09:58 +00:00
|
|
|
</GroupDialog>
|
2020-11-20 17:30:45 +00:00
|
|
|
);
|
2021-11-11 22:43:05 +00:00
|
|
|
});
|
2020-11-20 17:30:45 +00:00
|
|
|
|
2021-11-20 15:41:21 +00:00
|
|
|
function renderMembers({
|
|
|
|
getPreferredBadge,
|
|
|
|
i18n,
|
|
|
|
members,
|
|
|
|
prefix,
|
|
|
|
theme,
|
|
|
|
}: Readonly<{
|
|
|
|
getPreferredBadge: PreferredBadgeSelectorType;
|
|
|
|
i18n: LocalizerType;
|
|
|
|
members: Array<ConversationType>;
|
|
|
|
prefix: string;
|
|
|
|
theme: ThemeType;
|
|
|
|
}>): React.ReactNode {
|
2020-11-20 17:30:45 +00:00
|
|
|
if (!members.length) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const postfix = members.length === 1 ? '--one' : '--many';
|
|
|
|
const key = `${prefix}${postfix}`;
|
|
|
|
|
|
|
|
return (
|
2021-03-03 20:09:58 +00:00
|
|
|
<>
|
|
|
|
<GroupDialog.Paragraph>{i18n(key)}</GroupDialog.Paragraph>
|
2021-11-20 15:41:21 +00:00
|
|
|
<GroupDialog.Contacts
|
|
|
|
contacts={sortByTitle(members)}
|
|
|
|
getPreferredBadge={getPreferredBadge}
|
|
|
|
i18n={i18n}
|
|
|
|
theme={theme}
|
|
|
|
/>
|
2021-03-03 20:09:58 +00:00
|
|
|
</>
|
2020-11-20 17:30:45 +00:00
|
|
|
);
|
|
|
|
}
|