UNPKG

fumadocs-openapi

Version:

Generate MDX docs for your OpenAPI spec

105 lines (102 loc) 2.87 kB
'use client'; import { defaultAdapters } from "../../requests/media/adapter.js"; import { useStorageKey } from "../client/storage-key.js"; import { createContext, use, useEffect, useMemo, useRef, useState } from "react"; import { jsx } from "react/jsx-runtime"; //#region src/ui/contexts/api.tsx const ApiContext = createContext(null); const ServerSelectContext = createContext(null); function useApiContext() { const ctx = use(ApiContext); if (!ctx) throw new Error("Component must be used under <ApiProvider />"); return ctx; } function useServerSelectContext() { const ctx = use(ServerSelectContext); if (!ctx) throw new Error("Component must be used under <ApiProvider />"); return ctx; } function ApiProvider({ defaultBaseUrl, children, servers, shikiOptions, client }) { const serverRef = useRef(null); return /* @__PURE__ */ jsx(ApiContext, { value: useMemo(() => ({ serverRef, shikiOptions, client, mediaAdapters: { ...defaultAdapters, ...client.mediaAdapters }, servers }), [ servers, client, shikiOptions ]), children: /* @__PURE__ */ jsx(ServerSelectProvider, { defaultBaseUrl, children }) }); } function ServerSelectProvider({ defaultBaseUrl, children }) { const { servers, serverRef } = useApiContext(); const storageKeys = useStorageKey(); const [server, setServer] = useState(() => { const defaultItem = defaultBaseUrl ? servers.find((item) => item.url === defaultBaseUrl) : servers[0]; return defaultItem ? { url: defaultItem.url, variables: getDefaultValues(defaultItem) } : null; }); serverRef.current = server; useEffect(() => { const cached = localStorage.getItem(storageKeys.of("server-url")); if (!cached) return; try { const obj = JSON.parse(cached); if (!obj || typeof obj !== "object") return; setServer(obj); } catch {} }, [storageKeys]); return /* @__PURE__ */ jsx(ServerSelectContext, { value: useMemo(() => ({ server, setServerVariables(variables) { setServer((prev) => { if (!prev) return null; const updated = { ...prev, variables }; localStorage.setItem(storageKeys.of("server-url"), JSON.stringify(updated)); return updated; }); }, setServer(value) { const obj = servers.find((item) => item.url === value); if (!obj) return; const result = { url: value, variables: getDefaultValues(obj) }; localStorage.setItem(storageKeys.of("server-url"), JSON.stringify(result)); setServer(result); } }), [ server, servers, storageKeys ]), children }); } function getDefaultValues(server) { const out = {}; if (!server.variables) return out; for (const [k, v] of Object.entries(server.variables)) out[k] = v.default; return out; } //#endregion export { ApiProvider, useApiContext, useServerSelectContext }; //# sourceMappingURL=api.js.map