import React, { PropsWithChildren, useCallback, useEffect } from 'react';
import { View } from 'react-native';
import { Portal } from 'react-native-teleport';
import {
MessageOverlayTargetProvider,
useMessageContext,
useMessageOverlayRuntimeContext,
} from '../../contexts/messageContext/MessageContext';
export type MessageOverlayWrapperProps = PropsWithChildren<{
/**
* Stable identifier for this overlay target. Must match `messageOverlayTargetId`
* when this subtree should be teleported into the overlay.
*/
targetId: string;
/**
* Optional test id attached to the wrapped target container.
*/
testID?: string;
}>;
/**
* Wraps the primary message overlay target so the active message can be teleported
* into the overlay host while a placeholder preserves its original layout space.
*/
export const MessageOverlayWrapper = ({
children,
targetId,
testID,
}: MessageOverlayWrapperProps) => {
const { registerMessageOverlayTarget, unregisterMessageOverlayTarget } = useMessageContext();
const { messageOverlayTargetId, overlayActive, overlayTargetRectRef } =
useMessageOverlayRuntimeContext();
const isActiveTarget = messageOverlayTargetId === targetId;
const placeholderLayout = overlayTargetRectRef.current;
const handleTargetRef = useCallback(
(view: View | null) => {
registerMessageOverlayTarget({
id: targetId,
view,
});
},
[registerMessageOverlayTarget, targetId],
);
useEffect(
() => () => {
unregisterMessageOverlayTarget(targetId);
},
[targetId, unregisterMessageOverlayTarget],
);
if (!isActiveTarget) {
return children;
}
return (
<>
{children}
{overlayActive ? (
0 ? placeholderLayout.w : '100%',
}}
testID={testID ? `${testID}-placeholder` : 'message-overlay-wrapper-placeholder'}
/>
) : null}
>
);
};