PageSourceSearch

https://spoki.com/_next/static/chunks/16027.6cca41e215010604.js?dpl=dpl_2phUiUu1PG2JgAvk2r6z1NMLS9wT

js spoki.com collected 2026-09-25 18:42:22 UTC 7,092 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[16027],{16027:(e,t,r)=>{r.r(t),r.d(t,{AnalyticsTrackerProvider:()=>h,default:()=>_,useAnalytics:()=>u});var n=r(95155),i=r(12115),a=r(20063),o=r(76815),l=r(25460),c=r(32899);let s=(0,i.createContext)({isReady:!1,trackPageView:()=>{},trackClick:()=>{},trackFormSubmit:()=>{},trackCustom:()=>{},trackAISearch:()=>{},trackAINavigation:()=>{},trackVideoPlay:()=>{},trackVideoInteraction:()=>{},trackModalOpen:()=>{},trackModalClose:()=>{},trackDownload:()=>{},trackVoiceInteraction:()=>{},identify:async()=>!1,userId:null,setUserId:()=>{}});function u(){let e=(0,i.useContext)(s);if(!e)throw Error("useAnalytics must be used within an AnalyticsTrackerProvider");return e}let d="spoki_analytics_session";function f(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,10);return`ses_${e}${t}`}function m(){let e=navigator.userAgent,t="desktop";/tablet|ipad|playbook|silk/i.test(e)?t="tablet":/mobile|android|phone|ipod/i.test(e)&&(t="mobile");let r="unknown";if(e.includes("Firefox/")){let t=e.match(/Firefox\/(\d+)/);r=`Firefox ${t?.[1]||""}`.trim()}else if(e.includes("Edg/")){let t=e.match(/Edg\/(\d+)/);r=`Edge ${t?.[1]||""}`.trim()}else if(e.includes("Chrome/")){let t=e.match(/Chrome\/(\d+)/);r=`Chrome ${t?.[1]||""}`.trim()}else if(e.includes("Safari/")&&!e.includes("Chrome")){let t=e.match(/Version\/(\d+)/);r=`Safari ${t?.[1]||""}`.trim()}let n="unknown";if(e.includes("Windows NT 10"))n="Windows 10/11";else if(e.includes("Windows"))n="Windows";else if(e.includes("Mac OS X")){let t=e.match(/Mac OS X (\d+[._]\d+)/);n=`macOS ${t?.[1]?.replace("_",".")||""}`.trim()}else if(e.includes("iPhone")||e.includes("iPad")){let t=e.match(/OS (\d+_\d+)/);n=`iOS ${t?.[1]?.replace("_",".")||""}`.trim()}else if(e.includes("Android")){let t=e.match(/Android (\d+(\.\d+)?)/);n=`Android ${t?.[1]||""}`.trim()}else e.includes("Linux")&&(n="Linux");return{device_type:t,browser:r,os:n}}function h(e){let{children:t,autoTrackPageViews:r=!0,debug:u=!1}=e,h=(0,a.usePathname)(),_=(0,o.X)(),{marketingId:k,isLoaded:y}=(0,l.h8)(),[p,b]=(0,i.useState)(null),v=(0,i.useRef)(""),g=(0,i.useRef)(null),w=(0,i.useRef)([]),C=(0,i.useRef)(null),S=(0,i.useRef)(""),A=(0,i.useRef)(!1),E=(0,i.useRef)(null);(0,i.useEffect)(()=>{A.current||(v.current=function(){try{let e=sessionStorage.getItem(d);return e||(e=f(),sessionStorage.setItem(d,e)),e}catch{return f()}}(),g.current=m(),A.current=!0)},[u]);let T=(0,i.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(0===w.current.length)return;let t=[...w.current];if(w.current=[],e&&"undefined"!=typeof navigator&&navigator.sendBeacon){for(let e of t)try{let t=new Blob([JSON.stringify(e)],{type:"application/json"});navigator.sendBeacon("/api/analytics/track",t)}catch(e){}return}for(let e of t){let t=new AbortController,r=setTimeout(()=>t.abort(),5e3);try{let n=await fetch("/api/analytics/track",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:t.signal});if(clearTimeout(r),n.ok)u&&await n.json();else if(503===n.status);else if(u){let e=await n.text();console.warn(`[Analytics] Track failed (${n.status}):`,e)}}catch(e){clearTimeout(r),e instanceof Error&&"AbortError"===e.name||u&&console.error("[Analytics] Track error:",e)}}},[u]),$=(0,i.useCallback)(e=>{let t=Date.now(),r=`${e.event_type}|${e.event_name||""}|${e.page_path||""}`;if(E.current){let e=t-E.current.timestamp;if(E.current.fingerprint===r&&e<500)return}if(E.current={fingerprint:r,timestamp:t},w.current.push(e),w.current.length>=10){C.current&&(clearTimeout(C.current),C.current=null),T().catch(()=>{});return}C.current||(C.current=setTimeout(()=>{C.current=null,T().catch(()=>{})},100))},[T,u]),I=(0,i.useCallback)((e,t,r)=>{if(!k)return console.warn("[Analytics] Cannot build payload: no marketing ID"),null;let n=(0,c.KL)(),i=g.current||m();return{spoki_visitor_id:k,spoki_user_id:p||void 0,event_type:e,event_name:t,event_data:r,page_url:window.location.href,page_path:window.location.pathname,referrer_url:"undefined"!=typeof document?document.referrer:void 0,session_id:v.current,device_type:i.device_type,browser:i.browser,os:i.os,...n}},[k,p,u]),O=(0,i.useCallback)(()=>{let e=I("page_view",window.location.pathname);e&&$(e)},[I,$,u]),x=(0,i.useCallback)((e,t)=>{let r=I("click",e,t);r&&$(r)},[I,$,u]),P=(0,i.useCallback)((e,t)=>{let r=I("form_submit",e,t);r&&$(r)},[I,$,u]),L=(0,i.useCallback)((e,t)=>{let r=I("custom",e,t);r&&$(r)},[I,$,u]),R=(0,i.useCallback)((e,t,r)=>{let n=I("ai_search","ai_search_query",{...r,search_query:e,search_results_count:t});n&&$(n)},[I,$,u]),M=(0,i.useCallback)((e,t,r)=>{let n=I("ai_navigation","ai_navigation_click",{...r,search_query:e,destination:t});n&&$(n)},[I,$,u]),N=(0,i.useCallback)((e,t,r)=>{let n=I("video_play",t,{...r,video_id:e});n&&$(n)},[I,$,u]),D=(0,i.useCallback)((e,t,r,n,i)=>{let a=I("video_interaction",t,{...i,video_id:e,video_position:Math.floor(r),video_duration:Math.floor(n),video_percentage:Math.round(100*(n>0?r/n*100:0))/100});a&&$(a)},[I,$,u]),j=(0,i.useCallback)((e,t,r)=>{let n=I("modal_open",e,{...r,modal_id:e,modal_trigger:t});n&&$(n)},[I,$,u]),V=(0,i.useCallback)((e,t)=>{let r=I("modal_close",e,{...t,modal_id:e});r&&$(r)},[I,$,u]),F=(0,i.useCallback)((e,t,r,n)=>{let i=I("download",e,{...n,file_name:e,file_type:t,file_size_kb:r});i&&$(i)},[I,$,u]),W=(0,i.useCallback)((e,t)=>{let r=I("voice_interaction",e,t);r&&$(r)},[I,$,u]),q=(0,i.useCallback)(async e=>{if(!k)return console.warn("[Analytics] Cannot identify: no marketing ID"),!1;let t=new AbortController,r=setTimeout(()=>t.abort(),1e4);try{let n=await fetch("/api/analytics/identify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spoki_visitor_id:k,...e}),signal:t.signal});if(clearTimeout(r),n.ok)return b(e.spoki_user_id),!0;return 503===n.status||console.error("[Analytics] Identify failed:",await n.text()),!1}catch(e){return clearTimeout(r),e instanceof Error&&"AbortError"===e.name||console.error("[Analytics] Identify error:",e),!1}},[k,u]);return(0,i.useEffect)(()=>
1{if(!r||!y||!k){u&&!k&&y&&console.warn("[Analytics] Cannot track: marketing ID not available yet");return}let e=h+(_?.toString()?`?${_.toString()}`:"");e!==S.current&&(S.current=e,O())},[h,_,r,y,k,O,u]),(0,i.useEffect)(()=>{let e=()=>{"hidden"===document.visibilityState&&T(!0).catch(()=>{})},t=()=>{T(!0).catch(()=>{})},r=()=>{T(!0).catch(()=>{})};return document.addEventListener("visibilitychange",e),window.addEventListener("beforeunload",t),window.addEventListener("pagehide",r),()=>{try{document.removeEventListener("visibilitychange",e),window.removeEventListener("beforeunload",t),window.removeEventListener("pagehide",r)}catch{}T(!1).catch(()=>{})}},[T]),(0,n.jsx)(s.Provider,{value:{isReady:y&&!!k,trackPageView:O,trackClick:x,trackFormSubmit:P,trackCustom:L,trackAISearch:R,trackAINavigation:M,trackVideoPlay:N,trackVideoInteraction:D,trackModalOpen:j,trackModalClose:V,trackDownload:F,trackVoiceInteraction:W,identify:q,userId:p,setUserId:b},children:t})}let _=h}}]);

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.