@nosto/search-js 3.24.2 → 3.24.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("../../useActions-CG4NaniG.cjs"),q=require("../../storage-BQdl3oEs.cjs"),h=require("../../useLoadMore-EOcCFqU8.cjs"),L=require("../../eventBusSubscribe-oONOUGH8.cjs"),l=require("preact/hooks"),M=require("../../useHistory-D6Q9vxsY.cjs"),z=require("../../index.es-Dp6Iaxz3.cjs"),O=require("../../eventBusDispatch-BKQcSHAB.cjs"),F=require("../../parseNumber-FsZ8w61u.cjs");function X(e){const s=h.useNostoAppState(t=>t.response);return e&&Array.isArray(e)||e&&q.isPlainObject(e)?e:s}function E(e,s){const t=e.data?.filter(f=>f.selected).length??0,{active:o}={active:t>0,...s},[n,c]=l.useState(o),{toggleProductFilter:u}=A.useActions(),i=l.useCallback(()=>{c(!n)},[n]);return L.useEventBusSubscribe({event:"events/removeAllFilters",callback:()=>{c(!1)}}),{active:n,selectedFiltersCount:t,toggleActive:i,toggleProductFilter:u}}function j(){const{loading:e,facets:s}=h.useNostoAppState(t=>({loading:t.loading,facets:t.response?.products?.facets??[]}));return{loading:e,facets:s}}function V(e,s){const t=s-e;return!isNaN(t)&&t>0?new Array(s-e).fill(void 0).map((o,n)=>n+e):[]}function B(e){const{query:s,products:t}=h.useNostoAppState(o=>({query:o.query,products:o.response.products}));return l.useMemo(()=>{if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const o=s.products?.from??0,n=e?.width??1/0,c=Math.max(Math.floor(n-1)/2,1),u=t.size>0?Math.floor(o/t.size)+1:1,i=t.size>0?Math.ceil(t.total/t.size):0,f=y=>y>=u-c&&y<=u+c,r=o+1,a=Math.min(o+t.total,t.total),d={from:o,page:u,current:!0},p=y=>({from:(y-1)*t.size,page:y,current:y===u}),S=u>1?p(u-1):void 0,v=u<i?p(u+1):void 0,m=u-c-1>1?p(1):void 0,g=u+c+1<i?p(i):void 0,b=V(1,i+1).filter(f).map(p);return!m&&b[0]?.page===2&&b.unshift(p(1)),!g&&b[b.length-1]?.page===i-1&&b.push(p(i)),{totalPages:i,resultsFrom:r,resultsTo:a,current:d,prev:S,next:v,first:m,last:g,pages:b}},[s,t,e?.width])}function D(){const[e,s]=l.useState([]),[t,o]=l.useState([]);return l.useEffect(()=>{z.s(async n=>{const{products:c,segments:u}=await n.getSearchSessionParams();s(u??[]),o(c?.personalizationBoost??[])})},[]),{segments:e,boost:t}}function $(){const{facets:e}=h.useNostoAppState(r=>({facets:r.response.products?.facets??[]})),{replaceFilter:s,toggleProductFilter:t}=A.useActions(),o=l.useCallback(r=>{const a=e?.find(d=>d.type==="stats"&&d.field===r);if(a&&"min"in a&&"max"in a)return a},[e]),n=l.useCallback(r=>e?.find(a=>a.field===r)?.name??r,[e]),c=l.useCallback(r=>"field"in r&&(r.value instanceof Array||r.range instanceof Array),[]),u=l.useCallback(r=>({...r,range:r.range?.map(a=>({gt:a.gt?Number(a.gt):a.gt,gte:a.gte?Number(a.gte):a.gte,lt:a.lt?Number(a.lt):a.lt,lte:a.lte?Number(a.lte):a.lte}))}),[]),i=l.useCallback(r=>(r.value??[]).map(d=>({value:d,field:r.field,name:n(r.field),filter:u(r),remove:()=>{t(r.field,d,!1)}})),[u,n,t]),f=l.useCallback(r=>(r.range??[]).map(d=>{const p=d.gte??d.gt??o(r.field)?.min,S=d.lte??d.lt??o(r.field)?.max;if(p!==void 0&&S!==void 0)return{value:`${p} - ${S}`,field:r.field,name:n(r.field),filter:u(r),remove:()=>{s(r.field,void 0)}}}).filter(Boolean),[u,o,n,s]);return{selectFilters:c,toValueFilter:i,toRangeFilter:f}}function T(){const{filter:e}=h.useNostoAppState(i=>({filter:i.query.products?.filter??[]})),{updateSearch:s}=A.useActions(),{selectFilters:t,toValueFilter:o,toRangeFilter:n}=$(),c=l.useMemo(()=>e?e.filter(t).flatMap(i=>"value"in i?o(i):"range"in i?n(i):[]).filter(Boolean):[],[e,t,n,o]),u=l.useCallback(()=>{s({products:{filter:[]}}),O.dispatchNostoEvent({event:"events/removeAllFilters",params:null})},[s]);return{filters:c,removeAll:u}}function x(e){const{replaceFilter:s}=A.useActions(),{query:t,products:o}=h.useNostoAppState(g=>({query:g.query,products:g.response.products})),n=o?.facets?.find(g=>g.id===e),c=t.products?.filter?.find(g=>g.field===n?.field),[u,i]=U(c),f=n&&"min"in n?Math.floor(n.min??0):0,r=n&&"max"in n?Math.ceil(n.max??0):0,a=l.useMemo(()=>[u??f,i??r],[u,i,f,r]),d=u!==void 0||i!==void 0,[p,S]=l.useState(d),v=l.useCallback(()=>{S(g=>!g)},[]),m=l.useCallback(([g,b])=>{if(!n)return;const y=_(g,b,f,r);s(n.field,y)},[f,r,s,n]);return L.useEventBusSubscribe({event:"events/removeAllFilters",callback:()=>{S(!1)}}),n?{min:f,max:r,range:a,updateRange:m,active:p,toggleActive:v}:H}const H={min:0,max:0,range:[0,0],active:!1,toggleActive:()=>{},updateRange:()=>{}};function U(e){const s=e?.range?.[0];return typeof s=="object"&&("gte"in s||"lte"in s)?[F.parseNumber(s.gte),F.parseNumber(s.lte)]:[void 0,void 0]}function _(e,s,t,o){const n=e!==void 0?Math.floor(e):void 0,c=s!==void 0?Math.ceil(s):void 0,u=n!==void 0,i=c!==void 0;if((t===n||!u)&&(o===c||!i))return;const f={};return u&&n!==t&&(f.gte=n.toString()),i&&c!==o&&(f.lte=c.toString()),Object.keys(f).length>0?f:void 0}function I(e,s){const{min:t,max:o,range:n,updateRange:c}=x(e),{filters:u}=T(),i=l.useMemo(()=>{const d=u.find(m=>m?.filter?.range);let p=null;if(d){const m=d.filter.range?.[0];p=[F.parseNumber(m?.gte),F.parseNumber(m?.lte)]}const S=[];let v=Math.floor(t/s)*s;for(;v<o;){const m=v+s,g=p&&p[0]===v&&p[1]===m;S.push({min:v,max:m,selected:g}),v=m}return S},[u,t,o,s]),f=l.useCallback(d=>{c([d,n[1]])},[n,c]),r=l.useCallback(d=>{c([n[0],d])},[n,c]),a=t!==n[0]||o!==n[1];return{min:t,max:o,range:n,updateRange:c,ranges:i,handleMinChange:f,handleMaxChange:r,isSelected:a}}function K(){const{products:e,keywords:s,popularSearches:t,categories:o}=h.useNostoAppState(n=>({products:n.response.products??w,keywords:n.response.keywords??w,popularSearches:n.response.popularSearches??w,categories:n.response.categories??w}));return{products:e,keywords:s,popularSearches:t,categories:o}}const w={hits:[],total:0};function Z(){const e=h.useNostoAppState(t=>t.query.products?.filter);return l.useMemo(()=>e?e.reduce((t,o)=>t+(Array.isArray(o.value)?o.value.length:1),0):0,[e])}const G=5*60*1e3,N=new Map;function J(e){const[s,t]=l.useState({product:null,loading:!0,error:null});return l.useEffect(()=>{if(!e){t({product:null,loading:!1,error:"Product handle is required"});return}t(n=>({...n,loading:!0,error:null}));const o=Y(e);if(o){t({product:o,loading:!1,error:null});return}W(e).then(n=>{ee(e,n),t({product:n,loading:!1,error:null})}).catch(n=>{t({product:null,loading:!1,error:n.message||"Failed to fetch product"})})},[e]),s}function Q(e){const s=window.Shopify?.routes?.root;return s?new URL(`${s}products/${e}`,window.location.href):e}async function W(e){const s=await fetch(Q(`/products/${e}.js`));if(!s.ok)throw new Error(`Failed to fetch product: ${s.status} ${s.statusText}`);return s.json()}function Y(e){const s=N.get(e);return s?Date.now()-s.created>G?(N.delete(e),null):s.product:null}function ee(e,s){N.set(e,{product:s,created:Date.now()})}function k(e){return e&&!Number.isNaN(e)?e:0}function te(e,s){const{from:t,size:o,total:n}=h.useNostoAppState(r=>({from:k(r.query.products?.from??0),size:k(r.response?.products?.size??s),total:k(r.response?.products?.total??0)})),{updateSearch:c}=A.useActions(),u=t+o,i=l.useMemo(()=>[...e].reverse().filter(r=>r<n),[e,n]),f=l.useCallback(r=>{c({products:{size:F.parseNumber(r)}})},[c]);return{from:t,to:u,total:n,size:o,sizeOptions:i,handleSizeChange:f}}function se(e,s){return e.length!==s.length?!1:e.every(t=>s.find(o=>t.field===o.field&&t.order===o.order))}function ne(e){const s=h.useNostoAppState(c=>c.query),{updateSearch:t}=A.useActions(),o=e.find(c=>se(c.value.sort,s.products?.sort||[]))?.id??e[0]?.id,n=l.useCallback(c=>{const u=e.find(i=>i.id===c);u&&t({products:{sort:u.value.sort}})},[e,t]);return{activeSort:o,setSort:n}}const C=window.SpeechRecognition||window.webkitSpeechRecognition,P=!!(C&&typeof C=="function");function oe(){return{listening:!1,startListening:()=>{},stopListening:()=>{}}}function re({language:e="en-US",interimResults:s=!1,onResult:t,onError:o}={}){const[n,c]=l.useState(!1),u=l.useRef(null),i=l.useCallback(()=>{const r=new C;r.lang=e,r.interimResults=s,r.onstart=()=>c(!0),t&&(r.onresult=a=>{const{transcript:d}=a.results?.[0]?.[0];t(d)}),o&&(r.onerror=a=>o(a.error)),r.onend=()=>c(!1),u.current=r,r.start()},[e,s,o,t]),f=l.useCallback(()=>{u.current?.stop()},[u]);return{listening:n,startListening:i,stopListening:f}}const ce=P?re:oe;function ue(e,s){if(!e.length||!s.length)return[];const t=s.reduce((o,n)=>(o[n]={},o),{});return e.forEach(o=>{o.customFields?.forEach(({key:n,value:c})=>{const u=n.toLowerCase();s.includes(u)&&(t[u][c]=t[u][c]||[],t[u][c].push(o))})}),Object.entries(t).filter(o=>Object.keys(o[1]).length).map(([o,n])=>({field:o,options:Object.entries(n).map(([c,u])=>({value:c,skus:u,unavailable:!1,selected:!1}))}))}function ae(e,s){return e.length?e.map(({field:t,options:o})=>({field:t,options:o.map(n=>{const c=!n.skus?.some(i=>Object.entries(s).every(([f,r])=>f===t?!0:i.customFields?.find(d=>d.key.toLowerCase()===f)?.value===r)),u=s[t]===n.value;return{...n,unavailable:c,selected:u}})})):[]}const R=["4XS","3XS","2XS","XXS","XS","S","M","L","XL","XXL","2XL","XXXL","3XL","4XL"];function ie(e){if(R.includes(e))return 1e3+R.indexOf(e);const s=parseFloat(e);return isNaN(s)?e:s}function le(e,s){return[...s].sort((t,o)=>{const[n,c]=[t.value,o.value].map(ie);return n<c?-1:1})}function de(e=[],s=[]){const[t,o]=l.useState({}),n=l.useMemo(()=>ue(e,s).map(({field:r,options:a})=>({field:r,options:le(r,a)})),[e,s]),c=l.useMemo(()=>ae(n,t),[n,t]),u=l.useCallback((f,r)=>{o(a=>{const d={...a};return d[f]===r?delete d[f]:d[f]=r,d})},[]),i=l.useMemo(()=>Object.keys(t).filter(a=>t[a]).length===0?[]:c.filter(({field:a})=>t[a]).map(({field:a,options:d})=>{const p=t[a];return d.find(v=>v.value===p)?.skus??[]}).reduce((a,d)=>a.filter(p=>d.includes(p))),[c,t]);return{swatches:c,toggleOption:u,matchedSkus:i}}exports.useActions=A.useActions;exports.useLoadMore=h.useLoadMore;exports.useNostoAppState=h.useNostoAppState;exports.addToHistory=M.addToHistory;exports.getSavedHistory=M.getSavedHistory;exports.useHistory=M.useHistory;exports.speechToTextSupported=P;exports.useDecoratedSearchResults=X;exports.useFacet=E;exports.useFacets=j;exports.usePagination=B;exports.usePersonalization=D;exports.useProductFilters=T;exports.useRange=x;exports.useRangeSelector=I;exports.useResponse=K;exports.useSelectedFiltersCount=Z;exports.useShopifyProduct=J;exports.useSizeOptions=te;exports.useSort=ne;exports.useSpeechToText=ce;exports.useSwatches=de;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("../../useActions-CG4NaniG.cjs"),q=require("../../storage-BQdl3oEs.cjs"),h=require("../../useLoadMore-EOcCFqU8.cjs"),L=require("../../eventBusSubscribe-oONOUGH8.cjs"),l=require("preact/hooks"),M=require("../../useHistory-D6Q9vxsY.cjs"),z=require("../../index.es-Dp6Iaxz3.cjs"),O=require("../../eventBusDispatch-BKQcSHAB.cjs"),F=require("../../parseNumber-FsZ8w61u.cjs");function X(e){const s=h.useNostoAppState(t=>t.response);return e&&Array.isArray(e)||e&&q.isPlainObject(e)?e:s}function E(e,s){const t=e.data?.filter(f=>f.selected).length??0,{active:o}={active:t>0,...s},[n,c]=l.useState(o),{toggleProductFilter:u}=A.useActions(),a=l.useCallback(()=>{c(!n)},[n]);return L.useEventBusSubscribe({event:"events/removeAllFilters",callback:()=>{c(!1)}}),{active:n,selectedFiltersCount:t,toggleActive:a,toggleProductFilter:u}}function j(){const{loading:e,facets:s}=h.useNostoAppState(t=>({loading:t.loading,facets:t.response?.products?.facets??[]}));return{loading:e,facets:s}}function V(e,s){const t=s-e;return!isNaN(t)&&t>0?new Array(s-e).fill(void 0).map((o,n)=>n+e):[]}function B(e){const{query:s,products:t}=h.useNostoAppState(o=>({query:o.query,products:o.response.products}));return l.useMemo(()=>{if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const o=s.products?.from??0,n=e?.width??1/0,c=Math.max(Math.floor(n-1)/2,1),u=t.size>0?Math.floor(o/t.size)+1:1,a=t.size>0?Math.ceil(t.total/t.size):0,f=y=>y>=u-c&&y<=u+c,r=o+1,i=Math.min(o+t.total,t.total),d={from:o,page:u,current:!0},p=y=>({from:(y-1)*t.size,page:y,current:y===u}),S=u>1?p(u-1):void 0,v=u<a?p(u+1):void 0,m=u-c-1>1?p(1):void 0,g=u+c+1<a?p(a):void 0,b=V(1,a+1).filter(f).map(p);return!m&&b[0]?.page===2&&b.unshift(p(1)),!g&&b[b.length-1]?.page===a-1&&b.push(p(a)),{totalPages:a,resultsFrom:r,resultsTo:i,current:d,prev:S,next:v,first:m,last:g,pages:b}},[s,t,e?.width])}function D(){const[e,s]=l.useState([]),[t,o]=l.useState([]);return l.useEffect(()=>{z.s(async n=>{const{products:c,segments:u}=await n.getSearchSessionParams();s(u??[]),o(c?.personalizationBoost??[])})},[]),{segments:e,boost:t}}function $(){const{facets:e}=h.useNostoAppState(r=>({facets:r.response.products?.facets??[]})),{replaceFilter:s,toggleProductFilter:t}=A.useActions(),o=l.useCallback(r=>{const i=e?.find(d=>d.type==="stats"&&d.field===r);if(i&&"min"in i&&"max"in i)return i},[e]),n=l.useCallback(r=>e?.find(i=>i.field===r)?.name??r,[e]),c=l.useCallback(r=>"field"in r&&(r.value instanceof Array||r.range instanceof Array),[]),u=l.useCallback(r=>({...r,range:r.range?.map(i=>({gt:i.gt?Number(i.gt):i.gt,gte:i.gte?Number(i.gte):i.gte,lt:i.lt?Number(i.lt):i.lt,lte:i.lte?Number(i.lte):i.lte}))}),[]),a=l.useCallback(r=>(r.value??[]).map(d=>({value:d,field:r.field,name:n(r.field),filter:u(r),remove:()=>{t(r.field,d,!1)}})),[u,n,t]),f=l.useCallback(r=>(r.range??[]).map(d=>{const p=d.gte??d.gt??o(r.field)?.min,S=d.lte??d.lt??o(r.field)?.max;if(p!==void 0&&S!==void 0)return{value:`${p} - ${S}`,field:r.field,name:n(r.field),filter:u(r),remove:()=>{s(r.field,void 0)}}}).filter(Boolean),[u,o,n,s]);return{selectFilters:c,toValueFilter:a,toRangeFilter:f}}function T(){const{filter:e}=h.useNostoAppState(a=>({filter:a.query.products?.filter??[]})),{updateSearch:s}=A.useActions(),{selectFilters:t,toValueFilter:o,toRangeFilter:n}=$(),c=l.useMemo(()=>e?e.filter(t).flatMap(a=>"value"in a?o(a):"range"in a?n(a):[]).filter(Boolean):[],[e,t,n,o]),u=l.useCallback(()=>{s({products:{filter:[]}}),O.dispatchNostoEvent({event:"events/removeAllFilters",params:null})},[s]);return{filters:c,removeAll:u}}function x(e){const{replaceFilter:s}=A.useActions(),{query:t,products:o}=h.useNostoAppState(g=>({query:g.query,products:g.response.products})),n=o?.facets?.find(g=>g.id===e),c=t.products?.filter?.find(g=>g.field===n?.field),[u,a]=U(c),f=n&&"min"in n?Math.floor(n.min??0):0,r=n&&"max"in n?Math.ceil(n.max??0):0,i=l.useMemo(()=>[u??f,a??r],[u,a,f,r]),d=u!==void 0||a!==void 0,[p,S]=l.useState(d),v=l.useCallback(()=>{S(g=>!g)},[]),m=l.useCallback(([g,b])=>{if(!n)return;const y=_(g,b,f,r);s(n.field,y)},[f,r,s,n]);return L.useEventBusSubscribe({event:"events/removeAllFilters",callback:()=>{S(!1)}}),n?{min:f,max:r,range:i,updateRange:m,active:p,toggleActive:v}:H}const H={min:0,max:0,range:[0,0],active:!1,toggleActive:()=>{},updateRange:()=>{}};function U(e){const s=e?.range?.[0];return typeof s=="object"&&("gte"in s||"lte"in s)?[F.parseNumber(s.gte),F.parseNumber(s.lte)]:[void 0,void 0]}function _(e,s,t,o){const n=e!==void 0?Math.floor(e):void 0,c=s!==void 0?Math.ceil(s):void 0,u=n!==void 0,a=c!==void 0;if((t===n||!u)&&(o===c||!a))return;const f={};return u&&n!==t&&(f.gte=n.toString()),a&&c!==o&&(f.lte=c.toString()),Object.keys(f).length>0?f:void 0}function I(e,s){const{min:t,max:o,range:n,updateRange:c}=x(e),{filters:u}=T(),a=l.useMemo(()=>{const d=u.find(m=>m?.filter?.range);let p=null;if(d){const m=d.filter.range?.[0];p=[F.parseNumber(m?.gte),F.parseNumber(m?.lte)]}const S=[];let v=Math.floor(t/s)*s;for(;v<o;){const m=v+s,g=p&&p[0]===v&&p[1]===m;S.push({min:v,max:m,selected:g}),v=m}return S},[u,t,o,s]),f=l.useCallback(d=>{c([d,n[1]])},[n,c]),r=l.useCallback(d=>{c([n[0],d])},[n,c]),i=t!==n[0]||o!==n[1];return{min:t,max:o,range:n,updateRange:c,ranges:a,handleMinChange:f,handleMaxChange:r,isSelected:i}}function K(){const{products:e,keywords:s,popularSearches:t,categories:o}=h.useNostoAppState(n=>({products:n.response.products??w,keywords:n.response.keywords??w,popularSearches:n.response.popularSearches??w,categories:n.response.categories??w}));return{products:e,keywords:s,popularSearches:t,categories:o}}const w={hits:[],total:0};function Z(){const e=h.useNostoAppState(t=>t.query.products?.filter);return l.useMemo(()=>e?e.reduce((t,o)=>t+(Array.isArray(o.value)?o.value.length:1),0):0,[e])}const G=5*60*1e3,N=new Map;function J(e){const[s,t]=l.useState({product:null,loading:!0,error:null});return l.useEffect(()=>{if(!e){t({product:null,loading:!1,error:"Product handle is required"});return}t(n=>({...n,loading:!0,error:null}));const o=Y(e);if(o){t({product:o,loading:!1,error:null});return}W(e).then(n=>{ee(e,n),t({product:n,loading:!1,error:null})}).catch(n=>{t({product:null,loading:!1,error:n.message||"Failed to fetch product"})})},[e]),s}function Q(e){const s=window.Shopify?.routes?.root;return s?new URL(`${s}products/${e}`,window.location.href):e}async function W(e){const s=await fetch(Q(`/products/${e}.js`));if(!s.ok)throw new Error(`Failed to fetch product: ${s.status} ${s.statusText}`);return s.json()}function Y(e){const s=N.get(e);return s?Date.now()-s.created>G?(N.delete(e),null):s.product:null}function ee(e,s){N.set(e,{product:s,created:Date.now()})}function k(e){return e&&!Number.isNaN(e)?e:0}function te(e,s){const{from:t,size:o,total:n}=h.useNostoAppState(r=>({from:k(r.query.products?.from??0),size:k(r.response?.products?.size??s),total:k(r.response?.products?.total??0)})),{updateSearch:c}=A.useActions(),u=t+o,a=l.useMemo(()=>[...e].reverse().filter(r=>r<n),[e,n]),f=l.useCallback(r=>{c({products:{size:F.parseNumber(r)}})},[c]);return{from:t,to:u,total:n,size:o,sizeOptions:a,handleSizeChange:f}}function se(e,s){return e.length!==s.length?!1:e.every(t=>s.find(o=>t.field===o.field&&t.order===o.order))}function ne(e){const s=h.useNostoAppState(c=>c.query),{updateSearch:t}=A.useActions(),o=e.find(c=>se(c.value.sort,s.products?.sort||[]))?.id??e[0]?.id,n=l.useCallback(c=>{if(c===o)return;const u=e.find(a=>a.id===c);u&&t({products:{sort:u.value.sort}})},[e,t,o]);return{activeSort:o,setSort:n}}const C=window.SpeechRecognition||window.webkitSpeechRecognition,P=!!(C&&typeof C=="function");function oe(){return{listening:!1,startListening:()=>{},stopListening:()=>{}}}function re({language:e="en-US",interimResults:s=!1,onResult:t,onError:o}={}){const[n,c]=l.useState(!1),u=l.useRef(null),a=l.useCallback(()=>{const r=new C;r.lang=e,r.interimResults=s,r.onstart=()=>c(!0),t&&(r.onresult=i=>{const{transcript:d}=i.results?.[0]?.[0];t(d)}),o&&(r.onerror=i=>o(i.error)),r.onend=()=>c(!1),u.current=r,r.start()},[e,s,o,t]),f=l.useCallback(()=>{u.current?.stop()},[u]);return{listening:n,startListening:a,stopListening:f}}const ce=P?re:oe;function ue(e,s){if(!e.length||!s.length)return[];const t=s.reduce((o,n)=>(o[n]={},o),{});return e.forEach(o=>{o.customFields?.forEach(({key:n,value:c})=>{const u=n.toLowerCase();s.includes(u)&&(t[u][c]=t[u][c]||[],t[u][c].push(o))})}),Object.entries(t).filter(o=>Object.keys(o[1]).length).map(([o,n])=>({field:o,options:Object.entries(n).map(([c,u])=>({value:c,skus:u,unavailable:!1,selected:!1}))}))}function ie(e,s){return e.length?e.map(({field:t,options:o})=>({field:t,options:o.map(n=>{const c=!n.skus?.some(a=>Object.entries(s).every(([f,r])=>f===t?!0:a.customFields?.find(d=>d.key.toLowerCase()===f)?.value===r)),u=s[t]===n.value;return{...n,unavailable:c,selected:u}})})):[]}const R=["4XS","3XS","2XS","XXS","XS","S","M","L","XL","XXL","2XL","XXXL","3XL","4XL"];function ae(e){if(R.includes(e))return 1e3+R.indexOf(e);const s=parseFloat(e);return isNaN(s)?e:s}function le(e,s){return[...s].sort((t,o)=>{const[n,c]=[t.value,o.value].map(ae);return n<c?-1:1})}function de(e=[],s=[]){const[t,o]=l.useState({}),n=l.useMemo(()=>ue(e,s).map(({field:r,options:i})=>({field:r,options:le(r,i)})),[e,s]),c=l.useMemo(()=>ie(n,t),[n,t]),u=l.useCallback((f,r)=>{o(i=>{const d={...i};return d[f]===r?delete d[f]:d[f]=r,d})},[]),a=l.useMemo(()=>Object.keys(t).filter(i=>t[i]).length===0?[]:c.filter(({field:i})=>t[i]).map(({field:i,options:d})=>{const p=t[i];return d.find(v=>v.value===p)?.skus??[]}).reduce((i,d)=>i.filter(p=>d.includes(p))),[c,t]);return{swatches:c,toggleOption:u,matchedSkus:a}}exports.useActions=A.useActions;exports.useLoadMore=h.useLoadMore;exports.useNostoAppState=h.useNostoAppState;exports.addToHistory=M.addToHistory;exports.getSavedHistory=M.getSavedHistory;exports.useHistory=M.useHistory;exports.speechToTextSupported=P;exports.useDecoratedSearchResults=X;exports.useFacet=E;exports.useFacets=j;exports.usePagination=B;exports.usePersonalization=D;exports.useProductFilters=T;exports.useRange=x;exports.useRangeSelector=I;exports.useResponse=K;exports.useSelectedFiltersCount=Z;exports.useShopifyProduct=J;exports.useSizeOptions=te;exports.useSort=ne;exports.useSpeechToText=ce;exports.useSwatches=de;
@@ -404,6 +404,8 @@ function Z(e, n) {
404
404
  function Fe(e) {
405
405
  const n = S((c) => c.query), { updateSearch: t } = A(), o = e.find((c) => Z(c.value.sort, n.products?.sort || []))?.id ?? e[0]?.id, r = p(
406
406
  (c) => {
407
+ if (c === o)
408
+ return;
407
409
  const i = e.find((u) => u.id === c);
408
410
  i && t({
409
411
  products: {
@@ -411,7 +413,7 @@ function Fe(e) {
411
413
  }
412
414
  });
413
415
  },
414
- [e, t]
416
+ [e, t, o]
415
417
  );
416
418
  return {
417
419
  /** Active sort */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosto/search-js",
3
- "version": "3.24.2",
3
+ "version": "3.24.5",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "files": [
@@ -97,14 +97,14 @@
97
97
  "prepare": "husky"
98
98
  },
99
99
  "devDependencies": {
100
- "@commitlint/cli": "^20.1.0",
101
- "@commitlint/config-conventional": "^20.0.0",
100
+ "@commitlint/cli": "^20.2.0",
101
+ "@commitlint/config-conventional": "^20.2.0",
102
102
  "@nosto/nosto-js": "^2.9.3",
103
103
  "@testing-library/dom": "^10.4.1",
104
104
  "@types/dom-speech-recognition": "^0.0.7",
105
105
  "@types/eslint-config-prettier": "^6.11.3",
106
106
  "@types/node": "^24.10.1",
107
- "@vitest/coverage-v8": "^4.0.14",
107
+ "@vitest/coverage-v8": "^4.0.15",
108
108
  "concurrently": "^9.2.1",
109
109
  "copyfiles": "^2.4.1",
110
110
  "eslint": "^9.39.1",
@@ -117,16 +117,20 @@
117
117
  "eslint-plugin-unused-imports": "^4.3.0",
118
118
  "husky": "^9.1.7",
119
119
  "isbot": "^5.1.32",
120
- "jsdom": "^27.2.0",
121
- "prettier": "^3.7.3",
120
+ "jsdom": "^27.3.0",
121
+ "prettier": "^3.7.4",
122
122
  "typedoc": "^0.28.15",
123
123
  "typescript": "^5.9.3",
124
- "typescript-eslint": "^8.48.0",
125
- "vite": "^7.2.6",
124
+ "typescript-eslint": "^8.48.1",
125
+ "vite": "^7.2.7",
126
126
  "vite-plugin-dts": "^4.5.4",
127
127
  "vitest": "^4.0.7"
128
128
  },
129
129
  "publishConfig": {
130
130
  "access": "public"
131
+ },
132
+ "repository": {
133
+ "type": "git",
134
+ "url": "git+https://github.com/Nosto/search-js.git"
131
135
  }
132
136
  }