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/**
@@ -53,58 +49,71 @@ export interface TransportHooks<TEvent, TMessage> {
5349 TransportProvider : ComponentType < TransportProviderProps < TEvent , TMessage > > ;
5450 /**
5551 * Read the transport from context. No type params needed.
56- * @param channelName - The channel name passed to the enclosing `TransportProvider`.
57- * @throws {Ably.ErrorInfo } if no `TransportProvider` with the given `channelName` is in the tree.
52+ * Omit `channelName` to use the nearest provider. Pass `skip: true` to return a stub
53+ * that throws on any access — safe to hold before conditions are ready.
54+ * @throws {Ably.ErrorInfo } if `skip` is falsy and no matching provider is found.
5855 */
59- useClientTransport : ( channelName : string ) => ClientTransport < TEvent , TMessage > ;
56+ useClientTransport : ( props ?: {
57+ /** Channel name to look up; omit to use the nearest {@link TransportProvider}. */
58+ channelName ?: string ;
59+ /** When `true`, return a stub transport that throws on any access. */
60+ skip ?: boolean ;
61+ } ) => ClientTransport < TEvent , TMessage > ;
6062 /**
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 .
63+ * Subscribe to the nearest transport's view and return the visible node list with pagination.
64+ * Pass ` transport` to use a transport's default view, `view` to subscribe to a specific view
65+ * directly. Pass `limit` to auto-load on mount. Pass `skip: true` for an empty handle .
6466 */
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 > > ;
67+ useView : ( props ?: {
68+ /** Client transport whose default view to subscribe to; defaults to the nearest {@link TransportProvider}. */
69+ transport ?: ClientTransport < TEvent , TMessage > | null ;
70+ /** A specific {@link View} to subscribe to directly. Takes priority over `transport`. */
71+ view ?: View < TEvent , TMessage > | null ;
72+ /** When provided, auto-loads the first page on mount. */
73+ limit ?: number ;
74+ /** When `true`, skip all subscriptions and return an empty handle. */
75+ skip ?: boolean ;
76+ } ) => ViewHandle < TEvent , TMessage > ;
7777 /**
7878 * Track active turns across all clients on the channel.
79- * @param transport - The transport to observe .
79+ * Pass ` transport` to override; defaults to the nearest { @link TransportProvider} .
8080 */
81- useActiveTurns : ( transport : ClientTransport < TEvent , TMessage > | null | undefined ) => Map < string , Set < string > > ;
81+ useActiveTurns : ( props ?: {
82+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
83+ transport ?: ClientTransport < TEvent , TMessage > | null ;
84+ } ) => Map < string , Set < string > > ;
8285 /**
8386 * 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.
87+ * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.
9188 */
92- useRegenerate : (
93- transport : ClientTransport < TEvent , TMessage > ,
94- ) => ( messageId : string , options ?: SendOptions ) => Promise < ActiveTurn < TEvent > > ;
89+ useTree : ( props ?: {
90+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
91+ transport ?: ClientTransport < TEvent , TMessage > ;
92+ } ) => TreeHandle < TMessage > ;
9593 /**
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 .
94+ * Subscribe to raw Ably messages on the transport channel .
95+ * Pass `transport` to override; defaults to the nearest {@link TransportProvider} .
96+ * Pass `skip: true` to return an empty array without subscribing .
9997 */
100- useEdit : (
101- transport : ClientTransport < TEvent , TMessage > ,
102- ) => ( messageId : string , newMessages : TMessage | TMessage [ ] , options ?: SendOptions ) => Promise < ActiveTurn < TEvent > > ;
98+ useAblyMessages : ( props ?: {
99+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
100+ transport ?: ClientTransport < TEvent , TMessage > ;
101+ /** When `true`, skip all subscriptions and return an empty array. */
102+ skip ?: boolean ;
103+ } ) => Ably . InboundMessage [ ] ;
103104 /**
104- * Subscribe to raw Ably messages on the transport channel.
105- * @param transport - The transport to observe.
105+ * Create an independent view over the same tree.
106+ * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.
107+ * Pass `skip: true` to return an empty handle without creating a view.
106108 */
107- useAblyMessages : ( transport : ClientTransport < TEvent , TMessage > ) => Ably . InboundMessage [ ] ;
109+ useCreateView : ( props ?: {
110+ /** Override transport; defaults to the nearest {@link TransportProvider}. */
111+ transport ?: ClientTransport < TEvent , TMessage > | null ;
112+ /** When provided, auto-loads the first page on mount. */
113+ limit ?: number ;
114+ /** When `true`, skip view creation and return an empty handle. */
115+ skip ?: boolean ;
116+ } ) => ViewHandle < TEvent , TMessage > ;
108117}
109118
110119/**
@@ -118,12 +127,10 @@ export interface TransportHooks<TEvent, TMessage> {
118127export const createTransportHooks = < TEvent , TMessage > ( ) : TransportHooks < TEvent , TMessage > => ( {
119128 // CAST: TransportProvider is generic; factory narrows it to TEvent/TMessage.
120129 TransportProvider : _TransportProvider as ComponentType < TransportProviderProps < TEvent , TMessage > > ,
121- 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 ) ,
130+ useClientTransport : ( props ) => _useClientTransport < TEvent , TMessage > ( props ?? { } ) ,
131+ useView : ( props ) => _useView < TEvent , TMessage > ( props ?? { } ) ,
132+ useActiveTurns : ( props ) => _useActiveTurns < TEvent , TMessage > ( props ?? { } ) ,
133+ useTree : ( props ) => _useTree < TEvent , TMessage > ( props ?? { } ) ,
134+ useAblyMessages : ( props ) => _useAblyMessages < TEvent , TMessage > ( props ?? { } ) ,
135+ useCreateView : ( props ) => _useCreateView < TEvent , TMessage > ( props ?? { } ) ,
129136} ) ;
0 commit comments