diff options
author | crupest <crupest@outlook.com> | 2021-04-16 17:03:40 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-04-16 17:03:40 +0800 |
commit | 9c0053cd70593bf6add0eab4dbb91a8479d56821 (patch) | |
tree | 78c33492bb2a834bc08249b2ed783ef0627fa376 /FrontEnd | |
parent | 2fc57dc2f83d51444a793411d3bb5418a3871cc9 (diff) | |
download | timeline-9c0053cd70593bf6add0eab4dbb91a8479d56821.tar.gz timeline-9c0053cd70593bf6add0eab4dbb91a8479d56821.tar.bz2 timeline-9c0053cd70593bf6add0eab4dbb91a8479d56821.zip |
...
Diffstat (limited to 'FrontEnd')
-rw-r--r-- | FrontEnd/src/app/locales/en/translation.json | 2 | ||||
-rw-r--r-- | FrontEnd/src/app/locales/zh/translation.json | 2 | ||||
-rw-r--r-- | FrontEnd/src/app/views/home-v2/TimelineListView.tsx | 32 | ||||
-rw-r--r-- | FrontEnd/src/app/views/home-v2/home-v2.sass | 11 | ||||
-rw-r--r-- | FrontEnd/src/app/views/home-v2/index.tsx | 47 |
5 files changed, 84 insertions, 10 deletions
diff --git a/FrontEnd/src/app/locales/en/translation.json b/FrontEnd/src/app/locales/en/translation.json index 6707105a..a878badd 100644 --- a/FrontEnd/src/app/locales/en/translation.json +++ b/FrontEnd/src/app/locales/en/translation.json @@ -28,6 +28,8 @@ "loadImageError": "Failed to load image.", "home": { "loadingHighlightTimelines": "Loading highlight timelines...", + "loadedHighlightTimelines": "Here are some highlight timelines💡", + "errorHighlightTimelines": "Failed to load highlight timelines, please try reloading!", "highlightTimeline": "Highlight Timelines", "relatedTimeline": "Timelines Related To You", "publicTimeline": "Public Timelines", diff --git a/FrontEnd/src/app/locales/zh/translation.json b/FrontEnd/src/app/locales/zh/translation.json index dbff0a28..3f956d3d 100644 --- a/FrontEnd/src/app/locales/zh/translation.json +++ b/FrontEnd/src/app/locales/zh/translation.json @@ -28,6 +28,8 @@ "loadImageError": "加载图片失败", "home": { "loadingHighlightTimelines": "正在加载高光时间线...", + "loadedHighlightTimelines": "康康以下这些高光时间线💡", + "errorHighlightTimelines": "加载高光时间线失败,刷新试试!", "highlightTimeline": "高光时间线", "relatedTimeline": "关于你的时间线", "publicTimeline": "公开时间线", diff --git a/FrontEnd/src/app/views/home-v2/TimelineListView.tsx b/FrontEnd/src/app/views/home-v2/TimelineListView.tsx index 1ba9f765..9c44a0c2 100644 --- a/FrontEnd/src/app/views/home-v2/TimelineListView.tsx +++ b/FrontEnd/src/app/views/home-v2/TimelineListView.tsx @@ -4,14 +4,23 @@ import { convertI18nText, I18nText } from "@/common"; import { HttpTimelineInfo } from "@/http/timeline"; import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; interface TimelineListItemProps { timeline: HttpTimelineInfo; } const TimelineListItem: React.FC<TimelineListItemProps> = ({ timeline }) => { + const url = React.useMemo( + () => + timeline.name.startsWith("@") + ? `/users/${timeline.owner.username}` + : `/timelines/${timeline.name}`, + [timeline] + ); + return ( - <div className="home-v2-timeline-list-item"> + <div className="home-v2-timeline-list-item home-v2-timeline-list-item-timeline"> <svg className="home-v2-timeline-list-item-line" viewBox="0 0 120 100"> <path d="M 80,50 m 0,-12 a 12 12 180 1 1 0,24 12 12 180 1 1 0,-24 z M 60,0 h 40 v 100 h -40 z" @@ -19,12 +28,20 @@ const TimelineListItem: React.FC<TimelineListItemProps> = ({ timeline }) => { fill="#007bff" /> </svg> - <div>{timeline.title}</div> + <div> + <div>{timeline.title}</div> + <div> + <small className="text-secondary">{timeline.description}</small> + </div> + </div> + <Link to={url}> + <i className="icon-button bi-arrow-right ml-3" /> + </Link> </div> ); }; -const TimelineListLoading: React.FC = () => { +const TimelineListArrow: React.FC = () => { return ( <div> <div className="home-v2-timeline-list-item"> @@ -73,11 +90,10 @@ const TimelineListView: React.FC<TimelineListViewProps> = ({ </svg> <h3>{convertI18nText(headerText, t)}</h3> </div> - {timelines != null ? ( - timelines.map((t) => <TimelineListItem key={t.name} timeline={t} />) - ) : ( - <TimelineListLoading /> - )} + {timelines != null + ? timelines.map((t) => <TimelineListItem key={t.name} timeline={t} />) + : null} + <TimelineListArrow /> </div> ); }; diff --git a/FrontEnd/src/app/views/home-v2/home-v2.sass b/FrontEnd/src/app/views/home-v2/home-v2.sass index a3218f08..56049994 100644 --- a/FrontEnd/src/app/views/home-v2/home-v2.sass +++ b/FrontEnd/src/app/views/home-v2/home-v2.sass @@ -2,6 +2,17 @@ display: flex
align-items: center
+.home-v2-timeline-list-item-timeline
+ transition: background 0.8s
+ animation: 0.8s home-v2-timeline-list-item-timeline-enter
+ &:hover
+ background: $gray-200
+
+@keyframes home-v2-timeline-list-item-timeline-enter
+ from
+ transform: translate(-100%,0)
+ opacity: 0
+
.home-v2-timeline-list-item-line
width: 80px
flex-shrink: 0
diff --git a/FrontEnd/src/app/views/home-v2/index.tsx b/FrontEnd/src/app/views/home-v2/index.tsx index 75c51540..cb3c1428 100644 --- a/FrontEnd/src/app/views/home-v2/index.tsx +++ b/FrontEnd/src/app/views/home-v2/index.tsx @@ -8,6 +8,14 @@ import SearchInput from "../common/SearchInput"; import TimelineListView from "./TimelineListView"; import TimelineCreateDialog from "../home/TimelineCreateDialog"; +import { HttpTimelineInfo } from "@/http/timeline"; +import { getHttpHighlightClient } from "@/http/highlight"; + +const highlightTimelineMessageMap = { + loading: "home.loadingHighlightTimelines", + done: "home.loadedHighlightTimelines", + error: "home.errorHighlightTimelines", +} as const; const HomeV2: React.FC = () => { const history = useHistory(); @@ -20,11 +28,43 @@ const HomeV2: React.FC = () => { const [dialog, setDialog] = React.useState<"create" | null>(null); + const [highlightTimelineState, setHighlightTimelineState] = React.useState< + "loading" | "done" | "error" + >("loading"); + const [highlightTimelines, setHighlightTimelines] = React.useState< + HttpTimelineInfo[] | undefined + >(); + + React.useEffect(() => { + if (highlightTimelineState === "loading") { + let subscribe = true; + void getHttpHighlightClient() + .list() + .then( + (data) => { + if (subscribe) { + setHighlightTimelineState("done"); + setHighlightTimelines(data); + } + }, + () => { + if (subscribe) { + setHighlightTimelineState("error"); + setHighlightTimelines(undefined); + } + } + ); + return () => { + subscribe = false; + }; + } + }, [highlightTimelineState]); + return ( <> <Container fluid className="px-0"> <Row className="mx-0 my-3 px-2 justify-content-end"> - <Col xs="auto"> + <Col xs="12" sm="auto"> <SearchInput value={navText} onChange={setNavText} @@ -46,7 +86,10 @@ const HomeV2: React.FC = () => { /> </Col> </Row> - <TimelineListView headerText="home.loadingHighlightTimelines" /> + <TimelineListView + headerText={highlightTimelineMessageMap[highlightTimelineState]} + timelines={highlightTimelines} + /> </Container> {dialog === "create" && ( <TimelineCreateDialog open close={() => setDialog(null)} /> |