Support for creating New Groups
This commit is contained in:
parent
1934120e46
commit
5de4babc0d
56 changed files with 6222 additions and 526 deletions
120
ts/components/GroupDialog.tsx
Normal file
120
ts/components/GroupDialog.tsx
Normal file
|
@ -0,0 +1,120 @@
|
|||
// Copyright 2021 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import React, { ReactChild, ReactNode } from 'react';
|
||||
|
||||
import { LocalizerType } from '../types/Util';
|
||||
import { ConversationType } from '../state/ducks/conversations';
|
||||
import { ModalHost } from './ModalHost';
|
||||
import { Button, ButtonVariant } from './Button';
|
||||
import { Avatar, AvatarSize } from './Avatar';
|
||||
import { ContactName } from './conversation/ContactName';
|
||||
|
||||
type PropsType = {
|
||||
children: ReactNode;
|
||||
i18n: LocalizerType;
|
||||
onClickPrimaryButton: () => void;
|
||||
onClose: () => void;
|
||||
primaryButtonText: string;
|
||||
title: string;
|
||||
} & (
|
||||
| // We use this empty type for an "all or nothing" setup.
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||
{}
|
||||
| {
|
||||
onClickSecondaryButton: () => void;
|
||||
secondaryButtonText: string;
|
||||
}
|
||||
);
|
||||
|
||||
export function GroupDialog(props: Readonly<PropsType>): JSX.Element {
|
||||
const {
|
||||
children,
|
||||
i18n,
|
||||
onClickPrimaryButton,
|
||||
onClose,
|
||||
primaryButtonText,
|
||||
title,
|
||||
} = props;
|
||||
|
||||
let secondaryButton: undefined | ReactChild;
|
||||
if ('secondaryButtonText' in props) {
|
||||
const { onClickSecondaryButton, secondaryButtonText } = props;
|
||||
secondaryButton = (
|
||||
<Button
|
||||
onClick={onClickSecondaryButton}
|
||||
variant={ButtonVariant.Secondary}
|
||||
>
|
||||
{secondaryButtonText}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<ModalHost onClose={onClose}>
|
||||
<div className="module-GroupDialog">
|
||||
<button
|
||||
aria-label={i18n('close')}
|
||||
type="button"
|
||||
className="module-GroupDialog__close-button"
|
||||
onClick={() => {
|
||||
onClose();
|
||||
}}
|
||||
/>
|
||||
<h1 className="module-GroupDialog__title">{title}</h1>
|
||||
<div className="module-GroupDialog__body">{children}</div>
|
||||
<div className="module-GroupDialog__button-container">
|
||||
{secondaryButton}
|
||||
<Button
|
||||
onClick={onClickPrimaryButton}
|
||||
ref={focusRef}
|
||||
variant={ButtonVariant.Primary}
|
||||
>
|
||||
{primaryButtonText}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</ModalHost>
|
||||
);
|
||||
}
|
||||
|
||||
type ParagraphPropsType = {
|
||||
children: ReactNode;
|
||||
};
|
||||
|
||||
GroupDialog.Paragraph = ({
|
||||
children,
|
||||
}: Readonly<ParagraphPropsType>): JSX.Element => (
|
||||
<p className="module-GroupDialog__paragraph">{children}</p>
|
||||
);
|
||||
|
||||
type ContactsPropsType = {
|
||||
contacts: Array<ConversationType>;
|
||||
i18n: LocalizerType;
|
||||
};
|
||||
|
||||
GroupDialog.Contacts = ({ contacts, i18n }: Readonly<ContactsPropsType>) => (
|
||||
<ul className="module-GroupDialog__contacts">
|
||||
{contacts.map(contact => (
|
||||
<li key={contact.id} className="module-GroupDialog__contacts__contact">
|
||||
<Avatar
|
||||
{...contact}
|
||||
conversationType={contact.type}
|
||||
size={AvatarSize.TWENTY_EIGHT}
|
||||
i18n={i18n}
|
||||
/>
|
||||
<ContactName
|
||||
i18n={i18n}
|
||||
module="module-GroupDialog__contacts__contact__name"
|
||||
title={contact.title}
|
||||
/>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
||||
function focusRef(el: HTMLElement | null) {
|
||||
if (el) {
|
||||
el.focus();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue