@ariakit/core
Version:
Ariakit core
164 lines (162 loc) • 4.19 kB
JavaScript
"use client";
import {
createPopoverStore
} from "../__chunks/BFGNM53A.js";
import {
createCompositeStore
} from "../__chunks/RVTIKFRL.js";
import {
toArray
} from "../__chunks/7PRQYBBV.js";
import "../__chunks/KMAUV3TY.js";
import "../__chunks/75BJEVSH.js";
import "../__chunks/N5XGANPW.js";
import "../__chunks/3DNM6L6E.js";
import {
batch,
createStore,
mergeStore,
omit,
setup,
sync,
throwOnConflictingProps
} from "../__chunks/SXKM4CGU.js";
import {
defaultValue
} from "../__chunks/XMCVU3LR.js";
// src/select/select-store.ts
function createSelectStore({
combobox,
...props
} = {}) {
const store = mergeStore(
props.store,
omit(combobox, [
"value",
"items",
"renderedItems",
"baseElement",
"arrowElement",
"anchorElement",
"contentElement",
"popoverElement",
"disclosureElement"
])
);
throwOnConflictingProps(props, store);
const syncState = store.getState();
const composite = createCompositeStore({
...props,
store,
virtualFocus: defaultValue(
props.virtualFocus,
syncState.virtualFocus,
true
),
includesBaseElement: defaultValue(
props.includesBaseElement,
syncState.includesBaseElement,
false
),
activeId: defaultValue(
props.activeId,
syncState.activeId,
props.defaultActiveId,
null
),
orientation: defaultValue(
props.orientation,
syncState.orientation,
"vertical"
)
});
const popover = createPopoverStore({
...props,
store,
placement: defaultValue(
props.placement,
syncState.placement,
"bottom-start"
)
});
const initialValue = new String("");
const initialState = {
...composite.getState(),
...popover.getState(),
value: defaultValue(
props.value,
syncState.value,
props.defaultValue,
initialValue
),
setValueOnMove: defaultValue(
props.setValueOnMove,
syncState.setValueOnMove,
false
),
labelElement: defaultValue(syncState.labelElement, null),
selectElement: defaultValue(syncState.selectElement, null),
listElement: defaultValue(syncState.listElement, null)
};
const select = createStore(initialState, composite, popover, store);
setup(
select,
() => sync(select, ["value", "items"], (state) => {
if (state.value !== initialValue) return;
if (!state.items.length) return;
const item = state.items.find(
(item2) => !item2.disabled && item2.value != null
);
if ((item == null ? void 0 : item.value) == null) return;
select.setState("value", item.value);
})
);
setup(
select,
() => sync(select, ["mounted"], (state) => {
if (state.mounted) return;
select.setState("activeId", initialState.activeId);
})
);
setup(
select,
() => sync(select, ["mounted", "items", "value"], (state) => {
if (combobox) return;
if (state.mounted) return;
const values = toArray(state.value);
const lastValue = values[values.length - 1];
if (lastValue == null) return;
const item = state.items.find(
(item2) => !item2.disabled && item2.value === lastValue
);
if (!item) return;
select.setState("activeId", item.id);
})
);
setup(
select,
() => batch(select, ["setValueOnMove", "moves"], (state) => {
const { mounted, value, activeId } = select.getState();
if (!state.setValueOnMove && mounted) return;
if (Array.isArray(value)) return;
if (!state.moves) return;
if (!activeId) return;
const item = composite.item(activeId);
if (!item || item.disabled || item.value == null) return;
select.setState("value", item.value);
})
);
return {
...composite,
...popover,
...select,
combobox,
setValue: (value) => select.setState("value", value),
setLabelElement: (element) => select.setState("labelElement", element),
setSelectElement: (element) => select.setState("selectElement", element),
setListElement: (element) => select.setState("listElement", element)
};
}
export {
createSelectStore
};