From 65314866369e802f12dd86b9877409cdf6dd8135 Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Thu, 29 Jul 2021 21:23:06 +0100
Subject: [PATCH] Handle additional side effects from events.

---
 src/mobx/index.ts           | 37 ++++++++++++++++++++++++++++++++++++-
 src/pages/invite/Invite.tsx | 31 +++++++++++++++++++++----------
 2 files changed, 57 insertions(+), 11 deletions(-)

diff --git a/src/mobx/index.ts b/src/mobx/index.ts
index 4ea148b..c5535ec 100644
--- a/src/mobx/index.ts
+++ b/src/mobx/index.ts
@@ -321,7 +321,7 @@ export class DataStore {
     }
 
     @action
-    packet(packet: ClientboundNotification) {
+    async packet(packet: ClientboundNotification) {
         switch (packet.type) {
             case "Ready": {
                 for (let user of packet.users) {
@@ -352,6 +352,12 @@ export class DataStore {
             }
             case "ChannelGroupJoin": {
                 this.channels.get(packet.id)?.groupJoin(packet.user);
+
+                if (!this.users.has(packet.user)) {
+                    let user = await this.client.users.fetch(packet.user);
+                    this.users.set(packet.user, new User(user));
+                }
+
                 break;
             }
             case "ChannelGroupLeave": {
@@ -375,6 +381,13 @@ export class DataStore {
                 break;
             }
             case "ServerDelete": {
+                let server = this.servers.get(packet.id);
+                if (server) {
+                    for (let channel of server.channels) {
+                        this.channels.delete(channel);
+                    }
+                }
+
                 this.servers.delete(packet.id);
                 break;
             }
@@ -385,10 +398,32 @@ export class DataStore {
             case "ServerMemberJoin": {
                 const _id = { server: packet.id, user: packet.user };
                 this.members.set(_id, new Member({ _id }));
+
+                if (!this.servers.has(packet.id)) {
+                    let server = await this.client.servers.fetch(packet.id);
+                    this.servers.set(packet.id, new Server(server));
+
+                    for (let id of server.channels) {
+                        let channel = this.client.channels.get(id);
+                        if (channel) {
+                            this.channels.set(id, new Channel(channel));
+                        }
+                    }
+                }
+
+                if (!this.users.has(packet.user)) {
+                    let user = await this.client.users.fetch(packet.user);
+                    this.users.set(packet.user, new User(user));
+                }
+
                 break;
             }
             case "ServerMemberLeave": {
                 this.members.delete({ server: packet.id, user: packet.user });
+                if (packet.user === this.client.user!._id) {
+                    await this.packet({ type: "ServerDelete", id: packet.id });
+                }
+
                 break;
             }
         }
diff --git a/src/pages/invite/Invite.tsx b/src/pages/invite/Invite.tsx
index b326ed3..d894932 100644
--- a/src/pages/invite/Invite.tsx
+++ b/src/pages/invite/Invite.tsx
@@ -1,12 +1,16 @@
 import { ArrowBack } from "@styled-icons/boxicons-regular";
+import { autorun } from "mobx";
+import { useStore } from "react-redux";
 import { useHistory, useParams } from "react-router-dom";
-import { Invites } from "revolt.js/dist/api/objects";
+import { Invites, Servers } from "revolt.js/dist/api/objects";
 
 import styles from "./Invite.module.scss";
 import { useContext, useEffect, useState } from "preact/hooks";
 
 import { defer } from "../../lib/defer";
 
+import { useData } from "../../mobx/State";
+
 import RequiresOnline from "../../context/revoltjs/RequiresOnline";
 import {
     AppContext,
@@ -22,6 +26,7 @@ import Overline from "../../components/ui/Overline";
 import Preloader from "../../components/ui/Preloader";
 
 export default function Invite() {
+    const store = useData();
     const history = useHistory();
     const client = useContext(AppContext);
     const status = useContext(StatusContext);
@@ -115,19 +120,25 @@ export default function Invite() {
                                                 `/server/${invite.server_id}/channel/${invite.channel_id}`,
                                             );
                                         }
-                                    }
 
-                                    const result = await client.joinInvite(
-                                        code,
-                                    );
-
-                                    if (result.type === "Server") {
-                                        defer(() => {
-                                            history.push(
-                                                `/server/${result.server._id}/channel/${result.channel._id}`,
+                                        const dispose = autorun(() => {
+                                            let server = store.servers.get(
+                                                invite.server_id,
                                             );
+
+                                            defer(() => {
+                                                if (server) {
+                                                    history.push(
+                                                        `/server/${server._id}/channel/${invite.channel_id}`,
+                                                    );
+                                                }
+                                            });
+
+                                            dispose();
                                         });
                                     }
+
+                                    await client.joinInvite(code);
                                 } catch (err) {
                                     setError(takeError(err));
                                     setProcessing(false);
-- 
GitLab