Skip to content

Commit 9d47143

Browse files
authored
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)
1 parent ebdb47d commit 9d47143

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

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(

0 commit comments

Comments
 (0)