From 58e23e759d730dd9d9733a64e5f16cc5aafeba35 Mon Sep 17 00:00:00 2001
From: crupest <crupest@outlook.com>
Date: Mon, 15 Feb 2021 01:08:05 +0800
Subject: refactor: Refactor timeline card.

---
 FrontEnd/src/app/views/timeline/TimelineCard.tsx | 85 ++++++++++++++++++++++++
 1 file changed, 85 insertions(+)
 create mode 100644 FrontEnd/src/app/views/timeline/TimelineCard.tsx

(limited to 'FrontEnd/src/app/views/timeline/TimelineCard.tsx')

diff --git a/FrontEnd/src/app/views/timeline/TimelineCard.tsx b/FrontEnd/src/app/views/timeline/TimelineCard.tsx
new file mode 100644
index 00000000..a777cbbd
--- /dev/null
+++ b/FrontEnd/src/app/views/timeline/TimelineCard.tsx
@@ -0,0 +1,85 @@
+import React from "react";
+
+import TimelinePageCardTemplate, {
+  TimelineCardTemplateProps,
+} from "../timeline-common/TimelinePageCardTemplate";
+import { TimelinePageCardProps } from "../timeline-common/TimelinePageTemplate";
+import UserAvatar from "../common/user/UserAvatar";
+import TimelineDeleteDialog from "./TimelineDeleteDialog";
+
+const TimelineCard: React.FC<TimelinePageCardProps> = (props) => {
+  const { timeline } = props;
+
+  const [dialog, setDialog] = React.useState<
+    "member" | "property" | "delete" | null
+  >(null);
+
+  return (
+    <>
+      <TimelinePageCardTemplate
+        infoArea={
+          <>
+            <h3 className="text-primary d-inline-block align-middle">
+              {timeline.title}
+              <small className="ml-3 text-secondary">{timeline.name}</small>
+            </h3>
+            <div className="align-middle">
+              <UserAvatar
+                username={timeline.owner.username}
+                className="avatar small rounded-circle mr-3"
+              />
+              {timeline.owner.nickname}
+              <small className="ml-3 text-secondary">
+                @{timeline.owner.username}
+              </small>
+            </div>
+          </>
+        }
+        manageArea={((): TimelineCardTemplateProps["manageArea"] => {
+          if (!timeline.manageable) {
+            return { type: "member" };
+          } else {
+            return {
+              type: "manage",
+              items: [
+                {
+                  type: "button",
+                  text: "timeline.manageItem.property",
+                  onClick: () => setDialog("property"),
+                },
+                {
+                  type: "button",
+                  onClick: () => setDialog("member"),
+                  text: "timeline.manageItem.member",
+                },
+                { type: "divider" },
+                {
+                  type: "button",
+                  onClick: () => setDialog("delete"),
+                  color: "danger",
+                  text: "timeline.manageItem.delete",
+                },
+              ],
+            };
+          }
+        })()}
+        dialog={dialog}
+        setDialog={setDialog}
+        {...props}
+      />
+      {(() => {
+        if (dialog === "delete") {
+          return (
+            <TimelineDeleteDialog
+              timeline={timeline}
+              open
+              close={() => setDialog(null)}
+            />
+          );
+        }
+      })()}
+    </>
+  );
+};
+
+export default TimelineCard;
-- 
cgit v1.2.3

