From 0259cb1e745359aef73808c1386ee8cc475f5ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jozef=20Steinh=C3=BCbl?= Date: Sat, 3 Aug 2024 14:42:34 +0200 Subject: [PATCH] feat: render dashboard fully on client --- apps/website/astro.config.ts | 24 +++++---- apps/website/auth.config.ts | 13 +---- apps/website/bun.lockb | Bin 354779 -> 362986 bytes apps/website/package.json | 2 + .../src/components/dashboard/UserInfo.astro | 23 ++++++++ apps/website/src/components/preact/Guild.tsx | 28 ++++++++++ .../src/components/preact/GuildSelector.tsx | 31 +++++++++++ .../src/components/preact/LoadingGuild.tsx | 9 ++++ apps/website/src/env.d.ts | 7 ++- apps/website/src/lib/guilds.ts | 30 +++++++---- apps/website/src/lib/user.ts | 9 ++++ apps/website/src/pages/api/user/guilds.ts | 20 +++---- apps/website/src/pages/api/user/index.ts | 21 -------- apps/website/src/pages/dashboard/index.astro | 50 ++---------------- 14 files changed, 153 insertions(+), 114 deletions(-) create mode 100644 apps/website/src/components/dashboard/UserInfo.astro create mode 100644 apps/website/src/components/preact/Guild.tsx create mode 100644 apps/website/src/components/preact/GuildSelector.tsx create mode 100644 apps/website/src/components/preact/LoadingGuild.tsx create mode 100644 apps/website/src/lib/user.ts delete mode 100644 apps/website/src/pages/api/user/index.ts diff --git a/apps/website/astro.config.ts b/apps/website/astro.config.ts index 709c4b4..80fe7d4 100644 --- a/apps/website/astro.config.ts +++ b/apps/website/astro.config.ts @@ -1,25 +1,27 @@ import path from "path"; import { fileURLToPath } from "url"; import { defineConfig } from "astro/config"; +import preact from "@astrojs/preact"; import sitemap from "@astrojs/sitemap"; import tailwind from "@astrojs/tailwind"; import cloudflare from "@astrojs/cloudflare"; import auth from "auth-astro"; + import { CONFIG } from "./src/config"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // https://astro.build/config export default defineConfig({ - site: CONFIG.origin, - integrations: [sitemap(), tailwind(), auth()], - output: "server", - adapter: cloudflare(), - vite: { - resolve: { - alias: { - "~": path.resolve(__dirname, "./src"), - }, - }, - }, + site: CONFIG.origin, + integrations: [sitemap(), tailwind(), auth(), preact()], + output: "server", + adapter: cloudflare(), + vite: { + resolve: { + alias: { + "~": path.resolve(__dirname, "./src"), + }, + }, + }, }); diff --git a/apps/website/auth.config.ts b/apps/website/auth.config.ts index dab32e6..389e7b6 100644 --- a/apps/website/auth.config.ts +++ b/apps/website/auth.config.ts @@ -29,17 +29,8 @@ export default defineConfig({ (session.user as unknown as User).global_name = token.global_name as string; - const guilds = await fetch( - "https://discord.com/api/v10/users/@me/guilds", - { - headers: { - Authorization: `Bearer ${token.accessToken as string}`, - "Cache-Control": "max-age=300", - }, - } - ); - - (session.user as unknown as User).guilds = await guilds.json(); + (session.user as unknown as User).discordAccessToken = + token.accessToken as string; } return session; diff --git a/apps/website/bun.lockb b/apps/website/bun.lockb index 6d5ea1dc806b7a72f78d3e42523dad70dbee22f4..26b57df09769adbfdffb398ffcf7a5a02a4edd51 100755 GIT binary patch delta 69187 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 delta 64324 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 diff --git a/apps/website/package.json b/apps/website/package.json index 6bd6730..2d0f437 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@astrojs/cloudflare": "^11.0.1", + "@astrojs/preact": "^3.5.1", "@astrojs/prefetch": "^0.2.1", "@astrojs/sitemap": "^3.1.6", "@astrojs/tailwind": "^5.1.0", @@ -19,6 +20,7 @@ "astro-google-fonts-optimizer": "^0.2.2", "astro-icon": "^0.8.0", "auth-astro": "^4.1.2", + "preact": "^10.23.1", "tailwindcss": "^3.3.1" }, "devDependencies": { diff --git a/apps/website/src/components/dashboard/UserInfo.astro b/apps/website/src/components/dashboard/UserInfo.astro new file mode 100644 index 0000000..273a362 --- /dev/null +++ b/apps/website/src/components/dashboard/UserInfo.astro @@ -0,0 +1,23 @@ +--- +import { Image } from "astro:assets"; +import { getUser } from "~/lib/user"; + +const user = await getUser(Astro.request); +if (!user) { + return Astro.redirect("/auth/login"); +} +--- + +
+ icon + +

+ @{user.name} +

+
diff --git a/apps/website/src/components/preact/Guild.tsx b/apps/website/src/components/preact/Guild.tsx new file mode 100644 index 0000000..08ef8d6 --- /dev/null +++ b/apps/website/src/components/preact/Guild.tsx @@ -0,0 +1,28 @@ +import type { Guild } from "~/env"; + +interface Props { + guild: Guild; + mutual: boolean; +} + +export default function Guild({ guild, mutual }: Props) { + return ( +
+
+ icon + +

{guild.name}

+
+
+ ); +} diff --git a/apps/website/src/components/preact/GuildSelector.tsx b/apps/website/src/components/preact/GuildSelector.tsx new file mode 100644 index 0000000..f9d89ee --- /dev/null +++ b/apps/website/src/components/preact/GuildSelector.tsx @@ -0,0 +1,31 @@ +import { Component } from "preact"; +import Guild from "./Guild"; +import LoadingGuild from "./LoadingGuild"; +import type { MutualeGuild } from "~/env"; + +interface State { + guilds: MutualeGuild[] | null; +} + +export default class GuildSelector extends Component<{}, State> { + constructor(props) { + super(props); + + this.state = { + guilds: null, + }; + } + + async componentDidMount() { + const response = await fetch("/api/user/guilds"); + const data = await response.json(); + this.setState({ guilds: data }); + } + + render() { + const { guilds } = this.state; + if (!guilds) return [...Array(15)].map(() => ); + + return guilds.map((g) => ); + } +} diff --git a/apps/website/src/components/preact/LoadingGuild.tsx b/apps/website/src/components/preact/LoadingGuild.tsx new file mode 100644 index 0000000..59e2a06 --- /dev/null +++ b/apps/website/src/components/preact/LoadingGuild.tsx @@ -0,0 +1,9 @@ +export default function LoadingGuild() { + return ( +
+
+
+
+
+ ); +} diff --git a/apps/website/src/env.d.ts b/apps/website/src/env.d.ts index 47ddad0..1bcd6b7 100644 --- a/apps/website/src/env.d.ts +++ b/apps/website/src/env.d.ts @@ -4,7 +4,7 @@ import type { User as AuthCoreUser } from "@auth/core/types"; export type User = AuthCoreUser & { global_name: string; - guilds: Guild[]; + discordAccessToken: string; }; export interface Guild { @@ -14,3 +14,8 @@ export interface Guild { permissions: string; owner: boolean; } + +export interface MutualeGuild { + mutual: boolean; + guild: Guild; +} diff --git a/apps/website/src/lib/guilds.ts b/apps/website/src/lib/guilds.ts index 6f4220a..5776160 100644 --- a/apps/website/src/lib/guilds.ts +++ b/apps/website/src/lib/guilds.ts @@ -1,20 +1,28 @@ -import type { Guild } from "~/env"; +import type { Guild, MutualeGuild, User } from "~/env"; + +export async function getUserGuilds(user: User): Promise { + const discordApiGuildsResponse = await fetch( + "https://discord.com/api/v10/users/@me/guilds", + { + headers: { + Authorization: `Bearer ${user.discordAccessToken as string}`, + "Cache-Control": "max-age=300", + }, + } + ); + + return (await discordApiGuildsResponse.json()) as Guild[]; +} // Checks if user has AMDINISTRATOR permissions in the guild -export async function filterUserGuilds(guilds: Guild[]): Promise< - { - mutual: boolean; - guild: Guild; - }[] -> { +export async function filterUserGuilds( + guilds: Guild[] +): Promise { const filtered = guilds .filter((g) => (BigInt(g.permissions) & 0x8n) == 0x8n) .sort((a, b) => Number(b.owner) - Number(a.owner)); - const result: { - mutual: boolean; - guild: Guild; - }[] = []; + const result: MutualeGuild[] = []; for (const guild of filtered) { const mutual = await isMutualGuild(guild); diff --git a/apps/website/src/lib/user.ts b/apps/website/src/lib/user.ts new file mode 100644 index 0000000..eae9165 --- /dev/null +++ b/apps/website/src/lib/user.ts @@ -0,0 +1,9 @@ +import { getSession } from "auth-astro/server"; +import type { User } from "~/env"; + +export async function getUser(req: Request): Promise { + const session = await getSession(req); + if (!session || !session.user) return null; + + return session.user as User; +} diff --git a/apps/website/src/pages/api/user/guilds.ts b/apps/website/src/pages/api/user/guilds.ts index 9f28f00..13a3a47 100644 --- a/apps/website/src/pages/api/user/guilds.ts +++ b/apps/website/src/pages/api/user/guilds.ts @@ -1,23 +1,17 @@ import type { APIRoute } from "astro"; -import { getSession } from "auth-astro/server"; -import type { User } from "~/env"; +import { filterUserGuilds, getUserGuilds } from "~/lib/guilds"; +import { getUser } from "~/lib/user"; export const GET: APIRoute = async ({ request }) => { - const session = await getSession(request); - if (!session || !session.user) { + const user = await getUser(request); + if (!user) { return new Response(null, { status: 401, }); } - const user = session.user as User; + const guilds = await getUserGuilds(user); + const res = await filterUserGuilds(guilds); - return Response.json( - user.guilds.map((g) => ({ - id: g.id, - name: g.name, - owner: g.owner, - permissions: g.permissions, - })) - ); + return Response.json(res); }; diff --git a/apps/website/src/pages/api/user/index.ts b/apps/website/src/pages/api/user/index.ts deleted file mode 100644 index 6736781..0000000 --- a/apps/website/src/pages/api/user/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { APIRoute } from "astro"; -import { getSession } from "auth-astro/server"; -import type { User } from "~/env"; - -export const GET: APIRoute = async ({ request }) => { - const session = await getSession(request); - if (!session || !session.user) { - return new Response(null, { - status: 401, - }); - } - - const user = session.user as User; - - return Response.json({ - id: user.id, - username: user.name, - global_name: user.global_name, - avatar_url: user.image, - }); -}; diff --git a/apps/website/src/pages/dashboard/index.astro b/apps/website/src/pages/dashboard/index.astro index 9a3baed..3165a2f 100644 --- a/apps/website/src/pages/dashboard/index.astro +++ b/apps/website/src/pages/dashboard/index.astro @@ -1,60 +1,18 @@ --- -import type { User } from "~/env"; -import { filterUserGuilds } from "~/lib/guilds"; -import { getSession } from "auth-astro/server"; import Layout from "~/layouts/Layout.astro"; import Container from "~/components/Container.astro"; -import { Image } from "astro:assets"; - -const session = await getSession(Astro.request); -if (!session || !session.user) { - return Astro.redirect("/auth/login"); -} - -const user = session.user as User; -const guilds = await filterUserGuilds(user.guilds); +import GuildSelector from "~/components/preact/GuildSelector"; +import UserInfo from "~/components/dashboard/UserInfo.astro"; --- -
- icon - -

- @{user.name} -

-
+
- { - guilds.map(({ guild, mutual }) => ( -
-
- icon - -

{guild.name}

-
-
- )) - } +