From 4f1d357b5b3ff82f32fc70d0b7debff9dd747dcf Mon Sep 17 00:00:00 2001
From: abias <abias1122@gmail.com>
Date: Tue, 16 May 2023 20:34:15 -0400
Subject: [PATCH] Refactor how error data is passed from server to client

---
 src/server/index.tsx                         | 10 ++++++----
 src/shared/components/app/error-page.tsx     | 15 ++-------------
 src/shared/components/common/error-guard.tsx |  8 +++-----
 src/shared/interfaces.ts                     |  2 ++
 src/shared/utils.ts                          |  1 -
 5 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/src/server/index.tsx b/src/server/index.tsx
index 746c962..c8099cc 100644
--- a/src/server/index.tsx
+++ b/src/server/index.tsx
@@ -130,6 +130,7 @@ server.get("/*", async (req, res) => {
     // in order to remove the jwt on the browser. Necessary for wrong jwts
     let site: GetSiteResponse | undefined = undefined;
     let routeData: any[] = [];
+    let errorPageData: ErrorPageData | undefined;
     try {
       let try_site: any = await client.getSite(getSiteForm);
       if (try_site.error == "not_logged_in") {
@@ -165,7 +166,7 @@ server.get("/*", async (req, res) => {
         }
       }
     } catch (error) {
-      routeData = getErrorRouteData(error, site);
+      errorPageData = getErrorRouteData(error, site);
     }
 
     // Redirect to the 404 if there's an API error
@@ -175,7 +176,7 @@ server.get("/*", async (req, res) => {
       if (error === "instance_is_private") {
         return res.redirect(`/signup`);
       } else {
-        routeData = getErrorRouteData(error, site);
+        errorPageData = getErrorRouteData(error, site);
       }
     }
 
@@ -183,6 +184,7 @@ server.get("/*", async (req, res) => {
       path,
       site_res: site,
       routeData,
+      errorPageData,
     };
 
     const wrapper = (
@@ -293,7 +295,7 @@ async function fetchIconPng(iconUrl: string) {
 }
 
 function getErrorRouteData(error: string, site?: GetSiteResponse) {
-  const errorPageData: ErrorPageData = { type: "error" };
+  const errorPageData: ErrorPageData = {};
 
   // Exact error should only be seen in a development environment. Users
   // in production will get a more generic message.
@@ -308,7 +310,7 @@ function getErrorRouteData(error: string, site?: GetSiteResponse) {
     errorPageData.adminMatrixIds = adminMatrixIds;
   }
 
-  return [errorPageData];
+  return errorPageData;
 }
 
 async function createSsrHtml(root: string, isoData: IsoDataOptionalSite) {
diff --git a/src/shared/components/app/error-page.tsx b/src/shared/components/app/error-page.tsx
index 7c7bfce..12472dd 100644
--- a/src/shared/components/app/error-page.tsx
+++ b/src/shared/components/app/error-page.tsx
@@ -1,7 +1,7 @@
 import { Component } from "inferno";
 import { Link } from "inferno-router";
 import { IsoDataOptionalSite } from "shared/interfaces";
-import { ErrorPageData, setIsoData } from "../../utils";
+import { setIsoData } from "../../utils";
 
 export class ErrorPage extends Component<any, any> {
   private isoData: IsoDataOptionalSite = setIsoData(this.context);
@@ -11,7 +11,7 @@ export class ErrorPage extends Component<any, any> {
   }
 
   render() {
-    const errorPageData = this.getErrorPageData();
+    const { errorPageData } = this.isoData;
 
     return (
       <div className="container-lg text-center">
@@ -65,15 +65,4 @@ export class ErrorPage extends Component<any, any> {
       </div>
     );
   }
-
-  private getErrorPageData() {
-    const errorPageData = this.isoData.routeData[0] as
-      | ErrorPageData
-      | undefined;
-    if (errorPageData?.type === "error") {
-      return errorPageData;
-    }
-
-    return undefined;
-  }
 }
diff --git a/src/shared/components/common/error-guard.tsx b/src/shared/components/common/error-guard.tsx
index db7f578..3012154 100644
--- a/src/shared/components/common/error-guard.tsx
+++ b/src/shared/components/common/error-guard.tsx
@@ -1,5 +1,5 @@
 import { Component } from "inferno";
-import { ErrorPageData, setIsoData } from "../../utils";
+import { setIsoData } from "../../utils";
 import { ErrorPage } from "../app/error-page";
 
 class ErrorGuard extends Component<any, any> {
@@ -10,12 +10,10 @@ class ErrorGuard extends Component<any, any> {
   }
 
   render() {
-    const errorPageData = this.isoData.routeData[0] as
-      | ErrorPageData
-      | undefined;
+    const errorPageData = this.isoData.errorPageData;
     const siteRes = this.isoData.site_res;
 
-    if (errorPageData?.type === "error" || !siteRes) {
+    if (errorPageData || !siteRes) {
       return <ErrorPage />;
     } else {
       return this.props.children;
diff --git a/src/shared/interfaces.ts b/src/shared/interfaces.ts
index fe8a79d..a6b2ae4 100644
--- a/src/shared/interfaces.ts
+++ b/src/shared/interfaces.ts
@@ -1,5 +1,6 @@
 import { CommentView, GetSiteResponse, LemmyHttp } from "lemmy-js-client";
 import type { ParsedQs } from "qs";
+import { ErrorPageData } from "./utils";
 
 /**
  * This contains serialized data, it needs to be deserialized before use.
@@ -8,6 +9,7 @@ export interface IsoData {
   path: string;
   routeData: any[];
   site_res: GetSiteResponse;
+  errorPageData?: ErrorPageData;
 }
 
 export type IsoDataOptionalSite = Partial<IsoData> &
diff --git a/src/shared/utils.ts b/src/shared/utils.ts
index 54002ec..c405fc5 100644
--- a/src/shared/utils.ts
+++ b/src/shared/utils.ts
@@ -106,7 +106,6 @@ export type ThemeColor =
   | "gray-dark";
 
 export interface ErrorPageData {
-  type: "error";
   error?: string;
   adminMatrixIds?: string[];
 }
-- 
2.44.1