mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { HOME_URL, HOST, HTTP_PROTOCOL } from "../../Config";
|
|
import API from "../../Utils/API/API";
|
|
import ComponentLoader from "../ComponentLoader/ComponentLoader";
|
|
import ErrorMessage from "../ErrorMessage/ErrorMessage";
|
|
import MarkdownViewer from "../Markdown.tsx/LazyMarkdownViewer";
|
|
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
import Route from "../../../Types/API/Route";
|
|
import URL from "../../../Types/API/URL";
|
|
import { PromiseVoidFunction } from "../../../Types/FunctionTypes";
|
|
import ObjectID from "../../../Types/ObjectID";
|
|
import React, { FunctionComponent, ReactElement, useState } from "react";
|
|
import useAsyncEffect from "use-async-effect";
|
|
|
|
export interface ComponentProps {
|
|
documentationLink: Route;
|
|
workflowId: ObjectID;
|
|
webhookSecretKey?: string | undefined;
|
|
}
|
|
|
|
const DocumentationViewer: FunctionComponent<ComponentProps> = (
|
|
props: ComponentProps,
|
|
): ReactElement => {
|
|
const [markdown, setMarkdown] = useState<string>("");
|
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
const [error, setError] = useState<string>("");
|
|
|
|
type PopulateWithEnvVarsFunction = (text: string) => string;
|
|
|
|
const populateWithEnvVars: PopulateWithEnvVarsFunction = (
|
|
text: string,
|
|
): string => {
|
|
text = text.replace("{{serverUrl}}", HOME_URL.toString());
|
|
text = text.replace("{{workflowId}}", props.workflowId.toString());
|
|
text = text.replace(
|
|
"{{webhookSecretKey}}",
|
|
props.webhookSecretKey || "Loading...",
|
|
);
|
|
|
|
return text;
|
|
};
|
|
|
|
const loadDocs: PromiseVoidFunction = async (): Promise<void> => {
|
|
if (props.documentationLink) {
|
|
try {
|
|
setIsLoading(true);
|
|
const body: HTTPResponse<any> = await API.get({
|
|
url: new URL(HTTP_PROTOCOL, HOST, props.documentationLink),
|
|
data: {},
|
|
headers: {
|
|
Accept: "text/plain",
|
|
"Content-Type": "text/plain",
|
|
},
|
|
});
|
|
setMarkdown(populateWithEnvVars((body.data as any).data.toString()));
|
|
setIsLoading(false);
|
|
} catch (err) {
|
|
setIsLoading(false);
|
|
setError(API.getFriendlyMessage(err));
|
|
}
|
|
}
|
|
};
|
|
|
|
useAsyncEffect(async () => {
|
|
await loadDocs();
|
|
}, [props.documentationLink]);
|
|
|
|
return (
|
|
<div className="mt-5 mb-5">
|
|
<h2 className="text-base font-medium text-gray-500">Documentation</h2>
|
|
<p className="text-sm font-medium text-gray-400">
|
|
Here is some documentation for this component.
|
|
</p>
|
|
|
|
{error ? <ErrorMessage message={error} /> : <></>}
|
|
{isLoading ? <ComponentLoader /> : <></>}
|
|
|
|
<div className="mt-3">
|
|
<MarkdownViewer text={markdown} />
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default DocumentationViewer;
|