@tambo-ai/react 0.75.0 → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +13 -13
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +3 -3
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/index.d.ts +7 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -59
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-hooks.js +5 -5
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/model/component-metadata.d.ts +4 -4
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +6 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +4 -2
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +1 -1
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +3 -19
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.js +20 -97
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
- package/dist/testing/tools.d.ts +3 -3
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.d.ts +9 -9
- package/dist/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/dist/v1/components/v1-component-renderer.js +13 -13
- package/dist/v1/components/v1-component-renderer.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.test.js +15 -15
- package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{esm/hooks/use-current-message.d.ts → dist/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/dist/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/dist/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/dist/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +12 -12
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +60 -35
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +7 -7
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +20 -22
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +51 -51
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +19 -19
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +9 -9
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +44 -44
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +29 -29
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +13 -17
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +41 -10
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +176 -48
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +31 -27
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +45 -35
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +32 -32
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +22 -22
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +17 -17
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -9
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +7 -7
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +25 -25
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +16 -16
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +2 -2
- package/dist/v1/types/auth.d.ts.map +1 -1
- package/dist/v1/types/auth.js.map +1 -1
- package/dist/v1/types/component.d.ts +3 -3
- package/dist/v1/types/component.d.ts.map +1 -1
- package/dist/v1/types/component.js +2 -2
- package/dist/v1/types/component.js.map +1 -1
- package/dist/v1/types/event.d.ts +1 -1
- package/dist/v1/types/event.js +1 -1
- package/dist/v1/types/event.js.map +1 -1
- package/dist/v1/types/message.d.ts +17 -24
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/thread.d.ts +10 -8
- package/dist/v1/types/thread.d.ts.map +1 -1
- package/dist/v1/types/thread.js +1 -1
- package/dist/v1/types/thread.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +1 -1
- package/dist/v1/types/tool-choice.js.map +1 -1
- package/dist/v1/utils/component-renderer.d.ts +11 -5
- package/dist/v1/utils/component-renderer.d.ts.map +1 -1
- package/dist/v1/utils/component-renderer.js +16 -7
- package/dist/v1/utils/component-renderer.js.map +1 -1
- package/dist/v1/utils/component-renderer.test.js +7 -7
- package/dist/v1/utils/component-renderer.test.js.map +1 -1
- package/dist/v1/utils/event-accumulator.d.ts +13 -13
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +26 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +54 -19
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.d.ts +18 -18
- package/dist/v1/utils/registry-conversion.js +23 -23
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/stream-handler.d.ts +1 -1
- package/dist/v1/utils/stream-handler.js +1 -1
- package/dist/v1/utils/stream-handler.js.map +1 -1
- package/dist/v1/utils/thread-utils.d.ts +2 -2
- package/dist/v1/utils/thread-utils.d.ts.map +1 -1
- package/dist/v1/utils/thread-utils.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +1 -1
- package/dist/v1/utils/tool-call-tracker.js +1 -1
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-executor.d.ts +1 -1
- package/dist/v1/utils/tool-executor.js +2 -2
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +13 -13
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +1 -1
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/index.d.ts +7 -25
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +7 -21
- package/esm/index.js.map +1 -1
- package/esm/mcp/mcp-hooks.js +1 -1
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/model/component-metadata.d.ts +4 -4
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +6 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +4 -2
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +3 -19
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.js +20 -97
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
- package/esm/testing/tools.d.ts +3 -3
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.d.ts +9 -9
- package/esm/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/esm/v1/components/v1-component-renderer.js +12 -12
- package/esm/v1/components/v1-component-renderer.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.test.js +16 -16
- package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{dist/hooks/use-current-message.d.ts → esm/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/esm/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/esm/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/esm/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +14 -14
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +62 -37
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +21 -23
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +54 -54
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +21 -21
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +48 -48
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +32 -32
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +15 -19
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +43 -12
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +178 -50
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +31 -27
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +38 -33
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +32 -32
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +23 -23
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +17 -17
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +10 -10
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +28 -28
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +15 -15
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +2 -2
- package/esm/v1/types/auth.d.ts.map +1 -1
- package/esm/v1/types/auth.js.map +1 -1
- package/esm/v1/types/component.d.ts +3 -3
- package/esm/v1/types/component.d.ts.map +1 -1
- package/esm/v1/types/component.js +2 -2
- package/esm/v1/types/component.js.map +1 -1
- package/esm/v1/types/event.d.ts +1 -1
- package/esm/v1/types/event.js +1 -1
- package/esm/v1/types/event.js.map +1 -1
- package/esm/v1/types/message.d.ts +17 -24
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/thread.d.ts +10 -8
- package/esm/v1/types/thread.d.ts.map +1 -1
- package/esm/v1/types/thread.js +1 -1
- package/esm/v1/types/thread.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +1 -1
- package/esm/v1/types/tool-choice.js.map +1 -1
- package/esm/v1/utils/component-renderer.d.ts +11 -5
- package/esm/v1/utils/component-renderer.d.ts.map +1 -1
- package/esm/v1/utils/component-renderer.js +13 -5
- package/esm/v1/utils/component-renderer.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +8 -8
- package/esm/v1/utils/component-renderer.test.js.map +1 -1
- package/esm/v1/utils/event-accumulator.d.ts +13 -13
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +26 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +54 -19
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/registry-conversion.d.ts +18 -18
- package/esm/v1/utils/registry-conversion.js +23 -23
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/stream-handler.d.ts +1 -1
- package/esm/v1/utils/stream-handler.js +1 -1
- package/esm/v1/utils/stream-handler.js.map +1 -1
- package/esm/v1/utils/thread-utils.d.ts +2 -2
- package/esm/v1/utils/thread-utils.d.ts.map +1 -1
- package/esm/v1/utils/thread-utils.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
- package/esm/v1/utils/tool-call-tracker.js +1 -1
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-executor.d.ts +1 -1
- package/esm/v1/utils/tool-executor.js +2 -2
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/package.json +4 -9
- package/dist/hooks/index.d.ts +0 -9
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -34
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/use-component-state.d.ts +0 -30
- package/dist/hooks/use-component-state.d.ts.map +0 -1
- package/dist/hooks/use-component-state.js +0 -139
- package/dist/hooks/use-component-state.js.map +0 -1
- package/dist/hooks/use-component-state.test.d.ts +0 -2
- package/dist/hooks/use-component-state.test.d.ts.map +0 -1
- package/dist/hooks/use-component-state.test.js +0 -406
- package/dist/hooks/use-component-state.test.js.map +0 -1
- package/dist/hooks/use-current-message.d.ts.map +0 -1
- package/dist/hooks/use-current-message.js.map +0 -1
- package/dist/hooks/use-current-message.test.d.ts +0 -2
- package/dist/hooks/use-current-message.test.d.ts.map +0 -1
- package/dist/hooks/use-current-message.test.js +0 -269
- package/dist/hooks/use-current-message.test.js.map +0 -1
- package/dist/hooks/use-streaming-props.d.ts +0 -11
- package/dist/hooks/use-streaming-props.d.ts.map +0 -1
- package/dist/hooks/use-streaming-props.js +0 -37
- package/dist/hooks/use-streaming-props.js.map +0 -1
- package/dist/hooks/use-suggestions.d.ts +0 -46
- package/dist/hooks/use-suggestions.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.js +0 -118
- package/dist/hooks/use-suggestions.js.map +0 -1
- package/dist/hooks/use-suggestions.test.d.ts +0 -2
- package/dist/hooks/use-suggestions.test.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.test.js +0 -247
- package/dist/hooks/use-suggestions.test.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.d.ts +0 -90
- package/dist/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.js +0 -213
- package/dist/hooks/use-tambo-stream-status.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/dist/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.js +0 -378
- package/dist/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/dist/hooks/use-tambo-threads.d.ts +0 -158
- package/dist/hooks/use-tambo-threads.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.js +0 -45
- package/dist/hooks/use-tambo-threads.js.map +0 -1
- package/dist/hooks/use-tambo-threads.test.d.ts +0 -2
- package/dist/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.test.js +0 -214
- package/dist/hooks/use-tambo-threads.test.js.map +0 -1
- package/dist/model/generate-component-response.d.ts +0 -37
- package/dist/model/generate-component-response.d.ts.map +0 -1
- package/dist/model/generate-component-response.js +0 -29
- package/dist/model/generate-component-response.js.map +0 -1
- package/dist/model/tambo-thread.d.ts +0 -15
- package/dist/model/tambo-thread.d.ts.map +0 -1
- package/dist/model/tambo-thread.js +0 -3
- package/dist/model/tambo-thread.js.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +0 -592
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -13
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -41
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/tambo-component-provider.d.ts +0 -23
- package/dist/providers/tambo-component-provider.d.ts.map +0 -1
- package/dist/providers/tambo-component-provider.js +0 -88
- package/dist/providers/tambo-component-provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.js +0 -43
- package/dist/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.js +0 -31
- package/dist/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.js +0 -107
- package/dist/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.js +0 -6
- package/dist/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/dist/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.js +0 -275
- package/dist/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/dist/providers/tambo-provider.d.ts +0 -53
- package/dist/providers/tambo-provider.d.ts.map +0 -1
- package/dist/providers/tambo-provider.js +0 -133
- package/dist/providers/tambo-provider.js.map +0 -1
- package/dist/providers/tambo-stubs.d.ts +0 -89
- package/dist/providers/tambo-stubs.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.js +0 -279
- package/dist/providers/tambo-stubs.js.map +0 -1
- package/dist/providers/tambo-stubs.test.d.ts +0 -2
- package/dist/providers/tambo-stubs.test.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.test.js +0 -97
- package/dist/providers/tambo-stubs.test.js.map +0 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +0 -65
- package/dist/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-input-provider.js +0 -179
- package/dist/providers/tambo-thread-input-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +0 -278
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/dist/providers/tambo-thread-provider.d.ts +0 -126
- package/dist/providers/tambo-thread-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.js +0 -931
- package/dist/providers/tambo-thread-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.test.js +0 -1591
- package/dist/providers/tambo-thread-provider.test.js.map +0 -1
- package/dist/util/generate-component.d.ts +0 -12
- package/dist/util/generate-component.d.ts.map +0 -1
- package/dist/util/generate-component.js +0 -58
- package/dist/util/generate-component.js.map +0 -1
- package/dist/util/generate-component.test.d.ts +0 -2
- package/dist/util/generate-component.test.d.ts.map +0 -1
- package/dist/util/generate-component.test.js +0 -340
- package/dist/util/generate-component.test.js.map +0 -1
- package/esm/hooks/index.d.ts +0 -9
- package/esm/hooks/index.d.ts.map +0 -1
- package/esm/hooks/index.js +0 -10
- package/esm/hooks/index.js.map +0 -1
- package/esm/hooks/use-component-state.d.ts +0 -30
- package/esm/hooks/use-component-state.d.ts.map +0 -1
- package/esm/hooks/use-component-state.js +0 -136
- package/esm/hooks/use-component-state.js.map +0 -1
- package/esm/hooks/use-component-state.test.d.ts +0 -2
- package/esm/hooks/use-component-state.test.d.ts.map +0 -1
- package/esm/hooks/use-component-state.test.js +0 -401
- package/esm/hooks/use-component-state.test.js.map +0 -1
- package/esm/hooks/use-current-message.d.ts.map +0 -1
- package/esm/hooks/use-current-message.js.map +0 -1
- package/esm/hooks/use-current-message.test.d.ts +0 -2
- package/esm/hooks/use-current-message.test.d.ts.map +0 -1
- package/esm/hooks/use-current-message.test.js +0 -264
- package/esm/hooks/use-current-message.test.js.map +0 -1
- package/esm/hooks/use-streaming-props.d.ts +0 -11
- package/esm/hooks/use-streaming-props.d.ts.map +0 -1
- package/esm/hooks/use-streaming-props.js +0 -34
- package/esm/hooks/use-streaming-props.js.map +0 -1
- package/esm/hooks/use-suggestions.d.ts +0 -46
- package/esm/hooks/use-suggestions.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.js +0 -115
- package/esm/hooks/use-suggestions.js.map +0 -1
- package/esm/hooks/use-suggestions.test.d.ts +0 -2
- package/esm/hooks/use-suggestions.test.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.test.js +0 -245
- package/esm/hooks/use-suggestions.test.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.d.ts +0 -90
- package/esm/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.js +0 -210
- package/esm/hooks/use-tambo-stream-status.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/esm/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.js +0 -376
- package/esm/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/esm/hooks/use-tambo-threads.d.ts +0 -158
- package/esm/hooks/use-tambo-threads.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.js +0 -42
- package/esm/hooks/use-tambo-threads.js.map +0 -1
- package/esm/hooks/use-tambo-threads.test.d.ts +0 -2
- package/esm/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.test.js +0 -212
- package/esm/hooks/use-tambo-threads.test.js.map +0 -1
- package/esm/model/generate-component-response.d.ts +0 -37
- package/esm/model/generate-component-response.d.ts.map +0 -1
- package/esm/model/generate-component-response.js +0 -25
- package/esm/model/generate-component-response.js.map +0 -1
- package/esm/model/tambo-thread.d.ts +0 -15
- package/esm/model/tambo-thread.d.ts.map +0 -1
- package/esm/model/tambo-thread.js +0 -2
- package/esm/model/tambo-thread.js.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +0 -587
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/esm/providers/index.d.ts +0 -13
- package/esm/providers/index.d.ts.map +0 -1
- package/esm/providers/index.js +0 -11
- package/esm/providers/index.js.map +0 -1
- package/esm/providers/tambo-component-provider.d.ts +0 -23
- package/esm/providers/tambo-component-provider.d.ts.map +0 -1
- package/esm/providers/tambo-component-provider.js +0 -50
- package/esm/providers/tambo-component-provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.js +0 -22
- package/esm/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.js +0 -24
- package/esm/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.js +0 -70
- package/esm/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.js +0 -3
- package/esm/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/esm/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.js +0 -270
- package/esm/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/esm/providers/tambo-provider.d.ts +0 -53
- package/esm/providers/tambo-provider.d.ts.map +0 -1
- package/esm/providers/tambo-provider.js +0 -94
- package/esm/providers/tambo-provider.js.map +0 -1
- package/esm/providers/tambo-stubs.d.ts +0 -89
- package/esm/providers/tambo-stubs.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.js +0 -242
- package/esm/providers/tambo-stubs.js.map +0 -1
- package/esm/providers/tambo-stubs.test.d.ts +0 -2
- package/esm/providers/tambo-stubs.test.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.test.js +0 -62
- package/esm/providers/tambo-stubs.test.js.map +0 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +0 -65
- package/esm/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-input-provider.js +0 -141
- package/esm/providers/tambo-thread-input-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +0 -273
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/esm/providers/tambo-thread-provider.d.ts +0 -126
- package/esm/providers/tambo-thread-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.js +0 -891
- package/esm/providers/tambo-thread-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.test.js +0 -1553
- package/esm/providers/tambo-thread-provider.test.js.map +0 -1
- package/esm/util/generate-component.d.ts +0 -12
- package/esm/util/generate-component.d.ts.map +0 -1
- package/esm/util/generate-component.js +0 -52
- package/esm/util/generate-component.js.map +0 -1
- package/esm/util/generate-component.test.d.ts +0 -2
- package/esm/util/generate-component.test.d.ts.map +0 -1
- package/esm/util/generate-component.test.js +0 -302
- package/esm/util/generate-component.test.js.map +0 -1
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use client";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.useTamboComponentState = useTamboComponentState;
|
|
5
|
-
const fast_equals_1 = require("fast-equals");
|
|
6
|
-
const react_1 = require("react");
|
|
7
|
-
const use_debounce_1 = require("use-debounce");
|
|
8
|
-
const __1 = require("..");
|
|
9
|
-
const tambo_interactable_provider_1 = require("../providers/tambo-interactable-provider");
|
|
10
|
-
const use_current_message_1 = require("./use-current-message");
|
|
11
|
-
function useTamboComponentState(keyName, initialValue, setFromProp, debounceTime = 500) {
|
|
12
|
-
const message = (0, react_1.useContext)(use_current_message_1.TamboMessageContext);
|
|
13
|
-
const { updateThreadMessage } = (0, __1.useTamboThread)();
|
|
14
|
-
const client = (0, __1.useTamboClient)();
|
|
15
|
-
const componentId = message?.interactableMetadata?.id ?? null;
|
|
16
|
-
const { setInteractableState, getInteractableComponentState } = (0, tambo_interactable_provider_1.useTamboInteractable)();
|
|
17
|
-
const messageState = message?.componentState?.[keyName];
|
|
18
|
-
const interactableState = componentId
|
|
19
|
-
? getInteractableComponentState(componentId)?.[keyName]
|
|
20
|
-
: undefined;
|
|
21
|
-
const initialState = interactableState ?? messageState ?? initialValue;
|
|
22
|
-
const [localState, setLocalState] = (0, react_1.useState)(initialState);
|
|
23
|
-
const [initializedFromThreadMessage, setInitializedFromThreadMessage] = (0, react_1.useState)(messageState ? true : false);
|
|
24
|
-
// Optimistically update the local thread message's componentState
|
|
25
|
-
const updateLocalThreadMessage = (0, react_1.useCallback)(async (newState, existingMessage) => {
|
|
26
|
-
if (!existingMessage) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const updatedMessage = {
|
|
30
|
-
threadId: existingMessage.threadId,
|
|
31
|
-
componentState: {
|
|
32
|
-
...existingMessage.componentState,
|
|
33
|
-
[keyName]: newState,
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
await updateThreadMessage(existingMessage.id, updatedMessage, false);
|
|
37
|
-
}, [updateThreadMessage, keyName]);
|
|
38
|
-
// Debounced callback to update the remote thread message's componentState
|
|
39
|
-
const updateRemoteThreadMessage = (0, use_debounce_1.useDebouncedCallback)(async (newState, existingMessage) => {
|
|
40
|
-
if (!existingMessage) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
await client.beta.threads.messages.updateComponentState(existingMessage.id, {
|
|
44
|
-
id: existingMessage.threadId,
|
|
45
|
-
state: { [keyName]: newState },
|
|
46
|
-
});
|
|
47
|
-
}, debounceTime);
|
|
48
|
-
const setValue = (0, react_1.useCallback)((newState) => {
|
|
49
|
-
setLocalState(newState);
|
|
50
|
-
if (componentId) {
|
|
51
|
-
// For interactable components, update the interactable provider's state
|
|
52
|
-
setInteractableState(componentId, keyName, newState);
|
|
53
|
-
}
|
|
54
|
-
else if (message) {
|
|
55
|
-
// For generated components, update both local and remote thread message state
|
|
56
|
-
void updateLocalThreadMessage(newState, message);
|
|
57
|
-
void updateRemoteThreadMessage(newState, message);
|
|
58
|
-
}
|
|
59
|
-
}, [
|
|
60
|
-
message,
|
|
61
|
-
updateLocalThreadMessage,
|
|
62
|
-
updateRemoteThreadMessage,
|
|
63
|
-
setInteractableState,
|
|
64
|
-
componentId,
|
|
65
|
-
keyName,
|
|
66
|
-
]);
|
|
67
|
-
const existingInteractableState = componentId
|
|
68
|
-
? getInteractableComponentState(componentId)?.[keyName]
|
|
69
|
-
: undefined;
|
|
70
|
-
const shouldUpdateInteractableInitial = !!componentId &&
|
|
71
|
-
existingInteractableState === undefined &&
|
|
72
|
-
initialValue !== undefined;
|
|
73
|
-
// Set initial value in interactable state if we're in an interactable context and there's no existing state
|
|
74
|
-
(0, react_1.useEffect)(() => {
|
|
75
|
-
if (!shouldUpdateInteractableInitial) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
setInteractableState(componentId, keyName, initialValue);
|
|
79
|
-
}, [
|
|
80
|
-
shouldUpdateInteractableInitial,
|
|
81
|
-
componentId,
|
|
82
|
-
keyName,
|
|
83
|
-
initialValue,
|
|
84
|
-
setInteractableState,
|
|
85
|
-
]);
|
|
86
|
-
const shouldSyncFromMessage = !!message && messageState !== undefined && messageState !== null;
|
|
87
|
-
// Mirror the thread message's componentState value to the local state and interactable state
|
|
88
|
-
(0, react_1.useEffect)(() => {
|
|
89
|
-
if (!shouldSyncFromMessage) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
setInitializedFromThreadMessage(true);
|
|
93
|
-
const stateValue = messageState;
|
|
94
|
-
setLocalState(stateValue);
|
|
95
|
-
if (componentId) {
|
|
96
|
-
setInteractableState(componentId, keyName, stateValue);
|
|
97
|
-
}
|
|
98
|
-
}, [
|
|
99
|
-
shouldSyncFromMessage,
|
|
100
|
-
messageState,
|
|
101
|
-
keyName,
|
|
102
|
-
setInteractableState,
|
|
103
|
-
componentId,
|
|
104
|
-
]);
|
|
105
|
-
// Sync from interactable provider to local state when state changes externally (e.g., from Tambo tool call)
|
|
106
|
-
(0, react_1.useEffect)(() => {
|
|
107
|
-
if (!componentId)
|
|
108
|
-
return;
|
|
109
|
-
// only update if different
|
|
110
|
-
setLocalState((prev) => (0, fast_equals_1.deepEqual)(prev, interactableState) ? prev : interactableState);
|
|
111
|
-
}, [componentId, interactableState]);
|
|
112
|
-
// For editable fields that are set from a prop to allow streaming updates, don't overwrite a fetched state value set from the thread message with prop value on initial load.
|
|
113
|
-
(0, react_1.useEffect)(() => {
|
|
114
|
-
if (setFromProp !== undefined && !initializedFromThreadMessage) {
|
|
115
|
-
setLocalState(setFromProp);
|
|
116
|
-
}
|
|
117
|
-
}, [setFromProp, initializedFromThreadMessage]);
|
|
118
|
-
// Ensure pending changes are flushed on unmount (only for generated components)
|
|
119
|
-
(0, react_1.useEffect)(() => {
|
|
120
|
-
// Only flush remote updates for generated components, not interactable components
|
|
121
|
-
if (componentId) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
return () => {
|
|
125
|
-
async function flushUpdates() {
|
|
126
|
-
try {
|
|
127
|
-
await updateRemoteThreadMessage.flush();
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
console.error("Failed to flush pending thread message updates:", error);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Fire-and-forget cleanup (errors handled inside)
|
|
134
|
-
void flushUpdates();
|
|
135
|
-
};
|
|
136
|
-
}, [updateRemoteThreadMessage, componentId]);
|
|
137
|
-
return [localState, setValue];
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=use-component-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-component-state.js","sourceRoot":"","sources":["../../src/hooks/use-component-state.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { TamboThreadMessage, useTamboClient, useTamboThread } from \"..\";\nimport { useTamboInteractable } from \"../providers/tambo-interactable-provider\";\nimport { TamboMessageContext } from \"./use-current-message\";\n\ntype StateUpdateResult<T> = [currentState: T, setState: (newState: T) => void];\n\n/**\n * A React hook that acts like useState, but also automatically updates the thread message's componentState.\n * If used within an interactable component (wrapped with withTamboInteractable), it updates the\n * interactable provider's global state (sent to Tambo on every request) instead of the remote thread message state.\n * For generated components, it updates both the local and remote thread message's componentState.\n *\n * Benefits: Passes user changes to AI, and when threads are returned, state is preserved.\n * Works in both generative and interactable component contexts.\n * @param keyName - The unique key to identify this state value within the message's componentState object\n * @param initialValue - Optional initial value for the state, used if no componentState value exists in the Tambo message containing this hook usage.\n * @param setFromProp - Optional value used to set the state value, only while no componentState value exists in the Tambo message containing this hook usage. Use this to allow streaming updates from a prop to the state value.\n * @param debounceTime - Optional debounce time in milliseconds (default: 500ms) to limit API calls.\n * @returns A tuple of [currentState, setState] similar to React's useState\n * @example\n * ```tsx\n * const [count, setCount] = useTamboComponentState(\"counter\", 0);\n * ```\n *\n * Use `setFromProp` to seed state from streamed props. During streaming,\n * state updates as new prop values arrive. Once streaming completes,\n * user edits take precedence over the original prop value.\n *\n * Pair with `useTamboStreamStatus` to disable inputs while streaming.\n * @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}\n */\nexport function useTamboComponentState<S = undefined>(\n keyName: string,\n initialValue?: S,\n setFromProp?: S,\n debounceTime?: number,\n): StateUpdateResult<S | undefined>;\nexport function useTamboComponentState<S>(\n keyName: string,\n initialValue: S,\n setFromProp?: S,\n debounceTime?: number,\n): StateUpdateResult<S>;\nexport function useTamboComponentState<S>(\n keyName: string,\n initialValue?: S,\n setFromProp?: S,\n debounceTime = 500,\n): StateUpdateResult<S> {\n const message = useContext(TamboMessageContext);\n const { updateThreadMessage } = useTamboThread();\n const client = useTamboClient();\n const componentId = message?.interactableMetadata?.id ?? null;\n const { setInteractableState, getInteractableComponentState } =\n useTamboInteractable();\n const messageState = message?.componentState?.[keyName];\n const interactableState = componentId\n ? getInteractableComponentState(componentId)?.[keyName]\n : undefined;\n const initialState =\n (interactableState as S) ?? (messageState as S) ?? initialValue;\n const [localState, setLocalState] = useState<S | undefined>(initialState);\n const [initializedFromThreadMessage, setInitializedFromThreadMessage] =\n useState(messageState ? true : false);\n\n // Optimistically update the local thread message's componentState\n const updateLocalThreadMessage = useCallback(\n async (newState: S, existingMessage: TamboThreadMessage | null) => {\n if (!existingMessage) {\n return;\n }\n const updatedMessage = {\n threadId: existingMessage.threadId,\n componentState: {\n ...existingMessage.componentState,\n [keyName]: newState,\n },\n };\n await updateThreadMessage(existingMessage.id, updatedMessage, false);\n },\n [updateThreadMessage, keyName],\n );\n\n // Debounced callback to update the remote thread message's componentState\n const updateRemoteThreadMessage = useDebouncedCallback(\n async (newState: S, existingMessage: TamboThreadMessage | null) => {\n if (!existingMessage) {\n return;\n }\n await client.beta.threads.messages.updateComponentState(\n existingMessage.id,\n {\n id: existingMessage.threadId,\n state: { [keyName]: newState },\n },\n );\n },\n debounceTime,\n );\n\n const setValue = useCallback(\n (newState: S) => {\n setLocalState(newState);\n if (componentId) {\n // For interactable components, update the interactable provider's state\n setInteractableState(componentId, keyName, newState);\n } else if (message) {\n // For generated components, update both local and remote thread message state\n void updateLocalThreadMessage(newState, message);\n void updateRemoteThreadMessage(newState, message);\n }\n },\n [\n message,\n updateLocalThreadMessage,\n updateRemoteThreadMessage,\n setInteractableState,\n componentId,\n keyName,\n ],\n );\n\n const existingInteractableState = componentId\n ? getInteractableComponentState(componentId)?.[keyName]\n : undefined;\n const shouldUpdateInteractableInitial =\n !!componentId &&\n existingInteractableState === undefined &&\n initialValue !== undefined;\n\n // Set initial value in interactable state if we're in an interactable context and there's no existing state\n useEffect(() => {\n if (!shouldUpdateInteractableInitial) {\n return;\n }\n setInteractableState(componentId, keyName, initialValue!);\n }, [\n shouldUpdateInteractableInitial,\n componentId,\n keyName,\n initialValue,\n setInteractableState,\n ]);\n\n const shouldSyncFromMessage =\n !!message && messageState !== undefined && messageState !== null;\n\n // Mirror the thread message's componentState value to the local state and interactable state\n useEffect(() => {\n if (!shouldSyncFromMessage) {\n return;\n }\n setInitializedFromThreadMessage(true);\n const stateValue = messageState as S;\n setLocalState(stateValue);\n if (componentId) {\n setInteractableState(componentId, keyName, stateValue);\n }\n }, [\n shouldSyncFromMessage,\n messageState,\n keyName,\n setInteractableState,\n componentId,\n ]);\n\n // Sync from interactable provider to local state when state changes externally (e.g., from Tambo tool call)\n useEffect(() => {\n if (!componentId) return;\n // only update if different\n setLocalState((prev) =>\n deepEqual(prev, interactableState) ? prev : (interactableState as S),\n );\n }, [componentId, interactableState]);\n\n // For editable fields that are set from a prop to allow streaming updates, don't overwrite a fetched state value set from the thread message with prop value on initial load.\n useEffect(() => {\n if (setFromProp !== undefined && !initializedFromThreadMessage) {\n setLocalState(setFromProp as S);\n }\n }, [setFromProp, initializedFromThreadMessage]);\n\n // Ensure pending changes are flushed on unmount (only for generated components)\n useEffect(() => {\n // Only flush remote updates for generated components, not interactable components\n if (componentId) {\n return;\n }\n return () => {\n async function flushUpdates() {\n try {\n await updateRemoteThreadMessage.flush();\n } catch (error) {\n console.error(\n \"Failed to flush pending thread message updates:\",\n error,\n );\n }\n }\n // Fire-and-forget cleanup (errors handled inside)\n void flushUpdates();\n };\n }, [updateRemoteThreadMessage, componentId]);\n\n return [localState as S, setValue];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-component-state.test.d.ts","sourceRoot":"","sources":["../../src/hooks/use-component-state.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const react_1 = require("@testing-library/react");
|
|
7
|
-
const react_2 = __importDefault(require("react"));
|
|
8
|
-
const tambo_client_provider_1 = require("../providers/tambo-client-provider");
|
|
9
|
-
const tambo_interactable_provider_1 = require("../providers/tambo-interactable-provider");
|
|
10
|
-
const tambo_thread_provider_1 = require("../providers/tambo-thread-provider");
|
|
11
|
-
const use_component_state_1 = require("./use-component-state");
|
|
12
|
-
const use_current_message_1 = require("./use-current-message");
|
|
13
|
-
// Mock the required providers
|
|
14
|
-
jest.mock("../providers/tambo-client-provider", () => ({
|
|
15
|
-
useTamboClient: jest.fn(),
|
|
16
|
-
}));
|
|
17
|
-
jest.mock("../providers/tambo-thread-provider", () => ({
|
|
18
|
-
useTamboThread: jest.fn(),
|
|
19
|
-
}));
|
|
20
|
-
jest.mock("./use-current-message", () => ({
|
|
21
|
-
useTamboCurrentMessage: jest.fn(),
|
|
22
|
-
TamboMessageContext: react_2.default.createContext(null),
|
|
23
|
-
}));
|
|
24
|
-
jest.mock("../providers/tambo-interactable-provider", () => ({
|
|
25
|
-
useTamboInteractable: jest.fn(),
|
|
26
|
-
}));
|
|
27
|
-
// Create a mock debounced function with flush method
|
|
28
|
-
const createMockDebouncedFunction = (fn) => {
|
|
29
|
-
const debouncedFn = jest.fn((...args) => fn(...args));
|
|
30
|
-
debouncedFn.flush = jest.fn();
|
|
31
|
-
debouncedFn.cancel = jest.fn();
|
|
32
|
-
debouncedFn.isPending = jest.fn(() => false);
|
|
33
|
-
return debouncedFn;
|
|
34
|
-
};
|
|
35
|
-
// Mock use-debounce
|
|
36
|
-
jest.mock("use-debounce", () => ({
|
|
37
|
-
useDebouncedCallback: jest.fn(),
|
|
38
|
-
}));
|
|
39
|
-
// Import the mocked useDebouncedCallback
|
|
40
|
-
const use_debounce_1 = require("use-debounce");
|
|
41
|
-
describe("useTamboComponentState", () => {
|
|
42
|
-
// Helper function to create mock TamboThreadMessage
|
|
43
|
-
const createMockMessage = (overrides = {}) => ({
|
|
44
|
-
id: "test-message-id",
|
|
45
|
-
threadId: "test-thread-id",
|
|
46
|
-
componentState: {},
|
|
47
|
-
content: [{ type: "text", text: "Test message" }],
|
|
48
|
-
createdAt: new Date().toISOString(),
|
|
49
|
-
role: "assistant",
|
|
50
|
-
...overrides,
|
|
51
|
-
});
|
|
52
|
-
const mockUpdateThreadMessage = jest.fn();
|
|
53
|
-
const mockUpdateComponentState = jest.fn();
|
|
54
|
-
const mockSetInteractableState = jest.fn();
|
|
55
|
-
const mockGetInteractableComponentState = jest.fn();
|
|
56
|
-
// Track context values for mocking
|
|
57
|
-
let mockMessage = null;
|
|
58
|
-
beforeEach(() => {
|
|
59
|
-
jest.clearAllMocks();
|
|
60
|
-
// Reset context values
|
|
61
|
-
mockMessage = createMockMessage();
|
|
62
|
-
// Mock useContext to return appropriate values based on context
|
|
63
|
-
const originalUseContext = react_2.default.useContext;
|
|
64
|
-
jest.spyOn(react_2.default, "useContext").mockImplementation((context) => {
|
|
65
|
-
if (context === use_current_message_1.TamboMessageContext) {
|
|
66
|
-
// Return the message from useTamboCurrentMessage mock if available
|
|
67
|
-
try {
|
|
68
|
-
const currentMessageMock = jest.mocked(use_current_message_1.useTamboCurrentMessage);
|
|
69
|
-
const mockImpl = currentMessageMock.getMockImplementation();
|
|
70
|
-
if (mockImpl) {
|
|
71
|
-
return mockImpl();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// Fallback to mockMessage
|
|
76
|
-
}
|
|
77
|
-
return mockMessage;
|
|
78
|
-
}
|
|
79
|
-
// For other contexts, use the original implementation
|
|
80
|
-
return originalUseContext(context);
|
|
81
|
-
});
|
|
82
|
-
// Setup default mock for useDebouncedCallback
|
|
83
|
-
jest
|
|
84
|
-
.mocked(use_debounce_1.useDebouncedCallback)
|
|
85
|
-
.mockImplementation((fn) => createMockDebouncedFunction(fn));
|
|
86
|
-
// Setup default mocks
|
|
87
|
-
jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue({
|
|
88
|
-
beta: {
|
|
89
|
-
threads: {
|
|
90
|
-
messages: {
|
|
91
|
-
updateComponentState: mockUpdateComponentState,
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
97
|
-
updateThreadMessage: mockUpdateThreadMessage,
|
|
98
|
-
});
|
|
99
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage());
|
|
100
|
-
jest.mocked(tambo_interactable_provider_1.useTamboInteractable).mockReturnValue({
|
|
101
|
-
setInteractableState: mockSetInteractableState,
|
|
102
|
-
getInteractableComponentState: mockGetInteractableComponentState,
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
afterEach(() => {
|
|
106
|
-
jest.restoreAllMocks();
|
|
107
|
-
});
|
|
108
|
-
describe("Initial State Management", () => {
|
|
109
|
-
it("should initialize with initialValue when no componentState exists", () => {
|
|
110
|
-
const initialValue = "test-initial";
|
|
111
|
-
jest
|
|
112
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
113
|
-
.mockReturnValue(createMockMessage({ componentState: {} }));
|
|
114
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", initialValue));
|
|
115
|
-
expect(result.current[0]).toBe(initialValue);
|
|
116
|
-
});
|
|
117
|
-
it("should use existing componentState value over initialValue", () => {
|
|
118
|
-
const initialValue = "initial";
|
|
119
|
-
const existingValue = "existing";
|
|
120
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
121
|
-
componentState: { testKey: existingValue },
|
|
122
|
-
}));
|
|
123
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", initialValue));
|
|
124
|
-
expect(result.current[0]).toBe(existingValue);
|
|
125
|
-
});
|
|
126
|
-
it("should handle undefined initialValue gracefully", () => {
|
|
127
|
-
jest
|
|
128
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
129
|
-
.mockReturnValue(createMockMessage({ componentState: {} }));
|
|
130
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey"));
|
|
131
|
-
expect(result.current[0]).toBeUndefined();
|
|
132
|
-
});
|
|
133
|
-
it("should handle different data types correctly", () => {
|
|
134
|
-
const testCases = [
|
|
135
|
-
{ value: "string" },
|
|
136
|
-
{ value: 42 },
|
|
137
|
-
{ value: true },
|
|
138
|
-
{ value: { name: "test" } },
|
|
139
|
-
{ value: [1, 2, 3] },
|
|
140
|
-
];
|
|
141
|
-
testCases.forEach(({ value }) => {
|
|
142
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
143
|
-
componentState: { testKey: value },
|
|
144
|
-
}));
|
|
145
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", value));
|
|
146
|
-
expect(result.current[0]).toEqual(value);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe("State Updates", () => {
|
|
151
|
-
it("should update local state immediately when setValue is called", () => {
|
|
152
|
-
const initialValue = "initial";
|
|
153
|
-
jest
|
|
154
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
155
|
-
.mockReturnValue(createMockMessage({ componentState: { testKey: initialValue } }));
|
|
156
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", initialValue));
|
|
157
|
-
const newValue = "updated";
|
|
158
|
-
(0, react_1.act)(() => {
|
|
159
|
-
result.current[1](newValue);
|
|
160
|
-
});
|
|
161
|
-
expect(result.current[0]).toBe(newValue);
|
|
162
|
-
});
|
|
163
|
-
it("should trigger local thread message update when setValue is called", () => {
|
|
164
|
-
const message = createMockMessage({
|
|
165
|
-
componentState: { testKey: "initial" },
|
|
166
|
-
});
|
|
167
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
168
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
169
|
-
const newValue = "updated";
|
|
170
|
-
(0, react_1.act)(() => {
|
|
171
|
-
result.current[1](newValue);
|
|
172
|
-
});
|
|
173
|
-
expect(mockUpdateThreadMessage).toHaveBeenCalledWith(message.id, {
|
|
174
|
-
threadId: message.threadId,
|
|
175
|
-
componentState: {
|
|
176
|
-
testKey: newValue,
|
|
177
|
-
},
|
|
178
|
-
}, false);
|
|
179
|
-
});
|
|
180
|
-
it("should trigger debounced remote API call when setValue is called", () => {
|
|
181
|
-
const message = createMockMessage({
|
|
182
|
-
componentState: { testKey: "initial" },
|
|
183
|
-
});
|
|
184
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
185
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
186
|
-
const newValue = "updated";
|
|
187
|
-
(0, react_1.act)(() => {
|
|
188
|
-
result.current[1](newValue);
|
|
189
|
-
});
|
|
190
|
-
// The debounced function should be called
|
|
191
|
-
expect(mockUpdateComponentState).toHaveBeenCalledWith(message.id, {
|
|
192
|
-
id: message.threadId,
|
|
193
|
-
state: { testKey: newValue },
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
it("should work with complex objects and arrays", () => {
|
|
197
|
-
const initialValue = { name: "test", items: [1, 2, 3] };
|
|
198
|
-
jest
|
|
199
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
200
|
-
.mockReturnValue(createMockMessage({ componentState: { testKey: initialValue } }));
|
|
201
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", initialValue));
|
|
202
|
-
const newValue = { name: "updated", items: [4, 5, 6] };
|
|
203
|
-
(0, react_1.act)(() => {
|
|
204
|
-
result.current[1](newValue);
|
|
205
|
-
});
|
|
206
|
-
expect(result.current[0]).toEqual(newValue);
|
|
207
|
-
expect(mockUpdateThreadMessage).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
|
|
208
|
-
componentState: {
|
|
209
|
-
testKey: newValue,
|
|
210
|
-
},
|
|
211
|
-
}), false);
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
describe("Debouncing Behavior", () => {
|
|
215
|
-
it("should use default debounce time of 500ms", () => {
|
|
216
|
-
(0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
217
|
-
expect(use_debounce_1.useDebouncedCallback).toHaveBeenCalledWith(expect.any(Function), 500);
|
|
218
|
-
});
|
|
219
|
-
it("should use custom debounce time when provided", () => {
|
|
220
|
-
const customDebounceTime = 1000;
|
|
221
|
-
(0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial", undefined, customDebounceTime));
|
|
222
|
-
expect(use_debounce_1.useDebouncedCallback).toHaveBeenCalledWith(expect.any(Function), customDebounceTime);
|
|
223
|
-
});
|
|
224
|
-
it("should flush debounced callback on unmount", () => {
|
|
225
|
-
const mockFlush = jest.fn();
|
|
226
|
-
const mockDebouncedFn = createMockDebouncedFunction(jest.fn());
|
|
227
|
-
mockDebouncedFn.flush = mockFlush;
|
|
228
|
-
// Mock the debounced callback to return our specific mock
|
|
229
|
-
jest.mocked(use_debounce_1.useDebouncedCallback).mockReturnValue(mockDebouncedFn);
|
|
230
|
-
const { unmount } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
231
|
-
unmount();
|
|
232
|
-
expect(mockFlush).toHaveBeenCalled();
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
describe("Multi-Hook Scenarios", () => {
|
|
236
|
-
it("should handle multiple hooks with different keyNames independently", () => {
|
|
237
|
-
const message = createMockMessage({
|
|
238
|
-
componentState: {
|
|
239
|
-
key1: "value1",
|
|
240
|
-
key2: "value2",
|
|
241
|
-
},
|
|
242
|
-
});
|
|
243
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
244
|
-
const { result: result1 } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("key1", "default1"));
|
|
245
|
-
const { result: result2 } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("key2", "default2"));
|
|
246
|
-
expect(result1.current[0]).toBe("value1");
|
|
247
|
-
expect(result2.current[0]).toBe("value2");
|
|
248
|
-
// Update first hook
|
|
249
|
-
(0, react_1.act)(() => {
|
|
250
|
-
result1.current[1]("updated1");
|
|
251
|
-
});
|
|
252
|
-
expect(result1.current[0]).toBe("updated1");
|
|
253
|
-
expect(result2.current[0]).toBe("value2"); // Should remain unchanged
|
|
254
|
-
});
|
|
255
|
-
it("should preserve existing componentState when updating another key", () => {
|
|
256
|
-
const message = createMockMessage({
|
|
257
|
-
componentState: {
|
|
258
|
-
existingKey: "existing",
|
|
259
|
-
testKey: "initial",
|
|
260
|
-
},
|
|
261
|
-
});
|
|
262
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
263
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
264
|
-
(0, react_1.act)(() => {
|
|
265
|
-
result.current[1]("updated");
|
|
266
|
-
});
|
|
267
|
-
expect(mockUpdateThreadMessage).toHaveBeenCalledWith(message.id, {
|
|
268
|
-
threadId: message.threadId,
|
|
269
|
-
componentState: {
|
|
270
|
-
existingKey: "existing", // Should preserve existing keys
|
|
271
|
-
testKey: "updated",
|
|
272
|
-
},
|
|
273
|
-
}, false);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
describe("SetFromProp Feature", () => {
|
|
277
|
-
it("should set value from prop when hasSetFromMessage is false", () => {
|
|
278
|
-
jest
|
|
279
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
280
|
-
.mockReturnValue(createMockMessage({ componentState: {} }));
|
|
281
|
-
const propValue = "from-prop";
|
|
282
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial", propValue));
|
|
283
|
-
// Initially, hasSetFromMessage should be false, so prop value should be used
|
|
284
|
-
expect(result.current[0]).toBe(propValue);
|
|
285
|
-
});
|
|
286
|
-
it("should ignore setFromProp when initialized from message state", async () => {
|
|
287
|
-
const existingValue = "existing";
|
|
288
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
289
|
-
componentState: { testKey: existingValue },
|
|
290
|
-
}));
|
|
291
|
-
const propValue = "from-prop";
|
|
292
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial", propValue));
|
|
293
|
-
// Should use existing value from message, not prop value
|
|
294
|
-
await (0, react_1.act)(async () => {
|
|
295
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
296
|
-
});
|
|
297
|
-
expect(result.current[0]).toBe(existingValue);
|
|
298
|
-
});
|
|
299
|
-
it("should update state from setFromProp changes when no message state exists", () => {
|
|
300
|
-
jest
|
|
301
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
302
|
-
.mockReturnValue(createMockMessage({ componentState: {} }));
|
|
303
|
-
const { result, rerender } = (0, react_1.renderHook)(({ propValue }) => (0, use_component_state_1.useTamboComponentState)("testKey", "initial", propValue), { initialProps: { propValue: "prop1" } });
|
|
304
|
-
expect(result.current[0]).toBe("prop1");
|
|
305
|
-
// Change prop value
|
|
306
|
-
rerender({ propValue: "prop2" });
|
|
307
|
-
// Since hasSetFromMessage is still false (no message state),
|
|
308
|
-
// it should update to new prop value
|
|
309
|
-
expect(result.current[0]).toBe("prop2");
|
|
310
|
-
});
|
|
311
|
-
it("should handle undefined setFromProp gracefully", () => {
|
|
312
|
-
jest
|
|
313
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
314
|
-
.mockReturnValue(createMockMessage({ componentState: {} }));
|
|
315
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial", undefined));
|
|
316
|
-
expect(result.current[0]).toBe("initial");
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
describe("Interactable State Sync", () => {
|
|
320
|
-
it("should sync local state when interactable state changes externally", () => {
|
|
321
|
-
// Setup: Component is in interactable context with an ID
|
|
322
|
-
const message = createMockMessage({
|
|
323
|
-
componentState: {},
|
|
324
|
-
interactableMetadata: {
|
|
325
|
-
id: "test-interactable-id",
|
|
326
|
-
componentName: "TestComponent",
|
|
327
|
-
description: "Test",
|
|
328
|
-
},
|
|
329
|
-
});
|
|
330
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
331
|
-
// Start with initial state
|
|
332
|
-
mockGetInteractableComponentState.mockReturnValue({ testKey: "initial" });
|
|
333
|
-
const { result, rerender } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
334
|
-
expect(result.current[0]).toBe("initial");
|
|
335
|
-
// Simulate external state update (e.g., from Tambo tool call)
|
|
336
|
-
mockGetInteractableComponentState.mockReturnValue({
|
|
337
|
-
testKey: "updated-by-tambo",
|
|
338
|
-
});
|
|
339
|
-
// Trigger rerender to pick up new interactable state
|
|
340
|
-
rerender();
|
|
341
|
-
// Local state should sync with the external update
|
|
342
|
-
expect(result.current[0]).toBe("updated-by-tambo");
|
|
343
|
-
});
|
|
344
|
-
it("should not sync when not in interactable context", () => {
|
|
345
|
-
// Setup: Component is NOT in interactable context (no interactableMetadata.id)
|
|
346
|
-
const message = createMockMessage({
|
|
347
|
-
componentState: { testKey: "initial" },
|
|
348
|
-
});
|
|
349
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
350
|
-
mockGetInteractableComponentState.mockReturnValue({ testKey: "ignored" });
|
|
351
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
352
|
-
// Should use message state, not interactable state
|
|
353
|
-
expect(result.current[0]).toBe("initial");
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
describe("Message State Sync", () => {
|
|
357
|
-
it("should sync with message.componentState changes", () => {
|
|
358
|
-
const { result, rerender } = (0, react_1.renderHook)(({ message }) => {
|
|
359
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
360
|
-
return (0, use_component_state_1.useTamboComponentState)("testKey", "initial");
|
|
361
|
-
}, {
|
|
362
|
-
initialProps: {
|
|
363
|
-
message: createMockMessage({
|
|
364
|
-
componentState: { testKey: "value1" },
|
|
365
|
-
}),
|
|
366
|
-
},
|
|
367
|
-
});
|
|
368
|
-
// Change the message
|
|
369
|
-
const newMessage = createMockMessage({
|
|
370
|
-
componentState: { testKey: "value2" },
|
|
371
|
-
});
|
|
372
|
-
rerender({ message: newMessage });
|
|
373
|
-
// The hook should sync with the new message state
|
|
374
|
-
expect(result.current[0]).toBe("value2");
|
|
375
|
-
expect(mockUpdateThreadMessage).not.toHaveBeenCalled();
|
|
376
|
-
});
|
|
377
|
-
it("should handle message without componentState gracefully", () => {
|
|
378
|
-
jest
|
|
379
|
-
.mocked(use_current_message_1.useTamboCurrentMessage)
|
|
380
|
-
.mockReturnValue(createMockMessage({ componentState: undefined }));
|
|
381
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_component_state_1.useTamboComponentState)("testKey", "initial"));
|
|
382
|
-
expect(result.current[0]).toBe("initial");
|
|
383
|
-
});
|
|
384
|
-
it("should preserve state when message updates but componentState[keyName] unchanged", () => {
|
|
385
|
-
const message1 = createMockMessage({
|
|
386
|
-
id: "message1",
|
|
387
|
-
componentState: { testKey: "unchanged" },
|
|
388
|
-
});
|
|
389
|
-
const message2 = createMockMessage({
|
|
390
|
-
id: "message2",
|
|
391
|
-
componentState: { testKey: "unchanged" },
|
|
392
|
-
});
|
|
393
|
-
const { result, rerender } = (0, react_1.renderHook)(({ message }) => {
|
|
394
|
-
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(message);
|
|
395
|
-
return (0, use_component_state_1.useTamboComponentState)("testKey", "initial");
|
|
396
|
-
}, { initialProps: { message: message1 } });
|
|
397
|
-
// Clear previous calls
|
|
398
|
-
mockUpdateThreadMessage.mockClear();
|
|
399
|
-
// Change message but keep same componentState value
|
|
400
|
-
rerender({ message: message2 });
|
|
401
|
-
// Should preserve the "unchanged" value
|
|
402
|
-
expect(result.current[0]).toBe("unchanged");
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
});
|
|
406
|
-
//# sourceMappingURL=use-component-state.test.js.map
|