@artmate/chat
Version:
借鉴字节开源react库AntX,通过vue实现的版本
98 lines (97 loc) • 2.67 kB
JavaScript
import { ref as R, computed as b } from "vue";
import k from "./useSyncState.js";
import { useEventCallback as P } from "../hooks/useEventCallback.js";
function $(l) {
return Array.isArray(l) ? l : [l];
}
function F(l) {
const { defaultMessages: v, agent: p, requestFallback: d, requestPlaceholder: c, parser: h } = l, M = R(0), A = b(() => (v || []).map((r, e) => ({
id: `default_${e}`,
status: "local",
...r
}))), [g, u] = k(A.value, () => {
}), f = (r, e) => {
const o = {
id: `msg_${M.value}`,
message: r,
status: e
};
return M.value += 1, o;
}, w = b(() => {
const r = [];
return g.value.forEach((e) => {
const o = h ? h(e.message) : e.message, i = $(o);
i.forEach((a, t) => {
let s = e.id;
i.length > 1 && (s = `${s}_${t}`), r.push({
id: s,
message: a,
status: e.status
});
});
}), r;
}), y = (r) => r.filter((e) => e.status !== "loading" && e.status !== "error").map((e) => e.message), q = () => y(g.value);
return {
onRequest: P((r) => {
if (!p)
throw new Error(
"The agent parameter is required when using the onRequest method in an agent generated by useArtAgent."
);
let e = null;
u((a) => {
let t = [...a, f(r, "local")];
if (c) {
let s;
typeof c == "function" ? s = c(r, {
messages: y(t)
}) : s = c;
const n = f(s, "loading");
e = n.id, t = [...t, n];
}
return t;
});
let o = null;
const i = (a, t) => {
let s = g.value.find((n) => n.id === o);
return s ? u((n) => n.map((m) => m.id === o ? {
...m,
message: a,
status: t
} : m)) : (s = f(a, t), u((n) => [...n.filter((E) => E.id !== e), s]), o = s.id), s;
};
p.request(
{
message: r,
messages: q()
},
{
onUpdate: (a) => {
i(a, "loading");
},
onSuccess: (a) => {
i(a, "success");
},
onError: async (a) => {
if (d) {
let t;
typeof d == "function" ? t = await d(r, {
error: a,
messages: q()
}) : t = d, u((s) => [
...s.filter((n) => n.id !== e && n.id !== o),
f(t, "error")
]);
} else
u((t) => t.filter((s) => s.id !== e && s.id !== o));
}
}
);
}),
messages: g,
parsedMessages: w,
setMessages: u
};
}
export {
F as default
};