UNPKG

fumadocs-openapi

Version:

Generate MDX docs for your OpenAPI spec

119 lines (116 loc) 4.5 kB
'use client'; import { resolveServerUrl, withBase } from "../../utils/url.js"; import { useApiContext, useServerSelectContext } from "../../ui/contexts/api.js"; import { cn } from "../../utils/cn.js"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../ui/components/select.js"; import { Input, labelVariants } from "../../ui/components/input.js"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "../../ui/components/dialog.js"; import { useEffect, useEffectEvent, useState } from "react"; import { FormProvider, useController, useForm } from "react-hook-form"; import { jsx, jsxs } from "react/jsx-runtime"; //#region src/playground/components/server-select.tsx function ServerSelect(props) { const { servers } = useApiContext(); const { server, setServer, setServerVariables } = useServerSelectContext(); const [open, setOpen] = useState(false); const [isMounted, setIsMounted] = useState(false); useEffect(() => { setIsMounted(true); }, []); if (servers.length <= 0) return; const serverSchema = server ? servers.find((obj) => obj.url === server.url) : null; return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: setOpen, children: [/* @__PURE__ */ jsx(DialogTrigger, { className: "text-xs p-3 py-2 bg-fd-muted text-fd-muted-foreground transition-colors truncate hover:bg-fd-accent hover:text-fd-accent-foreground focus-visible:outline-none", children: isMounted ? withBase(server ? resolveServerUrl(server.url, server.variables) : "/", window.location.origin) : "loading..." }), /* @__PURE__ */ jsxs(DialogContent, { ...props, children: [ /* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Server URL" }), /* @__PURE__ */ jsx(DialogDescription, { children: "The base URL of your API endpoint." })] }), /* @__PURE__ */ jsxs(Select, { value: server?.url, onValueChange: setServer, children: [/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }), /* @__PURE__ */ jsx(SelectContent, { children: servers.map((item) => /* @__PURE__ */ jsxs(SelectItem, { value: item.url, children: [/* @__PURE__ */ jsx("code", { className: "text-[0.8125rem]", children: item.url }), /* @__PURE__ */ jsx("p", { className: "text-fd-muted-foreground", children: item.description })] }, item.url)) })] }), server?.variables && serverSchema?.variables && /* @__PURE__ */ jsx(ServerSelectContent, { defaultValues: server.variables, schema: serverSchema.variables, onChange: setServerVariables }, server.url) ] })] }); } function ServerSelectContent({ defaultValues, onChange, schema }) { const form = useForm({ defaultValues }); const onChangeDebounced = useEffectEvent(onChange); useEffect(() => { let timer = null; return form.subscribe({ formState: { values: true }, callback({ values }) { if (timer !== null) window.clearTimeout(timer); timer = window.setTimeout(() => onChangeDebounced(values), 500); } }); }, []); return /* @__PURE__ */ jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4", children: Object.entries(schema).map(([key, variable]) => { return /* @__PURE__ */ jsxs("fieldset", { className: "flex flex-col gap-1", children: [ /* @__PURE__ */ jsx("label", { className: cn(labelVariants()), htmlFor: key, children: key }), /* @__PURE__ */ jsx("p", { className: "text-xs text-fd-muted-foreground empty:hidden", children: variable.description }), /* @__PURE__ */ jsx(Field, { fieldName: key, variable }) ] }, key); }) }) }); } function Field({ fieldName, variable }) { const { field } = useController({ name: fieldName }); if (variable.enum) return /* @__PURE__ */ jsxs(Select, { value: field.value, onValueChange: field.onChange, children: [/* @__PURE__ */ jsx(SelectTrigger, { id: fieldName, ref: field.ref, children: /* @__PURE__ */ jsx(SelectValue, {}) }), /* @__PURE__ */ jsx(SelectContent, { children: variable.enum.map((value) => /* @__PURE__ */ jsx(SelectItem, { value, children: value }, value)) })] }); return /* @__PURE__ */ jsx(Input, { id: fieldName, ...field }); } //#endregion export { ServerSelect as default }; //# sourceMappingURL=server-select.js.map