@dropins/storefront-product-discovery 2.0.0-alpha001 → 2.0.0-alpha002
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.
- package/api/search/search.d.ts +1 -1
- package/chunks/search.js +2 -2
- package/chunks/search.js.map +1 -1
- package/components/ProductList/ProductList.d.ts +2 -0
- package/containers/SearchResults/SearchResults.d.ts +21 -11
- package/containers/SearchResults.js +1 -1
- package/containers/SearchResults.js.map +1 -1
- package/package.json +1 -1
package/api/search/search.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ import { ProductSearchResult, Scope, SearchVariables } from '../../data/models';
|
|
|
3
3
|
type SearchOptions = {
|
|
4
4
|
scope?: Scope;
|
|
5
5
|
};
|
|
6
|
-
export declare const search: (variables: SearchVariables, options?: SearchOptions) => Promise<ProductSearchResult>;
|
|
6
|
+
export declare const search: (variables: SearchVariables | null, options?: SearchOptions) => Promise<ProductSearchResult>;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=search.d.ts.map
|
package/chunks/search.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{Initializer as ie,merge as ee}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{ProductView as oe,Facet as se}from"../fragments.js";import{S as ue,P as
|
|
3
|
+
import{Initializer as ie,merge as ee}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{ProductView as oe,Facet as se}from"../fragments.js";import{S as ue,P as le,u as ce,b as me,d as te,e as pe}from"./acdlEvents.js";import{FetchGraphQL as ge}from"@dropins/tools/fetch-graphql.js";const re=new ie({init:async e=>{const r={};re.config.setConfig({...r,...e})},listeners:()=>[]}),ne=re.config,{setEndpoint:Ce,setFetchGraphQlHeader:xe,removeFetchGraphQlHeader:Se,setFetchGraphQlHeaders:ve,fetchGraphQl:fe,getConfig:$e}=new ge().getMethods(),he=e=>{var o,u,c,m,i,t,l,n,s,h,y,R,_,I,b,w,P,C,x,S,v,$,k,z,D,T,A,E,Q,U,F,G,K,q,H,M,O,V,L,N,Y,j,B,J,W,X,Z,g,a;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const r={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((o=e==null?void 0:e.images)==null?void 0:o.map(f=>{var d;return{label:f.label||"",roles:f.roles||[],url:((d=f.url)==null?void 0:d.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((m=(c=(u=e==null?void 0:e.price)==null?void 0:u.final)==null?void 0:c.amount)==null?void 0:m.value)||0,currency:((l=(t=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:t.amount)==null?void 0:l.currency)||""}},regular:{amount:{value:((h=(s=(n=e==null?void 0:e.price)==null?void 0:n.regular)==null?void 0:s.amount)==null?void 0:h.value)||0,currency:((_=(R=(y=e==null?void 0:e.price)==null?void 0:y.regular)==null?void 0:R.amount)==null?void 0:_.currency)||""}},roles:((I=e==null?void 0:e.price)==null?void 0:I.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((C=(P=(w=(b=e==null?void 0:e.priceRange)==null?void 0:b.minimum)==null?void 0:w.final)==null?void 0:P.amount)==null?void 0:C.value)||0,currency:(($=(v=(S=(x=e==null?void 0:e.priceRange)==null?void 0:x.minimum)==null?void 0:S.final)==null?void 0:v.amount)==null?void 0:$.currency)||""}},regular:{amount:{value:((T=(D=(z=(k=e==null?void 0:e.priceRange)==null?void 0:k.minimum)==null?void 0:z.regular)==null?void 0:D.amount)==null?void 0:T.value)||0,currency:((U=(Q=(E=(A=e==null?void 0:e.priceRange)==null?void 0:A.minimum)==null?void 0:E.regular)==null?void 0:Q.amount)==null?void 0:U.currency)||""}}},maximum:{final:{amount:{value:((q=(K=(G=(F=e==null?void 0:e.priceRange)==null?void 0:F.maximum)==null?void 0:G.final)==null?void 0:K.amount)==null?void 0:q.value)||0,currency:((V=(O=(M=(H=e==null?void 0:e.priceRange)==null?void 0:H.maximum)==null?void 0:M.final)==null?void 0:O.amount)==null?void 0:V.currency)||""}},regular:{amount:{value:((j=(Y=(N=(L=e==null?void 0:e.priceRange)==null?void 0:L.maximum)==null?void 0:N.regular)==null?void 0:Y.amount)==null?void 0:j.value)||0,currency:((X=(W=(J=(B=e==null?void 0:e.priceRange)==null?void 0:B.maximum)==null?void 0:J.regular)==null?void 0:W.amount)==null?void 0:X.currency)||""}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return ee(r,(a=(g=(Z=ne.getConfig().models)==null?void 0:Z.Product)==null?void 0:g.transformer)==null?void 0:a.call(g,e))};function ye(e){var u,c,m,i,t,l,n;const r=e==null?void 0:e.productSearch,o={facets:(r==null?void 0:r.facets)||[],items:(r==null?void 0:r.items.map(s=>he(s==null?void 0:s.productView)))||[],pageInfo:{currentPage:((u=r==null?void 0:r.page_info)==null?void 0:u.current_page)||1,totalPages:((c=r==null?void 0:r.page_info)==null?void 0:c.total_pages)||1,totalItems:((m=r==null?void 0:r.page_info)==null?void 0:m.total_items)||0,pageSize:((i=r==null?void 0:r.page_info)==null?void 0:i.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0};return ee(o,(n=(l=(t=ne.getConfig().models)==null?void 0:t.ProductSearchResult)==null?void 0:l.transformer)==null?void 0:n.call(l,e))}const Re=`
|
|
4
4
|
query productSearch(
|
|
5
5
|
$phrase: String!
|
|
6
6
|
$pageSize: Int
|
|
@@ -53,5 +53,5 @@ import{Initializer as ie,merge as ee}from"@dropins/tools/lib.js";import{events a
|
|
|
53
53
|
}
|
|
54
54
|
${oe}
|
|
55
55
|
${se}
|
|
56
|
-
`,ke=async(e,r={})=>{var
|
|
56
|
+
`,ke=async(e,r={})=>{var c,m;const o=r.scope==="search"?void 0:r.scope,u={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[]},metadata:{filterableAttributes:[],sortableAttributes:[]}};if(e===null)return p.emit("search/result",u,{scope:o}),u.result;p.emit("search/loading",!0,{scope:o});try{const i=o==="popover"?ue:le,t=window.crypto.randomUUID();ce(i,t,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),me(i);const{errors:l,data:n}=await fe(Re,{method:"GET",variables:{...e}});if(l&&!n)throw new Error("Error fetching product search");const s=ye(n);return te(i,t,s),pe(i),p.emit("search/result",{request:e,result:s,metadata:{filterableAttributes:((c=n==null?void 0:n.attributeMetadata)==null?void 0:c.filterableInSearch)||[],sortableAttributes:((m=n==null?void 0:n.attributeMetadata)==null?void 0:m.sortable)||[]}},{scope:o}),s}catch(i){throw p.emit("search/error",i.message,{scope:o}),p.emit("search/result",u,{scope:o}),i}finally{p.emit("search/loading",!1,{scope:o})}};export{xe as a,ve as b,ne as c,ke as d,fe as f,$e as g,re as i,Se as r,Ce as s};
|
|
57
57
|
//# sourceMappingURL=search.js.map
|
package/chunks/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/initialize/initialize.ts","/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Initializer, Model } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { ProductSearchResult } from '@/plp/data/models';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n\n models?: {\n Product?: Model<Product>\n ProductSearchResult?: Model<ProductSearchResult>\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\nexport function transformProductSearchResponse(data: any): ProductSearchResult {\n const productSearch = data?.productSearch;\n const transformedResponse: ProductSearchResult = {\n facets: productSearch?.facets || [],\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (variables: SearchVariables, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n // Update search input context in ACDL\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n variables.phrase || '',\n variables.filter || [],\n variables.pageSize || 0,\n variables.currentPage || 0,\n variables.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated variables\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...variables },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', {\n request: variables,\n result,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: data?.attributeMetadata?.sortable || []\n }\n }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', {\n request: variables,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: []\n },\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }, { scope });\n \n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["initialize","Initializer","config","defaultConfig","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","transformProductSearchResponse","productSearch","transformedResponse","product","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","variables","options","scope","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/initialize/initialize.ts","/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Initializer, Model } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { ProductSearchResult } from '@/plp/data/models';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n\n models?: {\n Product?: Model<Product>\n ProductSearchResult?: Model<ProductSearchResult>\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\nexport function transformProductSearchResponse(data: any): ProductSearchResult {\n const productSearch = data?.productSearch;\n const transformedResponse: ProductSearchResult = {\n facets: productSearch?.facets || [],\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (variables: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // empty result\n const emptyResult = {\n request: variables || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: []\n },\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n };\n\n // clear search results if no variables are provided\n if (variables === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n // Update search input context in ACDL\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n variables.phrase || '',\n variables.filter || [],\n variables.pageSize || 0,\n variables.currentPage || 0,\n variables.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated variables\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...variables },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', {\n request: variables,\n result,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: data?.attributeMetadata?.sortable || []\n }\n }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["initialize","Initializer","config","defaultConfig","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","transformProductSearchResponse","productSearch","transformedResponse","product","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","variables","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
2
|
import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ImageProps } from '@dropins/tools/types/elsie/src/components';
|
|
4
|
-
import { Scope } from '../../data/models';
|
|
4
|
+
import { Scope, SearchVariables } from '../../data/models';
|
|
5
5
|
import { Product } from '../../data/models/product';
|
|
6
6
|
|
|
7
|
+
type SlotDefaultContext = {
|
|
8
|
+
product: Product;
|
|
9
|
+
variables: SearchVariables | null;
|
|
10
|
+
};
|
|
7
11
|
export interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {
|
|
8
12
|
routeProduct?: (product: Product) => string;
|
|
9
13
|
scope?: Scope;
|
|
10
14
|
imageWidth?: number;
|
|
11
15
|
imageHeight?: number;
|
|
12
16
|
skeletonCount?: number;
|
|
17
|
+
onSearchResult?: (payload: Product[]) => void;
|
|
13
18
|
slots?: {
|
|
14
|
-
ProductActions?: SlotProps<
|
|
15
|
-
|
|
19
|
+
ProductActions?: SlotProps<SlotDefaultContext>;
|
|
20
|
+
ProductPrice?: SlotProps<SlotDefaultContext>;
|
|
21
|
+
ProductName?: SlotProps<SlotDefaultContext>;
|
|
22
|
+
ProductImage?: SlotProps<SlotDefaultContext & {
|
|
23
|
+
defaultImageProps: ImageProps;
|
|
16
24
|
}>;
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
NoResults?: SlotProps<{
|
|
26
|
+
error: string | null;
|
|
27
|
+
variables: SearchVariables | null;
|
|
19
28
|
}>;
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
Header?: SlotProps<{
|
|
30
|
+
products: Product[];
|
|
31
|
+
variables: SearchVariables | null;
|
|
22
32
|
}>;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
Footer?: SlotProps<{
|
|
34
|
+
products: Product[];
|
|
35
|
+
variables: SearchVariables | null;
|
|
26
36
|
}>;
|
|
27
|
-
NoResults?: SlotProps;
|
|
28
37
|
};
|
|
29
38
|
}
|
|
30
39
|
export declare const SearchResults: Container<SearchResultsProps>;
|
|
40
|
+
export {};
|
|
31
41
|
//# sourceMappingURL=SearchResults.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as
|
|
3
|
+
import{jsxs as Z,jsx as n}from"@dropins/tools/preact-jsx-runtime.js";import*as d from"@dropins/tools/preact-compat.js";import{useState as v,useEffect as q}from"@dropins/tools/preact-compat.js";import{VComponent as W,classes as G,Slot as g}from"@dropins/tools/lib.js";import{events as y}from"@dropins/tools/event-bus.js";import{InLineAlert as J,Icon as K,ProductItemCard as L,PriceRange as S,Image as Q}from"@dropins/tools/components.js";/* empty css */import{s as X,c as Y,a as $,S as ee,P as re}from"../chunks/acdlEvents.js";import{useText as ne}from"@dropins/tools/i18n.js";const E=a=>new DOMParser().parseFromString(a,"text/html").documentElement.textContent,R=({productList:a,header:o,footer:r,imageWidth:h,imageHeight:f})=>Z("div",{className:"product-discovery-product-list",style:{"--imageWidth":h,"--imageHeight":f},children:[o&&n("div",{className:"product-discovery-product-list__header",children:o}),n("div",{className:"product-discovery-product-list__grid",children:a&&n(W,{node:a})}),r&&n("div",{className:"product-discovery-product-list__footer",children:r})]}),te=a=>d.createElement("svg",{id:"Icon_Warning_Base",width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...a},d.createElement("g",{clipPath:"url(#clip0_841_1324)"},d.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),d.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})),d.createElement("defs",null,d.createElement("clipPath",{id:"clip0_841_1324"},d.createElement("rect",{width:24,height:21,fill:"white",transform:"translate(0 1.5)"})))),ae=({alertMessage:a=""})=>n("div",{className:G(["product-discovery-search-alert-message__wrapper"]),children:n("div",{className:"product-discovery-search-alert-message__content",children:n(J,{heading:a,type:"warning",icon:n(K,{source:te,size:"24"}),onDismiss:void 0})})}),he=({routeProduct:a,scope:o,slots:r,imageWidth:h=400,imageHeight:f=450,skeletonCount:A=8,onSearchResult:_})=>{const x=o==="popover"?ee:re,I=ne({noResults:"Search.PLP.Warning.noResults",searchError:"Search.PLP.Warning.searchError"}),[u,V]=v(null),[k,H]=v([]),[D,M]=v(!1),[P,N]=v(null);q(()=>{const e=y.on("search/loading",M,{eager:!0,scope:o}),t=y.on("search/error",()=>{N(I.searchError)},{eager:!0,scope:o}),i=y.on("search/result",c=>{var m,s,l;N(((m=c.result)==null?void 0:m.items.length)<1?I.noResults:null),V(c.request),H((s=c.result)==null?void 0:s.items),_==null||_((l=c.result)==null?void 0:l.items),c.request.phrase?X(x):Y(x)},{eager:!0,scope:o});return()=>{e==null||e.off(),t==null||t.off(),i==null||i.off()}},[]);const w=e=>{$(e.sku,x)},b=(e,t)=>{var s,l,p,C;const i={loading:t<8?"eager":"lazy",src:((l=(s=e.images)==null?void 0:s[0])==null?void 0:l.url)||"",alt:((C=(p=e.images)==null?void 0:p[0])==null?void 0:C.label)||"",width:h,height:f,params:{width:h}},c=e.name!==null?E(e.name):e.sku,m=n(Q,{class:"product-discovery-product-item__image",...i,"aria-label":c});return n(g,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e,defaultImageProps:i,variables:u},children:a?n("a",{href:a(e),onClick:()=>w(e),children:m}):m})},j=e=>{const t=e.name!==null?E(e.name):"";return n(g,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{product:e,variables:u},children:a?n("a",{href:a(e),onClick:()=>w(e),children:t}):t})},z=e=>{var c,m,s,l,p;let t=e.typename==="ComplexProductView"?(c=e.priceRange)==null?void 0:c.minimum.regular.amount.currency:(m=e.price)==null?void 0:m.regular.amount.currency;Intl.supportedValuesOf("currency").indexOf(t||"")===-1&&(t="USD");const i=e.typename==="ComplexProductView"?n(S,{display:"from to",minimumAmount:(s=e.priceRange)==null?void 0:s.minimum.regular.amount.value,maximumAmount:(l=e.priceRange)==null?void 0:l.maximum.regular.amount.value,currency:t}):n(S,{amount:(p=e.price)==null?void 0:p.regular.amount.value,currency:t});return n(g,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{product:e,variables:u},children:a?n("a",{href:a(e),onClick:()=>w(e),children:i}):i})},F=e=>n(g,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e,variables:u}}),U=()=>n(g,{name:"NoResults",slot:r==null?void 0:r.NoResults,context:{error:P,variables:u},children:P&&n(ae,{alertMessage:P})}),B=()=>n(R,{imageWidth:h,imageHeight:f,productList:Array.from({length:A}).map((e,t)=>n(L,{initialized:!1},t))}),O=()=>n(g,{name:"Header",slot:r==null?void 0:r.Header,context:{products:k,variables:u}}),T=()=>n(g,{name:"Footer",slot:r==null?void 0:r.Footer,context:{products:k,variables:u}});return n("div",{children:D?B():P?U():n(R,{header:O(),footer:T(),imageWidth:h,imageHeight:f,productList:k.map((e,t)=>n(L,{image:b(e,t),titleNode:j(e),price:z(e),actionButton:r!=null&&r.ProductActions?F(e):void 0,initialized:!0},e.id||e.sku||t))})})};export{he as SearchResults,he as default};
|
|
4
4
|
//# sourceMappingURL=SearchResults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchResults.js","sources":["/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SearchResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n imageWidth?: number;\n imageHeight?: number;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ productList, imageWidth, imageHeight }) => {\n return (\n <div className={'product-discovery-product-list'} style={{ '--imageWidth': imageWidth, '--imageHeight': imageHeight }}>\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ImageProps, Image, ProductItemCard, PriceRange } from '@adobe-commerce/elsie/components';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { Scope } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductList, SearchAlertMessage } from '@/plp/components'\nimport {\n searchProductClick,\n searchResultsView,\n categoryResultsView,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID\n} from '@/plp/utils/acdlEvents';\n\nexport interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (product: Product) => string;\n scope?: Scope;\n imageWidth?: number;\n imageHeight?: number;\n skeletonCount?: number;\n slots?: {\n ProductActions?: SlotProps<{ product: Product }>;\n ProductPrice?: SlotProps<{ product: Product }>;\n ProductName?: SlotProps<{ product: Product }>;\n ProductImage?: SlotProps<{ product: Product, defaultImageProps: ImageProps }>;\n NoResults?: SlotProps;\n },\n}\n\nexport const SearchResults: Container<SearchResultsProps> = ({\n routeProduct,\n scope,\n slots,\n imageWidth = 400,\n imageHeight = 450,\n skeletonCount = 8,\n}) => {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n\n const labels = useText({\n noResults: 'Search.PLP.Warning.noResults',\n searchError: 'Search.PLP.Warning.searchError',\n });\n\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadingEvent = events.on('search/loading', setLoading, { eager: true, scope });\n\n const errorEvent = events.on('search/error', () => {\n setError(labels.searchError!);\n }, { eager: true, scope });\n\n const searchEvent = events.on('search/result', (payload) => {\n setError(payload.result?.items.length < 1 ? labels.noResults! : null);\n\n setItems(payload.result?.items);\n\n // Publish search results view event to ACDL\n if (payload.request.phrase) {\n searchResultsView(acdlUnitId);\n } else {\n categoryResultsView(acdlUnitId);\n }\n }, { eager: true, scope });\n\n return () => {\n loadingEvent?.off();\n errorEvent?.off();\n searchEvent?.off();\n };\n }, []);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, acdlUnitId);\n };\n\n const renderProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: imageWidth,\n height: imageHeight,\n params: { width: imageWidth },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName} />\n );\n\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const renderProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const renderProductPriceSlot = (product: Product) => {\n let productCurrency =\n product.typename === 'ComplexProductView'\n ? product.priceRange?.minimum.regular.amount.currency\n : product.price?.regular.amount.currency;\n if (Intl.supportedValuesOf('currency').indexOf(productCurrency || '') === -1) {\n productCurrency = 'USD'; // Fallback to USD if the currency is not supported\n }\n const productPrice =\n product.typename === 'ComplexProductView' ? (\n <PriceRange\n display=\"from to\"\n minimumAmount={product.priceRange?.minimum.regular.amount.value}\n maximumAmount={product.priceRange?.maximum.regular.amount.value}\n currency={productCurrency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={productCurrency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productPrice}\n </a>\n ) : (\n productPrice\n )}\n </Slot>\n );\n };\n\n const renderActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product }} />;\n };\n\n const renderAlertSlot = () => {\n return <Slot name=\"NoResults\" slot={slots?.NoResults} context={{ error }}>\n {error && <SearchAlertMessage alertMessage={error} />}\n </Slot>;\n }\n\n const renderSkeleton = () => {\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={Array.from({ length: skeletonCount }).map((_, index) => (\n <ProductItemCard key={index} initialized={false} />\n ))}\n />\n }\n\n const renderResults = () => {\n if (error) return renderAlertSlot();\n\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={items.map((product, index) => (\n <ProductItemCard key={product.id || product.sku || index}\n image={renderProductImageSlot(product, index)}\n titleNode={renderProductNameSlot(product)}\n price={renderProductPriceSlot(product)}\n actionButton={slots?.ProductActions ? renderActionsSlot(product) : undefined}\n initialized\n />\n ))}\n />\n }\n\n return (\n <div>\n {loading ? renderSkeleton() : renderResults()}\n </div>\n );\n};\n"],"names":["htmlStringDecode","input","ProductList","productList","imageWidth","imageHeight","jsx","VComponent","SvgWarning","props","React","SearchAlertMessage","alertMessage","classes","InLineAlert","Icon","Warning","SearchResults","routeProduct","scope","slots","skeletonCount","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","labels","useText","items","setItems","useState","loading","setLoading","error","setError","useEffect","loadingEvent","events","errorEvent","searchEvent","payload","_a","_b","searchResultsView","categoryResultsView","handleProductClick","product","searchProductClick","renderProductImageSlot","index","defaultImageProps","_d","_c","productName","imageComponent","Image","Slot","renderProductNameSlot","renderProductPriceSlot","productCurrency","productPrice","PriceRange","_e","renderActionsSlot","renderAlertSlot","_","ProductItemCard"],"mappings":"mkBASA,MAAMA,EAAoBC,GACZ,IAAI,UAAA,EAAY,gBAAgBA,EAAO,WAAW,EACnD,gBAAgB,YCShBC,EAAmD,CAAC,CAAE,YAAAC,EAAa,WAAAC,EAAY,YAAAC,KAExFC,EAAC,OAAI,UAAW,iCAAkC,MAAO,CAAE,eAAgBF,EAAY,gBAAiBC,CAAA,EACtG,SAAAC,EAAC,MAAA,CAAI,UAAU,uCAAwC,SAAAH,KAAgBI,EAAA,CAAW,KAAMJ,EAAa,CAAA,CAAG,CAAA,CAC1G,ECvBEK,EAAcC,GAA0BC,EAAM,cAAc,MAAO,CAAE,GAAI,oBAAqB,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,EAAM,cAAc,IAAK,CAAE,SAAU,wBAA0CA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,6DAA8D,OAAQ,eAAgB,cAAe,QAAS,eAAgB,OAAO,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,qIAAsI,OAAQ,eAAgB,cAAe,QAAS,eAAgB,OAAO,CAAE,CAAC,EAAmBA,EAAM,cAAc,OAAQ,KAAsBA,EAAM,cAAc,WAAY,CAAE,GAAI,gBAAgB,EAAoBA,EAAM,cAAc,OAAQ,CAAE,MAAO,GAAI,OAAQ,GAAI,KAAM,QAAS,UAAW,mBAAoB,CAAC,CAAC,CAAC,ECmB3gCC,EAAiE,CAAC,CAAE,aAAAC,EAAe,MAE5FN,EAAC,MAAA,CAAI,UAAWO,EAAQ,CAAC,iDAAiD,CAAC,EACzE,SAAAP,EAAC,MAAA,CAAI,UAAU,kDACb,SAAAA,EAACQ,EAAA,CACC,QAASF,EACT,KAAM,UACN,KAAMN,EAACS,EAAA,CAAK,OAAQC,EAAS,KAAK,KAAK,EACvC,UAAW,MAAA,CAAA,EAEf,CAAA,CACF,ECUSC,GAA+C,CAAC,CAC3D,aAAAC,EACA,MAAAC,EACA,MAAAC,EACA,WAAAhB,EAAa,IACb,YAAAC,EAAc,IACd,cAAAgB,EAAgB,CAClB,IAAM,CACJ,MAAMC,EAAaH,IAAU,UAAYI,EAAiBC,EAEpDC,EAASC,EAAQ,CACrB,UAAW,+BACX,YAAa,gCAAA,CACd,EAEK,CAACC,EAAOC,CAAQ,EAAIC,EAAgB,CAAA,CAAE,EACtC,CAACC,EAASC,CAAU,EAAIF,EAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAwB,IAAI,EAEtDK,EAAU,IAAM,CACd,MAAMC,EAAeC,EAAO,GAAG,iBAAkBL,EAAY,CAAE,MAAO,GAAM,MAAAZ,EAAO,EAE7EkB,EAAaD,EAAO,GAAG,eAAgB,IAAM,CACjDH,EAASR,EAAO,WAAY,CAC9B,EAAG,CAAE,MAAO,GAAM,MAAAN,EAAO,EAEnBmB,EAAcF,EAAO,GAAG,gBAAkBG,GAAY,SAC1DN,IAASO,EAAAD,EAAQ,SAAR,YAAAC,EAAgB,MAAM,QAAS,EAAIf,EAAO,UAAa,IAAI,EAEpEG,GAASa,EAAAF,EAAQ,SAAR,YAAAE,EAAgB,KAAK,EAG1BF,EAAQ,QAAQ,OAClBG,EAAkBpB,CAAU,EAE5BqB,EAAoBrB,CAAU,CAElC,EAAG,CAAE,MAAO,GAAM,MAAAH,EAAO,EAEzB,MAAO,IAAM,CACXgB,GAAA,MAAAA,EAAc,MACdE,GAAA,MAAAA,EAAY,MACZC,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMM,EAAsBC,GAA2B,CACrDC,EAAmBD,EAAQ,IAAKvB,CAAU,CAC5C,EAEMyB,EAAyB,CAACF,EAAkBG,IAAkB,aAClE,MAAMC,EAAgC,CACpC,QAASD,EAAQ,EAAI,QAAU,OAC/B,MAAKP,GAAAD,EAAAK,EAAQ,SAAR,YAAAL,EAAiB,KAAjB,YAAAC,EAAqB,MAAO,GACjC,MAAKS,GAAAC,EAAAN,EAAQ,SAAR,YAAAM,EAAiB,KAAjB,YAAAD,EAAqB,QAAS,GACnC,MAAO9C,EACP,OAAQC,EACR,OAAQ,CAAE,MAAOD,CAAA,CAAW,EAExBgD,EAAcP,EAAQ,OAAS,KAAO7C,EAAiB6C,EAAQ,IAAI,EAAIA,EAAQ,IAC/EQ,IACHC,EAAA,CAAM,MAAM,wCAAyC,GAAGL,EAAmB,aAAYG,EAAa,EAGvG,OACE9C,EAACiD,EAAA,CAAK,KAAK,eAAe,KAAMnC,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,QAAAyB,EAAS,kBAAAI,CAAA,EACtE,SAAA/B,IACE,IAAA,CAAE,KAAMA,EAAa2B,CAAO,EAAG,QAAS,IAAMD,EAAmBC,CAAO,EACtE,SAAAQ,CAAA,CACH,EAEAA,CAAA,CAEJ,CAEJ,EAEMG,EAAyBX,GAAqB,CAClD,MAAMO,EAAcP,EAAQ,OAAS,KAAO7C,EAAiB6C,EAAQ,IAAI,EAAI,GAC7E,OACEvC,EAACiD,EAAA,CAAK,KAAK,cAAc,KAAMnC,GAAA,YAAAA,EAAO,YAAa,QAAS,CAAE,QAAAyB,CAAA,EAC3D,SAAA3B,IACE,IAAA,CAAE,KAAMA,EAAa2B,CAAO,EAAG,QAAS,IAAMD,EAAmBC,CAAO,EACtE,SAAAO,CAAA,CACH,EAEAA,CAAA,CAEJ,CAEJ,EAEMK,EAA0BZ,GAAqB,eACnD,IAAIa,EACFb,EAAQ,WAAa,sBACjBL,EAAAK,EAAQ,aAAR,YAAAL,EAAoB,QAAQ,QAAQ,OAAO,UAC3CC,EAAAI,EAAQ,QAAR,YAAAJ,EAAe,QAAQ,OAAO,SAChC,KAAK,kBAAkB,UAAU,EAAE,QAAQiB,GAAmB,EAAE,IAAM,KACxEA,EAAkB,OAEpB,MAAMC,EACJd,EAAQ,WAAa,qBACnBvC,EAACsD,EAAA,CACC,QAAQ,UACR,eAAeT,EAAAN,EAAQ,aAAR,YAAAM,EAAoB,QAAQ,QAAQ,OAAO,MAC1D,eAAeD,EAAAL,EAAQ,aAAR,YAAAK,EAAoB,QAAQ,QAAQ,OAAO,MAC1D,SAAUQ,CAAA,CAAA,EAGZpD,EAACsD,EAAA,CAAW,QAAQC,EAAAhB,EAAQ,QAAR,YAAAgB,EAAe,QAAQ,OAAO,MAAO,SAAUH,CAAA,CAAiB,EAExF,OACEpD,EAACiD,EAAA,CAAK,KAAK,eAAe,KAAMnC,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,QAAAyB,CAAA,EAC7D,SAAA3B,IACE,IAAA,CAAE,KAAMA,EAAa2B,CAAO,EAAG,QAAS,IAAMD,EAAmBC,CAAO,EACtE,SAAAc,CAAA,CACH,EAEAA,CAAA,CAEJ,CAEJ,EAEMG,EAAqBjB,GAClBvC,EAACiD,EAAA,CAAK,KAAK,iBAAiB,KAAMnC,GAAA,YAAAA,EAAO,eAAgB,QAAS,CAAE,QAAAyB,CAAA,CAAQ,CAAG,EAGlFkB,EAAkB,MACdR,EAAA,CAAK,KAAK,YAAY,KAAMnC,GAAA,YAAAA,EAAO,UAAW,QAAS,CAAE,MAAAY,GAC9D,SAAAA,GAAS1B,EAACK,EAAA,CAAmB,aAAcqB,EAAO,EACrD,EA+BF,SACG,MAAA,CACE,SAAAF,EA7BIxB,EAACJ,EAAA,CACN,WAAAE,EACA,YAAAC,EACA,YAAa,MAAM,KAAK,CAAE,OAAQgB,EAAe,EAAE,IAAI,CAAC2C,EAAGhB,IACzD1C,EAAC2D,GAA4B,YAAa,EAAA,EAApBjB,CAA2B,CAClD,CAAA,CAAA,EAKChB,EAAc+B,EAAA,EAEXzD,EAACJ,EAAA,CACN,WAAAE,EACA,YAAAC,EACA,YAAasB,EAAM,IAAI,CAACkB,EAASG,IAC/B1C,EAAC2D,EAAA,CACC,MAAOlB,EAAuBF,EAASG,CAAK,EAC5C,UAAWQ,EAAsBX,CAAO,EACxC,MAAOY,EAAuBZ,CAAO,EACrC,aAAczB,GAAA,MAAAA,EAAO,eAAiB0C,EAAkBjB,CAAO,EAAI,OACnE,YAAW,EAAA,EALSA,EAAQ,IAAMA,EAAQ,KAAOG,CAAA,CAOpD,CAAA,CAAA,EAOH,CAEJ","x_google_ignoreList":[2]}
|
|
1
|
+
{"version":3,"file":"SearchResults.js","sources":["/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SearchResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n header?: VNode;\n footer?: VNode;\n imageWidth?: number;\n imageHeight?: number;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ productList, header, footer, imageWidth, imageHeight }) => {\n return (\n <div className={'product-discovery-product-list'} style={{ '--imageWidth': imageWidth, '--imageHeight': imageHeight }}>\n {header && <div className=\"product-discovery-product-list__header\">{header}</div>}\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <div className=\"product-discovery-product-list__footer\">{footer}</div>}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ImageProps, Image, ProductItemCard, PriceRange } from '@adobe-commerce/elsie/components';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { Scope, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductList, SearchAlertMessage } from '@/plp/components'\nimport {\n searchProductClick,\n searchResultsView,\n categoryResultsView,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID\n} from '@/plp/utils/acdlEvents';\n\ntype SlotDefaultContext = {\n product: Product;\n variables: SearchVariables | null;\n}\n\nexport interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (product: Product) => string;\n scope?: Scope;\n imageWidth?: number;\n imageHeight?: number;\n skeletonCount?: number;\n onSearchResult?: (payload: Product[]) => void;\n slots?: {\n ProductActions?: SlotProps<SlotDefaultContext>;\n ProductPrice?: SlotProps<SlotDefaultContext>;\n ProductName?: SlotProps<SlotDefaultContext>;\n ProductImage?: SlotProps<SlotDefaultContext & { defaultImageProps: ImageProps }>;\n NoResults?: SlotProps<{ error: string | null; variables: SearchVariables | null }>;\n Header?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n Footer?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n },\n}\n\nexport const SearchResults: Container<SearchResultsProps> = ({\n routeProduct,\n scope,\n slots,\n imageWidth = 400,\n imageHeight = 450,\n skeletonCount = 8,\n onSearchResult,\n}) => {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n\n const labels = useText({\n noResults: 'Search.PLP.Warning.noResults',\n searchError: 'Search.PLP.Warning.searchError',\n });\n\n const [variables, setVariables] = useState<SearchVariables | null>(null);\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadingEvent = events.on('search/loading', setLoading, { eager: true, scope });\n\n const errorEvent = events.on('search/error', () => {\n setError(labels.searchError!);\n }, { eager: true, scope });\n\n const searchEvent = events.on('search/result', (payload) => {\n setError(payload.result?.items.length < 1 ? labels.noResults! : null);\n\n setVariables(payload.request);\n setItems(payload.result?.items);\n onSearchResult?.(payload.result?.items);\n\n // Publish search results view event to ACDL\n if (payload.request.phrase) {\n searchResultsView(acdlUnitId);\n } else {\n categoryResultsView(acdlUnitId);\n }\n }, { eager: true, scope });\n\n return () => {\n loadingEvent?.off();\n errorEvent?.off();\n searchEvent?.off();\n };\n }, []);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, acdlUnitId);\n };\n\n const renderProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: imageWidth,\n height: imageHeight,\n params: { width: imageWidth },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName} />\n );\n\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const renderProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const renderProductPriceSlot = (product: Product) => {\n let productCurrency =\n product.typename === 'ComplexProductView'\n ? product.priceRange?.minimum.regular.amount.currency\n : product.price?.regular.amount.currency;\n if (Intl.supportedValuesOf('currency').indexOf(productCurrency || '') === -1) {\n productCurrency = 'USD'; // Fallback to USD if the currency is not supported\n }\n const productPrice =\n product.typename === 'ComplexProductView' ? (\n <PriceRange\n display=\"from to\"\n minimumAmount={product.priceRange?.minimum.regular.amount.value}\n maximumAmount={product.priceRange?.maximum.regular.amount.value}\n currency={productCurrency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={productCurrency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productPrice}\n </a>\n ) : (\n productPrice\n )}\n </Slot>\n );\n };\n\n const renderActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product, variables }} />;\n };\n\n const renderAlertSlot = () => {\n return <Slot name=\"NoResults\" slot={slots?.NoResults} context={{ error, variables }}>\n {error && <SearchAlertMessage alertMessage={error} />}\n </Slot>;\n }\n\n const renderSkeleton = () => {\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={Array.from({ length: skeletonCount }).map((_, index) => (\n <ProductItemCard key={index} initialized={false} />\n ))}\n />\n }\n\n const renderHeader = () => {\n return <Slot name=\"Header\" slot={slots?.Header} context={{ products: items, variables }} />;\n }\n\n const renderFooter = () => {\n return <Slot name=\"Footer\" slot={slots?.Footer} context={{ products: items, variables }} />;\n }\n\n const renderResults = () => {\n if (error) return renderAlertSlot();\n\n return <ProductList\n header={renderHeader()}\n footer={renderFooter()}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={items.map((product, index) => (\n <ProductItemCard key={product.id || product.sku || index}\n image={renderProductImageSlot(product, index)}\n titleNode={renderProductNameSlot(product)}\n price={renderProductPriceSlot(product)}\n actionButton={slots?.ProductActions ? renderActionsSlot(product) : undefined}\n initialized\n />\n ))}\n />\n }\n\n return (\n <div>\n {loading ? renderSkeleton() : renderResults()}\n </div>\n );\n};\n"],"names":["htmlStringDecode","input","ProductList","productList","header","footer","imageWidth","imageHeight","jsxs","jsx","VComponent","SvgWarning","props","React","SearchAlertMessage","alertMessage","classes","InLineAlert","Icon","Warning","SearchResults","routeProduct","scope","slots","skeletonCount","onSearchResult","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","labels","useText","variables","setVariables","useState","items","setItems","loading","setLoading","error","setError","useEffect","loadingEvent","events","errorEvent","searchEvent","payload","_a","_b","_c","searchResultsView","categoryResultsView","handleProductClick","product","searchProductClick","renderProductImageSlot","index","defaultImageProps","_d","productName","imageComponent","Image","Slot","renderProductNameSlot","renderProductPriceSlot","productCurrency","productPrice","PriceRange","_e","renderActionsSlot","renderAlertSlot","renderSkeleton","_","ProductItemCard","renderHeader","renderFooter"],"mappings":"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","x_google_ignoreList":[2]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "2.0.0-
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "2.0.0-alpha002", "@dropins/tools": "1.4.1-alpha007", "license": "SEE LICENSE IN LICENSE.md"}
|