Skip to content

Commit 53916c7

Browse files
committed
Implement {,un}hideInstance on RN renderer
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)
1 parent 8eca0ef commit 53916c7

3 files changed

Lines changed: 48 additions & 10 deletions

File tree

packages/react-native-renderer/src/ReactFabricHostConfig.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,16 @@ export function cloneHiddenInstance(
381381
props: Props,
382382
internalInstanceHandle: Object,
383383
): 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+
};
385394
}
386395

387396
export function cloneUnhiddenInstance(
@@ -390,7 +399,17 @@ export function cloneUnhiddenInstance(
390399
props: Props,
391400
internalInstanceHandle: Object,
392401
): 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+
};
394413
}
395414

396415
export function createHiddenTextInstance(

packages/react-native-renderer/src/ReactNativeHostConfig.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,15 +454,34 @@ export function resetTextContent(instance: Instance): void {
454454
}
455455

456456
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+
);
458467
}
459468

460469
export function hideTextInstance(textInstance: TextInstance): void {
461470
throw new Error('Not yet implemented.');
462471
}
463472

464473
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+
);
466485
}
467486

468487
export function unhideTextInstance(

scripts/rollup/results.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -578,15 +578,15 @@
578578
"filename": "ReactNativeRenderer-dev.js",
579579
"bundleType": "RN_FB_DEV",
580580
"packageName": "react-native-renderer",
581-
"size": 544253,
582-
"gzip": 118996
581+
"size": 568201,
582+
"gzip": 124345
583583
},
584584
{
585585
"filename": "ReactNativeRenderer-prod.js",
586586
"bundleType": "RN_FB_PROD",
587587
"packageName": "react-native-renderer",
588-
"size": 229349,
589-
"gzip": 39944
588+
"size": 245823,
589+
"gzip": 43214
590590
},
591591
{
592592
"filename": "ReactNativeRenderer-dev.js",
@@ -774,8 +774,8 @@
774774
"filename": "ReactNativeRenderer-profiling.js",
775775
"bundleType": "RN_FB_PROFILING",
776776
"packageName": "react-native-renderer",
777-
"size": 235159,
778-
"gzip": 41309
777+
"size": 250890,
778+
"gzip": 44396
779779
},
780780
{
781781
"filename": "ReactFabric-profiling.js",

0 commit comments

Comments
 (0)