From 9e3271ecc5b97c733c1b6cb4f9256efd3015fc18 Mon Sep 17 00:00:00 2001 From: hyrious Date: Thu, 27 May 2021 17:15:43 +0800 Subject: [PATCH] feat(flat-components): add LoadingPage (#671) --- .../src/pages/BigClassPage/index.tsx | 2 +- .../OrdinaryRoomForm.tsx | 3 +- .../PeriodicSubRoomForm.tsx | 3 +- .../pages/ModifyPeriodicRoomPage/index.tsx | 2 +- .../src/pages/OneToOnePage/index.tsx | 2 +- .../pages/PeriodicRoomDetailPage/index.tsx | 7 ++--- .../src/pages/ReplayPage/index.tsx | 6 ++-- .../src/pages/RoomDetailPage/index.tsx | 3 +- .../src/pages/ScheduleRoomPage/index.tsx | 2 +- .../src/pages/SmallClassPage/index.tsx | 2 +- .../LoadingPage/LoadingPage.stories.tsx | 21 ++++++++++++++ .../components/LoadingPage/icons/loading.gif | Bin 0 -> 42302 bytes .../src/components/LoadingPage/index.tsx | 27 +++++++----------- .../src/components/LoadingPage/style.less | 2 +- packages/flat-components/src/index.ts | 1 + .../flat-components/src/types/images.d.ts | 5 ++++ packages/flat-i18n/locales/en.json | 16 ++++++----- packages/flat-i18n/locales/zh-CN.json | 4 ++- 18 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 packages/flat-components/src/components/LoadingPage/LoadingPage.stories.tsx create mode 100644 packages/flat-components/src/components/LoadingPage/icons/loading.gif rename desktop/renderer-app/src/LoadingPage.tsx => packages/flat-components/src/components/LoadingPage/index.tsx (64%) rename desktop/renderer-app/src/LoadingPage.less => packages/flat-components/src/components/LoadingPage/style.less (95%) diff --git a/desktop/renderer-app/src/pages/BigClassPage/index.tsx b/desktop/renderer-app/src/pages/BigClassPage/index.tsx index 60697438896..5ed3aba3da5 100644 --- a/desktop/renderer-app/src/pages/BigClassPage/index.tsx +++ b/desktop/renderer-app/src/pages/BigClassPage/index.tsx @@ -7,6 +7,7 @@ import { RecordButton, TopBar, TopBarDivider, + LoadingPage, } from "flat-components"; import { observer } from "mobx-react-lite"; import React, { useContext, useEffect, useRef, useState } from "react"; @@ -29,7 +30,6 @@ import { TopBarRightBtn } from "../../components/TopBarRightBtn"; import { GlobalStoreContext } from "../../components/StoreProvider"; import { TopBarRoundBtn } from "../../components/TopBarRoundBtn"; import { Whiteboard } from "../../components/Whiteboard"; -import LoadingPage from "../../LoadingPage"; import { RecordingConfig, RoomStatusLoadingType, diff --git a/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/OrdinaryRoomForm.tsx b/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/OrdinaryRoomForm.tsx index bff3af0eacd..5513b10b4d4 100644 --- a/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/OrdinaryRoomForm.tsx +++ b/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/OrdinaryRoomForm.tsx @@ -2,10 +2,9 @@ import { message } from "antd"; import React, { useEffect, useState } from "react"; import { observer } from "mobx-react-lite"; import { useHistory } from "react-router-dom"; -import { EditRoomFormInitialValues, EditRoomFormValues } from "flat-components"; +import { EditRoomFormInitialValues, EditRoomFormValues, LoadingPage } from "flat-components"; import { ordinaryRoomInfo, updateOrdinaryRoom } from "../../apiMiddleware/flatServer"; import EditRoomPage from "../../components/EditRoomPage"; -import LoadingPage from "../../LoadingPage"; import { useSafePromise } from "../../utils/hooks/lifecycle"; import { errorTips } from "../../components/Tips/ErrorTips"; export interface OrdinaryRoomFormProps { diff --git a/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/PeriodicSubRoomForm.tsx b/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/PeriodicSubRoomForm.tsx index 66a20ca4f77..078603004df 100644 --- a/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/PeriodicSubRoomForm.tsx +++ b/desktop/renderer-app/src/pages/ModifyOrdinaryRoomPage/PeriodicSubRoomForm.tsx @@ -2,12 +2,11 @@ import { message } from "antd"; import React, { useEffect, useState } from "react"; import { observer } from "mobx-react-lite"; import { useHistory } from "react-router-dom"; +import { EditRoomFormInitialValues, EditRoomFormValues, LoadingPage } from "flat-components"; import { periodicSubRoomInfo, updatePeriodicSubRoom } from "../../apiMiddleware/flatServer"; import EditRoomPage from "../../components/EditRoomPage"; -import LoadingPage from "../../LoadingPage"; import { useSafePromise } from "../../utils/hooks/lifecycle"; import { errorTips } from "../../components/Tips/ErrorTips"; -import { EditRoomFormInitialValues, EditRoomFormValues } from "flat-components"; export interface PeriodicSubRoomFormProps { roomUUID: string; diff --git a/desktop/renderer-app/src/pages/ModifyPeriodicRoomPage/index.tsx b/desktop/renderer-app/src/pages/ModifyPeriodicRoomPage/index.tsx index 64e42f3d54e..e31f374d665 100644 --- a/desktop/renderer-app/src/pages/ModifyPeriodicRoomPage/index.tsx +++ b/desktop/renderer-app/src/pages/ModifyPeriodicRoomPage/index.tsx @@ -7,12 +7,12 @@ import { EditRoomFormValues, getEndTimeFromRate, getRateFromEndTime, + LoadingPage, } from "flat-components"; import { useSafePromise } from "../../utils/hooks/lifecycle"; import EditRoomPage from "../../components/EditRoomPage"; import { RouteNameType, RouteParams, usePushHistory } from "../../utils/routes"; import { periodicRoomInfo, updatePeriodicRoom } from "../../apiMiddleware/flatServer"; -import LoadingPage from "../../LoadingPage"; import { errorTips } from "../../components/Tips/ErrorTips"; import { useWindowSize } from "../../utils/hooks/useWindowSize"; diff --git a/desktop/renderer-app/src/pages/OneToOnePage/index.tsx b/desktop/renderer-app/src/pages/OneToOnePage/index.tsx index 7bdcd268ad6..6c8c37a9746 100644 --- a/desktop/renderer-app/src/pages/OneToOnePage/index.tsx +++ b/desktop/renderer-app/src/pages/OneToOnePage/index.tsx @@ -12,6 +12,7 @@ import { RecordButton, TopBar, TopBarDivider, + LoadingPage, } from "flat-components"; import InviteButton from "../../components/InviteButton"; @@ -27,7 +28,6 @@ import { } from "../../components/ExitRoomConfirm"; import { Whiteboard } from "../../components/Whiteboard"; import { RoomStatusStoppedModal } from "../../components/ClassRoom/RoomStatusStoppedModal"; -import LoadingPage from "../../LoadingPage"; import { RoomStatus, RoomType } from "../../apiMiddleware/flatServer/constants"; import { RecordingConfig, diff --git a/desktop/renderer-app/src/pages/PeriodicRoomDetailPage/index.tsx b/desktop/renderer-app/src/pages/PeriodicRoomDetailPage/index.tsx index d5721c1a6b4..ca36e9973a1 100644 --- a/desktop/renderer-app/src/pages/PeriodicRoomDetailPage/index.tsx +++ b/desktop/renderer-app/src/pages/PeriodicRoomDetailPage/index.tsx @@ -1,20 +1,19 @@ import "./index.less"; import { clipboard } from "electron"; -import { MainPageHeader, PeriodicRoomPanel } from "flat-components"; +import { message } from "antd"; import { observer } from "mobx-react-lite"; -import React, { useContext, useEffect, useState } from "react"; import { useHistory, useParams } from "react-router-dom"; +import React, { useContext, useEffect, useState } from "react"; import { useLastLocation } from "react-router-last-location"; +import { LoadingPage, MainPageHeader, PeriodicRoomPanel } from "flat-components"; import { MainPageLayoutContainer } from "../../components/MainPageLayoutContainer"; import { RoomStoreContext } from "../../components/StoreProvider"; import { errorTips } from "../../components/Tips/ErrorTips"; -import LoadingPage from "../../LoadingPage"; import { globalStore } from "../../stores/GlobalStore"; import { useWindowSize } from "../../utils/hooks/useWindowSize"; import { RouteNameType, RouteParams, usePushHistory } from "../../utils/routes"; import { cancelPeriodicRoom, cancelPeriodicSubRoom } from "../../apiMiddleware/flatServer"; -import { message } from "antd"; export const PeriodicRoomDetailPage = observer<{}>(function PeriodicRoomDetailPage() { useWindowSize("Main"); diff --git a/desktop/renderer-app/src/pages/ReplayPage/index.tsx b/desktop/renderer-app/src/pages/ReplayPage/index.tsx index baee40ce98f..2f050b8ac9c 100644 --- a/desktop/renderer-app/src/pages/ReplayPage/index.tsx +++ b/desktop/renderer-app/src/pages/ReplayPage/index.tsx @@ -1,7 +1,8 @@ import React, { useEffect, useRef, useState } from "react"; import { RouteComponentProps, useParams, useHistory } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { LoadingPage } from "flat-components"; import PlayerController from "@netless/player-controller"; -import LoadingPage from "../../LoadingPage"; import { ipcAsyncByMainWindow, ipcReceive, ipcReceiveRemove } from "../../utils/ipc"; import PageError from "../../PageError"; import { RealtimePanel } from "../../components/RealtimePanel"; @@ -40,6 +41,7 @@ export type ReplayPageState = { export const ReplayPage = observer(function ReplayPage() { useWindowSize("Replay"); + const { t } = useTranslation(); const whiteboardElRef = useRef(null); const videoElRef = useRef(null); const [showExitReplayModal, setShowExitReplayModal] = useState(false); @@ -179,7 +181,7 @@ export const ReplayPage = observer(function ReplayPage() { ) : classRoomReplayStore.isReady ? null : (
- +
); } diff --git a/desktop/renderer-app/src/pages/RoomDetailPage/index.tsx b/desktop/renderer-app/src/pages/RoomDetailPage/index.tsx index f317bf7bfc2..68f5f1dca41 100644 --- a/desktop/renderer-app/src/pages/RoomDetailPage/index.tsx +++ b/desktop/renderer-app/src/pages/RoomDetailPage/index.tsx @@ -3,13 +3,12 @@ import "./index.less"; import React, { useContext, useEffect } from "react"; import { clipboard } from "electron"; -import { MainPageHeader, RoomDetailPanel } from "flat-components"; +import { LoadingPage, MainPageHeader, RoomDetailPanel } from "flat-components"; import { observer } from "mobx-react-lite"; import { useHistory, useParams } from "react-router-dom"; import { MainPageLayoutContainer } from "../../components/MainPageLayoutContainer"; import { GlobalStoreContext, RoomStoreContext } from "../../components/StoreProvider"; import { errorTips } from "../../components/Tips/ErrorTips"; -import LoadingPage from "../../LoadingPage"; import { useWindowSize } from "../../utils/hooks/useWindowSize"; import { RouteNameType, RouteParams, usePushHistory } from "../../utils/routes"; import { joinRoomHandler } from "../utils/joinRoomHandler"; diff --git a/desktop/renderer-app/src/pages/ScheduleRoomPage/index.tsx b/desktop/renderer-app/src/pages/ScheduleRoomPage/index.tsx index dbd9388c1b4..b966c008c87 100644 --- a/desktop/renderer-app/src/pages/ScheduleRoomPage/index.tsx +++ b/desktop/renderer-app/src/pages/ScheduleRoomPage/index.tsx @@ -8,6 +8,7 @@ import { observer } from "mobx-react-lite"; import React, { useContext, useEffect, useState } from "react"; import { useHistory, useParams } from "react-router-dom"; import { useLastLocation } from "react-router-last-location"; +import { LoadingPage } from "flat-components"; import backSVG from "../../assets/image/back.svg"; import moreBtnSVG from "../../assets/image/moreBtn.svg"; import { CopyInvitationItem } from "../../components/MoreMenu/CopyInvitationItem"; @@ -16,7 +17,6 @@ import { RemoveRoomItem } from "../../components/MoreMenu/RemoveRoomItem"; import { RoomDetailsItem } from "../../components/MoreMenu/RoomDetailsItem"; import { RoomStatusElement } from "../../components/RoomStatusElement/RoomStatusElement"; import { RoomStoreContext } from "../../components/StoreProvider"; -import LoadingPage from "../../LoadingPage"; import { globalStore } from "../../stores/GlobalStore"; import { RoomItem } from "../../stores/RoomStore"; import { getRoomTypeName, getWeekName } from "../../utils/getTypeName"; diff --git a/desktop/renderer-app/src/pages/SmallClassPage/index.tsx b/desktop/renderer-app/src/pages/SmallClassPage/index.tsx index 0c069336b16..9f7233288c9 100644 --- a/desktop/renderer-app/src/pages/SmallClassPage/index.tsx +++ b/desktop/renderer-app/src/pages/SmallClassPage/index.tsx @@ -10,6 +10,7 @@ import { RecordButton, TopBar, TopBarDivider, + LoadingPage, } from "flat-components"; import InviteButton from "../../components/InviteButton"; @@ -24,7 +25,6 @@ import ExitRoomConfirm, { useExitRoomConfirmModal, } from "../../components/ExitRoomConfirm"; import { RoomStatusStoppedModal } from "../../components/ClassRoom/RoomStatusStoppedModal"; -import LoadingPage from "../../LoadingPage"; import { RtcChannelType } from "../../apiMiddleware/Rtc"; import { ClassModeType } from "../../apiMiddleware/Rtm"; diff --git a/packages/flat-components/src/components/LoadingPage/LoadingPage.stories.tsx b/packages/flat-components/src/components/LoadingPage/LoadingPage.stories.tsx new file mode 100644 index 00000000000..ce89b4c7927 --- /dev/null +++ b/packages/flat-components/src/components/LoadingPage/LoadingPage.stories.tsx @@ -0,0 +1,21 @@ +import { Meta, Story } from "@storybook/react"; +import faker from "faker"; +import React from "react"; +import { BrowserRouter as Router } from "react-router-dom"; +import { LoadingPage, LoadingPageProps } from "."; + +const storyMeta: Meta = { + title: "LoadingPage/LoadingPage", + component: LoadingPage, +}; + +export default storyMeta; + +export const Overview: Story = args => ( + + + +); +Overview.args = { + text: faker.random.words(), +}; diff --git a/packages/flat-components/src/components/LoadingPage/icons/loading.gif b/packages/flat-components/src/components/LoadingPage/icons/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..a766153c5986a445aef87df9b81db66895c3605c GIT binary patch literal 42302 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 literal 0 HcmV?d00001 diff --git a/desktop/renderer-app/src/LoadingPage.tsx b/packages/flat-components/src/components/LoadingPage/index.tsx similarity index 64% rename from desktop/renderer-app/src/LoadingPage.tsx rename to packages/flat-components/src/components/LoadingPage/index.tsx index df021f4e68a..1332a192c7e 100644 --- a/desktop/renderer-app/src/LoadingPage.tsx +++ b/packages/flat-components/src/components/LoadingPage/index.tsx @@ -1,10 +1,11 @@ -import loading from "./assets/image/loading.gif"; -import "./LoadingPage.less"; +import "./style.less"; +import loadingGIF from "./icons/loading.gif"; import React, { FC, useEffect, useState } from "react"; import { Button } from "antd"; -import { Link } from "react-router-dom"; import classNames from "classnames"; +import { Link } from "react-router-dom"; +import { useTranslation } from "react-i18next"; export interface LoadingPageProps { text?: string; @@ -12,33 +13,27 @@ export interface LoadingPageProps { export const LoadingPage: FC = ({ text }) => { const [isShowReturnHomePage, showReturnHomePage] = useState(false); + const { t } = useTranslation(); useEffect(() => { - const ticket = window.setTimeout(() => { - showReturnHomePage(true); - }, 20000); - - return () => { - window.clearTimeout(ticket); - }; + const ticket = window.setTimeout(() => showReturnHomePage(true), 20000); + return () => window.clearTimeout(ticket); }, []); return ( -
+
- {"loading"} + loading {text && {text}}
- +
); }; - -export default LoadingPage; diff --git a/desktop/renderer-app/src/LoadingPage.less b/packages/flat-components/src/components/LoadingPage/style.less similarity index 95% rename from desktop/renderer-app/src/LoadingPage.less rename to packages/flat-components/src/components/LoadingPage/style.less index e61aed5856f..541b903da0e 100644 --- a/desktop/renderer-app/src/LoadingPage.less +++ b/packages/flat-components/src/components/LoadingPage/style.less @@ -1,4 +1,4 @@ -.loading-page-container { +.loading-page { width: 100%; height: 100%; display: flex; diff --git a/packages/flat-components/src/index.ts b/packages/flat-components/src/index.ts index 70c7c502767..79433e281ff 100644 --- a/packages/flat-components/src/index.ts +++ b/packages/flat-components/src/index.ts @@ -9,6 +9,7 @@ export * from "./components/CloudStorage"; export * from "./components/EditRoomPage"; export * from "./components/HomePage"; export * from "./components/InviteModal"; +export * from "./components/LoadingPage"; export * from "./components/LoginPage"; export * from "./components/MainPageLayout"; export * from "./components/PeriodicRoomPage"; diff --git a/packages/flat-components/src/types/images.d.ts b/packages/flat-components/src/types/images.d.ts index ba3c32baa6f..2101e8501c0 100644 --- a/packages/flat-components/src/types/images.d.ts +++ b/packages/flat-components/src/types/images.d.ts @@ -12,3 +12,8 @@ declare module "*.png" { const content: string; export default content; } + +declare module "*.gif" { + const content: string; + export default content; +} diff --git a/packages/flat-i18n/locales/en.json b/packages/flat-i18n/locales/en.json index cb68d6b2ec7..f4d15c8ec3e 100644 --- a/packages/flat-i18n/locales/en.json +++ b/packages/flat-i18n/locales/en.json @@ -58,14 +58,14 @@ "teacher-left-temporarily": "The teacher leaves temporarily", "the-room-has-ended-and-is-about-to-exit": "The room has ended and is about to exit...", "class-picker-text": { - "bigClass": "Suitable for 1 teacher for a large number of students", - "oneToOne": "Suitable for 1 teacher and 1 student", - "smallClass": "Suitable for 1 teacher for up to 16 students" + "BigClass": "Suitable for 1 teacher for a large number of students", + "OneToOne": "Suitable for 1 teacher and 1 student", + "SmallClass": "Suitable for 1 teacher for up to 16 students" }, "class-room-type": { - "bigClass": "Large Class", - "oneToOne": "One to One", - "smallClass": "Small Class" + "BigClass": "Large Class", + "OneToOne": "One to One", + "SmallClass": "Small Class" }, "home-page-hero-button-type": { "create": "Create", @@ -76,5 +76,7 @@ "idle": "idle", "running": "running", "stopped": "stopped" - } + }, + "return-home": "Return Home", + "waiting-for-record": "Replay is being generated, please wait patiently." } diff --git a/packages/flat-i18n/locales/zh-CN.json b/packages/flat-i18n/locales/zh-CN.json index 2e966190ffa..c24d0f68bc4 100644 --- a/packages/flat-i18n/locales/zh-CN.json +++ b/packages/flat-i18n/locales/zh-CN.json @@ -76,5 +76,7 @@ "BigClass": "适用于 1 位老师面向大量学生", "OneToOne": "适用于 1 位老师与 1 名学生", "SmallClass": "适用于 1 位老师面向最多 16 名学生" - } + }, + "return-home": "返回首页", + "waiting-for-record": "正在生成回放请耐心等待" }