From 1e64cb9e7df5087857e5f27242c9401cb081fa66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 9 Oct 2024 19:40:55 -0500 Subject: [PATCH] feat: logins --- packages/core/src/blitz/fetchBlitz.ts | 2 +- .../website/src/components/PageWrapper.tsx | 4 +- .../components/Tankopedia/HistorySection.tsx | 2 +- .../src/pages/auth/[provider]/_index.tsx | 77 +++++++++++++++++++ .../src/pages/auth/[provider]/index.astro | 32 ++++++++ 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 packages/website/src/pages/auth/[provider]/_index.tsx create mode 100644 packages/website/src/pages/auth/[provider]/index.astro diff --git a/packages/core/src/blitz/fetchBlitz.ts b/packages/core/src/blitz/fetchBlitz.ts index cffaacc87..fb17c42ee 100644 --- a/packages/core/src/blitz/fetchBlitz.ts +++ b/packages/core/src/blitz/fetchBlitz.ts @@ -73,7 +73,7 @@ export function fetchBlitz( queue.push({ url: `https://api.wotblitz.${region}/wotb/${path}/?${Object.entries({ application_id: assertSecret( - process.env.PUBLIC_WARGAMING_APPLICATION_ID, + import.meta.env.PUBLIC_WARGAMING_APPLICATION_ID, ), ...params, }) diff --git a/packages/website/src/components/PageWrapper.tsx b/packages/website/src/components/PageWrapper.tsx index d9e021c2e..b1dfaffe9 100644 --- a/packages/website/src/components/PageWrapper.tsx +++ b/packages/website/src/components/PageWrapper.tsx @@ -11,6 +11,7 @@ type PageWrapperProps = FlexProps & { containerProps?: ComponentProps; noFlex1?: boolean; padding?: RadixSize; + noMinHeight?: boolean; }; export function PageWrapper({ @@ -21,6 +22,7 @@ export function PageWrapper({ noMaxWidth = false, noFlex1 = false, containerProps, + noMinHeight = false, padding = '4', ...props }: PageWrapperProps) { @@ -30,7 +32,7 @@ export function PageWrapper({ style={{ flex: noFlex1 ? undefined : 1, display: 'flex', - minHeight: `calc(100dvh - ${NAVBAR_HEIGHT}px)`, + minHeight: noMinHeight ? 'unset' : `calc(100dvh - ${NAVBAR_HEIGHT}px)`, flexDirection: 'column', ...containerProps?.style, }} diff --git a/packages/website/src/components/Tankopedia/HistorySection.tsx b/packages/website/src/components/Tankopedia/HistorySection.tsx index ab930b094..c77c15a86 100644 --- a/packages/website/src/components/Tankopedia/HistorySection.tsx +++ b/packages/website/src/components/Tankopedia/HistorySection.tsx @@ -8,7 +8,7 @@ export function HistorySection() { if (!tank.description) return null; return ( - + History of the {tank.name} {tank.description} diff --git a/packages/website/src/pages/auth/[provider]/_index.tsx b/packages/website/src/pages/auth/[provider]/_index.tsx new file mode 100644 index 000000000..f45c9bb39 --- /dev/null +++ b/packages/website/src/pages/auth/[provider]/_index.tsx @@ -0,0 +1,77 @@ +import { useEffect } from 'react'; +import { $patreonLogin } from '../../../stores/patreonLogin'; +import { $wargamingLogin } from '../../../stores/wargamingLogin'; + +export const AUTH_PROVIDERS = ['wargaming', 'patreon'] as const; + +type AuthProvider = (typeof AUTH_PROVIDERS)[number]; + +export const AUTH_PROVIDER_NAMES: Record = { + patreon: 'Patreon', + wargaming: 'Wargaming', +}; + +export interface PatreonAuthResponse { + access_token: string; + expires_in: number; + token_type: 'Bearer'; + scope: string; + refresh_token: string; + version: string; +} + +interface AuthorizeProps { + provider: AuthProvider; +} + +export function Authorize({ provider }: AuthorizeProps) { + useEffect(() => { + (async () => { + const searchParams = new URLSearchParams(window.location.search); + + switch (provider) { + case 'wargaming': { + if ( + !searchParams.has('expires_at') || + !searchParams.has('access_token') || + !searchParams.has('account_id') + ) { + break; + } + + $wargamingLogin.set({ + expires: `${Number(searchParams.get('expires_at')) * 1000}`, + token: searchParams.get('access_token')!, + id: searchParams.get('account_id')!, + }); + + break; + } + + case 'patreon': { + if (!searchParams.get('code')) break; + + const response = await fetch( + `/api/patreon/auth/${searchParams.get('code')}`, + ); + const data = (await response.json()) as PatreonAuthResponse; + + $patreonLogin.set({ + token: data.access_token, + refreshToken: data.refresh_token, + expires: `${Date.now() + data.expires_in * 1000}`, + }); + + break; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } + + window.location.href = searchParams.get('return') ?? '/'; + })(); + }, []); + + return null; +} diff --git a/packages/website/src/pages/auth/[provider]/index.astro b/packages/website/src/pages/auth/[provider]/index.astro new file mode 100644 index 000000000..b5c4435f1 --- /dev/null +++ b/packages/website/src/pages/auth/[provider]/index.astro @@ -0,0 +1,32 @@ +--- +import { Flex, Heading, Text } from '@radix-ui/themes'; +import type { GetStaticPaths } from 'astro'; +import { PageWrapper } from '../../../components/PageWrapper'; +import RootLayout from '../../../layouts/RootLayout.astro'; +import { AUTH_PROVIDERS, AUTH_PROVIDER_NAMES, Authorize } from './_index'; + +export const getStaticPaths = (() => { + return AUTH_PROVIDERS.map((provider) => ({ params: { provider } })); +}) satisfies GetStaticPaths; + +const { provider } = Astro.params; +--- + + + + + Authorizing you with {AUTH_PROVIDER_NAMES[provider]}... + You'll be on your way shortly. + + + + +