flowboard-react 0.6.1 → 0.6.3
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 +168 -52
- package/app.plugin.js +341 -0
- package/bin/setup.js +427 -0
- package/lib/module/Flowboard.js +1 -2
- package/lib/module/Flowboard.js.map +1 -1
- package/lib/module/FlowboardProvider.js +1 -1
- package/lib/module/FlowboardProvider.js.map +1 -1
- package/lib/module/components/FlowboardFlow.js +31 -9
- package/lib/module/components/FlowboardFlow.js.map +1 -1
- package/lib/module/components/FlowboardRenderer.js +419 -85
- package/lib/module/components/FlowboardRenderer.js.map +1 -1
- package/lib/module/core/clientContext.js +10 -29
- package/lib/module/core/clientContext.js.map +1 -1
- package/lib/module/core/fontAwesome.js +2 -9
- package/lib/module/core/fontAwesome.js.map +1 -1
- package/lib/module/core/onboardingRepository.js +13 -13
- package/lib/module/core/onboardingRepository.js.map +1 -1
- package/lib/module/native/asyncStorage.js +55 -0
- package/lib/module/native/asyncStorage.js.map +1 -0
- package/lib/module/native/deviceInfo.js +46 -0
- package/lib/module/native/deviceInfo.js.map +1 -0
- package/lib/module/native/inAppReview.js +17 -0
- package/lib/module/native/inAppReview.js.map +1 -0
- package/lib/module/native/linearGradient.js +29 -0
- package/lib/module/native/linearGradient.js.map +1 -0
- package/lib/module/native/lottie.js +20 -0
- package/lib/module/native/lottie.js.map +1 -0
- package/lib/module/native/maskedView.js +26 -0
- package/lib/module/native/maskedView.js.map +1 -0
- package/lib/module/native/pagerView.js +79 -0
- package/lib/module/native/pagerView.js.map +1 -0
- package/lib/module/native/permissions.js +30 -0
- package/lib/module/native/permissions.js.map +1 -0
- package/lib/module/native/runtime.js +81 -0
- package/lib/module/native/runtime.js.map +1 -0
- package/lib/module/native/safeAreaContext.js +43 -0
- package/lib/module/native/safeAreaContext.js.map +1 -0
- package/lib/module/native/svg.js +83 -0
- package/lib/module/native/svg.js.map +1 -0
- package/lib/module/native/vectorIcons.js +41 -0
- package/lib/module/native/vectorIcons.js.map +1 -0
- package/lib/module/utils/flowboardUtils.js +4 -1
- package/lib/module/utils/flowboardUtils.js.map +1 -1
- package/lib/typescript/src/Flowboard.d.ts.map +1 -1
- package/lib/typescript/src/components/FlowboardFlow.d.ts.map +1 -1
- package/lib/typescript/src/components/FlowboardRenderer.d.ts +33 -0
- package/lib/typescript/src/components/FlowboardRenderer.d.ts.map +1 -1
- package/lib/typescript/src/core/clientContext.d.ts.map +1 -1
- package/lib/typescript/src/core/fontAwesome.d.ts +1 -1
- package/lib/typescript/src/core/fontAwesome.d.ts.map +1 -1
- package/lib/typescript/src/core/onboardingRepository.d.ts.map +1 -1
- package/lib/typescript/src/native/asyncStorage.d.ts +16 -0
- package/lib/typescript/src/native/asyncStorage.d.ts.map +1 -0
- package/lib/typescript/src/native/deviceInfo.d.ts +11 -0
- package/lib/typescript/src/native/deviceInfo.d.ts.map +1 -0
- package/lib/typescript/src/native/inAppReview.d.ts +4 -0
- package/lib/typescript/src/native/inAppReview.d.ts.map +1 -0
- package/lib/typescript/src/native/linearGradient.d.ts +3 -0
- package/lib/typescript/src/native/linearGradient.d.ts.map +1 -0
- package/lib/typescript/src/native/lottie.d.ts +3 -0
- package/lib/typescript/src/native/lottie.d.ts.map +1 -0
- package/lib/typescript/src/native/maskedView.d.ts +3 -0
- package/lib/typescript/src/native/maskedView.d.ts.map +1 -0
- package/lib/typescript/src/native/pagerView.d.ts +14 -0
- package/lib/typescript/src/native/pagerView.d.ts.map +1 -0
- package/lib/typescript/src/native/permissions.d.ts +9 -0
- package/lib/typescript/src/native/permissions.d.ts.map +1 -0
- package/lib/typescript/src/native/runtime.d.ts +13 -0
- package/lib/typescript/src/native/runtime.d.ts.map +1 -0
- package/lib/typescript/src/native/safeAreaContext.d.ts +15 -0
- package/lib/typescript/src/native/safeAreaContext.d.ts.map +1 -0
- package/lib/typescript/src/native/svg.d.ts +8 -0
- package/lib/typescript/src/native/svg.d.ts.map +1 -0
- package/lib/typescript/src/native/vectorIcons.d.ts +4 -0
- package/lib/typescript/src/native/vectorIcons.d.ts.map +1 -0
- package/lib/typescript/src/utils/flowboardUtils.d.ts.map +1 -1
- package/package.json +24 -19
- package/src/Flowboard.ts +1 -2
- package/src/FlowboardProvider.tsx +1 -1
- package/src/components/FlowboardFlow.tsx +47 -9
- package/src/components/FlowboardRenderer.tsx +689 -113
- package/src/core/clientContext.ts +10 -32
- package/src/core/fontAwesome.ts +2 -9
- package/src/core/onboardingRepository.ts +18 -13
- package/src/native/asyncStorage.ts +99 -0
- package/src/native/deviceInfo.ts +88 -0
- package/src/native/inAppReview.ts +34 -0
- package/src/native/linearGradient.tsx +24 -0
- package/src/native/lottie.tsx +17 -0
- package/src/native/maskedView.tsx +19 -0
- package/src/native/pagerView.tsx +95 -0
- package/src/native/permissions.ts +59 -0
- package/src/native/runtime.ts +110 -0
- package/src/native/safeAreaContext.tsx +44 -0
- package/src/native/svg.tsx +82 -0
- package/src/native/vectorIcons.tsx +50 -0
- package/src/utils/flowboardUtils.ts +9 -1
package/bin/setup.js
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const childProcess = require('node:child_process');
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const readline = require('node:readline/promises');
|
|
7
|
+
|
|
8
|
+
const BASE_PACKAGES = [
|
|
9
|
+
['@react-native-async-storage/async-storage', '1.24.0'],
|
|
10
|
+
['@react-native-masked-view/masked-view', '0.3.2'],
|
|
11
|
+
['lottie-react-native', '7.1.0'],
|
|
12
|
+
['react-native-device-info', '13.2.0'],
|
|
13
|
+
['react-native-in-app-review', '4.3.0'],
|
|
14
|
+
['react-native-linear-gradient', '2.8.3'],
|
|
15
|
+
['react-native-pager-view', '6.2.4'],
|
|
16
|
+
['react-native-permissions', '4.1.5'],
|
|
17
|
+
['react-native-safe-area-context', '5.0.0'],
|
|
18
|
+
['react-native-svg', '15.10.1'],
|
|
19
|
+
['react-native-vector-icons', '10.2.0'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const EXPO_EXTRA_PACKAGES = ['expo-font'];
|
|
23
|
+
|
|
24
|
+
function parseArgs(argv) {
|
|
25
|
+
const args = {
|
|
26
|
+
dryRun: false,
|
|
27
|
+
projectRoot: null,
|
|
28
|
+
upgrade: false,
|
|
29
|
+
verbose: false,
|
|
30
|
+
yes: false,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
34
|
+
const arg = argv[index];
|
|
35
|
+
if (arg === '--dry-run') args.dryRun = true;
|
|
36
|
+
else if (arg === '--upgrade') args.upgrade = true;
|
|
37
|
+
else if (arg === '--verbose') args.verbose = true;
|
|
38
|
+
else if (arg === '--yes') args.yes = true;
|
|
39
|
+
else if (arg === '--project-root') {
|
|
40
|
+
args.projectRoot = argv[index + 1] ? path.resolve(argv[index + 1]) : null;
|
|
41
|
+
index += 1;
|
|
42
|
+
} else if (arg.startsWith('--project-root=')) {
|
|
43
|
+
args.projectRoot = path.resolve(arg.slice('--project-root='.length));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return args;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function parseSemver(input) {
|
|
51
|
+
const match = String(input || '').match(/(\d+)\.(\d+)\.(\d+)/);
|
|
52
|
+
if (!match) return null;
|
|
53
|
+
return {
|
|
54
|
+
major: Number(match[1]),
|
|
55
|
+
minor: Number(match[2]),
|
|
56
|
+
patch: Number(match[3]),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function compareSemver(left, right) {
|
|
61
|
+
if (left.major !== right.major) return left.major - right.major;
|
|
62
|
+
if (left.minor !== right.minor) return left.minor - right.minor;
|
|
63
|
+
return left.patch - right.patch;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function rangeAcceptsVersion(spec, version) {
|
|
67
|
+
const normalized = String(spec || '').trim();
|
|
68
|
+
if (!normalized) return false;
|
|
69
|
+
if (
|
|
70
|
+
normalized === '*' ||
|
|
71
|
+
normalized === 'latest' ||
|
|
72
|
+
normalized.startsWith('workspace:')
|
|
73
|
+
) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
if (normalized.includes('||')) {
|
|
77
|
+
return normalized
|
|
78
|
+
.split('||')
|
|
79
|
+
.some((part) => rangeAcceptsVersion(part.trim(), version));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const comparators = normalized.split(/\s+/).filter(Boolean);
|
|
83
|
+
if (comparators.length > 1) {
|
|
84
|
+
return comparators.every((part) => rangeAcceptsVersion(part, version));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const target = parseSemver(version);
|
|
88
|
+
if (!target) return false;
|
|
89
|
+
|
|
90
|
+
const operatorMatch = normalized.match(/^(>=|<=|>|<|\^|~)/);
|
|
91
|
+
const operator = operatorMatch ? operatorMatch[1] : '';
|
|
92
|
+
const base = parseSemver(normalized.slice(operator.length));
|
|
93
|
+
if (!base) {
|
|
94
|
+
const exact = parseSemver(normalized);
|
|
95
|
+
return exact ? compareSemver(target, exact) === 0 : normalized === version;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
switch (operator) {
|
|
99
|
+
case '^':
|
|
100
|
+
return target.major === base.major && compareSemver(target, base) >= 0;
|
|
101
|
+
case '~':
|
|
102
|
+
return (
|
|
103
|
+
target.major === base.major &&
|
|
104
|
+
target.minor === base.minor &&
|
|
105
|
+
compareSemver(target, base) >= 0
|
|
106
|
+
);
|
|
107
|
+
case '>=':
|
|
108
|
+
return compareSemver(target, base) >= 0;
|
|
109
|
+
case '<=':
|
|
110
|
+
return compareSemver(target, base) <= 0;
|
|
111
|
+
case '>':
|
|
112
|
+
return compareSemver(target, base) > 0;
|
|
113
|
+
case '<':
|
|
114
|
+
return compareSemver(target, base) < 0;
|
|
115
|
+
default:
|
|
116
|
+
return compareSemver(target, base) === 0;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getManifest(root) {
|
|
121
|
+
const manifestPath = path.join(root, 'package.json');
|
|
122
|
+
if (!fs.existsSync(manifestPath)) {
|
|
123
|
+
throw new Error(`No package.json found in ${root}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getProjectRoot(explicitProjectRoot) {
|
|
130
|
+
return explicitProjectRoot || process.cwd();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function detectPackageManager(root, manifest) {
|
|
134
|
+
const candidates = [
|
|
135
|
+
['pnpm-lock.yaml', 'pnpm'],
|
|
136
|
+
['yarn.lock', 'yarn'],
|
|
137
|
+
['package-lock.json', 'npm'],
|
|
138
|
+
['bun.lock', 'bun'],
|
|
139
|
+
['bun.lockb', 'bun'],
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
const detected = candidates.find(([file]) =>
|
|
143
|
+
fs.existsSync(path.join(root, file))
|
|
144
|
+
);
|
|
145
|
+
if (detected) return detected[1];
|
|
146
|
+
|
|
147
|
+
const packageManager = String(manifest.packageManager || '');
|
|
148
|
+
if (packageManager.startsWith('pnpm@')) return 'pnpm';
|
|
149
|
+
if (packageManager.startsWith('yarn@')) return 'yarn';
|
|
150
|
+
if (packageManager.startsWith('bun@')) return 'bun';
|
|
151
|
+
return 'npm';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function getPackageSpec(manifest, packageName) {
|
|
155
|
+
return (
|
|
156
|
+
manifest.dependencies?.[packageName] ||
|
|
157
|
+
manifest.devDependencies?.[packageName] ||
|
|
158
|
+
manifest.peerDependencies?.[packageName] ||
|
|
159
|
+
null
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function isExpoProject(manifest) {
|
|
164
|
+
return Boolean(getPackageSpec(manifest, 'expo'));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function hasReactNative(manifest) {
|
|
168
|
+
return Boolean(getPackageSpec(manifest, 'react-native'));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function selectPackages(manifest, options) {
|
|
172
|
+
return BASE_PACKAGES.filter(([packageName, version]) => {
|
|
173
|
+
if (options.upgrade) return true;
|
|
174
|
+
const existingSpec = getPackageSpec(manifest, packageName);
|
|
175
|
+
return !rangeAcceptsVersion(existingSpec, version);
|
|
176
|
+
}).map(([name, version]) => ({ name, version }));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function selectExpoExtras(manifest, options) {
|
|
180
|
+
return EXPO_EXTRA_PACKAGES.filter((packageName) => {
|
|
181
|
+
if (options.upgrade) return true;
|
|
182
|
+
return !getPackageSpec(manifest, packageName);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function commandName(baseName) {
|
|
187
|
+
return process.platform === 'win32' ? `${baseName}.cmd` : baseName;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function buildInstallCommands({ expo, packageManager, packages, expoExtras }) {
|
|
191
|
+
const commands = [];
|
|
192
|
+
|
|
193
|
+
if (expo) {
|
|
194
|
+
if (packages.length > 0) {
|
|
195
|
+
commands.push({
|
|
196
|
+
args: ['expo', 'install', ...packages.map((entry) => entry.name)],
|
|
197
|
+
command: commandName('npx'),
|
|
198
|
+
title: 'Install Expo-compatible Flowboard peers',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (expoExtras.length > 0) {
|
|
202
|
+
commands.push({
|
|
203
|
+
args: ['expo', 'install', ...expoExtras],
|
|
204
|
+
command: commandName('npx'),
|
|
205
|
+
title: 'Install Expo-only helpers',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return commands;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (packages.length === 0) return commands;
|
|
212
|
+
|
|
213
|
+
const specs = packages.map((entry) => `${entry.name}@${entry.version}`);
|
|
214
|
+
const installArgsByManager = {
|
|
215
|
+
bun: ['add', ...specs],
|
|
216
|
+
npm: ['install', ...specs],
|
|
217
|
+
pnpm: ['add', ...specs],
|
|
218
|
+
yarn: ['add', ...specs],
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
commands.push({
|
|
222
|
+
args: installArgsByManager[packageManager] || installArgsByManager.npm,
|
|
223
|
+
command: commandName(packageManager),
|
|
224
|
+
title: 'Install validated React Native peer versions',
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return commands;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function formatCommand(command) {
|
|
231
|
+
return [command.command, ...command.args].join(' ');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async function confirmExecution() {
|
|
235
|
+
const rl = readline.createInterface({
|
|
236
|
+
input: process.stdin,
|
|
237
|
+
output: process.stdout,
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
try {
|
|
241
|
+
const answer = await rl.question(
|
|
242
|
+
'Proceed with these install commands? [y/N] '
|
|
243
|
+
);
|
|
244
|
+
return ['y', 'yes'].includes(answer.trim().toLowerCase());
|
|
245
|
+
} finally {
|
|
246
|
+
rl.close();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function printNextSteps({ expo, projectRoot }) {
|
|
251
|
+
if (expo) {
|
|
252
|
+
console.log('\nNext steps');
|
|
253
|
+
console.log('1. Add `"flowboard-react"` to your Expo plugins array.');
|
|
254
|
+
console.log('```json');
|
|
255
|
+
console.log('{');
|
|
256
|
+
console.log(' "expo": {');
|
|
257
|
+
console.log(' "plugins": ["flowboard-react"]');
|
|
258
|
+
console.log(' }');
|
|
259
|
+
console.log('}');
|
|
260
|
+
console.log('```');
|
|
261
|
+
console.log(
|
|
262
|
+
'2. If your flow requests permissions, use the plugin options:'
|
|
263
|
+
);
|
|
264
|
+
console.log('```json');
|
|
265
|
+
console.log('{');
|
|
266
|
+
console.log(' "expo": {');
|
|
267
|
+
console.log(' "plugins": [[');
|
|
268
|
+
console.log(' "flowboard-react",');
|
|
269
|
+
console.log(' {');
|
|
270
|
+
console.log(' "permissions": ["camera", "photos"],');
|
|
271
|
+
console.log(' "permissionMessages": {');
|
|
272
|
+
console.log(
|
|
273
|
+
' "camera": "Allow $(PRODUCT_NAME) to access the camera during onboarding."'
|
|
274
|
+
);
|
|
275
|
+
console.log(' }');
|
|
276
|
+
console.log(' }');
|
|
277
|
+
console.log(' ]]');
|
|
278
|
+
console.log(' }');
|
|
279
|
+
console.log('}');
|
|
280
|
+
console.log('```');
|
|
281
|
+
console.log(
|
|
282
|
+
'3. Build a development client or run `npx expo prebuild` before testing. Expo Go is not supported.'
|
|
283
|
+
);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
console.log('\nNext steps');
|
|
288
|
+
console.log(
|
|
289
|
+
'1. Run `cd ios && pod install` before launching the app on iOS.'
|
|
290
|
+
);
|
|
291
|
+
console.log(
|
|
292
|
+
'2. Configure `react-native-permissions` in your Podfile, Info.plist, and AndroidManifest.xml when your flow uses permission actions.'
|
|
293
|
+
);
|
|
294
|
+
console.log(
|
|
295
|
+
'3. Configure `react-native-vector-icons` font bundling in native projects if your host app has not already done so.'
|
|
296
|
+
);
|
|
297
|
+
console.log(
|
|
298
|
+
`4. Use ${path.join(
|
|
299
|
+
projectRoot,
|
|
300
|
+
'README.md'
|
|
301
|
+
)} in flowboard-react as the canonical checklist.`
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function printPlan({ expo, packageManager, packages, expoExtras, commands }) {
|
|
306
|
+
console.log(
|
|
307
|
+
`[flowboard-setup] Target: ${
|
|
308
|
+
expo ? 'Expo development build' : `React Native CLI (${packageManager})`
|
|
309
|
+
}`
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
if (packages.length > 0) {
|
|
313
|
+
console.log('[flowboard-setup] Packages to install:');
|
|
314
|
+
packages.forEach((entry) => {
|
|
315
|
+
console.log(` - ${entry.name}${expo ? '' : `@${entry.version}`}`);
|
|
316
|
+
});
|
|
317
|
+
} else {
|
|
318
|
+
console.log(
|
|
319
|
+
'[flowboard-setup] Base Flowboard peer dependencies already look compatible.'
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (expoExtras.length > 0) {
|
|
324
|
+
console.log('[flowboard-setup] Expo-only helpers:');
|
|
325
|
+
expoExtras.forEach((entry) => {
|
|
326
|
+
console.log(` - ${entry}`);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (commands.length > 0) {
|
|
331
|
+
console.log('[flowboard-setup] Commands:');
|
|
332
|
+
commands.forEach((command) => {
|
|
333
|
+
console.log(` - ${formatCommand(command)}`);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function runCommand(command, cwd, dryRun) {
|
|
339
|
+
if (dryRun) return;
|
|
340
|
+
|
|
341
|
+
const result = childProcess.spawnSync(command.command, command.args, {
|
|
342
|
+
cwd,
|
|
343
|
+
stdio: 'inherit',
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
if (result.status !== 0) {
|
|
347
|
+
throw new Error(`Command failed: ${formatCommand(command)}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async function main(rawArgs = process.argv.slice(2)) {
|
|
352
|
+
const options = parseArgs(rawArgs);
|
|
353
|
+
const projectRoot = getProjectRoot(options.projectRoot);
|
|
354
|
+
const manifest = getManifest(projectRoot);
|
|
355
|
+
|
|
356
|
+
if (!hasReactNative(manifest)) {
|
|
357
|
+
throw new Error(
|
|
358
|
+
'This directory does not look like a React Native app. Add `react-native` to package.json before running flowboard-setup.'
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const expo = isExpoProject(manifest);
|
|
363
|
+
const packageManager = detectPackageManager(projectRoot, manifest);
|
|
364
|
+
const packages = selectPackages(manifest, options);
|
|
365
|
+
const expoExtras = expo ? selectExpoExtras(manifest, options) : [];
|
|
366
|
+
const commands = buildInstallCommands({
|
|
367
|
+
expo,
|
|
368
|
+
expoExtras,
|
|
369
|
+
packageManager,
|
|
370
|
+
packages,
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
printPlan({ commands, expo, expoExtras, packageManager, packages });
|
|
374
|
+
|
|
375
|
+
if (commands.length === 0) {
|
|
376
|
+
printNextSteps({ expo, projectRoot });
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
381
|
+
if (!options.yes && !options.dryRun && interactive) {
|
|
382
|
+
const confirmed = await confirmExecution();
|
|
383
|
+
if (!confirmed) {
|
|
384
|
+
console.log('[flowboard-setup] Cancelled.');
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
commands.forEach((command) => {
|
|
390
|
+
if (options.verbose || options.dryRun) {
|
|
391
|
+
console.log(`[flowboard-setup] ${command.title}`);
|
|
392
|
+
console.log(`[flowboard-setup] ${formatCommand(command)}`);
|
|
393
|
+
}
|
|
394
|
+
runCommand(command, projectRoot, options.dryRun);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
if (options.dryRun) {
|
|
398
|
+
console.log('[flowboard-setup] Dry run complete. No files were changed.');
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
printNextSteps({ expo, projectRoot });
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
module.exports = {
|
|
405
|
+
BASE_PACKAGES,
|
|
406
|
+
EXPO_EXTRA_PACKAGES,
|
|
407
|
+
buildInstallCommands,
|
|
408
|
+
detectPackageManager,
|
|
409
|
+
getManifest,
|
|
410
|
+
getPackageSpec,
|
|
411
|
+
getProjectRoot,
|
|
412
|
+
hasReactNative,
|
|
413
|
+
isExpoProject,
|
|
414
|
+
main,
|
|
415
|
+
parseArgs,
|
|
416
|
+
parseSemver,
|
|
417
|
+
rangeAcceptsVersion,
|
|
418
|
+
selectExpoExtras,
|
|
419
|
+
selectPackages,
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
if (require.main === module) {
|
|
423
|
+
main().catch((error) => {
|
|
424
|
+
console.error(`[flowboard-setup] ${error.message}`);
|
|
425
|
+
process.exitCode = 1;
|
|
426
|
+
});
|
|
427
|
+
}
|
package/lib/module/Flowboard.js
CHANGED
|
@@ -97,8 +97,7 @@ export class Flowboard {
|
|
|
97
97
|
});
|
|
98
98
|
} catch (error) {
|
|
99
99
|
Flowboard.log(`Failed to load onboarding by id: ${String(error)}`);
|
|
100
|
-
|
|
101
|
-
return;
|
|
100
|
+
throw error;
|
|
102
101
|
}
|
|
103
102
|
await Flowboard.launchResolvedOnboarding(data, options);
|
|
104
103
|
}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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":"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","ignoreList":[]}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { useEffect, useState } from 'react';
|
|
4
4
|
import { Modal, StyleSheet, View } from 'react-native';
|
|
5
|
-
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
6
5
|
import { Flowboard } from "./Flowboard.js";
|
|
7
6
|
import FlowboardFlow from "./components/FlowboardFlow.js";
|
|
7
|
+
import { SafeAreaProvider } from "./native/safeAreaContext.js";
|
|
8
8
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
9
|
const styles = StyleSheet.create({
|
|
10
10
|
modalContainer: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useState","Modal","StyleSheet","View","
|
|
1
|
+
{"version":3,"names":["React","useEffect","useState","Modal","StyleSheet","View","Flowboard","FlowboardFlow","SafeAreaProvider","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","styles","create","modalContainer","flex","backgroundColor","FlowboardProvider","children","payload","setPayload","visible","setVisible","unsubscribe","subscribe","nextPayload","handleClose","animationType","transparent","presentationStyle","onRequestClose","style","data","customScreenBuilder","options","customActionBuilder","onOnboardEnd","onStepChange","initialStep","initialFormData","onClose"],"sourceRoot":"../../src","sources":["FlowboardProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,KAAK,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AACtD,SAASC,SAAS,QAA4B,gBAAa;AAC3D,OAAOC,aAAa,MAAM,+BAA4B;AACtD,SAASC,gBAAgB,QAAQ,6BAA0B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAE5D,MAAMC,MAAM,GAAGX,UAAU,CAACY,MAAM,CAAC;EAC/BC,cAAc,EAAE;IACdC,IAAI,EAAE,CAAC;IACPC,eAAe,EAAE;EACnB;AACF,CAAC,CAAC;AAEF,eAAe,SAASC,iBAAiBA,CAAC;EACxCC;AAGF,CAAC,EAAE;EACD,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGrB,QAAQ,CAAuB,IAAI,CAAC;EAClE,MAAM,CAACsB,OAAO,EAAEC,UAAU,CAAC,GAAGvB,QAAQ,CAAC,KAAK,CAAC;EAE7CD,SAAS,CAAC,MAAM;IACd,MAAMyB,WAAW,GAAGpB,SAAS,CAACqB,SAAS,CAAEC,WAAW,IAAK;MACvDL,UAAU,CAACK,WAAW,CAAC;MACvBH,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC;IACF,OAAOC,WAAW;EACpB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,WAAW,GAAGA,CAAA,KAAM;IACxBJ,UAAU,CAAC,KAAK,CAAC;IACjBF,UAAU,CAAC,IAAI,CAAC;EAClB,CAAC;EAED,oBACET,KAAA,CAAAF,SAAA;IAAAS,QAAA,GACGA,QAAQ,eACTX,IAAA,CAACP,KAAK;MACJqB,OAAO,EAAEA,OAAQ;MACjBM,aAAa,EAAC,OAAO;MACrBC,WAAW,EAAE,KAAM;MACnBC,iBAAiB,EAAC,YAAY;MAC9BC,cAAc,EAAEJ,WAAY;MAAAR,QAAA,eAE5BX,IAAA,CAACF,gBAAgB;QAAAa,QAAA,eACfX,IAAA,CAACL,IAAI;UAAC6B,KAAK,EAAEnB,MAAM,CAACE,cAAe;UAAAI,QAAA,EAChCC,OAAO,gBACNZ,IAAA,CAACH,aAAa;YACZ4B,IAAI,EAAEb,OAAO,CAACa,IAAK;YACnBC,mBAAmB,EAAEd,OAAO,CAACe,OAAO,CAACD,mBAAoB;YACzDE,mBAAmB,EAAEhB,OAAO,CAACe,OAAO,CAACC,mBAAoB;YACzDC,YAAY,EAAEjB,OAAO,CAACe,OAAO,CAACE,YAAa;YAC3CC,YAAY,EAAElB,OAAO,CAACe,OAAO,CAACG,YAAa;YAC3CC,WAAW,EAAEnB,OAAO,CAACmB,WAAY;YACjCC,eAAe,EAAEpB,OAAO,CAACoB,eAAgB;YACzCC,OAAO,EAAEd;UAAY,CACtB,CAAC,GACA;QAAI,CACJ;MAAC,CACS;IAAC,CACd,CAAC;EAAA,CACR,CAAC;AAEP","ignoreList":[]}
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { Alert, Keyboard, Platform, StyleSheet, View } from 'react-native';
|
|
5
|
-
import PagerView from 'react-native-pager-view';
|
|
6
5
|
import { Linking } from 'react-native';
|
|
7
|
-
import
|
|
8
|
-
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
9
|
-
import { openSettings, PERMISSIONS, request, requestNotifications, RESULTS } from 'react-native-permissions';
|
|
6
|
+
import { openSettings, PERMISSIONS, request, requestNotifications, RESULTS } from "../native/permissions.js";
|
|
10
7
|
import { AssetPreloader } from "../core/assetPreloader.js";
|
|
11
8
|
import { AnalyticsManager, OnboardingOutcome } from "../core/analyticsManager.js";
|
|
12
9
|
import { OnboardingRepository } from "../core/onboardingRepository.js";
|
|
10
|
+
import { requestInAppReview, isInAppReviewAvailable } from "../native/inAppReview.js";
|
|
11
|
+
import PagerView from "../native/pagerView.js";
|
|
12
|
+
import { SafeAreaProvider } from "../native/safeAreaContext.js";
|
|
13
13
|
import FlowboardRenderer from "./FlowboardRenderer.js";
|
|
14
14
|
import { SliderRegistry, SliderRegistryProvider } from "./widgets/sliderRegistry.js";
|
|
15
|
+
import { parseColor } from "../utils/flowboardUtils.js";
|
|
15
16
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
17
|
const styles = StyleSheet.create({
|
|
17
18
|
container: {
|
|
18
|
-
flex: 1
|
|
19
|
-
backgroundColor: '#ffffff'
|
|
19
|
+
flex: 1
|
|
20
20
|
},
|
|
21
21
|
fullFlex: {
|
|
22
22
|
flex: 1
|
|
@@ -52,6 +52,8 @@ export default function FlowboardFlow(props) {
|
|
|
52
52
|
const didSyncPagerRef = useRef(false);
|
|
53
53
|
const completedRef = useRef(false);
|
|
54
54
|
const flowStartTimeRef = useRef(Date.now());
|
|
55
|
+
const currentScreenData = screens[currentIndex] ?? null;
|
|
56
|
+
const flowBackgroundColor = resolveScreenBackgroundColor(currentScreenData);
|
|
55
57
|
useEffect(() => {
|
|
56
58
|
AnalyticsManager.instance.startSession({
|
|
57
59
|
flowData: data
|
|
@@ -256,8 +258,8 @@ export default function FlowboardFlow(props) {
|
|
|
256
258
|
};
|
|
257
259
|
const handleRateAppAction = async (index, totalScreens) => {
|
|
258
260
|
try {
|
|
259
|
-
if (
|
|
260
|
-
|
|
261
|
+
if (isInAppReviewAvailable()) {
|
|
262
|
+
await requestInAppReview();
|
|
261
263
|
}
|
|
262
264
|
} catch {
|
|
263
265
|
// ignore
|
|
@@ -312,7 +314,9 @@ export default function FlowboardFlow(props) {
|
|
|
312
314
|
};
|
|
313
315
|
return /*#__PURE__*/_jsx(SafeAreaProvider, {
|
|
314
316
|
children: /*#__PURE__*/_jsx(View, {
|
|
315
|
-
style: styles.container,
|
|
317
|
+
style: [styles.container, flowBackgroundColor ? {
|
|
318
|
+
backgroundColor: flowBackgroundColor
|
|
319
|
+
} : undefined],
|
|
316
320
|
children: /*#__PURE__*/_jsx(PagerView, {
|
|
317
321
|
ref: pagerRef,
|
|
318
322
|
style: styles.fullFlex,
|
|
@@ -354,6 +358,24 @@ function resolveInitialPage(desired, total) {
|
|
|
354
358
|
if (desired >= total) return total - 1;
|
|
355
359
|
return desired;
|
|
356
360
|
}
|
|
361
|
+
function resolveScreenBackgroundColor(screenData) {
|
|
362
|
+
if (!screenData) return undefined;
|
|
363
|
+
const bgData = screenData.background;
|
|
364
|
+
if (bgData && typeof bgData === 'object') {
|
|
365
|
+
const type = String(bgData.type ?? '').toLowerCase();
|
|
366
|
+
if (type === 'color' && bgData.color !== undefined) {
|
|
367
|
+
return parseColor(bgData.color);
|
|
368
|
+
}
|
|
369
|
+
if (type === 'gradient' && Array.isArray(bgData.colors)) {
|
|
370
|
+
const first = bgData.colors[0];
|
|
371
|
+
if (first !== undefined) return parseColor(first);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (screenData.backgroundColor !== undefined) {
|
|
375
|
+
return parseColor(screenData.backgroundColor);
|
|
376
|
+
}
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
357
379
|
function validateScreen(screenData, formData) {
|
|
358
380
|
const invalidFields = [];
|
|
359
381
|
const children = Array.isArray(screenData.children) ? screenData.children : [];
|