From 4921513e13ef26d63ab4f973a60c2e3b9c83cf66 Mon Sep 17 00:00:00 2001
From: Jorik Schellekens <joriksch@gmail.com>
Date: Thu, 10 Sep 2020 11:52:13 +0100
Subject: [PATCH] Automaitcally copy invite information

---
 src/clients/Weechat.tsx       | 11 +++++++++++
 src/clients/types.ts          |  1 +
 src/components/ClientTile.tsx | 11 ++++++++++-
 src/components/InviteTile.tsx |  1 +
 4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/clients/Weechat.tsx b/src/clients/Weechat.tsx
index e88dc24..a29c150 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 2df503b..cdaed27 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 7644782..ba3e57d 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 1311f9f..a35b2c7 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;
         }
-- 
GitLab