diff --git a/src/clients/Weechat.tsx b/src/clients/Weechat.tsx index e88dc24506e5136f5a366c6fca258257609440d6..a29c150d3d41c36a31b2f7feb233c3b05d59b095 100644 --- a/src/clients/Weechat.tsx +++ b/src/clients/Weechat.tsx @@ -57,6 +57,17 @@ const Weechat: TextClient = { return <span>Weechat doesn't support this kind of link</span>; } }, + copyString: (link) => { + switch (link.kind) { + case LinkKind.Alias: + case LinkKind.RoomId: + return `/join ${link.identifier}`; + case LinkKind.UserId: + return `/invite ${link.identifier}`; + default: + return ''; + } + }, description: 'Commandline Matrix interface using Weechat', }; diff --git a/src/clients/types.ts b/src/clients/types.ts index 2df503be8c9d45d782b437c51e7b737679673c51..cdaed2785dd5ce19106ca277e3ff99bf940fa9e7 100644 --- a/src/clients/types.ts +++ b/src/clients/types.ts @@ -81,6 +81,7 @@ export interface LinkedClient extends ClientDescription { export interface TextClient extends ClientDescription { kind: ClientKind.TEXT_CLIENT; toInviteString(parsedLink: SafeLink): JSX.Element; + copyString(parsedLink: SafeLink): string; } /* diff --git a/src/components/ClientTile.tsx b/src/components/ClientTile.tsx index 7644782c187f1500c598c4dbb63623cafdbf6c6b..ba3e57d24dd926a186271016d5853952a3be0bde 100644 --- a/src/components/ClientTile.tsx +++ b/src/components/ClientTile.tsx @@ -42,7 +42,16 @@ const ClientTile: React.FC<IProps> = ({ client, link }: IProps) => { const inviteButton = client.kind === ClientKind.LINKED_CLIENT ? ( <Button>Accept invite</Button> - ) : null; + ) : ( + <Button + onClick={() => + navigator.clipboard.writeText(client.copyString(link)) + } + flashChildren="Invite copied" + > + Copy invite + </Button> + ); let clientTile = ( <Tile className={className}> diff --git a/src/components/InviteTile.tsx b/src/components/InviteTile.tsx index 1311f9f39710d9c8f1b79c03123aea77a51740c1..a35b2c7472140166d894796c8184b6fea2965fea 100644 --- a/src/components/InviteTile.tsx +++ b/src/components/InviteTile.tsx @@ -61,6 +61,7 @@ const InviteTile: React.FC<IProps> = ({ children, client, link }: IProps) => { case ClientKind.TEXT_CLIENT: // TODO: copy to clipboard invite = <p>{client.toInviteString(link)}</p>; + navigator.clipboard.writeText(client.copyString(link)); inviteUseString = `These are instructions for ${client.name}.`; break; }