aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-03-18 21:28:30 +0800
committercrupest <crupest@outlook.com>2021-03-18 21:28:30 +0800
commitf9133bcac71a4e3f46830083df0f27e20d65b058 (patch)
treef9e41f2ea4397da9dc35098cfd313664fac3e2f1
parentac9f1a2d563e3797d7164a442338997ff6ac47d5 (diff)
downloadtimeline-f9133bcac71a4e3f46830083df0f27e20d65b058.tar.gz
timeline-f9133bcac71a4e3f46830083df0f27e20d65b058.tar.bz2
timeline-f9133bcac71a4e3f46830083df0f27e20d65b058.zip
feat: Prevent leave.
-rw-r--r--FrontEnd/src/app/locales/en/translation.json1
-rw-r--r--FrontEnd/src/app/locales/zh/translation.json3
-rw-r--r--FrontEnd/src/app/views/common/ConfirmDialog.tsx40
-rw-r--r--FrontEnd/src/app/views/timeline-common/MarkdownPostEdit.tsx25
4 files changed, 67 insertions, 2 deletions
diff --git a/FrontEnd/src/app/locales/en/translation.json b/FrontEnd/src/app/locales/en/translation.json
index 8fcd5bcd..65ddbe0c 100644
--- a/FrontEnd/src/app/locales/en/translation.json
+++ b/FrontEnd/src/app/locales/en/translation.json
@@ -67,6 +67,7 @@
"send": "Send",
"deletePostFailed": "Failed to delete post.",
"sendPostFailed": "Failed to send post.",
+ "dropDraft": "Drop Draft",
"confirmLeave": "Are you sure to leave? All content you typed would be lost.",
"visibility": {
"public": "public to everyone",
diff --git a/FrontEnd/src/app/locales/zh/translation.json b/FrontEnd/src/app/locales/zh/translation.json
index f03c4c03..f6971241 100644
--- a/FrontEnd/src/app/locales/zh/translation.json
+++ b/FrontEnd/src/app/locales/zh/translation.json
@@ -67,7 +67,8 @@
"send": "发送",
"deletePostFailed": "删除消息失败。",
"sendPostFailed": "发送消息失败。",
- "confirmLeave":"确定要离开吗?所有输入的内容将会丢失。",
+ "dropDraft": "放弃草稿",
+ "confirmLeave": "确定要离开吗?所有输入的内容将会丢失。",
"visibility": {
"public": "对所有人公开",
"register": "仅注册可见",
diff --git a/FrontEnd/src/app/views/common/ConfirmDialog.tsx b/FrontEnd/src/app/views/common/ConfirmDialog.tsx
new file mode 100644
index 00000000..72940c51
--- /dev/null
+++ b/FrontEnd/src/app/views/common/ConfirmDialog.tsx
@@ -0,0 +1,40 @@
+import { convertI18nText, I18nText } from "@/common";
+import React from "react";
+import { Modal, Button } from "react-bootstrap";
+import { useTranslation } from "react-i18next";
+
+const ConfirmDialog: React.FC<{
+ onClose: () => void;
+ onConfirm: () => void;
+ title: I18nText;
+ body: I18nText;
+}> = ({ onClose, onConfirm, title, body }) => {
+ const { t } = useTranslation();
+
+ return (
+ <Modal onHide={onClose} show centered>
+ <Modal.Header>
+ <Modal.Title className="text-danger">
+ {convertI18nText(title, t)}
+ </Modal.Title>
+ </Modal.Header>
+ <Modal.Body>{convertI18nText(body, t)}</Modal.Body>
+ <Modal.Footer>
+ <Button variant="secondary" onClick={onClose}>
+ {t("operationDialog.cancel")}
+ </Button>
+ <Button
+ variant="danger"
+ onClick={() => {
+ onConfirm();
+ onClose();
+ }}
+ >
+ {t("operationDialog.confirm")}
+ </Button>
+ </Modal.Footer>
+ </Modal>
+ );
+};
+
+export default ConfirmDialog;
diff --git a/FrontEnd/src/app/views/timeline-common/MarkdownPostEdit.tsx b/FrontEnd/src/app/views/timeline-common/MarkdownPostEdit.tsx
index ab6aafea..bad6b2b0 100644
--- a/FrontEnd/src/app/views/timeline-common/MarkdownPostEdit.tsx
+++ b/FrontEnd/src/app/views/timeline-common/MarkdownPostEdit.tsx
@@ -7,6 +7,7 @@ import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline";
import TabPages from "../common/TabPages";
import TimelinePostBuilder from "@/services/TimelinePostBuilder";
+import ConfirmDialog from "../common/ConfirmDialog";
export interface MarkdownPostEditProps {
timeline: string;
@@ -31,6 +32,11 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
const [process, setProcess] = React.useState<boolean>(false);
+ const [
+ showLeaveConfirmDialog,
+ setShowLeaveConfirmDialog,
+ ] = React.useState<boolean>(false);
+
const [text, _setText] = React.useState<string>("");
const [images, _setImages] = React.useState<{ file: File; url: string }[]>(
[]
@@ -94,7 +100,16 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
pageContainerClassName="py-2"
actions={
<>
- <div className="flat-button text-danger mr-2" onClick={onClose}>
+ <div
+ className="flat-button text-danger mr-2"
+ onClick={() => {
+ if (canLeave) {
+ onClose();
+ } else {
+ setShowLeaveConfirmDialog(true);
+ }
+ }}
+ >
{t("operationDialog.cancel")}
</div>
<div className="flat-button text-primary" onClick={send}>
@@ -155,6 +170,14 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
},
]}
/>
+ {showLeaveConfirmDialog && (
+ <ConfirmDialog
+ onClose={() => setShowLeaveConfirmDialog(false)}
+ onConfirm={onClose}
+ title="timeline.dropDraft"
+ body="timeline.confirmLeave"
+ />
+ )}
</>
);
};