@artmate/chat
Version:
**开箱即用的AI组件库(基于 Vue3 + ElementPlus)**
63 lines (62 loc) • 1.72 kB
JavaScript
import { ref as p, watch as b, toValue as l } from "vue";
import { useEventCallback as D } from "../hooks/useEventCallback.js";
function C(f, o, i, w, I) {
const t = p([]), c = (e, r = t.value) => {
let n = l(f);
for (let u = 0; u < e - 1; u += 1) {
const a = r[u], s = n.find((v) => v.value === a);
if (!s)
break;
n = s.children || [];
}
return n;
}, d = (e) => e.map((r, n) => {
const a = c(n + 1, e).find((s) => s.value === r);
return a == null ? void 0 : a.value;
}), m = (e) => {
const r = t.value.length || 1, n = c(r), u = n.findIndex(
(v) => v.value === t.value[r - 1]
), a = n.length, s = n[(u + e + a) % a];
t.value = [
...t.value.slice(0, r - 1),
s.value
];
}, h = () => {
t.value.length > 1 && (t.value = t.value.slice(0, t.value.length - 1));
}, g = () => {
const e = c(t.value.length + 1);
e.length && (t.value = [...t.value, e[0].value]);
}, k = D((e) => {
if (l(o))
switch (e.key) {
case "ArrowDown":
m(1), e.preventDefault();
break;
case "ArrowUp":
m(-1), e.preventDefault();
break;
case "ArrowRight":
l(i) ? h() : g(), e.preventDefault();
break;
case "ArrowLeft":
l(i) ? g() : h(), e.preventDefault();
break;
case "Enter":
c(t.value.length + 1).length || w(d(t.value)), e.preventDefault();
break;
case "Escape":
I(), e.preventDefault();
break;
}
});
return b(
() => l(o),
() => {
l(o) && (t.value = [l(f)[0].value]);
},
{ immediate: !0 }
), [t, k];
}
export {
C as default
};