@thinkersteps_labs/3d-viewer-react-native 0.0.0-stage → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/Viewer.d.ts +5 -0
  2. package/dist/Viewer.d.ts.map +1 -0
  3. package/dist/Viewer.js +157 -0
  4. package/dist/Viewer.js.map +1 -0
  5. package/dist/bridge/ar-launcher.d.ts +6 -0
  6. package/dist/bridge/ar-launcher.d.ts.map +1 -0
  7. package/dist/bridge/ar-launcher.js +18 -0
  8. package/dist/bridge/ar-launcher.js.map +1 -0
  9. package/dist/bridge/runtime-bundle.d.ts +2 -0
  10. package/dist/bridge/runtime-bundle.d.ts.map +1 -0
  11. package/dist/bridge/runtime-bundle.js +3 -0
  12. package/dist/bridge/runtime-bundle.js.map +1 -0
  13. package/dist/bridge/runtime-entry.d.ts +2 -0
  14. package/dist/bridge/runtime-entry.d.ts.map +1 -0
  15. package/dist/bridge/runtime-entry.js +616 -0
  16. package/dist/bridge/runtime-entry.js.map +1 -0
  17. package/dist/bridge/types.d.ts +186 -0
  18. package/dist/bridge/types.d.ts.map +1 -0
  19. package/dist/bridge/types.js +2 -0
  20. package/dist/bridge/types.js.map +1 -0
  21. package/dist/hooks/useViewerBridge.d.ts +16 -0
  22. package/dist/hooks/useViewerBridge.d.ts.map +1 -0
  23. package/dist/hooks/useViewerBridge.js +565 -0
  24. package/dist/hooks/useViewerBridge.js.map +1 -0
  25. package/dist/hooks/useViewerGestureLock.d.ts +23 -0
  26. package/dist/hooks/useViewerGestureLock.d.ts.map +1 -0
  27. package/dist/hooks/useViewerGestureLock.js +49 -0
  28. package/dist/hooks/useViewerGestureLock.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +7 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/swatches/JewelryCustomizer.d.ts +16 -0
  34. package/dist/swatches/JewelryCustomizer.d.ts.map +1 -0
  35. package/dist/swatches/JewelryCustomizer.js +36 -0
  36. package/dist/swatches/JewelryCustomizer.js.map +1 -0
  37. package/dist/swatches/MetalSwatches.d.ts +13 -0
  38. package/dist/swatches/MetalSwatches.d.ts.map +1 -0
  39. package/dist/swatches/MetalSwatches.js +81 -0
  40. package/dist/swatches/MetalSwatches.js.map +1 -0
  41. package/dist/swatches/ShapeSelect.d.ts +15 -0
  42. package/dist/swatches/ShapeSelect.d.ts.map +1 -0
  43. package/dist/swatches/ShapeSelect.js +226 -0
  44. package/dist/swatches/ShapeSelect.js.map +1 -0
  45. package/dist/swatches/ShapeSwatches.d.ts +22 -0
  46. package/dist/swatches/ShapeSwatches.d.ts.map +1 -0
  47. package/dist/swatches/ShapeSwatches.js +144 -0
  48. package/dist/swatches/ShapeSwatches.js.map +1 -0
  49. package/dist/swatches/StoneSwatches.d.ts +13 -0
  50. package/dist/swatches/StoneSwatches.d.ts.map +1 -0
  51. package/dist/swatches/StoneSwatches.js +81 -0
  52. package/dist/swatches/StoneSwatches.js.map +1 -0
  53. package/dist/swatches/index.d.ts +7 -0
  54. package/dist/swatches/index.d.ts.map +1 -0
  55. package/dist/swatches/index.js +7 -0
  56. package/dist/swatches/index.js.map +1 -0
  57. package/dist/swatches/useJewelryCustomizer.d.ts +33 -0
  58. package/dist/swatches/useJewelryCustomizer.d.ts.map +1 -0
  59. package/dist/swatches/useJewelryCustomizer.js +43 -0
  60. package/dist/swatches/useJewelryCustomizer.js.map +1 -0
  61. package/dist/types.d.ts +103 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +50 -6
  66. package/README.md +0 -3
@@ -0,0 +1,565 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { AppState, Platform } from 'react-native';
3
+ import { launchPlatformAR } from '../bridge/ar-launcher.js';
4
+ const DEFAULT_RPC_TIMEOUT_MS = 15_000;
5
+ export function createViewerError(code, message, reqId) {
6
+ const err = new Error(message);
7
+ err.name = 'ViewerError';
8
+ err.code = code;
9
+ if (reqId)
10
+ err.reqId = reqId;
11
+ return err;
12
+ }
13
+ export function useViewerBridge(props) {
14
+ const webViewRef = useRef(null);
15
+ const isReadyRef = useRef(false);
16
+ const [isReady, setIsReady] = useState(false);
17
+ // Command queue for messages dispatched before VIEWER_READY
18
+ const commandQueueRef = useRef([]);
19
+ // Active RPC requests keyed by reqId
20
+ const pendingRequestsRef = useRef(new Map());
21
+ const reqCounterRef = useRef(0);
22
+ // Mutable cache of the latest state for crash recovery & fullscreen modal hydration
23
+ const lastKnownStateRef = useRef({
24
+ source: resolveSourceInput(props.source, props.src, props.format),
25
+ config: extractConfigFromProps(props),
26
+ });
27
+ // Keep latest callback refs to avoid stale closures in onMessage
28
+ const callbacksRef = useRef(props);
29
+ callbacksRef.current = props;
30
+ const sendCommand = useCallback((command) => {
31
+ // Update state cache for crash recovery / hydration
32
+ cacheOutboundCommand(command, lastKnownStateRef.current);
33
+ if (!isReadyRef.current || !webViewRef.current) {
34
+ commandQueueRef.current.push(command);
35
+ return;
36
+ }
37
+ webViewRef.current.postMessage(JSON.stringify(command));
38
+ }, []);
39
+ const flushCommandQueue = useCallback(() => {
40
+ if (!webViewRef.current || !isReadyRef.current)
41
+ return;
42
+ while (commandQueueRef.current.length > 0) {
43
+ const cmd = commandQueueRef.current.shift();
44
+ webViewRef.current.postMessage(JSON.stringify(cmd));
45
+ }
46
+ }, []);
47
+ const hydrateState = useCallback(() => {
48
+ if (!webViewRef.current || !isReadyRef.current)
49
+ return;
50
+ const { source, config } = lastKnownStateRef.current;
51
+ if (Object.keys(config).length > 0) {
52
+ webViewRef.current.postMessage(JSON.stringify({ type: 'APPLY_CONFIG', config }));
53
+ }
54
+ if (source) {
55
+ webViewRef.current.postMessage(JSON.stringify({ type: 'LOAD_MODEL', source }));
56
+ }
57
+ flushCommandQueue();
58
+ }, [flushCommandQueue]);
59
+ // Reject all pending RPC promises on unmount or crash
60
+ const clearPendingRequests = useCallback((reason) => {
61
+ pendingRequestsRef.current.forEach((pending, reqId) => {
62
+ clearTimeout(pending.timer);
63
+ pending.reject(createViewerError('BRIDGE_TIMEOUT', reason, reqId));
64
+ });
65
+ pendingRequestsRef.current.clear();
66
+ }, []);
67
+ // Inbound message handler from WebView
68
+ const handleMessage = useCallback((event) => {
69
+ let data;
70
+ try {
71
+ data = JSON.parse(event.nativeEvent.data);
72
+ }
73
+ catch {
74
+ return; // Ignore non-JSON messages
75
+ }
76
+ switch (data.type) {
77
+ case 'VIEWER_READY': {
78
+ isReadyRef.current = true;
79
+ setIsReady(true);
80
+ hydrateState();
81
+ break;
82
+ }
83
+ case 'VIEWER_LOADED': {
84
+ callbacksRef.current.onLoaded?.(data.parts, data.materials);
85
+ break;
86
+ }
87
+ case 'VIEWER_PROGRESS': {
88
+ callbacksRef.current.onProgress?.(data.progress);
89
+ break;
90
+ }
91
+ case 'PART_SELECTED': {
92
+ callbacksRef.current.onPartSelected?.({
93
+ meshId: data.meshId,
94
+ partId: data.partId,
95
+ type: data.partType,
96
+ slotIndex: data.slotIndex,
97
+ slotId: data.slotId,
98
+ materialName: data.materialName,
99
+ });
100
+ break;
101
+ }
102
+ case 'VIEWER_CHANGE': {
103
+ callbacksRef.current.onChange?.(data.state);
104
+ break;
105
+ }
106
+ case 'INTERACTION_START': {
107
+ callbacksRef.current.onTouchInteractionChange?.(true);
108
+ break;
109
+ }
110
+ case 'INTERACTION_END': {
111
+ if (data.cameraState) {
112
+ lastKnownStateRef.current.config.cameraState = data.cameraState;
113
+ }
114
+ callbacksRef.current.onTouchInteractionChange?.(false);
115
+ break;
116
+ }
117
+ case 'STATE_READY': {
118
+ const pending = pendingRequestsRef.current.get(data.reqId);
119
+ if (pending) {
120
+ clearTimeout(pending.timer);
121
+ pendingRequestsRef.current.delete(data.reqId);
122
+ pending.resolve(data.state);
123
+ }
124
+ break;
125
+ }
126
+ case 'SNAPSHOT_READY': {
127
+ const pending = pendingRequestsRef.current.get(data.reqId);
128
+ if (pending) {
129
+ clearTimeout(pending.timer);
130
+ pendingRequestsRef.current.delete(data.reqId);
131
+ pending.resolve(data.dataUrl);
132
+ }
133
+ break;
134
+ }
135
+ case 'AR_PAYLOAD_READY': {
136
+ const pending = pendingRequestsRef.current.get(data.reqId);
137
+ if (pending) {
138
+ clearTimeout(pending.timer);
139
+ pendingRequestsRef.current.delete(data.reqId);
140
+ pending.resolve(data);
141
+ }
142
+ break;
143
+ }
144
+ case 'PARTS_READY': {
145
+ const pending = pendingRequestsRef.current.get(data.reqId);
146
+ if (pending) {
147
+ clearTimeout(pending.timer);
148
+ pendingRequestsRef.current.delete(data.reqId);
149
+ pending.resolve(data.parts);
150
+ }
151
+ break;
152
+ }
153
+ case 'MATERIALS_READY': {
154
+ const pending = pendingRequestsRef.current.get(data.reqId);
155
+ if (pending) {
156
+ clearTimeout(pending.timer);
157
+ pendingRequestsRef.current.delete(data.reqId);
158
+ pending.resolve(data.materials);
159
+ }
160
+ break;
161
+ }
162
+ case 'VIEWER_ERROR': {
163
+ const viewerErr = createViewerError(data.code, data.message, data.reqId);
164
+ if (data.reqId && pendingRequestsRef.current.has(data.reqId)) {
165
+ const pending = pendingRequestsRef.current.get(data.reqId);
166
+ clearTimeout(pending.timer);
167
+ pendingRequestsRef.current.delete(data.reqId);
168
+ pending.reject(viewerErr);
169
+ }
170
+ callbacksRef.current.onError?.(viewerErr);
171
+ break;
172
+ }
173
+ }
174
+ }, [hydrateState]);
175
+ // Crash recovery handler for iOS WKWebView & Android RenderProcessGone
176
+ const handleWebViewProcessTerminated = useCallback(() => {
177
+ isReadyRef.current = false;
178
+ setIsReady(false);
179
+ clearPendingRequests('WebView GPU process terminated; reloading runtime.');
180
+ webViewRef.current?.reload();
181
+ }, [clearPendingRequests]);
182
+ // AppState lifecycle: pause render loop when backgrounded
183
+ useEffect(() => {
184
+ const subscription = AppState.addEventListener('change', (nextState) => {
185
+ if (!isReadyRef.current || !webViewRef.current)
186
+ return;
187
+ const shouldRender = nextState === 'active' && (callbacksRef.current.renderActive ?? true);
188
+ webViewRef.current.postMessage(JSON.stringify({
189
+ type: 'SET_RENDER_ACTIVE',
190
+ active: shouldRender,
191
+ }));
192
+ });
193
+ return () => {
194
+ subscription.remove();
195
+ clearPendingRequests('Viewer component unmounted.');
196
+ };
197
+ }, [clearPendingRequests]);
198
+ // Sync declarative prop changes to WebView
199
+ useEffect(() => {
200
+ const nextSource = resolveSourceInput(props.source, props.src, props.format);
201
+ if (nextSource &&
202
+ JSON.stringify(nextSource) !== JSON.stringify(lastKnownStateRef.current.source)) {
203
+ sendCommand({ type: 'LOAD_MODEL', source: nextSource });
204
+ }
205
+ }, [props.source, props.src, props.format, sendCommand]);
206
+ useEffect(() => {
207
+ if (props.state && isReadyRef.current) {
208
+ sendCommand({ type: 'SET_STATE', state: props.state });
209
+ }
210
+ }, [props.state, sendCommand]);
211
+ useEffect(() => {
212
+ const nextConfig = extractConfigFromProps(props);
213
+ lastKnownStateRef.current.config = {
214
+ ...lastKnownStateRef.current.config,
215
+ ...nextConfig,
216
+ };
217
+ if (isReadyRef.current) {
218
+ sendCommand({ type: 'APPLY_CONFIG', config: nextConfig });
219
+ }
220
+ }, [
221
+ props.metalColor,
222
+ props.stoneColor,
223
+ props.shape,
224
+ props.materialColors,
225
+ props.partColors,
226
+ props.environment,
227
+ props.exposure,
228
+ props.metalEnvUrl,
229
+ props.gemEnvUrl,
230
+ props.quality,
231
+ props.diamondQuality,
232
+ props.autoRotate,
233
+ props.autoRotateSpeed,
234
+ props.minZoom,
235
+ props.maxZoom,
236
+ props.fov,
237
+ props.shadows,
238
+ props.background,
239
+ sendCommand,
240
+ ]);
241
+ useEffect(() => {
242
+ if (props.metalEnvUrl && isReadyRef.current) {
243
+ sendCommand({ type: 'SET_METAL_ENVIRONMENT', url: props.metalEnvUrl });
244
+ }
245
+ }, [props.metalEnvUrl, sendCommand]);
246
+ useEffect(() => {
247
+ if (props.gemEnvUrl && isReadyRef.current) {
248
+ sendCommand({ type: 'SET_GEM_ENVIRONMENT', url: props.gemEnvUrl });
249
+ }
250
+ }, [props.gemEnvUrl, sendCommand]);
251
+ useEffect(() => {
252
+ if (typeof props.renderActive === 'boolean' && isReadyRef.current) {
253
+ sendCommand({ type: 'SET_RENDER_ACTIVE', active: props.renderActive });
254
+ }
255
+ }, [props.renderActive, sendCommand]);
256
+ // Imperative ViewerRef API
257
+ const createRpcRequest = useCallback((buildCommand, timeoutMs = DEFAULT_RPC_TIMEOUT_MS) => {
258
+ return new Promise((resolve, reject) => {
259
+ const reqId = `req_${++reqCounterRef.current}_${Date.now()}`;
260
+ const timer = setTimeout(() => {
261
+ pendingRequestsRef.current.delete(reqId);
262
+ const err = createViewerError('BRIDGE_TIMEOUT', `WebView RPC request (${reqId}) timed out after ${timeoutMs}ms`, reqId);
263
+ callbacksRef.current.onError?.(err);
264
+ reject(err);
265
+ }, timeoutMs);
266
+ pendingRequestsRef.current.set(reqId, { resolve, reject, timer });
267
+ sendCommand(buildCommand(reqId));
268
+ });
269
+ }, [sendCommand]);
270
+ const viewerRefMethods = {
271
+ applyConfig: (config) => sendCommand({ type: 'APPLY_CONFIG', config }),
272
+ loadModular: (components, options) => {
273
+ const resolvedComps = {};
274
+ for (const [slot, comp] of Object.entries(components)) {
275
+ if (comp === null || comp === undefined) {
276
+ resolvedComps[slot] = null;
277
+ }
278
+ else if (typeof comp === 'string') {
279
+ resolvedComps[slot] = { url: comp, format: 'glb' };
280
+ }
281
+ else if (typeof comp === 'object' && 'uri' in comp && !('url' in comp)) {
282
+ resolvedComps[slot] = { url: comp.uri, format: comp.format || 'glb' };
283
+ }
284
+ else {
285
+ resolvedComps[slot] = comp;
286
+ }
287
+ }
288
+ sendCommand({ type: 'LOAD_MODULAR', components: resolvedComps, options });
289
+ return Promise.resolve();
290
+ },
291
+ loadComponent: (slot, source, options) => {
292
+ let resolvedSource = null;
293
+ if (source !== null && source !== undefined) {
294
+ if (typeof source === 'string') {
295
+ resolvedSource = { url: source, format: 'glb' };
296
+ }
297
+ else if (typeof source === 'object' && 'uri' in source && !('url' in source)) {
298
+ resolvedSource = { url: source.uri, format: source.format || 'glb' };
299
+ }
300
+ else {
301
+ resolvedSource = source;
302
+ }
303
+ }
304
+ sendCommand({ type: 'LOAD_COMPONENT', slot, source: resolvedSource, options });
305
+ return Promise.resolve();
306
+ },
307
+ setMetalColor: (color) => sendCommand({ type: 'SET_METAL', color }),
308
+ setStoneColor: (color) => sendCommand({ type: 'SET_STONE', color }),
309
+ setShape: (shape) => sendCommand({ type: 'SET_SHAPE', shape }),
310
+ setMaterialColor: (slotId, color) => sendCommand({ type: 'SET_MATERIAL_COLOR', slotId, color }),
311
+ clearMaterialColor: (slotId) => sendCommand({ type: 'CLEAR_MATERIAL_COLOR', slotId }),
312
+ setPartColor: (partId, color, slotIndex) => sendCommand({ type: 'SET_PART_COLOR', partId, color, slotIndex }),
313
+ clearPartColor: (partId, slotIndex) => sendCommand({ type: 'CLEAR_PART_COLOR', partId, slotIndex }),
314
+ setEnvironment: (environment, exposure) => sendCommand({ type: 'SET_ENVIRONMENT', environment, exposure }),
315
+ setMetalEnvironment: (url) => sendCommand({ type: 'SET_METAL_ENVIRONMENT', url }),
316
+ setGemEnvironment: (url) => sendCommand({ type: 'SET_GEM_ENVIRONMENT', url }),
317
+ setRenderActive: (active) => sendCommand({ type: 'SET_RENDER_ACTIVE', active }),
318
+ startRotation: (speed) => sendCommand({ type: 'SET_AUTO_ROTATE', enabled: true, ...(speed !== undefined && { speed }) }),
319
+ stopRotation: () => sendCommand({ type: 'SET_AUTO_ROTATE', enabled: false }),
320
+ setDiamondQuality: (quality) => sendCommand({ type: 'SET_DIAMOND_QUALITY', quality }),
321
+ fitToScene: () => sendCommand({ type: 'FIT_TO_SCENE' }),
322
+ unload: () => sendCommand({ type: 'UNLOAD' }),
323
+ setPartType: (meshId, partType) => sendCommand({ type: 'SET_PART_TYPE', meshId, partType }),
324
+ getParts: () => createRpcRequest((reqId) => ({ type: 'GET_PARTS', reqId })),
325
+ getMaterials: () => createRpcRequest((reqId) => ({ type: 'GET_MATERIALS', reqId })),
326
+ resetCamera: () => sendCommand({ type: 'RESET_CAMERA' }),
327
+ setCameraPreset: (preset) => sendCommand({ type: 'SET_CAMERA_PRESET', preset }),
328
+ setCameraPosition: (position, target) => sendCommand({ type: 'SET_CAMERA_POSITION', position, target }),
329
+ clearOverrides: () => sendCommand({ type: 'CLEAR_OVERRIDES' }),
330
+ getState: () => createRpcRequest((reqId) => ({
331
+ type: 'GET_STATE',
332
+ reqId,
333
+ })),
334
+ setState: (state) => sendCommand({ type: 'SET_STATE', state }),
335
+ captureSnapshot: (options) => createRpcRequest((reqId) => ({
336
+ type: 'CAPTURE_SNAPSHOT',
337
+ reqId,
338
+ format: options?.format ?? 'png',
339
+ quality: options?.quality ?? 0.92,
340
+ })),
341
+ launchAR: async () => {
342
+ const platform = Platform.OS === 'ios' ? 'ios' : 'android';
343
+ const arSource = callbacksRef.current.arSource;
344
+ if (platform === 'ios') {
345
+ const usdzUrl = arSource?.iosUsdzUrl;
346
+ if (!usdzUrl) {
347
+ const err = createViewerError('AR_UNSUPPORTED', 'iOS AR Quick Look requires arSource.iosUsdzUrl (.usdz) to be provided.');
348
+ callbacksRef.current.onError?.(err);
349
+ throw err;
350
+ }
351
+ // Attempt in-WebView <a rel="ar"> launch first, fallback to Linking
352
+ const res = await createRpcRequest((reqId) => ({
353
+ type: 'EXPORT_AR_PAYLOAD',
354
+ reqId,
355
+ platform: 'ios',
356
+ usdzUrl,
357
+ }));
358
+ if (!res.launchedInWebView) {
359
+ await launchPlatformAR({ platform: 'ios', url: usdzUrl });
360
+ }
361
+ return;
362
+ }
363
+ // Android Scene Viewer flow
364
+ const fallbackGlb = arSource?.androidGlbUrl ?? extractStringUrl(lastKnownStateRef.current.source);
365
+ if (!fallbackGlb || !fallbackGlb.startsWith('https://')) {
366
+ const err = createViewerError('AR_UNSUPPORTED', 'Android Scene Viewer requires a public https:// GLB URL via arSource.androidGlbUrl or source.');
367
+ callbacksRef.current.onError?.(err);
368
+ throw err;
369
+ }
370
+ await launchPlatformAR({ platform: 'android', url: fallbackGlb });
371
+ },
372
+ };
373
+ return {
374
+ webViewRef,
375
+ isReady,
376
+ viewerRefMethods,
377
+ handleMessage,
378
+ handleWebViewProcessTerminated,
379
+ lastKnownStateRef,
380
+ };
381
+ }
382
+ // --- Internal Helpers ---
383
+ function resolveSourceInput(source, src, format) {
384
+ if (!source && !src)
385
+ return undefined;
386
+ if (typeof source === 'object' && source !== null && 'modular' in source && source.modular) {
387
+ const modularSource = { modular: true };
388
+ for (const [k, v] of Object.entries(source)) {
389
+ if (k === 'modular')
390
+ continue;
391
+ if (v === null || v === undefined) {
392
+ modularSource[k] = null;
393
+ }
394
+ else if (typeof v === 'string') {
395
+ modularSource[k] = { url: v, format: 'glb' };
396
+ }
397
+ else if (typeof v === 'object' && 'uri' in v && !('url' in v)) {
398
+ modularSource[k] = { url: v.uri, format: v.format || 'glb' };
399
+ }
400
+ else {
401
+ modularSource[k] = v;
402
+ }
403
+ }
404
+ return modularSource;
405
+ }
406
+ let resolved;
407
+ if (source) {
408
+ if (typeof source === 'object' && 'uri' in source && !('url' in source)) {
409
+ resolved = { url: source.uri };
410
+ }
411
+ else {
412
+ resolved = source;
413
+ }
414
+ }
415
+ else if (src) {
416
+ resolved = { url: src };
417
+ }
418
+ if (resolved && format && typeof resolved === 'object' && 'url' in resolved) {
419
+ resolved = { ...resolved, format };
420
+ }
421
+ return resolved;
422
+ }
423
+ function extractStringUrl(source) {
424
+ if (!source)
425
+ return undefined;
426
+ if (typeof source === 'string')
427
+ return source;
428
+ if (typeof source === 'object' && 'url' in source && typeof source.url === 'string') {
429
+ return source.url;
430
+ }
431
+ return undefined;
432
+ }
433
+ function extractConfigFromProps(props) {
434
+ const config = {};
435
+ if (props.metalColor !== undefined)
436
+ config.metalColor = props.metalColor;
437
+ if (props.stoneColor !== undefined)
438
+ config.stoneColor = props.stoneColor;
439
+ if (props.shape !== undefined)
440
+ config.shape = props.shape;
441
+ if (props.materialColors !== undefined)
442
+ config.materialColors = props.materialColors;
443
+ if (props.partColors !== undefined)
444
+ config.partColors = props.partColors;
445
+ if (props.environment !== undefined)
446
+ config.environment = props.environment;
447
+ if (props.exposure !== undefined)
448
+ config.exposure = props.exposure;
449
+ if (props.metalEnvUrl !== undefined)
450
+ config.metalEnvUrl = props.metalEnvUrl;
451
+ if (props.gemEnvUrl !== undefined)
452
+ config.gemEnvUrl = props.gemEnvUrl;
453
+ if (props.quality !== undefined)
454
+ config.quality = props.quality;
455
+ if (props.diamondQuality !== undefined)
456
+ config.diamondQuality = props.diamondQuality;
457
+ if (props.autoRotate !== undefined)
458
+ config.autoRotate = props.autoRotate;
459
+ if (props.autoRotateSpeed !== undefined)
460
+ config.autoRotateSpeed = props.autoRotateSpeed;
461
+ if (props.minZoom !== undefined)
462
+ config.minZoom = props.minZoom;
463
+ if (props.maxZoom !== undefined)
464
+ config.maxZoom = props.maxZoom;
465
+ if (props.fov !== undefined)
466
+ config.fov = props.fov;
467
+ if (props.shadows !== undefined)
468
+ config.shadows = props.shadows;
469
+ if (props.background !== undefined)
470
+ config.background = props.background;
471
+ return config;
472
+ }
473
+ function cacheOutboundCommand(cmd, state) {
474
+ switch (cmd.type) {
475
+ case 'LOAD_MODEL':
476
+ state.source = cmd.source;
477
+ break;
478
+ case 'LOAD_MODULAR':
479
+ state.source = { modular: true, ...cmd.components };
480
+ break;
481
+ case 'LOAD_COMPONENT':
482
+ if (state.source && typeof state.source === 'object' && state.source.modular) {
483
+ state.source = { ...state.source, [cmd.slot]: cmd.source };
484
+ }
485
+ break;
486
+ case 'APPLY_CONFIG':
487
+ state.config = { ...state.config, ...cmd.config };
488
+ break;
489
+ case 'SET_METAL':
490
+ state.config.metalColor = cmd.color;
491
+ break;
492
+ case 'SET_STONE':
493
+ state.config.stoneColor = cmd.color;
494
+ break;
495
+ case 'SET_SHAPE':
496
+ state.config.shape = cmd.shape;
497
+ break;
498
+ case 'SET_MATERIAL_COLOR':
499
+ state.config.materialColors = {
500
+ ...state.config.materialColors,
501
+ [cmd.slotId]: cmd.color,
502
+ };
503
+ break;
504
+ case 'CLEAR_MATERIAL_COLOR':
505
+ if (state.config.materialColors) {
506
+ const next = { ...state.config.materialColors };
507
+ delete next[cmd.slotId];
508
+ state.config.materialColors = next;
509
+ }
510
+ break;
511
+ case 'SET_PART_COLOR':
512
+ state.config.partColors = {
513
+ ...state.config.partColors,
514
+ [cmd.partId]: cmd.color,
515
+ };
516
+ break;
517
+ case 'CLEAR_PART_COLOR':
518
+ if (state.config.partColors) {
519
+ const next = { ...state.config.partColors };
520
+ delete next[cmd.partId];
521
+ state.config.partColors = next;
522
+ }
523
+ break;
524
+ case 'SET_ENVIRONMENT':
525
+ state.config.environment = cmd.environment;
526
+ if (cmd.exposure !== undefined)
527
+ state.config.exposure = cmd.exposure;
528
+ break;
529
+ case 'SET_AUTO_ROTATE':
530
+ state.config.autoRotate = cmd.enabled;
531
+ if (cmd.speed !== undefined)
532
+ state.config.autoRotateSpeed = cmd.speed;
533
+ break;
534
+ case 'SET_DIAMOND_QUALITY':
535
+ state.config.diamondQuality = cmd.quality;
536
+ break;
537
+ case 'UNLOAD':
538
+ delete state.source;
539
+ break;
540
+ case 'SET_PART_TYPE':
541
+ case 'FIT_TO_SCENE':
542
+ break;
543
+ case 'SET_QUALITY':
544
+ state.config.quality = cmd.quality;
545
+ break;
546
+ case 'CLEAR_OVERRIDES':
547
+ state.config.materialColors = {};
548
+ state.config.partColors = {};
549
+ break;
550
+ case 'SET_STATE':
551
+ if (cmd.state.metalColor)
552
+ state.config.metalColor = cmd.state.metalColor;
553
+ if (cmd.state.stoneColor)
554
+ state.config.stoneColor = cmd.state.stoneColor;
555
+ if (cmd.state.materialColors)
556
+ state.config.materialColors = cmd.state.materialColors;
557
+ if (cmd.state.partColors)
558
+ state.config.partColors = cmd.state.partColors;
559
+ break;
560
+ case 'RESET_CAMERA':
561
+ delete state.config.cameraState;
562
+ break;
563
+ }
564
+ }
565
+ //# sourceMappingURL=useViewerBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewerBridge.js","sourceRoot":"","sources":["../../src/hooks/useViewerBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { GestureResponderEvent } from 'react-native';
2
+ export interface UseViewerGestureLockOptions {
3
+ /** Ref to the parent ScrollView or FlatList */
4
+ scrollRef?: React.RefObject<{
5
+ setNativeProps?: (props: Record<string, unknown>) => void;
6
+ } | null>;
7
+ /** Optional callback fired when touch interaction begins or ends */
8
+ onTouchInteractionChange?: (isInteracting: boolean) => void;
9
+ /** Whether gesture locking is enabled (default: true) */
10
+ enabled?: boolean;
11
+ }
12
+ export interface UseViewerGestureLockReturn {
13
+ isInteracting: boolean;
14
+ lockScroll: () => void;
15
+ unlockScroll: () => void;
16
+ containerTouchProps: {
17
+ onTouchStart: (e: GestureResponderEvent) => void;
18
+ onTouchEnd: (e: GestureResponderEvent) => void;
19
+ onTouchCancel: (e: GestureResponderEvent) => void;
20
+ };
21
+ }
22
+ export declare function useViewerGestureLock({ scrollRef, onTouchInteractionChange, enabled, }?: UseViewerGestureLockOptions): UseViewerGestureLockReturn;
23
+ //# sourceMappingURL=useViewerGestureLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewerGestureLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useViewerGestureLock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEzD,MAAM,WAAW,2BAA2B;IAC1C,+CAA+C;IAC/C,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;QAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACjG,oEAAoE;IACpE,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,mBAAmB,EAAE;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAA;QAChD,UAAU,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAA;QAC9C,aAAa,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAA;KAClD,CAAA;CACF;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,wBAAwB,EACxB,OAAc,GACf,GAAE,2BAAgC,GAAG,0BAA0B,CAqD/D"}