"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _Button = _interopRequireDefault(require("../Button"));
var _Surface = _interopRequireDefault(require("../Surface"));
var _Text = _interopRequireDefault(require("../Typography/Text"));
var _theming = require("../../core/theming");
var _tokens = require("../../styles/tokens");
var _IconButton = _interopRequireDefault(require("../IconButton/IconButton"));
var _color = _interopRequireDefault(require("color"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const DURATION_SHORT = 4000;
const DURATION_MEDIUM = 7000;
const DURATION_LONG = 10000;
const Toast = _ref => {
  let {
    visible,
    onPress: onPressAction,
    duration = DURATION_MEDIUM,
    onDismiss,
    children,
    wrapperStyle,
    style,
    theme,
    ...rest
  } = _ref;
  const {
    current: opacity
  } = React.useRef(new _reactNative.Animated.Value(0.0));
  const [hidden, setHidden] = React.useState(!visible);
  const hideTimeout = React.useRef(undefined);
  const {
    scale
  } = theme.animation;
  React.useEffect(() => {
    return () => {
      if (hideTimeout.current) clearTimeout(hideTimeout.current);
    };
  }, []);
  React.useLayoutEffect(() => {
    if (visible) {
      // show
      if (hideTimeout.current) clearTimeout(hideTimeout.current);
      setHidden(false);
      _reactNative.Animated.timing(opacity, {
        toValue: 1,
        duration: 200 * scale,
        easing: _reactNative.Easing.out(_reactNative.Easing.ease),
        useNativeDriver: true
      }).start(_ref2 => {
        let {
          finished
        } = _ref2;
        if (finished) {
          const isInfinity = duration === Number.POSITIVE_INFINITY || duration === Number.NEGATIVE_INFINITY;
          if (finished && !isInfinity) {
            hideTimeout.current = setTimeout(onDismiss, duration);
          }
        }
      });
    } else {
      // hide
      if (hideTimeout.current) clearTimeout(hideTimeout.current);
      _reactNative.Animated.timing(opacity, {
        toValue: 0,
        duration: 100 * scale,
        useNativeDriver: true
      }).start(_ref3 => {
        let {
          finished
        } = _ref3;
        if (finished) setHidden(true);
      });
    }
  }, [visible, duration, opacity, scale, onDismiss]);
  if (hidden) return null;
  const marginRight = 16;
  const textColor = _tokens.colors.white;
  const getColorForToast = () => {
    switch (rest.color) {
      case "primary":
        return theme.colors.primary.default;
      case "secondary":
        return theme.colors.secondary.default;
      case "success":
        return theme.colors.success.default;
      case "warning":
        return theme.colors.warning.default;
      case "error":
        return theme.colors.error.default;
      case "info":
        return theme.colors.info.default;
      case "light":
        return _tokens.colors.gray100;
      case "dark":
        return _tokens.colors.gray800;
      default:
        return theme.colors.primary.default;
    }
  };
  return /*#__PURE__*/React.createElement(_reactNative.SafeAreaView, {
    pointerEvents: "box-none",
    style: [styles.wrapper, wrapperStyle]
  }, /*#__PURE__*/React.createElement(_Surface.default, _extends({
    pointerEvents: "box-none",
    accessibilityLiveRegion: "polite",
    style: [styles.elevation, styles.container, {
      borderRadius: 8,
      opacity: opacity,
      transform: [{
        scale: visible ? opacity.interpolate({
          inputRange: [0, 1],
          outputRange: [0.9, 1]
        }) : 1
      }]
    }, {
      backgroundColor: getColorForToast()
    }, style],
    elevation: 2
  }, rest), /*#__PURE__*/React.createElement(_Text.default, {
    style: [styles.content, {
      marginRight,
      color: _tokens.colors.white
    }]
  }, children), /*#__PURE__*/React.createElement(_IconButton.default, {
    icon: "close",
    iconColor: (0, _color.default)(getColorForToast()).isDark() ? "white" : "black",
    size: 20,
    onPress: onDismiss,
    containerColor: "transparent"
  }), typeof onPressAction === "function" ? /*#__PURE__*/React.createElement(_Button.default
  // onPress={() => {
  //   onPressAction?.();
  //   onDismiss();
  // }}
  , {
    style: [styles.button],
    textColor: textColor,
    compact: true,
    mode: "text"
  }, "Close") : null));
};

/**
 * Show the Toast for a short duration.
 */
Toast.DURATION_SHORT = DURATION_SHORT;

/**
 * Show the Toast for a medium duration.
 */
Toast.DURATION_MEDIUM = DURATION_MEDIUM;

/**
 * Show the Toast for a long duration.
 */
Toast.DURATION_LONG = DURATION_LONG;
const styles = _reactNative.StyleSheet.create({
  wrapper: {
    position: "absolute",
    bottom: 0,
    width: "100%"
  },
  container: {
    flexDirection: "row",
    justifyContent: "space-between",
    alignItems: "center",
    margin: 8,
    borderRadius: 4
  },
  content: {
    marginLeft: 16,
    marginVertical: 14,
    flexWrap: "wrap",
    flex: 1
  },
  button: {
    marginHorizontal: 8,
    marginVertical: 6
  },
  elevation: {
    elevation: 6
  }
});
var _default = (0, _theming.withTheme)(Toast);
exports.default = _default;
//# sourceMappingURL=Toast.js.map