UNPKG

remix-nlux

Version:

Remix IDE NLUX integration. Remix IDE is the leading IDE for building and deploying smart contracts on Ethereum. NLUX is a JavaScript and React library for building conversational AI experiences.

123 lines (104 loc) 3.21 kB
import {useRef} from 'react'; /** * AiChat API methods. */ export type AiChatApi = { /** * API methods related to sending messages. */ composer: { /** * Types the message in the composer and sends it to the chat adapter automatically. * * @param {string} prompt */ send: (prompt: string) => void; /** * Cancel the request being sent. * If a message is being sent, it will be cancelled. * If a message is being generated (in streaming mode), the generation will stop and the message will deleted. * If no message is being sent, this method does nothing. */ cancel: () => void; }, /** * API methods related to the conversation. */ conversation: { /** * Reset the conversation. */ reset: () => void; } }; export type AiChatInternalApi = AiChatApi & { __setHost: (host: AiChatHost) => void; __unsetHost: () => void; }; export type AiChatHost = { sendMessage: (prompt: string) => void; resetConversation: () => void; cancelLastMessageRequest: () => void; }; const createVoidInternalApi = (setHost: (host: AiChatHost) => void = () => { }): AiChatInternalApi => { return { composer: { send: (prompt: string) => { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); }, cancel: () => { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); }, }, conversation: { reset: () => { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); }, }, // @ts-ignore __setHost: (host: AiChatApiHost) => { setHost(host); }, // @ts-ignore __unsetHost: () => { // Do nothing }, }; }; /** * Hook to get the AiChat API reference. * * @returns {AiChatApi} */ export const useAiChatApi = (): AiChatApi => { const currentHost = useRef<AiChatHost | null>(null); const api = useRef<AiChatInternalApi>(createVoidInternalApi()); api.current.composer.send = (prompt: string) => { if (!currentHost.current) { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); } currentHost.current.sendMessage(prompt); }; api.current.composer.cancel = () => { if (!currentHost.current) { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); } currentHost.current.cancelLastMessageRequest(); }; api.current.conversation.reset = () => { if (!currentHost.current) { throw new Error('AiChatApi is not connected to a host <AiChat /> component.'); } currentHost.current.resetConversation(); }; // @ts-ignore api.current.__setHost = (host: AiChatHost) => { currentHost.current = host; }; // @ts-ignore api.current.__unsetHost = () => { currentHost.current = null; }; return api.current; };