feat: openapi机器人能力开启/关闭

pull/81/head
moonrailgun 3 years ago
parent 5c53f0a289
commit eb3afdc19c

@ -1,4 +1,4 @@
import { DependencyList, useEffect, useReducer } from 'react'; import { DependencyList, useCallback, useEffect } from 'react';
import type { FunctionReturningPromise } from '../types'; import type { FunctionReturningPromise } from '../types';
import { useAsyncFn } from './useAsyncFn'; import { useAsyncFn } from './useAsyncFn';
@ -9,11 +9,14 @@ export function useAsyncRefresh<T extends FunctionReturningPromise>(
const [state, callback] = useAsyncFn(fn, deps, { const [state, callback] = useAsyncFn(fn, deps, {
loading: true, loading: true,
}); });
const [inc, refresh] = useReducer((i) => i + 1, 0);
useEffect(() => { useEffect(() => {
callback(); callback();
}, [callback, inc]); }, [callback]);
const refresh = useCallback(() => {
return callback();
}, [callback]);
return { return {
...state, ...state,

@ -1,7 +1,50 @@
import React from 'react'; import React from 'react';
import { FullModalField, Switch } from '@capital/component';
import { useOpenAppInfo } from '../context';
import { OpenAppCapability } from '../types';
import { postRequest, useAsyncFn } from '@capital/common';
const Bot: React.FC = React.memo(() => { const Bot: React.FC = React.memo(() => {
return <div></div>; const { refresh, appId, capability } = useOpenAppInfo();
const [{ loading }, handleChangeBotCapability] = useAsyncFn(
async (checked: boolean) => {
const newCapability: OpenAppCapability[] = [...capability];
const findIndex = newCapability.findIndex((c) => c === 'bot');
if (checked) {
if (findIndex === -1) {
newCapability.push('bot');
}
} else {
if (findIndex !== -1) {
newCapability.splice(findIndex, 1);
}
}
await postRequest('/openapi/app/setAppCapability', {
appId,
capability: newCapability,
});
await refresh();
},
[appId, capability, refresh]
);
return (
<div className="plugin-openapi-app-info_bot">
<FullModalField
title="开启机器人能力"
content={
<Switch
disabled={loading}
checked={capability.includes('bot')}
onChange={handleChangeBotCapability}
/>
}
/>
</div>
);
}); });
Bot.displayName = 'Bot'; Bot.displayName = 'Bot';

@ -11,7 +11,7 @@ const Profile: React.FC = React.memo(() => {
const { appId, appSecret } = useOpenAppInfo(); const { appId, appSecret } = useOpenAppInfo();
return ( return (
<div> <div className="plugin-openapi-app-info_profile">
<h2></h2> <h2></h2>
<div> <div>

@ -2,14 +2,9 @@ import { useOpenAppInfo } from '../context';
import React from 'react'; import React from 'react';
const Summary: React.FC = React.memo(() => { const Summary: React.FC = React.memo(() => {
const { appId, appName } = useOpenAppInfo(); const { refresh, ...other } = useOpenAppInfo();
return ( return <pre>{JSON.stringify(other, undefined, 2)}</pre>;
<div>
<div>{appId}</div>
<div>{appName}</div>
</div>
);
}); });
Summary.displayName = 'Summary'; Summary.displayName = 'Summary';

@ -1,12 +1,24 @@
import React, { useContext } from 'react'; import React, { useContext } from 'react';
import { OpenApp } from './types'; import { OpenApp } from './types';
const OpenAppInfoContext = React.createContext<OpenApp>(null); interface OpenAppInfoContextProps extends OpenApp {
refresh: () => Promise<void>;
}
const OpenAppInfoContext = React.createContext<OpenAppInfoContextProps>(null);
OpenAppInfoContext.displayName = 'OpenAppInfoContext'; OpenAppInfoContext.displayName = 'OpenAppInfoContext';
export const OpenAppInfoProvider: React.FC<{ appInfo: OpenApp }> = (props) => { export const OpenAppInfoProvider: React.FC<{
appInfo: OpenApp;
refresh: OpenAppInfoContextProps['refresh'];
}> = (props) => {
return ( return (
<OpenAppInfoContext.Provider value={props.appInfo}> <OpenAppInfoContext.Provider
value={{
...props.appInfo,
refresh: props.refresh,
}}
>
{props.children} {props.children}
</OpenAppInfoContext.Provider> </OpenAppInfoContext.Provider>
); );

@ -14,16 +14,17 @@ import { ServiceChecker } from '../components/ServiceChecker';
import './index.less'; import './index.less';
const OpenApiMainPanel: React.FC = React.memo(() => { const OpenApiMainPanel: React.FC = React.memo(() => {
const [appInfo, setAppInfo] = useState<OpenApp | null>(null); const [selectedAppId, setSelectedAppId] = useState<string | null>(null);
const { const {
loading, loading,
value: allApps, value: allApps = [],
refresh, refresh,
} = useAsyncRefresh(async (): Promise<OpenApp[]> => { } = useAsyncRefresh(async (): Promise<OpenApp[]> => {
const { data } = await postRequest('/openapi/app/all'); const { data } = await postRequest('/openapi/app/all');
return data ?? []; return data ?? [];
}, []); }, []);
const appInfo = allApps.find((a) => a._id === selectedAppId);
const columns = useMemo( const columns = useMemo(
() => [ () => [
@ -36,7 +37,7 @@ const OpenApiMainPanel: React.FC = React.memo(() => {
key: 'action', key: 'action',
render: (_, record: OpenApp) => ( render: (_, record: OpenApp) => (
<Space> <Space>
<Button onClick={() => setAppInfo(record)}></Button> <Button onClick={() => setSelectedAppId(record._id)}></Button>
</Space> </Space>
), ),
}, },
@ -62,7 +63,7 @@ const OpenApiMainPanel: React.FC = React.memo(() => {
return ( return (
<div className="plugin-openapi-main-panel"> <div className="plugin-openapi-main-panel">
{appInfo ? ( {appInfo ? (
<OpenAppInfoProvider appInfo={appInfo}> <OpenAppInfoProvider appInfo={appInfo} refresh={refresh}>
<AppInfo /> <AppInfo />
</OpenAppInfoProvider> </OpenAppInfoProvider>
) : ( ) : (

@ -1,5 +1,19 @@
const openAppCapability = [
'bot', // 机器人
'webpage', // 网页
'oauth', // 第三方登录
] as const;
export type OpenAppCapability = typeof openAppCapability[number];
export interface OpenApp { export interface OpenApp {
_id: string;
appId: string; appId: string;
appSecret: string; appSecret: string;
appName: string; appName: string;
appDesc: string;
appIcon: string;
capability: OpenAppCapability[];
owner: string;
} }

@ -1,6 +1,15 @@
import { Input } from 'antd'; import { Input } from 'antd';
export { Button, Checkbox, Input, Divider, Space, Menu, Table } from 'antd'; export {
Button,
Checkbox,
Input,
Divider,
Space,
Menu,
Table,
Switch,
} from 'antd';
export const TextArea = Input.TextArea; export const TextArea = Input.TextArea;
export { Image } from '@/components/Image'; export { Image } from '@/components/Image';
export { Icon } from '@iconify/react'; export { Icon } from '@iconify/react';

Loading…
Cancel
Save