accords-library.com/src/pages/editor.tsx

86 lines
2.7 KiB
TypeScript
Raw Normal View History

2022-02-17 16:55:44 +00:00
import ContentPanel, {
ContentPanelWidthSizes,
} from "components/Panels/ContentPanel";
import { getWebsiteInterface } from "graphql/operations";
import { GetStaticProps } from "next";
import { GetWebsiteInterfaceQuery } from "graphql/operations-types";
import AppLayout from "components/AppLayout";
import { useCallback, useState } from "react";
import Markdawn from "components/Markdown/Markdawn";
import Script from "next/script";
type EditorProps = {
langui: GetWebsiteInterfaceQuery;
};
export default function Editor(props: EditorProps): JSX.Element {
const langui = props.langui.websiteInterfaces.data[0].attributes;
const handleInput = useCallback((e) => {
setMarkdown(e.target.value);
}, []);
const [markdown, setMarkdown] = useState("");
const contentPanel = (
<ContentPanel width={ContentPanelWidthSizes.large}>
<Script
id="autoFitTextArea"
strategy="afterInteractive"
dangerouslySetInnerHTML={{
__html: `
const el = document.querySelector("#editorTextArea")
el.addEventListener('input', function() {
this.style.height = (this.scrollHeight) + 'px';
});
`,
}}
/>
<div className="grid grid-cols-2 gap-4 h-96">
<div>
<h2>Editor</h2>
<textarea
id="editorTextArea"
onInput={handleInput}
onPaste={(event) => {
event.preventDefault();
let paste = event.clipboardData.getData("text/html");
paste = paste.replaceAll("<html>", "");
paste = paste.replaceAll("<body>", "");
paste = paste.replaceAll("</body>", "");
paste = paste.replaceAll("</html>", "");
paste = paste.replaceAll("<!--StartFragment-->", "");
paste = paste.replaceAll("<!--EndFragment-->", "");
event.target.value = paste;
}}
className="bg-mid rounded-xl p-8 w-full "
value={markdown}
/>
</div>
<div>
<h2>Preview</h2>
<div className="bg-mid rounded-xl p-8">
<Markdawn className="max-w-full" text={markdown} />
</div>
</div>
</div>
</ContentPanel>
);
return <AppLayout title="404" langui={langui} contentPanel={contentPanel} />;
}
export const getStaticProps: GetStaticProps = async (context) => {
if (context.locale) {
const props: EditorProps = {
langui: await getWebsiteInterface({
language_code: context.locale,
}),
};
return {
props: props,
};
}
return { props: {} };
};