作者 202304001

修复PPT相关BUG

... ... @@ -1742,7 +1742,7 @@ function _Chat() {
//20250328新增PPT导出
function toPowerpoint(pptMessage: string) {
navigate("/powerpoint", { state: { pptMessage: pptMessage, msg: true } });
navigate("/powerpoint", { state: { msg: true, pptMessage: pptMessage } });
}
return (
... ...
... ... @@ -24,16 +24,11 @@ export function MindPanel(props: MindPanelProps) {
setIsLoading(true);
try {
const prompt = getMindPrompt(inputValue, false);
console.log("请求------------");
const response = await chatStore.directLlmInvoke(prompt, "gpt-4o-mini");
console.log(response);
const cleanedContent = response.replace(/^```json|```$/g, "");
console.log(cleanedContent);
const parsedData: MindElixirData = JSON.parse(cleanedContent);
console.log("-----" + parsedData);
setData(parsedData);
} catch (error) {
console.log(error);
message.error(Locale.BgRemoval.error.reqErr);
} finally {
setIsLoading(false); // 确保关闭加载状态‌:ml-citation{ref="2,5" data="citationList"}
... ...
... ... @@ -52,6 +52,31 @@ export function MindPage() {
let { msg } = query.state || {};
const [data, setData] = useState<MindElixirData>(INITIAL_DATA);
const fetchData = async () => {
if (!msg) return;
if (!content) return;
setIsLoading(true);
try {
const response = await chatStore.getMindData(newMessages, "gpt-4o-mini");
const cleanedContent = response.replace(/^```json|```$/g, "");
const parsedData: MindElixirData = JSON.parse(cleanedContent);
// 增强校验逻辑
if (
!parsedData?.nodeData?.id ||
!Array.isArray(parsedData.nodeData.children)
) {
throw new Error("数据结构不完整");
}
setData(parsedData);
navigate(Path.Mind, { replace: true, state: { msg: null } });
} catch (error) {
console.log(error);
message.error("请求失败,请重试");
} finally {
setIsLoading(false); // 确保关闭加载状态
}
};
useEffect(() => {
// 确保容器元素已挂载
if (!containerRef.current) return;
... ... @@ -59,7 +84,7 @@ export function MindPage() {
const options: Options = {
el: containerRef.current,
locale: "zh_CN",
draggable: true,
draggable: false,
contextMenu: true,
toolBar: true,
nodeMenu: true,
... ... @@ -67,39 +92,25 @@ export function MindPage() {
// 创建实例
mindInstance.current = new MindElixir(options);
mindInstance.current.init(data);
const fetchData = async () => {
if (msg) {
if (content) {
setIsLoading(true);
try {
const response = await chatStore.getMindData(
newMessages,
"gpt-4o-mini",
);
const cleanedContent = response.replace(/^```json|```$/g, "");
const parsedData: MindElixirData = JSON.parse(cleanedContent);
// 增强校验逻辑
if (
!parsedData?.nodeData?.id ||
!Array.isArray(parsedData.nodeData.children)
) {
throw new Error("数据结构不完整");
}
setData(parsedData);
navigate(Path.Mind, { replace: true, state: { msg: null } });
} catch (error) {
console.log(error);
message.error("请求失败,请重试");
} finally {
setIsLoading(false); // 确保关闭加载状态
}
}
const el = mindInstance.current?.container.querySelector("me-root");
const handleContainerClick = (e: MouseEvent) => {
const target = e.target as HTMLElement;
if (target.closest("me-root")) {
console.log("Clicked me-root element!", target);
}
};
mindInstance.current.container.addEventListener(
"click",
handleContainerClick,
);
fetchData();
return () => {
mindInstance.current?.container.removeEventListener(
"click",
handleContainerClick,
);
if (mindInstance.current) {
mindInstance.current.destroy();
}
... ...
... ... @@ -36,9 +36,10 @@ export function PowerPoint() {
const { msg, pptMessage } = query.state || {}; //获取路由参数
const localData: LocalData = getLocalData(accessStore.accessCode); //获取限制次数
const localDataRef = useRef(localData);
const getToken = async () => {
if (!accessStore.accessCode) {
return message.error("请先输入登录秘钥");
return navigate(Path.Auth);
}
const res = await fetch("/api/ppt/createApiToken", {
method: "POST",
... ... @@ -55,7 +56,6 @@ export function PowerPoint() {
}
return "";
};
useEffect(() => {
const initializeDocmee = async () => {
let token = localStorage.getItem("token");
... ... @@ -64,13 +64,15 @@ export function PowerPoint() {
token = await getToken();
if (!token) {
message.error("无效token请检查登录密码!");
return navigate(Path.Settings); // 跳转回聊天页
return navigate(Path.Auth);
}
localStorage.setItem("token", token);
}
if (!containerRef.current) {
throw new Error("Container element not found");
}
const docmee = new DocmeeUI({
container: containerRef.current,
page: "creator-v2",
... ... @@ -83,19 +85,10 @@ export function PowerPoint() {
subject: "Ai行业未来10年的发展预测",
},
});
if (msg) {
docmee.on("mounted", (msg: generateOutline) => {
if (localData.pptMaxUses == "0") {
message.error("你的免费次数已用完");
return false;
}
docmee.changeCreatorData({ text: pptMessage }, true);
});
}
docmee.on("beforeGenerate", (msg: generateOutline) => {
//生成大纲事件
console.log(localData.pptMaxUses);
if (localData.pptMaxUses == "0") {
if (localDataRef.current.pptMaxUses == "0") {
message.error("你的免费次数已用完");
return false;
}
... ... @@ -104,6 +97,16 @@ export function PowerPoint() {
});
});
docmee.on("mounted", (str: string) => {
if (msg) {
if (localDataRef.current.pptMaxUses == "0") {
message.error("你的免费次数已用完");
return false;
}
docmee.changeCreatorData({ text: pptMessage }, true);
}
});
docmee.on("charge", (msg: string) => {
//PPT生成后扣费
// 解析 pptMaxUses 为数字
... ... @@ -121,21 +124,37 @@ export function PowerPoint() {
docmee.on("error", async (msg: generateError) => {
//请求错误事件
console.log(msg);
if (msg.data.code == 98) {
// message.error('token失效,请重试')
const token = await getToken();
localStorage.setItem("token", token);
docmee.updateToken(token);
return;
if (msg) {
if (localDataRef.current.pptMaxUses == "0") {
message.error("你的免费次数已用完");
return false;
}
docmee.changeCreatorData({ text: pptMessage }, true);
return;
}
}
message.error(
msg.data.code == 403 ? "请检查登录密码或网络" : msg.data.message,
);
});
return () => docmee.destroy();
};
initializeDocmee().catch(console.error);
}, [navigate, isMobileScreen, msg, pptMessage]);
initializeDocmee();
}, [
navigate,
isMobileScreen,
pptMessage,
config.theme,
accessStore.accessCode,
]);
useEffect(() => {
localDataRef.current = localData;
}, [localData]);
return (
<>
... ...