Implement {,un}hideInstance on RN renderer (#14115)
This is required to use lazy. Test Plan: * Verified lazy works on a real world use case (shows spinner, shows real content). * Verified that if I change the primary content's styles to have `display: 'none'` then it never appears (i.e., the code in `unhide` reads the styles successfully)
Sophie Alpert committed
Nov 5, 2018 at 15:33 UTC
9d47143e85105cc0213949fae33960200c38560f
2 files changed
+42
-4
packages/react-native-renderer/src/ReactFabricHostConfig.js
+21
-2
@@ -381,7 +381,16 @@ export function cloneHiddenInstance(
381
props: Props,
382
internalInstanceHandle: Object,
383
): Instance {
384
- throw new Error('Not yet implemented.');
384
+ const viewConfig = instance.canonical.viewConfig;
385
+ const node = instance.node;
386
+ const updatePayload = ReactNativeAttributePayload.create(
387
+ {style: {display: 'none'}},
388
+ viewConfig.validAttributes,
389
+ );
390
+ return {
391
+ node: cloneNodeWithNewProps(node, updatePayload),
392
+ canonical: instance.canonical,
393
+ };
394
}
395
396
export function cloneUnhiddenInstance(
@@ -390,7 +399,17 @@ export function cloneUnhiddenInstance(
399
props: Props,
400
internalInstanceHandle: Object,
401
): Instance {
393
- throw new Error('Not yet implemented.');
402
+ const viewConfig = instance.canonical.viewConfig;
403
+ const node = instance.node;
404
+ const updatePayload = ReactNativeAttributePayload.diff(
405
+ {...props, style: [props.style, {display: 'none'}]},
406
+ props,
407
+ viewConfig.validAttributes,
408
+ );
409
+ return {
410
+ node: cloneNodeWithNewProps(node, updatePayload),
411
+ canonical: instance.canonical,
412
+ };
413
}
414
415
export function createHiddenTextInstance(
packages/react-native-renderer/src/ReactNativeHostConfig.js
+21
-2
@@ -454,7 +454,16 @@ export function resetTextContent(instance: Instance): void {
454
}
455
456
export function hideInstance(instance: Instance): void {
457
- throw new Error('Not yet implemented.');
457
+ const viewConfig = instance.viewConfig;
458
+ const updatePayload = ReactNativeAttributePayload.create(
459
+ {style: {display: 'none'}},
460
+ viewConfig.validAttributes,
461
+ );
462
+ UIManager.updateView(
463
+ instance._nativeTag,
464
+ viewConfig.uiViewClassName,
465
+ updatePayload,
466
+ );
467
}
468
469
export function hideTextInstance(textInstance: TextInstance): void {
@@ -462,7 +471,17 @@ export function hideTextInstance(textInstance: TextInstance): void {
471
}
472
473
export function unhideInstance(instance: Instance, props: Props): void {
465
- throw new Error('Not yet implemented.');
474
+ const viewConfig = instance.viewConfig;
475
+ const updatePayload = ReactNativeAttributePayload.diff(
476
+ {...props, style: [props.style, {display: 'none'}]},
477
+ props,
478
+ viewConfig.validAttributes,
479
+ );
480
+ UIManager.updateView(
481
+ instance._nativeTag,
482
+ viewConfig.uiViewClassName,
483
+ updatePayload,
484
+ );
485
}
486
487
export function unhideTextInstance(