diff --git a/client/shared/components/AlphaContainer.tsx b/client/shared/components/AlphaContainer.tsx new file mode 100644 index 00000000..82a15c45 --- /dev/null +++ b/client/shared/components/AlphaContainer.tsx @@ -0,0 +1,15 @@ +import React, { Fragment, PropsWithChildren } from 'react'; +import { useAlphaMode } from '../hooks/useAlphaMode'; + +/** + * Alpha 容器 + * 在 alpha 模式下可以看到一些可以被公开但是还在测试中的功能 + */ +export const AlphaContainer: React.FC = React.memo( + (props) => { + const { isAlphaMode } = useAlphaMode(); + + return isAlphaMode ? {props.children} : null; + } +); +AlphaContainer.displayName = 'AlphaContainer'; diff --git a/client/web/src/components/DevContainer.tsx b/client/shared/components/DevContainer.tsx similarity index 86% rename from client/web/src/components/DevContainer.tsx rename to client/shared/components/DevContainer.tsx index c1ee06d7..de57dbf1 100644 --- a/client/web/src/components/DevContainer.tsx +++ b/client/shared/components/DevContainer.tsx @@ -1,5 +1,5 @@ import React, { Fragment, PropsWithChildren } from 'react'; -import { isDevelopment } from 'tailchat-shared'; +import { isDevelopment } from '../utils/environment'; /** * 开发中容器 diff --git a/client/shared/hooks/useAlphaMode.ts b/client/shared/hooks/useAlphaMode.ts new file mode 100644 index 00000000..27c68894 --- /dev/null +++ b/client/shared/hooks/useAlphaMode.ts @@ -0,0 +1,16 @@ +import { useStorage } from '../manager/storage'; + +const alphaModeKey = 'alphaMode'; + +/** + * 是否为 alpha 模式 + * 在 alpha 模式下可以看到一些可以被公开但是还在测试中的功能 + */ +export function useAlphaMode() { + const [isAlphaMode, { save: setAlphaMode }] = useStorage( + alphaModeKey, + false + ); + + return { isAlphaMode, setAlphaMode }; +} diff --git a/client/shared/index.tsx b/client/shared/index.tsx index 251869fb..311260c6 100644 --- a/client/shared/index.tsx +++ b/client/shared/index.tsx @@ -16,6 +16,8 @@ export { useCachedUserInfo, useCachedOnlineStatus } from './cache/useCache'; // components export { buildPortal, DefaultEventEmitter } from './components/Portal'; +export { AlphaContainer } from './components/AlphaContainer'; +export { DevContainer } from './components/DevContainer'; export { TcProvider } from './components/Provider'; // contexts @@ -56,6 +58,7 @@ export { useUserSettings, useSingleUserSetting, } from './hooks/model/useUserSettings'; +export { useAlphaMode } from './hooks/useAlphaMode'; export { useAsync } from './hooks/useAsync'; export { useAsyncFn } from './hooks/useAsyncFn'; export { useAsyncRefresh } from './hooks/useAsyncRefresh'; diff --git a/client/web/src/components/SidebarView.tsx b/client/web/src/components/SidebarView.tsx index a80d748e..99c3b739 100644 --- a/client/web/src/components/SidebarView.tsx +++ b/client/web/src/components/SidebarView.tsx @@ -1,6 +1,6 @@ import React, { useState, useContext, PropsWithChildren } from 'react'; import _get from 'lodash/get'; -import { DevContainer } from './DevContainer'; +import { DevContainer } from 'tailchat-shared'; import clsx from 'clsx'; export interface SidebarViewMenuItemType { diff --git a/client/web/src/components/modals/GroupDetail/Role/tabs/summary.tsx b/client/web/src/components/modals/GroupDetail/Role/tabs/summary.tsx index a7d9bb62..aec17435 100644 --- a/client/web/src/components/modals/GroupDetail/Role/tabs/summary.tsx +++ b/client/web/src/components/modals/GroupDetail/Role/tabs/summary.tsx @@ -1,4 +1,3 @@ -import { DevContainer } from '@/components/DevContainer'; import { DefaultFullModalInputEditorRender, FullModalField, diff --git a/client/web/src/components/modals/SettingsView/System.tsx b/client/web/src/components/modals/SettingsView/System.tsx index 82a30383..78156056 100644 --- a/client/web/src/components/modals/SettingsView/System.tsx +++ b/client/web/src/components/modals/SettingsView/System.tsx @@ -3,7 +3,13 @@ import { LanguageSelect } from '@/components/LanguageSelect'; import { pluginColorScheme } from '@/plugin/common'; import { Select, Switch } from 'antd'; import React from 'react'; -import { t, useColorScheme, useSingleUserSetting } from 'tailchat-shared'; +import { + AlphaContainer, + t, + useAlphaMode, + useColorScheme, + useSingleUserSetting, +} from 'tailchat-shared'; export const SettingsSystem: React.FC = React.memo(() => { const { colorScheme, setColorScheme } = useColorScheme(); @@ -12,6 +18,7 @@ export const SettingsSystem: React.FC = React.memo(() => { setValue: setMessageListVirtualization, loading, } = useSingleUserSetting('messageListVirtualization', false); + const { isAlphaMode, setAlphaMode } = useAlphaMode(); return (
@@ -39,15 +46,31 @@ export const SettingsSystem: React.FC = React.memo(() => { /> setMessageListVirtualization(checked)} + checked={isAlphaMode} + onChange={(checked) => setAlphaMode(checked)} /> } /> + + {isAlphaMode && ( + setMessageListVirtualization(checked)} + /> + } + /> + )}
); }); diff --git a/client/web/src/routes/Main/Content/Personal/Sidebar.tsx b/client/web/src/routes/Main/Content/Personal/Sidebar.tsx index d6ceff2b..72ed374b 100644 --- a/client/web/src/routes/Main/Content/Personal/Sidebar.tsx +++ b/client/web/src/routes/Main/Content/Personal/Sidebar.tsx @@ -1,11 +1,15 @@ import React, { PropsWithChildren } from 'react'; import { Icon } from 'tailchat-design'; import { SidebarItem } from '../SidebarItem'; -import { t, useDMConverseList, useUserInfo } from 'tailchat-shared'; +import { + t, + useDMConverseList, + useUserInfo, + DevContainer, +} from 'tailchat-shared'; import { SidebarDMItem } from './SidebarDMItem'; import { openModal } from '@/components/Modal'; import { CreateDMConverse } from '@/components/modals/CreateDMConverse'; -import { DevContainer } from '@/components/DevContainer'; import { SectionHeader } from '@/components/SectionHeader'; import { CommonSidebarWrapper } from '@/components/CommonSidebarWrapper'; import { pluginCustomPanel } from '@/plugin/common'; diff --git a/client/web/src/routes/Main/Navbar/index.tsx b/client/web/src/routes/Main/Navbar/index.tsx index 15c154db..c46340fa 100644 --- a/client/web/src/routes/Main/Navbar/index.tsx +++ b/client/web/src/routes/Main/Navbar/index.tsx @@ -4,7 +4,7 @@ import { MobileMenuBtn } from './MobileMenuBtn'; import { SettingBtn } from './SettingBtn'; import { Divider } from 'antd'; import { PersonalNav } from './PersonalNav'; -import { DevContainer } from '@/components/DevContainer'; +import { DevContainer } from 'tailchat-shared'; import { InboxNav } from './InboxNav'; import { InstallBtn } from './InstallBtn'; import { ReactQueryDevBtn } from './ReactQueryDevBtn'; diff --git a/client/web/src/styles/antd/dark.less b/client/web/src/styles/antd/dark.less index 07527740..476423fc 100644 --- a/client/web/src/styles/antd/dark.less +++ b/client/web/src/styles/antd/dark.less @@ -60,6 +60,16 @@ } } + .ant-switch { + &:focus { + box-shadow: none; + } + + &.ant-switch-checked:focus { + box-shadow: none; + } + } + // 表单 .ant-form { // 表单