From 710ff9d3d2e55113798c39b0595f8f71b12091ef Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 31 Jul 2023 21:16:27 +0800 Subject: ... --- FrontEnd/src/pages/timeline/TimelinePostView.css | 30 +++++++ FrontEnd/src/pages/timeline/TimelinePostView.tsx | 102 ++++++++--------------- 2 files changed, 67 insertions(+), 65 deletions(-) create mode 100644 FrontEnd/src/pages/timeline/TimelinePostView.css (limited to 'FrontEnd/src/pages') diff --git a/FrontEnd/src/pages/timeline/TimelinePostView.css b/FrontEnd/src/pages/timeline/TimelinePostView.css new file mode 100644 index 00000000..2cd8cd6b --- /dev/null +++ b/FrontEnd/src/pages/timeline/TimelinePostView.css @@ -0,0 +1,30 @@ +.timeline-post { + position: relative; + padding: 0.5em; +} + +.timeline-post-card { + position: relative; + padding: 0.5em 0.5em 0.5em 4em; +} + +.timeline-post-header { + display: flex; + align-items: center; +} + +.timeline-post-author-avatar { + border-radius: 50%; + width: 2em; + height: 2em; +} + +.timeline-post-delete-button { + position: absolute; + right: 0; + bottom: 0; +} + +.timeline-post-content { + white-space: pre-line; +} \ No newline at end of file diff --git a/FrontEnd/src/pages/timeline/TimelinePostView.tsx b/FrontEnd/src/pages/timeline/TimelinePostView.tsx index f7aec169..bdd2e3ef 100644 --- a/FrontEnd/src/pages/timeline/TimelinePostView.tsx +++ b/FrontEnd/src/pages/timeline/TimelinePostView.tsx @@ -1,5 +1,5 @@ -import * as React from "react"; -import classnames from "classnames"; +import { useState } from "react"; +import classNames from "classnames"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; @@ -8,6 +8,7 @@ import { pushAlert } from "@/services/alert"; import { useClickOutside } from "@/utilities/hooks"; import UserAvatar from "@/views/common/user/UserAvatar"; +import { useDialog } from "@/views/common/dialog"; import Card from "@/views/common/Card"; import FlatButton from "@/views/common/button/FlatButton"; import ConfirmDialog from "@/views/common/dialog/ConfirmDialog"; @@ -15,92 +16,68 @@ import TimelineLine from "./TimelineLine"; import TimelinePostContentView from "./TimelinePostContentView"; import IconButton from "@/views/common/button/IconButton"; +import "./TimelinePostView.css"; + export interface TimelinePostViewProps { post: HttpTimelinePostInfo; className?: string; - style?: React.CSSProperties; - cardStyle?: React.CSSProperties; onChanged: (post: HttpTimelinePostInfo) => void; onDeleted: () => void; } -const TimelinePostView: React.FC = (props) => { - const { post, className, style, cardStyle, onChanged, onDeleted } = props; +export function TimelinePostView(props: TimelinePostViewProps) { + const { post, className, onDeleted } = props; const [operationMaskVisible, setOperationMaskVisible] = - React.useState(false); - const [dialog, setDialog] = React.useState< - "delete" | "changeproperty" | null - >(null); + useState(false); - const [maskElement, setMaskElement] = React.useState( - null, - ); + const { switchDialog, dialogPropsMap } = useDialog(["delete"], { + onClose: { + delete: () => { + setOperationMaskVisible(false); + }, + }, + }); + const [maskElement, setMaskElement] = useState(null); useClickOutside(maskElement, () => setOperationMaskVisible(false)); - const cardRef = React.useRef(null); - React.useEffect(() => { - const cardIntersectionObserver = new IntersectionObserver(([e]) => { - if (e.intersectionRatio > 0) { - if (cardRef.current != null) { - cardRef.current.style.animationName = "timeline-post-enter"; - } - } - }); - if (cardRef.current) { - cardIntersectionObserver.observe(cardRef.current); - } - - return () => { - cardIntersectionObserver.disconnect(); - }; - }, []); - return (
- - {post.editable ? ( + + {post.editable && ( { setOperationMaskVisible(true); e.stopPropagation(); }} /> - ) : null} -
- - - - {post.author.nickname} - - {new Date(post.time).toLocaleTimeString()} - - - + )} +
+ + + {post.author.nickname} + + + {new Date(post.time).toLocaleTimeString()} +
-
+
{operationMaskVisible ? (
{ setOperationMaskVisible(false); }} @@ -108,7 +85,6 @@ const TimelinePostView: React.FC = (props) => { { - setDialog("changeproperty"); e.stopPropagation(); }} /> @@ -116,7 +92,7 @@ const TimelinePostView: React.FC = (props) => { text="delete" color="danger" onClick={(e) => { - setDialog("delete"); + switchDialog("delete"); e.stopPropagation(); }} /> @@ -126,11 +102,6 @@ const TimelinePostView: React.FC = (props) => { { - setDialog(null); - setOperationMaskVisible(false); - }} onConfirm={() => { void getHttpTimelineClient() .deletePost(post.timelineOwnerV2, post.timelineNameV2, post.id) @@ -141,9 +112,10 @@ const TimelinePostView: React.FC = (props) => { }); }); }} + {...dialogPropsMap.delete} />
); -}; +} export default TimelinePostView; -- cgit v1.2.3