aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/pages/timeline
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-08-31 23:56:13 +0800
committercrupest <crupest@outlook.com>2023-08-31 23:56:13 +0800
commit6664fb3506b1ea4af712fa849bd7c761a06c9843 (patch)
tree1a15efb73c5608d336587390aadea9a9a210cc25 /FrontEnd/src/pages/timeline
parenta1f69d978426c6a4cb7e8f3116e087553dbbffd5 (diff)
downloadtimeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.tar.gz
timeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.tar.bz2
timeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.zip
...
Diffstat (limited to 'FrontEnd/src/pages/timeline')
-rw-r--r--FrontEnd/src/pages/timeline/CollapseButton.tsx25
-rw-r--r--FrontEnd/src/pages/timeline/Timeline.tsx4
-rw-r--r--FrontEnd/src/pages/timeline/TimelineInfoCard.css (renamed from FrontEnd/src/pages/timeline/TimelineCard.css)0
-rw-r--r--FrontEnd/src/pages/timeline/TimelineInfoCard.tsx (renamed from FrontEnd/src/pages/timeline/TimelineCard.tsx)97
4 files changed, 71 insertions, 55 deletions
diff --git a/FrontEnd/src/pages/timeline/CollapseButton.tsx b/FrontEnd/src/pages/timeline/CollapseButton.tsx
deleted file mode 100644
index 1c4fa2ba..00000000
--- a/FrontEnd/src/pages/timeline/CollapseButton.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { CSSProperties } from "react";
-
-import IconButton from "~src/components/button/IconButton";
-
-export default function CollapseButton({
- collapse,
- onClick,
- className,
- style,
-}: {
- collapse: boolean;
- onClick: () => void;
- className?: string;
- style?: CSSProperties;
-}) {
- return (
- <IconButton
- color="primary"
- icon={collapse ? "arrows-angle-expand" : "arrows-angle-contract"}
- onClick={onClick}
- className={className}
- style={style}
- />
- );
-}
diff --git a/FrontEnd/src/pages/timeline/Timeline.tsx b/FrontEnd/src/pages/timeline/Timeline.tsx
index caf4f502..4fe5c521 100644
--- a/FrontEnd/src/pages/timeline/Timeline.tsx
+++ b/FrontEnd/src/pages/timeline/Timeline.tsx
@@ -19,7 +19,7 @@ import { useScrollToBottom } from "~src/components/hooks";
import TimelinePostList from "./TimelinePostList";
import TimelinePostEdit from "./TimelinePostCreateView";
-import TimelineCard from "./TimelineCard";
+import TimelineInfoCard from "./TimelineInfoCard";
import "./Timeline.css";
@@ -159,7 +159,7 @@ export function Timeline(props: TimelineProps) {
return (
<div className="timeline-container">
{timeline && (
- <TimelineCard
+ <TimelineInfoCard
timeline={timeline}
connectionStatus={signalrState}
onReload={updateTimeline}
diff --git a/FrontEnd/src/pages/timeline/TimelineCard.css b/FrontEnd/src/pages/timeline/TimelineInfoCard.css
index 29e59b62..29e59b62 100644
--- a/FrontEnd/src/pages/timeline/TimelineCard.css
+++ b/FrontEnd/src/pages/timeline/TimelineInfoCard.css
diff --git a/FrontEnd/src/pages/timeline/TimelineCard.tsx b/FrontEnd/src/pages/timeline/TimelineInfoCard.tsx
index 1e0e9b75..b1310be9 100644
--- a/FrontEnd/src/pages/timeline/TimelineCard.tsx
+++ b/FrontEnd/src/pages/timeline/TimelineInfoCard.tsx
@@ -8,38 +8,55 @@ import { getHttpBookmarkClient } from "~src/http/bookmark";
import { pushAlert } from "~src/components/alert";
import { useMobile } from "~src/components/hooks";
-import { Dialog, DialogProvider, useDialog } from "~src/components/dialog";
+import { IconButton } from "~src/components/button";
+import {
+ Dialog,
+ FullPageDialog,
+ 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";
import Card from "~src/components/Card";
+
import TimelineDeleteDialog from "./TimelineDeleteDialog";
import ConnectionStatusBadge from "./ConnectionStatusBadge";
-import CollapseButton from "./CollapseButton";
import TimelineMember from "./TimelineMember";
import TimelinePropertyChangeDialog from "./TimelinePropertyChangeDialog";
-import IconButton from "~src/components/button/IconButton";
-import "./TimelineCard.css";
+import "./TimelineInfoCard.css";
+
+function CollapseButton({
+ collapse,
+ onClick,
+ className,
+}: {
+ collapse: boolean;
+ onClick: () => void;
+ className?: string;
+}) {
+ return (
+ <IconButton
+ color="primary"
+ icon={collapse ? "info-circle" : "x-circle"}
+ onClick={onClick}
+ className={className}
+ />
+ );
+}
-interface TimelinePageCardProps {
+interface TimelineInfoCardProps {
timeline: HttpTimelineInfo;
connectionStatus: HubConnectionState;
onReload: () => void;
}
-export default function TimelineCard(props: TimelinePageCardProps) {
- const { timeline, connectionStatus, onReload } = props;
-
+function TimelineInfoContent({
+ timeline,
+ onReload,
+}: Omit<TimelineInfoCardProps, "connectionStatus">) {
const user = useUser();
- const [collapse, setCollapse] = useState(true);
- const toggleCollapse = (): void => {
- setCollapse((o) => !o);
- };
-
- const isMobile = useMobile();
-
const { controller, createDialogSwitch } = useDialog({
member: (
<Dialog>
@@ -52,7 +69,7 @@ export default function TimelineCard(props: TimelinePageCardProps) {
delete: <TimelineDeleteDialog timeline={timeline} />,
});
- const content = (
+ return (
<div>
<h3 className="timeline-card-title">
{timeline.title}
@@ -127,8 +144,31 @@ export default function TimelineCard(props: TimelinePageCardProps) {
</PopupMenu>
)}
</div>
+ <DialogProvider controller={controller} />
</div>
);
+}
+
+export default function TimelineInfoCard(props: TimelineInfoCardProps) {
+ const { timeline, connectionStatus, onReload } = props;
+
+ const [collapse, setCollapse] = useState(true);
+
+ const isMobile = useMobile((mobile) => {
+ if (!mobile) {
+ switchDialog(null);
+ } else {
+ setCollapse(true);
+ }
+ });
+
+ const { controller, switchDialog } = useDialog({
+ "full-page": (
+ <FullPageDialog>
+ <TimelineInfoContent timeline={timeline} onReload={onReload} />
+ </FullPageDialog>
+ ),
+ });
return (
<Card
@@ -139,18 +179,19 @@ export default function TimelineCard(props: TimelinePageCardProps) {
>
<div className="timeline-card-top-right-area">
<ConnectionStatusBadge status={connectionStatus} />
- <CollapseButton collapse={collapse} onClick={toggleCollapse} />
+ <CollapseButton
+ collapse={collapse}
+ onClick={() => {
+ const open = collapse;
+ setCollapse(!open);
+ if (isMobile && open) {
+ switchDialog("full-page");
+ }
+ }}
+ />
</div>
- {isMobile ? (
- <FullPageDialog
- onBack={toggleCollapse}
- show={!collapse}
- contentContainerClassName="p-2"
- >
- {content}
- </FullPageDialog>
- ) : (
- <div style={{ display: collapse ? "none" : "block" }}>{content}</div>
+ {!collapse && !isMobile && (
+ <TimelineInfoContent timeline={timeline} onReload={onReload} />
)}
<DialogProvider controller={controller} />
</Card>