From 35c0defdc36cd2997818363fcb9513aa4431a9be Mon Sep 17 00:00:00 2001 From: qianzhu <36325249+syt-honey@users.noreply.github.com> Date: Mon, 23 Oct 2023 12:20:37 +0800 Subject: [PATCH 1/2] refactor(project): refactor pmi link --- packages/flat-i18n/locales/en.json | 2 - packages/flat-i18n/locales/zh-CN.json | 2 - .../HomePage/MainRoomMenu/CreateRoomBox.tsx | 10 +++ .../src/HomePage/MainRoomMenu/index.tsx | 4 +- .../flat-pages/src/LoginPage/utils/state.ts | 6 +- .../src/UserScheduledPage/index.tsx | 12 ++- .../GeneralSettingPage/index.tsx | 86 +++++++------------ .../flat-stores/src/classroom-store/index.ts | 3 +- packages/flat-stores/src/global-store.ts | 10 ++- packages/flat-stores/src/preferences-store.ts | 2 +- 10 files changed, 63 insertions(+), 74 deletions(-) diff --git a/packages/flat-i18n/locales/en.json b/packages/flat-i18n/locales/en.json index 1ae90805181..e60f540e55c 100644 --- a/packages/flat-i18n/locales/en.json +++ b/packages/flat-i18n/locales/en.json @@ -536,8 +536,6 @@ "user-pmi-drained": "User PMI used up, please contact the administrator", "pmi-room-exist": "PMI room already exists, please cancel existing PMI room first", "pmi-help": "Your own room number, you can use this fixed number to create a room", - "get-link": "Create room to generate link", - "get-pmi": "Generate PMI", "personal-room-id": "Personal Room ID", "personal-room-link": "Personal Room Link", "upload-avatar": "Upload Avatar", diff --git a/packages/flat-i18n/locales/zh-CN.json b/packages/flat-i18n/locales/zh-CN.json index ebba5874d8a..1fd915603b4 100644 --- a/packages/flat-i18n/locales/zh-CN.json +++ b/packages/flat-i18n/locales/zh-CN.json @@ -536,8 +536,6 @@ "user-pmi-drained": "用户PMI已分配完,请联系管理员", "pmi-room-exist": "个人房间已存在,请先取消已存在的房间", "pmi-help": "你的专属房间号,可使用该固定号码创建房间", - "get-link": "创建房间获取邀请链接", - "get-pmi": "获取", "personal-room-id": "个人房间号", "personal-room-link": "个人房间链接", "upload-avatar": "上传头像", diff --git a/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx b/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx index e85b108290a..73a89c8b3d8 100644 --- a/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx +++ b/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx @@ -55,6 +55,16 @@ export const CreateRoomBox = observer(function CreateRoomBox pmi: preferencesStore.autoPmiOn && !globalStore.pmiRoomExist, }; + useEffect(() => { + const checkPmi = (): void => { + if (!globalStore.pmi) { + globalStore.updatePmi(); + } + }; + + checkPmi(); + }, [globalStore]); + useEffect(() => { let ticket = NaN; if (isShowModal) { diff --git a/packages/flat-pages/src/HomePage/MainRoomMenu/index.tsx b/packages/flat-pages/src/HomePage/MainRoomMenu/index.tsx index 35734ce9235..dc59b11082b 100644 --- a/packages/flat-pages/src/HomePage/MainRoomMenu/index.tsx +++ b/packages/flat-pages/src/HomePage/MainRoomMenu/index.tsx @@ -3,7 +3,7 @@ import "./MainRoomMenu.less"; import React, { FC, useContext } from "react"; import { Col, Row } from "antd"; import { Region } from "flat-components"; -import { RoomType, listPmi } from "@netless/flat-server-api"; +import { RoomType } from "@netless/flat-server-api"; import { GlobalStoreContext, RoomStoreContext } from "../../components/StoreProvider"; import { RouteNameType, usePushHistory } from "../../utils/routes"; import { CreateRoomBox } from "./CreateRoomBox"; @@ -58,7 +58,7 @@ export const MainRoomMenu: FC = () => { if (pmi) { // update pmi room list - globalStore.updatePmiRoomList((await listPmi()) || []); + globalStore.updatePmiRoomList(); } await onJoinRoom(roomUUID); diff --git a/packages/flat-pages/src/LoginPage/utils/state.ts b/packages/flat-pages/src/LoginPage/utils/state.ts index 13c51f9f954..a60ec3be5d8 100644 --- a/packages/flat-pages/src/LoginPage/utils/state.ts +++ b/packages/flat-pages/src/LoginPage/utils/state.ts @@ -9,7 +9,7 @@ import { githubLogin } from "../githubLogin"; import { googleLogin } from "../googleLogin"; import { WindowsSystemBtnContext } from "../../components/StoreProvider"; import { loginMachine, ToggleEventsType } from "./machine"; -import { LoginProcessResult, createOrGetPmi, listPmi } from "@netless/flat-server-api"; +import { LoginProcessResult } from "@netless/flat-server-api"; import { LoginButtonProviderType } from "flat-components"; import { LoginDisposer } from "./disposer"; import { NODE_ENV } from "../../constants/process"; @@ -87,8 +87,8 @@ export function useLoginState(): LoginState { const onLoginResult = useCallback( async (authData: LoginProcessResult | null, account?: Account) => { globalStore.updateUserInfo(authData); - globalStore.updatePmi((await createOrGetPmi({ create: true }))?.pmi || null); - globalStore.updatePmiRoomList((await listPmi()) || []); + globalStore.updatePmi(); + globalStore.updatePmiRoomList(); if (!authData) { setLoginResult(null); diff --git a/packages/flat-pages/src/UserScheduledPage/index.tsx b/packages/flat-pages/src/UserScheduledPage/index.tsx index 1eef10b8e52..b2647bca081 100644 --- a/packages/flat-pages/src/UserScheduledPage/index.tsx +++ b/packages/flat-pages/src/UserScheduledPage/index.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useEffect, useState } from "react"; import { observer } from "mobx-react-lite"; import { isBefore, addMinutes, roundToNearestMinutes, getDay, addWeeks } from "date-fns"; import { EditRoomFormValues } from "flat-components"; @@ -59,6 +59,16 @@ export const UserScheduledPage = observer(function UserScheduledPage() { }; }); + useEffect(() => { + const checkPmi = (): void => { + if (!globalStore.pmi) { + globalStore.updatePmi(); + } + }; + + checkPmi(); + }, [globalStore]); + return ( globalStore.hasPassword, [globalStore.hasPassword]); const personalLink = useMemo( - () => globalStore.pmiRoomExist && `${FLAT_WEB_BASE_URL}/join/${globalStore.pmiRoomUUID}`, - [globalStore.pmiRoomExist, globalStore.pmiRoomUUID], + () => `${FLAT_WEB_BASE_URL}/join/${globalStore.pmi}`, + [globalStore.pmi], ); const loginButtons = useMemo( @@ -79,6 +78,16 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() { [], ); + useEffect(() => { + const checkPmi = (): void => { + if (!globalStore.pmi) { + globalStore.updatePmi(); + } + }; + + checkPmi(); + }, [globalStore]); + async function changeUserName(): Promise { if (name !== globalStore.userName) { await sp(rename(name)); @@ -167,19 +176,6 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() { [t], ); - const handlePmi = useCallback(async () => { - try { - const { pmi = null } = await createOrGetPmi({ create: true }); - globalStore.updatePmi(pmi); - } catch (err) { - errorTips(err); - } - }, [globalStore]); - - const generatePersonalLink = useCallback(() => { - pushHistory(RouteNameType.HomePage); - }, [pushHistory]); - return (
@@ -204,26 +200,14 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() { - {globalStore.pmi ? ( - <> - {globalStore.pmi} - - - ) : ( - - )} + {globalStore.pmi} +
@@ -233,26 +217,14 @@ export const GeneralSettingPage = observer(function GeneralSettingPage() { {t("personal-room-link")} - {personalLink ? ( - <> - {personalLink} - - - ) : ( - - )} + {personalLink} + diff --git a/packages/flat-stores/src/classroom-store/index.ts b/packages/flat-stores/src/classroom-store/index.ts index c23e3047091..1a338bb7382 100644 --- a/packages/flat-stores/src/classroom-store/index.ts +++ b/packages/flat-stores/src/classroom-store/index.ts @@ -10,7 +10,6 @@ import { RoomStatus, RoomType, checkRTMCensor, - listPmi, } from "@netless/flat-server-api"; import { FlatI18n } from "@netless/flat-i18n"; import { errorTips, message } from "flat-components"; @@ -1373,7 +1372,7 @@ export class ClassroomStore { if (globalStore.pmiRoomUUID === this.roomUUID) { // remove pmi room id list - globalStore.updatePmiRoomList((await listPmi()) || []); + globalStore.updatePmiRoomList(); } break; } diff --git a/packages/flat-stores/src/global-store.ts b/packages/flat-stores/src/global-store.ts index 2bbf4b74b11..70aadf9f3f4 100644 --- a/packages/flat-stores/src/global-store.ts +++ b/packages/flat-stores/src/global-store.ts @@ -3,6 +3,8 @@ import { LoginProcessResult, setFlatAuthToken, ServerRegionConfigResult, + createOrGetPmi, + listPmi, } from "@netless/flat-server-api"; import { autorun } from "mobx"; import { autoPersistStore } from "./utils/auto-persist-store"; @@ -121,12 +123,12 @@ export class GlobalStore { }); } - public updatePmi = (pmi: string | null): void => { - this.pmi = pmi; + public updatePmi = async (pmi?: string | null): Promise => { + this.pmi = pmi ?? ((await createOrGetPmi({ create: true }))?.pmi || null); }; - public updatePmiRoomList = (pmiRoomList: PmiRoom[]): void => { - this.pmiRoomList = pmiRoomList; + public updatePmiRoomList = async (pmiRoomList?: PmiRoom[]): Promise => { + this.pmiRoomList = pmiRoomList ?? ((await listPmi()) || []); }; public updateUserInfo = (userInfo: UserInfo | null): void => { diff --git a/packages/flat-stores/src/preferences-store.ts b/packages/flat-stores/src/preferences-store.ts index f3afeb71d93..3f3c9158d9d 100644 --- a/packages/flat-stores/src/preferences-store.ts +++ b/packages/flat-stores/src/preferences-store.ts @@ -29,7 +29,7 @@ export class PreferencesStore { /** selected speaker device id on devices test page */ public speakerId?: string | null = null; - public autoPmiOn = true; + public autoPmiOn = false; public prefersColorScheme: FlatPrefersColorScheme = "light"; From b9065567def2458a03423322fe247c297c906bdf Mon Sep 17 00:00:00 2001 From: hyrious Date: Sun, 22 Oct 2023 23:46:18 -0500 Subject: [PATCH 2/2] refactor(project): merge from main --- .../MainRoomListPanel/MainRoomList.tsx | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/flat-pages/src/HomePage/MainRoomListPanel/MainRoomList.tsx b/packages/flat-pages/src/HomePage/MainRoomListPanel/MainRoomList.tsx index 42dd3d80cad..3282887b86c 100644 --- a/packages/flat-pages/src/HomePage/MainRoomListPanel/MainRoomList.tsx +++ b/packages/flat-pages/src/HomePage/MainRoomListPanel/MainRoomList.tsx @@ -11,9 +11,10 @@ import { RoomListItemPrimaryAction, RoomListSkeletons, RoomStatusType, + StopClassConfirmModal, errorTips, } from "flat-components"; -import { ListRoomsType, RoomStatus, RoomType } from "@netless/flat-server-api"; +import { ListRoomsType, RoomStatus, RoomType, stopClass } from "@netless/flat-server-api"; import { GlobalStoreContext, RoomStoreContext } from "../../components/StoreProvider"; import { RoomItem } from "@netless/flat-stores"; import { useSafePromise } from "../../utils/hooks/lifecycle"; @@ -37,6 +38,7 @@ export const MainRoomList = observer(function MainRoomList({ const [skeletonsVisible, setSkeletonsVisible] = useState(false); const [roomUUIDs, setRoomUUIDs] = useState(); const [cancelModalVisible, setCancelModalVisible] = useState(false); + const [stopModalVisible, setStopModalVisible] = useState(false); const [inviteModalVisible, setInviteModalVisible] = useState(false); const [removeHistoryVisible, setRemoveHistoryVisible] = useState(false); const [removeHistoryLoading, setRemoveHistoryLoading] = useState(false); @@ -188,6 +190,11 @@ export const MainRoomList = observer(function MainRoomList({ setCancelModalVisible(true); break; } + case "stop": { + setCurrentRoom(room); + setStopModalVisible(true); + break; + } case "invite": { setCurrentRoom(room); setInviteModalVisible(true); @@ -238,6 +245,14 @@ export const MainRoomList = observer(function MainRoomList({ onCancelRoom={removeRoomHandler} /> )} + {currentRoom && ( + + )} {currentRoom && ( (function MainRoomList({ setCancelModalVisible(false); } + function hideStopModal(): void { + setStopModalVisible(false); + } + function hideInviteModal(): void { setInviteModalVisible(false); } @@ -343,6 +362,27 @@ export const MainRoomList = observer(function MainRoomList({ } } + async function stopRoomHandler(): Promise { + const { ownerUUID, roomUUID, roomStatus } = currentRoom!; + const isCreator = ownerUUID === globalStore.userUUID; + const isStarted = roomStatus === RoomStatus.Started || roomStatus === RoomStatus.Paused; + try { + if (isCreator && isStarted) { + await stopClass(roomUUID); + + if (globalStore.pmiRoomUUID === roomUUID) { + // remove pmi room id list + globalStore.updatePmiRoomList(); + } + void refreshRooms(); + } + setStopModalVisible(false); + } catch (e) { + console.error(e); + errorTips(e); + } + } + async function removeConfirm(): Promise { setRemoveHistoryLoading(true); try { @@ -364,7 +404,7 @@ export const MainRoomList = observer(function MainRoomList({ type SubActions = | Array<{ key: "details" | "share" | "delete-history"; text: string }> - | Array<{ key: "details" | "modify" | "cancel" | "invite"; text: string }>; + | Array<{ key: "details" | "modify" | "cancel" | "stop" | "invite"; text: string }>; function getSubActions(room: RoomItem): SubActions { const result = [{ key: "details", text: t("room-detail") }];