UNPKG

@assistant-ui/react

Version:

Typescript/React library for AI Chat

1 lines 3.81 kB
{"version":3,"sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { FC, PropsWithChildren, useEffect, useState } from \"react\";\nimport { create, StoreApi, UseBoundStore } from \"zustand\";\nimport {\n ContentPartContext,\n ContentPartContextValue,\n} from \"../react/ContentPartContext\";\nimport { ContentPartStatus } from \"../../types/AssistantTypes\";\nimport { writableStore } from \"../ReadonlyStore\";\nimport {\n ContentPartRuntimeImpl,\n ContentPartState,\n} from \"../../api/ContentPartRuntime\";\nimport { ensureBinding } from \"../react/utils/ensureBinding\";\n\nexport namespace TextContentPartProvider {\n export type Props = PropsWithChildren<{\n text: string;\n isRunning?: boolean | undefined;\n }>;\n}\n\nconst COMPLETE_STATUS: ContentPartStatus = {\n type: \"complete\",\n};\n\nconst RUNNING_STATUS: ContentPartStatus = {\n type: \"running\",\n};\n\nexport const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({\n children,\n text,\n isRunning,\n}) => {\n const [context] = useState<\n ContentPartContextValue & {\n useContentPart: UseBoundStore<\n StoreApi<ContentPartState & { type: \"text\" }>\n >;\n }\n >(() => {\n const useContentPart = create<ContentPartState & { type: \"text\" }>(() => ({\n status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,\n type: \"text\",\n text,\n }));\n\n const contentPartRuntime = new ContentPartRuntimeImpl({\n path: {\n ref: \"text\",\n threadSelector: { type: \"main\" },\n messageSelector: { type: \"messageId\", messageId: \"\" },\n contentPartSelector: { type: \"index\", index: 0 },\n },\n getState: useContentPart.getState,\n subscribe: useContentPart.subscribe,\n });\n ensureBinding(contentPartRuntime);\n\n const useContentPartRuntime = create(() => contentPartRuntime);\n\n return { useContentPartRuntime, useContentPart };\n });\n\n useEffect(() => {\n const state = context.useContentPart.getState();\n const textUpdated = state.text !== text;\n const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;\n const statusUpdated = state.status !== targetStatus;\n\n if (!textUpdated && !statusUpdated) return;\n\n writableStore(context.useContentPart).setState(\n {\n type: \"text\",\n text,\n status: targetStatus,\n } satisfies ContentPartState,\n true,\n );\n }, [context, isRunning, text]);\n\n return (\n <ContentPartContext.Provider value={context}>\n {children}\n </ContentPartContext.Provider>\n );\n};\n"],"mappings":";;;AAEA,SAAgC,WAAW,gBAAgB;AAC3D,SAAS,cAAuC;AAChD;AAAA,EACE;AAAA,OAEK;AAEP,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,OAEK;AACP,SAAS,qBAAqB;AAuE1B;AA9DJ,IAAM,kBAAqC;AAAA,EACzC,MAAM;AACR;AAEA,IAAM,iBAAoC;AAAA,EACxC,MAAM;AACR;AAEO,IAAM,0BAA6D,CAAC;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,IAAI,SAMhB,MAAM;AACN,UAAM,iBAAiB,OAA4C,OAAO;AAAA,MACxE,QAAQ,YAAY,iBAAiB;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAEF,UAAM,qBAAqB,IAAI,uBAAuB;AAAA,MACpD,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,gBAAgB,EAAE,MAAM,OAAO;AAAA,QAC/B,iBAAiB,EAAE,MAAM,aAAa,WAAW,GAAG;AAAA,QACpD,qBAAqB,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,MACjD;AAAA,MACA,UAAU,eAAe;AAAA,MACzB,WAAW,eAAe;AAAA,IAC5B,CAAC;AACD,kBAAc,kBAAkB;AAEhC,UAAM,wBAAwB,OAAO,MAAM,kBAAkB;AAE7D,WAAO,EAAE,uBAAuB,eAAe;AAAA,EACjD,CAAC;AAED,YAAU,MAAM;AACd,UAAM,QAAQ,QAAQ,eAAe,SAAS;AAC9C,UAAM,cAAc,MAAM,SAAS;AACnC,UAAM,eAAe,YAAY,iBAAiB;AAClD,UAAM,gBAAgB,MAAM,WAAW;AAEvC,QAAI,CAAC,eAAe,CAAC,cAAe;AAEpC,kBAAc,QAAQ,cAAc,EAAE;AAAA,MACpC;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC;AAE7B,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAAO,SACjC,UACH;AAEJ;","names":[]}