Compare commits
1 Commits
76b298ac8b
...
39a69ca5b8
| Author | SHA1 | Date | |
|---|---|---|---|
| 39a69ca5b8 |
@@ -13,23 +13,23 @@ const MarkdownEditor = () => {
|
|||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
const [title, setTitle] = useState("");
|
const [title, setTitle] = useState("");
|
||||||
const [content, setContent] = useState("");
|
const [content, setContent] = useState("");
|
||||||
|
const [shortcut, setShortcut] = useState("");
|
||||||
const [pathId, setPathId] = useState(1);
|
const [pathId, setPathId] = useState(1);
|
||||||
const {data: markdown, isLoading, error} = useMarkdown(id);
|
const {data: markdown, isLoading, error} = useMarkdown(id);
|
||||||
const saveMarkdown = useSaveMarkdown();
|
const saveMarkdown = useSaveMarkdown();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if(markdown){
|
if(markdown){
|
||||||
setTitle(markdown.title);
|
setTitle(markdown.title);
|
||||||
setContent(markdown.content);
|
setContent(markdown.content);
|
||||||
|
setShortcut(markdown.shortcut);
|
||||||
setPathId(markdown.path_id);
|
setPathId(markdown.path_id);
|
||||||
}
|
}
|
||||||
}, [markdown]);
|
}, [markdown]);
|
||||||
|
|
||||||
const handleSave = () => {
|
const handleSave = () => {
|
||||||
saveMarkdown.mutate(
|
saveMarkdown.mutate(
|
||||||
{id, data: {title, content, path_id: pathId}},
|
{id, data: {title, content, path_id: pathId, shortcut}},
|
||||||
{
|
{
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
navigate("/");
|
navigate("/");
|
||||||
@@ -56,10 +56,8 @@ const MarkdownEditor = () => {
|
|||||||
<div className="container mt-5 markdown-editor-container">
|
<div className="container mt-5 markdown-editor-container">
|
||||||
<h2 className="title is-4">{id ? "Edit Markdown" : "Create Markdown"}</h2>
|
<h2 className="title is-4">{id ? "Edit Markdown" : "Create Markdown"}</h2>
|
||||||
<div className="columns">
|
<div className="columns">
|
||||||
{/* Editor Column */}
|
|
||||||
<div className="column is-half">
|
<div className="column is-half">
|
||||||
<form>
|
<form>
|
||||||
{/* Title Field */}
|
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<label className="label">Title</label>
|
<label className="label">Title</label>
|
||||||
<div className="control">
|
<div className="control">
|
||||||
@@ -73,7 +71,18 @@ const MarkdownEditor = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* PathManager Field */}
|
<div className="field">
|
||||||
|
<label className="label">Shortcut</label>
|
||||||
|
<div className="control">
|
||||||
|
<input
|
||||||
|
className="input"
|
||||||
|
type="text"
|
||||||
|
placeholder="Enter shortcut"
|
||||||
|
value={shortcut}
|
||||||
|
onChange={(e) => setShortcut(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<label className="label">Path</label>
|
<label className="label">Path</label>
|
||||||
<PathManager
|
<PathManager
|
||||||
@@ -82,7 +91,6 @@ const MarkdownEditor = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Content Field */}
|
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<label className="label">Content</label>
|
<label className="label">Content</label>
|
||||||
<div className="control">
|
<div className="control">
|
||||||
@@ -96,7 +104,6 @@ const MarkdownEditor = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Save Button */}
|
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<div className="control">
|
<div className="control">
|
||||||
<button
|
<button
|
||||||
@@ -112,7 +119,6 @@ const MarkdownEditor = () => {
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Preview Column */}
|
|
||||||
<div className="column is-half">
|
<div className="column is-half">
|
||||||
<h3 className="subtitle is-5">Preview</h3>
|
<h3 className="subtitle is-5">Preview</h3>
|
||||||
<MarkdownView content={content} height='70vh'/>
|
<MarkdownView content={content} height='70vh'/>
|
||||||
|
|||||||
@@ -8,12 +8,18 @@ import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
|
|||||||
import { okaidia } from "react-syntax-highlighter/dist/esm/styles/prism";
|
import { okaidia } from "react-syntax-highlighter/dist/esm/styles/prism";
|
||||||
import "katex/dist/katex.min.css";
|
import "katex/dist/katex.min.css";
|
||||||
import "./MarkdownView.css";
|
import "./MarkdownView.css";
|
||||||
|
import {useLinks} from "../../utils/markdown-queries";
|
||||||
|
|
||||||
const MarkdownView = ({ content, height="auto" }) => {
|
const MarkdownView = ({ content, height="auto" }) => {
|
||||||
|
const {data: links, isLoading} = useLinks();
|
||||||
|
|
||||||
|
if (isLoading)
|
||||||
|
return <p>Loading...</p>
|
||||||
|
const definitions = "\n<!-- Definitions -->\n" + links.join("\n");
|
||||||
return (
|
return (
|
||||||
<div className="markdown-preview" style={{height}}>
|
<div className="markdown-preview" style={{height}}>
|
||||||
<ReactMarkdown
|
<ReactMarkdown
|
||||||
children={content}
|
children={content + "\n" + definitions}
|
||||||
remarkPlugins={[remarkMath, remarkGfm]}
|
remarkPlugins={[remarkMath, remarkGfm]}
|
||||||
rehypePlugins={[rehypeKatex, rehypeRaw]}
|
rehypePlugins={[rehypeKatex, rehypeRaw]}
|
||||||
components={{
|
components={{
|
||||||
|
|||||||
@@ -103,4 +103,10 @@ export const useSearchMarkdown = (keyword) => {
|
|||||||
enabled: !!keyword,
|
enabled: !!keyword,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const useLinks = () => {
|
||||||
|
const config = useConfig();
|
||||||
|
return useQuery(["links"], () => fetch_(`${config.BACKEND_HOST}/api/markdown/links`));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user