@tfcorp/consumer-app-react-native-sdk 2.0.6 → 2.0.7
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 +65 -0
- package/android/src/main/java/com/truefit/reactnative/TrueFitOrderModule.kt +7 -0
- package/ios/TrueFitOrderModule.m +2 -0
- package/ios/TrueFitOrderModule.swift +9 -0
- package/lib/commonjs/index.js +247 -16
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +246 -16
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +12 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -56,8 +56,73 @@ export function ProductFitRecommendation() {
|
|
|
56
56
|
| `storeKey` | `string` | Required |
|
|
57
57
|
| `storeStyle` | `string` | Required |
|
|
58
58
|
| `uiLocale` | `string` | Not set |
|
|
59
|
+
| `userToken` | `string` | Not set; one-time token used to bootstrap the native WebView cookie store |
|
|
59
60
|
| `scriptUrl` | `string` | — (overrides `environment`; a full built-bundle URL. Raw Vite `.ts` dev entries are **not** supported) |
|
|
60
61
|
|
|
62
|
+
## Legacy Expo SecureStore migration
|
|
63
|
+
|
|
64
|
+
The SDK can migrate a legacy user token supplied by the host application
|
|
65
|
+
without depending on `expo-secure-store`. Pass storage callbacks through
|
|
66
|
+
`legacyUserMigration`; omit the prop in applications that do not need the
|
|
67
|
+
migration.
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import * as SecureStore from 'expo-secure-store';
|
|
71
|
+
|
|
72
|
+
import { TrueFitRecommendationView } from 'consumer-app-react-native-sdk';
|
|
73
|
+
|
|
74
|
+
const LEGACY_USER_TOKEN_KEY = 'TF-TOKEN';
|
|
75
|
+
const MIGRATION_COMPLETE_KEY = 'truefit-user-migration-complete';
|
|
76
|
+
|
|
77
|
+
const legacyUserMigration = {
|
|
78
|
+
readLegacyUserToken: async () => {
|
|
79
|
+
const migrationComplete = await SecureStore.getItemAsync(MIGRATION_COMPLETE_KEY);
|
|
80
|
+
if (migrationComplete === 'true') return null;
|
|
81
|
+
return await SecureStore.getItemAsync(LEGACY_USER_TOKEN_KEY);
|
|
82
|
+
},
|
|
83
|
+
completeLegacyUserMigration: async (migratedValue: string | null) => {
|
|
84
|
+
const storedToken = await SecureStore.getItemAsync(LEGACY_USER_TOKEN_KEY);
|
|
85
|
+
if (migratedValue && storedToken === migratedValue) {
|
|
86
|
+
await SecureStore.deleteItemAsync(LEGACY_USER_TOKEN_KEY);
|
|
87
|
+
}
|
|
88
|
+
await SecureStore.setItemAsync(MIGRATION_COMPLETE_KEY, 'true');
|
|
89
|
+
},
|
|
90
|
+
onLegacyUserMigrationError: (error: Error) => {
|
|
91
|
+
reportError(error);
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const ProductFitRecommendation = () => (
|
|
96
|
+
<TrueFitRecommendationView
|
|
97
|
+
config={{ storeKey: 'nda', storeStyle: '7093242789933' }}
|
|
98
|
+
legacyUserMigration={legacyUserMigration}
|
|
99
|
+
/>
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`readLegacyUserToken` must return the raw SecureStore value. The SDK parses and
|
|
104
|
+
validates its serialized JSON shape:
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"token": "<opaque token string>",
|
|
109
|
+
"creationTime": 0,
|
|
110
|
+
"maxAge": 63072000000
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Before mounting the native view, the SDK discards expired records and calls
|
|
115
|
+
`POST /api/experiments?forceMigrate=true` for valid tokens. On success it passes
|
|
116
|
+
the token returned in `x-tf-user-token` to the native SDK once, then calls
|
|
117
|
+
`completeLegacyUserMigration` with the original serialized value. The native
|
|
118
|
+
WebView cookie store owns subsequent JWT rotation.
|
|
119
|
+
|
|
120
|
+
The completion callback also runs when the reader returns no token or the
|
|
121
|
+
stored token is expired, allowing the host application to persist its marker
|
|
122
|
+
and avoid future legacy-token reads. It does not run after storage, network,
|
|
123
|
+
validation, or migration failures, so those failures remain retryable. While
|
|
124
|
+
the first migration check is pending, the recommendation view is not rendered.
|
|
125
|
+
|
|
61
126
|
### `options`
|
|
62
127
|
|
|
63
128
|
| Name | Type | Default |
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
package com.truefit.reactnative
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
|
+
import com.facebook.react.bridge.Promise
|
|
4
5
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
6
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
7
|
import com.facebook.react.bridge.ReactMethod
|
|
7
8
|
import com.facebook.react.bridge.ReadableMap
|
|
8
9
|
import com.facebook.react.bridge.ReadableType
|
|
10
|
+
import com.truefit.recommendation.TrueFit
|
|
9
11
|
import com.truefit.recommendation.TrueFitApi
|
|
10
12
|
|
|
11
13
|
/**
|
|
@@ -18,6 +20,11 @@ class TrueFitOrderModule(reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
18
20
|
|
|
19
21
|
override fun getName() = NAME
|
|
20
22
|
|
|
23
|
+
@ReactMethod
|
|
24
|
+
fun getToken(promise: Promise) {
|
|
25
|
+
promise.resolve(TrueFit.getToken())
|
|
26
|
+
}
|
|
27
|
+
|
|
21
28
|
@ReactMethod
|
|
22
29
|
fun trackOrder(arguments: ReadableMap) {
|
|
23
30
|
val storeKey = arguments.nonBlankString("storeKey")
|
package/ios/TrueFitOrderModule.m
CHANGED
|
@@ -38,6 +38,15 @@ final class TrueFitOrderModule: NSObject {
|
|
|
38
38
|
)
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
@objc func getToken(
|
|
42
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
43
|
+
rejecter _: @escaping RCTPromiseRejectBlock
|
|
44
|
+
) {
|
|
45
|
+
TFTokenManager.getToken { token in
|
|
46
|
+
resolve(token)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
41
50
|
// MARK: - Argument mapping
|
|
42
51
|
|
|
43
52
|
private static func products(from value: Any?) -> [TFTrackOrderProduct]? {
|
package/lib/commonjs/index.js
CHANGED
|
@@ -3,12 +3,38 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.TrueFitRecommendationView =
|
|
7
|
-
exports.trackOrder = exports.default = void 0;
|
|
6
|
+
exports.trackOrder = exports.getToken = exports.default = exports.TrueFitRecommendationView = void 0;
|
|
8
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _zod = require("zod");
|
|
10
10
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
11
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
const DEVELOPMENT_BASE_URL = 'https://consumer-dev.truefitcorp.com';
|
|
13
|
+
const PRODUCTION_BASE_URL = 'https://consumer-v2.truefitcorp.com';
|
|
14
|
+
const LEGACY_USER_TOKEN_HEADER = 'x-tf-usertoken';
|
|
15
|
+
const USER_TOKEN_HEADER = 'x-tf-user-token';
|
|
16
|
+
const legacyUserMigrationSchema = _zod.z.object({
|
|
17
|
+
readLegacyUserToken: _zod.z.custom(value => typeof value === 'function'),
|
|
18
|
+
completeLegacyUserMigration: _zod.z.custom(value => typeof value === 'function'),
|
|
19
|
+
onLegacyUserMigrationError: _zod.z.custom(value => typeof value === 'function').optional()
|
|
20
|
+
});
|
|
21
|
+
const legacyUserTokenRecordSchema = _zod.z.object({
|
|
22
|
+
token: _zod.z.string().min(1),
|
|
23
|
+
creationTime: _zod.z.number().int().nonnegative(),
|
|
24
|
+
maxAge: _zod.z.number().int().nonnegative()
|
|
25
|
+
});
|
|
26
|
+
const migrationResponseSchema = _zod.z.object({
|
|
27
|
+
migrated: _zod.z.boolean()
|
|
28
|
+
});
|
|
29
|
+
const legacyUserMigrationStateSchema = _zod.z.discriminatedUnion('status', [_zod.z.object({
|
|
30
|
+
status: _zod.z.literal('pending'),
|
|
31
|
+
migrationKey: _zod.z.string()
|
|
32
|
+
}), _zod.z.object({
|
|
33
|
+
status: _zod.z.literal('ready'),
|
|
34
|
+
migrationKey: _zod.z.string().nullable(),
|
|
35
|
+
userToken: _zod.z.string().nullable()
|
|
36
|
+
})]);
|
|
37
|
+
|
|
12
38
|
/**
|
|
13
39
|
* Which True Fit environment to point at. The native SDKs resolve the widget
|
|
14
40
|
* script URL from this internally; consumers never pass raw URLs.
|
|
@@ -24,15 +50,205 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
24
50
|
|
|
25
51
|
const NativeTrueFitRecommendationView = (0, _reactNative.requireNativeComponent)('TrueFitRecommendationView');
|
|
26
52
|
const DEFAULT_MIN_HEIGHT = 86;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
53
|
+
const pendingLegacyUserMigrations = new Map();
|
|
54
|
+
const resolveApiBaseUrl = args => {
|
|
55
|
+
const {
|
|
56
|
+
config
|
|
57
|
+
} = args;
|
|
58
|
+
if (config.scriptUrl) return new URL(config.scriptUrl).origin;
|
|
59
|
+
if (config.environment === 'development') return DEVELOPMENT_BASE_URL;
|
|
60
|
+
return PRODUCTION_BASE_URL;
|
|
61
|
+
};
|
|
62
|
+
const parseLegacyUserTokenRecord = storedValue => legacyUserTokenRecordSchema.parse(JSON.parse(storedValue));
|
|
63
|
+
const isLegacyUserTokenExpired = args => {
|
|
64
|
+
const {
|
|
65
|
+
creationTime,
|
|
66
|
+
maxAge
|
|
67
|
+
} = args;
|
|
68
|
+
return Date.now() >= creationTime + maxAge;
|
|
69
|
+
};
|
|
70
|
+
const migrateLegacyUser = async args => {
|
|
71
|
+
const {
|
|
72
|
+
config,
|
|
73
|
+
legacyUserMigration
|
|
74
|
+
} = args;
|
|
75
|
+
const {
|
|
76
|
+
completeLegacyUserMigration,
|
|
77
|
+
readLegacyUserToken
|
|
78
|
+
} = legacyUserMigration;
|
|
79
|
+
const storedValue = await readLegacyUserToken();
|
|
80
|
+
if (!storedValue) {
|
|
81
|
+
try {
|
|
82
|
+
await completeLegacyUserMigration(null);
|
|
83
|
+
} catch (value) {
|
|
84
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const legacyUserTokenRecord = parseLegacyUserTokenRecord(storedValue);
|
|
89
|
+
if (isLegacyUserTokenExpired(legacyUserTokenRecord)) {
|
|
90
|
+
try {
|
|
91
|
+
await completeLegacyUserMigration(storedValue);
|
|
92
|
+
} catch (value) {
|
|
93
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const apiBaseUrl = resolveApiBaseUrl({
|
|
98
|
+
config
|
|
99
|
+
});
|
|
100
|
+
const migrationUrl = `${apiBaseUrl}/api/experiments?storeKey=${encodeURIComponent(config.storeKey ?? '')}&forceMigrate=true`;
|
|
101
|
+
const response = await fetch(migrationUrl, {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
credentials: 'include',
|
|
104
|
+
headers: {
|
|
105
|
+
[LEGACY_USER_TOKEN_HEADER]: legacyUserTokenRecord.token
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error(`Legacy user migration failed with status ${response.status}`);
|
|
110
|
+
}
|
|
111
|
+
const migrationResponse = migrationResponseSchema.parse(await response.json());
|
|
112
|
+
if (!migrationResponse.migrated) return null;
|
|
113
|
+
const migratedUserToken = response.headers.get(USER_TOKEN_HEADER)?.trim();
|
|
114
|
+
if (!migratedUserToken) {
|
|
115
|
+
throw new Error('Legacy user migration did not return a user token');
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
await completeLegacyUserMigration(storedValue);
|
|
119
|
+
} catch (value) {
|
|
120
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
121
|
+
}
|
|
122
|
+
return migratedUserToken;
|
|
123
|
+
};
|
|
124
|
+
const getError = value => value instanceof Error ? value : new Error(String(value));
|
|
125
|
+
const getLegacyUserMigration = args => {
|
|
126
|
+
const {
|
|
127
|
+
config,
|
|
128
|
+
legacyUserMigration,
|
|
129
|
+
migrationKey
|
|
130
|
+
} = args;
|
|
131
|
+
const pendingMigration = pendingLegacyUserMigrations.get(migrationKey);
|
|
132
|
+
if (pendingMigration) return pendingMigration;
|
|
133
|
+
const migration = migrateLegacyUser({
|
|
134
|
+
config,
|
|
135
|
+
legacyUserMigration
|
|
136
|
+
});
|
|
137
|
+
pendingLegacyUserMigrations.set(migrationKey, migration);
|
|
138
|
+
const clearPendingMigration = () => {
|
|
139
|
+
if (pendingLegacyUserMigrations.get(migrationKey) === migration) {
|
|
140
|
+
pendingLegacyUserMigrations.delete(migrationKey);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
void migration.then(clearPendingMigration, clearPendingMigration);
|
|
144
|
+
return migration;
|
|
145
|
+
};
|
|
146
|
+
const useLegacyUserMigration = args => {
|
|
147
|
+
const {
|
|
148
|
+
config,
|
|
149
|
+
legacyUserMigration
|
|
150
|
+
} = args;
|
|
151
|
+
const legacyUserMigrationRef = (0, _react.useRef)(legacyUserMigration);
|
|
152
|
+
legacyUserMigrationRef.current = legacyUserMigration;
|
|
153
|
+
const environment = config?.environment;
|
|
154
|
+
const scriptUrl = config?.scriptUrl;
|
|
155
|
+
const storeKey = config?.storeKey;
|
|
156
|
+
const configuredUserToken = config?.userToken;
|
|
157
|
+
const hasLegacyUserMigration = Boolean(legacyUserMigration);
|
|
158
|
+
const shouldMigrate = Boolean(hasLegacyUserMigration && storeKey && !configuredUserToken);
|
|
159
|
+
const migrationKey = JSON.stringify([environment, scriptUrl, storeKey]);
|
|
160
|
+
const [migrationState, setMigrationState] = (0, _react.useState)(() => {
|
|
161
|
+
if (shouldMigrate) return {
|
|
162
|
+
status: 'pending',
|
|
163
|
+
migrationKey
|
|
164
|
+
};
|
|
165
|
+
return {
|
|
166
|
+
status: 'ready',
|
|
167
|
+
migrationKey: null,
|
|
168
|
+
userToken: null
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
(0, _react.useEffect)(() => {
|
|
172
|
+
const currentLegacyUserMigration = legacyUserMigrationRef.current;
|
|
173
|
+
if (!currentLegacyUserMigration || !storeKey || configuredUserToken) {
|
|
174
|
+
setMigrationState({
|
|
175
|
+
status: 'ready',
|
|
176
|
+
migrationKey: null,
|
|
177
|
+
userToken: null
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const parsedLegacyUserMigration = legacyUserMigrationSchema.parse(currentLegacyUserMigration);
|
|
182
|
+
const migrationConfig = {
|
|
183
|
+
environment,
|
|
184
|
+
scriptUrl,
|
|
185
|
+
storeKey
|
|
186
|
+
};
|
|
187
|
+
let isActive = true;
|
|
188
|
+
setMigrationState({
|
|
189
|
+
status: 'pending',
|
|
190
|
+
migrationKey
|
|
191
|
+
});
|
|
192
|
+
const migrate = async () => {
|
|
193
|
+
try {
|
|
194
|
+
const userToken = await getLegacyUserMigration({
|
|
195
|
+
config: migrationConfig,
|
|
196
|
+
legacyUserMigration: parsedLegacyUserMigration,
|
|
197
|
+
migrationKey
|
|
198
|
+
});
|
|
199
|
+
if (isActive) {
|
|
200
|
+
setMigrationState({
|
|
201
|
+
status: 'ready',
|
|
202
|
+
migrationKey,
|
|
203
|
+
userToken
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
} catch (value) {
|
|
207
|
+
parsedLegacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
208
|
+
if (isActive) {
|
|
209
|
+
setMigrationState({
|
|
210
|
+
status: 'ready',
|
|
211
|
+
migrationKey,
|
|
212
|
+
userToken: null
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
void migrate();
|
|
218
|
+
return () => {
|
|
219
|
+
isActive = false;
|
|
220
|
+
};
|
|
221
|
+
}, [configuredUserToken, environment, hasLegacyUserMigration, scriptUrl, storeKey]);
|
|
222
|
+
if (!shouldMigrate) {
|
|
223
|
+
return {
|
|
224
|
+
status: 'ready',
|
|
225
|
+
migrationKey: null,
|
|
226
|
+
userToken: null
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (migrationState.migrationKey !== migrationKey) {
|
|
230
|
+
return {
|
|
231
|
+
status: 'pending',
|
|
232
|
+
migrationKey
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return migrationState;
|
|
236
|
+
};
|
|
237
|
+
const TrueFitRecommendationView = args => {
|
|
238
|
+
const {
|
|
239
|
+
config,
|
|
240
|
+
legacyUserMigration,
|
|
241
|
+
options,
|
|
242
|
+
style,
|
|
243
|
+
onPresentationModeChange,
|
|
244
|
+
onHeightChange,
|
|
245
|
+
onWidgetResult,
|
|
246
|
+
onAutoSizeSelect
|
|
247
|
+
} = args;
|
|
248
|
+
const migrationState = useLegacyUserMigration({
|
|
249
|
+
config,
|
|
250
|
+
legacyUserMigration
|
|
251
|
+
});
|
|
36
252
|
const minHeight = options?.minWidgetHeight ?? DEFAULT_MIN_HEIGHT;
|
|
37
253
|
const [measuredHeight, setMeasuredHeight] = (0, _react.useState)(minHeight);
|
|
38
254
|
const [presentationMode, setPresentationMode] = (0, _react.useState)('widget');
|
|
@@ -58,11 +274,16 @@ function TrueFitRecommendationView({
|
|
|
58
274
|
zIndex: presentationMode === 'modal' ? 1000 : undefined,
|
|
59
275
|
elevation: presentationMode === 'modal' ? 16 : undefined
|
|
60
276
|
}], [measuredHeight, minHeight, presentationMode, style]);
|
|
277
|
+
if (migrationState.status === 'pending') return null;
|
|
278
|
+
const resolvedConfig = migrationState.userToken ? {
|
|
279
|
+
...config,
|
|
280
|
+
userToken: migrationState.userToken
|
|
281
|
+
} : config;
|
|
61
282
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
62
283
|
style: containerStyle,
|
|
63
284
|
collapsable: false,
|
|
64
285
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(NativeTrueFitRecommendationView, {
|
|
65
|
-
config:
|
|
286
|
+
config: resolvedConfig,
|
|
66
287
|
options: options,
|
|
67
288
|
style: styles.nativeView,
|
|
68
289
|
onHeightChange: handleHeightChange,
|
|
@@ -71,7 +292,8 @@ function TrueFitRecommendationView({
|
|
|
71
292
|
onAutoSizeSelect: handleAutoSizeSelect
|
|
72
293
|
})
|
|
73
294
|
});
|
|
74
|
-
}
|
|
295
|
+
};
|
|
296
|
+
exports.TrueFitRecommendationView = TrueFitRecommendationView;
|
|
75
297
|
const styles = _reactNative.StyleSheet.create({
|
|
76
298
|
container: {
|
|
77
299
|
width: '100%',
|
|
@@ -83,13 +305,22 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
83
305
|
height: '100%'
|
|
84
306
|
}
|
|
85
307
|
});
|
|
86
|
-
const
|
|
308
|
+
const trueFitNativeModule = _reactNative.NativeModules.TrueFitOrderModule;
|
|
309
|
+
|
|
310
|
+
/** Returns the current True Fit user token from the native WebView cookie store. */
|
|
311
|
+
const getToken = async () => {
|
|
312
|
+
if (!trueFitNativeModule) {
|
|
313
|
+
throw new Error("True Fit token access is unavailable because the native module is not linked. Rebuild the app after installing 'consumer-app-react-native-sdk' (on iOS, run pod install first).");
|
|
314
|
+
}
|
|
315
|
+
return trueFitNativeModule.getToken();
|
|
316
|
+
};
|
|
87
317
|
|
|
88
318
|
/**
|
|
89
319
|
* Reports a completed order to True Fit, for the order confirmation screen.
|
|
90
320
|
* Forwards straight to the native SDKs' order API, which posts in the
|
|
91
321
|
* background and never reports delivery back — so there is nothing to await.
|
|
92
322
|
*/
|
|
323
|
+
exports.getToken = getToken;
|
|
93
324
|
const trackOrder = args => {
|
|
94
325
|
const {
|
|
95
326
|
storeKey,
|
|
@@ -98,10 +329,10 @@ const trackOrder = args => {
|
|
|
98
329
|
environment = 'prod',
|
|
99
330
|
locale
|
|
100
331
|
} = args;
|
|
101
|
-
if (!
|
|
332
|
+
if (!trueFitNativeModule) {
|
|
102
333
|
throw new Error("True Fit order tracking is unavailable because the native module is not linked. Rebuild the app after installing 'consumer-app-react-native-sdk' (on iOS, run pod install first).");
|
|
103
334
|
}
|
|
104
|
-
|
|
335
|
+
trueFitNativeModule.trackOrder({
|
|
105
336
|
storeKey,
|
|
106
337
|
orderId,
|
|
107
338
|
products,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","NativeTrueFitRecommendationView","requireNativeComponent","DEFAULT_MIN_HEIGHT","TrueFitRecommendationView","config","options","style","onPresentationModeChange","onHeightChange","onWidgetResult","onAutoSizeSelect","minHeight","minWidgetHeight","measuredHeight","setMeasuredHeight","useState","presentationMode","setPresentationMode","handleHeightChange","useCallback","event","nextHeight","Math","max","nativeEvent","height","handlePresentationModeChange","nextMode","mode","styleId","handleWidgetResult","handleAutoSizeSelect","containerStyle","useMemo","styles","container","zIndex","undefined","elevation","jsx","View","collapsable","children","nativeView","StyleSheet","create","width","overflow","position","orderModule","NativeModules","TrueFitOrderModule","trackOrder","args","storeKey","orderId","products","environment","locale","Error","exports","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_zod","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEVELOPMENT_BASE_URL","PRODUCTION_BASE_URL","LEGACY_USER_TOKEN_HEADER","USER_TOKEN_HEADER","legacyUserMigrationSchema","z","object","readLegacyUserToken","custom","value","completeLegacyUserMigration","onLegacyUserMigrationError","optional","legacyUserTokenRecordSchema","token","string","min","creationTime","number","int","nonnegative","maxAge","migrationResponseSchema","migrated","boolean","legacyUserMigrationStateSchema","discriminatedUnion","status","literal","migrationKey","nullable","userToken","NativeTrueFitRecommendationView","requireNativeComponent","DEFAULT_MIN_HEIGHT","pendingLegacyUserMigrations","Map","resolveApiBaseUrl","args","config","scriptUrl","URL","origin","environment","parseLegacyUserTokenRecord","storedValue","parse","JSON","isLegacyUserTokenExpired","Date","now","migrateLegacyUser","legacyUserMigration","getError","legacyUserTokenRecord","apiBaseUrl","migrationUrl","encodeURIComponent","storeKey","response","fetch","method","credentials","headers","ok","Error","migrationResponse","json","migratedUserToken","trim","String","getLegacyUserMigration","pendingMigration","migration","clearPendingMigration","delete","then","useLegacyUserMigration","legacyUserMigrationRef","useRef","current","configuredUserToken","hasLegacyUserMigration","Boolean","shouldMigrate","stringify","migrationState","setMigrationState","useState","useEffect","currentLegacyUserMigration","parsedLegacyUserMigration","migrationConfig","isActive","migrate","TrueFitRecommendationView","options","style","onPresentationModeChange","onHeightChange","onWidgetResult","onAutoSizeSelect","minHeight","minWidgetHeight","measuredHeight","setMeasuredHeight","presentationMode","setPresentationMode","handleHeightChange","useCallback","event","nextHeight","Math","max","nativeEvent","height","handlePresentationModeChange","nextMode","mode","styleId","handleWidgetResult","handleAutoSizeSelect","containerStyle","useMemo","styles","container","zIndex","undefined","elevation","resolvedConfig","jsx","View","collapsable","children","nativeView","exports","StyleSheet","create","width","overflow","position","trueFitNativeModule","NativeModules","TrueFitOrderModule","getToken","trackOrder","orderId","products","locale","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,7 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React, { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { NativeModules, requireNativeComponent, StyleSheet, View } from 'react-native';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
const DEVELOPMENT_BASE_URL = 'https://consumer-dev.truefitcorp.com';
|
|
8
|
+
const PRODUCTION_BASE_URL = 'https://consumer-v2.truefitcorp.com';
|
|
9
|
+
const LEGACY_USER_TOKEN_HEADER = 'x-tf-usertoken';
|
|
10
|
+
const USER_TOKEN_HEADER = 'x-tf-user-token';
|
|
11
|
+
const legacyUserMigrationSchema = z.object({
|
|
12
|
+
readLegacyUserToken: z.custom(value => typeof value === 'function'),
|
|
13
|
+
completeLegacyUserMigration: z.custom(value => typeof value === 'function'),
|
|
14
|
+
onLegacyUserMigrationError: z.custom(value => typeof value === 'function').optional()
|
|
15
|
+
});
|
|
16
|
+
const legacyUserTokenRecordSchema = z.object({
|
|
17
|
+
token: z.string().min(1),
|
|
18
|
+
creationTime: z.number().int().nonnegative(),
|
|
19
|
+
maxAge: z.number().int().nonnegative()
|
|
20
|
+
});
|
|
21
|
+
const migrationResponseSchema = z.object({
|
|
22
|
+
migrated: z.boolean()
|
|
23
|
+
});
|
|
24
|
+
const legacyUserMigrationStateSchema = z.discriminatedUnion('status', [z.object({
|
|
25
|
+
status: z.literal('pending'),
|
|
26
|
+
migrationKey: z.string()
|
|
27
|
+
}), z.object({
|
|
28
|
+
status: z.literal('ready'),
|
|
29
|
+
migrationKey: z.string().nullable(),
|
|
30
|
+
userToken: z.string().nullable()
|
|
31
|
+
})]);
|
|
5
32
|
|
|
6
33
|
/**
|
|
7
34
|
* Which True Fit environment to point at. The native SDKs resolve the widget
|
|
@@ -15,18 +42,208 @@ import { NativeModules, requireNativeComponent, StyleSheet, View } from 'react-n
|
|
|
15
42
|
*/
|
|
16
43
|
|
|
17
44
|
/** One line item in a completed order, reported through {@link trackOrder}. */
|
|
18
|
-
|
|
45
|
+
|
|
19
46
|
const NativeTrueFitRecommendationView = requireNativeComponent('TrueFitRecommendationView');
|
|
20
47
|
const DEFAULT_MIN_HEIGHT = 86;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
48
|
+
const pendingLegacyUserMigrations = new Map();
|
|
49
|
+
const resolveApiBaseUrl = args => {
|
|
50
|
+
const {
|
|
51
|
+
config
|
|
52
|
+
} = args;
|
|
53
|
+
if (config.scriptUrl) return new URL(config.scriptUrl).origin;
|
|
54
|
+
if (config.environment === 'development') return DEVELOPMENT_BASE_URL;
|
|
55
|
+
return PRODUCTION_BASE_URL;
|
|
56
|
+
};
|
|
57
|
+
const parseLegacyUserTokenRecord = storedValue => legacyUserTokenRecordSchema.parse(JSON.parse(storedValue));
|
|
58
|
+
const isLegacyUserTokenExpired = args => {
|
|
59
|
+
const {
|
|
60
|
+
creationTime,
|
|
61
|
+
maxAge
|
|
62
|
+
} = args;
|
|
63
|
+
return Date.now() >= creationTime + maxAge;
|
|
64
|
+
};
|
|
65
|
+
const migrateLegacyUser = async args => {
|
|
66
|
+
const {
|
|
67
|
+
config,
|
|
68
|
+
legacyUserMigration
|
|
69
|
+
} = args;
|
|
70
|
+
const {
|
|
71
|
+
completeLegacyUserMigration,
|
|
72
|
+
readLegacyUserToken
|
|
73
|
+
} = legacyUserMigration;
|
|
74
|
+
const storedValue = await readLegacyUserToken();
|
|
75
|
+
if (!storedValue) {
|
|
76
|
+
try {
|
|
77
|
+
await completeLegacyUserMigration(null);
|
|
78
|
+
} catch (value) {
|
|
79
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const legacyUserTokenRecord = parseLegacyUserTokenRecord(storedValue);
|
|
84
|
+
if (isLegacyUserTokenExpired(legacyUserTokenRecord)) {
|
|
85
|
+
try {
|
|
86
|
+
await completeLegacyUserMigration(storedValue);
|
|
87
|
+
} catch (value) {
|
|
88
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const apiBaseUrl = resolveApiBaseUrl({
|
|
93
|
+
config
|
|
94
|
+
});
|
|
95
|
+
const migrationUrl = `${apiBaseUrl}/api/experiments?storeKey=${encodeURIComponent(config.storeKey ?? '')}&forceMigrate=true`;
|
|
96
|
+
const response = await fetch(migrationUrl, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
credentials: 'include',
|
|
99
|
+
headers: {
|
|
100
|
+
[LEGACY_USER_TOKEN_HEADER]: legacyUserTokenRecord.token
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
throw new Error(`Legacy user migration failed with status ${response.status}`);
|
|
105
|
+
}
|
|
106
|
+
const migrationResponse = migrationResponseSchema.parse(await response.json());
|
|
107
|
+
if (!migrationResponse.migrated) return null;
|
|
108
|
+
const migratedUserToken = response.headers.get(USER_TOKEN_HEADER)?.trim();
|
|
109
|
+
if (!migratedUserToken) {
|
|
110
|
+
throw new Error('Legacy user migration did not return a user token');
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await completeLegacyUserMigration(storedValue);
|
|
114
|
+
} catch (value) {
|
|
115
|
+
legacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
116
|
+
}
|
|
117
|
+
return migratedUserToken;
|
|
118
|
+
};
|
|
119
|
+
const getError = value => value instanceof Error ? value : new Error(String(value));
|
|
120
|
+
const getLegacyUserMigration = args => {
|
|
121
|
+
const {
|
|
122
|
+
config,
|
|
123
|
+
legacyUserMigration,
|
|
124
|
+
migrationKey
|
|
125
|
+
} = args;
|
|
126
|
+
const pendingMigration = pendingLegacyUserMigrations.get(migrationKey);
|
|
127
|
+
if (pendingMigration) return pendingMigration;
|
|
128
|
+
const migration = migrateLegacyUser({
|
|
129
|
+
config,
|
|
130
|
+
legacyUserMigration
|
|
131
|
+
});
|
|
132
|
+
pendingLegacyUserMigrations.set(migrationKey, migration);
|
|
133
|
+
const clearPendingMigration = () => {
|
|
134
|
+
if (pendingLegacyUserMigrations.get(migrationKey) === migration) {
|
|
135
|
+
pendingLegacyUserMigrations.delete(migrationKey);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
void migration.then(clearPendingMigration, clearPendingMigration);
|
|
139
|
+
return migration;
|
|
140
|
+
};
|
|
141
|
+
const useLegacyUserMigration = args => {
|
|
142
|
+
const {
|
|
143
|
+
config,
|
|
144
|
+
legacyUserMigration
|
|
145
|
+
} = args;
|
|
146
|
+
const legacyUserMigrationRef = useRef(legacyUserMigration);
|
|
147
|
+
legacyUserMigrationRef.current = legacyUserMigration;
|
|
148
|
+
const environment = config?.environment;
|
|
149
|
+
const scriptUrl = config?.scriptUrl;
|
|
150
|
+
const storeKey = config?.storeKey;
|
|
151
|
+
const configuredUserToken = config?.userToken;
|
|
152
|
+
const hasLegacyUserMigration = Boolean(legacyUserMigration);
|
|
153
|
+
const shouldMigrate = Boolean(hasLegacyUserMigration && storeKey && !configuredUserToken);
|
|
154
|
+
const migrationKey = JSON.stringify([environment, scriptUrl, storeKey]);
|
|
155
|
+
const [migrationState, setMigrationState] = useState(() => {
|
|
156
|
+
if (shouldMigrate) return {
|
|
157
|
+
status: 'pending',
|
|
158
|
+
migrationKey
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
status: 'ready',
|
|
162
|
+
migrationKey: null,
|
|
163
|
+
userToken: null
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
useEffect(() => {
|
|
167
|
+
const currentLegacyUserMigration = legacyUserMigrationRef.current;
|
|
168
|
+
if (!currentLegacyUserMigration || !storeKey || configuredUserToken) {
|
|
169
|
+
setMigrationState({
|
|
170
|
+
status: 'ready',
|
|
171
|
+
migrationKey: null,
|
|
172
|
+
userToken: null
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const parsedLegacyUserMigration = legacyUserMigrationSchema.parse(currentLegacyUserMigration);
|
|
177
|
+
const migrationConfig = {
|
|
178
|
+
environment,
|
|
179
|
+
scriptUrl,
|
|
180
|
+
storeKey
|
|
181
|
+
};
|
|
182
|
+
let isActive = true;
|
|
183
|
+
setMigrationState({
|
|
184
|
+
status: 'pending',
|
|
185
|
+
migrationKey
|
|
186
|
+
});
|
|
187
|
+
const migrate = async () => {
|
|
188
|
+
try {
|
|
189
|
+
const userToken = await getLegacyUserMigration({
|
|
190
|
+
config: migrationConfig,
|
|
191
|
+
legacyUserMigration: parsedLegacyUserMigration,
|
|
192
|
+
migrationKey
|
|
193
|
+
});
|
|
194
|
+
if (isActive) {
|
|
195
|
+
setMigrationState({
|
|
196
|
+
status: 'ready',
|
|
197
|
+
migrationKey,
|
|
198
|
+
userToken
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
} catch (value) {
|
|
202
|
+
parsedLegacyUserMigration.onLegacyUserMigrationError?.(getError(value));
|
|
203
|
+
if (isActive) {
|
|
204
|
+
setMigrationState({
|
|
205
|
+
status: 'ready',
|
|
206
|
+
migrationKey,
|
|
207
|
+
userToken: null
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
void migrate();
|
|
213
|
+
return () => {
|
|
214
|
+
isActive = false;
|
|
215
|
+
};
|
|
216
|
+
}, [configuredUserToken, environment, hasLegacyUserMigration, scriptUrl, storeKey]);
|
|
217
|
+
if (!shouldMigrate) {
|
|
218
|
+
return {
|
|
219
|
+
status: 'ready',
|
|
220
|
+
migrationKey: null,
|
|
221
|
+
userToken: null
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (migrationState.migrationKey !== migrationKey) {
|
|
225
|
+
return {
|
|
226
|
+
status: 'pending',
|
|
227
|
+
migrationKey
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return migrationState;
|
|
231
|
+
};
|
|
232
|
+
export const TrueFitRecommendationView = args => {
|
|
233
|
+
const {
|
|
234
|
+
config,
|
|
235
|
+
legacyUserMigration,
|
|
236
|
+
options,
|
|
237
|
+
style,
|
|
238
|
+
onPresentationModeChange,
|
|
239
|
+
onHeightChange,
|
|
240
|
+
onWidgetResult,
|
|
241
|
+
onAutoSizeSelect
|
|
242
|
+
} = args;
|
|
243
|
+
const migrationState = useLegacyUserMigration({
|
|
244
|
+
config,
|
|
245
|
+
legacyUserMigration
|
|
246
|
+
});
|
|
30
247
|
const minHeight = options?.minWidgetHeight ?? DEFAULT_MIN_HEIGHT;
|
|
31
248
|
const [measuredHeight, setMeasuredHeight] = useState(minHeight);
|
|
32
249
|
const [presentationMode, setPresentationMode] = useState('widget');
|
|
@@ -52,11 +269,16 @@ export function TrueFitRecommendationView({
|
|
|
52
269
|
zIndex: presentationMode === 'modal' ? 1000 : undefined,
|
|
53
270
|
elevation: presentationMode === 'modal' ? 16 : undefined
|
|
54
271
|
}], [measuredHeight, minHeight, presentationMode, style]);
|
|
272
|
+
if (migrationState.status === 'pending') return null;
|
|
273
|
+
const resolvedConfig = migrationState.userToken ? {
|
|
274
|
+
...config,
|
|
275
|
+
userToken: migrationState.userToken
|
|
276
|
+
} : config;
|
|
55
277
|
return /*#__PURE__*/_jsx(View, {
|
|
56
278
|
style: containerStyle,
|
|
57
279
|
collapsable: false,
|
|
58
280
|
children: /*#__PURE__*/_jsx(NativeTrueFitRecommendationView, {
|
|
59
|
-
config:
|
|
281
|
+
config: resolvedConfig,
|
|
60
282
|
options: options,
|
|
61
283
|
style: styles.nativeView,
|
|
62
284
|
onHeightChange: handleHeightChange,
|
|
@@ -65,7 +287,7 @@ export function TrueFitRecommendationView({
|
|
|
65
287
|
onAutoSizeSelect: handleAutoSizeSelect
|
|
66
288
|
})
|
|
67
289
|
});
|
|
68
|
-
}
|
|
290
|
+
};
|
|
69
291
|
const styles = StyleSheet.create({
|
|
70
292
|
container: {
|
|
71
293
|
width: '100%',
|
|
@@ -77,7 +299,15 @@ const styles = StyleSheet.create({
|
|
|
77
299
|
height: '100%'
|
|
78
300
|
}
|
|
79
301
|
});
|
|
80
|
-
const
|
|
302
|
+
const trueFitNativeModule = NativeModules.TrueFitOrderModule;
|
|
303
|
+
|
|
304
|
+
/** Returns the current True Fit user token from the native WebView cookie store. */
|
|
305
|
+
export const getToken = async () => {
|
|
306
|
+
if (!trueFitNativeModule) {
|
|
307
|
+
throw new Error("True Fit token access is unavailable because the native module is not linked. Rebuild the app after installing 'consumer-app-react-native-sdk' (on iOS, run pod install first).");
|
|
308
|
+
}
|
|
309
|
+
return trueFitNativeModule.getToken();
|
|
310
|
+
};
|
|
81
311
|
|
|
82
312
|
/**
|
|
83
313
|
* Reports a completed order to True Fit, for the order confirmation screen.
|
|
@@ -92,10 +322,10 @@ export const trackOrder = args => {
|
|
|
92
322
|
environment = 'prod',
|
|
93
323
|
locale
|
|
94
324
|
} = args;
|
|
95
|
-
if (!
|
|
325
|
+
if (!trueFitNativeModule) {
|
|
96
326
|
throw new Error("True Fit order tracking is unavailable because the native module is not linked. Rebuild the app after installing 'consumer-app-react-native-sdk' (on iOS, run pod install first).");
|
|
97
327
|
}
|
|
98
|
-
|
|
328
|
+
trueFitNativeModule.trackOrder({
|
|
99
329
|
storeKey,
|
|
100
330
|
orderId,
|
|
101
331
|
products,
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useMemo","useState","NativeModules","requireNativeComponent","StyleSheet","View","jsx","_jsx","NativeTrueFitRecommendationView","DEFAULT_MIN_HEIGHT","TrueFitRecommendationView","config","options","style","onPresentationModeChange","onHeightChange","onWidgetResult","onAutoSizeSelect","minHeight","minWidgetHeight","measuredHeight","setMeasuredHeight","presentationMode","setPresentationMode","handleHeightChange","event","nextHeight","Math","max","nativeEvent","height","handlePresentationModeChange","nextMode","mode","styleId","handleWidgetResult","handleAutoSizeSelect","containerStyle","styles","container","zIndex","undefined","elevation","collapsable","children","nativeView","create","width","overflow","position","orderModule","TrueFitOrderModule","trackOrder","args","storeKey","orderId","products","environment","locale","Error"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","NativeModules","requireNativeComponent","StyleSheet","View","z","jsx","_jsx","DEVELOPMENT_BASE_URL","PRODUCTION_BASE_URL","LEGACY_USER_TOKEN_HEADER","USER_TOKEN_HEADER","legacyUserMigrationSchema","object","readLegacyUserToken","custom","value","completeLegacyUserMigration","onLegacyUserMigrationError","optional","legacyUserTokenRecordSchema","token","string","min","creationTime","number","int","nonnegative","maxAge","migrationResponseSchema","migrated","boolean","legacyUserMigrationStateSchema","discriminatedUnion","status","literal","migrationKey","nullable","userToken","NativeTrueFitRecommendationView","DEFAULT_MIN_HEIGHT","pendingLegacyUserMigrations","Map","resolveApiBaseUrl","args","config","scriptUrl","URL","origin","environment","parseLegacyUserTokenRecord","storedValue","parse","JSON","isLegacyUserTokenExpired","Date","now","migrateLegacyUser","legacyUserMigration","getError","legacyUserTokenRecord","apiBaseUrl","migrationUrl","encodeURIComponent","storeKey","response","fetch","method","credentials","headers","ok","Error","migrationResponse","json","migratedUserToken","get","trim","String","getLegacyUserMigration","pendingMigration","migration","set","clearPendingMigration","delete","then","useLegacyUserMigration","legacyUserMigrationRef","current","configuredUserToken","hasLegacyUserMigration","Boolean","shouldMigrate","stringify","migrationState","setMigrationState","currentLegacyUserMigration","parsedLegacyUserMigration","migrationConfig","isActive","migrate","TrueFitRecommendationView","options","style","onPresentationModeChange","onHeightChange","onWidgetResult","onAutoSizeSelect","minHeight","minWidgetHeight","measuredHeight","setMeasuredHeight","presentationMode","setPresentationMode","handleHeightChange","event","nextHeight","Math","max","nativeEvent","height","handlePresentationModeChange","nextMode","mode","styleId","handleWidgetResult","handleAutoSizeSelect","containerStyle","styles","container","zIndex","undefined","elevation","resolvedConfig","collapsable","children","nativeView","create","width","overflow","position","trueFitNativeModule","TrueFitOrderModule","getToken","trackOrder","orderId","products","locale"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
declare const legacyUserMigrationSchema: z.ZodObject<{
|
|
5
|
+
readLegacyUserToken: z.ZodCustom<() => Promise<string | null>, () => Promise<string | null>>;
|
|
6
|
+
completeLegacyUserMigration: z.ZodCustom<(storedValue: string | null) => Promise<void>, (storedValue: string | null) => Promise<void>>;
|
|
7
|
+
onLegacyUserMigrationError: z.ZodOptional<z.ZodCustom<(error: Error) => void, (error: Error) => void>>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
export type LegacyUserMigration = z.infer<typeof legacyUserMigrationSchema>;
|
|
3
10
|
/**
|
|
4
11
|
* Which True Fit environment to point at. The native SDKs resolve the widget
|
|
5
12
|
* script URL from this internally; consumers never pass raw URLs.
|
|
@@ -10,7 +17,7 @@ export type TrueFitRecommendationConfig = {
|
|
|
10
17
|
storeKey?: string;
|
|
11
18
|
storeStyle?: string;
|
|
12
19
|
uiLocale?: string;
|
|
13
|
-
/** Connect user token to seed
|
|
20
|
+
/** Connect user token used once to seed the native WebView cookie store. */
|
|
14
21
|
userToken?: string;
|
|
15
22
|
/**
|
|
16
23
|
* Full widget script URL that overrides `environment` (e.g. a built bundle).
|
|
@@ -71,6 +78,7 @@ export type TrackOrderArgs = {
|
|
|
71
78
|
};
|
|
72
79
|
export type TrueFitRecommendationViewProps = {
|
|
73
80
|
config?: TrueFitRecommendationConfig;
|
|
81
|
+
legacyUserMigration?: LegacyUserMigration;
|
|
74
82
|
options?: TrueFitRecommendationOptions;
|
|
75
83
|
style?: StyleProp<ViewStyle>;
|
|
76
84
|
onPresentationModeChange?: (mode: TrueFitPresentationMode, styleId?: string | null) => void;
|
|
@@ -78,7 +86,9 @@ export type TrueFitRecommendationViewProps = {
|
|
|
78
86
|
onWidgetResult?: (result: TrueFitWidgetResult) => void;
|
|
79
87
|
onAutoSizeSelect?: (selection: TrueFitAutoSizeSelect) => void;
|
|
80
88
|
};
|
|
81
|
-
export declare
|
|
89
|
+
export declare const TrueFitRecommendationView: (args: TrueFitRecommendationViewProps) => React.JSX.Element | null;
|
|
90
|
+
/** Returns the current True Fit user token from the native WebView cookie store. */
|
|
91
|
+
export declare const getToken: () => Promise<string | null>;
|
|
82
92
|
/**
|
|
83
93
|
* Reports a completed order to True Fit, for the order confirmation screen.
|
|
84
94
|
* Forwards straight to the native SDKs' order API, which posts in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tfcorp/consumer-app-react-native-sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7",
|
|
4
4
|
"description": "React Native bridge for the True Fit recommendation WebView SDK.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
"react": "*",
|
|
26
26
|
"react-native": "*"
|
|
27
27
|
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"zod": "4.3.6"
|
|
30
|
+
},
|
|
28
31
|
"devDependencies": {
|
|
29
32
|
"@types/react": "^18.2.0",
|
|
30
33
|
"del-cli": "^5.1.0",
|