import React from "react"; import classnames from "classnames"; import { Link } from "react-router-dom"; import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline"; import { pushAlert } from "@/services/alert"; import useClickOutside from "@/utilities/useClickOutside"; import UserAvatar from "../common/user/UserAvatar"; import Card from "../common/Card"; import FlatButton from "../common/button/FlatButton"; import ConfirmDialog from "../common/dailog/ConfirmDialog"; import TimelineLine from "./TimelineLine"; import TimelinePostContentView from "./TimelinePostContentView"; import PostPropertyChangeDialog from "./PostPropertyChangeDialog"; 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; const [operationMaskVisible, setOperationMaskVisible] = React.useState(false); const [dialog, setDialog] = React.useState< "delete" | "changeproperty" | null >(null); const [maskElement, setMaskElement] = React.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 ? ( { setOperationMaskVisible(true); e.stopPropagation(); }} /> ) : null}
{post.author.nickname} {new Date(post.time).toLocaleTimeString()}
{operationMaskVisible ? (
{ setOperationMaskVisible(false); }} > { setDialog("changeproperty"); e.stopPropagation(); }} /> { setDialog("delete"); e.stopPropagation(); }} />
) : null}
{ setDialog(null); setOperationMaskVisible(false); }} onConfirm={() => { void getHttpTimelineClient() .deletePost(post.timelineOwnerV2, post.timelineNameV2, post.id) .then(onDeleted, () => { pushAlert({ type: "danger", message: "timeline.deletePostFailed", }); }); }} /> { setDialog(null); setOperationMaskVisible(false); }} post={post} onSuccess={onChanged} />
); }; export default TimelinePostView;