Loading...
Loading...
Handles Tambo component streaming, loading states, and persistent state. Use when implementing streaming UI feedback, tracking prop streaming status, managing partial props, or persisting component state across sessions with useTamboStreamStatus or useTamboComponentState.
npx skill4agent add tambo-ai/tambo component-renderingconst { streamStatus, propStatus } = useTamboStreamStatus<Props>();
if (streamStatus.isPending) return <Skeleton />;
if (streamStatus.isStreaming) return <LoadingIndicator />;import { useTamboStreamStatus } from "@tambo-ai/react";
function MyComponent({ title, items }: Props) {
const { streamStatus, propStatus } = useTamboStreamStatus<Props>();
// Global status
if (streamStatus.isPending) return <Skeleton />;
if (streamStatus.isStreaming) return <LoadingIndicator />;
if (streamStatus.isError) return <Error message={streamStatus.streamError} />;
// Per-prop status
return (
<h2 className={propStatus.title?.isStreaming ? "animate-pulse" : ""}>
{title}
</h2>
);
}| Property | Description |
|---|---|
| No tokens received yet |
| Active streaming in progress |
| All props finished without error |
| Fatal error occurred |
| Error object if failed |
| Property | Description |
|---|---|
| No tokens for this prop yet |
| Prop has partial content |
| Prop finished streaming |
| Error for this prop (if any) |
import { useEffect } from "react";
import { useTamboComponentState, useTamboStreamStatus } from "@tambo-ai/react";
interface Props {
title?: string;
}
function EditableCard({ title: streamedTitle }: Props) {
const [title, setTitle, setFromProp] = useTamboComponentState("title", "");
const { streamStatus } = useTamboStreamStatus();
// Sync streamed prop to state
useEffect(() => {
if (streamedTitle !== undefined) {
setFromProp(streamedTitle);
}
}, [streamedTitle, setFromProp]);
return (
<input
value={title}
onChange={(e) => setTitle(e.target.value)}
disabled={streamStatus.isStreaming}
/>
);
}const [value, setValue, setFromProp] = useTamboComponentState(
key,
initialValue,
);| Return | Description |
|---|---|
| Current state value |
| Update state (marks as user-edited) |
| Update from streaming props (doesn't mark as user-edited) |
z.object({
title: z.string().optional().describe("Card title"),
items: z.array(z.string()).optional(),
});items?.map(...)streamStatus.isSuccess