95 lines
1.7 KiB
JavaScript
95 lines
1.7 KiB
JavaScript
import { Easing, Animated } from 'react-native';
|
|
import { TransitionPresets, HeaderStyleInterpolators } from '@react-navigation/stack';
|
|
|
|
import { isAndroid } from '../deviceInfo';
|
|
import conditional from './conditional';
|
|
|
|
const { multiply } = Animated;
|
|
|
|
const forFadeFromCenter = ({
|
|
current,
|
|
closing
|
|
}) => {
|
|
const opacity = conditional(
|
|
closing,
|
|
current.progress,
|
|
current.progress.interpolate({
|
|
inputRange: [0, 0.5, 0.9, 1],
|
|
outputRange: [0, 0.25, 0.7, 1]
|
|
})
|
|
);
|
|
|
|
return {
|
|
cardStyle: {
|
|
opacity
|
|
}
|
|
};
|
|
};
|
|
|
|
const FadeIn = {
|
|
animation: 'timing',
|
|
config: {
|
|
duration: 250,
|
|
easing: Easing.out(Easing.poly(5))
|
|
}
|
|
};
|
|
|
|
const FadeOut = {
|
|
animation: 'timing',
|
|
config: {
|
|
duration: 150,
|
|
easing: Easing.in(Easing.poly(5))
|
|
}
|
|
};
|
|
|
|
export const FadeFromCenterModal = {
|
|
gestureDirection: 'vertical',
|
|
transitionSpec: {
|
|
open: FadeIn,
|
|
close: FadeOut
|
|
},
|
|
cardStyleInterpolator: forFadeFromCenter
|
|
};
|
|
|
|
const forStackAndroid = ({
|
|
current,
|
|
inverted,
|
|
layouts: { screen }
|
|
}) => {
|
|
const translateX = multiply(
|
|
current.progress.interpolate({
|
|
inputRange: [0, 1],
|
|
outputRange: [screen.width, 0]
|
|
}),
|
|
inverted
|
|
);
|
|
|
|
const opacity = multiply(
|
|
current.progress.interpolate({
|
|
inputRange: [0, 1],
|
|
outputRange: [0, 1]
|
|
}),
|
|
inverted
|
|
);
|
|
|
|
return {
|
|
cardStyle: {
|
|
opacity,
|
|
transform: [{ translateX }]
|
|
}
|
|
};
|
|
};
|
|
|
|
const StackAndroid = {
|
|
gestureDirection: 'horizontal',
|
|
transitionSpec: {
|
|
open: FadeIn,
|
|
close: FadeOut
|
|
},
|
|
cardStyleInterpolator: forStackAndroid,
|
|
headerStyleInterpolator: HeaderStyleInterpolators.forFade
|
|
};
|
|
|
|
export const StackAnimation = isAndroid ? StackAndroid : TransitionPresets.SlideFromRightIOS;
|
|
export const ModalAnimation = TransitionPresets.ModalTransition;
|