diff options
author | crupest <crupest@outlook.com> | 2023-07-31 17:15:53 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-07-31 17:15:53 +0800 |
commit | f0f1984405db795d5a60bd03d05bec524dc12db3 (patch) | |
tree | d84d06ca188ff91987177fc4477c9045eaa73cc1 /FrontEnd/src/pages | |
parent | d9c1d512fa64ef4f8c08ca34f7a5842642879bcc (diff) | |
download | timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.tar.gz timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.tar.bz2 timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.zip |
...
Diffstat (limited to 'FrontEnd/src/pages')
-rw-r--r-- | FrontEnd/src/pages/timeline/TimelineCard.css | 47 | ||||
-rw-r--r-- | FrontEnd/src/pages/timeline/TimelineCard.tsx | 94 |
2 files changed, 91 insertions, 50 deletions
diff --git a/FrontEnd/src/pages/timeline/TimelineCard.css b/FrontEnd/src/pages/timeline/TimelineCard.css index 75ce6c51..1bffe980 100644 --- a/FrontEnd/src/pages/timeline/TimelineCard.css +++ b/FrontEnd/src/pages/timeline/TimelineCard.css @@ -6,13 +6,56 @@ margin: 0.5em; } +@media (min-width: 576px) { + .timeline-card-expand { + min-width: 400px; + } +} + .timeline-card-title { display: inline-block; vertical-align: middle; - color: var(--cru-key-on-color); + color: var(--cru-key-container-on-color); + margin: 0.5em 1em; } .timeline-card-title-name { margin-inline-start: 1em; - color: var(--cru-surface-on-color); + color: var(--cru-surface-on-variant-color); +} + +.timeline-card-user { + display: flex; + align-items: center; + margin: 0 1em 0.5em; +} + +.timeline-card-user-avatar { + width: 2em; + height: 2em; + border-radius: 50%; +} + +.timeline-card-user-nickname { + margin-inline: 0.6em; +} + +.timeline-card-description { + margin: 0 1em 0.5em; +} + +.timeline-card-top-right-area { + float: right; + display: flex; + align-items: center; + margin: 0 1em; +} + +.timeline-card-buttons { + display: flex; + justify-content: end; +} + +.timeline-card-button { + margin: 0 0.2em; }
\ No newline at end of file diff --git a/FrontEnd/src/pages/timeline/TimelineCard.tsx b/FrontEnd/src/pages/timeline/TimelineCard.tsx index bcdfa4c2..cdc8a5a7 100644 --- a/FrontEnd/src/pages/timeline/TimelineCard.tsx +++ b/FrontEnd/src/pages/timeline/TimelineCard.tsx @@ -1,15 +1,13 @@ import { useState } from "react"; -import classnames from "classnames"; import { HubConnectionState } from "@microsoft/signalr"; -import { useIsSmallScreen } from "@/utilities/hooks"; -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 { useC } from "@/views/common/common"; +import { useMobile } from "@/views/common/common"; import { useDialog } from "@/views/common/dialog"; import UserAvatar from "@/views/common/user/UserAvatar"; import PopupMenu from "@/views/common/menu/PopupMenu"; @@ -35,17 +33,18 @@ export default function TimelineCard(props: TimelinePageCardProps) { const user = useUser(); - const c = useC(); - const [collapse, setCollapse] = useState(true); const toggleCollapse = (): void => { setCollapse((o) => !o); }; - const isSmallScreen = useIsSmallScreen(); + const isMobile = useMobile(); - const { createDialogSwitch, dialog, dialogPropsMap, switchDialog } = - useDialog(["member", "property", "delete"]); + const { createDialogSwitch, dialogPropsMap } = useDialog([ + "member", + "property", + "delete", + ]); const content = ( <div className="cru-primary"> @@ -53,25 +52,24 @@ export default function TimelineCard(props: TimelinePageCardProps) { {timeline.title} <small className="timeline-card-title-name">{timeline.nameV2}</small> </h3> - <div> + <div className="timeline-card-user"> <UserAvatar username={timeline.owner.username} - className="cru-avatar small cru-round me-3" + className="timeline-card-user-avatar" /> - {timeline.owner.nickname} - <small className="ms-3 cru-color-secondary"> + <span className="timeline-card-user-nickname"> + {timeline.owner.nickname} + </span> + <small className="timeline-card-user-username"> @{timeline.owner.username} </small> </div> - <p className="mb-0">{timeline.description}</p> - <small className="mt-1 d-block"> - {c(timelineVisibilityTooltipTranslationMap[timeline.visibility])} - </small> - <div className="mt-2 cru-text-end"> - {user != null ? ( + <p className="timeline-card-description">{timeline.description}</p> + <div className="timeline-card-buttons"> + {user && ( <IconButton icon={timeline.isBookmark ? "bookmark-fill" : "bookmark"} - className="me-3" + className="timeline-card-button" onClick={() => { getHttpBookmarkClient() [timeline.isBookmark ? "delete" : "post"]( @@ -89,13 +87,13 @@ export default function TimelineCard(props: TimelinePageCardProps) { }); }} /> - ) : null} + )} <IconButton icon="people" - className="me-3" + className="timeline-card-button" onClick={createDialogSwitch("member")} /> - {timeline.manageable ? ( + {timeline.manageable && ( <PopupMenu items={[ { @@ -113,37 +111,37 @@ export default function TimelineCard(props: TimelinePageCardProps) { ]} containerClassName="d-inline" > - <IconButton icon="three-dots-vertical" /> + <IconButton + className="timeline-card-button" + icon="three-dots-vertical" + /> </PopupMenu> - ) : null} + )} </div> </div> ); return ( - <> - <Card className="timeline-card"> - <div - className={classnames( - "cru-float-right d-flex align-items-center", - !collapse && "ms-3", - )} + <Card + className={`timeline-card timeline-card-${ + collapse ? "collapse" : "expand" + }`} + > + <div className="timeline-card-top-right-area"> + <ConnectionStatusBadge status={connectionStatus} /> + <CollapseButton collapse={collapse} onClick={toggleCollapse} /> + </div> + {isMobile ? ( + <FullPageDialog + onBack={toggleCollapse} + show={!collapse} + contentContainerClassName="p-2" > - <ConnectionStatusBadge status={connectionStatus} className="me-2" /> - <CollapseButton collapse={collapse} onClick={toggleCollapse} /> - </div> - {isSmallScreen ? ( - <FullPageDialog - onBack={toggleCollapse} - show={!collapse} - contentContainerClassName="p-2" - > - {content} - </FullPageDialog> - ) : ( - <div style={{ display: collapse ? "none" : "inline" }}>{content}</div> - )} - </Card> + {content} + </FullPageDialog> + ) : ( + <div style={{ display: collapse ? "none" : "block" }}>{content}</div> + )} <TimelineMemberDialog timeline={timeline} onChange={onReload} @@ -155,6 +153,6 @@ export default function TimelineCard(props: TimelinePageCardProps) { {...dialogPropsMap["property"]} /> <TimelineDeleteDialog timeline={timeline} {...dialogPropsMap["delete"]} /> - </> + </Card> ); } |