88 * TransportProvider,
99 * useClientTransport,
1010 * useView,
11- * useSend,
1211 * useActiveTurns,
1312 * } = createTransportHooks<UIMessageChunk, UIMessage>();
1413 *
1716 * <Chat />
1817 * </TransportProvider>
1918 *
20- * // In Chat — no type params needed:
21- * const transport = useClientTransport('ai:demo');
22- * const { nodes } = useView(transport, { limit: 30 });
23- * const send = useSend(transport);
19+ * // In Chat — no type params needed, transport is implicit from nearest provider:
20+ * const { nodes } = useView({ limit: 30 });
21+ * const turns = useActiveTurns();
2422 */
2523
2624import type * as Ably from 'ably' ;
2725import type { ComponentType } from 'react' ;
2826
29- import type { ActiveTurn , ClientTransport , SendOptions } from '../core/transport/types.js' ;
27+ import type { ClientTransport , View } from '../core/transport/types.js' ;
3028import type { TransportProviderProps } from './contexts/transport-provider.js' ;
3129import { TransportProvider as _TransportProvider } from './contexts/transport-provider.js' ;
3230import { useAblyMessages as _useAblyMessages } from './use-ably-messages.js' ;
3331import { useActiveTurns as _useActiveTurns } from './use-active-turns.js' ;
3432import { useClientTransport as _useClientTransport } from './use-client-transport.js' ;
35- import { useEdit as _useEdit } from './use-edit.js' ;
36- import { useRegenerate as _useRegenerate } from './use-regenerate.js' ;
37- import { useSend as _useSend } from './use-send.js' ;
33+ import { useCreateView as _useCreateView } from './use-create-view.js' ;
3834import type { TreeHandle } from './use-tree.js' ;
3935import { useTree as _useTree } from './use-tree.js' ;
40- import type { ViewHandle , ViewOptions } from './use-view.js' ;
36+ import type { ViewHandle } from './use-view.js' ;
4137import { useView as _useView } from './use-view.js' ;
4238
4339/**
@@ -58,53 +54,49 @@ export interface TransportHooks<TEvent, TMessage> {
5854 */
5955 useClientTransport : ( channelName : string ) => ClientTransport < TEvent , TMessage > ;
6056 /**
61- * Subscribe to the transport's view and return the visible node list with pagination.
62- * @param transport - The transport to read from.
63- * @param options - When provided, auto-loads the first page on mount.
57+ * Subscribe to the nearest transport's view and return the visible node list with pagination.
58+ * Pass `source` to override the transport/view. Pass `limit` to auto-load on mount.
6459 */
65- useView : (
66- transport : ClientTransport < TEvent , TMessage > | null | undefined ,
67- options ?: ViewOptions | null ,
68- ) => ViewHandle < TMessage > ;
69- /**
70- * Return a stable `send` callback.
71- * The returned function sends messages and returns an {@link ActiveTurn} handle.
72- * @param transport - The transport to send through.
73- */
74- useSend : (
75- transport : ClientTransport < TEvent , TMessage > ,
76- ) => ( messages : TMessage [ ] , options ?: SendOptions ) => Promise < ActiveTurn < TEvent > > ;
60+ useView : ( props ?: {
61+ /** Override transport or view; defaults to the nearest {@link TransportProvider}. */
62+ source ?: ClientTransport < TEvent , TMessage > | View < TEvent , TMessage > | null ;
63+ /** When provided, auto-loads the first page on mount. */
64+ limit ?: number ;
65+ } ) => ViewHandle < TEvent , TMessage > ;
7766 /**
7867 * Track active turns across all clients on the channel.
79- * @param transport - The transport to observe .
68+ * Pass ` transport` to override; defaults to the nearest { @link TransportProvider} .
8069 */
81- useActiveTurns : ( transport : ClientTransport < TEvent , TMessage > | null | undefined ) => Map < string , Set < string > > ;
70+ useActiveTurns : ( props ?: {
71+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
72+ transport ?: ClientTransport < TEvent , TMessage > | null ;
73+ } ) => Map < string , Set < string > > ;
8274 /**
8375 * Navigate conversation branches in the transport tree.
84- * @param transport - The transport to read from.
85- */
86- useTree : ( transport : ClientTransport < TEvent , TMessage > ) => TreeHandle < TMessage > ;
87- /**
88- * Return a stable `regenerate` callback.
89- * The returned function regenerates the given message and returns an {@link ActiveTurn} handle.
90- * @param transport - The transport to send through.
76+ * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.
9177 */
92- useRegenerate : (
93- transport : ClientTransport < TEvent , TMessage > ,
94- ) => ( messageId : string , options ?: SendOptions ) => Promise < ActiveTurn < TEvent > > ;
78+ useTree : ( props ?: {
79+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
80+ transport ?: ClientTransport < TEvent , TMessage > ;
81+ } ) => TreeHandle < TMessage > ;
9582 /**
96- * Return a stable `edit` callback.
97- * The returned function edits the given message and returns an {@link ActiveTurn} handle.
98- * @param transport - The transport to send through.
83+ * Subscribe to raw Ably messages on the transport channel.
84+ * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.
9985 */
100- useEdit : (
101- transport : ClientTransport < TEvent , TMessage > ,
102- ) => ( messageId : string , newMessages : TMessage | TMessage [ ] , options ?: SendOptions ) => Promise < ActiveTurn < TEvent > > ;
86+ useAblyMessages : ( props ?: {
87+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
88+ transport ?: ClientTransport < TEvent , TMessage > ;
89+ } ) => Ably . InboundMessage [ ] ;
10390 /**
104- * Subscribe to raw Ably messages on the transport channel .
105- * @param transport - The transport to observe .
91+ * Create an independent view over the same tree .
92+ * Pass ` transport` to override; defaults to the nearest { @link TransportProvider} .
10693 */
107- useAblyMessages : ( transport : ClientTransport < TEvent , TMessage > ) => Ably . InboundMessage [ ] ;
94+ useCreateView : ( props ?: {
95+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
96+ transport ?: ClientTransport < TEvent , TMessage > | null ;
97+ /** When provided, auto-loads the first page on mount. */
98+ limit ?: number ;
99+ } ) => ViewHandle < TEvent , TMessage > ;
108100}
109101
110102/**
@@ -119,11 +111,9 @@ export const createTransportHooks = <TEvent, TMessage>(): TransportHooks<TEvent,
119111 // CAST: TransportProvider is generic; factory narrows it to TEvent/TMessage.
120112 TransportProvider : _TransportProvider as ComponentType < TransportProviderProps < TEvent , TMessage > > ,
121113 useClientTransport : ( channelName : string ) => _useClientTransport < TEvent , TMessage > ( channelName ) ,
122- useView : ( transport , options ) => _useView ( transport , options ) ,
123- useSend : ( transport ) => _useSend ( transport ) ,
124- useActiveTurns : ( transport ) => _useActiveTurns ( transport ) ,
125- useTree : ( transport ) => _useTree ( transport ) ,
126- useRegenerate : ( transport ) => _useRegenerate ( transport ) ,
127- useEdit : ( transport ) => _useEdit ( transport ) ,
128- useAblyMessages : ( transport ) => _useAblyMessages ( transport ) ,
114+ useView : ( props ) => _useView < TEvent , TMessage > ( props ?? { } ) ,
115+ useActiveTurns : ( props ) => _useActiveTurns < TEvent , TMessage > ( props ?? { } ) ,
116+ useTree : ( props ) => _useTree < TEvent , TMessage > ( props ?? { } ) ,
117+ useAblyMessages : ( props ) => _useAblyMessages < TEvent , TMessage > ( props ?? { } ) ,
118+ useCreateView : ( props ) => _useCreateView < TEvent , TMessage > ( props ?? { } ) ,
129119} ) ;
0 commit comments