mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? feat: Add MessageInput to the external chat page #1880 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
149 lines
3.8 KiB
TypeScript
149 lines
3.8 KiB
TypeScript
import {
|
|
useCreateNextToken,
|
|
useFetchTokenList,
|
|
useRemoveNextToken,
|
|
} from '@/hooks/chat-hooks';
|
|
import {
|
|
useSetModalState,
|
|
useShowDeleteConfirm,
|
|
useTranslate,
|
|
} from '@/hooks/common-hooks';
|
|
import { IStats } from '@/interfaces/database/chat';
|
|
import { useQueryClient } from '@tanstack/react-query';
|
|
import { message } from 'antd';
|
|
import { useCallback } from 'react';
|
|
|
|
export const useOperateApiKey = (dialogId: string, idKey: string) => {
|
|
const { removeToken } = useRemoveNextToken();
|
|
const { createToken, loading: creatingLoading } = useCreateNextToken();
|
|
const { data: tokenList, loading: listLoading } = useFetchTokenList({
|
|
[idKey]: dialogId,
|
|
});
|
|
|
|
const showDeleteConfirm = useShowDeleteConfirm();
|
|
|
|
const onRemoveToken = (token: string, tenantId: string) => {
|
|
showDeleteConfirm({
|
|
onOk: () => removeToken({ dialogId, tokens: [token], tenantId }),
|
|
});
|
|
};
|
|
|
|
const onCreateToken = useCallback(() => {
|
|
createToken({ [idKey]: dialogId });
|
|
}, [createToken, idKey, dialogId]);
|
|
|
|
return {
|
|
removeToken: onRemoveToken,
|
|
createToken: onCreateToken,
|
|
tokenList,
|
|
creatingLoading,
|
|
listLoading,
|
|
};
|
|
};
|
|
|
|
type ChartStatsType = {
|
|
[k in keyof IStats]: Array<{ xAxis: string; yAxis: number }>;
|
|
};
|
|
|
|
export const useSelectChartStatsList = (): ChartStatsType => {
|
|
const queryClient = useQueryClient();
|
|
const data = queryClient.getQueriesData({ queryKey: ['fetchStats'] });
|
|
const stats: IStats = data[0][1] as IStats;
|
|
|
|
return Object.keys(stats).reduce((pre, cur) => {
|
|
const item = stats[cur as keyof IStats];
|
|
if (item.length > 0) {
|
|
pre[cur as keyof IStats] = item.map((x) => ({
|
|
xAxis: x[0] as string,
|
|
yAxis: x[1] as number,
|
|
}));
|
|
}
|
|
return pre;
|
|
}, {} as ChartStatsType);
|
|
};
|
|
|
|
export const useShowTokenEmptyError = () => {
|
|
const { t } = useTranslate('chat');
|
|
|
|
const showTokenEmptyError = useCallback(() => {
|
|
message.error(t('tokenError'));
|
|
}, [t]);
|
|
return { showTokenEmptyError };
|
|
};
|
|
|
|
const getUrlWithToken = (token: string) => {
|
|
const { protocol, host } = window.location;
|
|
return `${protocol}//${host}/chat/share?shared_id=${token}`;
|
|
};
|
|
|
|
const useFetchTokenListBeforeOtherStep = (dialogId: string, idKey: string) => {
|
|
const { showTokenEmptyError } = useShowTokenEmptyError();
|
|
|
|
const { data: tokenList, refetch } = useFetchTokenList({ [idKey]: dialogId });
|
|
|
|
const token =
|
|
Array.isArray(tokenList) && tokenList.length > 0 ? tokenList[0].token : '';
|
|
|
|
const handleOperate = useCallback(async () => {
|
|
const ret = await refetch();
|
|
const list = ret.data;
|
|
if (Array.isArray(list) && list.length > 0) {
|
|
return list[0]?.token;
|
|
} else {
|
|
showTokenEmptyError();
|
|
return false;
|
|
}
|
|
}, [showTokenEmptyError, refetch]);
|
|
|
|
return {
|
|
token,
|
|
handleOperate,
|
|
};
|
|
};
|
|
|
|
export const useShowEmbedModal = (dialogId: string, idKey: string) => {
|
|
const {
|
|
visible: embedVisible,
|
|
hideModal: hideEmbedModal,
|
|
showModal: showEmbedModal,
|
|
} = useSetModalState();
|
|
|
|
const { handleOperate, token } = useFetchTokenListBeforeOtherStep(
|
|
dialogId,
|
|
idKey,
|
|
);
|
|
|
|
const handleShowEmbedModal = useCallback(async () => {
|
|
const succeed = await handleOperate();
|
|
if (succeed) {
|
|
showEmbedModal();
|
|
}
|
|
}, [handleOperate, showEmbedModal]);
|
|
|
|
return {
|
|
showEmbedModal: handleShowEmbedModal,
|
|
hideEmbedModal,
|
|
embedVisible,
|
|
embedToken: token,
|
|
};
|
|
};
|
|
|
|
export const usePreviewChat = (dialogId: string, idKey: string) => {
|
|
const { handleOperate } = useFetchTokenListBeforeOtherStep(dialogId, idKey);
|
|
|
|
const open = useCallback((t: string) => {
|
|
window.open(getUrlWithToken(t), '_blank');
|
|
}, []);
|
|
|
|
const handlePreview = useCallback(async () => {
|
|
const token = await handleOperate();
|
|
if (token) {
|
|
open(token);
|
|
}
|
|
}, [handleOperate, open]);
|
|
|
|
return {
|
|
handlePreview,
|
|
};
|
|
};
|