From 95a576bd2177129f046db2ca9491c245d9d2f05b Mon Sep 17 00:00:00 2001
From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com>
Date: Sat, 7 Nov 2020 16:59:40 +0200
Subject: [PATCH] profile use swr
---
package-lock.json | 21 +++++++++++++++++++++
package.json | 1 +
pages/_app.tsx | 1 +
pages/u/[identifier].tsx | 22 ++++++++++++++--------
scenes/Layout/index.tsx | 22 +++++++++++++++++++---
5 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5e96ef287..8317cee6f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "sendou.ink",
"version": "1.0.0",
+ "license": "MIT",
"dependencies": {
"@apollo/client": "^3.2.5",
"@chakra-ui/core": "^1.0.0-rc.8",
@@ -33,6 +34,7 @@
"react-icons": "^3.11.0",
"react-markdown": "^5.0.2",
"react-string-replace": "^0.4.4",
+ "swr": "^0.3.8",
"zod": "^1.11.10"
},
"devDependencies": {
@@ -14877,6 +14879,17 @@
"node": ">=8"
}
},
+ "node_modules/swr": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-0.3.8.tgz",
+ "integrity": "sha512-EHRlaqoBtHsB2wOB+dQJ74DrZvaRGu4BaIQrhkD+/rj8/UGo2iQXN+rCcYnV7/VAreBJBmm9+lDkwZmUqWEkKA==",
+ "dependencies": {
+ "dequal": "2.0.2"
+ },
+ "peerDependencies": {
+ "react": "^16.11.0 || ^17.0.0"
+ }
+ },
"node_modules/symbol-observable": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
@@ -29278,6 +29291,14 @@
"has-flag": "^4.0.0"
}
},
+ "swr": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-0.3.8.tgz",
+ "integrity": "sha512-EHRlaqoBtHsB2wOB+dQJ74DrZvaRGu4BaIQrhkD+/rj8/UGo2iQXN+rCcYnV7/VAreBJBmm9+lDkwZmUqWEkKA==",
+ "requires": {
+ "dequal": "2.0.2"
+ }
+ },
"symbol-observable": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
diff --git a/package.json b/package.json
index 8df5d2a56..51da04f55 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,7 @@
"react-icons": "^3.11.0",
"react-markdown": "^5.0.2",
"react-string-replace": "^0.4.4",
+ "swr": "^0.3.8",
"zod": "^1.11.10"
},
"devDependencies": {
diff --git a/pages/_app.tsx b/pages/_app.tsx
index d18510c4f..d03d4be8a 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -96,6 +96,7 @@ const MyApp = (props: AppProps) => {
+
diff --git a/pages/u/[identifier].tsx b/pages/u/[identifier].tsx
index 635fb2dbc..1a68b7d2e 100644
--- a/pages/u/[identifier].tsx
+++ b/pages/u/[identifier].tsx
@@ -10,8 +10,9 @@ import {
getUserByIdentifier,
GetUserByIdentifierData,
} from "prisma/queries/getUserByIdentifier";
-import { useEffect, useState } from "react";
+import { useState } from "react";
import AvatarWithInfo from "scenes/Profile/components/AvatarWithInfo";
+import useSWR from "swr";
const prisma = new PrismaClient();
@@ -36,7 +37,7 @@ interface Props {
}
export const getStaticProps: GetStaticProps = async ({ params }) => {
- const user = await getUserByIdentifier(prisma, "tester");
+ const user = await getUserByIdentifier(prisma, params!.identifier as string);
//const isCustomUrl = isNaN(Number(params!.identifier))
@@ -51,17 +52,22 @@ export const getStaticProps: GetStaticProps = async ({ params }) => {
};
const ProfilePage = (props: Props) => {
- const [user, setUser] = useState(props.user);
const [showModal, setShowModal] = useState(false);
- useEffect(() => {
- setUser(user);
- }, [user]);
-
const [loggedInUser] = useUser();
+ const { data: user, mutate } = useSWR(
+ () => {
+ // no need to load user if it's not the same as currently logged in user
+ const userId = props.user?.id;
+ if (!!userId && userId === loggedInUser?.id) return null;
+
+ return `/api/users/${userId}`;
+ },
+ { initialData: props.user }
+ );
// same as router.isFallback
- // FIXME: return null
+ // FIXME: return spinner
if (!user) return null;
return (
diff --git a/scenes/Layout/index.tsx b/scenes/Layout/index.tsx
index b93c8a457..d19859865 100644
--- a/scenes/Layout/index.tsx
+++ b/scenes/Layout/index.tsx
@@ -1,6 +1,9 @@
-import { Container, Flex } from "@chakra-ui/core";
+import { Container, Flex, useToast } from "@chakra-ui/core";
+import { t } from "@lingui/macro";
+import { getToastOptions } from "lib/getToastOptions";
import { AppProps } from "next/app";
import { useRouter } from "next/dist/client/router";
+import { SWRConfig } from "swr";
import Footer from "./components/Footer";
import IconNavBar from "./components/IconNavBar";
import TopNav from "./components/TopNav";
@@ -14,10 +17,23 @@ const PAGES_WITH_WIDE_CONTAINER = [
];
const Layout = ({ Component, pageProps }: AppProps) => {
+ const toast = useToast();
const pathname = useRouter().pathname;
return (
- <>
+
+ fetch(resource, init).then((res) => res.json()),
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ onError: (error) => {
+ toast(
+ getToastOptions(error.message ?? t`An error occurred`, "error")
+ );
+ },
+ }}
+ >
@@ -30,7 +46,7 @@ const Layout = ({ Component, pageProps }: AppProps) => {
- >
+
);
};