UNPKG

@assistant-ui/react

Version:

Typescript/React library for AI Chat

136 lines (106 loc) 3.85 kB
import { Unsubscribe } from "../types"; import { ThreadListItemRuntimePath } from "./RuntimePathTypes"; import { SubscribableWithState } from "./subscribable/Subscribable"; import { ThreadListRuntimeCoreBinding } from "./ThreadListRuntime"; export type ThreadListItemEventType = "switched-to" | "switched-away"; export type ThreadListItemState = { readonly isMain: boolean; readonly id: string; readonly remoteId: string | undefined; readonly externalId: string | undefined; /** * @deprecated This field was renamed to `id`. This field will be removed in 0.8.0. */ readonly threadId: string; readonly status: "archived" | "regular" | "new" | "deleted"; readonly title?: string | undefined; }; export type ThreadListItemRuntime = { readonly path: ThreadListItemRuntimePath; getState(): ThreadListItemState; initialize(): Promise<{ remoteId: string; externalId: string | undefined }>; generateTitle(): Promise<void>; switchTo(): Promise<void>; rename(newTitle: string): Promise<void>; archive(): Promise<void>; unarchive(): Promise<void>; delete(): Promise<void>; subscribe(callback: () => void): Unsubscribe; unstable_on( event: ThreadListItemEventType, callback: () => void, ): Unsubscribe; }; export type ThreadListItemStateBinding = SubscribableWithState< ThreadListItemState, ThreadListItemRuntimePath >; export class ThreadListItemRuntimeImpl implements ThreadListItemRuntime { public get path() { return this._core.path; } constructor( private _core: ThreadListItemStateBinding, private _threadListBinding: ThreadListRuntimeCoreBinding, ) {} protected __internal_bindMethods() { this.switchTo = this.switchTo.bind(this); this.rename = this.rename.bind(this); this.archive = this.archive.bind(this); this.unarchive = this.unarchive.bind(this); this.delete = this.delete.bind(this); this.initialize = this.initialize.bind(this); this.generateTitle = this.generateTitle.bind(this); this.subscribe = this.subscribe.bind(this); this.unstable_on = this.unstable_on.bind(this); this.getState = this.getState.bind(this); } public getState(): ThreadListItemState { return this._core.getState(); } public switchTo(): Promise<void> { const state = this._core.getState(); return this._threadListBinding.switchToThread(state.id); } public rename(newTitle: string): Promise<void> { const state = this._core.getState(); return this._threadListBinding.rename(state.id, newTitle); } public archive(): Promise<void> { const state = this._core.getState(); return this._threadListBinding.archive(state.id); } public unarchive(): Promise<void> { const state = this._core.getState(); return this._threadListBinding.unarchive(state.id); } public delete(): Promise<void> { const state = this._core.getState(); return this._threadListBinding.delete(state.id); } public initialize(): Promise<{ remoteId: string; externalId: string | undefined; }> { const state = this._core.getState(); return this._threadListBinding.initialize(state.id); } public generateTitle(): Promise<void> { const state = this._core.getState(); return this._threadListBinding.generateTitle(state.id); } public unstable_on(event: ThreadListItemEventType, callback: () => void) { let prevIsMain = this._core.getState().isMain; return this.subscribe(() => { const newIsMain = this._core.getState().isMain; if (prevIsMain === newIsMain) return; prevIsMain = newIsMain; if (event === "switched-to" && !newIsMain) return; if (event === "switched-away" && newIsMain) return; callback(); }); } public subscribe(callback: () => void): Unsubscribe { return this._core.subscribe(callback); } }