vdb-ai-chat 1.0.0

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.
Files changed (102) hide show
  1. package/README.md +153 -0
  2. package/dist/chat-widget.js +2 -0
  3. package/dist/chat-widget.js.LICENSE.txt +29 -0
  4. package/lib/commonjs/api.js +157 -0
  5. package/lib/commonjs/api.js.map +1 -0
  6. package/lib/commonjs/components/ChatHeader.js +111 -0
  7. package/lib/commonjs/components/ChatHeader.js.map +1 -0
  8. package/lib/commonjs/components/ChatInput.js +144 -0
  9. package/lib/commonjs/components/ChatInput.js.map +1 -0
  10. package/lib/commonjs/components/ChatWidget.js +469 -0
  11. package/lib/commonjs/components/ChatWidget.js.map +1 -0
  12. package/lib/commonjs/components/MessageBubble.js +122 -0
  13. package/lib/commonjs/components/MessageBubble.js.map +1 -0
  14. package/lib/commonjs/components/ProductsList.js +139 -0
  15. package/lib/commonjs/components/ProductsList.js.map +1 -0
  16. package/lib/commonjs/components/SuggestionsRow.js +59 -0
  17. package/lib/commonjs/components/SuggestionsRow.js.map +1 -0
  18. package/lib/commonjs/components/utils.js +37 -0
  19. package/lib/commonjs/components/utils.js.map +1 -0
  20. package/lib/commonjs/index.js +70 -0
  21. package/lib/commonjs/index.js.map +1 -0
  22. package/lib/commonjs/index.native.js +70 -0
  23. package/lib/commonjs/index.native.js.map +1 -0
  24. package/lib/commonjs/index.web.js +30 -0
  25. package/lib/commonjs/index.web.js.map +1 -0
  26. package/lib/commonjs/storage.js +136 -0
  27. package/lib/commonjs/storage.js.map +1 -0
  28. package/lib/commonjs/theme.js +29 -0
  29. package/lib/commonjs/theme.js.map +1 -0
  30. package/lib/commonjs/types.js +2 -0
  31. package/lib/commonjs/types.js.map +1 -0
  32. package/lib/module/api.js +146 -0
  33. package/lib/module/api.js.map +1 -0
  34. package/lib/module/components/ChatHeader.js +105 -0
  35. package/lib/module/components/ChatHeader.js.map +1 -0
  36. package/lib/module/components/ChatInput.js +136 -0
  37. package/lib/module/components/ChatInput.js.map +1 -0
  38. package/lib/module/components/ChatWidget.js +461 -0
  39. package/lib/module/components/ChatWidget.js.map +1 -0
  40. package/lib/module/components/MessageBubble.js +116 -0
  41. package/lib/module/components/MessageBubble.js.map +1 -0
  42. package/lib/module/components/ProductsList.js +133 -0
  43. package/lib/module/components/ProductsList.js.map +1 -0
  44. package/lib/module/components/SuggestionsRow.js +52 -0
  45. package/lib/module/components/SuggestionsRow.js.map +1 -0
  46. package/lib/module/components/utils.js +29 -0
  47. package/lib/module/components/utils.js.map +1 -0
  48. package/lib/module/index.js +7 -0
  49. package/lib/module/index.js.map +1 -0
  50. package/lib/module/index.native.js +7 -0
  51. package/lib/module/index.native.js.map +1 -0
  52. package/lib/module/index.web.js +23 -0
  53. package/lib/module/index.web.js.map +1 -0
  54. package/lib/module/storage.js +129 -0
  55. package/lib/module/storage.js.map +1 -0
  56. package/lib/module/theme.js +22 -0
  57. package/lib/module/theme.js.map +1 -0
  58. package/lib/module/types.js +2 -0
  59. package/lib/module/types.js.map +1 -0
  60. package/lib/typescript/api.d.ts +10 -0
  61. package/lib/typescript/api.d.ts.map +1 -0
  62. package/lib/typescript/components/ChatHeader.d.ts +6 -0
  63. package/lib/typescript/components/ChatHeader.d.ts.map +1 -0
  64. package/lib/typescript/components/ChatInput.d.ts +15 -0
  65. package/lib/typescript/components/ChatInput.d.ts.map +1 -0
  66. package/lib/typescript/components/ChatWidget.d.ts +4 -0
  67. package/lib/typescript/components/ChatWidget.d.ts.map +1 -0
  68. package/lib/typescript/components/MessageBubble.d.ts +13 -0
  69. package/lib/typescript/components/MessageBubble.d.ts.map +1 -0
  70. package/lib/typescript/components/ProductsList.d.ts +9 -0
  71. package/lib/typescript/components/ProductsList.d.ts.map +1 -0
  72. package/lib/typescript/components/SuggestionsRow.d.ts +8 -0
  73. package/lib/typescript/components/SuggestionsRow.d.ts.map +1 -0
  74. package/lib/typescript/components/utils.d.ts +8 -0
  75. package/lib/typescript/components/utils.d.ts.map +1 -0
  76. package/lib/typescript/index.d.ts +6 -0
  77. package/lib/typescript/index.d.ts.map +1 -0
  78. package/lib/typescript/index.native.d.ts +6 -0
  79. package/lib/typescript/index.native.d.ts.map +1 -0
  80. package/lib/typescript/index.web.d.ts +3 -0
  81. package/lib/typescript/index.web.d.ts.map +1 -0
  82. package/lib/typescript/storage.d.ts +28 -0
  83. package/lib/typescript/storage.d.ts.map +1 -0
  84. package/lib/typescript/theme.d.ts +4 -0
  85. package/lib/typescript/theme.d.ts.map +1 -0
  86. package/lib/typescript/types.d.ts +51 -0
  87. package/lib/typescript/types.d.ts.map +1 -0
  88. package/package.json +90 -0
  89. package/src/api.ts +200 -0
  90. package/src/components/ChatHeader.tsx +114 -0
  91. package/src/components/ChatInput.tsx +163 -0
  92. package/src/components/ChatWidget.tsx +679 -0
  93. package/src/components/MessageBubble.tsx +181 -0
  94. package/src/components/ProductsList.tsx +160 -0
  95. package/src/components/SuggestionsRow.tsx +73 -0
  96. package/src/components/utils.ts +43 -0
  97. package/src/index.native.tsx +6 -0
  98. package/src/index.ts +7 -0
  99. package/src/index.web.tsx +33 -0
  100. package/src/storage.ts +142 -0
  101. package/src/theme.ts +21 -0
  102. package/src/types.ts +56 -0
@@ -0,0 +1,146 @@
1
+ import { Storage } from "./storage";
2
+
3
+ // Generic params type reused for downstream APIs (e.g. product search payload)
4
+
5
+ async function buildHeaders() {
6
+ const token = (await Storage.getItem("token")) || "";
7
+ const iid = (await Storage.getItem("persist:appState")) || "{}";
8
+ let installationId = "";
9
+ try {
10
+ const parsed = JSON.parse(iid);
11
+ installationId = parsed?.installationIdentifier ? JSON.parse(parsed.installationIdentifier) : "";
12
+ } catch {
13
+ installationId = "";
14
+ }
15
+ const session = (await Storage.getItem("session_cookie")) || "";
16
+ return {
17
+ "Content-Type": "application/json",
18
+ Accept: "application/json, text/plain, */*",
19
+ Authorization: `Token token=${token},installation_identifier=${installationId}`,
20
+ Cookie: `vdb-server_session=${session}`
21
+ };
22
+ }
23
+ export function normaliseMessages(raw) {
24
+ const messages = Array.isArray(raw) ? raw : raw?.messages;
25
+ if (!Array.isArray(messages)) return [];
26
+ return messages.map((m, index) => ({
27
+ id: String(m.id ?? `${m.role}-${index}-${m.created_at ?? Date.now()}`),
28
+ role: m.role === "user" ? "user" : "assistant",
29
+ text: String(m.content ?? m.text ?? ""),
30
+ createdAt: typeof m.created_at === "string" ? Date.parse(m.created_at) : typeof m.createdAt === "number" ? m.createdAt : Date.now(),
31
+ ...(m.role === "assistant" ? {
32
+ agent_response: raw?.agent_response ? raw?.agent_response : undefined
33
+ } : {}),
34
+ // agent_response: m.agent_response,
35
+ suggestions: Array.isArray(m.suggestions) ? m.suggestions : undefined
36
+ }));
37
+ }
38
+ export async function fetchInitialMessages(apiUrl, _params, priceMode) {
39
+ const conversations = await Storage.getJSON("vdbchat_conversations", {});
40
+ const storedId = conversations?.[priceMode]?.conversation_id ?? null;
41
+ if (!priceMode) return;
42
+ const body = {};
43
+ if (storedId) {
44
+ body.conversation_id = Number.isNaN(Number(storedId)) ? storedId : Number(storedId);
45
+ }
46
+ const res = await fetch(apiUrl, {
47
+ method: "POST",
48
+ headers: await buildHeaders(),
49
+ body: Object.keys(body).length ? JSON.stringify(body) : undefined
50
+ });
51
+ if (!res.ok) {
52
+ throw new Error(`POST ${apiUrl} failed with ${res.status}`);
53
+ }
54
+ const data = await res.json();
55
+
56
+ // Persist conversation_id returned by the server for future calls
57
+ if (data && data.conversation_id != null && priceMode) {
58
+ const updatedConversations = conversations || {};
59
+ updatedConversations[priceMode] = {
60
+ conversation_id: data.conversation_id
61
+ };
62
+ await Storage.setJSON("vdbchat_conversations", updatedConversations);
63
+ }
64
+ return data;
65
+ }
66
+ export async function sendUserMessage(apiUrl, userMessage, _params, _history, priceMode) {
67
+ const conversations = await Storage.getJSON("vdbchat_conversations", {});
68
+ const storedId = conversations?.[priceMode]?.conversation_id ?? null;
69
+ if (!priceMode) {
70
+ return null;
71
+ }
72
+ const body = {
73
+ query: userMessage
74
+ };
75
+ if (storedId) {
76
+ body.conversation_id = Number.isNaN(Number(storedId)) ? storedId : Number(storedId);
77
+ }
78
+ const res = await fetch(apiUrl, {
79
+ method: "POST",
80
+ headers: await buildHeaders(),
81
+ body: JSON.stringify(body)
82
+ });
83
+ if (!res.ok) {
84
+ throw new Error(`POST ${apiUrl} failed with ${res.status}`);
85
+ }
86
+ const data = await res.json();
87
+ if (data && data.conversation_id != null && priceMode) {
88
+ const updatedConversations = conversations || {};
89
+ updatedConversations[priceMode] = {
90
+ conversation_id: data.conversation_id
91
+ };
92
+ await Storage.setJSON("vdbchat_conversations", updatedConversations);
93
+ }
94
+ return data;
95
+ }
96
+ export async function clearChatHistory(apiUrl, priceMode) {
97
+ const conversations = await Storage.getJSON("vdbchat_conversations", {});
98
+ const storedId = conversations?.[priceMode]?.conversation_id ?? null;
99
+ if (!storedId || !priceMode) return;
100
+ const url = new URL(apiUrl);
101
+ url.searchParams.set("conversation_id", storedId);
102
+ const res = await fetch(url.toString(), {
103
+ method: "DELETE",
104
+ headers: await buildHeaders()
105
+ });
106
+ if (!res.ok) {
107
+ throw new Error(`DELETE ${apiUrl} failed with ${res.status}`);
108
+ }
109
+
110
+ // Clear from storage as well
111
+ const updatedConversations = conversations || {};
112
+ delete updatedConversations[priceMode];
113
+ await Storage.setJSON("vdbchat_conversations", updatedConversations);
114
+ }
115
+ export async function getProducts(params) {
116
+ const res = await fetch("https://pdpdemo1.demo.customvirtual.app/v3/vdb/search_diamonds", {
117
+ method: "POST",
118
+ headers: await buildHeaders(),
119
+ body: JSON.stringify({
120
+ vdb: {
121
+ ...params,
122
+ page_size: 5,
123
+ price_mode: 1,
124
+ vdb_setting: "true"
125
+ }
126
+ })
127
+ });
128
+ if (!res.ok) {
129
+ throw new Error(`POST failed with ${res.status}`);
130
+ }
131
+ const data = await res.json();
132
+ return data;
133
+ }
134
+ export const handleFeedbackActionApi = async (action, conversation_id, message_id) => {
135
+ const feedbackUrl = `https://pdpdemo1.demo.customvirtual.app/v3/agent_conversations/${conversation_id}/conversation_messages/${message_id}/reaction`;
136
+ const payload = {
137
+ reaction: action
138
+ };
139
+ const response = await fetch(feedbackUrl, {
140
+ method: "POST",
141
+ headers: await buildHeaders(),
142
+ body: JSON.stringify(payload)
143
+ });
144
+ return response;
145
+ };
146
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Storage","buildHeaders","token","getItem","iid","installationId","parsed","JSON","parse","installationIdentifier","session","Accept","Authorization","Cookie","normaliseMessages","raw","messages","Array","isArray","map","m","index","id","String","role","created_at","Date","now","text","content","createdAt","agent_response","undefined","suggestions","fetchInitialMessages","apiUrl","_params","priceMode","conversations","getJSON","storedId","conversation_id","body","Number","isNaN","res","fetch","method","headers","Object","keys","length","stringify","ok","Error","status","data","json","updatedConversations","setJSON","sendUserMessage","userMessage","_history","query","clearChatHistory","url","URL","searchParams","set","toString","getProducts","params","vdb","page_size","price_mode","vdb_setting","handleFeedbackActionApi","action","message_id","feedbackUrl","payload","reaction","response"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,105 @@
1
+ import { View, Text, StyleSheet, TouchableOpacity, Platform, Image } from "react-native";
2
+ import React from "react";
3
+
4
+ // Use expo-image on native if available, fallback to RN Image
5
+ let ImageComponent = Image;
6
+ if (Platform.OS !== "web") {
7
+ try {
8
+ const ExpoImage = require("expo-image").Image;
9
+ if (ExpoImage) ImageComponent = ExpoImage;
10
+ } catch {
11
+ // expo-image not installed, use React Native Image
12
+ }
13
+ }
14
+ const CloseIcon = () => {
15
+ return /*#__PURE__*/React.createElement(ImageComponent, {
16
+ source: {
17
+ uri: "https://cdn.jsdelivr.net/npm/feather-icons/dist/icons/x.svg"
18
+ },
19
+ resizeMode: "contain",
20
+ style: {
21
+ width: 20,
22
+ height: 20
23
+ }
24
+ });
25
+ };
26
+ const ChatHeader = ({
27
+ onClose,
28
+ onClearChat
29
+ }) => {
30
+ return /*#__PURE__*/React.createElement(View, {
31
+ style: styles.container
32
+ }, /*#__PURE__*/React.createElement(View, {
33
+ style: styles.logoContainer
34
+ }, /*#__PURE__*/React.createElement(ImageComponent, {
35
+ source: {
36
+ uri: "https://getvdb.com/mail_images/web_app_favicon.ico"
37
+ },
38
+ resizeMode: "contain",
39
+ style: {
40
+ width: 30,
41
+ height: 30,
42
+ marginRight: 10
43
+ }
44
+ }), /*#__PURE__*/React.createElement(Text, {
45
+ style: styles.title
46
+ }, "AI Search")), /*#__PURE__*/React.createElement(View, {
47
+ style: styles.buttonContainer
48
+ }, /*#__PURE__*/React.createElement(TouchableOpacity, {
49
+ onPress: () => onClearChat?.()
50
+ }, /*#__PURE__*/React.createElement(Text, {
51
+ style: styles.clearChatText
52
+ }, "Clear Chat")), /*#__PURE__*/React.createElement(TouchableOpacity, {
53
+ style: styles.closeButton,
54
+ onPress: () => onClose?.()
55
+ }, /*#__PURE__*/React.createElement(CloseIcon, null))));
56
+ };
57
+ const styles = StyleSheet.create({
58
+ container: {
59
+ padding: 16,
60
+ backgroundColor: "#37363F",
61
+ justifyContent: "space-between",
62
+ flexDirection: "row",
63
+ alignItems: "center"
64
+ },
65
+ logoContainer: {
66
+ flexDirection: "row",
67
+ alignItems: "center"
68
+ },
69
+ title: {
70
+ fontSize: 17,
71
+ fontWeight: "500",
72
+ color: "#FFF"
73
+ },
74
+ closeButton: {
75
+ backgroundColor: "#FFF",
76
+ width: 24,
77
+ height: 24,
78
+ borderRadius: 12,
79
+ justifyContent: "center",
80
+ alignItems: "center"
81
+ },
82
+ closeIconText: {
83
+ fontSize: 14,
84
+ fontWeight: "600",
85
+ color: "#37363F",
86
+ textAlign: "center",
87
+ lineHeight: 16
88
+ },
89
+ closeButtonText: {
90
+ color: "#FFF"
91
+ },
92
+ clearChatText: {
93
+ color: "#FFF",
94
+ fontSize: 14,
95
+ fontWeight: "500",
96
+ textDecorationLine: "none"
97
+ },
98
+ buttonContainer: {
99
+ flexDirection: "row",
100
+ alignItems: "center",
101
+ gap: 16
102
+ }
103
+ });
104
+ export default ChatHeader;
105
+ //# sourceMappingURL=ChatHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["View","Text","StyleSheet","TouchableOpacity","Platform","Image","React","ImageComponent","OS","ExpoImage","require","CloseIcon","createElement","source","uri","resizeMode","style","width","height","ChatHeader","onClose","onClearChat","styles","container","logoContainer","marginRight","title","buttonContainer","onPress","clearChatText","closeButton","create","padding","backgroundColor","justifyContent","flexDirection","alignItems","fontSize","fontWeight","color","borderRadius","closeIconText","textAlign","lineHeight","closeButtonText","textDecorationLine","gap"],"sourceRoot":"../../../src","sources":["components/ChatHeader.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,136 @@
1
+ import React from "react";
2
+ import { View, TextInput, TouchableOpacity, StyleSheet, Platform, Image } from "react-native";
3
+ // Use expo-image on native if available, fallback to RN Image
4
+ let ImageComponent = Image;
5
+ if (Platform.OS !== "web") {
6
+ try {
7
+ const ExpoImage = require("expo-image").Image;
8
+ if (ExpoImage) ImageComponent = ExpoImage;
9
+ } catch {
10
+ // expo-image not installed, use React Native Image
11
+ }
12
+ }
13
+ const SendIcon = ({
14
+ disabled,
15
+ isEmpty
16
+ }) => {
17
+ const isInactive = disabled || isEmpty;
18
+ return /*#__PURE__*/React.createElement(ImageComponent, {
19
+ source: {
20
+ uri: "https://cdn.vdbapp.com/ai/chat-widget/assets/img/up.svg"
21
+ },
22
+ resizeMode: "contain",
23
+ style: {
24
+ ...styles.buttonIcon,
25
+ tintColor: isInactive ? "#AAA" : "#FFF"
26
+ }
27
+ });
28
+ };
29
+ export const ChatInput = ({
30
+ value,
31
+ onChangeText,
32
+ onSend,
33
+ disabled,
34
+ placeholder,
35
+ theme,
36
+ inputRef
37
+ }) => {
38
+ const isInactive = disabled || value.trim() === "";
39
+ return /*#__PURE__*/React.createElement(View, {
40
+ style: [styles.container, Platform.OS === "web" ? styles.webShadow : styles.nativeShadow]
41
+ }, /*#__PURE__*/React.createElement(TextInput, {
42
+ ref: inputRef
43
+ // @ts-ignore - supported on web via react-native-web
44
+ ,
45
+ id: "chat-input",
46
+ style: [styles.input, styles.inputWeb],
47
+ placeholder: placeholder || "What are you looking for?",
48
+ placeholderTextColor: "#999",
49
+ value: value,
50
+ onChangeText: onChangeText,
51
+ onSubmitEditing: onSend,
52
+ editable: !disabled,
53
+ autoFocus: true
54
+ }), /*#__PURE__*/React.createElement(TouchableOpacity, {
55
+ style: {
56
+ ...styles.button,
57
+ backgroundColor: isInactive ? "#EDEDF2" : "#C000FF"
58
+ },
59
+ onPress: onSend,
60
+ disabled: disabled
61
+ }, /*#__PURE__*/React.createElement(SendIcon, {
62
+ disabled: disabled,
63
+ isEmpty: value.trim() === ""
64
+ })));
65
+ };
66
+ const styles = StyleSheet.create({
67
+ container: {
68
+ flexDirection: "row",
69
+ height: 48,
70
+ paddingHorizontal: 16,
71
+ paddingVertical: 0,
72
+ justifyContent: "space-between",
73
+ alignItems: "center",
74
+ alignSelf: "stretch",
75
+ borderRadius: 56,
76
+ backgroundColor: "#FFF",
77
+ margin: 8
78
+ },
79
+ webShadow: {
80
+ ...(Platform.OS === "web" ? {
81
+ boxShadow: "2px 8px 24px -6px rgba(55, 54, 64, 0.26)"
82
+ } : {})
83
+ },
84
+ nativeShadow: {
85
+ shadowColor: "#373640",
86
+ shadowOffset: {
87
+ width: 2,
88
+ height: 8
89
+ },
90
+ shadowOpacity: 0.26,
91
+ shadowRadius: 12,
92
+ elevation: 3
93
+ },
94
+ input: {
95
+ flex: 1,
96
+ color: "#4F4E57",
97
+ fontFamily: "Roboto",
98
+ fontSize: 14,
99
+ fontStyle: "normal",
100
+ fontWeight: "400",
101
+ lineHeight: 20,
102
+ minHeight: 20,
103
+ maxHeight: 120,
104
+ paddingHorizontal: 8,
105
+ paddingVertical: 0,
106
+ backgroundColor: "transparent",
107
+ borderWidth: 0
108
+ },
109
+ inputWeb: {
110
+ ...(Platform.OS === "web" ? {
111
+ outlineStyle: "none",
112
+ outlineWidth: 0,
113
+ boxShadow: "none"
114
+ } : {})
115
+ },
116
+ button: {
117
+ marginLeft: 8,
118
+ padding: 4,
119
+ justifyContent: "center",
120
+ alignItems: "center",
121
+ height: 40,
122
+ aspectRatio: 1,
123
+ borderRadius: 40,
124
+ backgroundColor: "#C000FF"
125
+ },
126
+ buttonIcon: {
127
+ height: 16,
128
+ width: 16
129
+ },
130
+ sendIconText: {
131
+ fontSize: 18,
132
+ fontWeight: "700",
133
+ textAlign: "center"
134
+ }
135
+ });
136
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","TextInput","TouchableOpacity","StyleSheet","Platform","Image","ImageComponent","OS","ExpoImage","require","SendIcon","disabled","isEmpty","isInactive","createElement","source","uri","resizeMode","style","styles","buttonIcon","tintColor","ChatInput","value","onChangeText","onSend","placeholder","theme","inputRef","trim","container","webShadow","nativeShadow","ref","id","input","inputWeb","placeholderTextColor","onSubmitEditing","editable","autoFocus","button","backgroundColor","onPress","create","flexDirection","height","paddingHorizontal","paddingVertical","justifyContent","alignItems","alignSelf","borderRadius","margin","boxShadow","shadowColor","shadowOffset","width","shadowOpacity","shadowRadius","elevation","flex","color","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","minHeight","maxHeight","borderWidth","outlineStyle","outlineWidth","marginLeft","padding","aspectRatio","sendIconText","textAlign"],"sourceRoot":"../../../src","sources":["components/ChatInput.tsx"],"mappings":"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","ignoreList":[]}