private _buildTransitionSpec()

in extensions/navigation/src/native-common/NavigatorExperimentalDelegate.tsx [126:184]


    private _buildTransitionSpec(state: Navigation.NavigationState): TransitionSpec {
        const route = (state.routes[state.index] as NavigationRouteState).route;
        let direction: Navigation.NavigationGestureDirection = 'horizontal';
        let customSceneConfig: Navigation.NavigationCustomTransitionConfig | undefined;
        let enableGesture = false;
        let responseDistance = 0;
        const hideShadow = route && route.customSceneConfig && route.customSceneConfig.hideShadow;
        const cardStyle: RX.Types.ViewStyleRuleSet | undefined = route && route.customSceneConfig
            ? route.customSceneConfig.cardStyle
            : undefined;
        let gestureDistanceSet = false;

        if (route) {
            // If defined, use the gestureResponseDistance override
            if (route.gestureResponseDistance !== undefined && route.gestureResponseDistance !== null) {
                responseDistance = route.gestureResponseDistance;
                gestureDistanceSet = true;
            }
            customSceneConfig = this._convertCustomTransitionConfig(route.customSceneConfig);
            switch (route.sceneConfigType) {
                case NavigatorSceneConfigType.FloatFromBottom:
                    direction = 'vertical';
                    if (!gestureDistanceSet) {
                        responseDistance = 150;
                        gestureDistanceSet = true;
                    }
                    break;
                case NavigatorSceneConfigType.Fade:
                case NavigatorSceneConfigType.FadeWithSlide:
                    direction = 'fade';
                    if (!gestureDistanceSet) {
                        responseDistance = 0;
                        gestureDistanceSet = true;
                    }
                    break;
                // Currently we support only right to left animation
                // case NavigatorSceneConfigType.FloatFromRight:
                // case NavigatorSceneConfigType.FloatFromLeft:
                default:
                    break;
            }
        }

        // Fall back to 30 as a default for responseDistance
        if (!gestureDistanceSet) {
            responseDistance = 30;
        }
        // Conditionally enable gestures
        enableGesture = responseDistance > 0;

        return {
            enableGesture: enableGesture,
            gestureResponseDistance: responseDistance,
            direction: direction,
            customTransitionConfig: customSceneConfig,
            cardStyle: cardStyle,
            hideShadow: hideShadow,
        };
    }