import React from "react"; import classnames from "classnames"; import { Form, Spinner } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Prompt } from "react-router"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; import FlatButton from "../common/FlatButton"; import TabPages from "../common/TabPages"; import TimelinePostBuilder from "@/services/TimelinePostBuilder"; import ConfirmDialog from "../common/ConfirmDialog"; 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 [ showLeaveConfirmDialog, setShowLeaveConfirmDialog, ] = 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; }; const canSend = text.length > 0; 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 ( <> ) : ( <> { if (canLeave) { onClose(); } else { setShowLeaveConfirmDialog(true); } }} > {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, index) => (
{ getBuilder().deleteImage(index); }} />
))} ) => { const { files } = event.currentTarget; if (files != null && files.length !== 0) { getBuilder().appendImage(files[0]); } }} disabled={process} />
), }, { id: "preview", tabText: "preview", page: (
), }, ]} /> {showLeaveConfirmDialog && ( setShowLeaveConfirmDialog(false)} onConfirm={onClose} title="timeline.dropDraft" body="timeline.confirmLeave" /> )} ); }; export default MarkdownPostEdit;