@buddy-technology/offer-component 1.5.0 → 1.7.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,41 @@
1
+ # [@buddy-technology/offer-component-v1.7.0](https://github.com/Buddy-Technology/ion-to-react/compare/@buddy-technology/offer-component-v1.6.0...@buddy-technology/offer-component-v1.7.0) (2026-02-03)
2
+
3
+
4
+ ### Features
5
+
6
+ * simplify PR deploy yml; test both react versions locally via yarn test ([b014286](https://github.com/Buddy-Technology/ion-to-react/commit/b014286fda1884b3b0c677ead990aca8a8074ecf))
7
+ * update peerDependencies to include React 19; new tests for version switching; Update @testing-library/react to v16.1.0; 8. Fully backward compatible with React 16.8+, 17, and 18 ([411576b](https://github.com/Buddy-Technology/ion-to-react/commit/411576b7e229f70c91f1f0c6ed2dccbd5e96db21))
8
+
9
+ # [@buddy-technology/offer-component-v1.7.0](https://github.com/Buddy-Technology/ion-to-react/compare/@buddy-technology/offer-component-v1.6.0...@buddy-technology/offer-component-v1.7.0) (Unreleased)
10
+
11
+ ### Features
12
+
13
+ * Add React 19 support to peerDependencies
14
+ * Add multi-version testing infrastructure for React 18 and 19
15
+ * Update @testing-library/react to v16.1.0 for React 19 compatibility
16
+
17
+ ### Notes
18
+
19
+ * Fully backward compatible with React 16.8+, 17, and 18
20
+ * No breaking changes for existing users
21
+ * CI now tests both React 18 and 19 in parallel
22
+
23
+ ---
24
+
25
+ # [@buddy-technology/offer-component-v1.6.0](https://github.com/Buddy-Technology/ion-to-react/compare/@buddy-technology/offer-component-v1.5.0...@buddy-technology/offer-component-v1.6.0) (2026-01-28)
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * bot callouts ([0075772](https://github.com/Buddy-Technology/ion-to-react/commit/00757729b761f6eb6371dcb9676f36ece5714971))
31
+ * eslint ts config ([15deb9e](https://github.com/Buddy-Technology/ion-to-react/commit/15deb9e4b15d89389dbf90a83fac1650f02bd67f))
32
+ * update interface ([d642cde](https://github.com/Buddy-Technology/ion-to-react/commit/d642cde171b6f6777aeeffad8e174ac36fdb5a79))
33
+
34
+
35
+ ### Features
36
+
37
+ * update loader script to handle config scripts ([fcdb2e4](https://github.com/Buddy-Technology/ion-to-react/commit/fcdb2e4ea5aeeba5f4fefef4b4022116ace9c4ec))
38
+
1
39
  # [@buddy-technology/offer-component-v1.5.0](https://github.com/Buddy-Technology/ion-to-react/compare/@buddy-technology/offer-component-v1.4.0...@buddy-technology/offer-component-v1.5.0) (2025-03-20)
2
40
 
3
41
 
package/README.md CHANGED
@@ -2,8 +2,28 @@
2
2
  ---
3
3
  React component for adding [Buddy's](https://buddy.insure) Insurance Gateway
4
4
 
5
+ ## Table of Contents
6
+ - [Requirements](#requirements)
7
+ - [Installation](#installation)
8
+ - [Basic Usage](#basic-usage)
9
+ - [Props](#props)
10
+ - [Configuration Files](#configuration-files)
11
+ - [Version 2 configuration files (Recommended)](#version-2-configuration-files-recommended)
12
+ - [Version 1 configuration files](#version-1-configuration-files)
13
+ - [View Types](#view-types)
14
+ - [Checkout](#checkout)
15
+ - [For client-side only apps](#for-client-side-only-apps)
16
+ - [For full stack apps](#for-full-stack-apps)
17
+ - [Pre-filling Data](#pre-filling-data)
18
+ - [Styling](#styling)
19
+ - [Color Palettes](#color-palettes)
20
+ - [Overrides](#overrides)
21
+ - [Classes and Components](#classes-and-components)
22
+ - [Capturing Data](#capturing-data)
23
+
5
24
  ## Requirements
6
- Contact [Buddy](mailto:partners@buddy.insure) to obtain a `partnerID` and compatible `ions` for your specific use case.
25
+ - React 16.8.0+
26
+ - Contact [Buddy](mailto:partners@buddy.insure) to obtain a `partnerID` and compatible `ions` for your specific use case.
7
27
 
8
28
  ---
9
29
  ## Installation
@@ -29,18 +49,95 @@ function App() {
29
49
  }
30
50
  export default App;
31
51
  ```
52
+ ---
53
+ ## Props
54
+
55
+ | Option Name | Type | Default | Description
56
+ | --- | --- | --- | --- |
57
+ | *partnerID | string | | The partnerID assigned to you from Buddy |
58
+ | *ion | string | | The ion ID for the product to be presented |
59
+ | stage | enum | "STAGING" | One of: `"STAGING"`, `"PRODUCTION"`. Set to `"STAGING"` (default) for testing and development. |
60
+ | configSrc | string | | The URL for pairing a configuration file with the offer element. |
61
+ | viewType | enum | `"paginated"` | Sets how the offer element is displayed. One of: `"paginated"`, `"single-form"`, `"offer-only"`. _See [View types](#view-types) for details._|
62
+ | data | object | | Customer or policy data to pre-load the offer with. Refer to specific ION documentation for the data structure. |
63
+ | theme | object | |The [theme](#styling) object for passing in styles and color palettes |
64
+ | onUserEvent | function | | A callback for tracking user behavioral data. See [Capturing Data](#capturing-data) for details. |
65
+ | includeCheckout | boolean | `true` | Toggles whether to render the secure checkout. |
66
+ | onOptIn | function | | The callback fired when a user opts into an offer. See Buddy's Partner API docs for details on how to complete the transaction.|
67
+ | onOptOut | function | | The callback fired when a user opts out of the offer. |
68
+
69
+ _*required_
70
+
71
+ ## Configuration Files
72
+
73
+ ### Version 2 configuration files (Recommended)
74
+ For version 2 configuration files (that utilize `Buddy.embedOptions`), simply pass in the URL of the file to the `configSrc` prop. Properties defined in a configuration file will be merged with any props defined in this implementation.
75
+
76
+ **EXAMPLE**
77
+ ```javascript
78
+ // config.js
79
+
80
+ const configTheme = {
81
+ baseTheme: 'base',
82
+ palette: 'base',
83
+ overrides: {
84
+ styles: {
85
+ h1: { color: 'blue' }
86
+ h2: { color: 'blue' }
87
+ }
88
+ },
89
+ };
90
+
91
+ window.Buddy.embedOptions.theme = configTheme // attach our theme to embedOptions.
92
+
93
+ ```
94
+ ```javascript
95
+ // React implementation
96
+
97
+ import React from 'react';
98
+ import BuddyOfferElement from '@buddy-technology/offer-component';
99
+
100
+ function App() {
101
+ const overrideConfigTheme = {
102
+ overrides: {
103
+ styles: {
104
+ h2: { color: 'red' }
105
+ }
106
+ }
107
+ };
108
+
109
+ return (
110
+ <div id="app">
111
+ <h1>My App</h1>
112
+ <BuddyOfferElement
113
+ ion="MY_ION"
114
+ partnerID="my-partner-id"
115
+ stage="staging"
116
+ configSrc="https://js.buddy.insure/config.js" // URL of our config file
117
+ theme={overrideConfigTheme} // deep merges our theme, h2's will now be red, but h1's are still blue.
118
+ />
119
+ </div>
120
+ );
121
+ }
122
+ export default App;
123
+ ```
124
+
125
+
126
+ ### Version 1 configuration files
127
+ NOTE: This feature is useful pairing configuration files utilizing the `config` variable pattern. For information on how to implement newer configs see: [Version 2 Configuration Files](#version-2-configuration-files-recommended).
128
+
129
+ For configuration files utilizing the `config` variable pattern, we need to first pre-load our script using the `useConfig` hook, then pass our options to the implementation.
32
130
 
33
- ## Combined with useConfig hook
34
131
  ```javascript
35
132
  import React from 'react';
36
133
  import BuddyOfferElement, { useConfig } from '@buddy-technology/offer-component';
37
134
 
38
135
  function App() {
39
- const { config, isLoading } = useConfig('https://config-domain.com/config.js');
136
+ const { config, isLoading } = useConfig('https://config-domain.com/config.js');
40
137
 
41
- if (isLoading || !config) {
42
- return null;
43
- }
138
+ if (isLoading || !config) {
139
+ return null;
140
+ }
44
141
 
45
142
  // grab relevant properties from config
46
143
  const theme = config.themeBase;
@@ -63,23 +160,6 @@ function App() {
63
160
  }
64
161
  export default App;
65
162
  ```
66
- ---
67
- ## Props
68
-
69
- | Option Name | Type | Default | Description
70
- | --- | --- | --- | --- |
71
- | *partnerID | string | | The partnerID assigned to you from Buddy |
72
- | *ion | string | | The ion ID for the product to be presented |
73
- | stage | enum | "STAGING" | One of: `"STAGING"`, `"PRODUCTION"`. Set to `"STAGING"` (default) for testing and development. |
74
- | viewType | enum | `"paginated"` | Sets how the offer element is displayed. One of: `"paginated"`, `"single-form"`, `"offer-only"`. _See [View types](#view-types) for details._|
75
- | data | object | | Customer or policy data to pre-load the offer with. Refer to specific ION documentation for the data structure. |
76
- | theme | object | |The [theme](#styling) object for passing in styles and color palettes |
77
- | onUserEvent | function | | A callback for tracking user behavioral data. See [Capturing Data](#capturing-data) for details. |
78
- | includeCheckout | boolean | `true` | Toggles whether to render the secure checkout. |
79
- | onOptIn | function | | The callback fired when a user opts into an offer. See Buddy's Partner API docs for details on how to complete the transaction.|
80
- | onOptOut | function | | The callback fired when a user opts out of the offer. |
81
- _*required_
82
-
83
163
  ---
84
164
  ## View Types
85
165
 
@@ -292,15 +372,15 @@ __Base__:
292
372
 
293
373
  __Buddy__:
294
374
 
295
- primary: '#DC5648',
296
- secondary: '#0A242D99',
297
- tertiary: '#46460E33',
298
- negative: '#D62719',
299
- positive: '#A3D9B1',
300
- textPrimary: '#0A242D',
301
- textSecondary: '#0A242D99',
302
- backgroundPrimary: 'linear-gradient(#D6F1F2, #F8F6D2)',
303
- backgroundSecondary: '#FBF9EF',
375
+ primary: '#DC5648',
376
+ secondary: '#0A242D99',
377
+ tertiary: '#46460E33',
378
+ negative: '#D62719',
379
+ positive: '#A3D9B1',
380
+ textPrimary: '#0A242D',
381
+ textSecondary: '#0A242D99',
382
+ backgroundPrimary: 'linear-gradient(#D6F1F2, #F8F6D2)',
383
+ backgroundSecondary: '#FBF9EF',
304
384
 
305
385
  ### Overrides
306
386
 
@@ -471,7 +551,7 @@ _data returned_
471
551
  | `error` | string | if unsuccessful, a message explaining the type of error encountered |
472
552
  | `timestamp` | number | the timestamp when the event occurred in milliseconds |
473
553
 
474
-
554
+
475
555
  #### `onFocus`
476
556
 
477
557
  Triggers when an input is focused
package/dist/index.js CHANGED
@@ -25,6 +25,17 @@ const SCRIPTS = {
25
25
  };
26
26
  const STAGES = Object.keys(SCRIPTS);
27
27
 
28
+ function _catch$1(body, recover) {
29
+ try {
30
+ var result = body();
31
+ } catch (e) {
32
+ return recover(e);
33
+ }
34
+ if (result && result.then) {
35
+ return result.then(void 0, recover);
36
+ }
37
+ return result;
38
+ }
28
39
  const defaultOptions = {
29
40
  stage: 'STAGING'
30
41
  };
@@ -84,80 +95,114 @@ const createOffer = options => {
84
95
  }
85
96
  }
86
97
  };
87
- const injectScript = options => {
88
- const finalOptions = {
89
- ...defaultOptions,
90
- ...options
91
- };
92
- const script = document.createElement('script');
93
- script.src = `${SCRIPTS[finalOptions.stage].URL}`;
94
- script.onload = () => createOffer(finalOptions);
95
- document.body.appendChild(script);
96
- return script;
97
- };
98
- let scriptPromise = null;
99
- const loadScript = options => {
100
- // Ensure that we only attempt to script once
101
- if (scriptPromise !== null) {
102
- return scriptPromise;
98
+ const asyncLoadScript = src => new Promise((resolve, reject) => {
99
+ const existingScript = findScript(src);
100
+ if (existingScript) {
101
+ // eslint-disable-next-line no-console
102
+ console.warn(`Script with src [${src}] is already loaded!`);
103
+ resolve(existingScript);
103
104
  }
104
- scriptPromise = new Promise((resolve, reject) => {
105
+ const script = document.createElement('script');
106
+ script.src = src;
107
+ script.onload = resolve;
108
+ script.onerror = () => {
109
+ // bad script, so let's remove it in case folks want to retry.
110
+ document.head.removeChild(script);
111
+ reject(new Error(`Failed to load script with src: [${src}].`));
112
+ };
113
+ document.head.appendChild(script);
114
+ });
115
+ const createScriptPromise = function (options) {
116
+ try {
117
+ let _exit;
105
118
  if (typeof window === 'undefined') {
106
119
  // Resolve to null when imported server side. This makes the module
107
120
  // safe to import in an isomorphic code base.
108
- resolve(null);
109
- return;
110
- }
111
- if (window.Buddy?.createOffer) {
112
- // eslint-disable-next-line no-console
113
- console.warn(EXISTING_SCRIPT_MESSAGE);
114
- window.Buddy?.createOffer(options);
115
- resolve(window.Buddy);
116
- return;
121
+ return Promise.resolve(null);
117
122
  }
118
- try {
119
- const requiredProps = ['ion', 'partnerID'];
120
- const missingRequiredProps = validatePropertiesOfObject(requiredProps, options);
121
- if (missingRequiredProps) {
122
- reject(new Error(missingRequiredProps));
123
- return;
124
- }
125
- if (!options?.stage) {
126
- // eslint-disable-next-line no-console
127
- console.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);
128
- }
129
- // If stage is passed, ensure it is one of the prescribed options.
130
- if (options?.stage && !STAGES.includes(options.stage)) {
131
- const msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received "${options.stage}."`;
132
- reject(new Error(msg));
133
- return;
134
- }
135
- let script = findOfferScript(options?.stage);
136
- if (script) {
137
- // eslint-disable-next-line no-console
138
- console.warn(EXISTING_SCRIPT_MESSAGE);
139
- if (window.Buddy?.createOffer) {
140
- resolve(window.Buddy);
141
- } else {
142
- reject(new Error('Buddy Offer Element not available'));
123
+ const finalOptions = {
124
+ ...defaultOptions,
125
+ ...options
126
+ };
127
+ return Promise.resolve(_catch$1(function () {
128
+ function _temp4(_result) {
129
+ if (_exit) return _result;
130
+ const requiredProps = ['ion', 'partnerID'];
131
+ const missingRequiredProps = validatePropertiesOfObject(requiredProps, options);
132
+ if (missingRequiredProps) {
133
+ throw new Error(missingRequiredProps);
134
+ }
135
+ if (!options?.stage) {
136
+ // eslint-disable-next-line no-console
137
+ console.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);
143
138
  }
144
- } else if (!script) {
145
- script = injectScript(options);
139
+ // If stage is passed, ensure it is one of the prescribed options.
140
+ // No existing loader script, so time to inject ours.
141
+ // if we have a config src, let's load that up too.
142
+ // Error out if any scripts fail to load. If someone meant to include a config, we treat that as a fatal issue.
143
+ if (options?.stage && !STAGES.includes(options.stage)) {
144
+ const msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received "${options.stage}."`;
145
+ throw new Error(msg);
146
+ }
147
+ const script = findOfferScript(options?.stage);
148
+ if (script) {
149
+ // eslint-disable-next-line no-console
150
+ console.warn(EXISTING_SCRIPT_MESSAGE);
151
+ if (window.Buddy?.createOffer) {
152
+ // createOffer will prevent any duplicate frames from mounting.
153
+ createOffer(finalOptions);
154
+ return window.Buddy;
155
+ }
156
+ // if we have a script loaded, but Buddy's not in the window, throw.
157
+ throw new Error('Buddy Offer Element not available');
158
+ }
159
+ const loaderSrc = `${SCRIPTS[finalOptions.stage].URL}`;
160
+ const scriptPromises = [asyncLoadScript(loaderSrc)];
161
+ if (finalOptions.configSrc) {
162
+ scriptPromises.push(asyncLoadScript(finalOptions.configSrc));
163
+ }
164
+ return Promise.resolve(Promise.all(scriptPromises)).then(function () {
165
+ createOffer(finalOptions);
166
+ return window.Buddy;
167
+ });
146
168
  }
147
- script.addEventListener('load', () => {
169
+ const _temp3 = function () {
148
170
  if (window.Buddy?.createOffer) {
149
- resolve(window.Buddy);
150
- } else {
151
- reject(new Error('Buddy Offer Element not available'));
171
+ function _temp2() {
172
+ // Instantiate the offer. createOffer will bail if frame is already mounted.
173
+ createOffer(finalOptions);
174
+ const _window$Buddy = window.Buddy;
175
+ _exit = 1;
176
+ return _window$Buddy;
177
+ }
178
+ // eslint-disable-next-line no-console
179
+ console.warn(EXISTING_SCRIPT_MESSAGE);
180
+ // Any config scripts might not actually be loaded though, so try and load.
181
+ const _temp = function () {
182
+ if (finalOptions.configSrc) {
183
+ // This helper function already checks if the script is loaded or not.
184
+ return Promise.resolve(asyncLoadScript(finalOptions.configSrc)).then(function () {});
185
+ }
186
+ }();
187
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
152
188
  }
153
- });
154
- script.addEventListener('error', () => {
155
- reject(new Error('Failed to load Buddy Offer Element'));
156
- });
157
- } catch (error) {
158
- reject(error);
159
- }
160
- });
189
+ }();
190
+ // if our createOffer method is available, then we're already instantiated.
191
+ return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
192
+ }, function (error) {
193
+ return Promise.reject(error);
194
+ }));
195
+ } catch (e) {
196
+ return Promise.reject(e);
197
+ }
198
+ };
199
+ let scriptPromise = null;
200
+ const loadScript = options => {
201
+ // Ensure that we only attempt to script once
202
+ if (scriptPromise !== null) {
203
+ return scriptPromise;
204
+ }
205
+ scriptPromise = createScriptPromise(options);
161
206
  return scriptPromise;
162
207
  };
163
208
  // This is used to clear our reference to the script promise when the component is unmounted.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst injectScript = (options: Record<string, any>) => {\n\tconst finalOptions = { ...defaultOptions, ...options };\n\tconst script = document.createElement('script');\n\tscript.src = `${SCRIPTS[finalOptions.stage].URL}`;\n\tscript.onload = () => createOffer(finalOptions);\n\tdocument.body.appendChild(script);\n\treturn script;\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = new Promise((resolve, reject) => {\n\t\tif (typeof window === 'undefined') {\n\t\t\t// Resolve to null when imported server side. This makes the module\n\t\t\t// safe to import in an isomorphic code base.\n\t\t\tresolve(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t(window as IWindow).Buddy?.createOffer(options);\n\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\t\tif (missingRequiredProps) {\n\t\t\t\treject(new Error(missingRequiredProps));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!options?.stage) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t\t}\n\n\t\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\t\treject(new Error(msg));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet script = findOfferScript(options?.stage);\n\n\t\t\tif (script) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t} else if (!script) {\n\t\t\t\tscript = injectScript(options);\n\t\t\t}\n\n\t\t\tscript.addEventListener('load', () => {\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscript.addEventListener('error', () => {\n\t\t\t\treject(new Error('Failed to load Buddy Offer Element'));\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n\n\treturn scriptPromise;\n};\n\n// This is used to clear our reference to the script promise when the component is unmounted.\nexport const clearScriptPromise = () => {\n\tscriptPromise = null;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount.current) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React, { useEffect } from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, clearScriptPromise, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tuseEffect(() => {\n\t\tconst getScript = async () => {\n\t\t\ttry {\n\t\t\t\tawait loadScript(options);\n\t\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t};\n\t\tgetScript();\n\t\treturn () => {\n\t\t\tclearScriptPromise();\n\t\t};\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","_ref","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","injectScript","finalOptions","script","createElement","onload","body","appendChild","scriptPromise","loadScript","Promise","resolve","reject","warn","requiredProps","missingRequiredProps","Error","msg","join","addEventListener","clearScriptPromise","useConfig","config","setConfig","useState","isLoading","setIsLoading","hasConfig","useEffect","removeChild","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","_temp","_catch","then","e","React","id"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow, BuddyOfferElementProps } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions: Partial<BuddyOfferElementProps> = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage!) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst asyncLoadScript = (src: string) => new Promise((resolve, reject) => {\n\tconst existingScript = findScript(src);\n\n\tif (existingScript) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`Script with src [${src}] is already loaded!`);\n\t\tresolve(existingScript);\n\t}\n\n\tconst script = document.createElement('script');\n\tscript.src = src;\n\tscript.onload = resolve;\n\tscript.onerror = () => {\n\t\t// bad script, so let's remove it in case folks want to retry.\n\t\tdocument.head.removeChild(script);\n\t\treject(new Error(`Failed to load script with src: [${src}].`));\n\t};\n\tdocument.head.appendChild(script);\n});\n\nconst createScriptPromise = async (options: Record<string, any>) => {\n\tif (typeof window === 'undefined') {\n\t\t// Resolve to null when imported server side. This makes the module\n\t\t// safe to import in an isomorphic code base.\n\t\treturn null;\n\t}\n\n\tconst finalOptions = { ...defaultOptions, ...options };\n\n\ttry {\n\t// if our createOffer method is available, then we're already instantiated.\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\n\t\t\t// Any config scripts might not actually be loaded though, so try and load.\n\t\t\tif (finalOptions.configSrc) {\n\t\t\t\t// This helper function already checks if the script is loaded or not.\n\t\t\t\tawait asyncLoadScript(finalOptions.configSrc);\n\t\t\t}\n\t\t\t// Instantiate the offer. createOffer will bail if frame is already mounted.\n\t\t\tcreateOffer(finalOptions);\n\t\t\treturn (window as IWindow).Buddy!;\n\t\t}\n\n\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\tif (missingRequiredProps) {\n\t\t\tthrow new Error(missingRequiredProps);\n\t\t}\n\n\t\tif (!options?.stage) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t}\n\n\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\tthrow new Error(msg);\n\t\t}\n\n\t\tconst script = findOfferScript(options?.stage);\n\n\t\tif (script) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t// createOffer will prevent any duplicate frames from mounting.\n\t\t\t\tcreateOffer(finalOptions);\n\t\t\t\treturn (window as IWindow).Buddy!;\n\t\t\t}\n\t\t\t// if we have a script loaded, but Buddy's not in the window, throw.\n\t\t\tthrow new Error('Buddy Offer Element not available');\n\t\t}\n\n\t\t// No existing loader script, so time to inject ours.\n\t\tconst loaderSrc = `${SCRIPTS[finalOptions.stage!].URL}`;\n\n\t\tconst scriptPromises = [asyncLoadScript(loaderSrc)];\n\n\t\t// if we have a config src, let's load that up too.\n\t\tif (finalOptions.configSrc) {\n\t\t\tscriptPromises.push(asyncLoadScript(finalOptions.configSrc));\n\t\t}\n\n\t\t// Error out if any scripts fail to load. If someone meant to include a config, we treat that as a fatal issue.\n\t\tawait Promise.all(scriptPromises);\n\t\tcreateOffer(finalOptions);\n\n\t\treturn (window as IWindow).Buddy!;\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = createScriptPromise(options);\n\n\treturn scriptPromise;\n};\n\n// This is used to clear our reference to the script promise when the component is unmounted.\nexport const clearScriptPromise = () => {\n\tscriptPromise = null;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount.current) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React, { useEffect } from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, clearScriptPromise, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tuseEffect(() => {\n\t\tconst getScript = async () => {\n\t\t\ttry {\n\t\t\t\tawait loadScript(options);\n\t\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t};\n\t\tgetScript();\n\t\treturn () => {\n\t\t\tclearScriptPromise();\n\t\t};\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","_ref","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","asyncLoadScript","Promise","resolve","reject","existingScript","warn","script","createElement","onload","onerror","head","removeChild","Error","appendChild","createScriptPromise","_exit","finalOptions","_catch","_temp4","_result","requiredProps","missingRequiredProps","msg","join","loaderSrc","scriptPromises","configSrc","push","all","then","_temp3","_temp2","_window$Buddy","_temp","e","scriptPromise","loadScript","clearScriptPromise","useConfig","config","setConfig","useState","isLoading","setIsLoading","hasConfig","useEffect","body","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","React","id"],"mappings":"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"}
@@ -84,81 +84,94 @@ const createOffer = options => {
84
84
  }
85
85
  }
86
86
  };
87
- const injectScript = options => {
88
- const finalOptions = _extends({}, defaultOptions, options);
87
+ const asyncLoadScript = src => new Promise((resolve, reject) => {
88
+ const existingScript = findScript(src);
89
+ if (existingScript) {
90
+ // eslint-disable-next-line no-console
91
+ console.warn(`Script with src [${src}] is already loaded!`);
92
+ resolve(existingScript);
93
+ }
89
94
  const script = document.createElement('script');
90
- script.src = `${SCRIPTS[finalOptions.stage].URL}`;
91
- script.onload = () => createOffer(finalOptions);
92
- document.body.appendChild(script);
93
- return script;
94
- };
95
- let scriptPromise = null;
96
- const loadScript = options => {
97
- // Ensure that we only attempt to script once
98
- if (scriptPromise !== null) {
99
- return scriptPromise;
95
+ script.src = src;
96
+ script.onload = resolve;
97
+ script.onerror = () => {
98
+ // bad script, so let's remove it in case folks want to retry.
99
+ document.head.removeChild(script);
100
+ reject(new Error(`Failed to load script with src: [${src}].`));
101
+ };
102
+ document.head.appendChild(script);
103
+ });
104
+ const createScriptPromise = async options => {
105
+ if (typeof window === 'undefined') {
106
+ // Resolve to null when imported server side. This makes the module
107
+ // safe to import in an isomorphic code base.
108
+ return null;
100
109
  }
101
- scriptPromise = new Promise((resolve, reject) => {
110
+ const finalOptions = _extends({}, defaultOptions, options);
111
+ try {
102
112
  var _window$Buddy;
103
- if (typeof window === 'undefined') {
104
- // Resolve to null when imported server side. This makes the module
105
- // safe to import in an isomorphic code base.
106
- resolve(null);
107
- return;
108
- }
113
+ // if our createOffer method is available, then we're already instantiated.
109
114
  if ((_window$Buddy = window.Buddy) != null && _window$Buddy.createOffer) {
110
- var _window$Buddy2;
111
115
  // eslint-disable-next-line no-console
112
116
  console.warn(EXISTING_SCRIPT_MESSAGE);
113
- (_window$Buddy2 = window.Buddy) == null || _window$Buddy2.createOffer(options);
114
- resolve(window.Buddy);
115
- return;
116
- }
117
- try {
118
- const requiredProps = ['ion', 'partnerID'];
119
- const missingRequiredProps = validatePropertiesOfObject(requiredProps, options);
120
- if (missingRequiredProps) {
121
- reject(new Error(missingRequiredProps));
122
- return;
123
- }
124
- if (!(options != null && options.stage)) {
125
- // eslint-disable-next-line no-console
126
- console.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);
127
- }
128
- // If stage is passed, ensure it is one of the prescribed options.
129
- if (options != null && options.stage && !STAGES.includes(options.stage)) {
130
- const msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received "${options.stage}."`;
131
- reject(new Error(msg));
132
- return;
117
+ // Any config scripts might not actually be loaded though, so try and load.
118
+ if (finalOptions.configSrc) {
119
+ // This helper function already checks if the script is loaded or not.
120
+ await asyncLoadScript(finalOptions.configSrc);
133
121
  }
134
- let script = findOfferScript(options == null ? void 0 : options.stage);
135
- if (script) {
136
- var _window$Buddy3;
137
- // eslint-disable-next-line no-console
138
- console.warn(EXISTING_SCRIPT_MESSAGE);
139
- if ((_window$Buddy3 = window.Buddy) != null && _window$Buddy3.createOffer) {
140
- resolve(window.Buddy);
141
- } else {
142
- reject(new Error('Buddy Offer Element not available'));
143
- }
144
- } else if (!script) {
145
- script = injectScript(options);
122
+ // Instantiate the offer. createOffer will bail if frame is already mounted.
123
+ createOffer(finalOptions);
124
+ return window.Buddy;
125
+ }
126
+ const requiredProps = ['ion', 'partnerID'];
127
+ const missingRequiredProps = validatePropertiesOfObject(requiredProps, options);
128
+ if (missingRequiredProps) {
129
+ throw new Error(missingRequiredProps);
130
+ }
131
+ if (!(options != null && options.stage)) {
132
+ // eslint-disable-next-line no-console
133
+ console.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);
134
+ }
135
+ // If stage is passed, ensure it is one of the prescribed options.
136
+ if (options != null && options.stage && !STAGES.includes(options.stage)) {
137
+ const msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received "${options.stage}."`;
138
+ throw new Error(msg);
139
+ }
140
+ const script = findOfferScript(options == null ? void 0 : options.stage);
141
+ if (script) {
142
+ var _window$Buddy2;
143
+ // eslint-disable-next-line no-console
144
+ console.warn(EXISTING_SCRIPT_MESSAGE);
145
+ if ((_window$Buddy2 = window.Buddy) != null && _window$Buddy2.createOffer) {
146
+ // createOffer will prevent any duplicate frames from mounting.
147
+ createOffer(finalOptions);
148
+ return window.Buddy;
146
149
  }
147
- script.addEventListener('load', () => {
148
- var _window$Buddy4;
149
- if ((_window$Buddy4 = window.Buddy) != null && _window$Buddy4.createOffer) {
150
- resolve(window.Buddy);
151
- } else {
152
- reject(new Error('Buddy Offer Element not available'));
153
- }
154
- });
155
- script.addEventListener('error', () => {
156
- reject(new Error('Failed to load Buddy Offer Element'));
157
- });
158
- } catch (error) {
159
- reject(error);
150
+ // if we have a script loaded, but Buddy's not in the window, throw.
151
+ throw new Error('Buddy Offer Element not available');
160
152
  }
161
- });
153
+ // No existing loader script, so time to inject ours.
154
+ const loaderSrc = `${SCRIPTS[finalOptions.stage].URL}`;
155
+ const scriptPromises = [asyncLoadScript(loaderSrc)];
156
+ // if we have a config src, let's load that up too.
157
+ if (finalOptions.configSrc) {
158
+ scriptPromises.push(asyncLoadScript(finalOptions.configSrc));
159
+ }
160
+ // Error out if any scripts fail to load. If someone meant to include a config, we treat that as a fatal issue.
161
+ await Promise.all(scriptPromises);
162
+ createOffer(finalOptions);
163
+ return window.Buddy;
164
+ } catch (error) {
165
+ return Promise.reject(error);
166
+ }
167
+ };
168
+ let scriptPromise = null;
169
+ const loadScript = options => {
170
+ // Ensure that we only attempt to script once
171
+ if (scriptPromise !== null) {
172
+ return scriptPromise;
173
+ }
174
+ scriptPromise = createScriptPromise(options);
162
175
  return scriptPromise;
163
176
  };
164
177
  // This is used to clear our reference to the script promise when the component is unmounted.
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.mjs","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst injectScript = (options: Record<string, any>) => {\n\tconst finalOptions = { ...defaultOptions, ...options };\n\tconst script = document.createElement('script');\n\tscript.src = `${SCRIPTS[finalOptions.stage].URL}`;\n\tscript.onload = () => createOffer(finalOptions);\n\tdocument.body.appendChild(script);\n\treturn script;\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = new Promise((resolve, reject) => {\n\t\tif (typeof window === 'undefined') {\n\t\t\t// Resolve to null when imported server side. This makes the module\n\t\t\t// safe to import in an isomorphic code base.\n\t\t\tresolve(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t(window as IWindow).Buddy?.createOffer(options);\n\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\t\tif (missingRequiredProps) {\n\t\t\t\treject(new Error(missingRequiredProps));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!options?.stage) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t\t}\n\n\t\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\t\treject(new Error(msg));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet script = findOfferScript(options?.stage);\n\n\t\t\tif (script) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t} else if (!script) {\n\t\t\t\tscript = injectScript(options);\n\t\t\t}\n\n\t\t\tscript.addEventListener('load', () => {\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscript.addEventListener('error', () => {\n\t\t\t\treject(new Error('Failed to load Buddy Offer Element'));\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n\n\treturn scriptPromise;\n};\n\n// This is used to clear our reference to the script promise when the component is unmounted.\nexport const clearScriptPromise = () => {\n\tscriptPromise = null;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount.current) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React, { useEffect } from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, clearScriptPromise, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tuseEffect(() => {\n\t\tconst getScript = async () => {\n\t\t\ttry {\n\t\t\t\tawait loadScript(options);\n\t\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t};\n\t\tgetScript();\n\t\treturn () => {\n\t\t\tclearScriptPromise();\n\t\t};\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","injectScript","finalOptions","_extends","script","createElement","onload","body","appendChild","scriptPromise","loadScript","Promise","resolve","reject","_window$Buddy","_window$Buddy2","warn","requiredProps","missingRequiredProps","Error","msg","join","_window$Buddy3","addEventListener","_window$Buddy4","clearScriptPromise","useConfig","config","setConfig","useState","isLoading","setIsLoading","hasConfig","useEffect","removeChild","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","React","id"],"mappings":"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"}
1
+ {"version":3,"file":"index.modern.mjs","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow, BuddyOfferElementProps } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions: Partial<BuddyOfferElementProps> = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage!) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst asyncLoadScript = (src: string) => new Promise((resolve, reject) => {\n\tconst existingScript = findScript(src);\n\n\tif (existingScript) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`Script with src [${src}] is already loaded!`);\n\t\tresolve(existingScript);\n\t}\n\n\tconst script = document.createElement('script');\n\tscript.src = src;\n\tscript.onload = resolve;\n\tscript.onerror = () => {\n\t\t// bad script, so let's remove it in case folks want to retry.\n\t\tdocument.head.removeChild(script);\n\t\treject(new Error(`Failed to load script with src: [${src}].`));\n\t};\n\tdocument.head.appendChild(script);\n});\n\nconst createScriptPromise = async (options: Record<string, any>) => {\n\tif (typeof window === 'undefined') {\n\t\t// Resolve to null when imported server side. This makes the module\n\t\t// safe to import in an isomorphic code base.\n\t\treturn null;\n\t}\n\n\tconst finalOptions = { ...defaultOptions, ...options };\n\n\ttry {\n\t// if our createOffer method is available, then we're already instantiated.\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\n\t\t\t// Any config scripts might not actually be loaded though, so try and load.\n\t\t\tif (finalOptions.configSrc) {\n\t\t\t\t// This helper function already checks if the script is loaded or not.\n\t\t\t\tawait asyncLoadScript(finalOptions.configSrc);\n\t\t\t}\n\t\t\t// Instantiate the offer. createOffer will bail if frame is already mounted.\n\t\t\tcreateOffer(finalOptions);\n\t\t\treturn (window as IWindow).Buddy!;\n\t\t}\n\n\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\tif (missingRequiredProps) {\n\t\t\tthrow new Error(missingRequiredProps);\n\t\t}\n\n\t\tif (!options?.stage) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t}\n\n\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\tthrow new Error(msg);\n\t\t}\n\n\t\tconst script = findOfferScript(options?.stage);\n\n\t\tif (script) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t// createOffer will prevent any duplicate frames from mounting.\n\t\t\t\tcreateOffer(finalOptions);\n\t\t\t\treturn (window as IWindow).Buddy!;\n\t\t\t}\n\t\t\t// if we have a script loaded, but Buddy's not in the window, throw.\n\t\t\tthrow new Error('Buddy Offer Element not available');\n\t\t}\n\n\t\t// No existing loader script, so time to inject ours.\n\t\tconst loaderSrc = `${SCRIPTS[finalOptions.stage!].URL}`;\n\n\t\tconst scriptPromises = [asyncLoadScript(loaderSrc)];\n\n\t\t// if we have a config src, let's load that up too.\n\t\tif (finalOptions.configSrc) {\n\t\t\tscriptPromises.push(asyncLoadScript(finalOptions.configSrc));\n\t\t}\n\n\t\t// Error out if any scripts fail to load. If someone meant to include a config, we treat that as a fatal issue.\n\t\tawait Promise.all(scriptPromises);\n\t\tcreateOffer(finalOptions);\n\n\t\treturn (window as IWindow).Buddy!;\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = createScriptPromise(options);\n\n\treturn scriptPromise;\n};\n\n// This is used to clear our reference to the script promise when the component is unmounted.\nexport const clearScriptPromise = () => {\n\tscriptPromise = null;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount.current) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React, { useEffect } from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, clearScriptPromise, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tuseEffect(() => {\n\t\tconst getScript = async () => {\n\t\t\ttry {\n\t\t\t\tawait loadScript(options);\n\t\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t};\n\t\tgetScript();\n\t\treturn () => {\n\t\t\tclearScriptPromise();\n\t\t};\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","asyncLoadScript","Promise","resolve","reject","existingScript","warn","script","createElement","onload","onerror","head","removeChild","Error","appendChild","createScriptPromise","finalOptions","_extends","_window$Buddy","configSrc","requiredProps","missingRequiredProps","msg","join","_window$Buddy2","loaderSrc","scriptPromises","push","all","scriptPromise","loadScript","clearScriptPromise","useConfig","config","setConfig","useState","isLoading","setIsLoading","hasConfig","useEffect","body","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","React","id"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  type ConfigObject = Record<string, any>;
2
2
  interface BuddyObject {
3
3
  createOffer: (options: any) => void;
4
+ embedOptions: Partial<BuddyOfferElementProps>;
4
5
  updateOffer: (options: any) => void;
5
6
  config?: ConfigObject;
6
7
  }
@@ -65,6 +66,7 @@ interface IEndorsementError {
65
66
  interface BuddyOfferElementProps {
66
67
  ion: string;
67
68
  partnerID: string;
69
+ configSrc?: string;
68
70
  data?: DataObject;
69
71
  debug?: boolean;
70
72
  includeCheckout?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxC,UAAU,WAAW;IACpB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAA;CACrB;AAED,UAAU,OAAQ,SAAQ,MAAM;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,KAAK,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnE,KAAK,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;AAC5D,UAAU,UAAU;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC7B;AAED,UAAU,WAAW;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,cAAc;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,UAAU,WAAW;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,UAAU,YAAY;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,UAAU,SAAS;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;CAChB;AAED,UAAU,oBAAoB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;CACjB;AAED,KAAK,qBAAqB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,KAAK,eAAe,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAC/D,KAAK,mBAAmB,GAAG,MAAM,IAAI,CAAC;AACtC,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEhD,UAAU,iBAAiB;IAC1B,CAAC,CAAC,EAAE,MAAM,GAAG;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;CACF;AAED,UAAU,sBAAsB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC;;OAEG;IACH,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAE1C,IAAI,CAAC,EAAE,oBAAoB,GAAG,cAAc,GAAG,MAAM,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,YAAY,EACX,WAAW,EACX,sBAAsB,EACtB,YAAY,EACZ,OAAO,GACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,OAAO,EAAU,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,KAAK,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC;AA0BpC,eAAO,MAAM,UAAU,QAAS,MAAM,kCAGrC,CAAC;AAEF,eAAO,MAAM,eAAe,WAAW,OAAO,kCAI7C,CAAC;AAEF,eAAO,MAAM,WAAW,YAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SASvD,CAAC;AAwBF,eAAO,MAAM,UAAU,YAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCA0EtD,CAAC;AAGF,eAAO,MAAM,kBAAkB,YAE9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,OAAO,EAAU,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAmC,MAAM,cAAc,CAAC;AAEjF,KAAK,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC;AA0BpC,eAAO,MAAM,UAAU,QAAS,MAAM,kCAGrC,CAAC;AAEF,eAAO,MAAM,eAAe,WAAW,OAAO,kCAI7C,CAAC;AAEF,eAAO,MAAM,WAAW,YAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SASvD,CAAC;AAgHF,eAAO,MAAM,UAAU,YAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAStD,CAAC;AAGF,eAAO,MAAM,kBAAkB,YAE9B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buddy-technology/offer-component",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "author": "Buddy Technology",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.modern.mjs",
@@ -43,7 +43,7 @@
43
43
  "devDependencies": {
44
44
  "@testing-library/dom": "^10.4.0",
45
45
  "@testing-library/jest-dom": "^6.4.8",
46
- "@testing-library/react": "^16.0.0",
46
+ "@testing-library/react": "^16.1.0",
47
47
  "@testing-library/user-event": "^14.5.2",
48
48
  "@types/jest": "^29.5.10",
49
49
  "eslint-config-custom": "*",
@@ -54,8 +54,8 @@
54
54
  "typescript": "^5.3.2"
55
55
  },
56
56
  "peerDependencies": {
57
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
58
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
57
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
58
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
59
59
  },
60
60
  "publishConfig": {
61
61
  "access": "public"