import React from "react"; import { Form } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Prompt } from "react-router"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; import TabPages from "../common/TabPages"; import TimelinePostBuilder from "@/services/TimelinePostBuilder"; export interface MarkdownPostEditProps { timeline: string; onPosted: (post: HttpTimelinePostInfo) => void; onPostError: () => void; onClose: () => void; className?: string; style?: React.CSSProperties; } const MarkdownPostEdit: React.FC = ({ timeline: timelineName, onPosted, onClose, onPostError, className, style, }) => { const { t } = useTranslation(); const [canLeave, setCanLeave] = React.useState(true); 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(() => { setCanLeave(builder.isEmpty); _setText(builder.text); _setImages(builder.images); _setPreviewHtml(builder.renderHtml()); }); _builder.current = builder; } return _builder.current; }; React.useEffect(() => { return () => { getBuilder().dispose(); }; }, []); React.useEffect(() => { window.onbeforeunload = () => { if (!canLeave) { return t("timeline.confirmLeave"); } }; return () => { window.onbeforeunload = null; }; }, [canLeave, t]); const send = async (): Promise => { setProcess(true); try { const dataList = await getBuilder().build(); const post = await getHttpTimelineClient().postPost(timelineName, { dataList, }); onPosted(post); onClose(); } catch (e) { setProcess(false); onPostError(); } }; return ( <>
{t("operationDialog.cancel")}
{t("timeline.send")}
} pages={[ { id: "text", tabText: "edit", page: ( { getBuilder().setMarkdownText(event.currentTarget.value); }} /> ), }, { id: "images", tabText: "image", page: (
{images.map((image) => ( ))} ) => { const { files } = event.currentTarget; if (files != null && files.length !== 0) { getBuilder().appendImage(files[0]); } }} disabled={process} />
), }, { id: "preview", tabText: "preview", page: (
), }, ]} /> ); }; export default MarkdownPostEdit;