diff --git a/desktop/renderer-app/src/pages/utils/join-room-handler.ts b/desktop/renderer-app/src/pages/utils/join-room-handler.ts index 72296d99753..3739e94483a 100644 --- a/desktop/renderer-app/src/pages/utils/join-room-handler.ts +++ b/desktop/renderer-app/src/pages/utils/join-room-handler.ts @@ -35,6 +35,15 @@ export const joinRoomHandler = async ( new Error("failed to join room: incorrect room type"); } } + + if (data.billing && data.billing.vipLevel === 0) { + void message.info( + FlatI18n.t("time-limit-tip", { + roomType: FlatI18n.t("vip-level." + data.billing.vipLevel), + minutes: data.billing.limit, + }), + ); + } } catch (e) { // if room not found and is pmi room, show wait for teacher to enter if (e.message.includes(RequestErrorCode.RoomNotFoundAndIsPmi)) { @@ -43,5 +52,7 @@ export const joinRoomHandler = async ( } pushHistory(RouteNameType.HomePage); errorTips(e); + + globalStore.setRequestRefreshRooms(true); } }; diff --git a/packages/flat-i18n/locales/en.json b/packages/flat-i18n/locales/en.json index 00dd5b9ffa4..b596b2180eb 100644 --- a/packages/flat-i18n/locales/en.json +++ b/packages/flat-i18n/locales/en.json @@ -642,9 +642,15 @@ "bad-request": "Bad request", "jwt-verify-failed": "Login verify failed", "forward-failed": "Request failed", - "the-room-is-full": "The room is full", - "the-room-is-expired": "The room has expired", - "the-room-is-not-started-yet": "The room has not started yet", + "rooms-has-reached-the-limit": "You have reached the limit of creating rooms this month, upgrade your account to create more rooms", + "the-room-is-full": "The room is full, please try again later or contact the owner", + "the-room-is-expired": "The room has ended", + "the-room-is-not-started-yet": "The room has not started yet, please try again later", + "time-limit-tip": "This {{roomType}} room has a limit of {{minutes}} minutes", + "vip-level": { + "0": "free", + "1": "" + }, "members": "Members", "staging": "On Stage", "stage-on": "You are on stage", diff --git a/packages/flat-i18n/locales/zh-CN.json b/packages/flat-i18n/locales/zh-CN.json index 2ed47d6de38..822a1c9cc5f 100644 --- a/packages/flat-i18n/locales/zh-CN.json +++ b/packages/flat-i18n/locales/zh-CN.json @@ -642,9 +642,15 @@ "bad-request": "请求参数错误", "jwt-verify-failed": "登录信息获取失败", "forward-failed": "请求出错", - "the-room-is-full": "房间人数已达上限", + "rooms-has-reached-the-limit": "本月创建免费房间个数已达上限,升级版本享受更多权益", + "the-room-is-full": "免费版房间人数已达上限,暂时无法加入,请联系老师解决", "the-room-is-expired": "房间已结束", - "the-room-is-not-started-yet": "房间还未开始", + "the-room-is-not-started-yet": "房间未开始,开课前 5 分钟可进入,已将该房间添加到房间列表", + "time-limit-tip": "你已加入{{roomType}} {{minutes}} 分钟限时房间", + "vip-level": { + "0": "免费版", + "1": "专业版" + }, "members": "学生", "staging": "上/下台", "stage-on": "你已上台", diff --git a/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx b/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx index f7b8fba49a6..287e57b7ef9 100644 --- a/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx +++ b/packages/flat-pages/src/HomePage/MainRoomMenu/CreateRoomBox.tsx @@ -15,6 +15,7 @@ import { PmiDesc, PmiExistTip, Region, + errorTips, formatInviteCode, } from "flat-components"; import { Input, Modal, Checkbox, Form, InputRef, Dropdown, message, Button } from "antd"; @@ -290,6 +291,7 @@ export const CreateRoomBox = observer(function CreateRoomBox showModal(false); } catch (e) { console.error(e); + errorTips(e); setLoading(false); } } diff --git a/packages/flat-pages/src/HomePage/index.tsx b/packages/flat-pages/src/HomePage/index.tsx index 2b38e215cc1..b75008dd2ab 100644 --- a/packages/flat-pages/src/HomePage/index.tsx +++ b/packages/flat-pages/src/HomePage/index.tsx @@ -60,6 +60,18 @@ export const HomePage = observer(function HomePage() { }; }, [refreshRooms, isLogin]); + useEffect(() => { + if (!isLogin) { + return; + } + + if (globalStore.requestRefreshRooms) { + void refreshRooms(); + void globalStore.updatePmiRoomList(); + globalStore.setRequestRefreshRooms(false); + } + }, [refreshRooms, isLogin, globalStore.requestRefreshRooms]); + return (
diff --git a/packages/flat-pages/src/utils/join-room-handler.ts b/packages/flat-pages/src/utils/join-room-handler.ts index 85a45819b84..a248dede4eb 100644 --- a/packages/flat-pages/src/utils/join-room-handler.ts +++ b/packages/flat-pages/src/utils/join-room-handler.ts @@ -38,6 +38,15 @@ export const joinRoomHandler = async ( new Error("failed to join room: incorrect room type"); } } + + if (data.billing && data.billing.vipLevel === 0) { + void message.info( + FlatI18n.t("time-limit-tip", { + roomType: FlatI18n.t("vip-level." + data.billing.vipLevel), + minutes: data.billing.limit, + }), + ); + } } catch (e) { // if room not found and is pmi room, show wait for teacher to enter if (e.message.includes(RequestErrorCode.RoomNotFoundAndIsPmi)) { @@ -46,5 +55,7 @@ export const joinRoomHandler = async ( } pushHistory(RouteNameType.HomePage); errorTips(e); + + globalStore.setRequestRefreshRooms(true); } }; diff --git a/packages/flat-server-api/src/error.ts b/packages/flat-server-api/src/error.ts index af6673561c2..bfa6d900e50 100644 --- a/packages/flat-server-api/src/error.ts +++ b/packages/flat-server-api/src/error.ts @@ -28,9 +28,10 @@ export enum RequestErrorCode { BadRequest = 210000, // bad request JWTVerifyFailed, // jwt verify failed - RoomLimit, // join room reach max user limit + RoomUserLimit, // join room reach max user limit RoomExpired, // room expired RoomNotBegin, // join room before begin_time + RoomCreateLimit, // create room reach max limit InternalError = 220000, // unknown error ForwardFailed, // forward failed @@ -117,9 +118,10 @@ export const RequestErrorMessage = { [RequestErrorCode.BadRequest]: "bad-request", [RequestErrorCode.JWTVerifyFailed]: "jwt-verify-failed", - [RequestErrorCode.RoomLimit]: "the-room-is-full", + [RequestErrorCode.RoomUserLimit]: "the-room-is-full", [RequestErrorCode.RoomExpired]: "the-room-is-expired", [RequestErrorCode.RoomNotBegin]: "the-room-is-not-started-yet", + [RequestErrorCode.RoomCreateLimit]: "rooms-has-reached-the-limit", [RequestErrorCode.InternalError]: "unknown-error", [RequestErrorCode.ForwardFailed]: "forward-failed", diff --git a/packages/flat-server-api/src/room.ts b/packages/flat-server-api/src/room.ts index d3589cbc6f3..c0a9fdd7d21 100644 --- a/packages/flat-server-api/src/room.ts +++ b/packages/flat-server-api/src/room.ts @@ -104,9 +104,12 @@ export interface JoinRoomResult { showGuide: boolean; region: Region; billing?: { - expireAt: string; + /** minutes */ + limit: number; + createdAt: number; + expireAt: number; maxUser: number; - vipLevel: number; // 0 = normal, 1 = pro + vipLevel: 0 | 1; // 0 = normal, 1 = pro }; } diff --git a/packages/flat-stores/src/global-store.ts b/packages/flat-stores/src/global-store.ts index 83321871d9b..7d742e71dac 100644 --- a/packages/flat-stores/src/global-store.ts +++ b/packages/flat-stores/src/global-store.ts @@ -51,6 +51,8 @@ export class GlobalStore { public pmi: string | null = null; public pmiRoomList: PmiRoom[] | null = []; + public requestRefreshRooms = false; + // login with password public currentAccount: Account | null = null; public accountHistory: Account[] = []; @@ -319,6 +321,10 @@ export class GlobalStore { public updateServerRegionConfig = (config: ServerRegionConfig | null): void => { this.serverRegionConfig = config; }; + + public setRequestRefreshRooms(value = true): void { + this.requestRefreshRooms = value; + } } export const globalStore = new GlobalStore();