flowboard-react 0.6.0 → 0.6.1
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/README.md +4 -4
- package/lib/module/Flowboard.js +15 -11
- package/lib/module/Flowboard.js.map +1 -1
- package/lib/module/core/apiConfig.js +47 -0
- package/lib/module/core/apiConfig.js.map +1 -0
- package/lib/module/core/resolverService.js +33 -37
- package/lib/module/core/resolverService.js.map +1 -1
- package/lib/typescript/src/Flowboard.d.ts +2 -4
- package/lib/typescript/src/Flowboard.d.ts.map +1 -1
- package/lib/typescript/src/core/apiConfig.d.ts +6 -0
- package/lib/typescript/src/core/apiConfig.d.ts.map +1 -0
- package/lib/typescript/src/core/resolverService.d.ts +8 -5
- package/lib/typescript/src/core/resolverService.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types/flowboard.d.ts +2 -0
- package/lib/typescript/src/types/flowboard.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Flowboard.ts +16 -14
- package/src/core/apiConfig.ts +59 -0
- package/src/core/resolverService.ts +40 -41
- package/src/index.tsx +1 -0
- package/src/types/flowboard.ts +3 -0
package/README.md
CHANGED
|
@@ -44,8 +44,7 @@ import { Flowboard, FlowboardProvider } from 'flowboard-react';
|
|
|
44
44
|
export default function App() {
|
|
45
45
|
React.useEffect(() => {
|
|
46
46
|
Flowboard.init({
|
|
47
|
-
|
|
48
|
-
bundleId: 'com.your.app',
|
|
47
|
+
apiToken: 'YOUR_BEARER_TOKEN',
|
|
49
48
|
debug: true,
|
|
50
49
|
});
|
|
51
50
|
}, []);
|
|
@@ -75,6 +74,7 @@ Launch a specific onboarding by ID (without replacing default cached onboarding
|
|
|
75
74
|
```tsx
|
|
76
75
|
await Flowboard.launchOnboardingById('YOUR_ONBOARDING_ID', {
|
|
77
76
|
locale: 'fr_FR',
|
|
77
|
+
version: 'draft',
|
|
78
78
|
onOnboardEnd: (formData) => {
|
|
79
79
|
console.log('Specific flow completed:', formData);
|
|
80
80
|
},
|
|
@@ -89,9 +89,9 @@ await Flowboard.reinit();
|
|
|
89
89
|
|
|
90
90
|
## API
|
|
91
91
|
|
|
92
|
-
- `Flowboard.init({
|
|
92
|
+
- `Flowboard.init({ apiToken, debug, enableAnalytics })`
|
|
93
93
|
- `Flowboard.launchOnboarding({ customScreenBuilder, customActionBuilder, onOnboardEnd, onStepChange, enableAnalytics, alwaysRestart, resumeProgress })`
|
|
94
|
-
- `Flowboard.launchOnboardingById(onboardingId, { locale, customScreenBuilder, customActionBuilder, onOnboardEnd, onStepChange, enableAnalytics, alwaysRestart, resumeProgress })`
|
|
94
|
+
- `Flowboard.launchOnboardingById(onboardingId, { locale, version, customScreenBuilder, customActionBuilder, onOnboardEnd, onStepChange, enableAnalytics, alwaysRestart, resumeProgress })`
|
|
95
95
|
- `Flowboard.reinit()`
|
|
96
96
|
- `FlowboardProvider` (required to host modal flow)
|
|
97
97
|
|
package/lib/module/Flowboard.js
CHANGED
|
@@ -6,8 +6,7 @@ import { ResolverService } from "./core/resolverService.js";
|
|
|
6
6
|
import { OnboardingRepository } from "./core/onboardingRepository.js";
|
|
7
7
|
import { AnalyticsManager } from "./core/analyticsManager.js";
|
|
8
8
|
export class Flowboard {
|
|
9
|
-
static
|
|
10
|
-
static bundleId = null;
|
|
9
|
+
static apiToken = null;
|
|
11
10
|
static debug = false;
|
|
12
11
|
static repository = new OnboardingRepository();
|
|
13
12
|
static service = new ResolverService();
|
|
@@ -18,10 +17,13 @@ export class Flowboard {
|
|
|
18
17
|
return () => Flowboard.listeners.delete(listener);
|
|
19
18
|
}
|
|
20
19
|
static async init(params) {
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const apiToken = params.apiToken.trim();
|
|
21
|
+
if (!apiToken) {
|
|
22
|
+
throw new Error('apiToken must be a non-empty string');
|
|
23
|
+
}
|
|
24
|
+
Flowboard.apiToken = apiToken;
|
|
23
25
|
Flowboard.debug = params.debug ?? false;
|
|
24
|
-
Flowboard.log(
|
|
26
|
+
Flowboard.log('Initialized with API token.');
|
|
25
27
|
try {
|
|
26
28
|
const clientContext = await ClientContext.create();
|
|
27
29
|
AnalyticsManager.instance.configure({
|
|
@@ -41,7 +43,7 @@ export class Flowboard {
|
|
|
41
43
|
}
|
|
42
44
|
static async launchOnboarding(options = {}) {
|
|
43
45
|
Flowboard.log('Attempting to launch onboarding...');
|
|
44
|
-
if (!Flowboard.
|
|
46
|
+
if (!Flowboard.apiToken) {
|
|
45
47
|
throw new Error('Flowboard.init() must be called before launchOnboarding');
|
|
46
48
|
}
|
|
47
49
|
await Flowboard.configureAnalyticsForLaunch(options.enableAnalytics);
|
|
@@ -76,7 +78,7 @@ export class Flowboard {
|
|
|
76
78
|
}
|
|
77
79
|
static async launchOnboardingById(onboardingId, options = {}) {
|
|
78
80
|
Flowboard.log(`Attempting to launch onboarding by id: ${onboardingId}`);
|
|
79
|
-
if (!Flowboard.
|
|
81
|
+
if (!Flowboard.apiToken) {
|
|
80
82
|
throw new Error('Flowboard.init() must be called before launchOnboardingById');
|
|
81
83
|
}
|
|
82
84
|
const normalizedOnboardingId = onboardingId.trim();
|
|
@@ -89,7 +91,9 @@ export class Flowboard {
|
|
|
89
91
|
try {
|
|
90
92
|
data = await Flowboard.service.fetchOnboardingById({
|
|
91
93
|
onboardingId: normalizedOnboardingId,
|
|
92
|
-
locale
|
|
94
|
+
locale,
|
|
95
|
+
apiToken: Flowboard.apiToken,
|
|
96
|
+
version: options.version ?? 'live'
|
|
93
97
|
});
|
|
94
98
|
} catch (error) {
|
|
95
99
|
Flowboard.log(`Failed to load onboarding by id: ${String(error)}`);
|
|
@@ -166,15 +170,15 @@ export class Flowboard {
|
|
|
166
170
|
}
|
|
167
171
|
static async fetchAndSave() {
|
|
168
172
|
const startTime = Date.now();
|
|
169
|
-
if (!Flowboard.
|
|
173
|
+
if (!Flowboard.apiToken) {
|
|
170
174
|
throw new Error('Flowboard not initialized. Call Flowboard.init() first.');
|
|
171
175
|
}
|
|
172
176
|
try {
|
|
173
177
|
const context = await ClientContext.create();
|
|
174
|
-
Flowboard.log(`Fetching onboarding JSON for installId: ${context.installId} |
|
|
178
|
+
Flowboard.log(`Fetching onboarding JSON for installId: ${context.installId} | bundleId: ${context.bundleId}`);
|
|
175
179
|
const json = await Flowboard.service.fetchOnboardingJson({
|
|
176
180
|
context,
|
|
177
|
-
|
|
181
|
+
apiToken: Flowboard.apiToken
|
|
178
182
|
});
|
|
179
183
|
Flowboard.log('Fetch successful. Saving to cache.');
|
|
180
184
|
await Flowboard.repository.saveOnboardingJson(json);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Alert","ClientContext","ResolverService","OnboardingRepository","AnalyticsManager","Flowboard","
|
|
1
|
+
{"version":3,"names":["Alert","ClientContext","ResolverService","OnboardingRepository","AnalyticsManager","Flowboard","apiToken","debug","repository","service","initPromise","listeners","Set","subscribe","listener","add","delete","init","params","trim","Error","log","clientContext","create","instance","configure","enabled","enableAnalytics","context","error","String","initialize","reinit","clearLocalCaches","fetchAndSave","launchOnboarding","options","configureAnalyticsForLaunch","data","getOnboardingJson","alert","launchResolvedOnboarding","launchOnboardingById","onboardingId","normalizedOnboardingId","locale","resolveLocale","fetchOnboardingById","version","shouldResumeProgress","resumeProgress","alwaysRestart","clearProgress","initialStep","initialFormData","flowId","flow_id","savedStep","getProgressStepForFlow","savedFormData","getProgressFormDataForFlow","undefined","screens","Array","isArray","length","maxIndex","Object","keys","emitLaunch","clientContextSnapshot","requestedLocale","normalized","cached","startSession","flowData","startTime","Date","now","installId","bundleId","json","fetchOnboardingJson","saveOnboardingJson","duration","trackOnboardLoaded","durationMs","Promise","all","clearOnboardingJson","payload","forEach","message","console"],"sourceRoot":"../../src","sources":["Flowboard.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,aAAa,QAAQ,yBAAsB;AACpD,SAASC,eAAe,QAAQ,2BAAwB;AACxD,SAASC,oBAAoB,QAAQ,gCAA6B;AAClE,SAASC,gBAAgB,QAAQ,4BAAyB;AAgB1D,OAAO,MAAMC,SAAS,CAAC;EACrB,OAAeC,QAAQ,GAAkB,IAAI;EAC7C,OAAeC,KAAK,GAAG,KAAK;EAC5B,OAAeC,UAAU,GAAG,IAAIL,oBAAoB,CAAC,CAAC;EACtD,OAAeM,OAAO,GAAG,IAAIP,eAAe,CAAC,CAAC;EAC9C,OAAeQ,WAAW,GAAyB,IAAI;EACvD,OAAeC,SAAS,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAEpD,OAAOC,SAASA,CAACC,QAAwB,EAAc;IACrDT,SAAS,CAACM,SAAS,CAACI,GAAG,CAACD,QAAQ,CAAC;IACjC,OAAO,MAAMT,SAAS,CAACM,SAAS,CAACK,MAAM,CAACF,QAAQ,CAAC;EACnD;EAEA,aAAaG,IAAIA,CAACC,MAIjB,EAAiB;IAChB,MAAMZ,QAAQ,GAAGY,MAAM,CAACZ,QAAQ,CAACa,IAAI,CAAC,CAAC;IACvC,IAAI,CAACb,QAAQ,EAAE;MACb,MAAM,IAAIc,KAAK,CAAC,qCAAqC,CAAC;IACxD;IAEAf,SAAS,CAACC,QAAQ,GAAGA,QAAQ;IAC7BD,SAAS,CAACE,KAAK,GAAGW,MAAM,CAACX,KAAK,IAAI,KAAK;IAEvCF,SAAS,CAACgB,GAAG,CAAC,6BAA6B,CAAC;IAE5C,IAAI;MACF,MAAMC,aAAa,GAAG,MAAMrB,aAAa,CAACsB,MAAM,CAAC,CAAC;MAClDnB,gBAAgB,CAACoB,QAAQ,CAACC,SAAS,CAAC;QAClCC,OAAO,EAAER,MAAM,CAACS,eAAe,IAAI,IAAI;QACvCC,OAAO,EAAEN;MACX,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOO,KAAK,EAAE;MACdxB,SAAS,CAACgB,GAAG,CAAC,kCAAkCS,MAAM,CAACD,KAAK,CAAC,EAAE,CAAC;IAClE;IAEAxB,SAAS,CAACK,WAAW,GAAGL,SAAS,CAAC0B,UAAU,CAAC,CAAC;EAChD;EAEA,aAAaC,MAAMA,CAAA,EAAkB;IACnC3B,SAAS,CAACgB,GAAG,CAAC,oCAAoC,CAAC;IACnD,MAAMhB,SAAS,CAAC4B,gBAAgB,CAAC,CAAC;IAClC5B,SAAS,CAACK,WAAW,GAAGL,SAAS,CAAC6B,YAAY,CAAC,CAAC;IAChD,MAAM7B,SAAS,CAACK,WAAW;EAC7B;EAEA,aAAayB,gBAAgBA,CAC3BC,OAA+B,GAAG,CAAC,CAAC,EACrB;IACf/B,SAAS,CAACgB,GAAG,CAAC,oCAAoC,CAAC;IACnD,IAAI,CAAChB,SAAS,CAACC,QAAQ,EAAE;MACvB,MAAM,IAAIc,KAAK,CACb,yDACF,CAAC;IACH;IAEA,MAAMf,SAAS,CAACgC,2BAA2B,CAACD,OAAO,CAACT,eAAe,CAAC;IAEpE,IAAIW,IAAI,GAAG,MAAMjC,SAAS,CAACG,UAAU,CAAC+B,iBAAiB,CAAC,CAAC;IAEzD,IAAI,CAACD,IAAI,EAAE;MACTjC,SAAS,CAACgB,GAAG,CAAC,kDAAkD,CAAC;MACjE,IAAIhB,SAAS,CAACK,WAAW,EAAE;QACzB,IAAI;UACF,MAAML,SAAS,CAACK,WAAW;QAC7B,CAAC,CAAC,OAAOmB,KAAK,EAAE;UACdxB,SAAS,CAACgB,GAAG,CAAC,sCAAsCS,MAAM,CAACD,KAAK,CAAC,EAAE,CAAC;QACtE;MACF;MACAS,IAAI,GAAG,MAAMjC,SAAS,CAACG,UAAU,CAAC+B,iBAAiB,CAAC,CAAC;MAErD,IAAI,CAACD,IAAI,EAAE;QACTjC,SAAS,CAACgB,GAAG,CAAC,+CAA+C,CAAC;QAC9D,IAAI;UACF,MAAMhB,SAAS,CAAC6B,YAAY,CAAC,CAAC;UAC9BI,IAAI,GAAG,MAAMjC,SAAS,CAACG,UAAU,CAAC+B,iBAAiB,CAAC,CAAC;QACvD,CAAC,CAAC,OAAOV,KAAK,EAAE;UACdxB,SAAS,CAACgB,GAAG,CAAC,uBAAuBS,MAAM,CAACD,KAAK,CAAC,EAAE,CAAC;UACrD7B,KAAK,CAACwC,KAAK,CAAC,2BAA2B,EAAEV,MAAM,CAACD,KAAK,CAAC,CAAC;UACvD;QACF;MACF;IACF;IAEA,IAAI,CAACS,IAAI,EAAE;MACTjC,SAAS,CAACgB,GAAG,CAAC,iCAAiC,CAAC;MAChD;IACF;IAEA,MAAMhB,SAAS,CAACoC,wBAAwB,CAACH,IAAI,EAAEF,OAAO,CAAC;EACzD;EAEA,aAAaM,oBAAoBA,CAC/BC,YAAoB,EACpBP,OAAmC,GAAG,CAAC,CAAC,EACzB;IACf/B,SAAS,CAACgB,GAAG,CAAC,0CAA0CsB,YAAY,EAAE,CAAC;IACvE,IAAI,CAACtC,SAAS,CAACC,QAAQ,EAAE;MACvB,MAAM,IAAIc,KAAK,CACb,6DACF,CAAC;IACH;IAEA,MAAMwB,sBAAsB,GAAGD,YAAY,CAACxB,IAAI,CAAC,CAAC;IAClD,IAAI,CAACyB,sBAAsB,EAAE;MAC3B,MAAM,IAAIxB,KAAK,CAAC,yCAAyC,CAAC;IAC5D;IAEA,MAAMf,SAAS,CAACgC,2BAA2B,CAACD,OAAO,CAACT,eAAe,CAAC;IAEpE,MAAMkB,MAAM,GAAG,MAAMxC,SAAS,CAACyC,aAAa,CAACV,OAAO,CAACS,MAAM,CAAC;IAE5D,IAAIP,IAAmB;IACvB,IAAI;MACFA,IAAI,GAAG,MAAMjC,SAAS,CAACI,OAAO,CAACsC,mBAAmB,CAAC;QACjDJ,YAAY,EAAEC,sBAAsB;QACpCC,MAAM;QACNvC,QAAQ,EAAED,SAAS,CAACC,QAAQ;QAC5B0C,OAAO,EAAEZ,OAAO,CAACY,OAAO,IAAI;MAC9B,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOnB,KAAK,EAAE;MACdxB,SAAS,CAACgB,GAAG,CAAC,oCAAoCS,MAAM,CAACD,KAAK,CAAC,EAAE,CAAC;MAClE7B,KAAK,CAACwC,KAAK,CAAC,2BAA2B,EAAEV,MAAM,CAACD,KAAK,CAAC,CAAC;MACvD;IACF;IAEA,MAAMxB,SAAS,CAACoC,wBAAwB,CAACH,IAAI,EAAEF,OAAO,CAAC;EACzD;EAEA,aAAqBK,wBAAwBA,CAC3CH,IAAmB,EACnBF,OAA+B,EAChB;IACf,MAAMa,oBAAoB,GACxBb,OAAO,CAACc,cAAc,KAAK,IAAI,IAAId,OAAO,CAACe,aAAa,KAAK,IAAI;IAEnE,IAAIf,OAAO,CAACe,aAAa,IAAI,CAACF,oBAAoB,EAAE;MAClD,MAAM5C,SAAS,CAACG,UAAU,CAAC4C,aAAa,CAAC,CAAC;IAC5C;IAEA,IAAIC,WAAW,GAAG,CAAC;IACnB,IAAIC,eAAoC,GAAG,CAAC,CAAC;IAE7C,IAAIL,oBAAoB,EAAE;MACxB,MAAMM,MAAM,GAAGjB,IAAI,CAACkB,OAA6B;MACjD,IAAID,MAAM,EAAE;QACV,MAAME,SAAS,GAAG,MAAMpD,SAAS,CAACG,UAAU,CAACkD,sBAAsB,CACjEH,MACF,CAAC;QACD,MAAMI,aAAa,GACjB,MAAMtD,SAAS,CAACG,UAAU,CAACoD,0BAA0B,CAACL,MAAM,CAAC;QAC/D,IAAIE,SAAS,KAAK,IAAI,IAAIA,SAAS,KAAKI,SAAS,EAAE;UACjD,MAAMC,OAAO,GAAGC,KAAK,CAACC,OAAO,CAAC1B,IAAI,CAACwB,OAAO,CAAC,GAAGxB,IAAI,CAACwB,OAAO,GAAG,EAAE;UAC/D,IAAIA,OAAO,CAACG,MAAM,GAAG,CAAC,EAAE;YACtB,MAAMC,QAAQ,GAAGJ,OAAO,CAACG,MAAM,GAAG,CAAC;YACnC,IAAIR,SAAS,IAAI,CAAC,EAAEJ,WAAW,GAAG,CAAC,CAAC,KAC/B,IAAII,SAAS,IAAIK,OAAO,CAACG,MAAM,EAAEZ,WAAW,GAAGa,QAAQ,CAAC,KACxDb,WAAW,GAAGI,SAAS;UAC9B;QACF;QACA,IAAIE,aAAa,IAAIQ,MAAM,CAACC,IAAI,CAACT,aAAa,CAAC,CAACM,MAAM,GAAG,CAAC,EAAE;UAC1DX,eAAe,GAAG;YAAE,GAAGK;UAAc,CAAC;QACxC;MACF;IACF;IAEAtD,SAAS,CAACgB,GAAG,CAAC,8BAA8BiB,IAAI,CAACkB,OAAO,IAAI,EAAE,EAAE,CAAC;IACjEnD,SAAS,CAACgE,UAAU,CAAC;MACnB/B,IAAI;MACJF,OAAO;MACPiB,WAAW;MACXC;IACF,CAAC,CAAC;EACJ;EAEA,aAAqBjB,2BAA2BA,CAC9CV,eAAoC,EACrB;IACf,IAAI;MACF,MAAMC,OAAO,GACXxB,gBAAgB,CAACoB,QAAQ,CAAC8C,qBAAqB,KAC9C,MAAMrE,aAAa,CAACsB,MAAM,CAAC,CAAC,CAAC;MAChCnB,gBAAgB,CAACoB,QAAQ,CAACC,SAAS,CAAC;QAClCC,OAAO,EAAEC,eAAe,IAAI,IAAI;QAChCC;MACF,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdxB,SAAS,CAACgB,GAAG,CACX,6CAA6CS,MAAM,CAACD,KAAK,CAAC,EAC5D,CAAC;IACH;EACF;EAEA,aAAqBiB,aAAaA,CAChCyB,eAAmC,EAClB;IACjB,MAAMC,UAAU,GAAGD,eAAe,EAAEpD,IAAI,CAAC,CAAC;IAC1C,IAAIqD,UAAU,EAAE;MACd,OAAOA,UAAU;IACnB;IAEA,MAAM5C,OAAO,GACXxB,gBAAgB,CAACoB,QAAQ,CAAC8C,qBAAqB,KAC9C,MAAMrE,aAAa,CAACsB,MAAM,CAAC,CAAC,CAAC;IAEhC,OAAOK,OAAO,CAACiB,MAAM,IAAI,OAAO;EAClC;EAEA,aAAqBd,UAAUA,CAAA,EAAkB;IAC/C1B,SAAS,CAACgB,GAAG,CAAC,yBAAyB,CAAC;IACxC,MAAMoD,MAAM,GAAG,MAAMpE,SAAS,CAACG,UAAU,CAAC+B,iBAAiB,CAAC,CAAC;IAC7D,IAAIkC,MAAM,EAAE;MACVpE,SAAS,CAACgB,GAAG,CAAC,iCAAiC,CAAC;MAChDjB,gBAAgB,CAACoB,QAAQ,CAACkD,YAAY,CAAC;QAAEC,QAAQ,EAAEF;MAAO,CAAC,CAAC;MAC5D;IACF;IAEApE,SAAS,CAACgB,GAAG,CAAC,+CAA+C,CAAC;IAC9D,MAAMhB,SAAS,CAAC6B,YAAY,CAAC,CAAC;EAChC;EAEA,aAAqBA,YAAYA,CAAA,EAAkB;IACjD,MAAM0C,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAACzE,SAAS,CAACC,QAAQ,EAAE;MACvB,MAAM,IAAIc,KAAK,CACb,yDACF,CAAC;IACH;IAEA,IAAI;MACF,MAAMQ,OAAO,GAAG,MAAM3B,aAAa,CAACsB,MAAM,CAAC,CAAC;MAC5ClB,SAAS,CAACgB,GAAG,CACX,2CAA2CO,OAAO,CAACmD,SAAS,gBAAgBnD,OAAO,CAACoD,QAAQ,EAC9F,CAAC;MAED,MAAMC,IAAI,GAAG,MAAM5E,SAAS,CAACI,OAAO,CAACyE,mBAAmB,CAAC;QACvDtD,OAAO;QACPtB,QAAQ,EAAED,SAAS,CAACC;MACtB,CAAC,CAAC;MAEFD,SAAS,CAACgB,GAAG,CAAC,oCAAoC,CAAC;MACnD,MAAMhB,SAAS,CAACG,UAAU,CAAC2E,kBAAkB,CAACF,IAAI,CAAC;MAEnD7E,gBAAgB,CAACoB,QAAQ,CAACkD,YAAY,CAAC;QAAEC,QAAQ,EAAEM;MAAK,CAAC,CAAC;MAE1D,MAAMG,QAAQ,GAAGP,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,SAAS;MACvCxE,gBAAgB,CAACoB,QAAQ,CAAC6D,kBAAkB,CAAC;QAC3CC,UAAU,EAAEF,QAAQ;QACpBX,MAAM,EAAE;MACV,CAAC,CAAC;IACJ,CAAC,CAAC,OAAO5C,KAAK,EAAE;MACdxB,SAAS,CAACgB,GAAG,CAAC,mCAAmCS,MAAM,CAACD,KAAK,CAAC,EAAE,CAAC;MACjE,MAAMA,KAAK;IACb;EACF;EAEA,aAAqBI,gBAAgBA,CAAA,EAAkB;IACrD,MAAMsD,OAAO,CAACC,GAAG,CAAC,CAChBnF,SAAS,CAACG,UAAU,CAAC4C,aAAa,CAAC,CAAC,EACpC/C,SAAS,CAACG,UAAU,CAACiF,mBAAmB,CAAC,CAAC,CAC3C,CAAC;EACJ;EAEA,OAAepB,UAAUA,CAACqB,OAAsB,EAAQ;IACtDrF,SAAS,CAACM,SAAS,CAACgF,OAAO,CAAE7E,QAAQ,IAAKA,QAAQ,CAAC4E,OAAO,CAAC,CAAC;EAC9D;EAEA,OAAerE,GAAGA,CAACuE,OAAe,EAAQ;IACxC,IAAIvF,SAAS,CAACE,KAAK,EAAE;MACnBsF,OAAO,CAACxE,GAAG,CAAC,yBAAyBuE,OAAO,EAAE,CAAC;IACjD;EACF;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const DEFAULT_API_BASE_URL = 'api.flow-board.co';
|
|
4
|
+
const DEFAULT_API_VERSION = 'v0';
|
|
5
|
+
function trimTrailingSlashes(value) {
|
|
6
|
+
return value.replace(/\/+$/, '');
|
|
7
|
+
}
|
|
8
|
+
function trimSurroundingSlashes(value) {
|
|
9
|
+
return value.replace(/^\/+|\/+$/g, '');
|
|
10
|
+
}
|
|
11
|
+
function normalizeApiBaseUrl(value) {
|
|
12
|
+
const trimmed = trimTrailingSlashes(String(value || '').trim());
|
|
13
|
+
if (!trimmed) {
|
|
14
|
+
throw new Error('Flowboard API base URL must be a non-empty string.');
|
|
15
|
+
}
|
|
16
|
+
if (/^https?:\/\//i.test(trimmed)) {
|
|
17
|
+
return trimmed;
|
|
18
|
+
}
|
|
19
|
+
return `https://${trimmed}`;
|
|
20
|
+
}
|
|
21
|
+
function normalizeApiVersion(value) {
|
|
22
|
+
const trimmed = trimSurroundingSlashes(String(value || '').trim());
|
|
23
|
+
if (!trimmed) {
|
|
24
|
+
throw new Error('Flowboard API version must be a non-empty string.');
|
|
25
|
+
}
|
|
26
|
+
return `/${trimmed}`;
|
|
27
|
+
}
|
|
28
|
+
export function getFlowboardApiBaseUrl() {
|
|
29
|
+
return normalizeApiBaseUrl(DEFAULT_API_BASE_URL);
|
|
30
|
+
}
|
|
31
|
+
export function getFlowboardApiVersion() {
|
|
32
|
+
return normalizeApiVersion(DEFAULT_API_VERSION);
|
|
33
|
+
}
|
|
34
|
+
export function getFlowboardRuntimeBaseUrl() {
|
|
35
|
+
return `${getFlowboardApiBaseUrl()}${getFlowboardApiVersion()}`;
|
|
36
|
+
}
|
|
37
|
+
export function getResolveFlowUrl() {
|
|
38
|
+
return `${getFlowboardRuntimeBaseUrl()}/flows`;
|
|
39
|
+
}
|
|
40
|
+
export function getFlowByIdUrl(flowId) {
|
|
41
|
+
const normalizedFlowId = String(flowId || '').trim();
|
|
42
|
+
if (!normalizedFlowId) {
|
|
43
|
+
throw new Error('flowId must be a non-empty string.');
|
|
44
|
+
}
|
|
45
|
+
return `${getFlowboardRuntimeBaseUrl()}/flows/${encodeURIComponent(normalizedFlowId)}`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=apiConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_API_BASE_URL","DEFAULT_API_VERSION","trimTrailingSlashes","value","replace","trimSurroundingSlashes","normalizeApiBaseUrl","trimmed","String","trim","Error","test","normalizeApiVersion","getFlowboardApiBaseUrl","getFlowboardApiVersion","getFlowboardRuntimeBaseUrl","getResolveFlowUrl","getFlowByIdUrl","flowId","normalizedFlowId","encodeURIComponent"],"sourceRoot":"../../../src","sources":["core/apiConfig.ts"],"mappings":";;AAAA,MAAMA,oBAAoB,GAAG,mBAAmB;AAChD,MAAMC,mBAAmB,GAAG,IAAI;AAEhC,SAASC,mBAAmBA,CAACC,KAAa,EAAU;EAClD,OAAOA,KAAK,CAACC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAClC;AAEA,SAASC,sBAAsBA,CAACF,KAAa,EAAU;EACrD,OAAOA,KAAK,CAACC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;AACxC;AAEA,SAASE,mBAAmBA,CAACH,KAAa,EAAU;EAClD,MAAMI,OAAO,GAAGL,mBAAmB,CAACM,MAAM,CAACL,KAAK,IAAI,EAAE,CAAC,CAACM,IAAI,CAAC,CAAC,CAAC;EAC/D,IAAI,CAACF,OAAO,EAAE;IACZ,MAAM,IAAIG,KAAK,CAAC,oDAAoD,CAAC;EACvE;EAEA,IAAI,eAAe,CAACC,IAAI,CAACJ,OAAO,CAAC,EAAE;IACjC,OAAOA,OAAO;EAChB;EAEA,OAAO,WAAWA,OAAO,EAAE;AAC7B;AAEA,SAASK,mBAAmBA,CAACT,KAAa,EAAU;EAClD,MAAMI,OAAO,GAAGF,sBAAsB,CAACG,MAAM,CAACL,KAAK,IAAI,EAAE,CAAC,CAACM,IAAI,CAAC,CAAC,CAAC;EAClE,IAAI,CAACF,OAAO,EAAE;IACZ,MAAM,IAAIG,KAAK,CAAC,mDAAmD,CAAC;EACtE;EAEA,OAAO,IAAIH,OAAO,EAAE;AACtB;AAEA,OAAO,SAASM,sBAAsBA,CAAA,EAAW;EAC/C,OAAOP,mBAAmB,CAACN,oBAAoB,CAAC;AAClD;AAEA,OAAO,SAASc,sBAAsBA,CAAA,EAAW;EAC/C,OAAOF,mBAAmB,CAACX,mBAAmB,CAAC;AACjD;AAEA,OAAO,SAASc,0BAA0BA,CAAA,EAAW;EACnD,OAAO,GAAGF,sBAAsB,CAAC,CAAC,GAAGC,sBAAsB,CAAC,CAAC,EAAE;AACjE;AAEA,OAAO,SAASE,iBAAiBA,CAAA,EAAW;EAC1C,OAAO,GAAGD,0BAA0B,CAAC,CAAC,QAAQ;AAChD;AAEA,OAAO,SAASE,cAAcA,CAACC,MAAc,EAAU;EACrD,MAAMC,gBAAgB,GAAGX,MAAM,CAACU,MAAM,IAAI,EAAE,CAAC,CAACT,IAAI,CAAC,CAAC;EACpD,IAAI,CAACU,gBAAgB,EAAE;IACrB,MAAM,IAAIT,KAAK,CAAC,oCAAoC,CAAC;EACvD;EAEA,OAAO,GAAGK,0BAA0B,CAAC,CAAC,UAAUK,kBAAkB,CAChED,gBACF,CAAC,EAAE;AACL","ignoreList":[]}
|
|
@@ -1,40 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
const SPECIFIC_ONBOARDING_ENDPOINT = 'https://onboardsolo-638704832888.europe-west1.run.app';
|
|
3
|
+
import { getFlowByIdUrl, getResolveFlowUrl } from "./apiConfig.js";
|
|
5
4
|
export class ResolverService {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
8
|
-
this.specificOnboardingEndpoint = SPECIFIC_ONBOARDING_ENDPOINT;
|
|
5
|
+
constructor(fetchImpl = fetch) {
|
|
6
|
+
this.fetchImpl = fetchImpl;
|
|
9
7
|
}
|
|
10
8
|
async fetchOnboardingJson(params) {
|
|
11
9
|
const {
|
|
12
10
|
context,
|
|
13
|
-
|
|
11
|
+
apiToken
|
|
14
12
|
} = params;
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
payload.os = context.os;
|
|
22
|
-
payload.osVersion = context.osVersion;
|
|
23
|
-
payload.deviceType = context.deviceType;
|
|
24
|
-
payload.locale = context.locale;
|
|
25
|
-
payload.country = context.country;
|
|
26
|
-
payload.sdk = {
|
|
27
|
-
name: 'flowboard',
|
|
28
|
-
version: '1.0.0'
|
|
29
|
-
};
|
|
13
|
+
const url = new URL(getResolveFlowUrl());
|
|
14
|
+
url.searchParams.set('installId', context.installId);
|
|
15
|
+
url.searchParams.set('appVersion', context.appVersion);
|
|
16
|
+
url.searchParams.set('locale', context.locale);
|
|
17
|
+
url.searchParams.set('country', context.country);
|
|
18
|
+
url.searchParams.set('os', context.os);
|
|
30
19
|
let response;
|
|
31
20
|
try {
|
|
32
|
-
response = await
|
|
33
|
-
method: '
|
|
34
|
-
headers:
|
|
35
|
-
'Content-Type': 'application/json'
|
|
36
|
-
},
|
|
37
|
-
body: JSON.stringify(payload)
|
|
21
|
+
response = await this.fetchImpl(url.toString(), {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
headers: this.createHeaders(apiToken)
|
|
38
24
|
});
|
|
39
25
|
} catch (error) {
|
|
40
26
|
throw new Error(`Failed to connect to resolver: ${String(error)}`);
|
|
@@ -44,22 +30,19 @@ export class ResolverService {
|
|
|
44
30
|
throw new Error(`Failed to load onboarding config: ${response.status} ${body}`);
|
|
45
31
|
}
|
|
46
32
|
const body = await response.json();
|
|
33
|
+
this.normalizeFlowIdentifier(body);
|
|
47
34
|
this.applyHeaderMetadata(response, body);
|
|
48
35
|
return body;
|
|
49
36
|
}
|
|
50
37
|
async fetchOnboardingById(params) {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
38
|
+
const url = new URL(getFlowByIdUrl(params.onboardingId));
|
|
39
|
+
url.searchParams.set('locale', params.locale);
|
|
40
|
+
url.searchParams.set('version', params.version ?? 'live');
|
|
55
41
|
let response;
|
|
56
42
|
try {
|
|
57
|
-
response = await
|
|
58
|
-
method: '
|
|
59
|
-
headers:
|
|
60
|
-
'Content-Type': 'application/json'
|
|
61
|
-
},
|
|
62
|
-
body: JSON.stringify(payload)
|
|
43
|
+
response = await this.fetchImpl(url.toString(), {
|
|
44
|
+
method: 'GET',
|
|
45
|
+
headers: this.createHeaders(params.apiToken)
|
|
63
46
|
});
|
|
64
47
|
} catch (error) {
|
|
65
48
|
throw new Error(`Failed to connect to resolver: ${String(error)}`);
|
|
@@ -69,9 +52,22 @@ export class ResolverService {
|
|
|
69
52
|
throw new Error(`Failed to load onboarding config: ${response.status} ${body}`);
|
|
70
53
|
}
|
|
71
54
|
const body = await response.json();
|
|
55
|
+
this.normalizeFlowIdentifier(body);
|
|
72
56
|
this.applyHeaderMetadata(response, body);
|
|
73
57
|
return body;
|
|
74
58
|
}
|
|
59
|
+
createHeaders(apiToken) {
|
|
60
|
+
return {
|
|
61
|
+
Accept: '*/*',
|
|
62
|
+
Authorization: `Bearer ${apiToken}`
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
normalizeFlowIdentifier(body) {
|
|
66
|
+
const legacyFlowId = body.flowId;
|
|
67
|
+
if (!body.flow_id && typeof legacyFlowId === 'string' && legacyFlowId) {
|
|
68
|
+
body.flow_id = legacyFlowId;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
75
71
|
applyHeaderMetadata(response, body) {
|
|
76
72
|
const flowId = response.headers.get('x-flowboard-flow-id');
|
|
77
73
|
if (flowId) body.flow_id = flowId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["getFlowByIdUrl","getResolveFlowUrl","ResolverService","constructor","fetchImpl","fetch","fetchOnboardingJson","params","context","apiToken","url","URL","searchParams","set","installId","appVersion","locale","country","os","response","toString","method","headers","createHeaders","error","Error","String","ok","body","text","status","json","normalizeFlowIdentifier","applyHeaderMetadata","fetchOnboardingById","onboardingId","version","Accept","Authorization","legacyFlowId","flowId","flow_id","get","variantId","variant_id","audienceId","audience_id","bucket","experimentId","experiment_id"],"sourceRoot":"../../../src","sources":["core/resolverService.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,8 +7,7 @@ export type LaunchPayload = {
|
|
|
7
7
|
};
|
|
8
8
|
type LaunchListener = (payload: LaunchPayload) => void;
|
|
9
9
|
export declare class Flowboard {
|
|
10
|
-
private static
|
|
11
|
-
private static bundleId;
|
|
10
|
+
private static apiToken;
|
|
12
11
|
private static debug;
|
|
13
12
|
private static repository;
|
|
14
13
|
private static service;
|
|
@@ -16,8 +15,7 @@ export declare class Flowboard {
|
|
|
16
15
|
private static listeners;
|
|
17
16
|
static subscribe(listener: LaunchListener): () => void;
|
|
18
17
|
static init(params: {
|
|
19
|
-
|
|
20
|
-
bundleId: string;
|
|
18
|
+
apiToken: string;
|
|
21
19
|
debug?: boolean;
|
|
22
20
|
enableAnalytics?: boolean;
|
|
23
21
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Flowboard.d.ts","sourceRoot":"","sources":["../../../src/Flowboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,sBAAsB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Flowboard.d.ts","sourceRoot":"","sources":["../../../src/Flowboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,sBAAsB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC,CAAC;AAEF,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAC,UAAU,CAA8B;IACvD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAyB;IAC/C,OAAO,CAAC,MAAM,CAAC,WAAW,CAA8B;IACxD,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6B;IAErD,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;WAKzC,IAAI,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;WAwBJ,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;WAOvB,gBAAgB,CAC3B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC;WA4CH,oBAAoB,CAC/B,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC;mBAkCK,wBAAwB;mBA8CxB,2BAA2B;mBAkB3B,aAAa;mBAeb,UAAU;mBAaV,YAAY;mBAmCZ,gBAAgB;IAOrC,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,GAAG;CAKnB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function getFlowboardApiBaseUrl(): string;
|
|
2
|
+
export declare function getFlowboardApiVersion(): string;
|
|
3
|
+
export declare function getFlowboardRuntimeBaseUrl(): string;
|
|
4
|
+
export declare function getResolveFlowUrl(): string;
|
|
5
|
+
export declare function getFlowByIdUrl(flowId: string): string;
|
|
6
|
+
//# sourceMappingURL=apiConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiConfig.d.ts","sourceRoot":"","sources":["../../../../src/core/apiConfig.ts"],"names":[],"mappings":"AAiCA,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASrD"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import type { ClientContext } from './clientContext';
|
|
2
|
-
import type { FlowboardData } from '../types/flowboard';
|
|
2
|
+
import type { FlowboardData, FlowboardFlowVersion } from '../types/flowboard';
|
|
3
3
|
export declare class ResolverService {
|
|
4
|
-
private
|
|
5
|
-
|
|
6
|
-
constructor(endpoint?: string);
|
|
4
|
+
private fetchImpl;
|
|
5
|
+
constructor(fetchImpl?: typeof fetch);
|
|
7
6
|
fetchOnboardingJson(params: {
|
|
8
7
|
context: ClientContext;
|
|
9
|
-
|
|
8
|
+
apiToken: string;
|
|
10
9
|
}): Promise<FlowboardData>;
|
|
11
10
|
fetchOnboardingById(params: {
|
|
12
11
|
onboardingId: string;
|
|
13
12
|
locale: string;
|
|
13
|
+
apiToken: string;
|
|
14
|
+
version?: FlowboardFlowVersion;
|
|
14
15
|
}): Promise<FlowboardData>;
|
|
16
|
+
private createHeaders;
|
|
17
|
+
private normalizeFlowIdentifier;
|
|
15
18
|
private applyHeaderMetadata;
|
|
16
19
|
}
|
|
17
20
|
//# sourceMappingURL=resolverService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolverService.d.ts","sourceRoot":"","sources":["../../../../src/core/resolverService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolverService.d.ts","sourceRoot":"","sources":["../../../../src/core/resolverService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAe;gBAEpB,SAAS,GAAE,OAAO,KAAa;IAIrC,mBAAmB,CAAC,MAAM,EAAE;QAChC,OAAO,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiCpB,mBAAmB,CAAC,MAAM,EAAE;QAChC,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,oBAAoB,CAAC;KAChC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6B1B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,mBAAmB;CAY5B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Flowboard } from './Flowboard';
|
|
2
2
|
export { default as FlowboardProvider } from './FlowboardProvider';
|
|
3
3
|
export { default as FlowboardFlow } from './components/FlowboardFlow';
|
|
4
|
-
export type { FlowboardContext, CustomScreenBuilder, CustomActionBuilder, OnboardingEndCallback, OnStepChangeCallback, FlowboardLaunchOptions, FlowboardLaunchByIdOptions, FlowboardData, } from './types/flowboard';
|
|
4
|
+
export type { FlowboardContext, CustomScreenBuilder, CustomActionBuilder, OnboardingEndCallback, OnStepChangeCallback, FlowboardLaunchOptions, FlowboardLaunchByIdOptions, FlowboardFlowVersion, FlowboardData, } from './types/flowboard';
|
|
5
5
|
export type { FlowboardFlowProps } from './components/FlowboardFlow';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -9,6 +9,7 @@ export type FlowboardData = {
|
|
|
9
9
|
bucket?: string;
|
|
10
10
|
experiment_id?: string;
|
|
11
11
|
} & JsonMap;
|
|
12
|
+
export type FlowboardFlowVersion = 'live' | 'draft';
|
|
12
13
|
export type FlowboardContext = {
|
|
13
14
|
context?: any;
|
|
14
15
|
currentIndex: number;
|
|
@@ -35,5 +36,6 @@ export type FlowboardLaunchOptions = {
|
|
|
35
36
|
};
|
|
36
37
|
export type FlowboardLaunchByIdOptions = FlowboardLaunchOptions & {
|
|
37
38
|
locale?: string;
|
|
39
|
+
version?: FlowboardFlowVersion;
|
|
38
40
|
};
|
|
39
41
|
//# sourceMappingURL=flowboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flowboard.d.ts","sourceRoot":"","sources":["../../../../src/types/flowboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,EACrB,IAAI,CAAC,EAAE,OAAO,KACX,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG;IACnC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,GAAG;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"flowboard.d.ts","sourceRoot":"","sources":["../../../../src/types/flowboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,EACrB,IAAI,CAAC,EAAE,OAAO,KACX,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG;IACnC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,GAAG;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC"}
|
package/package.json
CHANGED
package/src/Flowboard.ts
CHANGED
|
@@ -19,8 +19,7 @@ export type LaunchPayload = {
|
|
|
19
19
|
type LaunchListener = (payload: LaunchPayload) => void;
|
|
20
20
|
|
|
21
21
|
export class Flowboard {
|
|
22
|
-
private static
|
|
23
|
-
private static bundleId: string | null = null;
|
|
22
|
+
private static apiToken: string | null = null;
|
|
24
23
|
private static debug = false;
|
|
25
24
|
private static repository = new OnboardingRepository();
|
|
26
25
|
private static service = new ResolverService();
|
|
@@ -33,18 +32,19 @@ export class Flowboard {
|
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
static async init(params: {
|
|
36
|
-
|
|
37
|
-
bundleId: string;
|
|
35
|
+
apiToken: string;
|
|
38
36
|
debug?: boolean;
|
|
39
37
|
enableAnalytics?: boolean;
|
|
40
38
|
}): Promise<void> {
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const apiToken = params.apiToken.trim();
|
|
40
|
+
if (!apiToken) {
|
|
41
|
+
throw new Error('apiToken must be a non-empty string');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Flowboard.apiToken = apiToken;
|
|
43
45
|
Flowboard.debug = params.debug ?? false;
|
|
44
46
|
|
|
45
|
-
Flowboard.log(
|
|
46
|
-
`Initialized with appId: ${Flowboard.appId}, bundleId: ${Flowboard.bundleId}`
|
|
47
|
-
);
|
|
47
|
+
Flowboard.log('Initialized with API token.');
|
|
48
48
|
|
|
49
49
|
try {
|
|
50
50
|
const clientContext = await ClientContext.create();
|
|
@@ -70,7 +70,7 @@ export class Flowboard {
|
|
|
70
70
|
options: FlowboardLaunchOptions = {}
|
|
71
71
|
): Promise<void> {
|
|
72
72
|
Flowboard.log('Attempting to launch onboarding...');
|
|
73
|
-
if (!Flowboard.
|
|
73
|
+
if (!Flowboard.apiToken) {
|
|
74
74
|
throw new Error(
|
|
75
75
|
'Flowboard.init() must be called before launchOnboarding'
|
|
76
76
|
);
|
|
@@ -117,7 +117,7 @@ export class Flowboard {
|
|
|
117
117
|
options: FlowboardLaunchByIdOptions = {}
|
|
118
118
|
): Promise<void> {
|
|
119
119
|
Flowboard.log(`Attempting to launch onboarding by id: ${onboardingId}`);
|
|
120
|
-
if (!Flowboard.
|
|
120
|
+
if (!Flowboard.apiToken) {
|
|
121
121
|
throw new Error(
|
|
122
122
|
'Flowboard.init() must be called before launchOnboardingById'
|
|
123
123
|
);
|
|
@@ -137,6 +137,8 @@ export class Flowboard {
|
|
|
137
137
|
data = await Flowboard.service.fetchOnboardingById({
|
|
138
138
|
onboardingId: normalizedOnboardingId,
|
|
139
139
|
locale,
|
|
140
|
+
apiToken: Flowboard.apiToken,
|
|
141
|
+
version: options.version ?? 'live',
|
|
140
142
|
});
|
|
141
143
|
} catch (error) {
|
|
142
144
|
Flowboard.log(`Failed to load onboarding by id: ${String(error)}`);
|
|
@@ -241,7 +243,7 @@ export class Flowboard {
|
|
|
241
243
|
|
|
242
244
|
private static async fetchAndSave(): Promise<void> {
|
|
243
245
|
const startTime = Date.now();
|
|
244
|
-
if (!Flowboard.
|
|
246
|
+
if (!Flowboard.apiToken) {
|
|
245
247
|
throw new Error(
|
|
246
248
|
'Flowboard not initialized. Call Flowboard.init() first.'
|
|
247
249
|
);
|
|
@@ -250,12 +252,12 @@ export class Flowboard {
|
|
|
250
252
|
try {
|
|
251
253
|
const context = await ClientContext.create();
|
|
252
254
|
Flowboard.log(
|
|
253
|
-
`Fetching onboarding JSON for installId: ${context.installId} |
|
|
255
|
+
`Fetching onboarding JSON for installId: ${context.installId} | bundleId: ${context.bundleId}`
|
|
254
256
|
);
|
|
255
257
|
|
|
256
258
|
const json = await Flowboard.service.fetchOnboardingJson({
|
|
257
259
|
context,
|
|
258
|
-
|
|
260
|
+
apiToken: Flowboard.apiToken,
|
|
259
261
|
});
|
|
260
262
|
|
|
261
263
|
Flowboard.log('Fetch successful. Saving to cache.');
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const DEFAULT_API_BASE_URL = 'api.flow-board.co';
|
|
2
|
+
const DEFAULT_API_VERSION = 'v0';
|
|
3
|
+
|
|
4
|
+
function trimTrailingSlashes(value: string): string {
|
|
5
|
+
return value.replace(/\/+$/, '');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function trimSurroundingSlashes(value: string): string {
|
|
9
|
+
return value.replace(/^\/+|\/+$/g, '');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function normalizeApiBaseUrl(value: string): string {
|
|
13
|
+
const trimmed = trimTrailingSlashes(String(value || '').trim());
|
|
14
|
+
if (!trimmed) {
|
|
15
|
+
throw new Error('Flowboard API base URL must be a non-empty string.');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (/^https?:\/\//i.test(trimmed)) {
|
|
19
|
+
return trimmed;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return `https://${trimmed}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function normalizeApiVersion(value: string): string {
|
|
26
|
+
const trimmed = trimSurroundingSlashes(String(value || '').trim());
|
|
27
|
+
if (!trimmed) {
|
|
28
|
+
throw new Error('Flowboard API version must be a non-empty string.');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return `/${trimmed}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getFlowboardApiBaseUrl(): string {
|
|
35
|
+
return normalizeApiBaseUrl(DEFAULT_API_BASE_URL);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function getFlowboardApiVersion(): string {
|
|
39
|
+
return normalizeApiVersion(DEFAULT_API_VERSION);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function getFlowboardRuntimeBaseUrl(): string {
|
|
43
|
+
return `${getFlowboardApiBaseUrl()}${getFlowboardApiVersion()}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getResolveFlowUrl(): string {
|
|
47
|
+
return `${getFlowboardRuntimeBaseUrl()}/flows`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function getFlowByIdUrl(flowId: string): string {
|
|
51
|
+
const normalizedFlowId = String(flowId || '').trim();
|
|
52
|
+
if (!normalizedFlowId) {
|
|
53
|
+
throw new Error('flowId must be a non-empty string.');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return `${getFlowboardRuntimeBaseUrl()}/flows/${encodeURIComponent(
|
|
57
|
+
normalizedFlowId
|
|
58
|
+
)}`;
|
|
59
|
+
}
|
|
@@ -1,48 +1,31 @@
|
|
|
1
1
|
import type { ClientContext } from './clientContext';
|
|
2
|
-
import type { FlowboardData } from '../types/flowboard';
|
|
3
|
-
|
|
4
|
-
const DEFAULT_ENDPOINT = 'https://test-638704832888.europe-west1.run.app';
|
|
5
|
-
const SPECIFIC_ONBOARDING_ENDPOINT =
|
|
6
|
-
'https://onboardsolo-638704832888.europe-west1.run.app';
|
|
2
|
+
import type { FlowboardData, FlowboardFlowVersion } from '../types/flowboard';
|
|
3
|
+
import { getFlowByIdUrl, getResolveFlowUrl } from './apiConfig';
|
|
7
4
|
|
|
8
5
|
export class ResolverService {
|
|
9
|
-
private
|
|
10
|
-
private specificOnboardingEndpoint: string;
|
|
6
|
+
private fetchImpl: typeof fetch;
|
|
11
7
|
|
|
12
|
-
constructor(
|
|
13
|
-
this.
|
|
14
|
-
this.specificOnboardingEndpoint = SPECIFIC_ONBOARDING_ENDPOINT;
|
|
8
|
+
constructor(fetchImpl: typeof fetch = fetch) {
|
|
9
|
+
this.fetchImpl = fetchImpl;
|
|
15
10
|
}
|
|
16
11
|
|
|
17
12
|
async fetchOnboardingJson(params: {
|
|
18
13
|
context: ClientContext;
|
|
19
|
-
|
|
14
|
+
apiToken: string;
|
|
20
15
|
}): Promise<FlowboardData> {
|
|
21
|
-
const { context,
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
payload.buildNumber = context.buildNumber;
|
|
29
|
-
payload.os = context.os;
|
|
30
|
-
payload.osVersion = context.osVersion;
|
|
31
|
-
payload.deviceType = context.deviceType;
|
|
32
|
-
payload.locale = context.locale;
|
|
33
|
-
payload.country = context.country;
|
|
34
|
-
|
|
35
|
-
payload.sdk = {
|
|
36
|
-
name: 'flowboard',
|
|
37
|
-
version: '1.0.0',
|
|
38
|
-
};
|
|
16
|
+
const { context, apiToken } = params;
|
|
17
|
+
const url = new URL(getResolveFlowUrl());
|
|
18
|
+
url.searchParams.set('installId', context.installId);
|
|
19
|
+
url.searchParams.set('appVersion', context.appVersion);
|
|
20
|
+
url.searchParams.set('locale', context.locale);
|
|
21
|
+
url.searchParams.set('country', context.country);
|
|
22
|
+
url.searchParams.set('os', context.os);
|
|
39
23
|
|
|
40
24
|
let response: Response;
|
|
41
25
|
try {
|
|
42
|
-
response = await
|
|
43
|
-
method: '
|
|
44
|
-
headers:
|
|
45
|
-
body: JSON.stringify(payload),
|
|
26
|
+
response = await this.fetchImpl(url.toString(), {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
headers: this.createHeaders(apiToken),
|
|
46
29
|
});
|
|
47
30
|
} catch (error) {
|
|
48
31
|
throw new Error(`Failed to connect to resolver: ${String(error)}`);
|
|
@@ -56,6 +39,7 @@ export class ResolverService {
|
|
|
56
39
|
}
|
|
57
40
|
|
|
58
41
|
const body = (await response.json()) as FlowboardData;
|
|
42
|
+
this.normalizeFlowIdentifier(body);
|
|
59
43
|
this.applyHeaderMetadata(response, body);
|
|
60
44
|
|
|
61
45
|
return body;
|
|
@@ -64,18 +48,18 @@ export class ResolverService {
|
|
|
64
48
|
async fetchOnboardingById(params: {
|
|
65
49
|
onboardingId: string;
|
|
66
50
|
locale: string;
|
|
51
|
+
apiToken: string;
|
|
52
|
+
version?: FlowboardFlowVersion;
|
|
67
53
|
}): Promise<FlowboardData> {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
};
|
|
54
|
+
const url = new URL(getFlowByIdUrl(params.onboardingId));
|
|
55
|
+
url.searchParams.set('locale', params.locale);
|
|
56
|
+
url.searchParams.set('version', params.version ?? 'live');
|
|
72
57
|
|
|
73
58
|
let response: Response;
|
|
74
59
|
try {
|
|
75
|
-
response = await
|
|
76
|
-
method: '
|
|
77
|
-
headers:
|
|
78
|
-
body: JSON.stringify(payload),
|
|
60
|
+
response = await this.fetchImpl(url.toString(), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: this.createHeaders(params.apiToken),
|
|
79
63
|
});
|
|
80
64
|
} catch (error) {
|
|
81
65
|
throw new Error(`Failed to connect to resolver: ${String(error)}`);
|
|
@@ -89,11 +73,26 @@ export class ResolverService {
|
|
|
89
73
|
}
|
|
90
74
|
|
|
91
75
|
const body = (await response.json()) as FlowboardData;
|
|
76
|
+
this.normalizeFlowIdentifier(body);
|
|
92
77
|
this.applyHeaderMetadata(response, body);
|
|
93
78
|
|
|
94
79
|
return body;
|
|
95
80
|
}
|
|
96
81
|
|
|
82
|
+
private createHeaders(apiToken: string): Record<string, string> {
|
|
83
|
+
return {
|
|
84
|
+
Accept: '*/*',
|
|
85
|
+
Authorization: `Bearer ${apiToken}`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private normalizeFlowIdentifier(body: FlowboardData): void {
|
|
90
|
+
const legacyFlowId = (body as FlowboardData & { flowId?: unknown }).flowId;
|
|
91
|
+
if (!body.flow_id && typeof legacyFlowId === 'string' && legacyFlowId) {
|
|
92
|
+
body.flow_id = legacyFlowId;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
97
96
|
private applyHeaderMetadata(response: Response, body: FlowboardData): void {
|
|
98
97
|
const flowId = response.headers.get('x-flowboard-flow-id');
|
|
99
98
|
if (flowId) body.flow_id = flowId;
|
package/src/index.tsx
CHANGED
package/src/types/flowboard.ts
CHANGED
|
@@ -13,6 +13,8 @@ export type FlowboardData = {
|
|
|
13
13
|
experiment_id?: string;
|
|
14
14
|
} & JsonMap;
|
|
15
15
|
|
|
16
|
+
export type FlowboardFlowVersion = 'live' | 'draft';
|
|
17
|
+
|
|
16
18
|
export type FlowboardContext = {
|
|
17
19
|
context?: any;
|
|
18
20
|
currentIndex: number;
|
|
@@ -53,4 +55,5 @@ export type FlowboardLaunchOptions = {
|
|
|
53
55
|
|
|
54
56
|
export type FlowboardLaunchByIdOptions = FlowboardLaunchOptions & {
|
|
55
57
|
locale?: string;
|
|
58
|
+
version?: FlowboardFlowVersion;
|
|
56
59
|
};
|