(feature)(chat-sdk) update antd version to 5 (#409)

This commit is contained in:
williamhliu
2023-11-20 16:58:53 +08:00
committed by GitHub
parent 980d317152
commit e15e44e4a2
10 changed files with 1408 additions and 1998 deletions

View File

@@ -9,9 +9,10 @@
"@ant-design/icons": "^4.7.0", "@ant-design/icons": "^4.7.0",
"@uiw/react-watermark": "^0.0.5", "@uiw/react-watermark": "^0.0.5",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^4.23.5", "antd": "^5.11.2",
"axios": "^0.21.1", "axios": "^0.21.1",
"classnames": "^2.3.2", "classnames": "^2.3.2",
"dayjs": "^1.11.10",
"echarts": "^5.4.2", "echarts": "^5.4.2",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"moment": "^2.29.4", "moment": "^2.29.4",

View File

@@ -5,7 +5,7 @@ import { useEffect, useMemo, useRef, useState } from 'react';
import { queryDimensionValues } from '../../service'; import { queryDimensionValues } from '../../service';
import { debounce, isArray } from 'lodash'; import { debounce, isArray } from 'lodash';
import SwicthEntity from './SwitchEntity'; import SwicthEntity from './SwitchEntity';
import moment from 'moment'; import dayjs from 'dayjs';
type Props = { type Props = {
modelId: number; modelId: number;
@@ -164,8 +164,8 @@ const FilterItem: React.FC<Props> = ({
value={filter.value} value={filter.value}
onChange={onChange} onChange={onChange}
/> />
) : typeof filter.value === 'string' && moment(filter.value, 'YYYY-MM-DD').isValid() ? ( ) : typeof filter.value === 'string' && dayjs(filter.value, 'YYYY-MM-DD').isValid() ? (
<DatePicker value={moment(filter.value)} onChange={onDateChange} allowClear={false} /> <DatePicker value={dayjs(filter.value)} onChange={onDateChange} allowClear={false} />
) : (typeof filter.value === 'string' || isArray(filter.value)) && ) : (typeof filter.value === 'string' || isArray(filter.value)) &&
!filter.bizName?.includes('_id') ? ( !filter.bizName?.includes('_id') ? (
<Select <Select

View File

@@ -5,9 +5,9 @@ import { Button, DatePicker } from 'antd';
import { CheckCircleFilled, ReloadOutlined } from '@ant-design/icons'; import { CheckCircleFilled, ReloadOutlined } from '@ant-design/icons';
import Loading from './Loading'; import Loading from './Loading';
import FilterItem from './FilterItem'; import FilterItem from './FilterItem';
import moment from 'moment';
import classNames from 'classnames'; import classNames from 'classnames';
import { isMobile } from '../../utils/utils'; import { isMobile } from '../../utils/utils';
import dayjs from 'dayjs';
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
@@ -52,7 +52,7 @@ const ParseTip: React.FC<Props> = ({
}) => { }) => {
const prefixCls = `${PREFIX_CLS}-item`; const prefixCls = `${PREFIX_CLS}-item`;
const getNode = (tipTitle: ReactNode, tipNode?: ReactNode, parseSucceed?: boolean) => { const getNode = (tipTitle: ReactNode, tipNode?: ReactNode) => {
return ( return (
<div className={`${prefixCls}-parse-tip`}> <div className={`${prefixCls}-parse-tip`}>
<div className={`${prefixCls}-title-bar`}> <div className={`${prefixCls}-title-bar`}>
@@ -227,7 +227,7 @@ const ParseTip: React.FC<Props> = ({
</span> </span>
) : ( ) : (
<RangePicker <RangePicker
value={[moment(startDate), moment(endDate)]} value={[dayjs(startDate), dayjs(endDate)]}
onChange={onDateInfoChange} onChange={onDateInfoChange}
getPopupContainer={trigger => trigger.parentNode as HTMLElement} getPopupContainer={trigger => trigger.parentNode as HTMLElement}
allowClear={false} allowClear={false}
@@ -306,8 +306,7 @@ const ParseTip: React.FC<Props> = ({
</div> </div>
)} )}
</div>, </div>,
tipNode, tipNode
true
); );
}; };

View File

@@ -60,43 +60,51 @@ const ChatItem: React.FC<Props> = ({
onUpdateMessageScroll, onUpdateMessageScroll,
onSendMsg, onSendMsg,
}) => { }) => {
const [data, setData] = useState<MsgDataType>();
const [parseLoading, setParseLoading] = useState(false); const [parseLoading, setParseLoading] = useState(false);
const [parseTimeCost, setParseTimeCost] = useState<ParseTimeCostType>(); const [parseTimeCost, setParseTimeCost] = useState<ParseTimeCostType>();
const [parseInfo, setParseInfo] = useState<ChatContextType>(); const [parseInfo, setParseInfo] = useState<ChatContextType>();
const [parseInfoOptions, setParseInfoOptions] = useState<ChatContextType[]>([]); const [parseInfoOptions, setParseInfoOptions] = useState<ChatContextType[]>([]);
const [parseTip, setParseTip] = useState(''); const [parseTip, setParseTip] = useState('');
const [executeMode, setExecuteMode] = useState(false);
const [executeLoading, setExecuteLoading] = useState(false); const [executeLoading, setExecuteLoading] = useState(false);
const [executeTip, setExecuteTip] = useState(''); const [executeTip, setExecuteTip] = useState('');
const [executeMode, setExecuteMode] = useState(false); const [data, setData] = useState<MsgDataType>();
const [entitySwitchLoading, setEntitySwitchLoading] = useState(false); const [entitySwitchLoading, setEntitySwitchLoading] = useState(false);
const [dimensionFilters, setDimensionFilters] = useState<FilterItemType[]>([]); const [dimensionFilters, setDimensionFilters] = useState<FilterItemType[]>([]);
const [dateInfo, setDateInfo] = useState<DateInfoType>({} as DateInfoType); const [dateInfo, setDateInfo] = useState<DateInfoType>({} as DateInfoType);
const [entityInfo, setEntityInfo] = useState<EntityInfoType>({} as EntityInfoType); const [entityInfo, setEntityInfo] = useState<EntityInfoType>({} as EntityInfoType);
const [dataCache, setDataCache] = useState<Record<number, { tip: string; data?: MsgDataType }>>(
{}
);
const prefixCls = `${PREFIX_CLS}-item`; const prefixCls = `${PREFIX_CLS}-item`;
const updateData = (res: Result<MsgDataType>) => { const updateData = (res: Result<MsgDataType>) => {
let tip: string = '';
let data: MsgDataType | undefined = undefined;
if (res.code === 401 || res.code === 412) { if (res.code === 401 || res.code === 412) {
setExecuteTip(res.msg); tip = res.msg;
return false;
} }
if (res.code !== 200) { if (res.code !== 200) {
setExecuteTip(SEARCH_EXCEPTION_TIP); tip = SEARCH_EXCEPTION_TIP;
return false;
} }
const { queryColumns, queryResults, queryState, queryMode, response } = res.data || {}; const { queryColumns, queryResults, queryState, queryMode, response, chatContext } =
res.data || {};
if (queryState !== 'SUCCESS') { if (queryState !== 'SUCCESS') {
setExecuteTip(response && typeof response === 'string' ? response : SEARCH_EXCEPTION_TIP); tip = response && typeof response === 'string' ? response : SEARCH_EXCEPTION_TIP;
return false;
} }
if ((queryColumns && queryColumns.length > 0 && queryResults) || queryMode === 'WEB_PAGE') { if ((queryColumns && queryColumns.length > 0 && queryResults) || queryMode === 'WEB_PAGE') {
setData(res.data); data = res.data;
tip = '';
}
setDataCache({ ...dataCache, [chatContext!.id!]: { tip, data } });
if (data) {
setData(data);
setExecuteTip(''); setExecuteTip('');
return true; return true;
} }
setExecuteTip(SEARCH_EXCEPTION_TIP); setExecuteTip(tip || SEARCH_EXCEPTION_TIP);
return true; return false;
}; };
const onExecute = async ( const onExecute = async (
@@ -122,7 +130,9 @@ const ChatItem: React.FC<Props> = ({
valid valid
); );
} catch (e) { } catch (e) {
const tip = SEARCH_EXCEPTION_TIP;
setExecuteTip(SEARCH_EXCEPTION_TIP); setExecuteTip(SEARCH_EXCEPTION_TIP);
setDataCache({ ...dataCache, [parseInfoValue!.id!]: { tip } });
} }
if (isSwitchParseInfo) { if (isSwitchParseInfo) {
setEntitySwitchLoading(false); setEntitySwitchLoading(false);
@@ -203,12 +213,13 @@ const ChatItem: React.FC<Props> = ({
const res = await switchEntity(entityId, data?.chatContext?.modelId, conversationId || 0); const res = await switchEntity(entityId, data?.chatContext?.modelId, conversationId || 0);
setEntitySwitchLoading(false); setEntitySwitchLoading(false);
setData(res.data); setData(res.data);
const { chatContext, entityInfo } = res.data; const { chatContext, entityInfo } = res.data || {};
const chatContextValue = { ...(chatContext || {}), queryId: parseInfo?.queryId }; const chatContextValue = { ...(chatContext || {}), queryId: parseInfo?.queryId };
setParseInfo(chatContextValue); setParseInfo(chatContextValue);
setEntityInfo(entityInfo); setEntityInfo(entityInfo);
updateDimensionFitlers(chatContextValue?.dimensionFilters || []); updateDimensionFitlers(chatContextValue?.dimensionFilters || []);
setDateInfo(chatContextValue?.dateInfo); setDateInfo(chatContextValue?.dateInfo);
setDataCache({ ...dataCache, [chatContextValue.id!]: { tip: '', data: res.data } });
}; };
const onFiltersChange = (dimensionFilters: FilterItemType[]) => { const onFiltersChange = (dimensionFilters: FilterItemType[]) => {
@@ -250,6 +261,7 @@ const ChatItem: React.FC<Props> = ({
onMsgDataLoaded?.(dataValue, true, true); onMsgDataLoaded?.(dataValue, true, true);
setData(dataValue); setData(dataValue);
setParseInfo(contextValue); setParseInfo(contextValue);
setDataCache({ ...dataCache, [id!]: { tip: '', data: dataValue } });
} }
}; };
@@ -267,7 +279,22 @@ const ChatItem: React.FC<Props> = ({
} else { } else {
getEntityInfo(parseInfoValue); getEntityInfo(parseInfoValue);
} }
onExecute(parseInfoValue, parseInfoOptions, true); if (dataCache[parseInfoValue.id!]) {
const { tip, data } = dataCache[parseInfoValue.id!];
setExecuteTip(tip);
setData(data);
onMsgDataLoaded?.(
{
...(data as any),
parseInfos,
queryId: parseInfoValue.queryId,
},
true,
true
);
} else {
onExecute(parseInfoValue, parseInfoOptions, true);
}
}; };
const onSelectQuestion = (question: SimilarQuestionType) => { const onSelectQuestion = (question: SimilarQuestionType) => {

View File

@@ -13,11 +13,11 @@
align-items: center; align-items: center;
column-gap: 20px; column-gap: 20px;
font-size: 14px; font-size: 14px;
margin-top: 6px; margin-top: 12px;
margin-bottom: 2px; margin-bottom: 2px;
} }
&-metric-card-tools { &-metric-card-tools {
margin-top: 0; margin-top: 2px;
} }
} }

View File

@@ -1,7 +1,7 @@
import { createFromIconfontCN } from '@ant-design/icons'; import { createFromIconfontCN } from '@ant-design/icons';
const IconFont = createFromIconfontCN({ const IconFont = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/c/font_4120566_x6akuij1kod.js', scriptUrl: '//at.alicdn.com/t/c/font_4120566_8i352njvpoi.js',
}); });
export default IconFont; export default IconFont;

View File

@@ -1,4 +1,4 @@
@import '~antd/dist/antd.css'; // @import '~antd/dist/antd.css';
@import './index.less'; @import './index.less';

View File

@@ -172,6 +172,10 @@ export function getChartLightenColor(col) {
export const isMobile = window.navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i); export const isMobile = window.navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i);
export const isIOS = window.navigator.userAgent.match(/(iPhone|iPod|ios)/i);
export const isAndroid = window.navigator.userAgent.match(/(Android)/i);
export function isProd() { export function isProd() {
return process.env.NODE_ENV === 'production'; return process.env.NODE_ENV === 'production';

View File

@@ -133,7 +133,7 @@ export const layout: RunTimeLayoutConfig = (params) => {
> >
{dom} {dom}
{history.location.pathname !== '/chat' && !isMobile && ( {history.location.pathname !== '/chat' && !isMobile && (
<Copilot token={getAuthToken() || ''} isDeveloper /> <Copilot token={getToken() || ''} isDeveloper />
)} )}
</div> </div>
); );

3319
webapp/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff