UNPKG

@artmate/chat

Version:

借鉴字节开源react库AntX,通过vue实现的版本

98 lines (97 loc) 2.67 kB
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 };