Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: website components #8600

Merged
merged 34 commits into from
Sep 6, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b216dc3
refactor: website components rewrite
iCrawl Sep 3, 2022
adcee1b
refactor: only build main and latest tag
iCrawl Sep 3, 2022
06edbab
refactor: accessibility
iCrawl Sep 3, 2022
bd18e01
feat: og title for specific pages
iCrawl Sep 3, 2022
29b53da
fix: file tracing
iCrawl Sep 3, 2022
53fcfe6
fix: include shiki theme
iCrawl Sep 3, 2022
9763454
refactor: package and version selection
iCrawl Sep 3, 2022
9ac5252
refactor: extract common components
iCrawl Sep 3, 2022
7628e25
refactor: only bundle whats needed from shiki
iCrawl Sep 3, 2022
4460c57
fix: general styling
iCrawl Sep 3, 2022
4a4a712
refactor: docs page
iCrawl Sep 3, 2022
3da8cd7
build: fix build
iCrawl Sep 3, 2022
11ae47d
fix: open handler for navbar
iCrawl Sep 3, 2022
29a43cc
fix: sidebars
iCrawl Sep 3, 2022
6ecd32e
refactor: back to unocss
iCrawl Sep 4, 2022
ce6a951
refactor: switch light theme of syntax highlighter
iCrawl Sep 4, 2022
fadfc7a
feat: prose for md
iCrawl Sep 4, 2022
d89b718
fix: several dark mode issues
iCrawl Sep 4, 2022
1bedead
feat: prettier plugin for tailwind css sorting
iCrawl Sep 4, 2022
fb35348
refactor: sidebar
iCrawl Sep 5, 2022
0d93971
fix: hover sidebar dark mode
iCrawl Sep 5, 2022
24b558f
refactor: table of contents sidebar
iCrawl Sep 5, 2022
fd8dd87
fix: scrollbar madness
iCrawl Sep 5, 2022
c75efe5
refactor: main content
iCrawl Sep 5, 2022
f8f193e
fix: various spacing issues
iCrawl Sep 5, 2022
ec4c57f
chore: build correct amount over versions only
iCrawl Sep 5, 2022
e746457
refactor: leftover mantine components
iCrawl Sep 6, 2022
76c9c54
fix: scrolling on header on mobile
iCrawl Sep 6, 2022
649ca3a
feat: redirect for stable
iCrawl Sep 6, 2022
870038e
refactor: finalize mantine removal
iCrawl Sep 6, 2022
fb903ac
fix: scrollbars
iCrawl Sep 6, 2022
0549604
refactor: package and version selector
iCrawl Sep 6, 2022
81f4a42
refactor: scrollbar for nav
iCrawl Sep 6, 2022
54d9155
fix: dont lock body
iCrawl Sep 6, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: redirect for stable
  • Loading branch information
iCrawl committed Sep 6, 2022
commit 649ca3a9d010ec65febfe406099ed2b039138b09
16 changes: 14 additions & 2 deletions packages/website/src/middleware.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
import { NextResponse, type NextRequest } from 'next/server';
import { PACKAGES } from './util/constants';

export default async function middleware(request: NextRequest) {
if (PACKAGES.some((pkg) => request.nextUrl.pathname.includes(pkg))) {
const packageName = /\/docs\/packages\/([^/]+)\/.*/.exec(request.nextUrl.pathname)?.[1] ?? 'builders';
const res = await fetch(`https://docs.discordjs.dev/api/info?package=${packageName}`);
const data: string[] = await res.json();

const latestVersion = data.at(-2);
return NextResponse.redirect(
new URL(request.nextUrl.pathname.replace('stable', latestVersion ?? 'main'), request.url),
);
}

export default function middleware(request: NextRequest) {
return NextResponse.redirect(new URL('/docs/packages', request.url));
}

export const config = {
matcher: ['/docs'],
matcher: ['/docs', '/docs/packages/:package/stable/:member*'],
};
14 changes: 13 additions & 1 deletion packages/website/src/pages/docs/[...slug].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
import { createApiModel } from '@discordjs/scripts';
import { ApiFunction, ApiItemKind, type ApiPackage } from '@microsoft/api-extractor-model';
import Head from 'next/head';
import { useRouter } from 'next/router';
import type { GetStaticPaths, GetStaticProps } from 'next/types';
import { MDXRemote } from 'next-mdx-remote';
import { serialize } from 'next-mdx-remote/serialize';
Expand Down Expand Up @@ -124,7 +125,13 @@ export const getStaticPaths: GetStaticPaths = async () => {
};

export const getStaticProps: GetStaticProps = async ({ params }) => {
const [, packageName = 'builders', branchName = 'main', member] = params!.slug as string[];
const [path, packageName = 'builders', branchName = 'main', member] = params!.slug as string[];

if (path !== 'packages' || !PACKAGES.includes(packageName)) {
return {
notFound: true,
};
}

const [memberName, overloadIndex] = member?.split(':') ?? [];

Expand Down Expand Up @@ -235,6 +242,7 @@ const member = (props?: ApiItemJSON | undefined) => {
};

export default function SlugPage(props: Partial<SidebarLayoutProps & { error?: string }>) {
const router = useRouter();
const name = useMemo(
() => `discord.js${props.data?.member?.name ? ` | ${props.data.member.name}` : ''}`,
[props.data?.member?.name],
Expand All @@ -244,6 +252,10 @@ export default function SlugPage(props: Partial<SidebarLayoutProps & { error?: s
[props.packageName, props.data?.member?.name],
);

if (router.isFallback) {
return null;
}

// Just in case
// return <iframe src="https://discord.js.org" style={{ border: 0, height: '100%', width: '100%' }}></iframe>;

Expand Down
17 changes: 9 additions & 8 deletions packages/website/src/pages/docs/packages/[package]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,21 @@ export const getStaticPaths: GetStaticPaths = () => {
};

export const getStaticProps: GetStaticProps = async ({ params }) => {
const packageName = params!.package as string | undefined;
const packageName = params!.package as string;

if (!PACKAGES.includes(packageName)) {
return {
notFound: true,
};
}

try {
const res = await fetch(`https://docs.discordjs.dev/api/info?package=${packageName ?? 'builders'}`);
const res = await fetch(`https://docs.discordjs.dev/api/info?package=${packageName}`);
const data: string[] = await res.json();

if (!data.length) {
console.error('No tags');

return {
props: {
error: 'No tags',
},
revalidate: 3_600,
notFound: true,
};
}

Expand Down
88 changes: 58 additions & 30 deletions packages/website/src/pages/docs/packages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,53 +1,81 @@
import { Button } from 'ariakit/button';
import Link from 'next/link';
import { useRouter } from 'next/router';
import type { MouseEvent } from 'react';
import type { GetStaticProps } from 'next/types';
import { useCallback, type MouseEvent } from 'react';
import { VscArrowRight, VscPackage } from 'react-icons/vsc';
import { PACKAGES } from '~/util/constants';

export default function PackagesRoute() {
export const getStaticProps: GetStaticProps = async () => {
try {
const versions = await Promise.all(
PACKAGES.map(async (pkg) => {
const response = await fetch(`https://docs.discordjs.dev/api/info?package=${pkg}`);
const versions = await response.json();
const latestVersion = versions.at(-2);
return { packageName: pkg, version: latestVersion };
}),
);

return {
props: {
versions,
},
revalidate: 3_600,
};
} catch (error_) {
const error = error_ as Error;
console.error(error);

return {
props: {
error: error_,
},
revalidate: 3_600,
};
}
};

export default function PackagesRoute(props: { versions: { packageName: string; version: string }[] }) {
const router = useRouter();
const findLatestVersion = useCallback(
(pkg: string) => props.versions.find((version) => version.packageName === pkg),
[props.versions],
);

const handleClick = async (ev: MouseEvent<HTMLDivElement>, packageName: string) => {
ev.stopPropagation();

const res = await fetch(`https://docs.discordjs.dev/api/info?package=${packageName ?? 'builders'}`);
const data: string[] = await res.json();

const latestVersion = data.at(-2);
void router.push(`/docs/packages/${packageName}/${latestVersion}`);
void router.push(`/docs/packages/${packageName}`);
};

return (
<div className="min-w-xs sm:w-md mx-auto flex h-full flex-row place-content-center place-items-center gap-8 py-0 px-4 lg:py-0 lg:px-6">
<div className="flex grow flex-col place-content-center gap-4">
<h1 className="text-2xl font-semibold">Select a package:</h1>
{PACKAGES.map((pkg) => (
<Button
key={pkg}
as="div"
className="dark:bg-dark-400 dark:border-dark-100 dark:hover:bg-dark-300 dark:active:bg-dark-200 flex h-11 transform-gpu cursor-pointer select-none appearance-none place-content-center rounded border border-neutral-300 bg-transparent p-4 text-base font-semibold leading-none text-black hover:bg-neutral-100 active:translate-y-px active:bg-neutral-200 dark:text-white"
role="link"
onClick={(ev: MouseEvent<HTMLDivElement>) => void handleClick(ev, pkg)}
>
<div className="flex flex-row place-content-between place-items-center gap-4">
<Link key={pkg} href={`/docs/packages/${pkg}/${findLatestVersion(pkg)?.version ?? 'main'}`} prefetch={false}>
<a className="dark:bg-dark-400 dark:border-dark-100 dark:hover:bg-dark-300 dark:active:bg-dark-200 flex h-11 transform-gpu cursor-pointer select-none appearance-none place-content-between rounded border border-neutral-300 bg-transparent p-4 text-base font-semibold leading-none text-black hover:bg-neutral-100 active:translate-y-px active:bg-neutral-200 dark:text-white">
<div className="flex grow flex-row place-content-between place-items-center gap-4">
<div className="flex flex-row place-content-between place-items-center gap-4">
<VscPackage size={25} />
<h2 className="font-semibold">{pkg}</h2>
<div className="flex grow flex-row place-content-between place-items-center gap-4">
<div className="flex flex-row place-content-between place-items-center gap-4">
<VscPackage size={25} />
<h2 className="font-semibold">{pkg}</h2>
</div>
<Link href={`/docs/packages/${pkg}`} prefetch={false}>
<Button
as="div"
role="link"
className="bg-blurple flex h-6 transform-gpu cursor-pointer select-none appearance-none place-content-center place-items-center rounded border-0 px-2 text-xs font-semibold leading-none text-white active:translate-y-px"
onClick={async (ev: MouseEvent<HTMLDivElement>) => handleClick(ev, pkg)}
>
Select version
</Button>
</Link>
</div>
<Link href={`/docs/packages/${pkg}`} prefetch={false}>
<a
className="bg-blurple flex h-6 transform-gpu cursor-pointer select-none appearance-none place-items-center rounded border-0 px-2 text-xs font-semibold leading-none text-white active:translate-y-px"
onClick={(ev: MouseEvent<HTMLAnchorElement>) => ev.stopPropagation()}
>
Select version
</a>
</Link>
<VscArrowRight size={20} />
</div>
<VscArrowRight size={20} />
</div>
</Button>
</a>
</Link>
))}
</div>
</div>
Expand Down