aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/components/Gaming/CodeBlock.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/app/components/Gaming/CodeBlock.tsx')
-rw-r--r--frontend/app/components/Gaming/CodeBlock.tsx32
1 files changed, 7 insertions, 25 deletions
diff --git a/frontend/app/components/Gaming/CodeBlock.tsx b/frontend/app/components/Gaming/CodeBlock.tsx
index 16ff84e..019709a 100644
--- a/frontend/app/components/Gaming/CodeBlock.tsx
+++ b/frontend/app/components/Gaming/CodeBlock.tsx
@@ -1,39 +1,21 @@
-import { useEffect, useState } from "react";
-import { codeToHtml } from "../../shiki.bundle";
+import { JSX, useLayoutEffect, useState } from "react";
+import { type BundledLanguage, highlight } from "../../highlight";
type Props = {
code: string;
- language: string;
+ language: BundledLanguage;
};
export default function CodeBlock({ code, language }: Props) {
- const [highlightedCode, setHighlightedCode] = useState<string | null>(null);
+ const [nodes, setNodes] = useState<JSX.Element | null>(null);
- useEffect(() => {
- let isMounted = true;
-
- (async () => {
- const highlighted = await codeToHtml(code, {
- lang: language,
- theme: "github-light",
- });
- if (isMounted) {
- setHighlightedCode(highlighted);
- }
- })();
-
- return () => {
- isMounted = false;
- };
+ useLayoutEffect(() => {
+ highlight(code, language).then(setNodes);
}, [code, language]);
return (
<pre className="h-full w-full p-2 bg-gray-50 rounded-lg border border-gray-300 whitespace-pre-wrap break-words">
- {highlightedCode === null ? (
- <code>{code}</code>
- ) : (
- <code dangerouslySetInnerHTML={{ __html: highlightedCode }} />
- )}
+ {nodes === null ? <code>{code}</code> : nodes}
</pre>
);
}