UNPKG

@assistant-ui/react

Version:

React components for AI chat.

46 lines (41 loc) 1.61 kB
import { useMemo } from "react"; import { useMessageContext, useMessageRuntime } from "./MessageContext"; import { useThreadContext, useThreadRuntime } from "./ThreadContext"; import { ReadonlyStore } from "../ReadonlyStore"; import { createContextStoreHook } from "./utils/createContextStoreHook"; import { ComposerRuntime, ComposerState } from "../../api/ComposerRuntime"; import { UseBoundStore } from "zustand"; export type ComposerContextValue = { useComposer: UseBoundStore<ReadonlyStore<ComposerState>>; type: "edit" | "new"; }; export const useComposerContext = (): ComposerContextValue => { const { useComposer: useThreadComposer } = useThreadContext(); const { useEditComposer } = useMessageContext({ optional: true }) ?? {}; return useMemo( () => ({ useComposer: useEditComposer ?? useThreadComposer, type: useEditComposer ? ("edit" as const) : ("new" as const), }), [useEditComposer, useThreadComposer], ); }; export const { useComposer, useComposerStore } = createContextStoreHook( useComposerContext, "useComposer", ); export function useComposerRuntime(options?: { optional?: false | undefined; }): ComposerRuntime; export function useComposerRuntime(options?: { optional?: boolean | undefined; }): ComposerRuntime | null; export function useComposerRuntime(options?: { optional?: boolean | undefined; }): ComposerRuntime | null { const messageRuntime = useMessageRuntime({ optional: true }); const threadRuntime = useThreadRuntime(options); return messageRuntime ? messageRuntime.composer : (threadRuntime?.composer ?? null); }