@brainfish-ai/widgets-initiator 1.0.0 → 1.0.2

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.
@@ -0,0 +1,64 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <title>Build Test</title>
6
+ <script type="module">
7
+ import Brainfish from 'http://localhost:6006/web.js'
8
+ // import Brainfish from 'https://cdn.jsdelivr.net/npm/@brainfish-ai/widgets-initiator@1.0.1/dist/web.js'
9
+
10
+ // searchbar
11
+ // Brainfish.Widgets.init({ widgetKey: "bf_search_widget_3tBCyvJ3eGipqUxJcOQbVyvNeHf7Dhe0dZtqF4" });
12
+ // sidebar
13
+ Brainfish.Widgets.init({
14
+ widgetKey: "bf_search_widget_pOxcrTX3aprz1JRzhQzoAp6IWqjy8WH3U0h6aM", overrides: {
15
+ "bodyActionButtons": [
16
+ {
17
+ "icon": "Calendar",
18
+ "type": "callback",
19
+ "label": "Book a Demo",
20
+ "value": () => { window.Brainfish.HelpWidget.close('#root'); console.log('test2') }
21
+ }
22
+ ]
23
+ }
24
+ });
25
+
26
+ </script>
27
+ <script src="https://unpkg.com/@phosphor-icons/web" async></script>
28
+ <style>
29
+ .brainfish-trigger-button {
30
+ position: fixed;
31
+ border-radius: 24px 4px 16px 24px;
32
+ height: 32px !important;
33
+ padding: 0 10px;
34
+ width: unset !important;
35
+ bottom: 40px;
36
+ right: 40px;
37
+ background-color: #501ec4 !important;
38
+ color: #FFF;
39
+ text-align: center;
40
+ box-shadow: 2px 2px 3px #999;
41
+ cursor: pointer;
42
+ z-index: 9995;
43
+ border: none;
44
+ display: flex;
45
+ align-items: center;
46
+ }
47
+
48
+ .ph {
49
+ font-size: 18px;
50
+ margin-right: 5px;
51
+ }
52
+ </style>
53
+ </head>
54
+
55
+ <body>
56
+ <!-- <brainfish-search-widget /> -->
57
+
58
+ <script type="text/javascript" src="https://assets.calendly.com/assets/external/widget.js"></script>
59
+
60
+ <button class="brainfish-trigger-button" onClick="Brainfish.HelpWidget.open('brainfish-trigger-button')"><i
61
+ class="ph ph-question"></i>Help</button>
62
+ </body>
63
+
64
+ </html>
package/dist/web.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var t,e;!function(t){t.Sidebar="sidebar",t.Searchbar="searchbar"}(t||(t={})),t.Sidebar,t.Searchbar,function(t){t.LINK="link",t.CALLBACK="callback",t.EMAIL="email",t.PHONE="phone"}(e||(e={}));const i="https://app.brainfi.sh";function n(t){return t.map((t=>t.type===e.CALLBACK?{...t,value:new Function(`return ${t.value}`)()}:t))}const o={Widgets:{init:async({widgetKey:e})=>{const o=`${i}/api/searchWidgets.getConfigByKey`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","api-key":e}}).then((t=>t.json())).catch((t=>console.log("Error loading widget config",t)));if(!s)return void console.log("Error loading widget config");const a=(({config:t,apiKey:e})=>(t.settings?.bodyActionButtons&&(t.settings.bodyActionButtons=n(t.settings.bodyActionButtons)),t.settings?.footerActionButtons&&(t.settings.footerActionButtons=n(t.settings.footerActionButtons)),t.settings?.nextBestActions&&(t.settings.nextBestActions=n(t.settings.nextBestActions)),{...t,apiHost:`${i}`,widgetMode:t.widgetType,apiKey:e}))({config:s.config,apiKey:e}),r=a.version||"latest",{default:c}=await import(`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${r}/dist/web.js`);switch(a.widgetType){case t.Searchbar:case"Search":c.SearchWidget.initStandard(a);break;case t.Sidebar:case"slide-over":c.HelpWidget.initPopup(a);break;default:return}}}};o&&(t=>{"undefined"!=typeof window&&(window.Brainfish?window.Brainfish={...window.Brainfish,...t}:window.Brainfish={...t})})(o),module.exports=o;
1
+ "use strict";var t,n;!function(t){t.Sidebar="sidebar",t.Searchbar="searchbar"}(t||(t={})),t.Sidebar,t.Searchbar,function(t){t.LINK="link",t.CALLBACK="callback",t.EMAIL="email",t.PHONE="phone"}(n||(n={}));const e="https://app.brainfi.sh";function i(t){return t.map((t=>t.type===n.CALLBACK?{...t,value:new Function(`return ${t.value}`)()}:t))}const o={Widgets:{init:async({widgetKey:n,overrides:o})=>{const s=`${e}/api/searchWidgets.getConfigByKey`,a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","api-key":n}}).then((t=>t.json())).catch((t=>console.log("Error loading widget config",t)));if(!a)return void console.log("Error loading widget config");const c=(({config:t,apiKey:n})=>(t.settings?.bodyActionButtons&&(t.settings.bodyActionButtons=i(t.settings.bodyActionButtons)),t.settings?.footerActionButtons&&(t.settings.footerActionButtons=i(t.settings.footerActionButtons)),t.settings?.nextBestActions&&(t.settings.nextBestActions=i(t.settings.nextBestActions)),{...t,apiHost:`${e}`,widgetMode:t.widgetType,apiKey:n}))({config:a.config,apiKey:n}),r=c.version||"latest";if(o){const{nextBestActions:t,bodyActionButtons:n,footerActionButtons:e}=o,i=(t=[],n)=>{const e=new Map(t.map((t=>[t.label,t])));return n.forEach((t=>e.set(t.label,t))),Array.from(e.values())};c.settings={...c.settings,nextBestActions:t?i(c.settings?.nextBestActions,t):c.settings?.nextBestActions,bodyActionButtons:n?i(c.settings?.bodyActionButtons,n):c.settings?.bodyActionButtons,footerActionButtons:e?i(c.settings?.footerActionButtons,e):c.settings?.footerActionButtons}}const{default:d}=await import(`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${r}/dist/web.js`);switch(c.widgetType){case t.Searchbar:case"Search":d.SearchWidget.initStandard(c);break;case t.Sidebar:case"slide-over":d.HelpWidget.initPopup(c);break;default:return}}}};o&&(t=>{"undefined"!=typeof window&&(window.Brainfish?window.Brainfish={...window.Brainfish,...t}:window.Brainfish={...t})})(o),module.exports=o;
2
2
  //# sourceMappingURL=web.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.cjs.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport { Config, CallbackAction, Action } from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({ widgetKey }: { widgetKey: string }) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"aAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCKDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyEMM,EAAY,CAChBC,QAAS,CAAEC,KA5CAC,OAASC,gBACd,MAAAC,EAAW,GAAGf,qCAEdgB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWL,KAGZM,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAhDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB7B,EAClC0B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB9B,EACpC0B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkB/B,EAChC0B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGjC,IACZkC,WAAYP,EAAOQ,WACnBP,WAsBaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQd,IAEJuB,EAAUV,EAAOU,SAAW,UAG1BC,QAASC,SAAiBC,OAChC,4DAA4DH,iBAG9D,OAAQV,EAAOQ,YACb,KAAKM,EAAkB1C,UACvB,IAAK,SACIwC,EAAAG,aAAaC,aAAahB,GACjC,MACF,KAAKc,EAAkB3C,QACvB,IAAK,aACIyC,EAAAK,WAAWC,UAAUlB,GAC5B,MACF,QACE,OACJ,IAOEjB,GDlGmC,CAACA,IACd,oBAAXoC,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcrC,GAG7CoC,OAAOC,UAAY,IAAKrC,GAC3B,EC2FHsC,CAA+BtC"}
1
+ {"version":3,"file":"web.cjs.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({\n widgetKey,\n overrides,\n}: {\n widgetKey: string;\n overrides?: Pick<\n Settings,\n 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'\n >;\n}) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n if (overrides) {\n const { nextBestActions, bodyActionButtons, footerActionButtons } =\n overrides;\n\n const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n ) => {\n // Create a map from the configActions array, using the action label as the key\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n\n // Update the actionMap with the overrideActions.\n // If an action with the same label already exists in the map, it will be updated.\n // If it doesn't exist, it will be added to the map.\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n\n // Convert the map back to an array and return it\n return Array.from(actionMap.values());\n };\n\n config.settings = {\n ...config.settings,\n nextBestActions: nextBestActions\n ? updateActions(config.settings?.nextBestActions, nextBestActions)\n : config.settings?.nextBestActions,\n bodyActionButtons: bodyActionButtons\n ? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)\n : config.settings?.bodyActionButtons,\n footerActionButtons: footerActionButtons\n ? updateActions(\n config.settings?.footerActionButtons,\n footerActionButtons\n )\n : config.settings?.footerActionButtons,\n };\n }\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","overrides","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","updateActions","configActions","overrideActions","actionMap","Map","label","forEach","set","Array","from","values","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"aAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCUDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyHMM,EAAY,CAChBC,QAAS,CAAEC,KA5FAC,OACXC,YACAC,gBAQM,MAAAC,EAAW,GAAGhB,qCAEdiB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWN,KAGZO,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAzDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB9B,EAClC2B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB/B,EACpC2B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkBhC,EAChC2B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGlC,IACZmC,WAAYP,EAAOQ,WACnBP,WA+BaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQf,IAEJwB,EAAUV,EAAOU,SAAW,SAElC,GAAIvB,EAAW,CACb,MAAMkB,gBAAEA,EAAAF,kBAAiBA,EAAmBC,oBAAAA,GAC1CjB,EAEIwB,EAAgB,CACpBC,EAA6C,GAC7CC,KAGA,MAAMC,EAAY,IAAIC,IACpBH,EAAcrC,KAAKC,GAAW,CAACA,EAAOwC,MAAOxC,MAS/C,OAHgBqC,EAAAI,SAASzC,GAAWsC,EAAUI,IAAI1C,EAAOwC,MAAOxC,KAGzD2C,MAAMC,KAAKN,EAAUO,SAAQ,EAGtCrB,EAAOE,SAAW,IACbF,EAAOE,SACVG,gBAAiBA,EACbM,EAAcX,EAAOE,UAAUG,gBAAiBA,GAChDL,EAAOE,UAAUG,gBACrBF,kBAAmBA,EACfQ,EAAcX,EAAOE,UAAUC,kBAAmBA,GAClDH,EAAOE,UAAUC,kBACrBC,oBAAqBA,EACjBO,EACEX,EAAOE,UAAUE,oBACjBA,GAEFJ,EAAOE,UAAUE,oBAEzB,CAGA,MAAQkB,QAASC,SAAiBC,OAChC,4DAA4Dd,iBAG9D,OAAQV,EAAOQ,YACb,KAAKiB,EAAkBtD,UACvB,IAAK,SACIoD,EAAAG,aAAaC,aAAa3B,GACjC,MACF,KAAKyB,EAAkBvD,QACvB,IAAK,aACIqD,EAAAK,WAAWC,UAAU7B,GAC5B,MACF,QACE,OACJ,IAOElB,GDvJmC,CAACA,IACd,oBAAXgD,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcjD,GAG7CgD,OAAOC,UAAY,IAAKjD,GAC3B,ECgJHkD,CAA+BlD"}
package/dist/web.js CHANGED
@@ -1,2 +1,2 @@
1
- var t,e;!function(t){t.Sidebar="sidebar",t.Searchbar="searchbar"}(t||(t={})),t.Sidebar,t.Searchbar,function(t){t.LINK="link",t.CALLBACK="callback",t.EMAIL="email",t.PHONE="phone"}(e||(e={}));const i="https://app.brainfi.sh";function n(t){return t.map((t=>t.type===e.CALLBACK?{...t,value:new Function(`return ${t.value}`)()}:t))}const o={Widgets:{init:async({widgetKey:e})=>{const o=`${i}/api/searchWidgets.getConfigByKey`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","api-key":e}}).then((t=>t.json())).catch((t=>console.log("Error loading widget config",t)));if(!s)return void console.log("Error loading widget config");const a=(({config:t,apiKey:e})=>(t.settings?.bodyActionButtons&&(t.settings.bodyActionButtons=n(t.settings.bodyActionButtons)),t.settings?.footerActionButtons&&(t.settings.footerActionButtons=n(t.settings.footerActionButtons)),t.settings?.nextBestActions&&(t.settings.nextBestActions=n(t.settings.nextBestActions)),{...t,apiHost:`${i}`,widgetMode:t.widgetType,apiKey:e}))({config:s.config,apiKey:e}),r=a.version||"latest",{default:c}=await import(`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${r}/dist/web.js`);switch(a.widgetType){case t.Searchbar:case"Search":c.SearchWidget.initStandard(a);break;case t.Sidebar:case"slide-over":c.HelpWidget.initPopup(a);break;default:return}}}};o&&(t=>{"undefined"!=typeof window&&(window.Brainfish?window.Brainfish={...window.Brainfish,...t}:window.Brainfish={...t})})(o);export{o as default};
1
+ var t,n;!function(t){t.Sidebar="sidebar",t.Searchbar="searchbar"}(t||(t={})),t.Sidebar,t.Searchbar,function(t){t.LINK="link",t.CALLBACK="callback",t.EMAIL="email",t.PHONE="phone"}(n||(n={}));const e="https://app.brainfi.sh";function i(t){return t.map((t=>t.type===n.CALLBACK?{...t,value:new Function(`return ${t.value}`)()}:t))}const o={Widgets:{init:async({widgetKey:n,overrides:o})=>{const s=`${e}/api/searchWidgets.getConfigByKey`,a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","api-key":n}}).then((t=>t.json())).catch((t=>console.log("Error loading widget config",t)));if(!a)return void console.log("Error loading widget config");const c=(({config:t,apiKey:n})=>(t.settings?.bodyActionButtons&&(t.settings.bodyActionButtons=i(t.settings.bodyActionButtons)),t.settings?.footerActionButtons&&(t.settings.footerActionButtons=i(t.settings.footerActionButtons)),t.settings?.nextBestActions&&(t.settings.nextBestActions=i(t.settings.nextBestActions)),{...t,apiHost:`${e}`,widgetMode:t.widgetType,apiKey:n}))({config:a.config,apiKey:n}),r=c.version||"latest";if(o){const{nextBestActions:t,bodyActionButtons:n,footerActionButtons:e}=o,i=(t=[],n)=>{const e=new Map(t.map((t=>[t.label,t])));return n.forEach((t=>e.set(t.label,t))),Array.from(e.values())};c.settings={...c.settings,nextBestActions:t?i(c.settings?.nextBestActions,t):c.settings?.nextBestActions,bodyActionButtons:n?i(c.settings?.bodyActionButtons,n):c.settings?.bodyActionButtons,footerActionButtons:e?i(c.settings?.footerActionButtons,e):c.settings?.footerActionButtons}}const{default:d}=await import(`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${r}/dist/web.js`);switch(c.widgetType){case t.Searchbar:case"Search":d.SearchWidget.initStandard(c);break;case t.Sidebar:case"slide-over":d.HelpWidget.initPopup(c);break;default:return}}}};o&&(t=>{"undefined"!=typeof window&&(window.Brainfish?window.Brainfish={...window.Brainfish,...t}:window.Brainfish={...t})})(o);export{o as default};
2
2
  //# sourceMappingURL=web.js.map
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport { Config, CallbackAction, Action } from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({ widgetKey }: { widgetKey: string }) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"AAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCKDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyEMM,EAAY,CAChBC,QAAS,CAAEC,KA5CAC,OAASC,gBACd,MAAAC,EAAW,GAAGf,qCAEdgB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWL,KAGZM,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAhDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB7B,EAClC0B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB9B,EACpC0B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkB/B,EAChC0B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGjC,IACZkC,WAAYP,EAAOQ,WACnBP,WAsBaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQd,IAEJuB,EAAUV,EAAOU,SAAW,UAG1BC,QAASC,SAAiBC,OAChC,4DAA4DH,iBAG9D,OAAQV,EAAOQ,YACb,KAAKM,EAAkB1C,UACvB,IAAK,SACIwC,EAAAG,aAAaC,aAAahB,GACjC,MACF,KAAKc,EAAkB3C,QACvB,IAAK,aACIyC,EAAAK,WAAWC,UAAUlB,GAC5B,MACF,QACE,OACJ,IAOEjB,GDlGmC,CAACA,IACd,oBAAXoC,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcrC,GAG7CoC,OAAOC,UAAY,IAAKrC,GAC3B,EC2FHsC,CAA+BtC"}
1
+ {"version":3,"file":"web.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({\n widgetKey,\n overrides,\n}: {\n widgetKey: string;\n overrides?: Pick<\n Settings,\n 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'\n >;\n}) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n if (overrides) {\n const { nextBestActions, bodyActionButtons, footerActionButtons } =\n overrides;\n\n const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n ) => {\n // Create a map from the configActions array, using the action label as the key\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n\n // Update the actionMap with the overrideActions.\n // If an action with the same label already exists in the map, it will be updated.\n // If it doesn't exist, it will be added to the map.\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n\n // Convert the map back to an array and return it\n return Array.from(actionMap.values());\n };\n\n config.settings = {\n ...config.settings,\n nextBestActions: nextBestActions\n ? updateActions(config.settings?.nextBestActions, nextBestActions)\n : config.settings?.nextBestActions,\n bodyActionButtons: bodyActionButtons\n ? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)\n : config.settings?.bodyActionButtons,\n footerActionButtons: footerActionButtons\n ? updateActions(\n config.settings?.footerActionButtons,\n footerActionButtons\n )\n : config.settings?.footerActionButtons,\n };\n }\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","overrides","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","updateActions","configActions","overrideActions","actionMap","Map","label","forEach","set","Array","from","values","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"AAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCUDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyHMM,EAAY,CAChBC,QAAS,CAAEC,KA5FAC,OACXC,YACAC,gBAQM,MAAAC,EAAW,GAAGhB,qCAEdiB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWN,KAGZO,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAzDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB9B,EAClC2B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB/B,EACpC2B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkBhC,EAChC2B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGlC,IACZmC,WAAYP,EAAOQ,WACnBP,WA+BaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQf,IAEJwB,EAAUV,EAAOU,SAAW,SAElC,GAAIvB,EAAW,CACb,MAAMkB,gBAAEA,EAAAF,kBAAiBA,EAAmBC,oBAAAA,GAC1CjB,EAEIwB,EAAgB,CACpBC,EAA6C,GAC7CC,KAGA,MAAMC,EAAY,IAAIC,IACpBH,EAAcrC,KAAKC,GAAW,CAACA,EAAOwC,MAAOxC,MAS/C,OAHgBqC,EAAAI,SAASzC,GAAWsC,EAAUI,IAAI1C,EAAOwC,MAAOxC,KAGzD2C,MAAMC,KAAKN,EAAUO,SAAQ,EAGtCrB,EAAOE,SAAW,IACbF,EAAOE,SACVG,gBAAiBA,EACbM,EAAcX,EAAOE,UAAUG,gBAAiBA,GAChDL,EAAOE,UAAUG,gBACrBF,kBAAmBA,EACfQ,EAAcX,EAAOE,UAAUC,kBAAmBA,GAClDH,EAAOE,UAAUC,kBACrBC,oBAAqBA,EACjBO,EACEX,EAAOE,UAAUE,oBACjBA,GAEFJ,EAAOE,UAAUE,oBAEzB,CAGA,MAAQkB,QAASC,SAAiBC,OAChC,4DAA4Dd,iBAG9D,OAAQV,EAAOQ,YACb,KAAKiB,EAAkBtD,UACvB,IAAK,SACIoD,EAAAG,aAAaC,aAAa3B,GACjC,MACF,KAAKyB,EAAkBvD,QACvB,IAAK,aACIqD,EAAAK,WAAWC,UAAU7B,GAC5B,MACF,QACE,OACJ,IAOElB,GDvJmC,CAACA,IACd,oBAAXgD,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcjD,GAG7CgD,OAAOC,UAAY,IAAKjD,GAC3B,ECgJHkD,CAA+BlD"}
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "@brainfish-ai/widgets-initiator",
3
- "version": "1.0.0",
4
- "main": "dist/index.js",
5
- "types": "dist/index.d.ts",
3
+ "version": "1.0.2",
4
+ "main": "dist/web.js",
6
5
  "description": "Brainfish Widgets Initiator",
7
6
  "type": "module",
8
7
  "private": false,
@@ -27,6 +26,7 @@
27
26
  "vite-plugin-solid": "^2.7.2"
28
27
  },
29
28
  "dependencies": {
29
+ "@brainfish-ai/search-widget": "^0.4.1",
30
30
  "@brainfish-ai/widgets-common": "^1.0.3",
31
31
  "@fingerprintjs/fingerprintjs": "^4.2.1",
32
32
  "lodash": "^4.17.21",
package/src/web.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  // web.ts
2
2
  // entry point for web component
3
3
  import * as Common from '@brainfish-ai/widgets-common';
4
- import { Config, CallbackAction, Action } from '@brainfish-ai/widgets-common';
4
+ import {
5
+ Config,
6
+ CallbackAction,
7
+ Action,
8
+ Settings,
9
+ } from '@brainfish-ai/widgets-common';
5
10
 
6
11
  const API_HOST = import.meta.env.VITE_API_HOST;
7
12
 
@@ -49,7 +54,16 @@ const transformConfig = ({
49
54
  };
50
55
  };
51
56
 
52
- const init = async ({ widgetKey }: { widgetKey: string }) => {
57
+ const init = async ({
58
+ widgetKey,
59
+ overrides,
60
+ }: {
61
+ widgetKey: string;
62
+ overrides?: Pick<
63
+ Settings,
64
+ 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'
65
+ >;
66
+ }) => {
53
67
  const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;
54
68
 
55
69
  const configResponse = await fetch(endpoint, {
@@ -73,6 +87,45 @@ const init = async ({ widgetKey }: { widgetKey: string }) => {
73
87
  });
74
88
  const version = config.version || 'latest';
75
89
 
90
+ if (overrides) {
91
+ const { nextBestActions, bodyActionButtons, footerActionButtons } =
92
+ overrides;
93
+
94
+ const updateActions = (
95
+ configActions: (Action | CallbackAction)[] = [],
96
+ overrideActions: (Action | CallbackAction)[]
97
+ ) => {
98
+ // Create a map from the configActions array, using the action label as the key
99
+ const actionMap = new Map(
100
+ configActions.map((action) => [action.label, action])
101
+ );
102
+
103
+ // Update the actionMap with the overrideActions.
104
+ // If an action with the same label already exists in the map, it will be updated.
105
+ // If it doesn't exist, it will be added to the map.
106
+ overrideActions.forEach((action) => actionMap.set(action.label, action));
107
+
108
+ // Convert the map back to an array and return it
109
+ return Array.from(actionMap.values());
110
+ };
111
+
112
+ config.settings = {
113
+ ...config.settings,
114
+ nextBestActions: nextBestActions
115
+ ? updateActions(config.settings?.nextBestActions, nextBestActions)
116
+ : config.settings?.nextBestActions,
117
+ bodyActionButtons: bodyActionButtons
118
+ ? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)
119
+ : config.settings?.bodyActionButtons,
120
+ footerActionButtons: footerActionButtons
121
+ ? updateActions(
122
+ config.settings?.footerActionButtons,
123
+ footerActionButtons
124
+ )
125
+ : config.settings?.footerActionButtons,
126
+ };
127
+ }
128
+
76
129
  // import the widget based on the version from cdn.jsdelivr.net
77
130
  const { default: widget } = await import(
78
131
  `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`