react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
74 lines (68 loc) • 2.19 kB
text/typescript
import { isFabric } from '../PlatformChecker';
import updateProps from '../UpdateProps';
import type { ShadowNodeWrapper, SharedValue } from '../commonTypes';
import type { Descriptor } from '../hook/commonTypes';
import type {
PanGestureHandlerEventPayload,
ScreenTransitionConfig,
} from './commonTypes';
const IS_FABRIC = isFabric();
function createViewDescriptorPaper(screenId: number | ShadowNodeWrapper) {
'worklet';
return { tag: screenId, name: 'RCTView' };
}
function createViewDescriptorFabric(screenId: number | ShadowNodeWrapper) {
'worklet';
return { shadowNodeWrapper: screenId };
}
const createViewDescriptor = IS_FABRIC
? createViewDescriptorFabric
: createViewDescriptorPaper;
function applyStyleForTopScreen(
screenTransitionConfig: ScreenTransitionConfig,
event: PanGestureHandlerEventPayload
) {
'worklet';
const { screenDimensions, topScreenId, screenTransition } =
screenTransitionConfig;
const { topScreenStyle: computeTopScreenStyle } = screenTransition;
const topScreenStyle = computeTopScreenStyle(event, screenDimensions);
const topScreenDescriptor = {
value: [createViewDescriptor(topScreenId)],
};
updateProps(
topScreenDescriptor as SharedValue<Descriptor[]>,
topScreenStyle,
undefined
);
}
export function applyStyleForBelowTopScreen(
screenTransitionConfig: ScreenTransitionConfig,
event: PanGestureHandlerEventPayload
) {
'worklet';
const { screenDimensions, belowTopScreenId, screenTransition } =
screenTransitionConfig;
const { belowTopScreenStyle: computeBelowTopScreenStyle } = screenTransition;
const belowTopScreenStyle = computeBelowTopScreenStyle(
event,
screenDimensions
);
const belowTopScreenDescriptor = {
value: [createViewDescriptor(belowTopScreenId)],
};
updateProps(
belowTopScreenDescriptor as SharedValue<Descriptor[]>,
belowTopScreenStyle,
undefined
);
}
export function applyStyle(
screenTransitionConfig: ScreenTransitionConfig,
event: PanGestureHandlerEventPayload
) {
'worklet';
applyStyleForTopScreen(screenTransitionConfig, event);
applyStyleForBelowTopScreen(screenTransitionConfig, event);
}
;