@ariakit/core
Version:
Ariakit core
174 lines (172 loc) • 5.13 kB
JavaScript
"use client";
import {
isSafari,
isTouchDevice
} from "../__chunks/QAGXQEUG.js";
import {
createPopoverStore
} from "../__chunks/ME2CUF3F.js";
import {
createCompositeStore
} from "../__chunks/2CHYBBFH.js";
import "../__chunks/7PRQYBBV.js";
import "../__chunks/FZZ2AVHF.js";
import "../__chunks/RCQ5P4YE.js";
import "../__chunks/EO4GVUA4.js";
import "../__chunks/DTR5TSDJ.js";
import {
batch,
createStore,
mergeStore,
pick,
setup,
sync,
throwOnConflictingProps
} from "../__chunks/BCALMBPZ.js";
import {
chain,
defaultValue
} from "../__chunks/PBFD2E7P.js";
import {
__objRest,
__spreadProps,
__spreadValues
} from "../__chunks/3YLGPPWQ.js";
// src/combobox/combobox-store.ts
var isTouchSafari = isSafari() && isTouchDevice();
function createComboboxStore(_a = {}) {
var _b = _a, {
tag
} = _b, props = __objRest(_b, [
"tag"
]);
const store = mergeStore(props.store, pick(tag, ["value", "rtl"]));
throwOnConflictingProps(props, store);
const tagState = tag == null ? void 0 : tag.getState();
const syncState = store == null ? void 0 : store.getState();
const activeId = defaultValue(
props.activeId,
syncState == null ? void 0 : syncState.activeId,
props.defaultActiveId,
null
);
const composite = createCompositeStore(__spreadProps(__spreadValues({}, props), {
activeId,
includesBaseElement: defaultValue(
props.includesBaseElement,
syncState == null ? void 0 : syncState.includesBaseElement,
true
),
orientation: defaultValue(
props.orientation,
syncState == null ? void 0 : syncState.orientation,
"vertical"
),
focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true),
focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true),
virtualFocus: defaultValue(
props.virtualFocus,
syncState == null ? void 0 : syncState.virtualFocus,
true
)
}));
const popover = createPopoverStore(__spreadProps(__spreadValues({}, props), {
placement: defaultValue(
props.placement,
syncState == null ? void 0 : syncState.placement,
"bottom-start"
)
}));
const value = defaultValue(
props.value,
syncState == null ? void 0 : syncState.value,
props.defaultValue,
""
);
const selectedValue = defaultValue(
props.selectedValue,
syncState == null ? void 0 : syncState.selectedValue,
tagState == null ? void 0 : tagState.values,
props.defaultSelectedValue,
""
);
const multiSelectable = Array.isArray(selectedValue);
const initialState = __spreadProps(__spreadValues(__spreadValues({}, composite.getState()), popover.getState()), {
value,
selectedValue,
resetValueOnSelect: defaultValue(
props.resetValueOnSelect,
syncState == null ? void 0 : syncState.resetValueOnSelect,
multiSelectable
),
resetValueOnHide: defaultValue(
props.resetValueOnHide,
syncState == null ? void 0 : syncState.resetValueOnHide,
multiSelectable && !tag
),
activeValue: syncState == null ? void 0 : syncState.activeValue
});
const combobox = createStore(initialState, composite, popover, store);
if (isTouchSafari) {
setup(
combobox,
() => sync(combobox, ["virtualFocus"], () => {
combobox.setState("virtualFocus", false);
})
);
}
setup(combobox, () => {
if (!tag) return;
return chain(
sync(combobox, ["selectedValue"], (state) => {
if (!Array.isArray(state.selectedValue)) return;
tag.setValues(state.selectedValue);
}),
sync(tag, ["values"], (state) => {
combobox.setState("selectedValue", state.values);
})
);
});
setup(
combobox,
() => sync(combobox, ["resetValueOnHide", "mounted"], (state) => {
if (!state.resetValueOnHide) return;
if (state.mounted) return;
combobox.setState("value", value);
})
);
setup(
combobox,
() => sync(combobox, ["open"], (state) => {
if (state.open) return;
combobox.setState("activeId", activeId);
combobox.setState("moves", 0);
})
);
setup(
combobox,
() => sync(combobox, ["moves", "activeId"], (state, prevState) => {
if (state.moves === prevState.moves) {
combobox.setState("activeValue", void 0);
}
})
);
setup(
combobox,
() => batch(combobox, ["moves", "renderedItems"], (state, prev) => {
if (state.moves === prev.moves) return;
const { activeId: activeId2 } = combobox.getState();
const activeItem = composite.item(activeId2);
combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value);
})
);
return __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, popover), composite), combobox), {
tag,
setValue: (value2) => combobox.setState("value", value2),
resetValue: () => combobox.setState("value", initialState.value),
setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2)
});
}
export {
createComboboxStore
};