PageSourceSearch

https://holbornassets.com/441de47dd0b805336b60367f4129553aa8265d06-24a549e5b77b1ffd3048.js

js holbornassets.com collected 2026-09-24 12:39:56 UTC 14,029 bytes, 2 lines download raw bytes

1"use strict";(self.webpackChunkholborn_assets=self.webpackChunkholborn_assets||[]).push([[5503],{12510:function(e,t,a){a.r(t),a.d(t,{default:function(){return b}});var r=a(96540),l=a(40961),n=a(52922);var s=a(85833);function o(e){let{children:t}=e;return"undefined"==typeof document?null:l.createPortal(t,document.body)}function i(){return r.createElement("div",{className:"h-8 w-auto flex justify-start"},r.createElement("img",{src:s.A,alt:"Trustpilot logo",className:"h-full w-auto object-contain"}))}function c(e){let{stars:t,width:a=120}=e;const l=Math.max(1,Math.min(5,Number(t)||0)),n=`https://cdn.trustpilot.net/brand-assets/4.1.0/stars/stars-${l}.svg`;return r.createElement("img",{src:n,alt:`${l} out of 5 stars`,width:a,height:24,loading:"lazy",decoding:"async",style:{maxWidth:`${a}px`,width:"100%",border:"none"}})}function u(e){var t,a;let{r:l}=e;const n=(null==l||null===(t=l.consumer)||void 0===t?void 0:t.displayName)||(null==l?void 0:l.author)||"Anonymous",s=function(e){if(!e)return"";try{return new Date(e).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}catch{return""}}(null==l?void 0:l.createdAt),{0:o,1:i}=(0,r.useState)(!1);return r.createElement("div",{className:"border border-gray-200 rounded-xl p-4 bg-white"},r.createElement("div",{className:"flex items-start justify-between gap-3"},r.createElement("div",{className:"min-w-0"},r.createElement("div",{className:"flex items-center gap-3"},r.createElement("div",{className:"mt-0 flex items-center"},r.createElement(c,{stars:null==l?void 0:l.stars,width:120})),r.createElement("div",{className:"text-sm text-gray-500"},s)),r.createElement("div",{className:"mt-2 flex items-center gap-2"},r.createElement("div",{className:"font-semibold text-[#111] truncate"},n),null!=l&&l.isVerified?r.createElement("span",{className:"text-xs px-2 py-0.5 rounded bg-gray-100 text-gray-700"},"Verified"):null))),null!=l&&l.title?r.createElement("div",{className:"mt-3 font-semibold text-[#111]"},l.title):null,null!=l&&l.text?r.createElement("div",{className:"mt-2 text-sm text-gray-800 whitespace-pre-line"},l.text):null,null!=l&&null!==(a=l.companyReply)&&void 0!==a&&a.text?r.createElement("div",{className:"mt-4"},o?r.createElement("div",{className:"mt-3 border-l-4 border-[#00B67A] bg-gray-50 rounded-r p-3"},r.createElement("div",{className:"text-sm font-semibold text-[#111]"},"Reply from Holborn Assets"),r.createElement("div",{className:"mt-1 text-sm text-gray-800 whitespace-pre-line"},l.companyReply.text),r.createElement("button",{type:"button",onClick:()=>i(!1),className:"mt-3 text-sm font-semibold underline decoration-[#B5B5B5] text-[#111] hover:opacity-80"},"Hide reply")):r.createElement("button",{type:"button",onClick:()=>i(!0),className:"text-sm font-semibold underline decoration-[#B5B5B5] text-[#111] hover:opacity-80"},"Show company reply")):null)}function d(e){let{page:t,total:a,pageSize:l,onPrev:n,onNext:s}=e;const o=Math.max(1,Math.ceil((a||0)/(l||20))),i=t>1,c=t<o;return r.createElement("div",{className:"mt-6 flex items-center justify-between gap-3"},r.createElement("button",{type:"button",disabled:!i,onClick:n,className:"px-3 py-2 rounded-lg border text-sm "+(i?"border-gray-300 hover:bg-gray-50":"border-gray-200 text-gray-400 cursor-not-allowed")},"Previous"),r.createElement("div",{className:"text-sm text-gray-700"},"Page ",r.createElement("span",{className:"font-semibold"},t)," of"," ",r.createElement("span",{className:"font-semibold"},o)),r.createElement("button",{type:"button",disabled:!c,onClick:s,className:"px-3 py-2 rounded-lg border text-sm "+(c?"border-gray-300 hover:bg-gray-50":"border-gray-200 text-gray-400 cursor-not-allowed")},"Next"))}const m="trustpilot_mini_stats_debug_v1",g="tp_reviews_page1_cache_v1",f=6e5;function p(e,t){const a=e||{};return`${null!=t?t:Number(a.page||1)}|${Number(a.pageSize||20)}|${a.sort||"createdAt.desc"}|${a.stars||""}|${a.verified||""}|${a.hasReply||""}|${a.language||""}|${a.q||""}`}const v=r.memo(function(e){let{trustScoreText:t,ratingBreakdown:a}=e;return r.createElement("div",{className:"border-b lg:border-b-0 lg:border-r border-gray-200 p-5 lg:overflow-auto min-h-0"},r.createElement(i,null),r.createElement("div",{className:"mt-2 flex items-center gap-3"},r.createElement("img",{src:"https://emailsignature.trustpilot.com/signature/en-US/1/58bff1ac0000ff00059e0e97/stars.png",border:"0",width:"128",height:"24",style:{maxWidth:"200px",width:"100%",border:"none"},alt:"Trustpilot Stars"}),r.createElement("div",{className:"text-[18px] font-extrabold text-[#111]"},t)),r.createElement("div",{className:"mt-6"},r.createElement("div",{className:"text-sm font-semibold text-[#111]"},"Rating breakdown"),r.createElement("div",{className:"mt-3 space-y-2"},a.map(e=>r.createElement("div",{key:e.stars,className:"flex items-center gap-2"},r.createElement("div",{className:"w-10 text-xs text-gray-700"},e.stars,"★"),r.createElement("div",{className:"flex-1 h-2 rounded bg-gray-100 overflow-hidden"},r.createElement("div",{className:"h-2 bg-[#00B67A]",style:{width:`${e.pct}%`}})),r.createElement("div",{className:"w-12 text-right text-xs text-gray-600"}
1,e.count.toLocaleString()))))))});function b(e){var t,a;let{isOpen:l,onClose:s}=e;const{loading:i,error:c,data:b,query:y,setQuery:h}=function(e){void 0===e&&(e={});const{0:t,1:a}=(0,r.useState)({page:1,pageSize:20,sort:"createdAt.desc",stars:"",q:"",hasReply:"",verified:"",...e}),{0:l,1:s}=(0,r.useState)({loading:!0,error:null,data:null}),o=(0,r.useMemo)(()=>{const e=new URLSearchParams;return Object.entries(t).forEach(t=>{let[a,r]=t;""!==r&&null!=r&&e.set(a,String(r))}),e.toString()},[t]);return(0,r.useEffect)(()=>{let e=!1;return(async()=>{s({loading:!0,error:null,data:null});try{const t=`${(0,n.T)()}/.netlify/functions/trustpilot-reviews?${o}`,a=await fetch(t,{cache:"default"}),r=await a.json().catch(()=>null);if(!a.ok||null==r||!r.ok)throw new Error((null==r?void 0:r.message)||`Failed to load Trustpilot reviews (${a.status})`);e||s({loading:!1,error:null,data:r})}catch(t){e||s({loading:!1,error:(null==t?void 0:t.message)||"Failed to load Trustpilot reviews",data:null})}})(),()=>{e=!0}},[o]),{query:t,setQuery:a,...l}}(),w=(0,r.useRef)(null),x=(0,r.useCallback)(()=>null==s?void 0:s(),[s]);(0,r.useEffect)(()=>{if(!l)return;if("undefined"==typeof document)return;const e=document.body.style.overflow;document.body.style.overflow="hidden";const t=e=>{"Escape"===e.key&&x()};return window.addEventListener("keydown",t),()=>{document.body.style.overflow=e,window.removeEventListener("keydown",t)}},[l,x]),(0,r.useEffect)(()=>{l&&h(e=>!(1!==(e.page||1)||20!==(e.pageSize||20)||"createdAt.desc"!==(e.sort||"createdAt.desc")||e.stars||e.verified||e.hasReply||e.language||e.q)?e:{...e,page:1,pageSize:20,sort:"createdAt.desc",stars:"",verified:"",hasReply:"",language:"",q:""})},[l,h]);const{0:N,1:E}=(0,r.useState)(()=>{if("undefined"==typeof window)return{score:null,total:null};try{const e=window.localStorage.getItem(m);if(!e)return{score:null,total:null};const t=JSON.parse(e);return{score:"number"==typeof(null==t?void 0:t.score)?t.score:null,total:"number"==typeof(null==t?void 0:t.total)?t.total:null}}catch{return{score:null,total:null}}});(0,r.useEffect)(()=>{if(!l)return;let e=!1;return async function(){if(null!=N.score||null!=N.total)return;const t=`${(0,n.T)()}/.netlify/functions/trustpilot-stats`;try{const a=await fetch(t,{cache:"default"}),r=await a.json().catch(()=>null);if(!a.ok||null==r||!r.ok)return;const l=""===(null==r?void 0:r.trustScore)||null==(null==r?void 0:r.trustScore)?null:Number(r.trustScore),n=""===(null==r?void 0:r.totalReviews)||null==(null==r?void 0:r.totalReviews)?null:Number(r.totalReviews),s=Number.isFinite(l)&&l>0&&l<=5?l:null,o=Number.isFinite(n)&&n>=0?n:null;if(e)return;const i={score:s,total:o};E(i),"undefined"!=typeof window&&window.localStorage.setItem(m,JSON.stringify(i))}catch{}}(),()=>{e=!0}},[l]);const S=(0,r.useRef)(new Map),{0:k,1:$}=(0,r.useState)(null),{0:A,1:R}=(0,r.useState)(null);(0,r.useEffect)(()=>{if(l&&"undefined"!=typeof window)try{var e,t,a;const r=window.localStorage.getItem(g);if(!r)return;const l=JSON.parse(r);if(null==l||!l.t||Date.now()-l.t>f)return;if(1!==(null==l||null===(e=l.payload)||void 0===e?void 0:e.page))return;if(!Array.isArray(null==l||null===(t=l.payload)||void 0===t?void 0:t.reviews))return;$(l.payload),null!=l&&null!==(a=l.payload)&&void 0!==a&&a.facets&&R(e=>e||l.payload.facets)}catch{}},[l]),(0,r.useEffect)(()=>{if(null==b||!b.reviews||!Array.isArray(b.reviews))return;const e=p(y,b.page);if(S.current.set(e,b),1===Number(b.page))try{"undefined"!=typeof window&&window.localStorage.setItem(g,JSON.stringify({t:Date.now(),payload:b}))}catch{}(null==k?void 0:k.page)===b.page&&$(null)},[b,y,k]),(0,r.useEffect)(()=>{if(!l)return;if(!(1===Number((null==b?void 0:b.page)||0)||1===Number((null==y?void 0:y.page)||1)))return;const e=(null==b?void 0:b.facets)||(null==k?void 0:k.facets)||null;e&&R(t=>t||e)},[l,y,b,k]),(0,r.useEffect)(()=>{if(!l)return;if(null==b||!b.page||null==b||!b.total||null==b||!b.pageSize)return;const e=Math.max(1,Math.ceil(b.total/b.pageSize)),t=b.page+1;if(t>e)return;const a=p(y,t);if(S.current.has(a))return;let r=!1;const s=new AbortController;return async function(){try{const e=function(e,t){const a=(0,n.T)(),r=new 
1URL(`${a}/.netlify/functions/trustpilot-reviews`,"undefined"!=typeof window?window.location.origin:"http://localhost"),l=e||{},s={page:String(null!=t?t:l.page||1),pageSize:String(l.pageSize||20),sort:l.sort||"createdAt.desc",stars:l.stars||"",verified:l.verified||"",hasReply:l.hasReply||"",language:l.language||"",q:l.q||""};return Object.entries(s).forEach(e=>{let[t,a]=e;""!==a&&null!=a&&r.searchParams.set(t,String(a))}),`${a}${r.pathname}${r.search}`}(y,t),l=await fetch(e,{signal:s.signal,cache:"default"});if(!l.ok)return;const o=await l.json().catch(()=>null);if(null==o||!o.ok)return;if(r)return;S.current.set(a,o)}catch{}}(),()=>{r=!0,s.abort()}},[l,b,y]);const z=(0,r.useMemo)(()=>{if(!k)return b;const e=Number((null==y?void 0:y.page)||1);return Number(null==k?void 0:k.page)===e?k:b},[b,k,y]),M=(0,r.useMemo)(()=>null==N.score?"—":Number(N.score).toFixed(1),[N.score]),T=(0,r.useMemo)(()=>{const e=(null==A?void 0:A.byStars)||{},t=Number((null==A?void 0:A.total)||0);return[5,4,3,2,1].map(a=>{var r,l;const n=Number(null!==(r=null!==(l=e[String(a)])&&void 0!==l?l:e[a])&&void 0!==r?r:0);return{stars:a,count:n,pct:t>0?Math.round(n/t*100):0}})},[A]),j=(null==z?void 0:z.reviews)||[],C=Number((null==z?void 0:z.total)||0),_=null!=N.total&&Number.isFinite(N.total)?Number(N.total):C,q=Number((null==z?void 0:z.page)||y.page||1),B=Number((null==z?void 0:z.pageSize)||y.pageSize||20),F=0===C?0:(q-1)*B+1,L=Math.min(C,(q-1)*B+j.length);return l?r.createElement(o,null,r.createElement("div",{className:"fixed inset-0 z-[2147483647]",role:"dialog","aria-modal":"true","aria-label":"Trustpilot reviews"},r.createElement("div",{className:"absolute inset-0 bg-black/60",onMouseDown:e=>{e.target===e.currentTarget&&x()}}),r.createElement("div",{className:"absolute inset-0 flex items-center justify-center p-3"},r.createElement("div",{className:"relative w-[min(1240px,calc(100vw-24px))] h-[min(88vh,920px)] overflow-hidden rounded-2xl bg-white shadow-2xl",onMouseDown:e=>e.stopPropagation()},r.createElement("div",{className:"flex items-start justify-between gap-4 p-5 border-b border-gray-200"},r.createElement("div",{className:"min-w-0"},r.createElement("div",{className:"text-xl font-extrabold text-[#111]"},"Reviews of Holborn Assets"),r.createElement("div",{className:"mt-1 text-sm text-gray-700"},"TrustScore ",r.createElement("span",{className:"font-semibold"},M),r.createElement("span",{className:"mx-2 text-gray-300"},"|"),"Showing ",r.createElement("span",{className:"font-semibold"},F),"-",r.createElement("span",{className:"font-semibold"},L)," of"," ",r.createElement("span",{className:"font-semibold"},_.toLocaleString()))),r.createElement("button",{type:"button",onClick:x,className:"shrink-0 rounded-lg border border-gray-300 px-3 py-2 text-sm hover:bg-gray-50"},"Close")),r.createElement("div",{className:"h-[calc(100%-81px)] min-h-0 overflow-auto lg:overflow-hidden"},r.createElement("div",{className:"grid grid-cols-1 lg:grid-cols-[380px_1fr] h-full min-h-0"},r.createElement(v,{trustScoreText:M,ratingBreakdown:T}),r.createElement("div",{className:"min-h-0"},r.createElement("div",{className:"p-5 lg:overflow-auto lg:h-full min-h-0"},r.createElement("div",{ref:w}),r.createElement("div",{className:"text-xs text-gray-500"},i?"Loading…":c?"Error loading reviews":null,null!=b&&null!==(t=b.reviews)&&void 0!==t&&t.length||null==k||null===(a=k.reviews)||void 0===a||!a.length?null:r.createElement("span",{className:"ml-2"},"(Showing cached)")),c?r.createElement("div",{className:"mt-6 border border-red-200 bg-red-50 rounded-xl p-4"},r.createElement("div",{className:"font-semibold text-red-700"},"Failed to load reviews"),r.createElement("div",{className:"mt-1 text-sm text-red-700/90"},String(c))):0!==j.length||i?r.createElement(r.Fragment,null,r.createElement("div",{className:"mt-2 space-y-3"},j.map(e=>{var t;return r.createElement(u,{key:e.id||`${e.createdAt}-${e.title}-${null===(t=e.consumer)||void 0===t?void 0:t.displayName}`,r:e})})),r.createElement(d,{page:Number(y.page||q),total:C,pageSize:B,onPrev:()=>{const e=Math.max(1,Number(y.page||1)-1),t=p(y,e),a=S.current.get(t);$(a||null),h(t=>({...t,page:e,pageSize:20})),requestAnimationFrame(()=>{var e;null===(e=w.current)||void 0===e||e.scrollIntoView({behavior:"auto",block:"start"})})},onNext:()=>{const e=Number(y.page||1)+1,t=p(y,e),a=S.current.get(t);$(a||null),h(t=>({...t,page:e,pageSize:20})),requestAnimationFrame(()=>{var e;null===(e=w.current)||void 0===e||e.scrollIntoView({behavior:"auto",block:"start"})})}})):r.createElement("div",{className:"mt-6 border border-gray-200 rounded-xl p-6 text-sm text-gray-700"},"No reviews available."))))))))):null}}}]);
2//# sourceMappingURL=441de47dd0b805336b60367f4129553aa8265d06-24a549e5b77b1ffd3048.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.