@visa/nova-react
Version:
Visa Product Design System Nova React library. Compatible with React ^19.
2 lines (1 loc) • 1.47 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");const t={autoSelect:!1,defaultSelected:-1},l=(l=t)=>{const{defaultSelected:r,...s}={...t,...l},u=e.useRef([]),a=e.useRef(null),[c,n]=e.useState(Array.isArray(r)?r.length?r[0]:-1:r),[o,i]=e.useState([]),[d,f]=e.useState(r),S=Array.isArray(d);S&&s.autoSelect&&(s.autoSelect=!1);const b=-1===c?0:o.indexOf(c),x=o.length,p=x-1,y=s?.ref||u,w=e.useCallback(e=>S?d.includes(e):d===e,[S,d]),g=e.useCallback(e=>{f(S?t=>w(e)?t.filter(t=>t!==e):[...t,e]:w(e)?-1:e),n(e)},[w,S]);return e.useEffect(()=>{const e={...t,...l};S&&e.autoSelect&&console.warn("⚠️ useListbox: autoSelect is not compatible with multiple selection listbox. autoSelect will be set to false when multiple is true.")},[l,S]),e.useEffect(()=>{i(y.current?.map((e,t)=>(!e?.ariaDisabled||"false"===e?.ariaDisabled)&&t).filter(e=>!1!==e))},[y]),{isIndexSelected:w,getTabIndex:(e,t=!1)=>(t||null!==a.current||(a.current=e),S?c===e||-1===c&&a.current===e?0:-1:d===e||-1===d&&a.current===e?0:-1),onKeyNavigation:e=>{const t=e.key;let l=null;if("ArrowDown"===t?l=(b+1)%x:"ArrowUp"===t?l=b-1<0?p:b-1:"End"===t?l=p:"Home"===t&&(l=0),"Enter"!==t&&" "!==t||g(o[b]),"Tab"===t&&n(S?o[b]:d),y.current&&null!==l&&x){e.preventDefault();const t=o[l];s.autoSelect&&f(t),n(t),y.current[t]?.focus()}},ref:y,selectedIndex:d,selectedIndices:d,toggleIndexSelected:g}};l.displayName="useListbox",exports.default=l,exports.useListbox=l;