@novu/react 3.18.2 → 3.19.1-rc.56a8a168f8
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/cjs/components/telegram-connect-button/DefaultTelegramConnectButton.cjs +3 -0
- package/dist/cjs/components/telegram-connect-button/DefaultTelegramConnectButton.cjs.map +1 -1
- package/dist/cjs/components/telegram-connect-button/DefaultTelegramConnectButton.d.cts +1 -1
- package/dist/cjs/hooks/index.cjs +2 -0
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/index.d.cts +1 -0
- package/dist/cjs/hooks/useWebChat.cjs +326 -0
- package/dist/cjs/hooks/useWebChat.cjs.map +1 -0
- package/dist/cjs/hooks/useWebChat.d.cts +117 -0
- package/dist/cjs/index.cjs +4 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -0
- package/dist/cjs/server/index.cjs +27 -2
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.d.cts +3 -1
- package/dist/esm/components/telegram-connect-button/DefaultTelegramConnectButton.d.ts +1 -1
- package/dist/esm/components/telegram-connect-button/DefaultTelegramConnectButton.js +3 -0
- package/dist/esm/components/telegram-connect-button/DefaultTelegramConnectButton.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/useWebChat.d.ts +117 -0
- package/dist/esm/hooks/useWebChat.js +294 -0
- package/dist/esm/hooks/useWebChat.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/index.d.ts +3 -1
- package/dist/esm/server/index.js +25 -1
- package/dist/esm/server/index.js.map +1 -1
- package/package.json +4 -3
|
@@ -32,6 +32,7 @@ var DefaultTelegramConnectButton = (props) => {
|
|
|
32
32
|
integrationIdentifier,
|
|
33
33
|
subscriberId,
|
|
34
34
|
context,
|
|
35
|
+
contextHash,
|
|
35
36
|
onConnectSuccess,
|
|
36
37
|
onConnectError,
|
|
37
38
|
onDisconnectSuccess,
|
|
@@ -48,6 +49,7 @@ var DefaultTelegramConnectButton = (props) => {
|
|
|
48
49
|
integrationIdentifier,
|
|
49
50
|
subscriberId,
|
|
50
51
|
context,
|
|
52
|
+
contextHash,
|
|
51
53
|
onConnectSuccess,
|
|
52
54
|
onConnectError,
|
|
53
55
|
onDisconnectSuccess,
|
|
@@ -63,6 +65,7 @@ var DefaultTelegramConnectButton = (props) => {
|
|
|
63
65
|
integrationIdentifier,
|
|
64
66
|
subscriberId,
|
|
65
67
|
context,
|
|
68
|
+
contextHash,
|
|
66
69
|
onConnectSuccess,
|
|
67
70
|
onConnectError,
|
|
68
71
|
onDisconnectSuccess,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/telegram-connect-button/DefaultTelegramConnectButton.tsx"],"sourcesContent":["import { TelegramConnectButtonProps } from '@novu/js/ui';\nimport { useCallback } from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { Mounter } from '../Mounter';\n\nexport type DefaultTelegramConnectButtonProps = Pick<\n TelegramConnectButtonProps,\n | 'integrationIdentifier'\n | 'subscriberId'\n | 'context'\n | 'onConnectSuccess'\n | 'onConnectError'\n | 'onDisconnectSuccess'\n | 'onDisconnectError'\n | 'connectLabel'\n | 'connectedLabel'\n>;\n\nexport const DefaultTelegramConnectButton = (props: DefaultTelegramConnectButtonProps) => {\n const {\n integrationIdentifier,\n subscriberId,\n context,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n } = props;\n const { novuUI } = useNovuUI();\n\n const mount = useCallback(\n (element: HTMLElement) => {\n return novuUI.mountComponent({\n name: 'TelegramConnectButton',\n props: {\n integrationIdentifier,\n subscriberId,\n context,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n },\n element,\n });\n },\n [\n novuUI,\n integrationIdentifier,\n subscriberId,\n context,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n ]\n );\n\n return <Mounter mount={mount} />;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA4B;AAC5B,2BAA0B;AAC1B,qBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/telegram-connect-button/DefaultTelegramConnectButton.tsx"],"sourcesContent":["import { TelegramConnectButtonProps } from '@novu/js/ui';\nimport { useCallback } from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { Mounter } from '../Mounter';\n\nexport type DefaultTelegramConnectButtonProps = Pick<\n TelegramConnectButtonProps,\n | 'integrationIdentifier'\n | 'subscriberId'\n | 'context'\n | 'contextHash'\n | 'onConnectSuccess'\n | 'onConnectError'\n | 'onDisconnectSuccess'\n | 'onDisconnectError'\n | 'connectLabel'\n | 'connectedLabel'\n>;\n\nexport const DefaultTelegramConnectButton = (props: DefaultTelegramConnectButtonProps) => {\n const {\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n } = props;\n const { novuUI } = useNovuUI();\n\n const mount = useCallback(\n (element: HTMLElement) => {\n return novuUI.mountComponent({\n name: 'TelegramConnectButton',\n props: {\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n },\n element,\n });\n },\n [\n novuUI,\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n ]\n );\n\n return <Mounter mount={mount} />;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA4B;AAC5B,2BAA0B;AAC1B,qBAAwB;AAiEf;AAjDF,IAAM,+BAA+B,CAAC,UAA6C;AACxF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,OAAO,QAAI,gCAAU;AAE7B,QAAM,YAAQ;AAAA,IACZ,CAAC,YAAyB;AACxB,aAAO,OAAO,eAAe;AAAA,QAC3B,MAAM;AAAA,QACN,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,4CAAC,0BAAQ,OAAc;AAChC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { TelegramConnectButtonProps } from '@novu/js/ui';
|
|
3
3
|
|
|
4
|
-
type DefaultTelegramConnectButtonProps = Pick<TelegramConnectButtonProps, 'integrationIdentifier' | 'subscriberId' | 'context' | 'onConnectSuccess' | 'onConnectError' | 'onDisconnectSuccess' | 'onDisconnectError' | 'connectLabel' | 'connectedLabel'>;
|
|
4
|
+
type DefaultTelegramConnectButtonProps = Pick<TelegramConnectButtonProps, 'integrationIdentifier' | 'subscriberId' | 'context' | 'contextHash' | 'onConnectSuccess' | 'onConnectError' | 'onDisconnectSuccess' | 'onDisconnectError' | 'connectLabel' | 'connectedLabel'>;
|
|
5
5
|
declare const DefaultTelegramConnectButton: (props: DefaultTelegramConnectButtonProps) => react_jsx_runtime.JSX.Element;
|
|
6
6
|
|
|
7
7
|
export { DefaultTelegramConnectButton, type DefaultTelegramConnectButtonProps };
|
package/dist/cjs/hooks/index.cjs
CHANGED
|
@@ -30,6 +30,7 @@ __export(hooks_exports, {
|
|
|
30
30
|
module.exports = __toCommonJS(hooks_exports);
|
|
31
31
|
var import_js = require("@novu/js");
|
|
32
32
|
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
33
|
+
__reExport(hooks_exports, require("./useWebChat.cjs"), module.exports);
|
|
33
34
|
__reExport(hooks_exports, require("./useChannelConnection.cjs"), module.exports);
|
|
34
35
|
__reExport(hooks_exports, require("./useChannelConnections.cjs"), module.exports);
|
|
35
36
|
__reExport(hooks_exports, require("./useChannelEndpoint.cjs"), module.exports);
|
|
@@ -54,6 +55,7 @@ __reExport(hooks_exports, require("./useUpdateSubscription.cjs"), module.exports
|
|
|
54
55
|
SeverityLevelEnum,
|
|
55
56
|
WorkflowCriticalityEnum,
|
|
56
57
|
useNovu,
|
|
58
|
+
...require("./useWebChat.cjs"),
|
|
57
59
|
...require("./useChannelConnection.cjs"),
|
|
58
60
|
...require("./useChannelConnections.cjs"),
|
|
59
61
|
...require("./useChannelEndpoint.cjs"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\nexport { NovuProvider, useNovu } from './NovuProvider';\nexport * from './useChannelConnection';\nexport * from './useChannelConnections';\nexport * from './useChannelEndpoint';\nexport * from './useChannelEndpoints';\nexport * from './useCounts';\nexport * from './useCreateChannelEndpoint';\nexport * from './useCreateSubscription';\nexport * from './useDeleteChannelConnection';\nexport * from './useDeleteChannelEndpoint';\nexport * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useRemoveSubscription';\nexport * from './useSchedule';\nexport * from './useSubscription';\nexport * from './useSubscriptions';\nexport * from './useTelegramSubscriberLink';\nexport * from './useUpdateSubscription';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAC5E,0BAAsC;AACtC,0BAAc,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\nexport { NovuProvider, useNovu } from './NovuProvider';\nexport * from './useWebChat';\nexport * from './useChannelConnection';\nexport * from './useChannelConnections';\nexport * from './useChannelEndpoint';\nexport * from './useChannelEndpoints';\nexport * from './useCounts';\nexport * from './useCreateChannelEndpoint';\nexport * from './useCreateSubscription';\nexport * from './useDeleteChannelConnection';\nexport * from './useDeleteChannelEndpoint';\nexport * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useRemoveSubscription';\nexport * from './useSchedule';\nexport * from './useSubscription';\nexport * from './useSubscriptions';\nexport * from './useTelegramSubscriberLink';\nexport * from './useUpdateSubscription';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAC5E,0BAAsC;AACtC,0BAAc,6BAHd;AAIA,0BAAc,uCAJd;AAKA,0BAAc,wCALd;AAMA,0BAAc,qCANd;AAOA,0BAAc,sCAPd;AAQA,0BAAc,4BARd;AASA,0BAAc,2CATd;AAUA,0BAAc,wCAVd;AAWA,0BAAc,6CAXd;AAYA,0BAAc,2CAZd;AAaA,0BAAc,mCAbd;AAcA,0BAAc,iCAdd;AAeA,0BAAc,wCAfd;AAgBA,0BAAc,8BAhBd;AAiBA,0BAAc,kCAjBd;AAkBA,0BAAc,mCAlBd;AAmBA,0BAAc,4CAnBd;AAoBA,0BAAc,wCApBd;","names":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from '@novu/js';
|
|
2
2
|
export { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';
|
|
3
3
|
export { NovuProvider, useNovu } from './NovuProvider.cjs';
|
|
4
|
+
export { UseWebChatProps, UseWebChatResult, useWebChat } from './useWebChat.cjs';
|
|
4
5
|
export { UseChannelConnectionProps, UseChannelConnectionResult, useChannelConnection } from './useChannelConnection.cjs';
|
|
5
6
|
export { UseChannelConnectionsProps, UseChannelConnectionsResult, useChannelConnections } from './useChannelConnections.cjs';
|
|
6
7
|
export { UseChannelEndpointProps, UseChannelEndpointResult, useChannelEndpoint } from './useChannelEndpoint.cjs';
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/useWebChat.ts
|
|
21
|
+
var useWebChat_exports = {};
|
|
22
|
+
__export(useWebChat_exports, {
|
|
23
|
+
useWebChat: () => useWebChat
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(useWebChat_exports);
|
|
26
|
+
var import_js = require("@novu/js");
|
|
27
|
+
var import_react = require("react");
|
|
28
|
+
var import_useDataRef = require("./internal/useDataRef.cjs");
|
|
29
|
+
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
30
|
+
var EMPTY_SERVER_SNAPSHOT = {
|
|
31
|
+
key: "ssr",
|
|
32
|
+
status: "loading",
|
|
33
|
+
run: { isRunning: false },
|
|
34
|
+
conversationStatus: "active",
|
|
35
|
+
pagination: { hasMore: false, status: "idle" },
|
|
36
|
+
messages: [],
|
|
37
|
+
pendingActions: [],
|
|
38
|
+
isRecovering: false
|
|
39
|
+
};
|
|
40
|
+
function handlePublicationCallbacks(args) {
|
|
41
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
|
|
42
|
+
const {
|
|
43
|
+
snapshot,
|
|
44
|
+
meta,
|
|
45
|
+
conversationIdProp,
|
|
46
|
+
propsRef,
|
|
47
|
+
loadNotifiedRef,
|
|
48
|
+
notifiedCatchUpErrorRef,
|
|
49
|
+
lastReportedErrorKeyRef
|
|
50
|
+
} = args;
|
|
51
|
+
if (((meta == null ? void 0 : meta.historyLoaded) || ((_a = meta == null ? void 0 : meta.change) == null ? void 0 : _a.kind) === "history") && !loadNotifiedRef.current && conversationIdProp) {
|
|
52
|
+
if (snapshot.conversationId) {
|
|
53
|
+
loadNotifiedRef.current = true;
|
|
54
|
+
(_c = (_b = propsRef.current).onSuccess) == null ? void 0 : _c.call(_b, {
|
|
55
|
+
conversationId: snapshot.conversationId,
|
|
56
|
+
messages: [...snapshot.messages],
|
|
57
|
+
hasMore: snapshot.pagination.hasMore
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (snapshot.catchUpError && snapshot.catchUpError !== notifiedCatchUpErrorRef.current) {
|
|
62
|
+
notifiedCatchUpErrorRef.current = snapshot.catchUpError;
|
|
63
|
+
(_e = (_d = propsRef.current).onError) == null ? void 0 : _e.call(_d, snapshot.catchUpError);
|
|
64
|
+
} else if (!snapshot.catchUpError) {
|
|
65
|
+
notifiedCatchUpErrorRef.current = void 0;
|
|
66
|
+
}
|
|
67
|
+
if (snapshot.error) {
|
|
68
|
+
const originalMessage = "originalError" in snapshot.error ? ((_f = snapshot.error.originalError) == null ? void 0 : _f.message) ?? "" : "";
|
|
69
|
+
const errorKey = `${snapshot.error.message}:${originalMessage}`;
|
|
70
|
+
if (lastReportedErrorKeyRef.current !== errorKey) {
|
|
71
|
+
lastReportedErrorKeyRef.current = errorKey;
|
|
72
|
+
(_h = (_g = propsRef.current).onError) == null ? void 0 : _h.call(_g, snapshot.error);
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
lastReportedErrorKeyRef.current = void 0;
|
|
76
|
+
}
|
|
77
|
+
const change = meta == null ? void 0 : meta.change;
|
|
78
|
+
if ((change == null ? void 0 : change.kind) === "live") {
|
|
79
|
+
(_j = (_i = propsRef.current).onEvent) == null ? void 0 : _j.call(_i, change.envelope);
|
|
80
|
+
}
|
|
81
|
+
if (change && change.kind !== "history") {
|
|
82
|
+
for (const message of change.addedMessages) {
|
|
83
|
+
(_l = (_k = propsRef.current).onMessage) == null ? void 0 : _l.call(_k, message);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (change) {
|
|
87
|
+
for (const action of change.newActions) {
|
|
88
|
+
(_n = (_m = propsRef.current).onActionRequested) == null ? void 0 : _n.call(_m, action);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function getCreateFlowKey(agentId, agentHash) {
|
|
93
|
+
return `${agentId}\0${agentHash ?? ""}`;
|
|
94
|
+
}
|
|
95
|
+
function resolveOwnedRuntime(args) {
|
|
96
|
+
const key = getCreateFlowKey(args.agentId, args.agentHash);
|
|
97
|
+
const current = args.ownedRuntimeRef.current;
|
|
98
|
+
if ((current == null ? void 0 : current.novu) === args.novu && current.key === key) {
|
|
99
|
+
return current.runtime;
|
|
100
|
+
}
|
|
101
|
+
current == null ? void 0 : current.runtime.dispose();
|
|
102
|
+
const runtime = args.novu.webChat.conversation({ agentId: args.agentId, agentHash: args.agentHash });
|
|
103
|
+
args.ownedRuntimeRef.current = { key, novu: args.novu, runtime };
|
|
104
|
+
return runtime;
|
|
105
|
+
}
|
|
106
|
+
function toNovuError(error) {
|
|
107
|
+
if (error instanceof import_js.NovuError) {
|
|
108
|
+
return error;
|
|
109
|
+
}
|
|
110
|
+
if (error instanceof Error) {
|
|
111
|
+
return new import_js.NovuError("Failed to load Web Chat", error);
|
|
112
|
+
}
|
|
113
|
+
return new import_js.NovuError("Failed to load Web Chat", new Error(String(error)));
|
|
114
|
+
}
|
|
115
|
+
var useWebChat = (props) => {
|
|
116
|
+
var _a;
|
|
117
|
+
const novu = (0, import_NovuProvider.useNovu)();
|
|
118
|
+
const propsRef = (0, import_useDataRef.useDataRef)(props);
|
|
119
|
+
const [loadState, setLoadState] = (0, import_react.useState)(() => ({
|
|
120
|
+
novu,
|
|
121
|
+
status: "loading"
|
|
122
|
+
}));
|
|
123
|
+
(0, import_react.useEffect)(() => {
|
|
124
|
+
let cancelled = false;
|
|
125
|
+
if (!novu.isWebChatLoaded) {
|
|
126
|
+
setLoadState({ novu, status: "loading" });
|
|
127
|
+
}
|
|
128
|
+
void novu.loadWebChat().then(() => {
|
|
129
|
+
if (!cancelled) {
|
|
130
|
+
setLoadState({ novu, status: "ready" });
|
|
131
|
+
}
|
|
132
|
+
}).catch((error) => {
|
|
133
|
+
var _a2, _b;
|
|
134
|
+
if (cancelled) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const novuError = toNovuError(error);
|
|
138
|
+
(_b = (_a2 = propsRef.current).onError) == null ? void 0 : _b.call(_a2, novuError);
|
|
139
|
+
setLoadState({ novu, status: "error", error: novuError });
|
|
140
|
+
});
|
|
141
|
+
return () => {
|
|
142
|
+
cancelled = true;
|
|
143
|
+
};
|
|
144
|
+
}, [novu, propsRef]);
|
|
145
|
+
const webChatReady = loadState.novu === novu && loadState.status === "ready";
|
|
146
|
+
const webChatLoadError = loadState.novu === novu && loadState.status === "error" ? loadState.error : void 0;
|
|
147
|
+
const isWebChatLoading = loadState.novu !== novu || loadState.status === "loading";
|
|
148
|
+
const sharedRuntime = "conversation" in props ? props.conversation : void 0;
|
|
149
|
+
const agentId = (sharedRuntime == null ? void 0 : sharedRuntime.agentId) ?? props.agentId;
|
|
150
|
+
const conversationIdProp = sharedRuntime ? void 0 : props.conversationId;
|
|
151
|
+
const agentHash = sharedRuntime ? void 0 : props.agentHash;
|
|
152
|
+
const ownedRuntimeRef = (0, import_react.useRef)(null);
|
|
153
|
+
(0, import_react.useEffect)(() => {
|
|
154
|
+
const current = ownedRuntimeRef.current;
|
|
155
|
+
if (current && current.novu !== novu) {
|
|
156
|
+
current.runtime.dispose();
|
|
157
|
+
ownedRuntimeRef.current = null;
|
|
158
|
+
}
|
|
159
|
+
}, [novu]);
|
|
160
|
+
const cachedRuntime = (0, import_react.useMemo)(() => {
|
|
161
|
+
if (!webChatReady) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
if (sharedRuntime) {
|
|
165
|
+
return sharedRuntime;
|
|
166
|
+
}
|
|
167
|
+
if (!conversationIdProp) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return novu.webChat.conversation({
|
|
171
|
+
agentId,
|
|
172
|
+
conversationId: conversationIdProp,
|
|
173
|
+
agentHash
|
|
174
|
+
});
|
|
175
|
+
}, [webChatReady, sharedRuntime, novu, agentId, conversationIdProp, agentHash]);
|
|
176
|
+
if (sharedRuntime || conversationIdProp) {
|
|
177
|
+
(_a = ownedRuntimeRef.current) == null ? void 0 : _a.runtime.dispose();
|
|
178
|
+
ownedRuntimeRef.current = null;
|
|
179
|
+
}
|
|
180
|
+
const ownedRuntime = !webChatReady || sharedRuntime || conversationIdProp ? null : resolveOwnedRuntime({ novu, agentId, agentHash, ownedRuntimeRef });
|
|
181
|
+
const runtime = sharedRuntime ?? cachedRuntime ?? ownedRuntime;
|
|
182
|
+
(0, import_react.useEffect)(() => {
|
|
183
|
+
return () => {
|
|
184
|
+
var _a2;
|
|
185
|
+
(_a2 = ownedRuntimeRef.current) == null ? void 0 : _a2.runtime.dispose();
|
|
186
|
+
ownedRuntimeRef.current = null;
|
|
187
|
+
};
|
|
188
|
+
}, []);
|
|
189
|
+
const loadNotifiedRef = (0, import_react.useRef)(false);
|
|
190
|
+
const replayedActionsRef = (0, import_react.useRef)(false);
|
|
191
|
+
const notifiedCatchUpErrorRef = (0, import_react.useRef)();
|
|
192
|
+
const lastReportedErrorKeyRef = (0, import_react.useRef)();
|
|
193
|
+
(0, import_react.useEffect)(() => {
|
|
194
|
+
loadNotifiedRef.current = false;
|
|
195
|
+
replayedActionsRef.current = false;
|
|
196
|
+
notifiedCatchUpErrorRef.current = void 0;
|
|
197
|
+
lastReportedErrorKeyRef.current = void 0;
|
|
198
|
+
}, [runtime]);
|
|
199
|
+
const subscribe = (0, import_react.useCallback)(
|
|
200
|
+
(onStoreChange) => {
|
|
201
|
+
var _a2, _b;
|
|
202
|
+
if (!runtime) {
|
|
203
|
+
return () => {
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (!replayedActionsRef.current) {
|
|
207
|
+
replayedActionsRef.current = true;
|
|
208
|
+
for (const action of runtime.getSnapshot().pendingActions) {
|
|
209
|
+
(_b = (_a2 = propsRef.current).onActionRequested) == null ? void 0 : _b.call(_a2, action);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return runtime.subscribe((snapshot2, meta) => {
|
|
213
|
+
onStoreChange();
|
|
214
|
+
handlePublicationCallbacks({
|
|
215
|
+
snapshot: snapshot2,
|
|
216
|
+
meta,
|
|
217
|
+
conversationIdProp,
|
|
218
|
+
propsRef,
|
|
219
|
+
loadNotifiedRef,
|
|
220
|
+
notifiedCatchUpErrorRef,
|
|
221
|
+
lastReportedErrorKeyRef
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
[runtime, conversationIdProp, propsRef]
|
|
226
|
+
);
|
|
227
|
+
const getSnapshot = (0, import_react.useCallback)(() => {
|
|
228
|
+
return (runtime == null ? void 0 : runtime.getSnapshot()) ?? EMPTY_SERVER_SNAPSHOT;
|
|
229
|
+
}, [runtime]);
|
|
230
|
+
const getServerSnapshot = (0, import_react.useCallback)(() => {
|
|
231
|
+
return (runtime == null ? void 0 : runtime.getServerSnapshot()) ?? EMPTY_SERVER_SNAPSHOT;
|
|
232
|
+
}, [runtime]);
|
|
233
|
+
const snapshot = (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getServerSnapshot);
|
|
234
|
+
const callRuntime = (0, import_react.useCallback)(
|
|
235
|
+
async (action) => {
|
|
236
|
+
var _a2, _b, _c, _d;
|
|
237
|
+
if (!runtime) {
|
|
238
|
+
const error = webChatLoadError ?? new import_js.NovuError(
|
|
239
|
+
isWebChatLoading ? "Web Chat is still loading" : "Web Chat runtime is unavailable",
|
|
240
|
+
new Error("Web Chat runtime is not ready")
|
|
241
|
+
);
|
|
242
|
+
(_b = (_a2 = propsRef.current).onError) == null ? void 0 : _b.call(_a2, error);
|
|
243
|
+
return { error };
|
|
244
|
+
}
|
|
245
|
+
const response = await action(runtime);
|
|
246
|
+
if (response.error) {
|
|
247
|
+
(_d = (_c = propsRef.current).onError) == null ? void 0 : _d.call(_c, response.error);
|
|
248
|
+
}
|
|
249
|
+
return response;
|
|
250
|
+
},
|
|
251
|
+
[runtime, webChatLoadError, isWebChatLoading, propsRef]
|
|
252
|
+
);
|
|
253
|
+
const refetch = (0, import_react.useCallback)(async () => {
|
|
254
|
+
var _a2, _b;
|
|
255
|
+
if (!runtime) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const response = await runtime.load();
|
|
259
|
+
if (response.data) {
|
|
260
|
+
(_b = (_a2 = propsRef.current).onSuccess) == null ? void 0 : _b.call(_a2, {
|
|
261
|
+
conversationId: response.data.conversationId,
|
|
262
|
+
messages: [...response.data.messages],
|
|
263
|
+
hasMore: response.data.hasMore
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}, [runtime, propsRef]);
|
|
267
|
+
const fetchMore = (0, import_react.useCallback)(async () => {
|
|
268
|
+
const response = await callRuntime((target) => target.fetchMore());
|
|
269
|
+
return {
|
|
270
|
+
...response,
|
|
271
|
+
error: response.error,
|
|
272
|
+
data: response.data ? {
|
|
273
|
+
messages: [...response.data.messages],
|
|
274
|
+
hasMore: response.data.hasMore
|
|
275
|
+
} : void 0
|
|
276
|
+
};
|
|
277
|
+
}, [callRuntime]);
|
|
278
|
+
const paginationWithFetch = (0, import_react.useMemo)(
|
|
279
|
+
() => ({
|
|
280
|
+
status: snapshot.pagination.status,
|
|
281
|
+
hasMore: snapshot.pagination.hasMore,
|
|
282
|
+
fetchMore
|
|
283
|
+
}),
|
|
284
|
+
[snapshot.pagination.status, snapshot.pagination.hasMore, fetchMore]
|
|
285
|
+
);
|
|
286
|
+
const sendMessage = (0, import_react.useCallback)(
|
|
287
|
+
(input) => callRuntime((target) => target.sendMessage(input)),
|
|
288
|
+
[callRuntime]
|
|
289
|
+
);
|
|
290
|
+
const respondToAction = (0, import_react.useCallback)(
|
|
291
|
+
(args) => callRuntime((target) => target.respondToAction(args)),
|
|
292
|
+
[callRuntime]
|
|
293
|
+
);
|
|
294
|
+
const sendAction = (0, import_react.useCallback)(
|
|
295
|
+
(args) => callRuntime((target) => target.sendAction(args)),
|
|
296
|
+
[callRuntime]
|
|
297
|
+
);
|
|
298
|
+
const retryMessage = (0, import_react.useCallback)(
|
|
299
|
+
(messageId) => callRuntime((target) => target.retryMessage(messageId)),
|
|
300
|
+
[callRuntime]
|
|
301
|
+
);
|
|
302
|
+
return {
|
|
303
|
+
messages: [...snapshot.messages],
|
|
304
|
+
pendingActions: [...snapshot.pendingActions],
|
|
305
|
+
conversationId: snapshot.conversationId,
|
|
306
|
+
error: webChatLoadError ?? snapshot.error,
|
|
307
|
+
isLoading: !webChatLoadError && (isWebChatLoading || snapshot.status === "loading"),
|
|
308
|
+
isRunning: snapshot.run.isRunning,
|
|
309
|
+
typing: snapshot.run.typing,
|
|
310
|
+
conversationStatus: snapshot.conversationStatus,
|
|
311
|
+
run: snapshot.run,
|
|
312
|
+
pagination: paginationWithFetch,
|
|
313
|
+
isRecovering: snapshot.isRecovering,
|
|
314
|
+
catchUpError: snapshot.catchUpError,
|
|
315
|
+
refetch,
|
|
316
|
+
sendMessage,
|
|
317
|
+
respondToAction,
|
|
318
|
+
sendAction,
|
|
319
|
+
retryMessage
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
323
|
+
0 && (module.exports = {
|
|
324
|
+
useWebChat
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=useWebChat.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useWebChat.ts"],"sourcesContent":["import type {\n AgentConversationPublicationMeta,\n AgentConversationRunSnapshot,\n AgentConversationRuntime,\n AgentConversationSnapshot,\n AgentConversationStatus,\n AgentEventEnvelope,\n AgentHashFields,\n AgentMessage,\n AgentPendingAction,\n AgentToolApprovalDecision,\n LoadConversationResult,\n RespondToActionResult,\n SendActionResult,\n SendMessageInput,\n SendMessageResult,\n WebChatPagination,\n WebChatPlanLimitError,\n} from '@novu/js';\nimport { NovuError } from '@novu/js';\nimport { type MutableRefObject, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { useDataRef } from './internal/useDataRef';\nimport { useNovu } from './NovuProvider';\n\ntype UseWebChatCallbacks = {\n onSuccess?: (data: LoadConversationResult) => void;\n onError?: (error: NovuError | WebChatPlanLimitError) => void;\n /**\n * Fires once when a message id first appears. History pages do not fire.\n * The first event of a turn can create an empty assistant message before text arrives.\n * A send that never reaches the server does not fire. The message status becomes `failed` instead.\n */\n onMessage?: (message: AgentMessage) => void;\n /**\n * Fires once per pending action, including actions still pending on mount.\n * Paging backwards does not fire.\n */\n onActionRequested?: (action: AgentPendingAction) => void;\n /**\n * Live event envelopes for this conversation.\n * Duplicates that the client drops do not fire.\n * Envelopes that arrive before the conversation id exists do not fire.\n * The message list in this render does not include this envelope yet.\n */\n onEvent?: (envelope: AgentEventEnvelope) => void;\n};\n\n/** Arguments for {@link useWebChat}. Pass `agentId`, or pass `conversation`. Do not mix the two. */\nexport type UseWebChatProps = UseWebChatCallbacks &\n AgentHashFields &\n (\n | {\n agentId: string;\n /**\n * Resume this conversation. The hook loads history on mount.\n * Omit this prop to start a new chat. The first send creates a conversation.\n */\n conversationId?: string;\n conversation?: never;\n }\n | {\n /** Share an existing conversation runtime across multiple hook instances. */\n conversation: AgentConversationRuntime;\n agentId?: never;\n conversationId?: never;\n agentHash?: never;\n }\n );\n\n/** State and actions returned by {@link useWebChat}. */\nexport type UseWebChatResult = {\n /** Conversation timeline. */\n messages: AgentMessage[];\n /** Tool approvals and MCP connect items that are still pending. */\n pendingActions: AgentPendingAction[];\n /** Server conversation id after create or resume. */\n conversationId?: string;\n /** Last error from load, send, retry, or action. */\n error?: NovuError | WebChatPlanLimitError;\n /** True while Web Chat loads and, for an existing conversation, until the first history fetch completes. */\n isLoading: boolean;\n /** True while the agent turn is in progress. Same as `run.isRunning`. */\n isRunning: boolean;\n /** Typing indicator. Same as `run.typing`. Absent when the agent is not typing. */\n typing?: AgentConversationRunSnapshot['typing'];\n /** `'active'` or `'resolved'`. The agent sets `resolved` with `ctx.resolve()`. Not a loading flag. */\n conversationStatus: AgentConversationStatus;\n /** Current agent-run snapshot. */\n run: AgentConversationRunSnapshot;\n /** Older-history control. Not a top-level `hasMore` or `fetchMore`. */\n pagination: WebChatPagination & {\n fetchMore: () => Promise<{\n data?: { messages: AgentMessage[]; hasMore: boolean };\n error?: NovuError;\n }>;\n };\n /** True while reconnect recovery is in progress. */\n isRecovering: boolean;\n /** Set when reconnect recovery fails. Separate from send and fetch `error`. */\n catchUpError?: NovuError;\n /** Reload the newest history page. No-op when there is no conversation id. */\n refetch: () => Promise<void>;\n /** Send a user message. `input` is a string, or `{ text, metadata }`. Creates a conversation when `conversationId` is omitted. */\n sendMessage: (input: SendMessageInput) => Promise<{\n data?: SendMessageResult;\n error?: NovuError | WebChatPlanLimitError;\n }>;\n /** Resolve a pending `tool-approval`. Pass `action.id` from `pendingActions`. */\n respondToAction: (args: { actionId: string; decision: AgentToolApprovalDecision }) => Promise<{\n data?: RespondToActionResult;\n error?: NovuError | WebChatPlanLimitError;\n }>;\n /** Click a Card button. Do not use this for tool approval. */\n sendAction: (args: { actionId: string; sourceMessageId: string; value?: string }) => Promise<{\n data?: SendActionResult;\n error?: NovuError | WebChatPlanLimitError;\n }>;\n /** Resend a message whose `status` is `failed`. Reuses the original idempotency key. */\n retryMessage: (messageId: string) => Promise<{\n data?: SendMessageResult;\n error?: NovuError | WebChatPlanLimitError;\n }>;\n};\n\nconst EMPTY_SERVER_SNAPSHOT = {\n key: 'ssr',\n status: 'loading',\n run: { isRunning: false },\n conversationStatus: 'active',\n pagination: { hasMore: false, status: 'idle' },\n messages: [],\n pendingActions: [],\n isRecovering: false,\n} as AgentConversationSnapshot;\n\ntype RuntimeActionResult<T> = {\n data?: T;\n error?: NovuError | WebChatPlanLimitError;\n};\n\nfunction handlePublicationCallbacks(args: {\n snapshot: AgentConversationSnapshot;\n meta: AgentConversationPublicationMeta | undefined;\n conversationIdProp: string | undefined;\n propsRef: ReturnType<typeof useDataRef<UseWebChatProps>>;\n loadNotifiedRef: MutableRefObject<boolean>;\n notifiedCatchUpErrorRef: MutableRefObject<NovuError | undefined>;\n lastReportedErrorKeyRef: MutableRefObject<string | undefined>;\n}): void {\n const {\n snapshot,\n meta,\n conversationIdProp,\n propsRef,\n loadNotifiedRef,\n notifiedCatchUpErrorRef,\n lastReportedErrorKeyRef,\n } = args;\n\n if ((meta?.historyLoaded || meta?.change?.kind === 'history') && !loadNotifiedRef.current && conversationIdProp) {\n if (snapshot.conversationId) {\n loadNotifiedRef.current = true;\n propsRef.current.onSuccess?.({\n conversationId: snapshot.conversationId,\n messages: [...snapshot.messages],\n hasMore: snapshot.pagination.hasMore,\n });\n }\n }\n\n if (snapshot.catchUpError && snapshot.catchUpError !== notifiedCatchUpErrorRef.current) {\n notifiedCatchUpErrorRef.current = snapshot.catchUpError;\n propsRef.current.onError?.(snapshot.catchUpError);\n } else if (!snapshot.catchUpError) {\n notifiedCatchUpErrorRef.current = undefined;\n }\n\n if (snapshot.error) {\n const originalMessage = 'originalError' in snapshot.error ? (snapshot.error.originalError?.message ?? '') : '';\n const errorKey = `${snapshot.error.message}:${originalMessage}`;\n if (lastReportedErrorKeyRef.current !== errorKey) {\n lastReportedErrorKeyRef.current = errorKey;\n propsRef.current.onError?.(snapshot.error as NovuError | WebChatPlanLimitError);\n }\n } else {\n lastReportedErrorKeyRef.current = undefined;\n }\n\n const change = meta?.change;\n if (change?.kind === 'live') {\n propsRef.current.onEvent?.(change.envelope);\n }\n\n if (change && change.kind !== 'history') {\n for (const message of change.addedMessages) {\n propsRef.current.onMessage?.(message);\n }\n }\n\n if (change) {\n for (const action of change.newActions) {\n propsRef.current.onActionRequested?.(action);\n }\n }\n}\n\ntype OwnedRuntimeEntry = {\n key: string;\n novu: ReturnType<typeof useNovu>;\n runtime: AgentConversationRuntime;\n};\n\nfunction getCreateFlowKey(agentId: string, agentHash?: string): string {\n return `${agentId}\\0${agentHash ?? ''}`;\n}\n\nfunction resolveOwnedRuntime(args: {\n novu: ReturnType<typeof useNovu>;\n agentId: string;\n agentHash?: string;\n ownedRuntimeRef: MutableRefObject<OwnedRuntimeEntry | null>;\n}): AgentConversationRuntime | null {\n const key = getCreateFlowKey(args.agentId, args.agentHash);\n const current = args.ownedRuntimeRef.current;\n\n if (current?.novu === args.novu && current.key === key) {\n return current.runtime;\n }\n\n current?.runtime.dispose();\n\n const runtime = args.novu.webChat.conversation({ agentId: args.agentId, agentHash: args.agentHash });\n args.ownedRuntimeRef.current = { key, novu: args.novu, runtime };\n return runtime;\n}\n\ntype WebChatLoadState =\n | { novu: ReturnType<typeof useNovu>; status: 'loading' }\n | { novu: ReturnType<typeof useNovu>; status: 'ready' }\n | { novu: ReturnType<typeof useNovu>; status: 'error'; error: NovuError };\n\nfunction toNovuError(error: unknown): NovuError {\n if (error instanceof NovuError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new NovuError('Failed to load Web Chat', error);\n }\n\n return new NovuError('Failed to load Web Chat', new Error(String(error)));\n}\n\n/**\n * Headless Web Chat client. Use it inside `NovuProvider`.\n *\n * @example\n * ```tsx\n * const { messages, sendMessage, isRunning, isLoading, error } = useWebChat({\n * agentId: 'YOUR_AGENT_IDENTIFIER',\n * });\n * ```\n */\nexport const useWebChat = (props: UseWebChatProps): UseWebChatResult => {\n const novu = useNovu();\n const propsRef = useDataRef(props);\n const [loadState, setLoadState] = useState<WebChatLoadState>(() => ({\n novu,\n status: 'loading',\n }));\n\n useEffect(() => {\n let cancelled = false;\n\n if (!novu.isWebChatLoaded) {\n setLoadState({ novu, status: 'loading' });\n }\n\n void novu\n .loadWebChat()\n .then(() => {\n if (!cancelled) {\n setLoadState({ novu, status: 'ready' });\n }\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n\n const novuError = toNovuError(error);\n propsRef.current.onError?.(novuError);\n setLoadState({ novu, status: 'error', error: novuError });\n });\n\n return () => {\n cancelled = true;\n };\n }, [novu, propsRef]);\n\n const webChatReady = loadState.novu === novu && loadState.status === 'ready';\n const webChatLoadError = loadState.novu === novu && loadState.status === 'error' ? loadState.error : undefined;\n const isWebChatLoading = loadState.novu !== novu || loadState.status === 'loading';\n\n const sharedRuntime = 'conversation' in props ? props.conversation : undefined;\n const agentId = sharedRuntime?.agentId ?? props.agentId!;\n const conversationIdProp = sharedRuntime ? undefined : props.conversationId;\n const agentHash = sharedRuntime ? undefined : props.agentHash;\n\n const ownedRuntimeRef = useRef<OwnedRuntimeEntry | null>(null);\n\n useEffect(() => {\n const current = ownedRuntimeRef.current;\n if (current && current.novu !== novu) {\n current.runtime.dispose();\n ownedRuntimeRef.current = null;\n }\n }, [novu]);\n\n const cachedRuntime = useMemo(() => {\n if (!webChatReady) {\n return null;\n }\n\n if (sharedRuntime) {\n return sharedRuntime;\n }\n\n if (!conversationIdProp) {\n return null;\n }\n\n return novu.webChat.conversation({\n agentId,\n conversationId: conversationIdProp,\n agentHash,\n });\n }, [webChatReady, sharedRuntime, novu, agentId, conversationIdProp, agentHash]);\n\n if (sharedRuntime || conversationIdProp) {\n ownedRuntimeRef.current?.runtime.dispose();\n ownedRuntimeRef.current = null;\n }\n\n const ownedRuntime =\n !webChatReady || sharedRuntime || conversationIdProp\n ? null\n : resolveOwnedRuntime({ novu, agentId, agentHash, ownedRuntimeRef });\n\n const runtime = sharedRuntime ?? cachedRuntime ?? ownedRuntime;\n\n useEffect(() => {\n return () => {\n ownedRuntimeRef.current?.runtime.dispose();\n ownedRuntimeRef.current = null;\n };\n }, []);\n\n const loadNotifiedRef = useRef(false);\n const replayedActionsRef = useRef(false);\n const notifiedCatchUpErrorRef = useRef<NovuError | undefined>();\n const lastReportedErrorKeyRef = useRef<string>();\n\n useEffect(() => {\n loadNotifiedRef.current = false;\n replayedActionsRef.current = false;\n notifiedCatchUpErrorRef.current = undefined;\n lastReportedErrorKeyRef.current = undefined;\n }, [runtime]);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!runtime) {\n return () => {};\n }\n\n if (!replayedActionsRef.current) {\n replayedActionsRef.current = true;\n for (const action of runtime.getSnapshot().pendingActions) {\n propsRef.current.onActionRequested?.(action);\n }\n }\n\n return runtime.subscribe((snapshot, meta) => {\n onStoreChange();\n handlePublicationCallbacks({\n snapshot,\n meta,\n conversationIdProp,\n propsRef,\n loadNotifiedRef,\n notifiedCatchUpErrorRef,\n lastReportedErrorKeyRef,\n });\n });\n },\n [runtime, conversationIdProp, propsRef]\n );\n\n const getSnapshot = useCallback(() => {\n return runtime?.getSnapshot() ?? EMPTY_SERVER_SNAPSHOT;\n }, [runtime]);\n\n const getServerSnapshot = useCallback(() => {\n return runtime?.getServerSnapshot() ?? EMPTY_SERVER_SNAPSHOT;\n }, [runtime]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n const callRuntime = useCallback(\n async <T>(action: (target: AgentConversationRuntime) => Promise<RuntimeActionResult<T>>) => {\n if (!runtime) {\n const error =\n webChatLoadError ??\n new NovuError(\n isWebChatLoading ? 'Web Chat is still loading' : 'Web Chat runtime is unavailable',\n new Error('Web Chat runtime is not ready')\n );\n propsRef.current.onError?.(error);\n\n return { error };\n }\n\n const response = await action(runtime);\n if (response.error) {\n propsRef.current.onError?.(response.error);\n }\n\n return response;\n },\n [runtime, webChatLoadError, isWebChatLoading, propsRef]\n );\n\n const refetch = useCallback(async () => {\n if (!runtime) {\n return;\n }\n\n const response = await runtime.load();\n if (response.data) {\n propsRef.current.onSuccess?.({\n conversationId: response.data.conversationId,\n messages: [...response.data.messages],\n hasMore: response.data.hasMore,\n });\n }\n }, [runtime, propsRef]);\n\n const fetchMore = useCallback(async () => {\n const response = await callRuntime((target) => target.fetchMore());\n\n return {\n ...response,\n error: response.error as NovuError | undefined,\n data: response.data\n ? {\n messages: [...response.data.messages],\n hasMore: response.data.hasMore,\n }\n : undefined,\n };\n }, [callRuntime]);\n\n const paginationWithFetch = useMemo(\n () => ({\n status: snapshot.pagination.status,\n hasMore: snapshot.pagination.hasMore,\n fetchMore,\n }),\n [snapshot.pagination.status, snapshot.pagination.hasMore, fetchMore]\n );\n\n const sendMessage = useCallback(\n (input: SendMessageInput) => callRuntime((target) => target.sendMessage(input)),\n [callRuntime]\n );\n const respondToAction = useCallback(\n (args: { actionId: string; decision: AgentToolApprovalDecision }) =>\n callRuntime((target) => target.respondToAction(args)),\n [callRuntime]\n );\n const sendAction = useCallback(\n (args: { actionId: string; sourceMessageId: string; value?: string }) =>\n callRuntime((target) => target.sendAction(args)),\n [callRuntime]\n );\n const retryMessage = useCallback(\n (messageId: string) => callRuntime((target) => target.retryMessage(messageId)),\n [callRuntime]\n );\n\n return {\n messages: [...snapshot.messages],\n pendingActions: [...snapshot.pendingActions],\n conversationId: snapshot.conversationId,\n error: webChatLoadError ?? (snapshot.error as UseWebChatResult['error']),\n isLoading: !webChatLoadError && (isWebChatLoading || snapshot.status === 'loading'),\n isRunning: snapshot.run.isRunning,\n typing: snapshot.run.typing,\n conversationStatus: snapshot.conversationStatus,\n run: snapshot.run,\n pagination: paginationWithFetch,\n isRecovering: snapshot.isRecovering,\n catchUpError: snapshot.catchUpError,\n refetch,\n sendMessage,\n respondToAction,\n sendAction,\n retryMessage,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,gBAA0B;AAC1B,mBAA+G;AAC/G,wBAA2B;AAC3B,0BAAwB;AAsGxB,IAAM,wBAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK,EAAE,WAAW,MAAM;AAAA,EACxB,oBAAoB;AAAA,EACpB,YAAY,EAAE,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC7C,UAAU,CAAC;AAAA,EACX,gBAAgB,CAAC;AAAA,EACjB,cAAc;AAChB;AAOA,SAAS,2BAA2B,MAQ3B;AApJT;AAqJE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAK,6BAAM,oBAAiB,kCAAM,WAAN,mBAAc,UAAS,cAAc,CAAC,gBAAgB,WAAW,oBAAoB;AAC/G,QAAI,SAAS,gBAAgB;AAC3B,sBAAgB,UAAU;AAC1B,2BAAS,SAAQ,cAAjB,4BAA6B;AAAA,QAC3B,gBAAgB,SAAS;AAAA,QACzB,UAAU,CAAC,GAAG,SAAS,QAAQ;AAAA,QAC/B,SAAS,SAAS,WAAW;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,gBAAgB,SAAS,iBAAiB,wBAAwB,SAAS;AACtF,4BAAwB,UAAU,SAAS;AAC3C,yBAAS,SAAQ,YAAjB,4BAA2B,SAAS;AAAA,EACtC,WAAW,CAAC,SAAS,cAAc;AACjC,4BAAwB,UAAU;AAAA,EACpC;AAEA,MAAI,SAAS,OAAO;AAClB,UAAM,kBAAkB,mBAAmB,SAAS,UAAS,cAAS,MAAM,kBAAf,mBAA8B,YAAW,KAAM;AAC5G,UAAM,WAAW,GAAG,SAAS,MAAM,OAAO,IAAI,eAAe;AAC7D,QAAI,wBAAwB,YAAY,UAAU;AAChD,8BAAwB,UAAU;AAClC,2BAAS,SAAQ,YAAjB,4BAA2B,SAAS;AAAA,IACtC;AAAA,EACF,OAAO;AACL,4BAAwB,UAAU;AAAA,EACpC;AAEA,QAAM,SAAS,6BAAM;AACrB,OAAI,iCAAQ,UAAS,QAAQ;AAC3B,yBAAS,SAAQ,YAAjB,4BAA2B,OAAO;AAAA,EACpC;AAEA,MAAI,UAAU,OAAO,SAAS,WAAW;AACvC,eAAW,WAAW,OAAO,eAAe;AAC1C,2BAAS,SAAQ,cAAjB,4BAA6B;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,eAAW,UAAU,OAAO,YAAY;AACtC,2BAAS,SAAQ,sBAAjB,4BAAqC;AAAA,IACvC;AAAA,EACF;AACF;AAQA,SAAS,iBAAiB,SAAiB,WAA4B;AACrE,SAAO,GAAG,OAAO,KAAK,aAAa,EAAE;AACvC;AAEA,SAAS,oBAAoB,MAKO;AAClC,QAAM,MAAM,iBAAiB,KAAK,SAAS,KAAK,SAAS;AACzD,QAAM,UAAU,KAAK,gBAAgB;AAErC,OAAI,mCAAS,UAAS,KAAK,QAAQ,QAAQ,QAAQ,KAAK;AACtD,WAAO,QAAQ;AAAA,EACjB;AAEA,qCAAS,QAAQ;AAEjB,QAAM,UAAU,KAAK,KAAK,QAAQ,aAAa,EAAE,SAAS,KAAK,SAAS,WAAW,KAAK,UAAU,CAAC;AACnG,OAAK,gBAAgB,UAAU,EAAE,KAAK,MAAM,KAAK,MAAM,QAAQ;AAC/D,SAAO;AACT;AAOA,SAAS,YAAY,OAA2B;AAC9C,MAAI,iBAAiB,qBAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,IAAI,oBAAU,2BAA2B,KAAK;AAAA,EACvD;AAEA,SAAO,IAAI,oBAAU,2BAA2B,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAC1E;AAYO,IAAM,aAAa,CAAC,UAA6C;AAvQxE;AAwQE,QAAM,WAAO,6BAAQ;AACrB,QAAM,eAAW,8BAAW,KAAK;AACjC,QAAM,CAAC,WAAW,YAAY,QAAI,uBAA2B,OAAO;AAAA,IAClE;AAAA,IACA,QAAQ;AAAA,EACV,EAAE;AAEF,8BAAU,MAAM;AACd,QAAI,YAAY;AAEhB,QAAI,CAAC,KAAK,iBAAiB;AACzB,mBAAa,EAAE,MAAM,QAAQ,UAAU,CAAC;AAAA,IAC1C;AAEA,SAAK,KACF,YAAY,EACZ,KAAK,MAAM;AACV,UAAI,CAAC,WAAW;AACd,qBAAa,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACxC;AAAA,IACF,CAAC,EACA,MAAM,CAAC,UAAmB;AA7RjC,UAAAA,KAAA;AA8RQ,UAAI,WAAW;AACb;AAAA,MACF;AAEA,YAAM,YAAY,YAAY,KAAK;AACnC,aAAAA,MAAA,SAAS,SAAQ,YAAjB,wBAAAA,KAA2B;AAC3B,mBAAa,EAAE,MAAM,QAAQ,SAAS,OAAO,UAAU,CAAC;AAAA,IAC1D,CAAC;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,eAAe,UAAU,SAAS,QAAQ,UAAU,WAAW;AACrE,QAAM,mBAAmB,UAAU,SAAS,QAAQ,UAAU,WAAW,UAAU,UAAU,QAAQ;AACrG,QAAM,mBAAmB,UAAU,SAAS,QAAQ,UAAU,WAAW;AAEzE,QAAM,gBAAgB,kBAAkB,QAAQ,MAAM,eAAe;AACrE,QAAM,WAAU,+CAAe,YAAW,MAAM;AAChD,QAAM,qBAAqB,gBAAgB,SAAY,MAAM;AAC7D,QAAM,YAAY,gBAAgB,SAAY,MAAM;AAEpD,QAAM,sBAAkB,qBAAiC,IAAI;AAE7D,8BAAU,MAAM;AACd,UAAM,UAAU,gBAAgB;AAChC,QAAI,WAAW,QAAQ,SAAS,MAAM;AACpC,cAAQ,QAAQ,QAAQ;AACxB,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,oBAAgB,sBAAQ,MAAM;AAClC,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,QAAQ,aAAa;AAAA,MAC/B;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,eAAe,MAAM,SAAS,oBAAoB,SAAS,CAAC;AAE9E,MAAI,iBAAiB,oBAAoB;AACvC,0BAAgB,YAAhB,mBAAyB,QAAQ;AACjC,oBAAgB,UAAU;AAAA,EAC5B;AAEA,QAAM,eACJ,CAAC,gBAAgB,iBAAiB,qBAC9B,OACA,oBAAoB,EAAE,MAAM,SAAS,WAAW,gBAAgB,CAAC;AAEvE,QAAM,UAAU,iBAAiB,iBAAiB;AAElD,8BAAU,MAAM;AACd,WAAO,MAAM;AAhWjB,UAAAA;AAiWM,OAAAA,MAAA,gBAAgB,YAAhB,gBAAAA,IAAyB,QAAQ;AACjC,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAkB,qBAAO,KAAK;AACpC,QAAM,yBAAqB,qBAAO,KAAK;AACvC,QAAM,8BAA0B,qBAA8B;AAC9D,QAAM,8BAA0B,qBAAe;AAE/C,8BAAU,MAAM;AACd,oBAAgB,UAAU;AAC1B,uBAAmB,UAAU;AAC7B,4BAAwB,UAAU;AAClC,4BAAwB,UAAU;AAAA,EACpC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,gBAAY;AAAA,IAChB,CAAC,kBAA8B;AAnXnC,UAAAA,KAAA;AAoXM,UAAI,CAAC,SAAS;AACZ,eAAO,MAAM;AAAA,QAAC;AAAA,MAChB;AAEA,UAAI,CAAC,mBAAmB,SAAS;AAC/B,2BAAmB,UAAU;AAC7B,mBAAW,UAAU,QAAQ,YAAY,EAAE,gBAAgB;AACzD,iBAAAA,MAAA,SAAS,SAAQ,sBAAjB,wBAAAA,KAAqC;AAAA,QACvC;AAAA,MACF;AAEA,aAAO,QAAQ,UAAU,CAACC,WAAU,SAAS;AAC3C,sBAAc;AACd,mCAA2B;AAAA,UACzB,UAAAA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,oBAAoB,QAAQ;AAAA,EACxC;AAEA,QAAM,kBAAc,0BAAY,MAAM;AACpC,YAAO,mCAAS,kBAAiB;AAAA,EACnC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,wBAAoB,0BAAY,MAAM;AAC1C,YAAO,mCAAS,wBAAuB;AAAA,EACzC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAW,mCAAqB,WAAW,aAAa,iBAAiB;AAE/E,QAAM,kBAAc;AAAA,IAClB,OAAU,WAAkF;AA1ZhG,UAAAD,KAAA;AA2ZM,UAAI,CAAC,SAAS;AACZ,cAAM,QACJ,oBACA,IAAI;AAAA,UACF,mBAAmB,8BAA8B;AAAA,UACjD,IAAI,MAAM,+BAA+B;AAAA,QAC3C;AACF,eAAAA,MAAA,SAAS,SAAQ,YAAjB,wBAAAA,KAA2B;AAE3B,eAAO,EAAE,MAAM;AAAA,MACjB;AAEA,YAAM,WAAW,MAAM,OAAO,OAAO;AACrC,UAAI,SAAS,OAAO;AAClB,6BAAS,SAAQ,YAAjB,4BAA2B,SAAS;AAAA,MACtC;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,kBAAkB,kBAAkB,QAAQ;AAAA,EACxD;AAEA,QAAM,cAAU,0BAAY,YAAY;AAjb1C,QAAAA,KAAA;AAkbI,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,QAAI,SAAS,MAAM;AACjB,aAAAA,MAAA,SAAS,SAAQ,cAAjB,wBAAAA,KAA6B;AAAA,QAC3B,gBAAgB,SAAS,KAAK;AAAA,QAC9B,UAAU,CAAC,GAAG,SAAS,KAAK,QAAQ;AAAA,QACpC,SAAS,SAAS,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,CAAC;AAEtB,QAAM,gBAAY,0BAAY,YAAY;AACxC,UAAM,WAAW,MAAM,YAAY,CAAC,WAAW,OAAO,UAAU,CAAC;AAEjE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS,OACX;AAAA,QACE,UAAU,CAAC,GAAG,SAAS,KAAK,QAAQ;AAAA,QACpC,SAAS,SAAS,KAAK;AAAA,MACzB,IACA;AAAA,IACN;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,0BAAsB;AAAA,IAC1B,OAAO;AAAA,MACL,QAAQ,SAAS,WAAW;AAAA,MAC5B,SAAS,SAAS,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,SAAS,WAAW,QAAQ,SAAS,WAAW,SAAS,SAAS;AAAA,EACrE;AAEA,QAAM,kBAAc;AAAA,IAClB,CAAC,UAA4B,YAAY,CAAC,WAAW,OAAO,YAAY,KAAK,CAAC;AAAA,IAC9E,CAAC,WAAW;AAAA,EACd;AACA,QAAM,sBAAkB;AAAA,IACtB,CAAC,SACC,YAAY,CAAC,WAAW,OAAO,gBAAgB,IAAI,CAAC;AAAA,IACtD,CAAC,WAAW;AAAA,EACd;AACA,QAAM,iBAAa;AAAA,IACjB,CAAC,SACC,YAAY,CAAC,WAAW,OAAO,WAAW,IAAI,CAAC;AAAA,IACjD,CAAC,WAAW;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACnB,CAAC,cAAsB,YAAY,CAAC,WAAW,OAAO,aAAa,SAAS,CAAC;AAAA,IAC7E,CAAC,WAAW;AAAA,EACd;AAEA,SAAO;AAAA,IACL,UAAU,CAAC,GAAG,SAAS,QAAQ;AAAA,IAC/B,gBAAgB,CAAC,GAAG,SAAS,cAAc;AAAA,IAC3C,gBAAgB,SAAS;AAAA,IACzB,OAAO,oBAAqB,SAAS;AAAA,IACrC,WAAW,CAAC,qBAAqB,oBAAoB,SAAS,WAAW;AAAA,IACzE,WAAW,SAAS,IAAI;AAAA,IACxB,QAAQ,SAAS,IAAI;AAAA,IACrB,oBAAoB,SAAS;AAAA,IAC7B,KAAK,SAAS;AAAA,IACd,YAAY;AAAA,IACZ,cAAc,SAAS;AAAA,IACvB,cAAc,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["_a","snapshot"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { LoadConversationResult, NovuError, WebChatPlanLimitError, AgentMessage, AgentPendingAction, AgentEventEnvelope, AgentHashFields, AgentConversationRuntime, AgentConversationRunSnapshot, AgentConversationStatus, WebChatPagination, SendMessageInput, SendMessageResult, AgentToolApprovalDecision, RespondToActionResult, SendActionResult } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseWebChatCallbacks = {
|
|
4
|
+
onSuccess?: (data: LoadConversationResult) => void;
|
|
5
|
+
onError?: (error: NovuError | WebChatPlanLimitError) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Fires once when a message id first appears. History pages do not fire.
|
|
8
|
+
* The first event of a turn can create an empty assistant message before text arrives.
|
|
9
|
+
* A send that never reaches the server does not fire. The message status becomes `failed` instead.
|
|
10
|
+
*/
|
|
11
|
+
onMessage?: (message: AgentMessage) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Fires once per pending action, including actions still pending on mount.
|
|
14
|
+
* Paging backwards does not fire.
|
|
15
|
+
*/
|
|
16
|
+
onActionRequested?: (action: AgentPendingAction) => void;
|
|
17
|
+
/**
|
|
18
|
+
* Live event envelopes for this conversation.
|
|
19
|
+
* Duplicates that the client drops do not fire.
|
|
20
|
+
* Envelopes that arrive before the conversation id exists do not fire.
|
|
21
|
+
* The message list in this render does not include this envelope yet.
|
|
22
|
+
*/
|
|
23
|
+
onEvent?: (envelope: AgentEventEnvelope) => void;
|
|
24
|
+
};
|
|
25
|
+
/** Arguments for {@link useWebChat}. Pass `agentId`, or pass `conversation`. Do not mix the two. */
|
|
26
|
+
type UseWebChatProps = UseWebChatCallbacks & AgentHashFields & ({
|
|
27
|
+
agentId: string;
|
|
28
|
+
/**
|
|
29
|
+
* Resume this conversation. The hook loads history on mount.
|
|
30
|
+
* Omit this prop to start a new chat. The first send creates a conversation.
|
|
31
|
+
*/
|
|
32
|
+
conversationId?: string;
|
|
33
|
+
conversation?: never;
|
|
34
|
+
} | {
|
|
35
|
+
/** Share an existing conversation runtime across multiple hook instances. */
|
|
36
|
+
conversation: AgentConversationRuntime;
|
|
37
|
+
agentId?: never;
|
|
38
|
+
conversationId?: never;
|
|
39
|
+
agentHash?: never;
|
|
40
|
+
});
|
|
41
|
+
/** State and actions returned by {@link useWebChat}. */
|
|
42
|
+
type UseWebChatResult = {
|
|
43
|
+
/** Conversation timeline. */
|
|
44
|
+
messages: AgentMessage[];
|
|
45
|
+
/** Tool approvals and MCP connect items that are still pending. */
|
|
46
|
+
pendingActions: AgentPendingAction[];
|
|
47
|
+
/** Server conversation id after create or resume. */
|
|
48
|
+
conversationId?: string;
|
|
49
|
+
/** Last error from load, send, retry, or action. */
|
|
50
|
+
error?: NovuError | WebChatPlanLimitError;
|
|
51
|
+
/** True while Web Chat loads and, for an existing conversation, until the first history fetch completes. */
|
|
52
|
+
isLoading: boolean;
|
|
53
|
+
/** True while the agent turn is in progress. Same as `run.isRunning`. */
|
|
54
|
+
isRunning: boolean;
|
|
55
|
+
/** Typing indicator. Same as `run.typing`. Absent when the agent is not typing. */
|
|
56
|
+
typing?: AgentConversationRunSnapshot['typing'];
|
|
57
|
+
/** `'active'` or `'resolved'`. The agent sets `resolved` with `ctx.resolve()`. Not a loading flag. */
|
|
58
|
+
conversationStatus: AgentConversationStatus;
|
|
59
|
+
/** Current agent-run snapshot. */
|
|
60
|
+
run: AgentConversationRunSnapshot;
|
|
61
|
+
/** Older-history control. Not a top-level `hasMore` or `fetchMore`. */
|
|
62
|
+
pagination: WebChatPagination & {
|
|
63
|
+
fetchMore: () => Promise<{
|
|
64
|
+
data?: {
|
|
65
|
+
messages: AgentMessage[];
|
|
66
|
+
hasMore: boolean;
|
|
67
|
+
};
|
|
68
|
+
error?: NovuError;
|
|
69
|
+
}>;
|
|
70
|
+
};
|
|
71
|
+
/** True while reconnect recovery is in progress. */
|
|
72
|
+
isRecovering: boolean;
|
|
73
|
+
/** Set when reconnect recovery fails. Separate from send and fetch `error`. */
|
|
74
|
+
catchUpError?: NovuError;
|
|
75
|
+
/** Reload the newest history page. No-op when there is no conversation id. */
|
|
76
|
+
refetch: () => Promise<void>;
|
|
77
|
+
/** Send a user message. `input` is a string, or `{ text, metadata }`. Creates a conversation when `conversationId` is omitted. */
|
|
78
|
+
sendMessage: (input: SendMessageInput) => Promise<{
|
|
79
|
+
data?: SendMessageResult;
|
|
80
|
+
error?: NovuError | WebChatPlanLimitError;
|
|
81
|
+
}>;
|
|
82
|
+
/** Resolve a pending `tool-approval`. Pass `action.id` from `pendingActions`. */
|
|
83
|
+
respondToAction: (args: {
|
|
84
|
+
actionId: string;
|
|
85
|
+
decision: AgentToolApprovalDecision;
|
|
86
|
+
}) => Promise<{
|
|
87
|
+
data?: RespondToActionResult;
|
|
88
|
+
error?: NovuError | WebChatPlanLimitError;
|
|
89
|
+
}>;
|
|
90
|
+
/** Click a Card button. Do not use this for tool approval. */
|
|
91
|
+
sendAction: (args: {
|
|
92
|
+
actionId: string;
|
|
93
|
+
sourceMessageId: string;
|
|
94
|
+
value?: string;
|
|
95
|
+
}) => Promise<{
|
|
96
|
+
data?: SendActionResult;
|
|
97
|
+
error?: NovuError | WebChatPlanLimitError;
|
|
98
|
+
}>;
|
|
99
|
+
/** Resend a message whose `status` is `failed`. Reuses the original idempotency key. */
|
|
100
|
+
retryMessage: (messageId: string) => Promise<{
|
|
101
|
+
data?: SendMessageResult;
|
|
102
|
+
error?: NovuError | WebChatPlanLimitError;
|
|
103
|
+
}>;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Headless Web Chat client. Use it inside `NovuProvider`.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```tsx
|
|
110
|
+
* const { messages, sendMessage, isRunning, isLoading, error } = useWebChat({
|
|
111
|
+
* agentId: 'YOUR_AGENT_IDENTIFIER',
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
declare const useWebChat: (props: UseWebChatProps) => UseWebChatResult;
|
|
116
|
+
|
|
117
|
+
export { type UseWebChatProps, type UseWebChatResult, useWebChat };
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -52,7 +52,8 @@ __export(index_exports, {
|
|
|
52
52
|
useSubscription: () => import_hooks.useSubscription,
|
|
53
53
|
useSubscriptions: () => import_hooks.useSubscriptions,
|
|
54
54
|
useTelegramSubscriberLink: () => import_hooks.useTelegramSubscriberLink,
|
|
55
|
-
useUpdateSubscription: () => import_hooks.useUpdateSubscription
|
|
55
|
+
useUpdateSubscription: () => import_hooks.useUpdateSubscription,
|
|
56
|
+
useWebChat: () => import_hooks.useWebChat
|
|
56
57
|
});
|
|
57
58
|
module.exports = __toCommonJS(index_exports);
|
|
58
59
|
var import_js = require("@novu/js");
|
|
@@ -92,6 +93,7 @@ var import_hooks = require("./hooks/index.cjs");
|
|
|
92
93
|
useSubscription,
|
|
93
94
|
useSubscriptions,
|
|
94
95
|
useTelegramSubscriberLink,
|
|
95
|
-
useUpdateSubscription
|
|
96
|
+
useUpdateSubscription,
|
|
97
|
+
useWebChat
|
|
96
98
|
});
|
|
97
99
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\n\nexport type {\n AllLocalization,\n AllLocalizationKey,\n ChannelConnectButtonIconKey,\n ElementStyles,\n InboxAppearance,\n InboxAppearanceCallback,\n InboxAppearanceCallbackFunction,\n InboxAppearanceCallbackKeys,\n InboxAppearanceKey,\n InboxElements,\n InboxLocalization,\n InboxLocalizationKey,\n InboxTheme,\n NotificationActionClickHandler,\n NotificationClickHandler,\n NotificationRenderer,\n PreferenceGroups,\n PreferencesFilter,\n RouterPush,\n SubscriptionAppearance,\n SubscriptionAppearanceCallback,\n SubscriptionAppearanceCallbackFunction,\n SubscriptionAppearanceCallbackKeys,\n SubscriptionAppearanceKey,\n SubscriptionElements,\n SubscriptionLocalization,\n SubscriptionLocalizationKey,\n SubscriptionTheme,\n Tab,\n Variables,\n} from '@novu/js/ui';\nexport type {\n BellProps,\n InboxContentProps,\n InboxProps,\n MsTeamsConnectButtonProps,\n MsTeamsLinkUserProps,\n NotificationProps,\n NovuProviderProps,\n SlackConnectButtonProps,\n SlackLinkUserProps,\n SubscriptionButtonProps,\n SubscriptionPreferencesProps,\n SubscriptionProps,\n TelegramConnectButtonProps,\n} from './components';\nexport {\n Bell,\n Inbox,\n InboxContent,\n MsTeamsConnectButton,\n MsTeamsLinkUser,\n Notifications,\n NovuProvider,\n Preferences,\n SlackConnectButton,\n SlackLinkUser,\n Subscription,\n SubscriptionButton,\n SubscriptionPreferences,\n TelegramConnectButton,\n} from './components';\nexport type {\n UseChannelConnectionProps,\n UseChannelConnectionResult,\n UseChannelConnectionsProps,\n UseChannelConnectionsResult,\n UseChannelEndpointProps,\n UseChannelEndpointResult,\n UseCountsProps,\n UseCountsResult,\n UseCreateChannelEndpointProps,\n UseCreateChannelEndpointResult,\n UseDeleteChannelEndpointProps,\n UseDeleteChannelEndpointResult,\n UseNotificationsProps,\n UseNotificationsResult,\n UsePreferencesResult,\n UseScheduleProps as UsePreferencesProps,\n UseTelegramSubscriberLinkProps,\n UseTelegramSubscriberLinkResult,\n} from './hooks';\nexport {\n useChannelConnection,\n useChannelConnections,\n useChannelEndpoint,\n useCounts,\n useCreateChannelEndpoint,\n useCreateSubscription,\n useDeleteChannelEndpoint,\n useNotifications,\n useNovu,\n usePreferences,\n useRemoveSubscription,\n useSchedule,\n useSubscription,\n useSubscriptions,\n useTelegramSubscriberLink,\n useUpdateSubscription,\n} from './hooks';\n\nexport type {\n BaseProps,\n BellRenderer,\n BodyRenderer,\n DefaultInboxProps,\n DefaultProps,\n NoRendererProps,\n NotificationRendererProps,\n NotificationsRenderer,\n ReactAllAppearance,\n ReactInboxAppearance,\n ReactInboxTheme,\n ReactSubscriptionAppearance,\n ReactSubscriptionTheme,\n SubjectBodyRendererProps,\n SubjectRenderer,\n WithChildrenProps,\n} from './utils/types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAiD5E,wBAeO;
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\n\nexport type {\n AllLocalization,\n AllLocalizationKey,\n ChannelConnectButtonIconKey,\n ElementStyles,\n InboxAppearance,\n InboxAppearanceCallback,\n InboxAppearanceCallbackFunction,\n InboxAppearanceCallbackKeys,\n InboxAppearanceKey,\n InboxElements,\n InboxLocalization,\n InboxLocalizationKey,\n InboxTheme,\n NotificationActionClickHandler,\n NotificationClickHandler,\n NotificationRenderer,\n PreferenceGroups,\n PreferencesFilter,\n RouterPush,\n SubscriptionAppearance,\n SubscriptionAppearanceCallback,\n SubscriptionAppearanceCallbackFunction,\n SubscriptionAppearanceCallbackKeys,\n SubscriptionAppearanceKey,\n SubscriptionElements,\n SubscriptionLocalization,\n SubscriptionLocalizationKey,\n SubscriptionTheme,\n Tab,\n Variables,\n} from '@novu/js/ui';\nexport type {\n BellProps,\n InboxContentProps,\n InboxProps,\n MsTeamsConnectButtonProps,\n MsTeamsLinkUserProps,\n NotificationProps,\n NovuProviderProps,\n SlackConnectButtonProps,\n SlackLinkUserProps,\n SubscriptionButtonProps,\n SubscriptionPreferencesProps,\n SubscriptionProps,\n TelegramConnectButtonProps,\n} from './components';\nexport {\n Bell,\n Inbox,\n InboxContent,\n MsTeamsConnectButton,\n MsTeamsLinkUser,\n Notifications,\n NovuProvider,\n Preferences,\n SlackConnectButton,\n SlackLinkUser,\n Subscription,\n SubscriptionButton,\n SubscriptionPreferences,\n TelegramConnectButton,\n} from './components';\nexport type {\n UseWebChatProps,\n UseWebChatResult,\n UseChannelConnectionProps,\n UseChannelConnectionResult,\n UseChannelConnectionsProps,\n UseChannelConnectionsResult,\n UseChannelEndpointProps,\n UseChannelEndpointResult,\n UseCountsProps,\n UseCountsResult,\n UseCreateChannelEndpointProps,\n UseCreateChannelEndpointResult,\n UseDeleteChannelEndpointProps,\n UseDeleteChannelEndpointResult,\n UseNotificationsProps,\n UseNotificationsResult,\n UsePreferencesResult,\n UseScheduleProps as UsePreferencesProps,\n UseTelegramSubscriberLinkProps,\n UseTelegramSubscriberLinkResult,\n} from './hooks';\nexport {\n useWebChat,\n useChannelConnection,\n useChannelConnections,\n useChannelEndpoint,\n useCounts,\n useCreateChannelEndpoint,\n useCreateSubscription,\n useDeleteChannelEndpoint,\n useNotifications,\n useNovu,\n usePreferences,\n useRemoveSubscription,\n useSchedule,\n useSubscription,\n useSubscriptions,\n useTelegramSubscriberLink,\n useUpdateSubscription,\n} from './hooks';\n\nexport type {\n BaseProps,\n BellRenderer,\n BodyRenderer,\n DefaultInboxProps,\n DefaultProps,\n NoRendererProps,\n NotificationRendererProps,\n NotificationsRenderer,\n ReactAllAppearance,\n ReactInboxAppearance,\n ReactInboxTheme,\n ReactSubscriptionAppearance,\n ReactSubscriptionTheme,\n SubjectBodyRendererProps,\n SubjectRenderer,\n WithChildrenProps,\n} from './utils/types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAiD5E,wBAeO;AAuBP,mBAkBO;","names":[]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -15,6 +15,7 @@ export { Subscription, SubscriptionProps } from './components/subscription/Subsc
|
|
|
15
15
|
export { SubscriptionButton, SubscriptionButtonProps } from './components/subscription/SubscriptionButton.cjs';
|
|
16
16
|
export { SubscriptionPreferences, SubscriptionPreferencesProps } from './components/subscription/SubscriptionPreferences.cjs';
|
|
17
17
|
export { TelegramConnectButton, TelegramConnectButtonProps } from './components/telegram-connect-button/TelegramConnectButton.cjs';
|
|
18
|
+
export { UseWebChatProps, UseWebChatResult, useWebChat } from './hooks/useWebChat.cjs';
|
|
18
19
|
export { UseChannelConnectionProps, UseChannelConnectionResult, useChannelConnection } from './hooks/useChannelConnection.cjs';
|
|
19
20
|
export { UseChannelConnectionsProps, UseChannelConnectionsResult, useChannelConnections } from './hooks/useChannelConnections.cjs';
|
|
20
21
|
export { UseChannelEndpointProps, UseChannelEndpointResult, useChannelEndpoint } from './hooks/useChannelEndpoint.cjs';
|