import React from "react"; import { Nav, Form } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; import TimelinePostBuilder from "@/services/TimelinePostBuilder"; export interface MarkdownPostEditProps { timeline: string; onPosted: (post: HttpTimelinePostInfo) => void; } const MarkdownPostEdit: React.FC = ({ timeline: timelineName, onPosted, }) => { const { t } = useTranslation(); const [tab, setTab] = React.useState<"text" | "images" | "preview">("text"); const [process, setProcess] = React.useState(false); const [text, _setText] = React.useState(""); const [images, _setImages] = React.useState<{ file: File; url: string }[]>( [] ); const [previewHtml, _setPreviewHtml] = React.useState(""); const _builder = React.useRef(null); const getBuilder = (): TimelinePostBuilder => { if (_builder.current == null) { const builder = new TimelinePostBuilder(() => { _setText(builder.text); _setImages(builder.images); _setPreviewHtml(builder.renderHtml()); }); _builder.current = builder; } return _builder.current; }; React.useEffect(() => { return () => { getBuilder().dispose(); }; }, []); const send = async (): Promise => { const dataList = await getBuilder().build(); const post = await getHttpTimelineClient().postPost(timelineName, { dataList, }); onPosted(post); }; return (
{(() => { if (tab === "text") { return ( { getBuilder().setMarkdownText(event.currentTarget.value); }} /> ); } else if (tab === "images") { return
; } else { return
; } })()}
); }; export default MarkdownPostEdit;