refactor: 增加groupId上下文

pull/81/head
moonrailgun 3 years ago
parent e6d9322c0c
commit 4ba7bc728e

@ -4,6 +4,7 @@ import {
SidebarViewMenuItem, SidebarViewMenuItem,
SidebarViewMenuType, SidebarViewMenuType,
} from '@/components/SidebarView'; } from '@/components/SidebarView';
import { GroupIdContextProvider } from '@/context/GroupIdContext';
import { pluginCustomPanel } from '@/plugin/common'; import { pluginCustomPanel } from '@/plugin/common';
import React, { useCallback, useMemo } from 'react'; import React, { useCallback, useMemo } from 'react';
import { t } from 'tailchat-shared'; import { t } from 'tailchat-shared';
@ -15,6 +16,7 @@ interface SettingsViewProps {
onClose: () => void; onClose: () => void;
} }
export const GroupDetail: React.FC<SettingsViewProps> = React.memo((props) => { export const GroupDetail: React.FC<SettingsViewProps> = React.memo((props) => {
const groupId = props.groupId;
const handleChangeVisible = useCallback( const handleChangeVisible = useCallback(
(visible) => { (visible) => {
if (visible === false && typeof props.onClose === 'function') { if (visible === false && typeof props.onClose === 'function') {
@ -34,12 +36,12 @@ export const GroupDetail: React.FC<SettingsViewProps> = React.memo((props) => {
{ {
type: 'item', type: 'item',
title: t('概述'), title: t('概述'),
content: <GroupSummary groupId={props.groupId} />, content: <GroupSummary groupId={groupId} />,
}, },
{ {
type: 'item', type: 'item',
title: t('面板'), title: t('面板'),
content: <GroupPanel groupId={props.groupId} />, content: <GroupPanel groupId={groupId} />,
}, },
], ],
}, },
@ -66,9 +68,11 @@ export const GroupDetail: React.FC<SettingsViewProps> = React.memo((props) => {
}, []); }, []);
return ( return (
<FullModal onChangeVisible={handleChangeVisible}> <GroupIdContextProvider value={groupId}>
<SidebarView menu={menu} defaultContentPath="0.children.0.content" /> <FullModal onChangeVisible={handleChangeVisible}>
</FullModal> <SidebarView menu={menu} defaultContentPath="0.children.0.content" />
</FullModal>
</GroupIdContextProvider>
); );
}); });
GroupDetail.displayName = 'GroupDetail'; GroupDetail.displayName = 'GroupDetail';

@ -0,0 +1,10 @@
import React, { useContext } from 'react';
const GroupIdContext = React.createContext<string>('');
GroupIdContext.displayName = 'GroupIdContext';
export const GroupIdContextProvider = GroupIdContext.Provider;
export function useGroupIdContext() {
return useContext(GroupIdContext);
}

@ -15,6 +15,7 @@ export {
export { Loadable } from '@/components/Loadable'; export { Loadable } from '@/components/Loadable';
export { getGlobalState } from '@/utils/global-state-helper'; export { getGlobalState } from '@/utils/global-state-helper';
export { dataUrlToFile } from '@/utils/file-helper'; export { dataUrlToFile } from '@/utils/file-helper';
export { useGroupIdContext } from '@/context/GroupIdContext';
import { request, RequestConfig } from 'tailchat-shared'; import { request, RequestConfig } from 'tailchat-shared';
export { export {
getCachedUserInfo, getCachedUserInfo,
@ -25,6 +26,7 @@ export {
useAsync, useAsync,
useAsyncFn, useAsyncFn,
useAsyncRefresh, useAsyncRefresh,
useAsyncRequest,
uploadFile, uploadFile,
showToasts, showToasts,
showErrorToasts, showErrorToasts,
@ -63,13 +65,13 @@ export function createPluginRequest(pluginName: string) {
return { return {
get(actionName: string, config?: RequestConfig) { get(actionName: string, config?: RequestConfig) {
return request.get( return request.get(
`/api/plugin:${pluginName}/${actionName}`, `/api/plugin:${pluginName}/${actionName.replaceAll('.', '/')}`,
purgeRequestConfig(config) purgeRequestConfig(config)
); );
}, },
post(actionName: string, data?: any, config?: RequestConfig) { post(actionName: string, data?: any, config?: RequestConfig) {
return request.post( return request.post(
`/api/plugin:${pluginName}/${actionName}`, `/api/plugin:${pluginName}/${actionName.replaceAll('.', '/')}`,
data, data,
purgeRequestConfig(config) purgeRequestConfig(config)
); );

@ -1,5 +1,6 @@
import { LoadingSpinner } from '@/components/LoadingSpinner'; import { LoadingSpinner } from '@/components/LoadingSpinner';
import { SplitPanel } from '@/components/SplitPanel'; import { SplitPanel } from '@/components/SplitPanel';
import { GroupIdContextProvider } from '@/context/GroupIdContext';
import React from 'react'; import React from 'react';
import { Route, Switch, useParams } from 'react-router-dom'; import { Route, Switch, useParams } from 'react-router-dom';
import { isValidStr, useGroupInfo } from 'tailchat-shared'; import { isValidStr, useGroupInfo } from 'tailchat-shared';
@ -32,18 +33,20 @@ export const Group: React.FC = React.memo(() => {
); );
return ( return (
<PageContent data-tc-role="content-group" sidebar={<Sidebar />}> <GroupIdContextProvider value={groupId}>
{isValidStr(pinnedPanelId) ? ( <PageContent data-tc-role="content-group" sidebar={<Sidebar />}>
<SplitPanel className="flex-auto"> {isValidStr(pinnedPanelId) ? (
<div>{routeMatch}</div> <SplitPanel className="flex-auto">
<div> <div>{routeMatch}</div>
<GroupPanelRender groupId={groupId} panelId={pinnedPanelId} /> <div>
</div> <GroupPanelRender groupId={groupId} panelId={pinnedPanelId} />
</SplitPanel> </div>
) : ( </SplitPanel>
routeMatch ) : (
)} routeMatch
</PageContent> )}
</PageContent>
</GroupIdContextProvider>
); );
}); });
Group.displayName = 'Group'; Group.displayName = 'Group';

Loading…
Cancel
Save