@samitouri / QOS-React / commits / 9d47143e85

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(