@nosto/search-js 3.16.1 → 3.17.1

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.
@@ -0,0 +1 @@
1
+ "use strict";const n=require("preact/hooks");function e({event:t,params:s}){window.dispatchEvent(new CustomEvent(`@nosto/search-js/${t}`,{detail:s}))}function o({event:t}){return n.useCallback(s=>{e({event:t,params:s})},[t])}exports.dispatchNostoEvent=e;exports.useEventBusDispatch=o;
@@ -0,0 +1,20 @@
1
+ import { useCallback as n } from "preact/hooks";
2
+ function o({ event: t, params: s }) {
3
+ window.dispatchEvent(
4
+ new CustomEvent(`@nosto/search-js/${t}`, {
5
+ detail: s
6
+ })
7
+ );
8
+ }
9
+ function e({ event: t }) {
10
+ return n(
11
+ (s) => {
12
+ o({ event: t, params: s });
13
+ },
14
+ [t]
15
+ );
16
+ }
17
+ export {
18
+ o as d,
19
+ e as u
20
+ };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("preact/hooks"),t=require("../../eventBusSubscribe-oONOUGH8.cjs");function o({event:e,params:s}){window.dispatchEvent(new CustomEvent(`@nosto/search-js/${e}`,{detail:s}))}function n({event:e}){return u.useCallback(s=>{o({event:e,params:s})},[e])}exports.subscribeToNostoEvent=t.subscribeToNostoEvent;exports.useEventBusSubscribe=t.useEventBusSubscribe;exports.dispatchNostoEvent=o;exports.useEventBusDispatch=n;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../eventBusDispatch-BKQcSHAB.cjs"),s=require("../../eventBusSubscribe-oONOUGH8.cjs");exports.dispatchNostoEvent=e.dispatchNostoEvent;exports.useEventBusDispatch=e.useEventBusDispatch;exports.subscribeToNostoEvent=s.subscribeToNostoEvent;exports.useEventBusSubscribe=s.useEventBusSubscribe;
@@ -1,23 +1,8 @@
1
- import { useCallback as o } from "preact/hooks";
2
- import { s as a, u as c } from "../../eventBusSubscribe-CzlS132j.js";
3
- function e({ event: s, params: t }) {
4
- window.dispatchEvent(
5
- new CustomEvent(`@nosto/search-js/${s}`, {
6
- detail: t
7
- })
8
- );
9
- }
10
- function u({ event: s }) {
11
- return o(
12
- (t) => {
13
- e({ event: s, params: t });
14
- },
15
- [s]
16
- );
17
- }
1
+ import { d as t, u as o } from "../../eventBusDispatch-DPR2Vwd4.js";
2
+ import { s as a, u as r } from "../../eventBusSubscribe-CzlS132j.js";
18
3
  export {
19
- e as dispatchNostoEvent,
4
+ t as dispatchNostoEvent,
20
5
  a as subscribeToNostoEvent,
21
- u as useEventBusDispatch,
22
- c as useEventBusSubscribe
6
+ o as useEventBusDispatch,
7
+ r as useEventBusSubscribe
23
8
  };
@@ -22,5 +22,6 @@ export type EventParams = {
22
22
  value: InputSearchRangeFilter | string | undefined;
23
23
  targetStore: PageType;
24
24
  };
25
+ ["events/removeAllFilters"]: null;
25
26
  };
26
27
  export type AllowedEvents = keyof EventParams;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("../../useActions-Drtoxcu4.cjs"),P=require("../../logger-Boh_C6Bz.cjs"),h=require("../../useLoadMore-QOHOP_fr.cjs"),d=require("preact/hooks"),L=require("../../useHistory-D7detcsc.cjs"),T=require("../../index.es-Dp6Iaxz3.cjs"),A=require("../../parseNumber-FsZ8w61u.cjs");function q(e){const s=h.useNostoAppState(t=>t.response);return e&&Array.isArray(e)||e&&P.isPlainObject(e)?e:s}function z(e,s){const t=e.data?.filter(f=>f.selected).length??0,{active:r}={active:t>0,...s},[n,c]=d.useState(r),{toggleProductFilter:u}=y.useActions(),l=d.useCallback(()=>{c(!n)},[n]);return{active:n,selectedFiltersCount:t,toggleActive:l,toggleProductFilter:u}}function X(){const{loading:e,facets:s}=h.useNostoAppState(t=>({loading:t.loading,facets:t.response?.products?.facets??[]}));return{loading:e,facets:s}}function O(e,s){const t=s-e;return!isNaN(t)&&t>0?new Array(s-e).fill(void 0).map((r,n)=>n+e):[]}function j(e){const{query:s,products:t}=h.useNostoAppState(r=>({query:r.query,products:r.response.products}));return d.useMemo(()=>{if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const r=s.products?.from??0,n=e?.width??1/0,c=Math.max(Math.floor(n-1)/2,1),u=t.size>0?Math.floor(r/t.size)+1:1,l=t.size>0?Math.ceil(t.total/t.size):0,f=F=>F>=u-c&&F<=u+c,o=r+1,i=Math.min(r+t.total,t.total),a={from:r,page:u,current:!0},p=F=>({from:(F-1)*t.size,page:F,current:F===u}),S=u>1?p(u-1):void 0,m=u<l?p(u+1):void 0,g=u-c-1>1?p(1):void 0,v=u+c+1<l?p(l):void 0,b=O(1,l+1).filter(f).map(p);return!g&&b[0]?.page===2&&b.unshift(p(1)),!v&&b[b.length-1]?.page===l-1&&b.push(p(l)),{totalPages:l,resultsFrom:o,resultsTo:i,current:a,prev:S,next:m,first:g,last:v,pages:b}},[s,t,e?.width])}function D(){const[e,s]=d.useState([]),[t,r]=d.useState([]);return d.useEffect(()=>{T.s(async n=>{const{products:c,segments:u}=await n.getSearchSessionParams();s(u??[]),r(c?.personalizationBoost??[])})},[]),{segments:e,boost:t}}function E(){const{facets:e}=h.useNostoAppState(o=>({facets:o.response.products?.facets??[]})),{replaceFilter:s,toggleProductFilter:t}=y.useActions(),r=d.useCallback(o=>{const i=e?.find(a=>a.type==="stats"&&a.field===o);if(i&&"min"in i&&"max"in i)return i},[e]),n=d.useCallback(o=>e?.find(i=>i.field===o)?.name??o,[e]),c=d.useCallback(o=>"field"in o&&(o.value instanceof Array||o.range instanceof Array),[]),u=d.useCallback(o=>({...o,range:o.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}))}),[]),l=d.useCallback(o=>(o.value??[]).map(a=>({value:a,field:o.field,name:n(o.field),filter:u(o),remove:()=>{t(o.field,a,!1)}})),[u,n,t]),f=d.useCallback(o=>(o.range??[]).map(a=>{const p=a.gte??a.gt??r(o.field)?.min,S=a.lte??a.lt??r(o.field)?.max;if(p!==void 0&&S!==void 0)return{value:`${p} - ${S}`,field:o.field,name:n(o.field),filter:u(o),remove:()=>{s(o.field,void 0)}}}).filter(Boolean),[u,r,n,s]);return{selectFilters:c,toValueFilter:l,toRangeFilter:f}}function k(){const{filter:e}=h.useNostoAppState(l=>({filter:l.query.products?.filter??[]})),{updateSearch:s}=y.useActions(),{selectFilters:t,toValueFilter:r,toRangeFilter:n}=E(),c=d.useMemo(()=>e?e.filter(t).flatMap(l=>"value"in l?r(l):"range"in l?n(l):[]).filter(Boolean):[],[e,t,n,r]),u=d.useCallback(()=>{s({products:{filter:[]}})},[s]);return{filters:c,removeAll:u}}function R(e){const{replaceFilter:s}=y.useActions(),{query:t,products:r}=h.useNostoAppState(a=>({query:a.query,products:a.response.products})),n=r?.facets?.find(a=>a.id===e);if(!n)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const c=t.products?.filter?.find(a=>a.field===n.field),u=c?.range?c.range[0]:void 0,l=typeof u=="object"&&("gte"in u||"lte"in u)?[A.parseNumber(u.gte),A.parseNumber(u.lte)]:[void 0,void 0],f="min"in n?Math.floor(n.min):0,o="max"in n?Math.ceil(n.max):0,i=([a,p])=>{const S=a!==void 0?Math.floor(a):void 0,m=p!==void 0?Math.ceil(p):void 0,g=S!==void 0,v=m!==void 0;(f===S||!g)&&(o===m||!v)?s(n.field,void 0):(f===S||!g)&&v?s(n.field,{lte:m.toString()}):(o===m||!v)&&g?s(n.field,{gte:S.toString()}):g&&v&&s(n.field,{gte:S.toString(),lte:m.toString()})};return{min:f,max:o,range:[l[0]??f,l[1]??o],updateRange:i}}function V(e,s){const{min:t,max:r,range:n,updateRange:c}=R(e),{filters:u}=k(),l=d.useMemo(()=>{const a=u.find(g=>g?.filter?.range);let p=null;if(a){const g=a.filter.range?.[0];p=[A.parseNumber(g?.gte),A.parseNumber(g?.lte)]}const S=[];let m=Math.floor(t/s)*s;for(;m<r;){const g=m+s,v=p&&p[0]===m&&p[1]===g;S.push({min:m,max:g,selected:v}),m=g}return S},[u,t,r,s]),f=a=>{c([a,n[1]])},o=a=>{c([n[0],a])},i=t!==n[0]||r!==n[1];return{min:t,max:r,range:n,updateRange:c,ranges:l,handleMinChange:f,handleMaxChange:o,isSelected:i}}function $(){const{products:e,keywords:s}=h.useNostoAppState(t=>t.response);return{products:e??{hits:[],total:0},keywords:s??{hits:[],total:0}}}function B(){const e=h.useNostoAppState(t=>t.query.products?.filter);return d.useMemo(()=>e?e.reduce((t,r)=>t+(Array.isArray(r.value)?r.value.length:1),0):0,[e])}const _=5*60*1e3,N=new Map;function H(e){const[s,t]=d.useState({product:null,loading:!0,error:null});return d.useEffect(()=>{if(!e){t({product:null,loading:!1,error:"Product handle is required"});return}t(n=>({...n,loading:!0,error:null}));const r=I(e);if(r){t({product:r,loading:!1,error:null});return}U(e).then(n=>{Z(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}async function U(e){const s=await fetch(`/products/${e}.js`);if(!s.ok)throw new Error(`Failed to fetch product: ${s.status} ${s.statusText}`);return s.json()}function I(e){const s=N.get(e);return s?Date.now()-s.created>_?(N.delete(e),null):s.product:null}function Z(e,s){N.set(e,{product:s,created:Date.now()})}function w(e){return e&&!Number.isNaN(e)?e:0}function G(e,s){const{from:t,size:r,total:n}=h.useNostoAppState(o=>({from:w(o.query.products?.from??0),size:w(o.response?.products?.size??s),total:w(o.response?.products?.total??0)})),{updateSearch:c}=y.useActions(),u=t+r,l=d.useMemo(()=>[...e].reverse().filter(o=>o<n),[e,n]),f=d.useCallback(o=>{c({products:{size:A.parseNumber(o)}})},[c]);return{from:t,to:u,total:n,size:r,sizeOptions:l,handleSizeChange:f}}function J(e,s){return e.length!==s.length?!1:e.every(t=>s.find(r=>t.field===r.field&&t.order===r.order))}function K(e){const s=h.useNostoAppState(c=>c.query),{updateSearch:t}=y.useActions();return{activeSort:e.find(c=>J(c.value.sort,s.products?.sort||[]))?.id??e[0]?.id,setSort:c=>{const u=e.find(l=>l.id===c);u&&t({products:{sort:u.value.sort}})}}}const M=window.SpeechRecognition||window.webkitSpeechRecognition,x=!!(M&&typeof M=="function");function Q(){return{listening:!1,startListening:()=>{},stopListening:()=>{}}}function W({language:e="en-US",interimResults:s=!1,onResult:t,onError:r}={}){const[n,c]=d.useState(!1),u=d.useRef(null),l=d.useCallback(()=>{const o=new M;o.lang=e,o.interimResults=s,o.onstart=()=>c(!0),t&&(o.onresult=i=>{const{transcript:a}=i.results?.[0]?.[0];t(a)}),r&&(o.onerror=i=>r(i.error)),o.onend=()=>c(!1),u.current=o,o.start()},[e,s,r,t]),f=d.useCallback(()=>{u.current?.stop()},[u]);return{listening:n,startListening:l,stopListening:f}}const Y=x?W:Q;function ee(e,s){if(!e.length||!s.length)return[];const t=s.reduce((r,n)=>(r[n]={},r),{});return e.forEach(r=>{r.customFields?.forEach(({key:n,value:c})=>{const u=n.toLowerCase();s.includes(u)&&(t[u][c]=t[u][c]||[],t[u][c].push(r))})}),Object.entries(t).filter(r=>Object.keys(r[1]).length).map(([r,n])=>({field:r,options:Object.entries(n).map(([c,u])=>({value:c,skus:u,unavailable:!1,selected:!1}))}))}function te(e,s){return e.length?e.map(({field:t,options:r})=>({field:t,options:r.map(n=>{const c=!n.skus?.some(l=>Object.entries(s).every(([f,o])=>f===t?!0:l.customFields?.find(a=>a.key.toLowerCase()===f)?.value===o)),u=s[t]===n.value;return{...n,unavailable:c,selected:u}})})):[]}const C=["4XS","3XS","2XS","XXS","XS","S","M","L","XL","XXL","2XL","XXXL","3XL","4XL"];function se(e){if(C.includes(e))return 1e3+C.indexOf(e);const s=parseFloat(e);return isNaN(s)?e:s}function ne(e,s){return[...s].sort((t,r)=>{const[n,c]=[t.value,r.value].map(se);return n<c?-1:1})}function oe(e=[],s=[]){const[t,r]=d.useState({}),n=d.useMemo(()=>ee(e,s).map(({field:o,options:i})=>({field:o,options:ne(o,i)})),[e,s]),c=d.useMemo(()=>te(n,t),[n,t]),u=d.useCallback((f,o)=>{r(i=>{const a={...i};return a[f]===o?delete a[f]:a[f]=o,a})},[]),l=d.useMemo(()=>Object.keys(t).filter(i=>t[i]).length===0?[]:c.filter(({field:i})=>t[i]).map(({field:i,options:a})=>{const p=t[i];return a.find(m=>m.value===p)?.skus??[]}).reduce((i,a)=>i.filter(p=>a.includes(p))),[c,t]);return{swatches:c,toggleOption:u,matchedSkus:l}}exports.useActions=y.useActions;exports.useLoadMore=h.useLoadMore;exports.useNostoAppState=h.useNostoAppState;exports.useHistory=L.useHistory;exports.speechToTextSupported=x;exports.useDecoratedSearchResults=q;exports.useFacet=z;exports.useFacets=X;exports.usePagination=j;exports.usePersonalization=D;exports.useProductFilters=k;exports.useRange=R;exports.useRangeSelector=V;exports.useResponse=$;exports.useSelectedFiltersCount=B;exports.useShopifyProduct=H;exports.useSizeOptions=G;exports.useSort=K;exports.useSpeechToText=Y;exports.useSwatches=oe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("../../useActions-Drtoxcu4.cjs"),P=require("../../logger-Boh_C6Bz.cjs"),h=require("../../useLoadMore-QOHOP_fr.cjs"),q=require("../../eventBusSubscribe-oONOUGH8.cjs"),d=require("preact/hooks"),L=require("../../useHistory-D7detcsc.cjs"),T=require("../../index.es-Dp6Iaxz3.cjs"),z=require("../../eventBusDispatch-BKQcSHAB.cjs"),A=require("../../parseNumber-FsZ8w61u.cjs");function X(e){const s=h.useNostoAppState(t=>t.response);return e&&Array.isArray(e)||e&&P.isPlainObject(e)?e:s}function O(e,s){const t=e.data?.filter(f=>f.selected).length??0,{active:r}={active:t>0,...s},[n,c]=d.useState(r),{toggleProductFilter:u}=b.useActions(),l=d.useCallback(()=>{c(!n)},[n]);return q.useEventBusSubscribe({event:"events/removeAllFilters",callback:()=>{c(!1)}}),{active:n,selectedFiltersCount:t,toggleActive:l,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 E(e,s){const t=s-e;return!isNaN(t)&&t>0?new Array(s-e).fill(void 0).map((r,n)=>n+e):[]}function D(e){const{query:s,products:t}=h.useNostoAppState(r=>({query:r.query,products:r.response.products}));return d.useMemo(()=>{if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const r=s.products?.from??0,n=e?.width??1/0,c=Math.max(Math.floor(n-1)/2,1),u=t.size>0?Math.floor(r/t.size)+1:1,l=t.size>0?Math.ceil(t.total/t.size):0,f=F=>F>=u-c&&F<=u+c,o=r+1,i=Math.min(r+t.total,t.total),a={from:r,page:u,current:!0},p=F=>({from:(F-1)*t.size,page:F,current:F===u}),S=u>1?p(u-1):void 0,m=u<l?p(u+1):void 0,g=u-c-1>1?p(1):void 0,v=u+c+1<l?p(l):void 0,y=E(1,l+1).filter(f).map(p);return!g&&y[0]?.page===2&&y.unshift(p(1)),!v&&y[y.length-1]?.page===l-1&&y.push(p(l)),{totalPages:l,resultsFrom:o,resultsTo:i,current:a,prev:S,next:m,first:g,last:v,pages:y}},[s,t,e?.width])}function B(){const[e,s]=d.useState([]),[t,r]=d.useState([]);return d.useEffect(()=>{T.s(async n=>{const{products:c,segments:u}=await n.getSearchSessionParams();s(u??[]),r(c?.personalizationBoost??[])})},[]),{segments:e,boost:t}}function V(){const{facets:e}=h.useNostoAppState(o=>({facets:o.response.products?.facets??[]})),{replaceFilter:s,toggleProductFilter:t}=b.useActions(),r=d.useCallback(o=>{const i=e?.find(a=>a.type==="stats"&&a.field===o);if(i&&"min"in i&&"max"in i)return i},[e]),n=d.useCallback(o=>e?.find(i=>i.field===o)?.name??o,[e]),c=d.useCallback(o=>"field"in o&&(o.value instanceof Array||o.range instanceof Array),[]),u=d.useCallback(o=>({...o,range:o.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}))}),[]),l=d.useCallback(o=>(o.value??[]).map(a=>({value:a,field:o.field,name:n(o.field),filter:u(o),remove:()=>{t(o.field,a,!1)}})),[u,n,t]),f=d.useCallback(o=>(o.range??[]).map(a=>{const p=a.gte??a.gt??r(o.field)?.min,S=a.lte??a.lt??r(o.field)?.max;if(p!==void 0&&S!==void 0)return{value:`${p} - ${S}`,field:o.field,name:n(o.field),filter:u(o),remove:()=>{s(o.field,void 0)}}}).filter(Boolean),[u,r,n,s]);return{selectFilters:c,toValueFilter:l,toRangeFilter:f}}function C(){const{filter:e}=h.useNostoAppState(l=>({filter:l.query.products?.filter??[]})),{updateSearch:s}=b.useActions(),{selectFilters:t,toValueFilter:r,toRangeFilter:n}=V(),c=d.useMemo(()=>e?e.filter(t).flatMap(l=>"value"in l?r(l):"range"in l?n(l):[]).filter(Boolean):[],[e,t,n,r]),u=d.useCallback(()=>{s({products:{filter:[]}}),z.dispatchNostoEvent({event:"events/removeAllFilters",params:null})},[s]);return{filters:c,removeAll:u}}function R(e){const{replaceFilter:s}=b.useActions(),{query:t,products:r}=h.useNostoAppState(a=>({query:a.query,products:a.response.products})),n=r?.facets?.find(a=>a.id===e);if(!n)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const c=t.products?.filter?.find(a=>a.field===n.field),u=c?.range?c.range[0]:void 0,l=typeof u=="object"&&("gte"in u||"lte"in u)?[A.parseNumber(u.gte),A.parseNumber(u.lte)]:[void 0,void 0],f="min"in n?Math.floor(n.min):0,o="max"in n?Math.ceil(n.max):0,i=([a,p])=>{const S=a!==void 0?Math.floor(a):void 0,m=p!==void 0?Math.ceil(p):void 0,g=S!==void 0,v=m!==void 0;(f===S||!g)&&(o===m||!v)?s(n.field,void 0):(f===S||!g)&&v?s(n.field,{lte:m.toString()}):(o===m||!v)&&g?s(n.field,{gte:S.toString()}):g&&v&&s(n.field,{gte:S.toString(),lte:m.toString()})};return{min:f,max:o,range:[l[0]??f,l[1]??o],updateRange:i}}function $(e,s){const{min:t,max:r,range:n,updateRange:c}=R(e),{filters:u}=C(),l=d.useMemo(()=>{const a=u.find(g=>g?.filter?.range);let p=null;if(a){const g=a.filter.range?.[0];p=[A.parseNumber(g?.gte),A.parseNumber(g?.lte)]}const S=[];let m=Math.floor(t/s)*s;for(;m<r;){const g=m+s,v=p&&p[0]===m&&p[1]===g;S.push({min:m,max:g,selected:v}),m=g}return S},[u,t,r,s]),f=a=>{c([a,n[1]])},o=a=>{c([n[0],a])},i=t!==n[0]||r!==n[1];return{min:t,max:r,range:n,updateRange:c,ranges:l,handleMinChange:f,handleMaxChange:o,isSelected:i}}function _(){const{products:e,keywords:s}=h.useNostoAppState(t=>t.response);return{products:e??{hits:[],total:0},keywords:s??{hits:[],total:0}}}function H(){const e=h.useNostoAppState(t=>t.query.products?.filter);return d.useMemo(()=>e?e.reduce((t,r)=>t+(Array.isArray(r.value)?r.value.length:1),0):0,[e])}const U=5*60*1e3,w=new Map;function I(e){const[s,t]=d.useState({product:null,loading:!0,error:null});return d.useEffect(()=>{if(!e){t({product:null,loading:!1,error:"Product handle is required"});return}t(n=>({...n,loading:!0,error:null}));const r=G(e);if(r){t({product:r,loading:!1,error:null});return}Z(e).then(n=>{J(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}async function Z(e){const s=await fetch(`/products/${e}.js`);if(!s.ok)throw new Error(`Failed to fetch product: ${s.status} ${s.statusText}`);return s.json()}function G(e){const s=w.get(e);return s?Date.now()-s.created>U?(w.delete(e),null):s.product:null}function J(e,s){w.set(e,{product:s,created:Date.now()})}function N(e){return e&&!Number.isNaN(e)?e:0}function K(e,s){const{from:t,size:r,total:n}=h.useNostoAppState(o=>({from:N(o.query.products?.from??0),size:N(o.response?.products?.size??s),total:N(o.response?.products?.total??0)})),{updateSearch:c}=b.useActions(),u=t+r,l=d.useMemo(()=>[...e].reverse().filter(o=>o<n),[e,n]),f=d.useCallback(o=>{c({products:{size:A.parseNumber(o)}})},[c]);return{from:t,to:u,total:n,size:r,sizeOptions:l,handleSizeChange:f}}function Q(e,s){return e.length!==s.length?!1:e.every(t=>s.find(r=>t.field===r.field&&t.order===r.order))}function W(e){const s=h.useNostoAppState(c=>c.query),{updateSearch:t}=b.useActions();return{activeSort:e.find(c=>Q(c.value.sort,s.products?.sort||[]))?.id??e[0]?.id,setSort:c=>{const u=e.find(l=>l.id===c);u&&t({products:{sort:u.value.sort}})}}}const M=window.SpeechRecognition||window.webkitSpeechRecognition,x=!!(M&&typeof M=="function");function Y(){return{listening:!1,startListening:()=>{},stopListening:()=>{}}}function ee({language:e="en-US",interimResults:s=!1,onResult:t,onError:r}={}){const[n,c]=d.useState(!1),u=d.useRef(null),l=d.useCallback(()=>{const o=new M;o.lang=e,o.interimResults=s,o.onstart=()=>c(!0),t&&(o.onresult=i=>{const{transcript:a}=i.results?.[0]?.[0];t(a)}),r&&(o.onerror=i=>r(i.error)),o.onend=()=>c(!1),u.current=o,o.start()},[e,s,r,t]),f=d.useCallback(()=>{u.current?.stop()},[u]);return{listening:n,startListening:l,stopListening:f}}const te=x?ee:Y;function se(e,s){if(!e.length||!s.length)return[];const t=s.reduce((r,n)=>(r[n]={},r),{});return e.forEach(r=>{r.customFields?.forEach(({key:n,value:c})=>{const u=n.toLowerCase();s.includes(u)&&(t[u][c]=t[u][c]||[],t[u][c].push(r))})}),Object.entries(t).filter(r=>Object.keys(r[1]).length).map(([r,n])=>({field:r,options:Object.entries(n).map(([c,u])=>({value:c,skus:u,unavailable:!1,selected:!1}))}))}function ne(e,s){return e.length?e.map(({field:t,options:r})=>({field:t,options:r.map(n=>{const c=!n.skus?.some(l=>Object.entries(s).every(([f,o])=>f===t?!0:l.customFields?.find(a=>a.key.toLowerCase()===f)?.value===o)),u=s[t]===n.value;return{...n,unavailable:c,selected:u}})})):[]}const k=["4XS","3XS","2XS","XXS","XS","S","M","L","XL","XXL","2XL","XXXL","3XL","4XL"];function oe(e){if(k.includes(e))return 1e3+k.indexOf(e);const s=parseFloat(e);return isNaN(s)?e:s}function re(e,s){return[...s].sort((t,r)=>{const[n,c]=[t.value,r.value].map(oe);return n<c?-1:1})}function ue(e=[],s=[]){const[t,r]=d.useState({}),n=d.useMemo(()=>se(e,s).map(({field:o,options:i})=>({field:o,options:re(o,i)})),[e,s]),c=d.useMemo(()=>ne(n,t),[n,t]),u=d.useCallback((f,o)=>{r(i=>{const a={...i};return a[f]===o?delete a[f]:a[f]=o,a})},[]),l=d.useMemo(()=>Object.keys(t).filter(i=>t[i]).length===0?[]:c.filter(({field:i})=>t[i]).map(({field:i,options:a})=>{const p=t[i];return a.find(m=>m.value===p)?.skus??[]}).reduce((i,a)=>i.filter(p=>a.includes(p))),[c,t]);return{swatches:c,toggleOption:u,matchedSkus:l}}exports.useActions=b.useActions;exports.useLoadMore=h.useLoadMore;exports.useNostoAppState=h.useNostoAppState;exports.useHistory=L.useHistory;exports.speechToTextSupported=x;exports.useDecoratedSearchResults=X;exports.useFacet=O;exports.useFacets=j;exports.usePagination=D;exports.usePersonalization=B;exports.useProductFilters=C;exports.useRange=R;exports.useRangeSelector=$;exports.useResponse=_;exports.useSelectedFiltersCount=H;exports.useShopifyProduct=I;exports.useSizeOptions=K;exports.useSort=W;exports.useSpeechToText=te;exports.useSwatches=ue;
@@ -1,23 +1,30 @@
1
- import { h as b } from "../../useActions-MsVW37eV.js";
2
- import { a as z } from "../../logger-_fg_Za9y.js";
3
- import { a as S } from "../../useLoadMore-CYYoAHua.js";
4
- import { u as he } from "../../useLoadMore-CYYoAHua.js";
5
- import { useState as x, useCallback as h, useMemo as y, useEffect as X, useRef as A } from "preact/hooks";
6
- import { u as ve } from "../../useHistory-DtcY_Wkt.js";
7
- import { s as N } from "../../index.es-XNBESE3P.js";
1
+ import { h as x } from "../../useActions-MsVW37eV.js";
2
+ import { a as T } from "../../logger-_fg_Za9y.js";
3
+ import { a as v } from "../../useLoadMore-CYYoAHua.js";
4
+ import { u as Fe } from "../../useLoadMore-CYYoAHua.js";
5
+ import { u as X } from "../../eventBusSubscribe-CzlS132j.js";
6
+ import { useState as b, useCallback as h, useMemo as y, useEffect as N, useRef as z } from "preact/hooks";
7
+ import { u as be } from "../../useHistory-DtcY_Wkt.js";
8
+ import { s as k } from "../../index.es-XNBESE3P.js";
9
+ import { d as C } from "../../eventBusDispatch-DPR2Vwd4.js";
8
10
  import { p as R } from "../../parseNumber-QA48nJLp.js";
9
- function te(e) {
10
- const n = S((t) => t.response);
11
- return e && Array.isArray(e) || e && z(e) ? e : n;
11
+ function se(e) {
12
+ const n = v((t) => t.response);
13
+ return e && Array.isArray(e) || e && T(e) ? e : n;
12
14
  }
13
- function ne(e, n) {
15
+ function ie(e, n) {
14
16
  const t = e.data?.filter((d) => d.selected).length ?? 0, { active: s } = {
15
17
  active: t > 0,
16
18
  ...n
17
- }, [r, c] = x(s), { toggleProductFilter: i } = b(), l = h(() => {
19
+ }, [r, c] = b(s), { toggleProductFilter: i } = x(), l = h(() => {
18
20
  c(!r);
19
21
  }, [r]);
20
- return {
22
+ return X({
23
+ event: "events/removeAllFilters",
24
+ callback: () => {
25
+ c(!1);
26
+ }
27
+ }), {
21
28
  /** Active value */
22
29
  active: r,
23
30
  /** Selected filters count */
@@ -28,8 +35,8 @@ function ne(e, n) {
28
35
  toggleProductFilter: i
29
36
  };
30
37
  }
31
- function re() {
32
- const { loading: e, facets: n } = S((t) => ({
38
+ function ce() {
39
+ const { loading: e, facets: n } = v((t) => ({
33
40
  loading: t.loading,
34
41
  facets: t.response?.products?.facets ?? []
35
42
  }));
@@ -40,12 +47,12 @@ function re() {
40
47
  facets: n
41
48
  };
42
49
  }
43
- function C(e, n) {
50
+ function O(e, n) {
44
51
  const t = n - e;
45
52
  return !isNaN(t) && t > 0 ? new Array(n - e).fill(void 0).map((s, r) => r + e) : [];
46
53
  }
47
- function oe(e) {
48
- const { query: n, products: t } = S((s) => ({
54
+ function ue(e) {
55
+ const { query: n, products: t } = v((s) => ({
49
56
  query: s.query,
50
57
  products: s.response.products
51
58
  }));
@@ -65,8 +72,8 @@ function oe(e) {
65
72
  from: (w - 1) * t.size,
66
73
  page: w,
67
74
  current: w === i
68
- }), m = i > 1 ? f(i - 1) : void 0, p = i < l ? f(i + 1) : void 0, g = i - c - 1 > 1 ? f(1) : void 0, v = i + c + 1 < l ? f(l) : void 0, F = C(1, l + 1).filter(d).map(f);
69
- return !g && F[0]?.page === 2 && F.unshift(f(1)), !v && F[F.length - 1]?.page === l - 1 && F.push(f(l)), {
75
+ }), m = i > 1 ? f(i - 1) : void 0, p = i < l ? f(i + 1) : void 0, g = i - c - 1 > 1 ? f(1) : void 0, S = i + c + 1 < l ? f(l) : void 0, F = O(1, l + 1).filter(d).map(f);
76
+ return !g && F[0]?.page === 2 && F.unshift(f(1)), !S && F[F.length - 1]?.page === l - 1 && F.push(f(l)), {
70
77
  totalPages: l,
71
78
  resultsFrom: o,
72
79
  resultsTo: u,
@@ -74,15 +81,15 @@ function oe(e) {
74
81
  prev: m,
75
82
  next: p,
76
83
  first: g,
77
- last: v,
84
+ last: S,
78
85
  pages: F
79
86
  };
80
87
  }, [n, t, e?.width]);
81
88
  }
82
- function se() {
83
- const [e, n] = x([]), [t, s] = x([]);
84
- return X(() => {
85
- N(async (r) => {
89
+ function ae() {
90
+ const [e, n] = b([]), [t, s] = b([]);
91
+ return N(() => {
92
+ k(async (r) => {
86
93
  const { products: c, segments: i } = await r.getSearchSessionParams();
87
94
  n(i ?? []), s(c?.personalizationBoost ?? []);
88
95
  });
@@ -91,10 +98,10 @@ function se() {
91
98
  boost: t
92
99
  };
93
100
  }
94
- function O() {
95
- const { facets: e } = S((o) => ({
101
+ function q() {
102
+ const { facets: e } = v((o) => ({
96
103
  facets: o.response.products?.facets ?? []
97
- })), { replaceFilter: n, toggleProductFilter: t } = b(), s = h(
104
+ })), { replaceFilter: n, toggleProductFilter: t } = x(), s = h(
98
105
  (o) => {
99
106
  const u = e?.find((a) => a.type === "stats" && a.field === o);
100
107
  if (u && "min" in u && "max" in u)
@@ -145,14 +152,17 @@ function O() {
145
152
  toRangeFilter: d
146
153
  };
147
154
  }
148
- function k() {
149
- const { filter: e } = S((l) => ({
155
+ function j() {
156
+ const { filter: e } = v((l) => ({
150
157
  filter: l.query.products?.filter ?? []
151
- })), { updateSearch: n } = b(), { selectFilters: t, toValueFilter: s, toRangeFilter: r } = O(), c = y(() => e ? e.filter(t).flatMap((l) => "value" in l ? s(l) : "range" in l ? r(l) : []).filter(Boolean) : [], [e, t, r, s]), i = h(() => {
158
+ })), { updateSearch: n } = x(), { selectFilters: t, toValueFilter: s, toRangeFilter: r } = q(), c = y(() => e ? e.filter(t).flatMap((l) => "value" in l ? s(l) : "range" in l ? r(l) : []).filter(Boolean) : [], [e, t, r, s]), i = h(() => {
152
159
  n({
153
160
  products: {
154
161
  filter: []
155
162
  }
163
+ }), C({
164
+ event: "events/removeAllFilters",
165
+ params: null
156
166
  });
157
167
  }, [n]);
158
168
  return {
@@ -162,8 +172,8 @@ function k() {
162
172
  removeAll: i
163
173
  };
164
174
  }
165
- function q(e) {
166
- const { replaceFilter: n } = b(), { query: t, products: s } = S((a) => ({
175
+ function E(e) {
176
+ const { replaceFilter: n } = x(), { query: t, products: s } = v((a) => ({
167
177
  query: a.query,
168
178
  products: a.response.products
169
179
  })), r = s?.facets?.find((a) => a.id === e);
@@ -176,12 +186,12 @@ function q(e) {
176
186
  }
177
187
  };
178
188
  const c = t.products?.filter?.find((a) => a.field === r.field), i = c?.range ? c.range[0] : void 0, l = typeof i == "object" && ("gte" in i || "lte" in i) ? [R(i.gte), R(i.lte)] : [void 0, void 0], d = "min" in r ? Math.floor(r.min) : 0, o = "max" in r ? Math.ceil(r.max) : 0, u = ([a, f]) => {
179
- const m = a !== void 0 ? Math.floor(a) : void 0, p = f !== void 0 ? Math.ceil(f) : void 0, g = m !== void 0, v = p !== void 0;
180
- (d === m || !g) && (o === p || !v) ? n(r.field, void 0) : (d === m || !g) && v ? n(r.field, {
189
+ const m = a !== void 0 ? Math.floor(a) : void 0, p = f !== void 0 ? Math.ceil(f) : void 0, g = m !== void 0, S = p !== void 0;
190
+ (d === m || !g) && (o === p || !S) ? n(r.field, void 0) : (d === m || !g) && S ? n(r.field, {
181
191
  lte: p.toString()
182
- }) : (o === p || !v) && g ? n(r.field, {
192
+ }) : (o === p || !S) && g ? n(r.field, {
183
193
  gte: m.toString()
184
- }) : g && v && n(r.field, {
194
+ }) : g && S && n(r.field, {
185
195
  gte: m.toString(),
186
196
  lte: p.toString()
187
197
  });
@@ -197,8 +207,8 @@ function q(e) {
197
207
  updateRange: u
198
208
  };
199
209
  }
200
- function ie(e, n) {
201
- const { min: t, max: s, range: r, updateRange: c } = q(e), { filters: i } = k(), l = y(() => {
210
+ function le(e, n) {
211
+ const { min: t, max: s, range: r, updateRange: c } = E(e), { filters: i } = j(), l = y(() => {
202
212
  const a = i.find((g) => g?.filter?.range);
203
213
  let f = null;
204
214
  if (a) {
@@ -208,11 +218,11 @@ function ie(e, n) {
208
218
  const m = [];
209
219
  let p = Math.floor(t / n) * n;
210
220
  for (; p < s; ) {
211
- const g = p + n, v = f && f[0] === p && f[1] === g;
221
+ const g = p + n, S = f && f[0] === p && f[1] === g;
212
222
  m.push({
213
223
  min: p,
214
224
  max: g,
215
- selected: v
225
+ selected: S
216
226
  }), p = g;
217
227
  }
218
228
  return m;
@@ -240,8 +250,8 @@ function ie(e, n) {
240
250
  isSelected: u
241
251
  };
242
252
  }
243
- function ce() {
244
- const { products: e, keywords: n } = S((t) => t.response);
253
+ function de() {
254
+ const { products: e, keywords: n } = v((t) => t.response);
245
255
  return {
246
256
  /** Array of products */
247
257
  products: e ?? { hits: [], total: 0 },
@@ -249,18 +259,18 @@ function ce() {
249
259
  keywords: n ?? { hits: [], total: 0 }
250
260
  };
251
261
  }
252
- function ue() {
253
- const e = S((t) => t.query.products?.filter);
262
+ function fe() {
263
+ const e = v((t) => t.query.products?.filter);
254
264
  return y(() => e ? e.reduce((t, s) => t + (Array.isArray(s.value) ? s.value.length : 1), 0) : 0, [e]);
255
265
  }
256
- const j = 5 * 60 * 1e3, M = /* @__PURE__ */ new Map();
257
- function ae(e) {
258
- const [n, t] = x({
266
+ const D = 5 * 60 * 1e3, M = /* @__PURE__ */ new Map();
267
+ function ge(e) {
268
+ const [n, t] = b({
259
269
  product: null,
260
270
  loading: !0,
261
271
  error: null
262
272
  });
263
- return X(() => {
273
+ return N(() => {
264
274
  if (!e) {
265
275
  t({
266
276
  product: null,
@@ -274,7 +284,7 @@ function ae(e) {
274
284
  loading: !0,
275
285
  error: null
276
286
  }));
277
- const s = E(e);
287
+ const s = $(e);
278
288
  if (s) {
279
289
  t({
280
290
  product: s,
@@ -283,8 +293,8 @@ function ae(e) {
283
293
  });
284
294
  return;
285
295
  }
286
- D(e).then((r) => {
287
- V(e, r), t({
296
+ V(e).then((r) => {
297
+ B(e, r), t({
288
298
  product: r,
289
299
  loading: !1,
290
300
  error: null
@@ -298,17 +308,17 @@ function ae(e) {
298
308
  });
299
309
  }, [e]), n;
300
310
  }
301
- async function D(e) {
311
+ async function V(e) {
302
312
  const n = await fetch(`/products/${e}.js`);
303
313
  if (!n.ok)
304
314
  throw new Error(`Failed to fetch product: ${n.status} ${n.statusText}`);
305
315
  return n.json();
306
316
  }
307
- function E(e) {
317
+ function $(e) {
308
318
  const n = M.get(e);
309
- return n ? Date.now() - n.created > j ? (M.delete(e), null) : n.product : null;
319
+ return n ? Date.now() - n.created > D ? (M.delete(e), null) : n.product : null;
310
320
  }
311
- function V(e, n) {
321
+ function B(e, n) {
312
322
  M.set(e, {
313
323
  product: n,
314
324
  created: Date.now()
@@ -317,12 +327,12 @@ function V(e, n) {
317
327
  function L(e) {
318
328
  return e && !Number.isNaN(e) ? e : 0;
319
329
  }
320
- function le(e, n) {
321
- const { from: t, size: s, total: r } = S((o) => ({
330
+ function pe(e, n) {
331
+ const { from: t, size: s, total: r } = v((o) => ({
322
332
  from: L(o.query.products?.from ?? 0),
323
333
  size: L(o.response?.products?.size ?? n),
324
334
  total: L(o.response?.products?.total ?? 0)
325
- })), { updateSearch: c } = b(), i = t + s, l = y(() => [...e].reverse().filter((o) => o < r), [e, r]), d = h(
335
+ })), { updateSearch: c } = x(), i = t + s, l = y(() => [...e].reverse().filter((o) => o < r), [e, r]), d = h(
326
336
  (o) => {
327
337
  c({
328
338
  products: {
@@ -347,14 +357,14 @@ function le(e, n) {
347
357
  handleSizeChange: d
348
358
  };
349
359
  }
350
- function $(e, n) {
360
+ function U(e, n) {
351
361
  return e.length !== n.length ? !1 : e.every((t) => n.find((s) => t.field === s.field && t.order === s.order));
352
362
  }
353
- function de(e) {
354
- const n = S((c) => c.query), { updateSearch: t } = b();
363
+ function me(e) {
364
+ const n = v((c) => c.query), { updateSearch: t } = x();
355
365
  return {
356
366
  /** Active sort */
357
- activeSort: e.find((c) => $(c.value.sort, n.products?.sort || []))?.id ?? e[0]?.id,
367
+ activeSort: e.find((c) => U(c.value.sort, n.products?.sort || []))?.id ?? e[0]?.id,
358
368
  /** Set sort function */
359
369
  setSort: (c) => {
360
370
  const i = e.find((l) => l.id === c);
@@ -366,8 +376,8 @@ function de(e) {
366
376
  }
367
377
  };
368
378
  }
369
- const P = window.SpeechRecognition || window.webkitSpeechRecognition, B = !!(P && typeof P == "function");
370
- function U() {
379
+ const A = window.SpeechRecognition || window.webkitSpeechRecognition, _ = !!(A && typeof A == "function");
380
+ function I() {
371
381
  return {
372
382
  listening: !1,
373
383
  startListening: () => {
@@ -376,14 +386,14 @@ function U() {
376
386
  }
377
387
  };
378
388
  }
379
- function _({
389
+ function H({
380
390
  language: e = "en-US",
381
391
  interimResults: n = !1,
382
392
  onResult: t,
383
393
  onError: s
384
394
  } = {}) {
385
- const [r, c] = x(!1), i = A(null), l = h(() => {
386
- const o = new P();
395
+ const [r, c] = b(!1), i = z(null), l = h(() => {
396
+ const o = new A();
387
397
  o.lang = e, o.interimResults = n, o.onstart = () => c(!0), t && (o.onresult = (u) => {
388
398
  const { transcript: a } = u.results?.[0]?.[0];
389
399
  t(a);
@@ -397,8 +407,8 @@ function _({
397
407
  stopListening: d
398
408
  };
399
409
  }
400
- const fe = B ? _ : U;
401
- function I(e, n) {
410
+ const he = _ ? H : I;
411
+ function Z(e, n) {
402
412
  if (!e.length || !n.length) return [];
403
413
  const t = n.reduce((s, r) => (s[r] = {}, s), {});
404
414
  return e.forEach((s) => {
@@ -416,7 +426,7 @@ function I(e, n) {
416
426
  }))
417
427
  }));
418
428
  }
419
- function H(e, n) {
429
+ function G(e, n) {
420
430
  return e.length ? e.map(({ field: t, options: s }) => ({
421
431
  field: t,
422
432
  options: s.map((r) => {
@@ -429,24 +439,24 @@ function H(e, n) {
429
439
  })
430
440
  })) : [];
431
441
  }
432
- const T = ["4XS", "3XS", "2XS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "2XL", "XXXL", "3XL", "4XL"];
433
- function Z(e) {
434
- if (T.includes(e))
435
- return 1e3 + T.indexOf(e);
442
+ const P = ["4XS", "3XS", "2XS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "2XL", "XXXL", "3XL", "4XL"];
443
+ function J(e) {
444
+ if (P.includes(e))
445
+ return 1e3 + P.indexOf(e);
436
446
  const n = parseFloat(e);
437
447
  return isNaN(n) ? e : n;
438
448
  }
439
- function G(e, n) {
449
+ function K(e, n) {
440
450
  return [...n].sort((t, s) => {
441
- const [r, c] = [t.value, s.value].map(Z);
451
+ const [r, c] = [t.value, s.value].map(J);
442
452
  return r < c ? -1 : 1;
443
453
  });
444
454
  }
445
- function ge(e = [], n = []) {
446
- const [t, s] = x({}), r = y(() => I(e, n).map(({ field: o, options: u }) => ({
455
+ function ve(e = [], n = []) {
456
+ const [t, s] = b({}), r = y(() => Z(e, n).map(({ field: o, options: u }) => ({
447
457
  field: o,
448
- options: G(o, u)
449
- })), [e, n]), c = y(() => H(r, t), [r, t]), i = h((d, o) => {
458
+ options: K(o, u)
459
+ })), [e, n]), c = y(() => G(r, t), [r, t]), i = h((d, o) => {
450
460
  s((u) => {
451
461
  const a = { ...u };
452
462
  return a[d] === o ? delete a[d] : a[d] = o, a;
@@ -458,24 +468,24 @@ function ge(e = [], n = []) {
458
468
  return { swatches: c, toggleOption: i, matchedSkus: l };
459
469
  }
460
470
  export {
461
- B as speechToTextSupported,
462
- b as useActions,
463
- te as useDecoratedSearchResults,
464
- ne as useFacet,
465
- re as useFacets,
466
- ve as useHistory,
467
- he as useLoadMore,
468
- S as useNostoAppState,
469
- oe as usePagination,
470
- se as usePersonalization,
471
- k as useProductFilters,
472
- q as useRange,
473
- ie as useRangeSelector,
474
- ce as useResponse,
475
- ue as useSelectedFiltersCount,
476
- ae as useShopifyProduct,
477
- le as useSizeOptions,
478
- de as useSort,
479
- fe as useSpeechToText,
480
- ge as useSwatches
471
+ _ as speechToTextSupported,
472
+ x as useActions,
473
+ se as useDecoratedSearchResults,
474
+ ie as useFacet,
475
+ ce as useFacets,
476
+ be as useHistory,
477
+ Fe as useLoadMore,
478
+ v as useNostoAppState,
479
+ ue as usePagination,
480
+ ae as usePersonalization,
481
+ j as useProductFilters,
482
+ E as useRange,
483
+ le as useRangeSelector,
484
+ de as useResponse,
485
+ fe as useSelectedFiltersCount,
486
+ ge as useShopifyProduct,
487
+ pe as useSizeOptions,
488
+ me as useSort,
489
+ he as useSpeechToText,
490
+ ve as useSwatches
481
491
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosto/search-js",
3
- "version": "3.16.1",
3
+ "version": "3.17.1",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "files": [