function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _excluded = ["dataSource", "emptyDescription", "showSearch", "scrollDom", "offsetDom", "style", "token", "onChange", "value", "selectedItems", "productListSetting", "customScrollParent", "loading", "layout", "hideCategoryWhenOne"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { useEffect, useCallback, useMemo, useRef, useState, useLayoutEffect } from 'react';
import classNames from 'classnames';
import { Input } from '@pisell/materials';
import { locales } from '@pisell/utils';
import SearchLg from '@pisell/icon/es/SearchLg';
import CategoryTabs, { CategorySkeleton } from "./CategoryTabs";
import ProductList, { createGridComponents } from "./ProductList";
import { useToken, genCSSVars } from "./hooks/useToken";
import { groupProductsByCategory, getElementByIdentifier, getOffsetTopRelativeToScrollContainer } from "./utils";
import IntersectionObserverProvider from "./components/IntersectionObserver";
import ProductCard, { ProductCardSkeleton } from "./ProductCard";
import localeTexts from "./locales";
import useEngineContext from "../../hooks/useEngineContext";
import { PisellEmpty } from '@pisell/materials';
import "./index.less";
// 虚假数据常量，用于loading状态
var MOCK_DATA = function () {
  var mockData = [];
  // 添加分类项
  mockData.push({
    __typename: 'category',
    id: '_c1_1'
  });
  // 添加该分类下的商品
  for (var productIndex = 0; productIndex < 4; productIndex++) {
    mockData.push({
      __typename: 'product',
      id: '_pi' + productIndex
    });
  }
  return mockData;
}();
export var PREFIX = 'pisell-product-select';
var CONTAINER_CLASS = "".concat(PREFIX, "-wrapper");
var index = function index(_ref) {
  var _context$appHelper$ut;
  var _ref$dataSource = _ref.dataSource,
    dataSource = _ref$dataSource === void 0 ? [] : _ref$dataSource,
    emptyDescription = _ref.emptyDescription,
    _ref$showSearch = _ref.showSearch,
    showSearch = _ref$showSearch === void 0 ? true : _ref$showSearch,
    scrollDom = _ref.scrollDom,
    offsetDom = _ref.offsetDom,
    _ref$style = _ref.style,
    style = _ref$style === void 0 ? {} : _ref$style,
    customToken = _ref.token,
    onChange = _ref.onChange,
    value = _ref.value,
    selectedItems = _ref.selectedItems,
    _ref$productListSetti = _ref.productListSetting,
    productListSetting = _ref$productListSetti === void 0 ? {} : _ref$productListSetti,
    customScrollParent = _ref.customScrollParent,
    _ref$loading = _ref.loading,
    loading = _ref$loading === void 0 ? false : _ref$loading,
    layout = _ref.layout,
    _ref$hideCategoryWhen = _ref.hideCategoryWhenOne,
    hideCategoryWhenOne = _ref$hideCategoryWhen === void 0 ? false : _ref$hideCategoryWhen,
    rest = _objectWithoutProperties(_ref, _excluded);
  var context = useEngineContext();
  locales.init(localeTexts, ((_context$appHelper$ut = context.appHelper.utils) === null || _context$appHelper$ut === void 0 || (_context$appHelper$ut = _context$appHelper$ut.storage) === null || _context$appHelper$ut === void 0 ? void 0 : _context$appHelper$ut.get('umi_locale')) || 'en');
  var searchRef = useRef(null);
  var _useState = useState(''),
    _useState2 = _slicedToArray(_useState, 2),
    keyword = _useState2[0],
    setKeyword = _useState2[1];
  var _useState3 = useState(''),
    _useState4 = _slicedToArray(_useState3, 2),
    activeKey = _useState4[0],
    setActiveKey = _useState4[1];
  var _useState5 = useState(null),
    _useState6 = _slicedToArray(_useState5, 2),
    scrollParent = _useState6[0],
    setScrollParent = _useState6[1];
  var isIndicatorVisibleRef = useRef(false);
  var containerRef = useRef(null);
  var _customScrollParent = customScrollParent || scrollDom;
  var gridComponents = useMemo(function () {
    return createGridComponents(layout);
  }, [layout]);
  var _filteredList = useMemo(function () {
    if (!keyword) return dataSource;
    return dataSource.filter(function (product) {
      if (typeof (product === null || product === void 0 ? void 0 : product.title) !== 'string') return false;
      return product.title.toLowerCase().indexOf(keyword.toLowerCase()) !== -1;
    });
  }, [keyword, dataSource]);
  var _groupedList = useMemo(function () {
    var _list = _filteredList || [];
    return groupProductsByCategory(_list);
  }, [_filteredList]);
  var _categories = useMemo(function () {
    return _groupedList.filter(function (item) {
      return item.__typename === 'category';
    }).map(function (item) {
      return _objectSpread(_objectSpread({}, item), {}, {
        key: String(item.id),
        label: item.name
      });
    });
  }, [_groupedList]);

  /**
   * @title: 是否隐藏分类
   * @description:
   * @param {*} useMemo
   * @return {*}
   * @Author: WangHan
   * @Date: 2025-10-09 15:13
   */
  var isHideCategory = useMemo(function () {
    // 装修设置的隐藏分类
    if ((productListSetting === null || productListSetting === void 0 ? void 0 : productListSetting.layout) === 0) {
      return true;
    }
    if (hideCategoryWhenOne) {
      // 只有一个分类或者没有分类
      return (_categories === null || _categories === void 0 ? void 0 : _categories.length) === 1 || !(_categories !== null && _categories !== void 0 && _categories.length);
    }
    return false;
  }, [_categories, hideCategoryWhenOne, productListSetting === null || productListSetting === void 0 ? void 0 : productListSetting.layout]);
  useEffect(function () {
    if (!(_categories !== null && _categories !== void 0 && _categories.length)) {
      setActiveKey('');
      return;
    }
    if (!activeKey) {
      switchCategory(_categories[0].key);
    } else {
      var found = _categories.find(function (category) {
        return category.key === activeKey;
      });
      if (!found) switchCategory(_categories[0].key);
    }
  }, [_categories]);
  useLayoutEffect(function () {
    if (_customScrollParent) {
      var sp = getElementByIdentifier(_customScrollParent);
      setScrollParent(sp);
    }
  }, [_customScrollParent]);
  var token = useToken(customToken);
  var cssVars = useMemo(function () {
    return genCSSVars(token);
  }, [token]);
  var mergedStyle = useMemo(function () {
    var baseStyle = _objectSpread(_objectSpread({}, cssVars), style);
    if (!scrollParent) return baseStyle;
    if (scrollParent !== containerRef.current) {
      return _objectSpread(_objectSpread({}, baseStyle), {}, {
        overflow: 'unset',
        height: 'unset'
      });
    }
    return baseStyle;
  }, [cssVars, style, scrollParent]);
  var disabled = useMemo(function () {
    return !!(productListSetting !== null && productListSetting !== void 0 && productListSetting.list_max_length) && Array.isArray(selectedItems) && (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) > 0;
  }, [productListSetting, selectedItems]);
  var _onChange = useCallback(function (value, type) {
    if (disabled) return;
    onChange === null || onChange === void 0 || onChange(value, type);
  }, [disabled, onChange]);
  var debounceIndicator = useCallback(function (delay) {
    isIndicatorVisibleRef.current = true;
    var timeoutId = setTimeout(function () {
      isIndicatorVisibleRef.current = false;
    }, delay);
    return function () {
      return clearTimeout(timeoutId);
    };
  }, []);
  var lastActiveKeyRef = useRef('');

  // 项目进入视口时的回调
  var handleItemIntersectionIn = useCallback(function (item) {
    var _key = String(item.__categoryId);
    if (!isIndicatorVisibleRef.current && _key && _key !== lastActiveKeyRef.current) {
      setActiveKey(_key);
      lastActiveKeyRef.current = _key;
    }
  }, []);
  var _listContext = useMemo(function () {
    return {
      onItemIntersectionIn: handleItemIntersectionIn,
      onItemIntersectionOut: function onItemIntersectionOut() {}
    };
  }, [handleItemIntersectionIn]);
  var switchCategory = function switchCategory(key) {
    setActiveKey(key);
    lastActiveKeyRef.current = key; // 同步ref值
    debounceIndicator(300);
    var categoryIndex = _groupedList.findIndex(function (item) {
      return item.__typename === 'category' && String(item.id) === key;
    });
    // 获取可滚动祖先元素
    var _scrollParent = scrollParent || containerRef.current;
    if (!_scrollParent || !containerRef.current) return;
    var target = document.getElementById("ps_category_".concat(key));
    if (!target) return;
    // 获取产品选择器包装容器
    var productSelectWrapper = document.querySelector(".".concat(PREFIX, "-wrapper"));
    // 获取标签页包装容器
    var tabsWrapper = document.querySelector(".".concat(PREFIX, "__tabs-wrapper"));
    var tabsHeight = (tabsWrapper === null || tabsWrapper === void 0 ? void 0 : tabsWrapper.offsetHeight) || 0;
    // 获取额外偏移元素（如固定头部等）
    var offsetElement = getElementByIdentifier(offsetDom);
    var extraOffset = offsetElement ? offsetElement.clientHeight : 0;
    if (categoryIndex === 0) {
      // 如果是第一个tab，滚动到产品选择器包装容器的位置
      if (productSelectWrapper) {
        var wrapperOffsetTop = getOffsetTopRelativeToScrollContainer(productSelectWrapper, _scrollParent);
        _scrollParent.scrollTop = wrapperOffsetTop - extraOffset;
      }
      return;
    } else {
      // 其他tab，滚动到对应列表元素位置，需要减去标签页高度
      var listOffsetTop = getOffsetTopRelativeToScrollContainer(target, _scrollParent);
      _scrollParent.scrollTop = listOffsetTop - tabsHeight - extraOffset;
    }
  };
  return /*#__PURE__*/React.createElement("div", {
    ref: containerRef,
    className: classNames(PREFIX, CONTAINER_CLASS, {
      disabled: disabled
    }),
    style: mergedStyle
  }, showSearch ? /*#__PURE__*/React.createElement("div", {
    className: "".concat(PREFIX, "__search-wrapper")
  }, /*#__PURE__*/React.createElement(Input, {
    ref: searchRef,
    prefix: /*#__PURE__*/React.createElement(SearchLg, null),
    style: {
      height: 44
    },
    placeholder: locales.getText('pisell2.product-select.search'),
    allowClear: true,
    value: keyword,
    onChange: function onChange(e) {
      // switchCategory('');
      setKeyword(e.target.value);
    }
  })) : null, !isHideCategory ? /*#__PURE__*/React.createElement(CategoryTabs, {
    activeKey: activeKey,
    items: _categories,
    onChange: switchCategory,
    loading: loading,
    skeleton: /*#__PURE__*/React.createElement(CategorySkeleton, null)
  }) : null, !loading && !(_groupedList !== null && _groupedList !== void 0 && _groupedList.length) ? /*#__PURE__*/React.createElement(PisellEmpty, {
    description: emptyDescription || locales.getText('pisell2.product-select.empty')
  }) : /*#__PURE__*/React.createElement(IntersectionObserverProvider, {
    rootMargin: "-270px 0px -270px 0px",
    priorityMode: "top"
  }, /*#__PURE__*/React.createElement(ProductList, {
    className: classNames("".concat(PREFIX, "__product-list"), _defineProperty({}, "".concat(PREFIX, "__product-list_hide_category"), isHideCategory)),
    loading: loading,
    data: loading ? MOCK_DATA : _groupedList,
    _customScrollParent: scrollParent,
    context: _listContext,
    components: gridComponents,
    itemContent: function itemContent(index, item, context) {
      if (loading) {
        return /*#__PURE__*/React.createElement(ProductCardSkeleton, {
          index: index,
          item: item
        });
      }
      return /*#__PURE__*/React.createElement(ProductCard, {
        index: index,
        item: item,
        context: context
        // onSelect={_onChange}
        ,
        onSelectCover: function onSelectCover(e) {
          _onChange(e, 'cover');
        },
        onSelectInfo: function onSelectInfo(e) {
          _onChange(e, 'info');
        },
        isSelected: item.id === value,
        decorateConfig: productListSetting
      });
    }
  })));
};
export default index;