127 lines
3.2 KiB
TypeScript
127 lines
3.2 KiB
TypeScript
import type { FC } from '../../lib/teact/teact';
|
|
import { memo, useMemo } from '../../lib/teact/teact';
|
|
import { getActions } from '../../global';
|
|
|
|
import buildClassName from '../../util/buildClassName';
|
|
import { copyTextToClipboard } from '../../util/clipboard';
|
|
|
|
import useAppLayout from '../../hooks/useAppLayout';
|
|
import useLastCallback from '../../hooks/useLastCallback';
|
|
import useOldLang from '../../hooks/useOldLang';
|
|
|
|
import Button from '../ui/Button';
|
|
import DropdownMenu from '../ui/DropdownMenu';
|
|
import MenuItem from '../ui/MenuItem';
|
|
import Icon from './icons/Icon';
|
|
|
|
import styles from './LinkField.module.scss';
|
|
|
|
type OwnProps = {
|
|
title?: string;
|
|
link: string;
|
|
isDisabled?: boolean;
|
|
className?: string;
|
|
withShare?: boolean;
|
|
onRevoke?: VoidFunction;
|
|
};
|
|
|
|
const InviteLink: FC<OwnProps> = ({
|
|
title,
|
|
link,
|
|
isDisabled,
|
|
className,
|
|
withShare,
|
|
onRevoke,
|
|
}) => {
|
|
const lang = useOldLang();
|
|
const { showNotification, openChatWithDraft } = getActions();
|
|
|
|
const { isMobile } = useAppLayout();
|
|
|
|
const isOnlyCopy = !onRevoke;
|
|
|
|
const copyLink = useLastCallback(() => {
|
|
copyTextToClipboard(link);
|
|
showNotification({
|
|
message: {
|
|
key: 'LinkCopied',
|
|
},
|
|
});
|
|
});
|
|
|
|
const handleCopyClick = useLastCallback(() => {
|
|
if (isDisabled) return;
|
|
copyLink();
|
|
});
|
|
|
|
const handleShare = useLastCallback(() => {
|
|
openChatWithDraft({ text: { text: link } });
|
|
});
|
|
|
|
const PrimaryLinkMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {
|
|
return ({ onTrigger, isOpen }) => (
|
|
<Button
|
|
round
|
|
ripple={!isMobile}
|
|
size="smaller"
|
|
color="translucent"
|
|
className={isOpen ? 'active' : ''}
|
|
onClick={onTrigger}
|
|
ariaLabel={lang('AccDescrOpenMenu2')}
|
|
>
|
|
<Icon name="more" />
|
|
</Button>
|
|
);
|
|
}, [isMobile, lang]);
|
|
|
|
return (
|
|
<div className={className}>
|
|
<p className={styles.title}>
|
|
{lang(title || 'InviteLink.InviteLink')}
|
|
</p>
|
|
<div className={styles.primaryLink}>
|
|
<input
|
|
className={buildClassName('form-control', styles.input)}
|
|
value={link}
|
|
readOnly
|
|
onClick={handleCopyClick}
|
|
/>
|
|
{isOnlyCopy ? (
|
|
<Button
|
|
color="translucent"
|
|
className={styles.copy}
|
|
size="smaller"
|
|
round
|
|
disabled={isDisabled}
|
|
onClick={handleCopyClick}
|
|
>
|
|
<Icon name="copy" />
|
|
</Button>
|
|
) : (
|
|
<DropdownMenu
|
|
className={styles.moreMenu}
|
|
trigger={PrimaryLinkMenuButton}
|
|
positionX="right"
|
|
>
|
|
<MenuItem icon="copy" onClick={handleCopyClick} disabled={isDisabled}>{lang('Copy')}</MenuItem>
|
|
{onRevoke && (
|
|
<MenuItem icon="delete" onClick={onRevoke} destructive>{lang('RevokeButton')}</MenuItem>
|
|
)}
|
|
</DropdownMenu>
|
|
)}
|
|
</div>
|
|
{withShare && (
|
|
<Button
|
|
disabled={isDisabled}
|
|
onClick={handleShare}
|
|
className={styles.share}
|
|
>
|
|
{lang('FolderLinkScreen.LinkActionShare')}
|
|
</Button>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default memo(InviteLink);
|