PageSourceSearch

https://seocopilot.ai/_next/static/chunks/56993-711185fa0152b3d2.js

js seocopilot.ai collected 2026-10-05 12:37:36 UTC 13,013 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[56993],{56993:(e,t,r)=>{r.d(t,{u:()=>m,b:()=>f});var n=r(95155),o=r(12115),a=r(37882),s=r(94694);let c=new Map,i=new Map;function l(e,t){let r,n=c.get(e);return n||(r=t().finally(()=>{c.get(e)===r&&c.delete(e)}),c.set(e,r),r)}async function d(e,t,r){let n=i.get(e),o=Date.now();if(n&&n.expiresAt>o)return n.value;let a=await l(e,r);return i.set(e,{expiresAt:o+t,value:a}),a}var u=r(92829);let g=(0,o.createContext)(void 0);function m({children:e}){let{data:t,status:r}=(0,a.useSession)(),{selectedProject:c}=(0,s.B)(),[f,p]=(0,o.useState)(null),[h,I]=(0,o.useState)(null),[w,S]=(0,o.useState)([]),[_,k]=(0,o.useState)([]),[j,v]=(0,o.useState)(!1),[y,T]=(0,o.useState)(null),[C,D]=(0,o.useState)(!1),[E,P]=(0,o.useState)(!1),[$,x]=(0,o.useState)(!1),[M,b]=(0,o.useState)(!0),[A,G]=(0,o.useState)(!1),[N,F]=(0,o.useState)(null),[R,O]=(0,o.useState)(null),[J,L]=(0,o.useState)(()=>"true"===localStorage.getItem("gtm-disconnected")),[U,W]=(0,o.useState)(!1),[q,B]=(0,o.useState)(null),K=(0,o.useRef)(!1),z=(0,o.useCallback)(()=>sessionStorage.getItem("gtm_access_token"),[]),H=(0,o.useCallback)(()=>sessionStorage.getItem("gtm_refresh_token"),[]),Q=(0,o.useCallback)(async e=>{if("loading"===r||K.current)return;if(J){x(!1),D(!1),S([]),p(null),k([]),P(!1);return}P(!0);let n=z(),o=sessionStorage.getItem("gtm_expires_at");o&&Date.now()>parseInt(o)&&(0,u.K)(sessionStorage);let a=t?.user?.id||"anon",s=n?n.substring(0,20):"db",i=`gtm_containers_cache_v2_${a}_${s}_${e||"all"}`,l=Date.now();{let e=sessionStorage.getItem(i);if(e)try{let t=JSON.parse(e),r=l-(t.timestamp||0),o=t.containers&&t.containers.length>0;if(t.timestamp&&function(e){let{cacheAgeMs:t,cacheDurationMs:r,hasContainers:n}=e;return t<r&&n}({cacheAgeMs:r,cacheDurationMs:36e5,hasContainers:o})){x(!!n||t.isIntegrated||!0),D(!0),b(!1),S(t.containers||[]);let e=c?.gtmContainerId,r=e?t.containers.find(t=>t.containerId===e):null,o=t.matchedContainerId,a=o?t.containers.find(e=>e.containerId===o):null;p(r||a||null),B(l),P(!1);return}}catch(e){sessionStorage.removeItem(i)}try{let e=`gtm_containers_cache_${a}_`;for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r&&r.startsWith(e)&&localStorage.removeItem(r)}}catch(e){}}K.current=!0,W(!0),b(!0),T(null),Date.now();try{let r=H(),o={};n&&(o["x-gtm-access-token"]=n),r&&(o["x-gtm-refresh-token"]=r);let a=e?`/api/gtm/containers?projectId=${encodeURIComponent(e)}`:"/api/gtm/containers",s=`gtm-containers:${t?.user?.id||"anon"}:${e||"all"}`,u=async()=>{let e,t=await fetch(a,{headers:o,cache:"no-store"}),r=t.headers.get("content-type");if(r&&r.includes("application/json"))try{e=await t.json()}catch(t){console.error("[GTM] JSON parse error:",t),e={error:"Failed to parse response"}}else e=(await t.text()).includes("GTM not integrated")?{error:"GTM not integrated"}:{error:`Server error (${t.status})`};return{ok:t.ok&&!e.error,status:t.status,data:e}},{ok:g,status:m,data:f}=await d(s,e?5e3:1500,u);if(g&&f.containers){D(!0);let t=!!n;if(!t)try{let e=await fetch("/api/integrations/status");if(e.ok){let r=await e.json();t=!!r.status?.gtm}}catch(e){console.error("Failed to check integration status",e)}if(x(t),S(f.containers||[]),F(f.matchedContainerId||null),O(f.connectedEmail||null),function(e){let{projectId:t,containerCount:r}=e;return r>0||!t}({projectId:e,containerCount:f.containers.length})&&sessionStorage.setItem(i,JSON.stringify({containers:f.containers,timestamp:l,isIntegrated:t,matchedContainerId:f.matchedContainerId||null,connectedEmail:f.connectedEmail||null})),B(l),f.containers?.length>0){let e=c?.gtmContainerId,t=e?f.containers.find(t=>t.containerId===e):null,r=f.matchedContainerId,n=r?f.containers.find(e=>e.containerId===r):null,o=sessionStorage.getItem("gtm_selected_container_id"),a=o?f.containers.find(e=>e.containerId===o):null,s=t||n||a||f.containers[0]||null;s?p(s):p(null)}}else 429===m?(x(!0),T(f.message||"Rate limit exceeded")):(x(!1),D(!1),S([]),f.error&&!f.error.toLowerCase().includes("not integrated")?T(f.error):T(null))}catch(t){x(!1);let e=t instanceof Error?t.message:String(t);
1e.includes("Unexpected token")||e.includes("is not valid JSON")?T("Failed to check GTM configuration (invalid server response)"):T(e)}finally{K.current=!1,W(!1),b(!1),P(!1)}},[r,J,z,H,t?.user?.id,c]),V=(0,o.useCallback)(async e=>{let r=z(),n=H();if(!(0,u.$)({accessToken:r,refreshToken:n,isIntegrated:$})){console.error("❌ [GTM] No access token for refresh"),T("GTM not integrated");return}if(K.current)return;K.current=!0,W(!0),v(!0),T(null);let o=Date.now();try{let o=e?`/api/gtm/containers?projectId=${encodeURIComponent(e)}`:"/api/gtm/containers",a={};r&&(a["x-gtm-access-token"]=r),n&&(a["x-gtm-refresh-token"]=n);let s=`gtm-containers:${t?.user?.id||"anon"}:${e||"all"}`;i.delete(s);let{ok:d,status:u,data:g}=await l(s,async()=>{let e,t=await fetch(o,{headers:a,cache:"no-store"}),r=t.headers.get("content-type");if(r&&r.includes("application/json"))try{e=await t.json()}catch(t){console.error("[GTM] JSON parse error:",t),e={error:"Failed to parse response"}}else e=(await t.text()).includes("GTM not integrated")?{error:"GTM not integrated"}:{error:`Server error (${t.status})`};return{ok:t.ok&&!e.error,status:t.status,data:e}});if(Date.now(),d&&g.containers){if(S(g.containers||[]),g.containers?.length>0){let e=c?.gtmContainerId,t=e?g.containers.find(t=>t.containerId===e):null,r=g.matchedContainerId,n=r?g.containers.find(e=>e.containerId===r):null;p(t||n||null)}}else 429===u?(console.warn("⚠️ [GTM] Rate limit on refresh",g),T(g.message||"Rate limit exceeded. Please wait a minute and try again.")):(console.error("❌ [GTM] Refresh error",{status:u,data:g}),g.error&&g.error.toLowerCase().includes("not integrated")?(x(!1),T(null)):T(g.error||"Failed to fetch containers"))}catch(t){let e=Date.now()-o;console.error("\uD83D\uDCA5 [GTM] Refresh error",{error:t,message:t instanceof Error?t.message:"Unknown error",requestTime:`${e}ms`}),T(t instanceof Error?t.message:"Failed to fetch containers")}finally{Date.now(),v(!1),K.current=!1,W(!1)}},[z,H,$,t?.user?.id]),X=(0,o.useCallback)(async(e,t)=>{sessionStorage.setItem("gtm_selected_container_id",t);let r=z(),n=H();if(!r&&!$)return void console.warn("⚠️ [GTM] No access token for workspaces");G(!0);let o=Date.now();try{let o,a={};r&&(a["x-gtm-access-token"]=r),n&&(a["x-gtm-refresh-token"]=n);let s=await fetch(`/api/gtm/workspaces?accountId=${e}&containerId=${t}`,{headers:a,cache:"no-store"});Date.now();let c=s.headers.get("content-type");if(c&&c.includes("application/json"))try{o=await s.json()}catch(e){o={error:"Failed to parse response"}}else o={error:`Server error (${s.status})`};if(s.ok&&o&&o.workspaces){let r=(o.workspaces||[]).map(r=>({workspaceId:String(r.workspaceId||r.path?.split("/").pop()||""),name:r.name||"Default Workspace",description:r.description||"",accountId:String(r.accountId||e),containerId:String(r.containerId||t),path:r.path||""}));k(r)}else console.warn("⚠️ [GTM] Workspaces fetch issue",{status:s.status,data:o})}catch(t){let e=Date.now()-o;console.error("\uD83D\uDCA5 [GTM] Error fetching workspaces",{error:t,message:t instanceof Error?t.message:"Unknown error",requestTime:`${e}ms`})}finally{G(!1)}},[z,H,$]);(0,o.useEffect)(()=>{k([]),I(null),f&&X(f.accountId,f.containerId)},[f,X]),(0,o.useEffect)(()=>{_.length>0?h&&_.find(e=>e.workspaceId===h.workspaceId)||I(_[0]):!A&&h&&I(null)},[_,A,h]);let Y=(0,o.useCallback)(async()=>{try{await fetch("/api/gtm/disconnect",{method:"POST"})}catch(e){console.error("Failed to call disconnect API",e)}sessionStorage.removeItem("gtm_access_token"),sessionStorage.removeItem("gtm_refresh_token"),sessionStorage.removeItem("gtm_expires_at");for(let e=0;e<sessionStorage.length;e++){let t=sessionStorage.key(e);t&&t.startsWith("gtm_containers_cache_")&&(sessionStorage.removeItem(t),e--)}localStorage.setItem("gtm-disconnected","true"),L(!0),x(!1),D(!1),T(null),S([]),p(null),k([]),I(null),F(null),O(null),sessionStorage.removeItem("gtm_selected_container_id")},[]),Z=(0,o.useCallback)(()=>{localStorage.removeItem("gtm-disconnected"),L(!1)},[]);return(0,o.useEffect)(()=>{if("loading"!==r&&!U){if("true"===localStorage.getItem("gtm-disconnected")){x(!1),D(!1),b(!1);return}let e=z(),r=t?.user?.id||"anon",n=e?e.substring(0,20):"db",o=`gtm_containers_cache_v2_${r}_${n}`;{let e=sessionStorage.getItem(o);if(e)try{let t=JSON.parse(e),r=Date.now()-(t.timestamp||0),n=t.containers&&t.containers.length>0;if(t.timestamp&&r<36e5&&n){x(!0),D(!0),b(!1),S(t.containers||[]),F(t.matchedContainerId||null),O(t.connectedEmail||null);let e=c?.gtmContainerId,r=e?t.containers.find(t=>t.containerId===e):null,n=t.matchedContainerId,o=n?t.containers.find(e=>e.containerId===n):null;p(r||o||null),B(Date.now());return}}catch(e){console.warn("⚠️ [GTM] Error parsing cache, will fetch fresh data",e)}}}},[r]),(0,o.useEffect)(()=>{let e=e=>{e.key&&(e.key.startsWith("gtm_")||e.key)};return window.addEventListener("storage",e),()=>{window.removeEventListener("storage",e)}},[Q]),(0,n.jsx)(g.Provider,{value:{selectedContainer:f,setSelectedContainer:p,containers:w,workspaces:_,loading:j,error:y,refreshContainers:V,isConfigured:C,configurationLoading:E,checkConfiguration:Q,isIntegrated:$,integrationLoading:M,workspacesLoading:A,disconnectGTM:Y,resetDisconnected:Z,disconnected:J,getAccessToken:z,getRefreshToken:H,selectedWorkspace:h,setSelectedWorkspace:I,matchedContainerId:N,connectedEmail:R},children:e})}function f(){let e=(0,o.useContext)(g);if(void 0===e)throw Error("useGTM must be used within a GTMProvider");return e}},92829:(e,t,r)=>{function n(e){return!!(e.accessToken||e.refreshToken||e.isIntegrated)}function o(e){e.removeItem("gtm_access_token"),e.removeItem("gtm_expires_at")}r.d(t,{$:()=>n,K:()=>o})},94694:(e,t,r)=>{r.d(t,{B:()=>i,ProjectProvider:()=>c,v:()=>s});var n=r(95155),o=r(12115),a=r(37882);let s=(0,o.createContext)(void 0);function c({children:e}){let{data:t}=(0,a.useSession)(),[r,i]=(0,o.useState)(null),[l,d]=(0,o.useState)([]),[u,g]=(0,o.useState)(!0),[m,f]=(0,o.useState)(!1),p=window.__projectFetchingRef??(window.__projectFetchingRef={current:!1}),h=window.__projectLastFetchAtRef??(window.__projectLastFetchAtRef={current:0});(0,o.useEffect)(()=>
1{if(t?.user?.id&&!m){let e=`projects_cache_${t.user.id}`,r=sessionStorage.getItem(e);if(r)try{let e=JSON.parse(r),t=Date.now();if(e.timestamp&&t-e.timestamp<3e4){d(e.projects||[]);let t=localStorage.getItem("selectedProjectId");if(t){let r=e.projects.find(e=>e.id===t);if(r)i(r);else if(e.projects.length>0){let t=[...e.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(t)}}else if(e.projects.length>0){let t=[...e.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(t)}g(!1)}}catch(e){console.error("Error parsing projects cache:",e)}f(!0)}},[t?.user?.id,m]);let I=(0,o.useCallback)(async(e=!1)=>{if(!t?.user?.id)return void g(!1);let r=`projects_cache_${t.user.id}`,n=Date.now();if(!e){let e=sessionStorage.getItem(r);if(e)try{let t=JSON.parse(e);if(t.timestamp&&n-t.timestamp<3e4){if(d(t.projects||[]),g(!1),t.projects&&t.projects.length>0){let e=localStorage.getItem("selectedProjectId");if(e){let r=t.projects.find(t=>t.id===e);if(r)i(r);else{let e=[...t.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(e),localStorage.setItem("selectedProjectId",e.id)}}else{let e=[...t.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(e),localStorage.setItem("selectedProjectId",e.id)}}else i(null),localStorage.removeItem("selectedProjectId");return}}catch(e){}}if((e||!h.current||!(n-h.current<2e3))&&!p.current)try{p.current=!0,g(!0);let e=await fetch("/api/projects",{cache:"no-store"});if(e.ok){let t=await e.json();if(d(t.projects||[]),sessionStorage.setItem(r,JSON.stringify({projects:t.projects,timestamp:n})),t.projects&&t.projects.length>0){let e=localStorage.getItem("selectedProjectId");if(e){let r=t.projects.find(t=>t.id===e);if(r)i(r);else{let e=[...t.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(e),localStorage.setItem("selectedProjectId",e.id)}}else{let e=[...t.projects].sort((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime())[0];i(e),localStorage.setItem("selectedProjectId",e.id)}}else i(null),localStorage.removeItem("selectedProjectId")}}catch(e){console.error("Error fetching projects:",e)}finally{g(!1),h.current=Date.now(),p.current=!1}},[t?.user?.id]);(0,o.useEffect)(()=>{m&&I()},[I,m]);let w=(0,o.useCallback)(e=>{i(e),e?localStorage.setItem("selectedProjectId",e.id):localStorage.removeItem("selectedProjectId")},[]),S=(0,o.useCallback)(()=>I(!0),[I]);return(0,n.jsx)(s.Provider,{value:{selectedProject:r,setSelectedProject:w,projects:l,isLoading:u,refreshProjects:S},children:e})}function i(){let e=(0,o.useContext)(s);if(void 0===e)throw Error("useProject must be used within a ProjectProvider");return e}}}]);

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.