From 58e23e759d730dd9d9733a64e5f16cc5aafeba35 Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 15 Feb 2021 01:08:05 +0800 Subject: refactor: Refactor timeline card. --- FrontEnd/src/app/views/timeline/TimelineCard.tsx | 85 ++++++++++++++++++++++ .../app/views/timeline/TimelineDeleteDialog.tsx | 10 +-- .../src/app/views/timeline/TimelineInfoCard.tsx | 70 ------------------ FrontEnd/src/app/views/timeline/TimelinePageUI.tsx | 20 ----- FrontEnd/src/app/views/timeline/index.tsx | 33 ++------- 5 files changed, 98 insertions(+), 120 deletions(-) create mode 100644 FrontEnd/src/app/views/timeline/TimelineCard.tsx delete mode 100644 FrontEnd/src/app/views/timeline/TimelineInfoCard.tsx delete mode 100644 FrontEnd/src/app/views/timeline/TimelinePageUI.tsx (limited to 'FrontEnd/src/app/views/timeline') 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 = (props) => { + const { timeline } = props; + + const [dialog, setDialog] = React.useState< + "member" | "property" | "delete" | null + >(null); + + return ( + <> + +

+ {timeline.title} + {timeline.name} +

+
+ + {timeline.owner.nickname} + + @{timeline.owner.username} + +
+ + } + 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 ( + setDialog(null)} + /> + ); + } + })()} + + ); +}; + +export default TimelineCard; diff --git a/FrontEnd/src/app/views/timeline/TimelineDeleteDialog.tsx b/FrontEnd/src/app/views/timeline/TimelineDeleteDialog.tsx index f472c16a..dbca62ca 100644 --- a/FrontEnd/src/app/views/timeline/TimelineDeleteDialog.tsx +++ b/FrontEnd/src/app/views/timeline/TimelineDeleteDialog.tsx @@ -2,20 +2,20 @@ import React from "react"; import { useHistory } from "react-router"; import { Trans } from "react-i18next"; -import { getHttpTimelineClient } from "@/http/timeline"; +import { getHttpTimelineClient, HttpTimelineInfo } from "@/http/timeline"; import OperationDialog from "../common/OperationDialog"; interface TimelineDeleteDialog { + timeline: HttpTimelineInfo; open: boolean; - name: string; close: () => void; } const TimelineDeleteDialog: React.FC = (props) => { const history = useHistory(); - const { name } = props; + const { timeline } = props; return ( = (props) => { }, ]} inputValidator={([value]) => { - if (value !== name) { + if (value !== timeline.name) { return { 0: "timeline.deleteDialog.notMatch" }; } else { return null; } }} onProcess={() => { - return getHttpTimelineClient().deleteTimeline(name); + return getHttpTimelineClient().deleteTimeline(timeline.name); }} onSuccessAndClose={() => { history.replace("/"); diff --git a/FrontEnd/src/app/views/timeline/TimelineInfoCard.tsx b/FrontEnd/src/app/views/timeline/TimelineInfoCard.tsx deleted file mode 100644 index 63da6f3c..00000000 --- a/FrontEnd/src/app/views/timeline/TimelineInfoCard.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from "react"; - -import TimelineCardTemplate, { - TimelineCardTemplateProps, -} from "../timeline-common/TimelineCardTemplate"; -import { TimelineCardComponentProps } from "../timeline-common/TimelinePageTemplateUI"; -import UserAvatar from "../common/user/UserAvatar"; - -export type OrdinaryTimelineManageItem = "delete"; - -export type TimelineInfoCardProps = TimelineCardComponentProps; - -const TimelineInfoCard: React.FC = (props) => { - const { timeline, operations } = props; - const { onManage, onMember } = operations; - - return ( - -

- {timeline.title} - {timeline.name} -

-
- - {timeline.owner.nickname} - - @{timeline.owner.username} - -
- - } - manageArea={((): TimelineCardTemplateProps["manageArea"] => { - if (onManage == null) { - return { type: "member", onMember }; - } else { - return { - type: "manage", - items: [ - { - type: "button", - text: "timeline.manageItem.property", - onClick: () => onManage("property"), - }, - { - type: "button", - onClick: onMember, - text: "timeline.manageItem.member", - }, - { type: "divider" }, - { - type: "button", - onClick: () => onManage("delete"), - color: "danger", - text: "timeline.manageItem.delete", - }, - ], - }; - } - })()} - {...props} - /> - ); -}; - -export default TimelineInfoCard; diff --git a/FrontEnd/src/app/views/timeline/TimelinePageUI.tsx b/FrontEnd/src/app/views/timeline/TimelinePageUI.tsx deleted file mode 100644 index 67ea699e..00000000 --- a/FrontEnd/src/app/views/timeline/TimelinePageUI.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; - -import TimelinePageTemplateUI, { - TimelinePageTemplateUIProps, -} from "../timeline-common/TimelinePageTemplateUI"; - -import TimelineInfoCard, { - OrdinaryTimelineManageItem, -} from "./TimelineInfoCard"; - -export type TimelinePageUIProps = Omit< - TimelinePageTemplateUIProps, - "CardComponent" ->; - -const TimelinePageUI: React.FC = (props) => { - return ; -}; - -export default TimelinePageUI; diff --git a/FrontEnd/src/app/views/timeline/index.tsx b/FrontEnd/src/app/views/timeline/index.tsx index 8048dd12..c5bfd7ab 100644 --- a/FrontEnd/src/app/views/timeline/index.tsx +++ b/FrontEnd/src/app/views/timeline/index.tsx @@ -2,38 +2,21 @@ import React from "react"; import { useParams } from "react-router"; import TimelinePageTemplate from "../timeline-common/TimelinePageTemplate"; - -import TimelinePageUI from "./TimelinePageUI"; -import { OrdinaryTimelineManageItem } from "./TimelineInfoCard"; -import TimelineDeleteDialog from "./TimelineDeleteDialog"; +import TimelineCard from "./TimelineCard"; const TimelinePage: React.FC = () => { const { name } = useParams<{ name: string }>(); - const [dialog, setDialog] = React.useState( - null - ); const [reloadKey, setReloadKey] = React.useState(0); - let dialogElement: React.ReactElement | undefined; - if (dialog === "delete") { - dialogElement = ( - setDialog(null)} name={name} /> - ); - } - return ( - <> - setDialog(item)} - notFoundI18nKey="timeline.timelineNotExist" - reloadKey={reloadKey} - onReload={() => setReloadKey(reloadKey + 1)} - /> - {dialogElement} - + setReloadKey(reloadKey + 1)} + /> ); }; -- cgit v1.2.3