Files
cinny/src/app/features/common-settings/general/RoomShareInvite.tsx
T

79 lines
2.6 KiB
TypeScript
Raw Normal View History

import React, { useCallback, useState } from 'react';
import { Box, Button, config, Icon, Icons, Text } from 'folds';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../../room-settings/styles.css';
import { SettingTile } from '../../../components/setting-tile';
import { CutoutCard } from '../../../components/cutout-card';
import { useMatrixClient } from '../../../hooks/useMatrixClient';
import { useRoom } from '../../../hooks/useRoom';
import { getMatrixToRoom } from '../../../plugins/matrix-to';
export function RoomShareInvite() {
const mx = useMatrixClient();
const room = useRoom();
const [copied, setCopied] = useState(false);
const domain = mx.getDomain() ?? undefined;
const inviteUrl = getMatrixToRoom(room.roomId, domain ? [domain] : undefined);
const qrSrc = `https://api.qrserver.com/v1/create-qr-code/?size=160x160&data=${encodeURIComponent(inviteUrl)}`;
const handleCopy = useCallback(() => {
navigator.clipboard.writeText(inviteUrl).then(() => {
setCopied(true);
setTimeout(() => setCopied(false), 2000);
});
}, [inviteUrl]);
return (
<SequenceCard
className={SequenceCardStyle}
variant="SurfaceVariant"
direction="Column"
gap="400"
>
<SettingTile
title="Share Room"
description="Share this invite link so others can join the room."
/>
<CutoutCard variant="Surface" style={{ padding: config.space.S300 }}>
<Box direction="Column" gap="300">
<Box gap="200" alignItems="Center">
<Box grow="Yes">
<Text
size="T200"
style={{
wordBreak: 'break-all',
userSelect: 'all',
}}
>
{inviteUrl}
</Text>
</Box>
<Box shrink="No">
<Button
size="300"
variant={copied ? 'Success' : 'Secondary'}
fill={copied ? 'Solid' : 'Soft'}
radii="300"
onClick={handleCopy}
before={<Icon size="100" src={copied ? Icons.Check : Icons.Link} />}
>
<Text size="B300">{copied ? 'Copied!' : 'Copy Link'}</Text>
</Button>
</Box>
</Box>
<Box justifyContent="Center">
<img
src={qrSrc}
alt="QR code for room invite link"
width={160}
height={160}
style={{ display: 'block', borderRadius: config.radii.R300 }}
/>
</Box>
</Box>
</CutoutCard>
</SequenceCard>
);
}