diff --git a/src/app/config.ts b/src/app/config.ts index bf1552e9..92325d40 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -11,12 +11,15 @@ let prices: Price[] = [ type: "booking", } ]; - -const local_dev = `https://dev.voce.chat`; +const official_dev = `https://dev.voce.chat`; +// const local_dev = `http://07333.qicp.vip:3030`; +const local_dev = official_dev; // const local_dev = `http://localhost:3333`; export const BASE_ORIGIN = process.env.REACT_APP_RELEASE ? `${location.origin}` : local_dev; +export const IS_OFFICIAL_DEMO = BASE_ORIGIN === official_dev; + const BASE_URL = `${BASE_ORIGIN}/api`; export const getLicensePriceList = () => { const ps = prices.map((p, idx) => { @@ -69,7 +72,7 @@ export const PAYMENT_URL_PREFIX = process.env.NODE_ENV === "production" ? `https://vera.nicegoodthings.com` : `http://localhost:4000`; -export const CACHE_VERSION = `0.3.33`; +export const CACHE_VERSION = `0.3.36`; export const GuestRoutes = ["/", "/chat", "/chat/channel/:channel_id"]; export const ContentTypes = { text: "text/plain", diff --git a/src/app/services/server.ts b/src/app/services/server.ts index bc636791..301f1ae4 100644 --- a/src/app/services/server.ts +++ b/src/app/services/server.ts @@ -1,5 +1,5 @@ import { createApi } from "@reduxjs/toolkit/query/react"; -import BASE_URL, { ContentTypes, PAYMENT_URL_PREFIX } from "../config"; +import BASE_URL, { ContentTypes, IS_OFFICIAL_DEMO, PAYMENT_URL_PREFIX } from "../config"; import { updateInfo } from "../slices/server"; import baseQuery from "./base.query"; import { RootState } from "../store"; @@ -214,7 +214,24 @@ export const serverApi = createApi({ getLicense: builder.query({ query: () => ({ url: `/license` - }) + }), + async onQueryStarted(data, { dispatch, queryFulfilled, getState }) { + // vocechat官方demo 则忽略 + if (IS_OFFICIAL_DEMO) return; + const rootStore = getState() as RootState; + const { upgraded: prevValue } = rootStore.server; + try { + const { data: { user_limit } } = await queryFulfilled; + const currValue = user_limit > 20; + if (prevValue !== currValue) { + dispatch(updateInfo({ upgraded: currValue })); + } + } catch { + console.error("update license upgraded status failed "); + + } + + } }), getLicensePaymentUrl: builder.mutation({ diff --git a/src/app/slices/server.ts b/src/app/slices/server.ts index 5eac6755..879411b9 100644 --- a/src/app/slices/server.ts +++ b/src/app/slices/server.ts @@ -2,6 +2,7 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { Server } from "../../types/server"; export interface StoredServer extends Server { + upgraded: boolean, logo: string; inviteLink?: { link: string; @@ -9,6 +10,7 @@ export interface StoredServer extends Server { }; } const initialState: StoredServer = { + upgraded: false, name: "", description: "", logo: "", @@ -27,6 +29,7 @@ const serverSlice = createSlice({ }, fillServer(state, action: PayloadAction) { const { + upgraded = false, inviteLink = { link: "", expire: 0 @@ -35,7 +38,7 @@ const serverSlice = createSlice({ name = "", description = "" } = action.payload || {}; - return { name, logo, description, inviteLink }; + return { upgraded, name, logo, description, inviteLink }; }, updateInfo(state, action: PayloadAction>) { const values = action.payload || {}; diff --git a/src/common/component/BlankPlaceholder.tsx b/src/common/component/BlankPlaceholder.tsx index d7ac7e04..4268398f 100644 --- a/src/common/component/BlankPlaceholder.tsx +++ b/src/common/component/BlankPlaceholder.tsx @@ -12,6 +12,7 @@ import IconInvite from "../../assets/icons/placeholder.invite.svg"; import IconDownload from "../../assets/icons/placeholder.download.svg"; import UsersModal from "./UsersModal"; import { useAppSelector } from "../../app/store"; +import useLicense from "../hook/useLicense"; interface Props { @@ -28,6 +29,7 @@ const BlankPlaceholder: FC = ({ type = "chat" }) => { const [inviteModalVisible, setInviteModalVisible] = useState(false); const [createChannelVisible, setCreateChannelVisible] = useState(false); const [userListVisible, setUserListVisible] = useState(false); + const { upgraded } = useLicense(); const toggleChannelModalVisible = () => { setCreateChannelVisible((prev) => !prev); }; @@ -45,13 +47,11 @@ const BlankPlaceholder: FC = ({ type = "chat" }) => {

{t("title", { name: server.name })}

-

+

{ - // console.log("attr", link); - // if (!url) return <>{content}; return <> {content} @@ -77,14 +77,17 @@ const BlankPlaceholder: FC = ({ type = "chat" }) => {

- - -
{t("download")}
-
- - -
{t("help")}
-
+ {!upgraded && <> + + +
{t("download")}
+
+ + +
{t("help")}
+
+ + }
{createChannelVisible && ( diff --git a/src/common/hook/useLicense.ts b/src/common/hook/useLicense.ts index ccc73628..78aa249c 100644 --- a/src/common/hook/useLicense.ts +++ b/src/common/hook/useLicense.ts @@ -7,8 +7,8 @@ import { import { useAppSelector } from "../../app/store"; const useLicense = () => { - const { userCount, isGuest } = useAppSelector((store) => { - return { userCount: store.users.ids.length, isGuest: store.authData.guest }; + const { userCount, isGuest, upgraded } = useAppSelector((store) => { + return { userCount: store.users.ids.length, isGuest: store.authData.guest, upgraded: store.server.upgraded }; }); const { data: license, refetch: refetchLicense } = useGetLicenseQuery(undefined, { refetchOnMountOrArgChange: true, @@ -36,6 +36,7 @@ const useLicense = () => { }, [upserted]); const lUserLimit = license?.user_limit ?? Number.MAX_SAFE_INTEGER; return { + upgraded, reachLimit: userCount >= lUserLimit, license, checked, diff --git a/src/routes/setting/navs.tsx b/src/routes/setting/navs.tsx index a94139c3..261fe5b1 100644 --- a/src/routes/setting/navs.tsx +++ b/src/routes/setting/navs.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import MyAccount from "./MyAccount"; import Overview from "./Overview"; import Logins from "./config/Logins"; @@ -12,7 +13,6 @@ import ManageMembers from "../../common/component/ManageMembers"; import Version from "../../common/component/Version"; // import ConfigAgora from "./config/Agora"; import { useAppSelector } from "../../app/store"; -import { useTranslation } from "react-i18next"; import ServerVersionChecker from "../../common/component/ServerVersionChecker"; import useLicense from "../../common/hook/useLicense"; @@ -98,7 +98,7 @@ const navs = [ ]; const useNavs = () => { - const { license: licenseInfo } = useLicense(); + const { upgraded } = useLicense(); const { t } = useTranslation("setting"); const loginUser = useAppSelector((store) => { return store.authData.user; @@ -107,11 +107,13 @@ const useNavs = () => { const { name, items, ...rest } = n; return { name, + // @ts-ignore title: t(`nav.${name}`), items: items.map(item => { const { name, ...rest } = item; return { name, + // @ts-ignore title: t(`nav.${name}`), ...rest }; @@ -126,7 +128,7 @@ const useNavs = () => { // about 特殊处理下 if (nav.name == "about") { // 有付费,但是普通用户,则不显示about - return licenseInfo?.user_limit === 20; + return !upgraded; } else { return !nav.admin; }