import React from "react"; import { useTranslation } from "react-i18next"; import classnames from "classnames"; import { HubConnectionState } from "@microsoft/signalr"; import { useIsSmallScreen } from "@/utilities/mediaQuery"; import { timelineVisibilityTooltipTranslationMap } from "@/services/timeline"; import { useUser } from "@/services/user"; import { pushAlert } from "@/services/alert"; import { HttpTimelineInfo } from "@/http/timeline"; import { getHttpBookmarkClient } from "@/http/bookmark"; import UserAvatar from "../common/user/UserAvatar"; import PopupMenu from "../common/menu/PopupMenu"; import FullPageDialog from "../common/dailog/FullPageDialog"; import Card from "../common/Card"; import TimelineDeleteDialog from "./TimelineDeleteDialog"; import ConnectionStatusBadge from "./ConnectionStatusBadge"; import CollapseButton from "./CollapseButton"; import { TimelineMemberDialog } from "./TimelineMember"; import TimelinePropertyChangeDialog from "./TimelinePropertyChangeDialog"; export interface TimelinePageCardProps { timeline: HttpTimelineInfo; collapse: boolean; toggleCollapse: () => void; connectionStatus: HubConnectionState; className?: string; onReload: () => void; } const TimelineCard: React.FC = (props) => { const { timeline, collapse, toggleCollapse, connectionStatus, onReload, className, } = props; const { t } = useTranslation(); const [dialog, setDialog] = React.useState< "member" | "property" | "delete" | null >(null); const isSmallScreen = useIsSmallScreen(); const user = useUser(); const content = ( <>

{timeline.title} {timeline.nameV2}

{timeline.owner.nickname} @{timeline.owner.username}

{timeline.description}

{t(timelineVisibilityTooltipTranslationMap[timeline.visibility])}
{user != null ? ( { getHttpBookmarkClient() [timeline.isBookmark ? "delete" : "post"]( user.username, timeline.owner.username, timeline.nameV2 ) .then(onReload, () => { pushAlert({ message: timeline.isBookmark ? "timeline.removeBookmarkFail" : "timeline.addBookmarkFail", type: "danger", }); }); }} /> ) : null} setDialog("member")} /> {timeline.manageable ? ( setDialog("property"), }, { type: "divider" }, { type: "button", onClick: () => setDialog("delete"), color: "danger", text: "timeline.manageItem.delete", }, ]} containerClassName="d-inline" > ) : null}
); return ( <>
{isSmallScreen ? ( {content} ) : (
{content}
)}
setDialog(null)} open={dialog === "member"} onChange={onReload} /> setDialog(null)} open={dialog === "property"} onChange={onReload} /> setDialog(null)} /> ); }; export default TimelineCard;