aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/pages/timeline
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-08-29 01:30:30 +0800
committercrupest <crupest@outlook.com>2023-08-29 01:30:30 +0800
commitb05860b6d2ea17db29a338659def49dc31082346 (patch)
treecbbd9d99af5e6b006f142effeae5222278dad02f /FrontEnd/src/pages/timeline
parent502dd817c79018c84b0a958dd4b2e24781e68ae1 (diff)
downloadtimeline-b05860b6d2ea17db29a338659def49dc31082346.tar.gz
timeline-b05860b6d2ea17db29a338659def49dc31082346.tar.bz2
timeline-b05860b6d2ea17db29a338659def49dc31082346.zip
Refactor dialog module.
Diffstat (limited to 'FrontEnd/src/pages/timeline')
-rw-r--r--FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx33
-rw-r--r--FrontEnd/src/pages/timeline/TimelineCard.tsx28
-rw-r--r--FrontEnd/src/pages/timeline/TimelineDeleteDialog.tsx4
-rw-r--r--FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx2
-rw-r--r--FrontEnd/src/pages/timeline/TimelinePostView.tsx48
-rw-r--r--FrontEnd/src/pages/timeline/TimelinePropertyChangeDialog.tsx4
6 files changed, 60 insertions, 59 deletions
diff --git a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx b/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx
index 43e81d67..fc7b882f 100644
--- a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx
+++ b/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx
@@ -2,7 +2,10 @@ import * as React from "react";
import classnames from "classnames";
import { useTranslation } from "react-i18next";
-import { getHttpTimelineClient, HttpTimelinePostInfo } from "~src/http/timeline";
+import {
+ getHttpTimelineClient,
+ HttpTimelinePostInfo,
+} from "~src/http/timeline";
import TimelinePostBuilder from "~src/services/TimelinePostBuilder";
@@ -13,6 +16,7 @@ import Spinner from "~src/components/Spinner";
import IconButton from "~src/components/button/IconButton";
import "./MarkdownPostEdit.css";
+import { DialogProvider, useDialog } from "~src/components/dialog";
export interface MarkdownPostEditProps {
owner: string;
@@ -39,12 +43,19 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
const [process, setProcess] = React.useState<boolean>(false);
- const [showLeaveConfirmDialog, setShowLeaveConfirmDialog] =
- React.useState<boolean>(false);
+ const { controller, switchDialog } = useDialog({
+ "leave-confirm": (
+ <ConfirmDialog
+ onConfirm={onClose}
+ title="timeline.dropDraft"
+ body="timeline.confirmLeave"
+ />
+ ),
+ });
const [text, _setText] = React.useState<string>("");
const [images, _setImages] = React.useState<{ file: File; url: string }[]>(
- []
+ [],
);
const [previewHtml, _setPreviewHtml] = React.useState<string>("");
@@ -92,7 +103,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
timelineName,
{
dataList,
- }
+ },
);
onPosted(post);
onClose();
@@ -123,7 +134,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
if (canLeave) {
onClose();
} else {
- setShowLeaveConfirmDialog(true);
+ switchDialog("leave-confirm");
}
}}
/>
@@ -167,7 +178,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
color="danger"
className={classnames(
"timeline-markdown-post-edit-image-delete-button",
- process && "d-none"
+ process && "d-none",
)}
onClick={() => {
getBuilder().deleteImage(index);
@@ -201,13 +212,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
},
]}
/>
- <ConfirmDialog
- onClose={() => setShowLeaveConfirmDialog(false)}
- onConfirm={onClose}
- open={showLeaveConfirmDialog}
- title="timeline.dropDraft"
- body="timeline.confirmLeave"
- />
+ <DialogProvider controller={controller} />
</>
);
};
diff --git a/FrontEnd/src/pages/timeline/TimelineCard.tsx b/FrontEnd/src/pages/timeline/TimelineCard.tsx
index f17a3ce9..133f1ef4 100644
--- a/FrontEnd/src/pages/timeline/TimelineCard.tsx
+++ b/FrontEnd/src/pages/timeline/TimelineCard.tsx
@@ -8,7 +8,7 @@ import { HttpTimelineInfo } from "~src/http/timeline";
import { getHttpBookmarkClient } from "~src/http/bookmark";
import { useMobile } from "~src/components/hooks";
-import { Dialog, useDialog } from "~src/components/dialog";
+import { Dialog, DialogProvider, useDialog } from "~src/components/dialog";
import UserAvatar from "~src/components/user/UserAvatar";
import PopupMenu from "~src/components/menu/PopupMenu";
import FullPageDialog from "~src/components/dialog/FullPageDialog";
@@ -40,11 +40,17 @@ export default function TimelineCard(props: TimelinePageCardProps) {
const isMobile = useMobile();
- const { createDialogSwitch, dialogPropsMap } = useDialog([
- "member",
- "property",
- "delete",
- ]);
+ const { controller, createDialogSwitch } = useDialog({
+ member: (
+ <Dialog>
+ <TimelineMember timeline={timeline} onChange={onReload} />
+ </Dialog>
+ ),
+ property: (
+ <TimelinePropertyChangeDialog timeline={timeline} onChange={onReload} />
+ ),
+ delete: <TimelineDeleteDialog timeline={timeline} />,
+ });
const content = (
<div>
@@ -144,15 +150,7 @@ export default function TimelineCard(props: TimelinePageCardProps) {
) : (
<div style={{ display: collapse ? "none" : "block" }}>{content}</div>
)}
- <Dialog {...dialogPropsMap["member"]}>
- <TimelineMember timeline={timeline} onChange={onReload} />
- </Dialog>
- <TimelinePropertyChangeDialog
- timeline={timeline}
- onChange={onReload}
- {...dialogPropsMap["property"]}
- />
- <TimelineDeleteDialog timeline={timeline} {...dialogPropsMap["delete"]} />
+ <DialogProvider controller={controller} />
</Card>
);
}
diff --git a/FrontEnd/src/pages/timeline/TimelineDeleteDialog.tsx b/FrontEnd/src/pages/timeline/TimelineDeleteDialog.tsx
index a7209e75..630ce4ca 100644
--- a/FrontEnd/src/pages/timeline/TimelineDeleteDialog.tsx
+++ b/FrontEnd/src/pages/timeline/TimelineDeleteDialog.tsx
@@ -8,8 +8,6 @@ import OperationDialog from "~src/components/dialog/OperationDialog";
interface TimelineDeleteDialog {
timeline: HttpTimelineInfo;
- open: boolean;
- onClose: () => void;
}
const TimelineDeleteDialog: React.FC<TimelineDeleteDialog> = (props) => {
@@ -19,8 +17,6 @@ const TimelineDeleteDialog: React.FC<TimelineDeleteDialog> = (props) => {
return (
<OperationDialog
- open={props.open}
- onClose={props.onClose}
title="timeline.deleteDialog.title"
color="danger"
inputPromptNode={
diff --git a/FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx b/FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx
index 3c41228a..3bc4dab3 100644
--- a/FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx
+++ b/FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx
@@ -88,7 +88,7 @@ function TimelinePostEditImage(props: TimelinePostEditImageProps) {
/>
{file != null && !error && (
<BlobImage
- blob={file}
+ src={file}
className="timeline-post-create-image"
onLoad={() => onSelect(file)}
onError={() => {
diff --git a/FrontEnd/src/pages/timeline/TimelinePostView.tsx b/FrontEnd/src/pages/timeline/TimelinePostView.tsx
index 6b87ef2a..5de09b28 100644
--- a/FrontEnd/src/pages/timeline/TimelinePostView.tsx
+++ b/FrontEnd/src/pages/timeline/TimelinePostView.tsx
@@ -9,7 +9,7 @@ import { pushAlert } from "~src/services/alert";
import { useClickOutside } from "~src/components/hooks";
import UserAvatar from "~src/components/user/UserAvatar";
-import { useDialog } from "~src/components/dialog";
+import { DialogProvider, useDialog } from "~src/components/dialog";
import FlatButton from "~src/components/button/FlatButton";
import ConfirmDialog from "~src/components/dialog/ConfirmDialog";
import TimelinePostContentView from "./TimelinePostContentView";
@@ -33,13 +33,33 @@ export default function TimelinePostView(props: TimelinePostViewProps) {
const [operationMaskVisible, setOperationMaskVisible] =
useState<boolean>(false);
- const { switchDialog, dialogPropsMap } = useDialog(["delete"], {
- onClose: {
- delete: () => {
- setOperationMaskVisible(false);
+ const { controller, switchDialog } = useDialog(
+ {
+ delete: (
+ <ConfirmDialog
+ title="timeline.post.deleteDialog.title"
+ body="timeline.post.deleteDialog.prompt"
+ onConfirm={() => {
+ void getHttpTimelineClient()
+ .deletePost(post.timelineOwnerV2, post.timelineNameV2, post.id)
+ .then(onDeleted, () => {
+ pushAlert({
+ type: "danger",
+ message: "timeline.deletePostFailed",
+ });
+ });
+ }}
+ />
+ ),
+ },
+ {
+ onClose: {
+ delete: () => {
+ setOperationMaskVisible(false);
+ },
},
},
- });
+ );
const [maskElement, setMaskElement] = useState<HTMLElement | null>(null);
useClickOutside(maskElement, () => setOperationMaskVisible(false));
@@ -98,21 +118,7 @@ export default function TimelinePostView(props: TimelinePostViewProps) {
</div>
) : null}
</TimelinePostCard>
- <ConfirmDialog
- title="timeline.post.deleteDialog.title"
- body="timeline.post.deleteDialog.prompt"
- onConfirm={() => {
- void getHttpTimelineClient()
- .deletePost(post.timelineOwnerV2, post.timelineNameV2, post.id)
- .then(onDeleted, () => {
- pushAlert({
- type: "danger",
- message: "timeline.deletePostFailed",
- });
- });
- }}
- {...dialogPropsMap.delete}
- />
+ <DialogProvider controller={controller} />
</TimelinePostContainer>
);
}
diff --git a/FrontEnd/src/pages/timeline/TimelinePropertyChangeDialog.tsx b/FrontEnd/src/pages/timeline/TimelinePropertyChangeDialog.tsx
index afd83a5f..ee5388cb 100644
--- a/FrontEnd/src/pages/timeline/TimelinePropertyChangeDialog.tsx
+++ b/FrontEnd/src/pages/timeline/TimelinePropertyChangeDialog.tsx
@@ -11,8 +11,6 @@ import {
import OperationDialog from "~src/components/dialog/OperationDialog";
export interface TimelinePropertyChangeDialogProps {
- open: boolean;
- onClose: () => void;
timeline: HttpTimelineInfo;
onChange: () => void;
}
@@ -63,8 +61,6 @@ const TimelinePropertyChangeDialog: React.FC<
},
},
}}
- open={props.open}
- onClose={props.onClose}
onProcess={({ title, visibility, description }) => {
const req: HttpTimelinePatchRequest = {};
if (title !== timeline.title) {