UNPKG

@ariakit/core

Version:
164 lines (162 loc) 4.19 kB
"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 };