refactor: 创建群组与PortalHost

pull/13/head
moonrailgun 4 years ago
parent f2cd68b1ac
commit 517c8950f6

@ -54,7 +54,7 @@ export {
denyFriendRequest, denyFriendRequest,
} from './model/friend'; } from './model/friend';
export type { FriendRequest } from './model/friend'; export type { FriendRequest } from './model/friend';
export { GroupPanelType } from './model/group'; export { GroupPanelType, createGroup } from './model/group';
export type { GroupPanel, GroupInfo } from './model/group'; export type { GroupPanel, GroupInfo } from './model/group';
export type { ChatMessage } from './model/message'; export type { ChatMessage } from './model/message';
export type { UserBaseInfo, UserLoginInfo } from './model/user'; export type { UserBaseInfo, UserLoginInfo } from './model/user';

@ -1,6 +1,9 @@
import { request } from '../api/request';
export enum GroupPanelType { export enum GroupPanelType {
TEXT = 0, TEXT = 0,
GROUP = 1, GROUP = 1,
PLUGIN = 2,
} }
export interface GroupMember { export interface GroupMember {
@ -23,3 +26,20 @@ export interface GroupInfo {
members: GroupMember[]; members: GroupMember[];
panels: GroupPanel[]; panels: GroupPanel[];
} }
/**
*
* @param name
* @param panels
*/
export async function createGroup(
name: string,
panels: GroupPanel[]
): Promise<GroupInfo> {
const { data } = await request.post('/api/group/createGroup', {
name,
panels,
});
return data;
}

@ -3,7 +3,6 @@ import { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom';
import { TcProvider, useStorage } from 'tailchat-shared'; import { TcProvider, useStorage } from 'tailchat-shared';
import clsx from 'clsx'; import clsx from 'clsx';
import { Loadable } from './components/Loadable'; import { Loadable } from './components/Loadable';
import { PortalHost } from './components/Portal';
const MainRoute = Loadable(() => const MainRoute = Loadable(() =>
import('./routes/Main').then((module) => module.MainRoute) import('./routes/Main').then((module) => module.MainRoute)
@ -16,9 +15,7 @@ const EntryRoute = Loadable(() =>
const AppProvider: React.FC = React.memo((props) => { const AppProvider: React.FC = React.memo((props) => {
return ( return (
<BrowserRouter> <BrowserRouter>
<TcProvider> <TcProvider>{props.children}</TcProvider>
<PortalHost>{props.children}</PortalHost>
</TcProvider>
</BrowserRouter> </BrowserRouter>
); );
}); });

@ -1,10 +1,16 @@
import { Button, Divider, Input, Typography } from 'antd'; import { Button, Divider, Input, Typography } from 'antd';
import React, { useCallback, useRef, useState } from 'react'; import React, { useCallback, useRef, useState } from 'react';
import { GroupPanelType } from 'tailchat-shared'; import {
createGroup,
GroupPanelType,
useAppDispatch,
useAsyncRequest,
} from 'tailchat-shared';
import type { GroupPanel } from 'tailchat-shared'; import type { GroupPanel } from 'tailchat-shared';
import { Avatar } from '../Avatar'; import { Avatar } from '../Avatar';
import { ModalWrapper } from '../Modal'; import { closeModal, ModalWrapper } from '../Modal';
import { Slides, SlidesRef } from '../Slides'; import { Slides, SlidesRef } from '../Slides';
import { groupActions } from '../../../../shared/redux/slices';
const panelTemplate: { const panelTemplate: {
key: string; key: string;
@ -68,6 +74,7 @@ export const ModalCreateGroup: React.FC = React.memo(() => {
const slidesRef = useRef<SlidesRef>(null); const slidesRef = useRef<SlidesRef>(null);
const [panels, setPanels] = useState<GroupPanel[]>([]); const [panels, setPanels] = useState<GroupPanel[]>([]);
const [name, setName] = useState(''); const [name, setName] = useState('');
const dispatch = useAppDispatch();
const handleSelectTemplate = useCallback((panels: GroupPanel[]) => { const handleSelectTemplate = useCallback((panels: GroupPanel[]) => {
setPanels(panels); setPanels(panels);
@ -78,8 +85,12 @@ export const ModalCreateGroup: React.FC = React.memo(() => {
slidesRef.current?.prev(); slidesRef.current?.prev();
}, []); }, []);
const handleCreate = useCallback(() => { const [{ loading }, handleCreate] = useAsyncRequest(async () => {
console.log({ name, panels }); const data = await createGroup(name, panels);
dispatch(groupActions.appendGroups([data]));
closeModal();
}, [name, panels]); }, [name, panels]);
return ( return (
@ -142,7 +153,7 @@ export const ModalCreateGroup: React.FC = React.memo(() => {
> >
</Button> </Button>
<Button type="primary" onClick={handleCreate}> <Button type="primary" loading={loading} onClick={handleCreate}>
</Button> </Button>
</div> </div>

@ -14,6 +14,7 @@ import { loginWithToken } from 'tailchat-shared/model/user';
import { getUserJWT } from '../../utils/jwt-helper'; import { getUserJWT } from '../../utils/jwt-helper';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { SidebarContextProvider } from './SidebarContext'; import { SidebarContextProvider } from './SidebarContext';
import { PortalHost } from '@/components/Portal';
/** /**
* hooks * hooks
@ -79,7 +80,9 @@ export const MainProvider: React.FC = React.memo((props) => {
return ( return (
<ReduxProvider store={store}> <ReduxProvider store={store}>
<SidebarContextProvider>{props.children}</SidebarContextProvider> <PortalHost>
<SidebarContextProvider>{props.children}</SidebarContextProvider>
</PortalHost>
</ReduxProvider> </ReduxProvider>
); );
}); });

Loading…
Cancel
Save