HeaderStyleInterpolator.js 1.94 KB
import { I18nManager } from 'react-native';

import getSceneIndicesForInterpolationInputRange from '../../utils/getSceneIndicesForInterpolationInputRange';

/**
 * Utility that builds the style for the navigation header.
 *
 * +-------------+-------------+-------------+
 * |             |             |             |
 * |    Left     |   Title     |   Right     |
 * |  Component  |  Component  | Component   |
 * |             |             |             |
 * +-------------+-------------+-------------+
 */

function forLeft(props) {
  const { position, scene, scenes } = props;
  const interpolate = getSceneIndicesForInterpolationInputRange(props);

  if (!interpolate) return { opacity: 0 };

  const { first, last } = interpolate;
  const index = scene.index;

  return {
    opacity: position.interpolate({
      inputRange: [first, first + Math.abs(index - first) / 2, index, last - Math.abs(last - index) / 2, last],
      outputRange: [0, 0, 1, 0, 0]
    })
  };
}

function forCenter(props) {
  const { position, scene } = props;
  const interpolate = getSceneIndicesForInterpolationInputRange(props);

  if (!interpolate) return { opacity: 0 };

  const { first, last } = interpolate;
  const index = scene.index;
  const inputRange = [first, index, last];

  return {
    opacity: position.interpolate({
      inputRange,
      outputRange: [0, 1, 0]
    }),
    transform: [{
      translateX: position.interpolate({
        inputRange,
        outputRange: I18nManager.isRTL ? [-200, 0, 200] : [200, 0, -200]
      })
    }]
  };
}

function forRight(props) {
  const { position, scene } = props;
  const interpolate = getSceneIndicesForInterpolationInputRange(props);

  if (!interpolate) return { opacity: 0 };
  const { first, last } = interpolate;
  const index = scene.index;

  return {
    opacity: position.interpolate({
      inputRange: [first, index, last],
      outputRange: [0, 1, 0]
    })
  };
}

export default {
  forLeft,
  forCenter,
  forRight
};