api-nexus
Version:
Generation of API documentation for the GraphQl and Rest API
63 lines (56 loc) • 1.66 kB
JSX
// Inbuilt modules
import React, { createContext, useContext, useMemo } from "react";
// Create a context
const DocumentContext = createContext();
// Create a custom provider component
export const DocumentContextProvider = ({ children, context }) => {
const {
__schema: { types },
} = context?.introspection?.__schema
? context?.introspection
: { __schema: { types: [] } };
const schemaJson = useMemo(() => {
return (types ?? []).reduce(
(acc, data) => {
if (["Query", "Mutation", "Subscription"].includes(data.name)) {
acc.operations[data.name] = Object.assign(
{},
...data.fields.map((apis) => {
return { [apis.name]: apis };
})
);
} else {
acc.types.dataTypes[data.name] = data;
}
return acc;
},
{ operations: {}, types: { dataTypes: {} } }
);
}, [types]);
const graphMetaJson = useMemo(
() => context.graphMetaData || {},
[context.graphMetaData]
);
const restMetaJson = useMemo(
() => context.restMetaData || {},
[context.restMetaData]
);
const config = useMemo(() => context.config || {}, [context.config]);
return (
<DocumentContext.Provider
value={{ config, schemaJson, graphMetaJson, restMetaJson }}
>
{children}
</DocumentContext.Provider>
);
};
// Create a custom hook for accessing the context
export const useDocumentContext = () => {
const context = useContext(DocumentContext);
if (!context) {
throw new Error(
"useDocumentContext must be used within a DocumentContextProvider"
);
}
return context;
};