mirror of
https://github.com/cool-team-official/cool-admin-vue.git
synced 2025-12-14 14:52:49 +00:00
146 lines
2.8 KiB
TypeScript
146 lines
2.8 KiB
TypeScript
import { ElMessage, ElNotification } from "element-plus";
|
||
import { debounce } from "lodash-es";
|
||
import { io, Socket } from "socket.io-client";
|
||
import { reactive, ref, watch } from "vue";
|
||
import { storage, useCool } from "/@/cool";
|
||
|
||
export function useChatGPT() {
|
||
const { route, router } = useCool();
|
||
|
||
const apiKey = ref(
|
||
storage.get("chatgpt.apiKey") || "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"
|
||
);
|
||
|
||
// 余额
|
||
const balance = reactive({
|
||
total_granted: 0,
|
||
total_used: 0,
|
||
loading: false
|
||
});
|
||
|
||
// 获取余额
|
||
const getBalance = debounce(() => {
|
||
balance.loading = true;
|
||
socket?.emit("getBalance", { apiKey: apiKey.value });
|
||
}, 300);
|
||
|
||
// 监听apikey改变
|
||
watch(apiKey, (val) => {
|
||
if (val) {
|
||
getBalance();
|
||
}
|
||
|
||
storage.set("chatgpt.apiKey", val);
|
||
});
|
||
|
||
let socket: Socket | null;
|
||
|
||
// 连接
|
||
function connect(cb: { onMessage?(content: string): void; onComplete?(): void }) {
|
||
if (!socket) {
|
||
socket = io("https://ai.cool-js.cloud", {
|
||
transports: ["websocket"]
|
||
});
|
||
|
||
if (socket) {
|
||
// 连接
|
||
socket.on("connect", () => {
|
||
getBalance();
|
||
|
||
// 消息
|
||
socket?.on("progress", (msg: string) => {
|
||
if (msg.includes("[DONE]")) {
|
||
if (route.path != "/magic/ai-code") {
|
||
const notify = ElNotification({
|
||
title: "提示",
|
||
message: "Ai自动生成代码完成,点击查看",
|
||
duration: 0,
|
||
onClick() {
|
||
router.push("/magic/ai-code");
|
||
notify.close();
|
||
}
|
||
});
|
||
}
|
||
|
||
cb.onComplete?.();
|
||
getBalance();
|
||
} else {
|
||
try {
|
||
msg.split("data: ").forEach((e) => {
|
||
if (e) {
|
||
const d = JSON.parse(e);
|
||
const { content = "" } = d.choices[0].delta;
|
||
cb?.onMessage?.(content);
|
||
}
|
||
});
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
});
|
||
|
||
// 余额
|
||
socket?.on("balance", (res) => {
|
||
if (res == "error apiKey") {
|
||
ElMessage.error(res);
|
||
balance.total_granted = 0;
|
||
balance.total_used = 0;
|
||
} else {
|
||
balance.total_granted = res.total_granted.toFixed(5);
|
||
balance.total_used = res.total_used.toFixed(5);
|
||
}
|
||
|
||
balance.loading = false;
|
||
});
|
||
});
|
||
|
||
// 断开
|
||
socket.on("disconnect", (err) => {
|
||
console.error(err);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
// 发送
|
||
function send(data: { name: string; columns: string[]; module: string }) {
|
||
socket?.emit("data", {
|
||
...data,
|
||
apiKey: apiKey.value
|
||
});
|
||
}
|
||
|
||
return {
|
||
connect,
|
||
send,
|
||
apiKey,
|
||
balance,
|
||
getBalance
|
||
};
|
||
}
|
||
|
||
export function useScroll() {
|
||
const { mitt } = useCool();
|
||
|
||
let timer: NodeJS.Timer | null;
|
||
|
||
function start() {
|
||
stop();
|
||
|
||
timer = setInterval(() => {
|
||
mitt.emit("view.scrollTo", { top: Math.random() + 10000 });
|
||
}, 100);
|
||
}
|
||
|
||
function stop() {
|
||
if (timer) {
|
||
clearInterval(timer);
|
||
}
|
||
}
|
||
|
||
return {
|
||
start,
|
||
stop
|
||
};
|
||
}
|