import { dynamic } from "@solidjs/web";
import { createMemo, omit } from "solid-js";
import { createChangeEventDetails, REASONS } from "../../internals/change-event-details.jsx";
import { composeRefs, userRef } from "../../internals/compose-refs.jsx";
import { stopEvent } from "../../internals/floating-ui/utils/event.jsx";
import { mergeRootProps } from "../../internals/merge-root-props.jsx";
import { resolveClassStyle } from "../../internals/resolve-class-style.jsx";
import { useButton } from "../../internals/use-button/use-button.jsx";
import { useComboboxChipContext } from "../chip/chip-context.jsx";
import { findItemIndex } from "../internals/item-equality.jsx";
import { useComboboxRootContext } from "../root/combobox-root-context.jsx";
/**
 * A button to remove a chip. Renders a `<button>` element.
 */
export function ComboboxChipRemove(props) {
  const root = useComboboxRootContext();
  const chip = useComboboxChipContext();
  const disabled = () => root.disabled() || (props.disabled ?? false);
  const readOnly = () => root.readOnly();
  const nativeButton = () => props.nativeButton ?? true;
  const {
    props: buttonProps,
    ref: buttonRef
  } = useButton({
    disabled: () => disabled() || readOnly(),
    focusableWhenDisabled: () => true,
    native: nativeButton
  });
  const state = createMemo(() => ({
    disabled: disabled()
  }));
  function clearActiveIndexForRemovedItem(removedItem) {
    const activeIndex = root.activeIndex();
    if (activeIndex == null) return;
    const removedIndex = findItemIndex(root.valuesRef.current, removedItem, root.isItemEqualToValue());
    if (removedIndex !== -1 && activeIndex === removedIndex) {
      root.setIndices({
        activeIndex: null,
        type: root.keyboardActiveRef.current ? "keyboard" : "pointer"
      });
    }
  }
  function removeChip(event) {
    const details = createChangeEventDetails(REASONS.chipRemovePress, event);
    const selected = root.selectedValue();
    if (!Array.isArray(selected)) return;
    const index = chip.index();
    const removedItem = selected[index];
    clearActiveIndexForRemovedItem(removedItem);
    root.setSelectedValue(selected.filter((_, i) => i !== index), details);
    root.inputRef.current?.focus();
  }
  function onMouseDown(event) {
    event.preventDefault();
  }
  function onClick(event) {
    if (disabled() || readOnly()) return;
    removeChip(event);
  }
  function onKeyDown(event) {
    if (disabled() || readOnly()) return;
    if (event.key === "Enter" || event.key === " ") {
      stopEvent(event);
      removeChip(event);
    }
  }
  const internal = {
    tabIndex: -1,
    onMouseDown,
    onClick,
    onKeyDown,
    get "data-disabled"() {
      return state().disabled ? "" : undefined;
    }
  };
  const userClassStyle = resolveClassStyle(props, () => state());
  const userProps = omit(props, "as", "class", "style", "attrs", "disabled", "nativeButton");
  let merged = mergeRootProps(buttonProps, internal);
  merged = mergeRootProps(merged, userClassStyle);
  merged = mergeRootProps(merged, userProps);
  const Tag = dynamic(() => props.as ?? "button");
  return <Tag {...merged} ref={composeRefs(buttonRef, userRef(props))} />;
}
//# sourceMappingURL=combobox-chip-remove.jsx.map
