Skip to content

Commit

Permalink
feat(swc-plugins): Provide some UI (#55)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 authored Aug 27, 2024
1 parent 346e146 commit 4f667b2
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 148 deletions.
83 changes: 83 additions & 0 deletions apps/swc-plugins/app/(home)/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
"use client";

import { useState } from "react";

import { Button } from "@/components/ui/button";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { apiClient } from "@/lib/trpc/web-client";
import Link from "next/link";
import { useRouter } from "next/navigation";

export default function Home() {
const [runtimes] = apiClient.runtime.list.useSuspenseQuery();

const [selectedRuntime, setSelectedRuntime] = useState<bigint>();

return (
<div className="flex w-full max-w-md flex-col space-y-4">
<div className="flex space-x-4">
<Select onValueChange={(e) => setSelectedRuntime(BigInt(e))}>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Select runtime" />
</SelectTrigger>
<SelectContent>
{runtimes.map((runtime) => (
<SelectItem
key={runtime.id.toString()}
value={runtime.id.toString()}
>
{runtime.name}
</SelectItem>
))}
</SelectContent>
</Select>

{selectedRuntime && <VersionSelector runtimeId={selectedRuntime} />}
</div>
<div className="flex justify-center">
<Link href={`/versions/range`} passHref>
<Button
variant="secondary"
size="default"
className="whitespace-nowrap"
>
See all versions
</Button>
</Link>
</div>
</div>
);
}

function VersionSelector({ runtimeId }: { runtimeId: bigint }) {
const router = useRouter();
const versions = apiClient.runtime.listVersions.useQuery({
runtimeId,
});

return (
<Select
onValueChange={(e) => {
const selected = versions.data?.find((v) => v.version === e);
router.push(`/versions/range/${selected?.compatRangeId}`);
}}
>
<SelectTrigger className="w-[120px]">
<SelectValue placeholder="Version" />
</SelectTrigger>
<SelectContent>
{versions.data?.map((version) => (
<SelectItem key={version.version} value={version.version}>
{version.version}
</SelectItem>
))}
</SelectContent>
</Select>
);
}
32 changes: 0 additions & 32 deletions apps/swc-plugins/app/compat/core/[version]/page.tsx

This file was deleted.

7 changes: 6 additions & 1 deletion apps/swc-plugins/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Dynamic } from "@/components/dynamic";
import { Toaster } from "@/components/ui/toaster";
import { cn } from "@/lib/utils";
import { SessionProvider } from "next-auth/react";
Expand Down Expand Up @@ -28,7 +29,11 @@ export default function RootLayout({ children }: PropsWithChildren) {
<NextTopLoader color={"var(--colors-primary)"} />

<SessionProvider>
<ClientProviders>{children}</ClientProviders>
<ClientProviders>
<main className="flex h-screen w-full flex-col items-center justify-center align-middle">
<Dynamic>{children}</Dynamic>
</main>
</ClientProviders>
</SessionProvider>
<Toaster />
</body>
Expand Down
2 changes: 1 addition & 1 deletion apps/swc-plugins/app/loading.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export default function Loading() {
return (
<div className="bg-muted flex min-h-screen w-full items-center justify-center">
<div className="flex min-h-screen w-full items-center justify-center">
<div className="animate-pulse">Loading...</div>
</div>
);
Expand Down
113 changes: 0 additions & 113 deletions apps/swc-plugins/app/page.tsx

This file was deleted.

19 changes: 19 additions & 0 deletions apps/swc-plugins/app/versions/from-core/[version]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { createCaller } from "@/lib/server";
import { redirect } from "next/navigation";

export default async function Page({
params: { version },
}: {
params: { version: string };
}) {
const api = await createCaller();
const compatRange = await api.compatRange.byCoreVersion({
version,
});

if (compatRange) {
return redirect(`/compat/range/${compatRange.id}`);
}

return <div>No compat range found for swc_core@{version}</div>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export default async function Page() {
<ul>
{ranges.map((range) => (
<li key={range.id}>
<Link href={`/compat/range/${range.id}`}>
<Link href={`/versions/range/${range.id}`}>
<kbd>swc_core</kbd>@<kbd>{range.from}</kbd> -{" "}
<kbd>{range.to}</kbd>
</Link>
Expand Down
17 changes: 17 additions & 0 deletions apps/swc-plugins/components/dynamic.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"use client";

import { ReactNode, useEffect, useState } from "react";

export const Dynamic = ({ children }: { children: ReactNode }) => {
const [hasMounted, setHasMounted] = useState(false);

useEffect(() => {
setHasMounted(true);
}, []);

if (!hasMounted) {
return null;
}

return <>{children} </>;
};
2 changes: 2 additions & 0 deletions apps/swc-plugins/lib/api/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import { router } from "@/lib/base";

import { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
import { compatRangeRouter } from "./compatRange/router";
import { runtimeRouter } from "./runtimes/router";
import { userRouter } from "./users/router";

export const apiRouter = router({
users: userRouter,

runtime: runtimeRouter,
compatRange: compatRangeRouter,
});

Expand Down
54 changes: 54 additions & 0 deletions apps/swc-plugins/lib/api/runtimes/router.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { publicProcedure, router } from "@/lib/base";
import { db } from "@/lib/prisma";
import { z } from "zod";

export const runtimeRouter = router({
list: publicProcedure
.input(z.void())
.output(
z.array(
z.object({
id: z.bigint(),
name: z.string(),
})
)
)
.query(async () => {
const runtimes = await db.swcRuntime.findMany({
select: {
id: true,
name: true,
},
});

return runtimes;
}),

listVersions: publicProcedure
.input(
z.object({
runtimeId: z.bigint(),
})
)
.output(
z.array(
z.object({
version: z.string(),
compatRangeId: z.bigint(),
})
)
)
.query(async ({ input: { runtimeId } }) => {
const versions = await db.swcRuntimeVersion.findMany({
where: {
runtimeId,
},
select: {
version: true,
compatRangeId: true,
},
});

return versions;
}),
});

0 comments on commit 4f667b2

Please sign in to comment.