UNPKG

@assistant-ui/react

Version:

Open-source TypeScript/React library for building production-grade AI chat experiences

59 lines (58 loc) • 2.28 kB
"use client"; import { Primitive as Primitive$1 } from "../../utils/Primitive.js"; import { ThreadListItemFocusProvider, useThreadListCollection } from "../threadListFocusGroup.js"; import { forwardRef, useMemo, useRef } from "@assistant-ui/tap/react-shim"; import { useAuiState } from "@assistant-ui/store"; import { jsx } from "react/jsx-runtime"; import { composeEventHandlers } from "radix-ui/internal"; import { Direction } from "radix-ui"; // src/primitives/threadListItem/ThreadListItemRoot.tsx const ThreadListItemPrimitiveRoot = forwardRef((props, ref) => { const isMain = useAuiState((s) => s.threads.mainThreadId === s.threadListItem.id); const triggerRef = useRef(null); const moreRef = useRef(null); const focus = useMemo(() => ({ triggerRef, moreRef }), []); const getItems = useThreadListCollection(void 0); const direction = Direction.useDirection(); const onKeyDown = (event) => { if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return; const forwardKey = direction === "rtl" ? "ArrowLeft" : "ArrowRight"; const backKey = direction === "rtl" ? "ArrowRight" : "ArrowLeft"; const trigger = triggerRef.current; const more = moreRef.current; if (trigger && event.target === trigger) { if (event.key === "ArrowDown" || event.key === "ArrowUp") { const triggers = getItems().map((item) => item.ref.current).filter((node) => node !== null && !node.disabled); const next = triggers[triggers.indexOf(trigger) + (event.key === "ArrowDown" ? 1 : -1)]; if (next) { next.focus(); event.preventDefault(); } } else if (event.key === forwardKey && more) { more.focus(); event.preventDefault(); } } else if (more && event.target === more && event.key === backKey) { trigger?.focus(); event.preventDefault(); } }; return /* @__PURE__ */ jsx(ThreadListItemFocusProvider, { value: focus, children: /* @__PURE__ */ jsx(Primitive$1.div, { ...isMain ? { "data-active": "true", "aria-current": "true" } : null, ...props, onKeyDown: composeEventHandlers(props.onKeyDown, onKeyDown), ref }) }); }); ThreadListItemPrimitiveRoot.displayName = "ThreadListItemPrimitive.Root"; export { ThreadListItemPrimitiveRoot }; //# sourceMappingURL=ThreadListItemRoot.js.map