Dev Editor now save state in localstorage
This commit is contained in:
parent
ffe7e119e0
commit
a0706fd52f
|
@ -1,6 +1,7 @@
|
||||||
import { GetStaticProps } from "next";
|
import { GetStaticProps } from "next";
|
||||||
import { useCallback, useRef, useState } from "react";
|
import { useCallback, useRef, useState } from "react";
|
||||||
import TurndownService from "turndown";
|
import TurndownService from "turndown";
|
||||||
|
import { atomWithStorage } from "jotai/utils";
|
||||||
import { AppLayout, AppLayoutRequired } from "components/AppLayout";
|
import { AppLayout, AppLayoutRequired } from "components/AppLayout";
|
||||||
import { Button } from "components/Inputs/Button";
|
import { Button } from "components/Inputs/Button";
|
||||||
import { getTocFromMarkdawn, Markdawn, TableOfContents } from "components/Markdown/Markdawn";
|
import { getTocFromMarkdawn, Markdawn, TableOfContents } from "components/Markdown/Markdawn";
|
||||||
|
@ -10,6 +11,14 @@ import { ToolTip } from "components/ToolTip";
|
||||||
import { getOpenGraph } from "helpers/openGraph";
|
import { getOpenGraph } from "helpers/openGraph";
|
||||||
import { getFormat } from "helpers/i18n";
|
import { getFormat } from "helpers/i18n";
|
||||||
import { isDefined } from "helpers/asserts";
|
import { isDefined } from "helpers/asserts";
|
||||||
|
import { atomPairing, useAtomPair } from "helpers/atoms";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ╭─────────────╮
|
||||||
|
* ────────────────────────────────────────╯ CONSTANTS ╰──────────────────────────────────────────
|
||||||
|
*/
|
||||||
|
|
||||||
|
const markdownAtom = atomPairing(atomWithStorage("editorState", ""));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ╭────────╮
|
* ╭────────╮
|
||||||
|
@ -19,14 +28,11 @@ import { isDefined } from "helpers/asserts";
|
||||||
interface Props extends AppLayoutRequired {}
|
interface Props extends AppLayoutRequired {}
|
||||||
|
|
||||||
const Editor = (props: Props): JSX.Element => {
|
const Editor = (props: Props): JSX.Element => {
|
||||||
const handleInput = useCallback((text: string) => {
|
|
||||||
setMarkdown(text);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const [markdown, setMarkdown] = useState("");
|
|
||||||
const [converterOpened, setConverterOpened] = useState(false);
|
const [converterOpened, setConverterOpened] = useState(false);
|
||||||
const textAreaRef = useRef<HTMLTextAreaElement>(null);
|
const textAreaRef = useRef<HTMLTextAreaElement>(null);
|
||||||
|
|
||||||
|
const [markdown, setMarkdown] = useAtomPair(markdownAtom);
|
||||||
|
|
||||||
const transformationWrapper = useCallback(
|
const transformationWrapper = useCallback(
|
||||||
(
|
(
|
||||||
transformation: (
|
transformation: (
|
||||||
|
@ -45,14 +51,14 @@ const Editor = (props: Props): JSX.Element => {
|
||||||
);
|
);
|
||||||
|
|
||||||
textAreaRef.current.value = transformedValue;
|
textAreaRef.current.value = transformedValue;
|
||||||
handleInput(textAreaRef.current.value);
|
setMarkdown(textAreaRef.current.value);
|
||||||
|
|
||||||
textAreaRef.current.focus();
|
textAreaRef.current.focus();
|
||||||
textAreaRef.current.selectionStart = selectionStart + prependLength;
|
textAreaRef.current.selectionStart = selectionStart + prependLength;
|
||||||
textAreaRef.current.selectionEnd = selectionEnd + prependLength;
|
textAreaRef.current.selectionEnd = selectionEnd + prependLength;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[handleInput]
|
[setMarkdown]
|
||||||
);
|
);
|
||||||
|
|
||||||
const wrap = useCallback(
|
const wrap = useCallback(
|
||||||
|
@ -375,7 +381,7 @@ const Editor = (props: Props): JSX.Element => {
|
||||||
ref={textAreaRef}
|
ref={textAreaRef}
|
||||||
onInput={(event) => {
|
onInput={(event) => {
|
||||||
const textarea = event.target as HTMLTextAreaElement;
|
const textarea = event.target as HTMLTextAreaElement;
|
||||||
handleInput(textarea.value);
|
setMarkdown(textarea.value);
|
||||||
}}
|
}}
|
||||||
className="h-[70vh] w-full rounded-xl bg-mid/40 p-8
|
className="h-[70vh] w-full rounded-xl bg-mid/40 p-8
|
||||||
font-mono text-black outline-none"
|
font-mono text-black outline-none"
|
||||||
|
|
Loading…
Reference in New Issue