"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Tabs = void 0;
var Ariakit = _interopRequireWildcard(require("@ariakit/react"));
var _compose = require("@wordpress/compose");
var _element = require("@wordpress/element");
var _i18n = require("@wordpress/i18n");
var _context = require("./context");
var _tab = require("./tab");
var _tablist = require("./tablist");
var _tabpanel = require("./tabpanel");
var _jsxRuntime = require("react/jsx-runtime");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/**
 * External dependencies
 */

/**
 * WordPress dependencies
 */

/**
 * Internal dependencies
 */

function externalToInternalTabId(externalId, instanceId) {
  return externalId && `${instanceId}-${externalId}`;
}
function internalToExternalTabId(internalId, instanceId) {
  return typeof internalId === 'string' ? internalId.replace(`${instanceId}-`, '') : internalId;
}

/**
 * Display one panel of content at a time with a tabbed interface, based on the
 * WAI-ARIA Tabs Pattern⁠.
 *
 * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/
 * ```
 */
const Tabs = exports.Tabs = Object.assign(function Tabs({
  selectOnMove = true,
  defaultTabId,
  orientation = 'horizontal',
  onSelect,
  children,
  selectedTabId,
  activeTabId,
  defaultActiveTabId,
  onActiveTabIdChange
}) {
  const instanceId = (0, _compose.useInstanceId)(Tabs, 'tabs');
  const store = Ariakit.useTabStore({
    selectOnMove,
    orientation,
    defaultSelectedId: externalToInternalTabId(defaultTabId, instanceId),
    setSelectedId: newSelectedId => {
      onSelect?.(internalToExternalTabId(newSelectedId, instanceId));
    },
    selectedId: externalToInternalTabId(selectedTabId, instanceId),
    defaultActiveId: externalToInternalTabId(defaultActiveTabId, instanceId),
    setActiveId: newActiveId => {
      onActiveTabIdChange?.(internalToExternalTabId(newActiveId, instanceId));
    },
    activeId: externalToInternalTabId(activeTabId, instanceId),
    rtl: (0, _i18n.isRTL)()
  });
  const {
    items,
    activeId
  } = Ariakit.useStoreState(store);
  const {
    setActiveId
  } = store;
  (0, _element.useEffect)(() => {
    requestAnimationFrame(() => {
      const focusedElement = items?.[0]?.element?.ownerDocument.activeElement;
      if (!focusedElement || !items.some(item => focusedElement === item.element)) {
        return; // Return early if no tabs are focused.
      }

      // If, after ariakit re-computes the active tab, that tab doesn't match
      // the currently focused tab, then we force an update to ariakit to avoid
      // any mismatches, especially when navigating to previous/next tab with
      // arrow keys.
      if (activeId !== focusedElement.id) {
        setActiveId(focusedElement.id);
      }
    });
  }, [activeId, items, setActiveId]);
  const contextValue = (0, _element.useMemo)(() => ({
    store,
    instanceId
  }), [store, instanceId]);
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_context.TabsContext.Provider, {
    value: contextValue,
    children: children
  });
}, {
  Tab: Object.assign(_tab.Tab, {
    displayName: 'Tabs.Tab'
  }),
  TabList: Object.assign(_tablist.TabList, {
    displayName: 'Tabs.TabList'
  }),
  TabPanel: Object.assign(_tabpanel.TabPanel, {
    displayName: 'Tabs.TabPanel'
  }),
  Context: Object.assign(_context.TabsContext, {
    displayName: 'Tabs.Context'
  })
});
//# sourceMappingURL=index.js.map