From 8ad110f73b6e57c47e4cd4abac76ccb55accfb0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:30:06 -0500 Subject: [PATCH] test --- packages/i18n/strings/en.json | 3 +- .../website-ue/src/components/ApiEntry.astro | 35 ++++++++++ .../website-ue/src/components/ApiGroup.astro | 31 +-------- .../src/components/ApiTester/index.module.css | 11 ++++ .../src/components/ApiTester/index.tsx | 66 +++++++++++++++++++ .../src/components/Section/index.tsx | 2 +- packages/website-ue/src/hooks/useLocale.tsx | 2 +- .../src/pages/api/avatars/[id].json.ts | 5 +- 8 files changed, 122 insertions(+), 33 deletions(-) create mode 100644 packages/website-ue/src/components/ApiEntry.astro create mode 100644 packages/website-ue/src/components/ApiTester/index.module.css create mode 100644 packages/website-ue/src/components/ApiTester/index.tsx diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index ffecd6cd3..c2d2587c3 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -121,6 +121,7 @@ "json": "JSON methods", "pb": "Protocol Buffer methods", "media": "Media methods", - "no_docs": "This method has no documentation." + "no_docs": "This method has no documentation.", + "test": "Test" } } diff --git a/packages/website-ue/src/components/ApiEntry.astro b/packages/website-ue/src/components/ApiEntry.astro new file mode 100644 index 000000000..1a3d6c447 --- /dev/null +++ b/packages/website-ue/src/components/ApiEntry.astro @@ -0,0 +1,35 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { api } from "../core/api/dynamic"; +import { ApiTester } from "./ApiTester"; +import { Code } from "./Code"; +import { Heading } from "./Heading"; +import { MarkdownCustom } from "./MarkdownCustom"; + +interface Props { + locale: string; + api: CollectionEntry<"api">; +} + +const { locale, api: apiData } = Astro.props; +const strings = await api.strings(locale); +const hasSlugs = apiData.id.includes("["); +--- + + + +
+ + {apiData.id} + + + + + +
diff --git a/packages/website-ue/src/components/ApiGroup.astro b/packages/website-ue/src/components/ApiGroup.astro index 7e8b9ff8b..c795061a7 100644 --- a/packages/website-ue/src/components/ApiGroup.astro +++ b/packages/website-ue/src/components/ApiGroup.astro @@ -1,9 +1,6 @@ --- import type { CollectionEntry } from "astro:content"; -import { api } from "../core/api/dynamic"; -import { Code } from "./Code"; -import { Heading } from "./Heading"; -import { MarkdownCustom } from "./MarkdownCustom"; +import ApiEntry from "./ApiEntry.astro"; interface Props { locale: string; @@ -11,34 +8,10 @@ interface Props { } const { apis, locale } = Astro.props; -const strings = await api.strings(locale); --- - - { apis .sort((a, b) => a.id.localeCompare(b.id)) - .map((api) => ( -
- - {api.id} - - - -
- )) + .map((api) => ) } diff --git a/packages/website-ue/src/components/ApiTester/index.module.css b/packages/website-ue/src/components/ApiTester/index.module.css new file mode 100644 index 000000000..039b69a69 --- /dev/null +++ b/packages/website-ue/src/components/ApiTester/index.module.css @@ -0,0 +1,11 @@ +.tester { + display: flex; + align-items: center; + gap: var(--space-4); + + .slug { + display: flex; + align-items: center; + gap: var(--space-3); + } +} diff --git a/packages/website-ue/src/components/ApiTester/index.tsx b/packages/website-ue/src/components/ApiTester/index.tsx new file mode 100644 index 000000000..70a43512f --- /dev/null +++ b/packages/website-ue/src/components/ApiTester/index.tsx @@ -0,0 +1,66 @@ +import { useState } from "react"; +import { + LocaleProvider, + type LocaleAcceptorProps, +} from "../../hooks/useLocale"; +import { useStrings } from "../../hooks/useStrings"; +import { Button } from "../Button"; +import { Link } from "../Link"; +import { TextField } from "../TextField"; +import styles from "./index.module.css"; + +interface Props { + path: string; +} + +const slugPattern = /\[\w+\]/g; + +function Content({ path }: Props) { + const strings = useStrings(); + + const slugs = (path.match(slugPattern) ?? []).map((slug) => + slug.slice(1, -1), + ); + const [values, setValues] = useState(() => { + const values: Record = {}; + + for (const slug of slugs) { + values[slug] = ""; + } + + return values; + }); + + const href = Object.entries(values).reduce( + (href, [slug, value]) => href.replace(`[${slug}]`, value), + `/api/${path}`, + ); + + return ( +
+ {slugs.map((slug) => ( +
+ {slug}:{" "} + { + setValues((state) => ({ ...state, [slug]: event.target.value })); + }} + /> +
+ ))} + + + + +
+ ); +} + +export function ApiTester({ path, locale }: Props & LocaleAcceptorProps) { + return ( + + + + ); +} diff --git a/packages/website-ue/src/components/Section/index.tsx b/packages/website-ue/src/components/Section/index.tsx index 6776d44e9..4566a535c 100644 --- a/packages/website-ue/src/components/Section/index.tsx +++ b/packages/website-ue/src/components/Section/index.tsx @@ -5,7 +5,7 @@ import styles from "./index.module.css"; export interface SectionProps extends ComponentProps<"div"> { first?: boolean; - gap: Space; + gap?: Space; } export function Section({ diff --git a/packages/website-ue/src/hooks/useLocale.tsx b/packages/website-ue/src/hooks/useLocale.tsx index 7d6b7c839..4fcff19b2 100644 --- a/packages/website-ue/src/hooks/useLocale.tsx +++ b/packages/website-ue/src/hooks/useLocale.tsx @@ -28,5 +28,5 @@ export function useLocale() { } export interface LocaleAcceptorProps { - locale: string | undefined; + locale: string; } diff --git a/packages/website-ue/src/pages/api/avatars/[id].json.ts b/packages/website-ue/src/pages/api/avatars/[id].json.ts index aaa2de685..342b8d0d7 100644 --- a/packages/website-ue/src/pages/api/avatars/[id].json.ts +++ b/packages/website-ue/src/pages/api/avatars/[id].json.ts @@ -10,7 +10,10 @@ export const getStaticPaths = (async () => { }) satisfies GetStaticPaths; /** - * Returns data on an avatar based on its id. @see avatars/list.json for a list of all avatar ids. + * Returns data on an avatar based on its id. @see avatars/list.json for a list + * of all avatar ids. + * + * @type avatar */ export async function GET({ params }: APIContext) { const avatar = await api.avatar(params.id);