fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
105 lines (102 loc) • 2.87 kB
JavaScript
'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