"use strict";

exports.__esModule = true;
exports.default = void 0;

var _babelRuntimeJsxStyleTransform = require("babel-runtime-jsx-style-transform");

var _tslib = require("tslib");

var _classnames = _interopRequireDefault(require("classnames"));

var _react = _interopRequireWildcard(require("react"));

var _meetReactComponentOne = require("@alifd/meet-react-component-one");

var _breadCrumb = _interopRequireDefault(require("../bread-crumb"));

var _icon = _interopRequireDefault(require("../icon"));

var _list = _interopRequireDefault(require("../list"));

var _locale = require("../locale");

var _picker = _interopRequireDefault(require("../picker"));

var _view = _interopRequireDefault(require("../view"));

var _selectDrawer = _interopRequireDefault(require("../select-drawer"));

var _utils = require("../utils");

var _tree = require("../utils/tree");

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _extends() { _extends = Object.assign || 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); }

var getInitValue = function (props) {
  var _props$dataSource = props.dataSource,
      dataSource = _props$dataSource === void 0 ? [] : _props$dataSource,
      defaultValue = props.defaultValue,
      value = props.value;
  var ret = [];

  if ('value' in props) {
    if ((0, _utils.isValidArray)(value)) {
      ret = value;
    } else if (!Array.isArray(value) && value) {
      ret = (0, _tree.getFullPathByValue)(props.dataSource, props.value);
    }
  } else if (!(0, _utils.isUndef)(defaultValue)) {
    if ((0, _utils.isValidArray)(defaultValue)) {
      ret = defaultValue;
    } else if (!Array.isArray(defaultValue) && defaultValue) {
      ret = (0, _tree.getFullPathByValue)(dataSource, defaultValue);
    }
  }

  return ret;
};

var getInitInternalValue = function (props) {
  var r = getInitValue(props);
  var isNormalMode = props.mode !== 'mini';

  if (r.length === 0) {
    if (!isNormalMode) {
      return (0, _tree.getFirstValue)(props.dataSource);
    } else {
      return [];
    }
  } else {
    return r;
  }
};

var defaultRenderContent = function (values, separator) {
  if (values === void 0) {
    values = [];
  }

  return Array.isArray(values) ? values.map(function (val) {
    return val.label;
  }).join(separator) : '';
};

var CascaderSelect = function (props, ref) {
  var _classNames;

  var _props$prefix = props.prefix,
      prefix = _props$prefix === void 0 ? 'mt-' : _props$prefix,
      _props$dataSource2 = props.dataSource,
      dataSource = _props$dataSource2 === void 0 ? [] : _props$dataSource2,
      _props$separator = props.separator,
      separator = _props$separator === void 0 ? '/' : _props$separator,
      _props$mode = props.mode,
      mode = _props$mode === void 0 ? 'normal' : _props$mode,
      value = props.value,
      defaultValue = props.defaultValue,
      className = props.className,
      hasClear = props.hasClear,
      _props$useSimpleValue = props.useSimpleValue,
      useSimpleValue = _props$useSimpleValue === void 0 ? false : _props$useSimpleValue,
      onChange = props.onChange,
      _props$rootTipText = props.rootTipText,
      rootTipText = _props$rootTipText === void 0 ? '' : _props$rootTipText,
      localeProp = props.locale,
      loadData = props.loadData,
      isPreview = props.isPreview,
      renderPreview = props.renderPreview,
      _props$size = props.size,
      size = _props$size === void 0 ? 'medium' : _props$size,
      previewClassNameProp = props.previewClassName,
      previewStyle = props.previewStyle,
      _props$onSelect = props.onSelect,
      onSelect = _props$onSelect === void 0 ? function () {} : _props$onSelect,
      _props$onClear = props.onClear,
      onClear = _props$onClear === void 0 ? function () {} : _props$onClear,
      onCancel = props.onCancel,
      _props$renderContent = props.renderContent,
      renderContent = _props$renderContent === void 0 ? defaultRenderContent : _props$renderContent,
      others = (0, _tslib.__rest)(props, ["prefix", "dataSource", "separator", "mode", "value", "defaultValue", "className", "hasClear", "useSimpleValue", "onChange", "rootTipText", "locale", "loadData", "isPreview", "renderPreview", "size", "previewClassName", "previewStyle", "onSelect", "onClear", "onCancel", "renderContent"]);
  var scrollRef = (0, _react.useRef)(null);
  var clsPrefix = prefix + "cascader-select";
  var isControlled = ('value' in props);
  var isNormalMode = mode !== 'mini';
  var previewClassName = (0, _classnames.default)(previewClassNameProp, prefix + "form-item-input--preview-" + size);
  var loadingIcon = /*#__PURE__*/(0, _react.createElement)(_icon.default, {
    className: clsPrefix + "-icon--loading",
    name: "loading",
    size: "s"
  });
  var selectedIcon = /*#__PURE__*/(0, _react.createElement)(_icon.default, {
    className: clsPrefix + "-icon--selected",
    name: "select",
    size: "s"
  });

  var _useState = (0, _react.useState)(getInitValue(props)),
      curVal = _useState[0],
      setVal = _useState[1];

  var _useState2 = (0, _react.useState)(getInitInternalValue(props)),
      internalValue = _useState2[0],
      setInternalVal = _useState2[1];

  var _useState3 = (0, _react.useState)(null),
      loadingNode = _useState3[0],
      setLoadingNode = _useState3[1];

  var _useState4 = (0, _react.useState)(false),
      drawerVisible = _useState4[0],
      setDrawerVisible = _useState4[1];

  var locale = localeProp || (0, _locale.useLocale)('Cascader', props, {
    rootTipText: '首页'
  });
  var innerSelectedPath = (0, _tree.getDataByValues)(dataSource, internalValue);

  var handlePickerChange = function (v) {
    setInternalVal(v);
  };

  var handleCancel = function (reason) {
    setInternalVal(curVal);

    if ((0, _utils.isFunction)(onCancel)) {
      onCancel(reason);
    }
  };

  var handleListClick = function (item, dpt) {
    return (0, _tslib.__awaiter)(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
      var val, newInternalVal;
      return regeneratorRuntime.wrap(function (_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              val = item.value;
              newInternalVal = [].concat(internalValue.slice(0, dpt), [val]);

              if (loadData && internalValue.indexOf(val) > -1) {
                newInternalVal = internalValue.slice(0, internalValue.indexOf(val) + 1);
              }

              setInternalVal(newInternalVal);

              if (!(loadData && !item.isLeaf)) {
                _context.next = 9;
                break;
              }

              setLoadingNode(val);
              _context.next = 8;
              return loadData(item);

            case 8:
              setLoadingNode(null);

            case 9:
              if (onSelect) {
                onSelect(val, item);
              }

            case 10:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));
  };

  (0, _react.useEffect)(function () {
    setVal(getInitValue(props));
    setInternalVal(getInitInternalValue(props));
  }, [value]);
  (0, _react.useEffect)(function () {
    if (!drawerVisible) {
      setVal(getInitValue(props));
      setInternalVal(getInitInternalValue(props));
    }
  }, [props.dataSource]);
  var nextList = [];

  if (isNormalMode) {
    if ((0, _utils.isValidArray)(internalValue)) {
      var lastVal = internalValue[internalValue.length - 1];
      var t = (0, _tree.find)(dataSource, function (node) {
        return node.value === lastVal;
      });

      if (t && loadingNode === t.value) {
        nextList = [];
      } else if (t && (0, _utils.isValidArray)(t.children)) {
        nextList = t.children;
      }
    } else {
      nextList = dataSource;
    }
  }

  if (isPreview) {
    if ((0, _utils.isFunction)(renderPreview)) {
      return /*#__PURE__*/(0, _react.createElement)(_view.default, {
        className: previewClassName,
        style: (0, _babelRuntimeJsxStyleTransform.rpx2vw4style)(previewStyle)
      }, renderPreview(innerSelectedPath));
    }

    return /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.Text, {
      className: previewClassName,
      style: (0, _babelRuntimeJsxStyleTransform.rpx2vw4style)(previewStyle)
    }, innerSelectedPath.map(function (node) {
      return node.label;
    }).join(separator));
  }

  return /*#__PURE__*/(0, _react.createElement)(_selectDrawer.default, _extends({}, others, {
    ref: ref,
    hasClear: hasClear,
    className: (0, _classnames.default)(clsPrefix, className),
    content: renderContent((0, _tree.getDataByValues)(dataSource, curVal), separator),
    drawerClassName: clsPrefix + "-container",
    onVisibleChange: function handleVisibleChange(visible) {
      setDrawerVisible(visible);
    },
    onOk: function handleOk() {
      if (isNormalMode) {
        if ((0, _utils.isValidArray)(internalValue)) {
          var lastVal = internalValue[internalValue.length - 1];
          var n = (0, _tree.find)(dataSource, function (node) {
            return node.value === lastVal;
          });

          if (n && n.children) {
            handleCancel('invalid-selection');
            return;
          }
        } else {
          handleCancel('invalid-selection');
          return;
        }
      }

      if (!isControlled) {
        setVal(internalValue);
      }

      if (onChange) {
        var selectedPath = (0, _tree.getDataByValues)(dataSource, internalValue);
        var lastData = selectedPath[selectedPath.length - 1];
        onChange(useSimpleValue ? lastData.value || '' : internalValue, lastData, {
          selectedPath: selectedPath
        });
      }
    },
    onCancel: handleCancel,
    onClear: function handleClear() {
      if (!isControlled) {
        setVal([]);
        setInternalVal([]);
      }

      if (onClear) {
        onClear();
      }

      if (onChange) {
        onChange(useSimpleValue ? '' : [], {}, {
          selectedPath: []
        });
      }
    }
  }), isNormalMode ? /*#__PURE__*/(0, _react.createElement)(_react.Fragment, null, /*#__PURE__*/(0, _react.createElement)(_breadCrumb.default, {
    className: (0, _classnames.default)(clsPrefix + "-nav", (_classNames = {}, _classNames[clsPrefix + "-nav--wechat"] = _utils.isStrictWechatMiniProgram, _classNames)),
    onClick: function handleBreadCrumbClick(index) {
      if (index === void 0) {
        index = 0;
      }

      setInternalVal(internalValue.slice(0, index));
    }
  }, /*#__PURE__*/(0, _react.createElement)(_breadCrumb.default.Item, null, rootTipText || locale.rootTipText), (0, _utils.isValidArray)(innerSelectedPath) ? innerSelectedPath.map(function (val) {
    return /*#__PURE__*/(0, _react.createElement)(_breadCrumb.default.Item, {
      key: val.value
    }, val.label);
  }) : null), /*#__PURE__*/(0, _react.createElement)(_view.default, {
    className: clsPrefix + "-gutter"
  })) : null, !isNormalMode ? function renderPicker() {
    return (0, _utils.isValidArray)(dataSource) ? /*#__PURE__*/(0, _react.createElement)(_picker.default, {
      cascade: true,
      data: dataSource,
      value: internalValue,
      onChange: handlePickerChange
    }) : null;
  }() : /*#__PURE__*/(0, _react.createElement)(_meetReactComponentOne.ScrollView, {
    showsVerticalScrollIndicator: true,
    showsHorizontalScrollIndicator: false,
    ref: scrollRef,
    className: clsPrefix + "-scrollview"
  }, /*#__PURE__*/(0, _react.createElement)(_view.default, {
    className: clsPrefix + "-item-container"
  }, (0, _utils.isValidArray)(internalValue) ? internalValue.map(function (val, index) {
    var list = (0, _tree.getSiblings)(dataSource, val);
    return (0, _utils.isValidArray)(list) ? /*#__PURE__*/(0, _react.createElement)(_list.default, {
      className: clsPrefix + "-list",
      key: val
    }, list.map(function (item) {
      var icon = null;
      var hasArrow = loadData && !item.isLeaf || !loadData && item.children;

      if (loadData && loadingNode === item.value) {
        icon = loadingIcon;
      } else if (loadData && item.value === val || !loadData && item.value === val) {
        icon = selectedIcon;
      }

      return /*#__PURE__*/(0, _react.createElement)(_list.default.Item, {
        key: item.value,
        title: item.label,
        extra: icon,
        arrow: hasArrow && !icon ? 'right' : null,
        onClick: function onClick() {
          handleListClick(item, index);
        }
      });
    })) : null;
  }) : null, (0, _utils.isValidArray)(nextList) ? /*#__PURE__*/(0, _react.createElement)(_list.default, {
    className: clsPrefix + "-list"
  }, nextList.map(function (item) {
    var icon = null;
    var hasArrow = item.children || loadData && !item.isLeaf;

    if (loadData && item.isLeaf && item.value === loadingNode) {
      icon = loadingIcon;
    }

    return /*#__PURE__*/(0, _react.createElement)(_list.default.Item, {
      key: item.value,
      title: item.label,
      extra: icon,
      arrow: hasArrow && !icon ? 'right' : null,
      onClick: function onClick() {
        handleListClick(item, internalValue ? internalValue.length : 0);
      }
    });
  })) : null)));
};

var _default = /*#__PURE__*/(0, _react.forwardRef)(CascaderSelect);

exports.default = _default;