PageSourceSearch

https://hiltonheadsouthcarolina.ai/assets/AdminAnalytics-DyEPFiBG.js

js hiltonheadsouthcarolina.ai collected 2026-10-05 14:36:06 UTC 51,942 bytes, 1 lines download raw bytes

1import{b as q,s as y,r as F,j as e,B as $,O as ns,C as R,K as Z,N as ee,c as G,w as je,S as _s,Q as A,D as ks,a1 as Cs,X as Ss,h as Ts,$ as Vs,d as qs,J as ds,p as Ye}from"./index-PtGACUVf.js";import{f as Ls}from"./supabase-pagination-6nAnYJMC.js";import{S as Je,a as Ze,b as es,c as ss,d as J}from"./select-BwSQ4ldD.js";import{P as ts,a as is,b as as}from"./popover-C9gaYfZS.js";import{C as us}from"./calendar-C7TVkOYb.js";import{T as ye,a as we,b as W,c as B,d as be,e as j}from"./table-BzCEyvEt.js";import{C as Ds}from"./checkbox-Be-GC6mS.js";import{S as Ms}from"./scroll-area-DNolq6ne.js";import{A as Es,h as Bs,a as Fs,b as Os,c as zs,d as Ps,e as Ks,f as Is,g as As}from"./alert-dialog-Cl4FfIMl.js";import{A as $s}from"./arrow-left-QiRMPYSA.js";import{T as Oe}from"./trending-up-DRFMNTkn.js";import{R as Ce,B as ze,C as Se,X as Te,Y as Ve,T as qe,b as Pe,L as Us,a as ms}from"./BarChart-CW9RO9hj.js";import{M as Fe}from"./mouse-pointer-DOeWWEP-.js";import{P as Hs}from"./phone-BQCs-BzB.js";import{F as Rs}from"./file-text-C2KosKJ2.js";import{F as Gs}from"./flame-EMN3xJxP.js";import{E as Ke}from"./eye-B9hDvAFW.js";import{T as Ws}from"./trash-2-BGrma1vw.js";import{G as Qs}from"./git-compare-Bsnya5PV.js";import{U as hs}from"./user-plus-B_MrQHLh.js";import{B as Xs}from"./building-2-DaWZqhwr.js";import{C as Ys}from"./circle-check-big-sSf7dLsd.js";import{C as Js}from"./chevron-left-CXyk187g.js";import{C as Zs}from"./circle-help-BUvj45CM.js";import{a as et,A as st}from"./arrow-up-oIP_qrt4.js";import{T as tt}from"./trending-down-BUHP5aIn.js";import{s as de}from"./subDays-BTfryw0e.js";import{d as gs}from"./differenceInDays-e1Kv1-lq.js";import"./index-BdQq_4o_.js";import"./chevron-up-BZ1Up2zp.js";import"./differenceInCalendarMonths-jwbKP_Yg.js";import"./startOfMonth-oiJ2Uv4a.js";import"./addWeeks-DUhIpodf.js";import"./endOfWeek-BXxCPcEl.js";import"./endOfMonth-SSXmClIb.js";import"./index-DU2LHGu_.js";import"./index-jtQY2-DT.js";const it=["googlebot","bingbot","yandexbot","duckduckbot","slurp","baiduspider","msnbot","facebookexternalhit","twitterbot","rogerbot","linkedinbot","embedly","applebot","quora link preview","showyoubot","outbrain","pinterest","slackbot","telegrambot","whatsapp","discordbot","semrushbot","ahrefsbot","mj12bot","dotbot","petalbot","bytespider","seokicks","siteauditbot","gptbot","claudebot","anthropic","dataforseo","serpstatbot","screaming frog","ccbot","perplexity","cohere","headlesschrome","phantomjs","prerender","puppeteer","playwright","selenium","jsdom","nightmare","crawler","spider","bot/","bot.html","archive.org_bot","ia_archiver","megaindex","blexbot","curl","wget","python","go-http","java/","libwww","fetch/","axios","node-fetch","uptimerobot","pingdom","site24x7","statuscake","vercel-screenshot","dataprovider","webcopier","elinks","lighthouse","pagespeed"],at=["mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) chrome/126.0.0.0 safari/537.36"],rs=o=>{if(!o)return!1;if(o.length<20)return!0;const se=o.toLowerCase();return at.some(f=>se===f)||se.includes("chrome/126.0.0.0")?!0:it.some(f=>se.includes(f))},xs=o=>o?o.toLowerCase().includes("lovable.dev"):!1,rt=(o,se)=>{if(!o||o.trim()==="")return"Direct";const f=o.toLowerCase();if(f.includes(se.toLowerCase()))return"Direct";if(f.includes("google."))return"Google Organic";if(f.includes("bing."))return"Bing";if(f.includes("facebook.")||f.includes("fb.com")||f.includes("m.facebook"))return"Facebook";if(f.includes("instagram."))return"Instagram";if(f.includes("twitter.")||f.includes("t.co")||f.includes("x.com"))return"Twitter/X";if(f.includes("linkedin."))return"LinkedIn";if(f.includes("pinterest."))return"Pinterest";if(f.includes("tiktok."))return"TikTok";try{return new URL(o).hostname.replace("www.","")}catch{return"Other Referral"}},nt=(o,se)=>{if(o==="/"||o==="")return"Homepage";if(o==="/directory"||o==="/directory/")return"Directory";if(o.startsWith("/directory/")){const f=o.replace("/directory/","").replace(/\/$/,"");return se[f]||f}return o==="/blog"||o==="/blog/"?"Blog":o.startsWith("/blog/")?o.replace("/blog/","Blog: "):o==="/events"||o==="/events/"?"Events":o==="/deals"||o==="/deals/"?"Deals":o};function lt({cityId:o,cityName:se,domain:f,dateRange:T,onBack:C}){var De;const{data:ve,isLoading:c}=q({queryKey:["site-traffic-sources",o,T.startTs,T.endTs],queryFn:async()=>{const x=[];let S=0;const z=1e3;let P=!0;for(;P;){const{data:w,error:M}=await y.from("page_views").select("referrer, user_agent").eq("city_id",o).gte("created_at",T.startTs).lte("created_at",T.endTs).range(S,S+z-1);if(M)break;w&&w.length>0?(x.push(...w),S+=z,P=w.length===z):P=!1}const k=x.filter(w=>!rs(w.user_agent)&&!xs(w.referrer)),U={};
1return k.forEach(w=>{const M=rt(w.referrer,f);U[M]=(U[M]||0)+1}),Object.entries(U).map(([w,M])=>({name:w,count:M})).sort((w,M)=>M.count-w.count)}}),{data:ue,isLoading:Ie}=q({queryKey:["site-top-pages",o,T.startTs,T.endTs],queryFn:async()=>{const x=[];let S=0;const z=1e3;let P=!0;for(;P;){const{data:w,error:M}=await y.from("page_views").select("page_path, user_agent, referrer").eq("city_id",o).gte("created_at",T.startTs).lte("created_at",T.endTs).range(S,S+z-1);if(M)break;w&&w.length>0?(x.push(...w),S+=z,P=w.length===z):P=!1}const k=x.filter(w=>!rs(w.user_agent)&&!xs(w.referrer)),U={};return k.forEach(w=>{const M=w.page_path||"/";U[M]=(U[M]||0)+1}),Object.entries(U).map(([w,M])=>({path:w,count:M})).sort((w,M)=>M.count-w.count).slice(0,20)}}),{data:Ne}=q({queryKey:["site-business-slugs",o],queryFn:async()=>{const{data:x,error:S}=await y.from("businesses").select("slug, name").eq("city_id",o);if(S)return{};const z={};return x==null||x.forEach(P=>{P.slug&&(z[P.slug]=P.name)}),z}}),{data:Q,isLoading:Ae}=q({queryKey:["site-hot-leads",o,T.startTs,T.endTs],queryFn:async()=>{const{data:x,error:S}=await y.rpc("get_hot_leads",{p_city_id:o,p_start_ts:T.startTs,p_end_ts:T.endTs,p_limit:20});return S?(console.error("Error fetching hot leads:",S),[]):x||[]}}),{data:X,isLoading:Le}=q({queryKey:["site-top-claimed",o,T.startTs,T.endTs],queryFn:async()=>{const{data:x,error:S}=await y.rpc("get_top_claimed_businesses",{p_city_id:o,p_start_ts:T.startTs,p_end_ts:T.endTs,p_limit:20});return S?(console.error("Error fetching top claimed businesses:",S),[]):x||[]}}),{data:D,isLoading:te}=q({queryKey:["site-clicks-by-type",o,T.startTs,T.endTs],queryFn:async()=>{const{data:x,error:S}=await y.from("businesses").select("id").eq("city_id",o);if(S||!x||x.length===0)return[];const z=x.map(_=>_.id),P=[];let k=0;const U=1e3;let w=!0;for(;w;){const{data:_,error:Y}=await y.from("listing_clicks").select("click_type, user_agent").in("business_id",z).gte("created_at",T.startTs).lte("created_at",T.endTs).range(k,k+U-1);if(Y)break;_&&_.length>0?(P.push(..._),k+=U,w=_.length===U):w=!1}const M=P.filter(_=>!rs(_.user_agent)),H={};M.forEach(_=>{const Y=_.click_type||"other";H[Y]=(H[Y]||0)+1});const v={phone:{label:"Phone Calls",icon:"📞"},website:{label:"Website Clicks",icon:"🌐"},directions:{label:"Directions",icon:"📍"},booking:{label:"Booking",icon:"📅"},order_online:{label:"Order Online",icon:"🛒"},email:{label:"Email",icon:"✉️"}};return Object.entries(H).map(([_,Y])=>{var ie,me;return{type:_,name:((ie=v[_])==null?void 0:ie.label)||_,icon:((me=v[_])==null?void 0:me.icon)||"🔗",count:Y}}).sort((_,Y)=>Y.count-_.count)}}),O=F.useMemo(()=>!ue||!Ne?[]:ue.map(x=>({...x,displayName:nt(x.path,Ne)})),[ue,Ne]);return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"flex items-center gap-4",children:e.jsxs($,{variant:"ghost",size:"sm",onClick:C,className:"gap-2",children:[e.jsx($s,{className:"h-4 w-4"}),"Back to All Sites"]})}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h1",{className:"text-3xl font-bold",children:se}),e.jsxs("p",{className:"text-muted-foreground flex items-center gap-2",children:[e.jsx(ns,{className:"h-4 w-4"}),f]})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Oe,{className:"h-4 w-4"}),"Traffic Sources"]})}),e.jsx(G,{children:c?e.jsx("div",{className:"h-[300px] flex items-center justify-center text-muted-foreground",children:"Loading traffic sources..."}):ve&&ve.length>0?e.jsx("div",{className:"h-[300px]",children:e.jsx(Ce,{width:"100%",height:"100%",children:e.jsxs(ze,{data:ve,layout:"vertical",margin:{left:10},children:[e.jsx(Se,{strokeDasharray:"3 3",className:"stroke-muted"}),e.jsx(Te,{type:"number",tick:{fontSize:12}}),e.jsx(Ve,{dataKey:"name",type:"category",tick:{fontSize:11},width:120}),e.jsx(qe,{contentStyle:{backgroundColor:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:"8px"},formatter:x=>[x.toLocaleString(),"Visits"]}),e.jsx(Pe,{dataKey:"count",fill:"hsl(var(--primary))",radius:[0,4,4,0]})]})})}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No traffic data for selected period"})})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Fe,{className:"h-4 w-4"}),"Clicks by Type",D&&D.length>0&&e.jsxs(je,{variant:"outline",className:"ml-2",children:[D.reduce((x,S)=>
1x+S.count,0).toLocaleString()," total"]})]})}),e.jsxs(G,{children:[te?e.jsx("div",{className:"h-[200px] flex items-center justify-center text-muted-foreground",children:"Loading clicks data..."}):D&&D.length>0?e.jsx("div",{className:"h-[200px]",children:e.jsx(Ce,{width:"100%",height:"100%",children:e.jsxs(ze,{data:D,layout:"vertical",margin:{left:10},children:[e.jsx(Se,{strokeDasharray:"3 3",className:"stroke-muted"}),e.jsx(Te,{type:"number",tick:{fontSize:12}}),e.jsx(Ve,{dataKey:"name",type:"category",tick:{fontSize:11},width:100}),e.jsx(qe,{contentStyle:{backgroundColor:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:"8px"},formatter:(x,S,z)=>[x.toLocaleString(),z.payload.type==="phone"?"📞 Phone Calls":z.payload.name]}),e.jsx(Pe,{dataKey:"count",fill:"hsl(var(--accent))",radius:[0,4,4,0]})]})})}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No click data for selected period"}),D&&D.find(x=>x.type==="phone")&&e.jsx("div",{className:"mt-3 p-3 rounded-lg bg-emerald-50 dark:bg-emerald-950/30 border border-emerald-200 dark:border-emerald-800",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(Hs,{className:"h-4 w-4 text-emerald-600"}),e.jsxs("span",{className:"font-medium text-emerald-700 dark:text-emerald-400",children:[(De=D.find(x=>x.type==="phone"))==null?void 0:De.count.toLocaleString()," phone calls"]}),e.jsx("span",{className:"text-emerald-600 dark:text-emerald-500 text-xs",children:"— highest-intent action"})]})})]})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Rs,{className:"h-4 w-4"}),"Top Pages",O.length>0&&e.jsxs(je,{variant:"outline",className:"ml-2",children:["Top ",O.length]})]})}),e.jsx(G,{children:Ie?e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"Loading pages..."}):O.length>0?e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(B,{children:"Page"}),e.jsx(B,{className:"text-right",children:"Views"})]})}),e.jsx(be,{children:O.map((x,S)=>e.jsxs(W,{children:[e.jsx(j,{className:"font-medium",children:x.displayName}),e.jsx(j,{className:"text-right",children:x.count.toLocaleString()})]},S))})]}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No page views for selected period"})})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Gs,{className:"h-4 w-4 text-orange-500"}),"Hot Leads — Unclaimed Listings with Traffic",Q&&Q.length>0&&e.jsx(je,{variant:"outline",className:"ml-2",children:Q.length})]})}),e.jsx(G,{children:Ae?e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"Loading..."}):Q&&Q.length>0?e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(B,{children:"Business"}),e.jsx(B,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",children:[e.jsx(Ke,{className:"h-3 w-3"}),"Views"]})}),e.jsx(B,{className:"text-right text-xs",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",title:"Google Search",children:[e.jsx(_s,{className:"h-3 w-3 text-blue-500"}),"Google"]})}),e.jsx(B,{className:"text-right text-xs",children:e.jsx("div",{className:"flex items-center justify-end gap-1",title:"Facebook",children:"FB"})}),e.jsx(B,{className:"text-right text-xs",children:e.jsx("div",{className:"flex items-center justify-end gap-1",title:"Direct Traffic",children:"Direct"})}),e.jsx(B,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",children:[e.jsx(Fe,{className:"h-3 w-3"}),"Clicks"]})})]})}),e.jsx(be,{children:Q.map(x=>e.jsxs(W,{children:[e.jsx(j,{className:"font-medium max-w-[200px] truncate",title:x.name,children:x.name}),e.jsx(j,{className:"text-right font-medium",children:x.views.toLocaleString()}
1),e.jsx(j,{className:"text-right text-blue-600 dark:text-blue-400",children:(x.google_views||0).toLocaleString()}),e.jsx(j,{className:"text-right text-indigo-600 dark:text-indigo-400",children:(x.facebook_views||0).toLocaleString()}),e.jsx(j,{className:"text-right text-muted-foreground",children:(x.direct_views||0).toLocaleString()}),e.jsx(j,{className:"text-right",children:x.clicks.toLocaleString()})]},x.id))})]})}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No unclaimed listings with traffic"})})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Oe,{className:"h-4 w-4 text-green-500"}),"Top Performing Claimed Businesses",X&&X.length>0&&e.jsx(je,{variant:"outline",className:"ml-2",children:X.length})]})}),e.jsx(G,{children:Le?e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"Loading..."}):X&&X.length>0?e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(B,{children:"Business"}),e.jsx(B,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",children:[e.jsx(Ke,{className:"h-3 w-3"}),"Views"]})}),e.jsx(B,{className:"text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",children:[e.jsx(Fe,{className:"h-3 w-3"}),"Clicks"]})})]})}),e.jsx(be,{children:X.map(x=>e.jsxs(W,{children:[e.jsx(j,{className:"font-medium",children:x.name}),e.jsx(j,{className:"text-right",children:x.views.toLocaleString()}),e.jsx(j,{className:"text-right",children:x.clicks.toLocaleString()})]},x.id))})]}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No claimed businesses with traffic"})})]})]})]})}function Wt(){const[o,se]=F.useState("30"),[f,T]=F.useState(de(new Date,30)),[C,ve]=F.useState(new Date),[c,ue]=F.useState([]),[Ie,Ne]=F.useState(!1),[Q,Ae]=F.useState("totalBusinesses"),[X,Le]=F.useState("desc"),[D,te]=F.useState(1),[O,De]=F.useState(25),[x,S]=F.useState(null),[z,P]=F.useState(!1),[k,U]=F.useState("previous"),w=async()=>{P(!0);try{const{error:s}=await y.from("page_views").delete().neq("id","00000000-0000-0000-0000-000000000000");if(s)throw s;const{error:t}=await y.from("listing_views").delete().neq("id","00000000-0000-0000-0000-000000000000");if(t)throw t;const{error:i}=await y.from("listing_clicks").delete().neq("id","00000000-0000-0000-0000-000000000000");if(i)throw i;ds.success("All analytics data cleared successfully"),window.location.reload()}catch(s){console.error("Error clearing stats:",s),ds.error("Failed to clear analytics data")}finally{P(!1)}},M=s=>{Q===s?Le(X==="asc"?"desc":"asc"):(Ae(s),Le("desc")),te(1)},H=({column:s,children:t,align:i="left"})=>e.jsx(B,{className:Ye("cursor-pointer select-none hover:bg-muted/50 transition-colors",i==="right"&&"text-right"),onClick:()=>M(s),children:e.jsxs("div",{className:Ye("flex items-center gap-1",i==="right"&&"justify-end"),children:[t,Q===s?X==="asc"?e.jsx(et,{className:"h-3 w-3 text-primary"}):e.jsx(st,{className:"h-3 w-3 text-primary"}):e.jsx("div",{className:"h-3 w-3"})]})}),{data:v}=q({queryKey:["admin-cities-all"],queryFn:async()=>{const{data:s,error:t}=await y.from("cities").select("id, name, slug, domain").order("name");if(t)throw t;return console.log(`Fetched ${s==null?void 0:s.length} cities`),s}}),_=A(new Date,"yyyy-MM-dd"),Y=()=>{const s=new Date;if(o==="custom"&&f&&C)return{startDate:A(f,"yyyy-MM-dd"),endDate:A(C,"yyyy-MM-dd"),days:gs(C,f)};const t=parseInt(o);return{startDate:A(de(s,t),"yyyy-MM-dd"),endDate:A(s,"yyyy-MM-dd"),days:t}},ie=()=>{const s=new Date;if(o==="custom"&&f&&C){const a=new Date(f);a.setHours(0,0,0,0);const r=new Date(C);return r.setHours(23,59,59,999),{startTs:a.toISOString(),endTs:r.toISOString()}}const t=parseInt(o);return{startTs:de(s,t).toISOString(),endTs:s.toISOString()}},me=()=>{const s=new Date;if(o==="custom"&&f&&C){const l=gs(C,f)+1,u=de(f,1),p=de(f,l);return{startDate:A(p,"yyyy-MM-dd"),endDate:A(u,"yyyy-MM-dd"),startTs:new Date(p.setHours(0,0,0,0)).toISOString(),endTs:new Date(u.setHours(23,59,59,999)).toISOString(),days:l}}const t=parseInt(o),i=de(s,t),a=de(i,1),r=de(i,t);return{startDate:A(r,"yyyy-MM-dd"),endDate:A(a,"yyyy-MM-dd"),startTs:r.toISOString(),endTs:a.toISOString(),days:t}},$e=s=>{ue(t=>t.includes(s)?t.filter(i=>i!==s):[...t,s])},ls=()=>{ue([])},fs=()=>{v&&ue(v.map(s=>s.id))},cs=F.useMemo(()=>v?v.filter(s=>
1c.includes(s.id)).map(s=>s.name):[],[v,c]),{data:Ue}=q({queryKey:["admin-business-counts-per-city",c,v==null?void 0:v.map(s=>s.id).join(",")],queryFn:async()=>{if(!v||v.length===0)return{};console.log("Fetching business counts per city using exact counts...");const s=c.length>0?c:v.map(a=>a.id),t={};await Promise.all(s.map(async a=>{const{count:r,error:l}=await y.from("businesses").select("*",{count:"exact",head:!0}).eq("city_id",a),{count:u,error:p}=await y.from("businesses").select("*",{count:"exact",head:!0}).eq("city_id",a).eq("is_claimed",!0);!l&&r!==null&&(t[a]={total:r,claimed:!p&&u!==null?u:0})}));const i=Object.values(t).reduce((a,r)=>a+r.total,0);return console.log(`Fetched exact counts for ${Object.keys(t).length} cities, total: ${i}`),t},enabled:!!v&&v.length>0}),ps=["googlebot","bingbot","yandexbot","duckduckbot","slurp","baiduspider","msnbot","facebookexternalhit","twitterbot","rogerbot","linkedinbot","embedly","applebot","quora link preview","showyoubot","outbrain","pinterest","slackbot","telegrambot","whatsapp","discordbot","semrushbot","ahrefsbot","mj12bot","dotbot","petalbot","bytespider","seokicks","siteauditbot","gptbot","claudebot","anthropic","dataforseo","serpstatbot","screaming frog","ccbot","perplexity","cohere","headlesschrome","phantomjs","prerender","puppeteer","playwright","selenium","jsdom","nightmare","crawler","spider","bot/","bot.html","archive.org_bot","ia_archiver","megaindex","blexbot","curl","wget","python","go-http","java/","libwww","fetch/","axios","node-fetch","uptimerobot","pingdom","site24x7","statuscake","vercel-screenshot","dataprovider","webcopier","elinks","lighthouse","pagespeed"],js=["mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) chrome/126.0.0.0 safari/537.36"],re=s=>{if(!s)return!1;if(s.length<20)return!0;const t=s.toLowerCase();return js.some(i=>t===i)||t.includes("chrome/126.0.0.0")?!0:ps.some(i=>t.includes(i))},os=s=>s?s.toLowerCase().includes("lovable.dev"):!1,{data:he,isLoading:ct}=q({queryKey:["admin-page-views-per-city",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie();console.log("Fetching page views per city (excluding bots)...",{startTs:s,endTs:t});const i=[];let a=0;const r=1e3;let l=!0;for(;l;){let V=y.from("page_views").select("city_id, visitor_id, user_agent, referrer").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(V=V.in("city_id",c));const{data:L,error:oe}=await V;if(oe)throw console.error("Error fetching page views:",oe),oe;L&&L.length>0?(i.push(...L),a+=r,l=L.length===r):l=!1}console.log(`Fetched ${i.length} total page views`);const u=i.filter(V=>!re(V.user_agent)&&!os(V.referrer)),p=i.length-u.length;console.log(`Filtered out ${p} bot/internal page views, ${u.length} human page views remaining`);const g={},d={};u.forEach(V=>{const L=V.city_id||"unknown";g[L]=(g[L]||0)+1,d[L]||(d[L]=new Set),d[L].add(V.visitor_id)});const n={};Object.entries(d).forEach(([V,L])=>{n[V]=L.size});const h=Object.values(g).reduce((V,L)=>V+L,0),N=Object.values(n).reduce((V,L)=>V+L,0);return console.log(`Human traffic totals - Views: ${h}, Unique visitors: ${N}`),{pageViews:g,uniqueVisitors:n}}}),{data:ge}=q({queryKey:["admin-prev-page-views-per-city",o,f,C,c,_,k],queryFn:async()=>{if(k==="none")return{pageViews:{},uniqueVisitors:{}};const{startTs:s,endTs:t}=me();console.log("Fetching PREVIOUS period page views...",{startTs:s,endTs:t});const i=[];let a=0;const r=1e3;let l=!0;for(;l;){let n=y.from("page_views").select("city_id, visitor_id, user_agent, referrer").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(n=n.in("city_id",c));const{data:h,error:N}=await n;if(N)throw console.error("Error fetching prev page views:",N),N;h&&h.length>0?(i.push(...h),a+=r,l=h.length===r):l=!1}const u=i.filter(n=>!re(n.user_agent)&&!os(n.referrer)),p={},g={};u.forEach(n=>{const h=n.city_id||"unknown";p[h]=(p[h]||0)+1,g[h]||(g[h]=new Set),g[h].add(n.visitor_id)});const d={};return Object.entries(g).forEach(([n,h])=>{d[n]=h.size}),{pageViews:p,uniqueVisitors:d}},enabled:k==="previous"}),{data:xe}=q({queryKey:["admin-prev-listing-stats-per-city",o,f,C,c,_,k],queryFn:async()=>
1{if(k==="none")return{listingViews:{},listingClicks:{}};const{startTs:s,endTs:t}=me(),i=[];let a=0;const r=1e3;let l=!0;for(;l;){let h=y.from("listing_views").select("city_id, user_agent").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(h=h.in("city_id",c));const{data:N,error:V}=await h;if(V)break;N&&N.length>0?(i.push(...N),a+=r,l=N.length===r):l=!1}const u=[];for(a=0,l=!0;l;){let h=y.from("listing_clicks").select("city_id, user_agent").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(h=h.in("city_id",c));const{data:N,error:V}=await h;if(V)break;N&&N.length>0?(u.push(...N),a+=r,l=N.length===r):l=!1}const p=i.filter(h=>!re(h.user_agent)),g=u.filter(h=>!re(h.user_agent)),d={},n={};return p.forEach(h=>{const N=h.city_id||"unknown";d[N]=(d[N]||0)+1}),g.forEach(h=>{const N=h.city_id||"unknown";n[N]=(n[N]||0)+1}),{listingViews:d,listingClicks:n}},enabled:k==="previous"}),{data:Me}=q({queryKey:["admin-prev-leads-per-city",o,f,C,c,_,k],queryFn:async()=>{if(k==="none")return{};const{startDate:s,endDate:t}=me(),{data:i,error:a}=await y.from("business_leads").select("business_id").gte("created_at",s).lte("created_at",t+"T23:59:59");if(a)return{};const r=[...new Set((i==null?void 0:i.map(g=>g.business_id))||[])];if(r.length===0)return{};const l={},u=500;for(let g=0;g<r.length;g+=u){const d=r.slice(g,g+u);let n=y.from("businesses").select("id, city_id").in("id",d);c.length>0&&(n=n.in("city_id",c));const{data:h}=await n;h==null||h.forEach(N=>{N.city_id&&(l[N.id]=N.city_id)})}const p={};return i==null||i.forEach(g=>{const d=l[g.business_id];d&&(p[d]=(p[d]||0)+1)}),p},enabled:k==="previous"}),{data:_e}=q({queryKey:["admin-prev-daily-page-views",o,f,C,c,_,k],queryFn:async()=>{if(k==="none")return[];const{startTs:s,endTs:t}=me(),i=[];let a=0;const r=1e3;let l=!0;for(;l;){let g=y.from("page_views").select("created_at, user_agent").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(g=g.in("city_id",c));const{data:d,error:n}=await g;if(n)break;d&&d.length>0?(i.push(...d),a+=r,l=d.length===r):l=!1}const u=i.filter(g=>!re(g.user_agent)),p={};return u.forEach(g=>{var n;const d=(n=g.created_at)==null?void 0:n.split("T")[0];d&&(p[d]=(p[d]||0)+1)}),Object.entries(p).map(([g,d])=>({date:g,views:d})).sort((g,d)=>g.date.localeCompare(d.date))},enabled:k==="previous"}),{data:ae,isLoading:ot}=q({queryKey:["admin-analytics-per-city",o,f,C,c,_],queryFn:async()=>{const{startDate:s,endDate:t}=Y();console.log("Fetching analytics per city...",{startDate:s,endDate:t});const i=[];let a=0;const r=1e3;let l=!0;for(;l;){const{data:b,error:m}=await y.from("business_analytics").select("business_id, event_type, count").gte("event_date",s).lte("event_date",t).range(a,a+r-1);if(m)throw console.error("Error fetching analytics:",m),m;b&&b.length>0?(i.push(...b),a+=r,l=b.length===r):l=!1}if(console.log(`Fetched ${i.length} analytics events`),i.length===0)return{views:{},clicks:{},leads:{}};const u=[...new Set(i.map(b=>b.business_id))];console.log(`Found ${u.length} unique businesses with analytics`);const p={},g=500;for(let b=0;b<u.length;b+=g){const m=u.slice(b,b+g);let E=y.from("businesses").select("id, city_id").in("id",m);c.length>0&&(E=E.in("city_id",c));const{data:le,error:Be}=await E;Be&&console.error("Error fetching business city_ids:",Be),le==null||le.forEach(pe=>{pe.city_id&&(p[pe.id]=pe.city_id)})}console.log(`Mapped ${Object.keys(p).length} businesses to cities`);const d={},n={};i.forEach(b=>{const m=p[b.business_id];m&&(b.event_type==="view"||b.event_type==="views"?d[m]=(d[m]||0)+b.count:b.event_type.includes("click")&&(n[m]=(n[m]||0)+b.count))});const h={},N=Object.keys(p);for(let b=0;b<N.length;b+=g){const m=N.slice(b,b+g),{data:E,error:le}=await y.from("business_leads").select("business_id").in("business_id",m).gte("created_at",s).lte("created_at",t+"T23:59:59");
1le&&console.error("Error fetching leads:",le),E==null||E.forEach(Be=>{const pe=p[Be.business_id];pe&&(h[pe]=(h[pe]||0)+1)})}const V=Object.values(d).reduce((b,m)=>b+m,0),L=Object.values(n).reduce((b,m)=>b+m,0),oe=Object.values(h).reduce((b,m)=>b+m,0);return console.log(`Analytics totals - Views: ${V}, Clicks: ${L}, Leads: ${oe}`),{views:d,clicks:n,leads:h}}}),{data:fe}=q({queryKey:["admin-listing-stats-per-city",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie();console.log("Fetching listing stats via RPC (server-side aggregation)...",{startTs:s,endTs:t});const{data:i,error:a}=await y.rpc("get_listing_stats_by_city",{start_ts:s,end_ts:t,city_ids:c.length>0?c:null});if(a)throw console.error("Error fetching listing stats:",a),a;const r={},l={};let u=0,p=0;return(i||[]).forEach(g=>{const d=g.city_id||"unknown";r[d]=g.views_count,l[d]=g.clicks_count,u+=g.views_count,p+=g.clicks_count}),console.log(`Listing stats: ${u} views, ${p} clicks`),{listingViews:r,listingClicks:l}}}),K=F.useMemo(()=>{if(!v||!Ue)return[];const s=v.map(i=>{const a=Ue[i.id]||{total:0,claimed:0};return{cityId:i.id,cityName:i.name,domain:i.domain,totalBusinesses:a.total,claimedBusinesses:a.claimed,views:(ae==null?void 0:ae.views[i.id])||0,pageViews:(he==null?void 0:he.pageViews[i.id])||0,uniqueVisitors:(he==null?void 0:he.uniqueVisitors[i.id])||0,clicks:(ae==null?void 0:ae.clicks[i.id])||0,leads:(ae==null?void 0:ae.leads[i.id])||0,listingViews:(fe==null?void 0:fe.listingViews[i.id])||0,listingClicks:(fe==null?void 0:fe.listingClicks[i.id])||0}});return(c.length>0?s.filter(i=>c.includes(i.cityId)):s).sort((i,a)=>{const r=i[Q],l=a[Q];return typeof r=="string"&&typeof l=="string"?X==="asc"?r.localeCompare(l):l.localeCompare(r):X==="asc"?r-l:l-r})},[v,Ue,ae,he,fe,c,Q,X]),I=F.useMemo(()=>K.reduce((s,t)=>({totalBusinesses:s.totalBusinesses+t.totalBusinesses,claimedBusinesses:s.claimedBusinesses+t.claimedBusinesses,views:s.views+t.views,pageViews:s.pageViews+t.pageViews,uniqueVisitors:s.uniqueVisitors+t.uniqueVisitors,clicks:s.clicks+t.clicks,leads:s.leads+t.leads,listingViews:s.listingViews+t.listingViews,listingClicks:s.listingClicks+t.listingClicks}),{totalBusinesses:0,claimedBusinesses:0,views:0,pageViews:0,uniqueVisitors:0,clicks:0,leads:0,listingViews:0,listingClicks:0}),[K]),ke=F.useMemo(()=>{if(k==="none"||!v)return{pageViews:0,uniqueVisitors:0,listingViews:0,listingClicks:0,leads:0};const s=c.length>0?c:v.map(u=>u.id);let t=0,i=0,a=0,r=0,l=0;return s.forEach(u=>{t+=(ge==null?void 0:ge.pageViews[u])||0,i+=(ge==null?void 0:ge.uniqueVisitors[u])||0,a+=(xe==null?void 0:xe.listingViews[u])||0,r+=(xe==null?void 0:xe.listingClicks[u])||0,l+=(Me==null?void 0:Me[u])||0}),{pageViews:t,uniqueVisitors:i,listingViews:a,listingClicks:r,leads:l}},[k,v,c,ge,xe,Me]),ys=(s,t)=>t===0?s>0?100:0:(s-t)/t*100;O==="all"&&K.length;const ne=O==="all"?1:Math.ceil(K.length/O),ws=F.useMemo(()=>{if(O==="all")return K;const s=(D-1)*O;return K.slice(s,s+O)},[K,D,O]),{data:Ee,isLoading:dt}=q({queryKey:["admin-analytics",o,f,C,c,_],queryFn:async()=>{const{startDate:s,endDate:t}=Y();let i=null;if(c.length>0){const{data:u}=await y.from("businesses").select("id").in("city_id",c);if(i=(u==null?void 0:u.map(p=>p.id))||[],i.length===0)return[]}let a=y.from("business_analytics").select("*").gte("event_date",s).lte("event_date",t).order("event_date",{ascending:!0});i&&i.length>0&&(a=a.in("business_id",i));const{data:r,error:l}=await a;if(l)throw l;return r||[]}}),{data:He}=q({queryKey:["admin-top-businesses",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie();console.log("Fetching top performing businesses from listing_views...",{startTs:s,endTs:t});const i=[];let a=0;const r=1e3;let l=!0;for(;l;){let m=y.from("listing_views").select("business_id, user_agent").gte("created_at",s).lte("created_at",t).range(a,a+r-1);const{data:E,error:le}=await m;if(le){console.error("Error fetching listing views:",le);break}E&&E.length>0?(i.push(...E),a+=r,l=E.length===r):l=!1}const u=i.filter(m=>!re(m.user_agent));console.log(`Top businesses: ${i.length} total views, ${u.length} human views`);const p={};u.forEach(m=>{p[m.business_id]=(p[m.business_id]||0)+1});const g=Object.entries(p).sort((m,E)=>E[1]-m[1]).slice(0,10).map(([m])=>m);if(g.length===0)return[];let d=y.from("businesses").select("id, name, city, city_id").in("id",g);c.length>0&&(d=d.in("city_id",c));const{data:n,error:h}=await d;if(h)throw h;const N=[];for(a=0,l=!0;l;){const{data:m,error:E}=await y.from("listing_clicks").select("business_id, user_agent").in("business_id",g).gte("created_at",s).lte("created_at",t).range(a,a+r-1);if(E)break;m&&m.length>0?(N.push(...m),a+=r,l=m.length===r):l=!1}const V=N.filter(m=>!re(m.user_agent)),L={};
1V.forEach(m=>{L[m.business_id]=(L[m.business_id]||0)+1});const oe=[...new Set((n==null?void 0:n.map(m=>m.city_id).filter(Boolean))||[])];let b={};if(oe.length>0){const{data:m}=await y.from("cities").select("id, name").in("id",oe);m==null||m.forEach(E=>{b[E.id]=E.name})}return(n==null?void 0:n.map(m=>({...m,views:p[m.id]||0,clicks:L[m.id]||0,submissions:0,siteName:m.city_id&&b[m.city_id]||m.city})).sort((m,E)=>E.views-m.views))||[]}}),{data:Re}=q({queryKey:["admin-businesses-by-category",c],queryFn:async()=>{const s=await Ls(async(i,a)=>{let r=y.from("businesses").select("category, city_id").range(i,a);c.length>0&&(r=r.in("city_id",c));const{data:l,error:u}=await r;if(u)throw u;return l||[]},{pageSize:1e3,maxPages:25}),t={};return s.forEach(i=>{const a=i.category||"Uncategorized";t[a]=(t[a]||0)+1}),Object.entries(t).map(([i,a])=>({name:i,value:a})).sort((i,a)=>a.value-i.value).slice(0,8)}}),{data:bs}=q({queryKey:["admin-total-users"],queryFn:async()=>{const{count:s,error:t}=await y.from("profiles").select("id",{count:"exact",head:!0});if(t)throw t;return s||0}}),{data:Ge}=q({queryKey:["admin-recent-signups"],queryFn:async()=>{const{data:s,error:t}=await y.from("profiles").select("id, email, full_name, created_at").order("created_at",{ascending:!1}).limit(5);if(t)throw t;return s||[]}}),{data:We}=q({queryKey:["admin-top-faq-pages",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie();let i=y.from("faq_views").select("faq_id, user_agent").gte("created_at",s).lte("created_at",t);c.length>0&&(i=i.in("city_id",c));const{data:a,error:r}=await i;if(r)throw r;const l=(a==null?void 0:a.filter(n=>!re(n.user_agent)))||[],u={};l.forEach(n=>{u[n.faq_id]=(u[n.faq_id]||0)+1});const p=Object.entries(u).sort((n,h)=>h[1]-n[1]).slice(0,10).map(([n])=>n);if(p.length===0)return[];const{data:g,error:d}=await y.from("location_faqs").select("id, question, slug, volume, cities(name)").in("id",p);if(d)throw d;return(g==null?void 0:g.map(n=>{var h;return{id:n.id,question:n.question,slug:n.slug,volume:n.volume,cityName:((h=n.cities)==null?void 0:h.name)||"",views:u[n.id]||0}}).sort((n,h)=>h.views-n.views))||[]}}),{data:Qe}=q({queryKey:["admin-faq-conversions",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie();let i=y.from("faq_to_business_clicks").select("faq_id, destination_category").gte("created_at",s).lte("created_at",t);c.length>0&&(i=i.in("city_id",c));const{data:a,error:r}=await i;if(r)throw r;const l={};return a==null||a.forEach(u=>{l[u.destination_category]=(l[u.destination_category]||0)+1}),{total:(a==null?void 0:a.length)||0,byCategory:l}}}),{data:Xe}=q({queryKey:["admin-daily-page-views",o,f,C,c,_],queryFn:async()=>{const{startTs:s,endTs:t}=ie(),i=[];let a=0;const r=1e3;let l=!0;for(;l;){let d=y.from("page_views").select("created_at, user_agent").gte("created_at",s).lte("created_at",t).range(a,a+r-1);c.length>0&&(d=d.in("city_id",c));const{data:n,error:h}=await d;if(h){console.error("Error fetching daily page views:",h);break}n&&n.length>0?(i.push(...n),a+=r,l=n.length===r):l=!1}const u=i.filter(d=>!re(d.user_agent)),p={};u.forEach(d=>{var h;const n=(h=d.created_at)==null?void 0:h.split("T")[0];n&&(p[n]=(p[n]||0)+1)});const g=d=>{try{const n=new Date(d);return isNaN(n.getTime())?d:A(n,"MMM d")}catch{return d}};return Object.entries(p).map(([d,n])=>({date:d,displayDate:g(d),views:n})).sort((d,n)=>d.date.localeCompare(n.date))}}),vs=s=>{try{const t=new Date(s);return isNaN(t.getTime())?s:A(t,"MMM d")}catch{return s}};F.useMemo(()=>{let s=0,t=0;const i={};return Ee==null||Ee.forEach(a=>{a.event_type==="view"||a.event_type==="views"?(s+=a.count,a.event_date&&!i[a.event_date]&&(i[a.event_date]={date:a.event_date,displayDate:vs(a.event_date),views:0}),a.event_date&&(i[a.event_date].views+=a.count)):a.event_type.includes("form")&&(t+=a.count)}),{totalViews:s,totalSubmissions:t,dailyViews:Object.values(i)}},[Ee]);const ce=({title:s,value:t,previousValue:i,icon:a,color:r,showComparison:l=!0})=>{const u=i!==void 0?ys(t,i):0,p=k==="previous"&&l&&i!==void 0;return e.jsxs(R,{className:"relative overflow-hidden",children:[e.jsx("div",{className:`absolute top-2 right-2 p-2 rounded-full ${r}`,children:e.jsx(a,{className:"h-4 w-4"})}),e.jsxs(G,{className:"p-4 pt-3",children:[e.jsx("p",{className:"text-sm text-muted-foreground pr-10",children:s}),e.jsx("p",{className:"text-2xl font-bold mt-1",children:t.toLocaleStr
1ing()}),p&&e.jsxs("div",{className:Ye("flex items-center gap-1 text-xs mt-1",u>=0?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"),children:[u>=0?e.jsx(Oe,{className:"h-3 w-3"}):e.jsx(tt,{className:"h-3 w-3"}),e.jsxs("span",{children:[Math.abs(u).toFixed(1),"%"]}),e.jsxs("span",{className:"text-muted-foreground",children:["(",i==null?void 0:i.toLocaleString(),")"]})]})]})]})},Ns=F.useMemo(()=>{const{startDate:s,endDate:t}=Y(),{startTs:i,endTs:a}=ie();return{startDate:s,endDate:t,startTs:i,endTs:a}},[o,f,C]);return x?e.jsx(lt,{cityId:x.cityId,cityName:x.cityName,domain:x.domain,dateRange:Ns,onBack:()=>S(null)}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold",children:"Platform Analytics"}),e.jsxs("p",{className:"text-muted-foreground",children:["Overview of platform performance across ",(v==null?void 0:v.length)||0," sites"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ks,{className:"h-4 w-4 text-muted-foreground"}),e.jsxs(Je,{value:o,onValueChange:s=>se(s),children:[e.jsx(Ze,{className:"w-40",children:e.jsx(es,{})}),e.jsxs(ss,{children:[e.jsx(J,{value:"7",children:"Last 7 days"}),e.jsx(J,{value:"30",children:"Last 30 days"}),e.jsx(J,{value:"90",children:"Last 90 days"}),e.jsx(J,{value:"180",children:"Last 180 days"}),e.jsx(J,{value:"365",children:"Last year"}),e.jsx(J,{value:"custom",children:"Custom range"})]})]}),o==="custom"&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(ts,{children:[e.jsx(is,{asChild:!0,children:e.jsx($,{variant:"outline",size:"sm",children:f?A(f,"MMM d"):"Start"})}),e.jsx(as,{className:"w-auto p-0",align:"start",children:e.jsx(us,{mode:"single",selected:f,onSelect:T,className:"pointer-events-auto"})})]}),e.jsx("span",{className:"text-muted-foreground",children:"to"}),e.jsxs(ts,{children:[e.jsx(is,{asChild:!0,children:e.jsx($,{variant:"outline",size:"sm",children:C?A(C,"MMM d"):"End"})}),e.jsx(as,{className:"w-auto p-0",align:"start",children:e.jsx(us,{mode:"single",selected:C,onSelect:ve,className:"pointer-events-auto"})})]})]}),e.jsxs(Es,{children:[e.jsx(Bs,{asChild:!0,children:e.jsxs($,{variant:"destructive",size:"sm",disabled:z,children:[e.jsx(Ws,{className:"mr-2 h-4 w-4"}),"Clear All Stats"]})}),e.jsxs(Fs,{children:[e.jsxs(Os,{children:[e.jsx(zs,{children:"Clear all analytics data?"}),e.jsx(Ps,{children:"This will permanently delete all page views, listing views, and listing clicks data. This cannot be undone."})]}),e.jsxs(Ks,{children:[e.jsx(Is,{children:"Cancel"}),e.jsx(As,{onClick:w,children:"Yes, clear everything"})]})]})]}),e.jsxs(Je,{value:k,onValueChange:s=>U(s),children:[e.jsxs(Ze,{className:"w-44",children:[e.jsx(Qs,{className:"h-4 w-4 mr-2"}),e.jsx(es,{})]}),e.jsxs(ss,{children:[e.jsx(J,{value:"none",children:"No Comparison"}),e.jsx(J,{value:"previous",children:"vs Previous Period"})]})]})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ns,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"Filter by Site:"}),e.jsxs(ts,{open:Ie,onOpenChange:Ne,children:[e.jsx(is,{asChild:!0,children:e.jsxs($,{variant:"outline",size:"sm",className:"min-w-[200px] justify-between",children:[c.length===0?"All Sites":c.length===1?cs[0]:`${c.length} sites selected`,e.jsx(Cs,{className:"h-4 w-4 ml-2 opacity-50"})]})}),e.jsxs(as,{className:"w-[300px] p-0",align:"start",children:[e.jsxs("div",{className:"p-2 border-b border-border flex gap-2",children:[e.jsx($,{variant:"ghost",size:"sm",onClick:fs,className:"flex-1",children:"Select All"}),e.jsx($,{variant:"ghost",size:"sm",onClick:ls,className:"flex-1",children:"Clear All"})]}),e.jsx(Ms,{className:"h-[300px]",children:e.jsx("div",{className:"p-2 space-y-1",children:v==null?void 0:v.map(s=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded-md hover:bg-muted cursor-pointer",onClick:()=>
1$e(s.id),children:[e.jsx(Ds,{checked:c.includes(s.id),onCheckedChange:()=>$e(s.id)}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s.domain})]})]},s.id))})})]})]}),c.length>0&&c.length<=5&&e.jsx("div",{className:"flex flex-wrap gap-1",children:cs.map((s,t)=>e.jsxs(je,{variant:"secondary",className:"gap-1",children:[s,e.jsx(Ss,{className:"h-3 w-3 cursor-pointer hover:text-destructive",onClick:()=>{const i=v==null?void 0:v.find(a=>a.name===s);i&&$e(i.id)}})]},t))}),c.length>5&&e.jsx($,{variant:"ghost",size:"sm",onClick:ls,children:"Clear selection"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-8 gap-4",children:[e.jsx(ce,{title:"Page Views",value:I.pageViews,previousValue:ke.pageViews,icon:Ke,color:"bg-orange-100 text-orange-600 dark:bg-orange-900/30 dark:text-orange-400"}),e.jsx(ce,{title:"Unique Visitors",value:I.uniqueVisitors,previousValue:ke.uniqueVisitors,icon:hs,color:"bg-indigo-100 text-indigo-600 dark:bg-indigo-900/30 dark:text-indigo-400"}),e.jsx(ce,{title:"Listing Views",value:I.listingViews,previousValue:ke.listingViews,icon:Ke,color:"bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400"}),e.jsx(ce,{title:"Clicks",value:I.listingClicks,previousValue:ke.listingClicks,icon:Fe,color:"bg-purple-100 text-purple-600 dark:bg-purple-900/30 dark:text-purple-400"}),e.jsx(ce,{title:"Leads",value:I.leads,previousValue:ke.leads,icon:Ts,color:"bg-teal-100 text-teal-600 dark:bg-teal-900/30 dark:text-teal-400"}),e.jsx(ce,{title:"Total Businesses",value:I.totalBusinesses,icon:Xs,color:"bg-slate-100 text-slate-600 dark:bg-slate-900/30 dark:text-slate-400",showComparison:!1}),e.jsx(ce,{title:"Claimed",value:I.claimedBusinesses,icon:Ys,color:"bg-green-100 text-green-600 dark:bg-green-900/30 dark:text-green-400",showComparison:!1}),e.jsx(ce,{title:"Total Users",value:bs||0,icon:Vs,color:"bg-rose-100 text-rose-600 dar
1k:bg-rose-900/30 dark:text-rose-400",showComparison:!1})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(ns,{className:"h-4 w-4"}),"Analytics by Site",e.jsxs(je,{variant:"outline",className:"ml-2",children:[K.length," sites"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Click a row to see detailed analytics"})]}),ne>1&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsxs("span",{children:["Page ",D," of ",ne]}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx($,{variant:"outline",size:"icon",className:"h-7 w-7",onClick:()=>te(s=>Math.max(1,s-1)),disabled:D===1,children:e.jsx(Js,{className:"h-4 w-4"})}),e.jsx($,{variant:"outline",size:"icon",className:"h-7 w-7",onClick:()=>te(s=>Math.min(ne,s+1)),disabled:D===ne,children:e.jsx(qs,{className:"h-4 w-4"})})]})]})]})}),e.jsx(G,{children:K.length>0?e.jsxs(e.Fragment,{children:[e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(H,{column:"cityName",align:"left",children:"Site"}),e.jsx(H,{column:"domain",align:"left",children:"Domain"}),e.jsx(H,{column:"totalBusinesses",align:"right",children:"Businesses"}),e.jsx(H,{column:"claimedBusinesses",align:"right",children:"Claimed"}),e.jsx(H,{column:"pageViews",align:"right",children:"Page Views"}),e.jsx(H,{column:"uniqueVisitors",align:"right",children:"Visitors"}),e.jsx(H,{column:"listingViews",align:"right",children:"Listing Views"}),e.jsx(H,{column:"listingClicks",align:"right",children:"Clicks"}),e.jsx(H,{column:"leads",align:"right",children:"Leads"})]})}),e.jsxs(be,{children:[ws.map(s=>e.jsxs(W,{className:"cursor-pointer hover:bg-muted/50 transition-colors",onClick:()=>S({cityId:s.cityId,cityName:s.cityName,domain:s.domain}),children:[e.jsx(j,{className:"font-medium",children:s.cityName}),e.jsx(j,{className:"text-muted-foreground text-sm",children:s.domain}),e.jsx(j,{className:"text-right",children:s.totalBusinesses.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.claimedBusinesses.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.pageViews.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.uniqueVisitors.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.listingViews.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.listingClicks.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.leads.toLocaleString()})]},s.cityId)),e.jsxs(W,{className:"bg-muted/50 font-semibold border-t-2",children:[e.jsxs(j,{children:["Total (",K.length," sites)"]}),e.jsx(j,{}),e.jsx(j,{className:"text-right",children:I.totalBusinesses.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.claimedBusinesses.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.pageViews.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.uniqueVisitors.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.listingViews.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.listingClicks.toLocaleString()}),e.jsx(j,{className:"text-right",children:I.leads.toLocaleString()})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between mt-4 pt-4 border-t",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Showing ",O==="all"?1:(D-1)*O+1," to"," ",O==="all"?K.length:Math.min(D*O,K.length)," of ",K.length," sites"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:"Rows:"}),e.jsxs(Je,{value:String(O),onValueChange:s=>{De(s==="all"?"all":Number(s)),te(1)},children:[e.jsx(Ze,{className:"w-[80px] h-8",children:e.jsx(es,{})}),e.jsxs(ss,{children:[e.jsx(J,{value:"25",children:"25"}),e.jsx(J,{value:"50",children:"50"}),e.jsx(J,{value:"100",children:"100"}),e.jsx(J,{value:"all",children:"All"})]})]})]})]}),ne>1&&e.jsxs("div",{className:"flex gap-1",children:[e.jsx($,{variant:"outline",size:"sm",onClick:()=>te(1),disabled:D===1,children:"First"}),e.jsx($,{variant:"outline",size:"sm",onClick:()=>te(s=>Math.max(1,s-1)),disabled:D===1,children:"Previous"}),e.jsx($,{variant:"outline",size:"sm",onClick:()=>te(s=>Math.min(ne,s+1)),disabled:D===ne,children:"Next"}),e.jsx($,{variant:"outline",size:"sm",onClick:()=>te(ne),disabled:D===ne,children:"Last"})]})]})]}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No data available for selected filters"})})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium",children:["Page Views Over Time",c.length>0&&e.jsxs("span",{className:"font-normal text-muted-foreground ml-2",children:["(",c.length," site",c.length>
11?"s":""," selected)"]}),k==="previous"&&e.jsx("span",{className:"font-normal text-muted-foreground ml-2",children:"(vs previous period)"})]})}),e.jsx(G,{children:e.jsx("div",{className:"h-[300px]",children:Xe&&Xe.length>0?e.jsx(Ce,{width:"100%",height:"100%",children:e.jsxs(Us,{data:Xe.map((s,t)=>{var i;return{...s,prevViews:k==="previous"&&((i=_e==null?void 0:_e[t])==null?void 0:i.views)}}),children:[e.jsx(Se,{strokeDasharray:"3 3",className:"stroke-muted"}),e.jsx(Te,{dataKey:"displayDate",tick:{fontSize:12}}),e.jsx(Ve,{tick:{fontSize:12}}),e.jsx(qe,{contentStyle:{backgroundColor:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:"8px"},formatter:(s,t)=>[(s==null?void 0:s.toLocaleString())||0,t==="views"?"Current Period":"Previous Period"]}),k==="previous"&&_e&&_e.length>0&&e.jsx(ms,{type:"monotone",dataKey:"prevViews",stroke:"hsl(var(--primary))",strokeWidth:1,strokeDasharray:"5 5",strokeOpacity:.5,dot:!1,name:"Previous Period"}),e.jsx(ms,{type:"monotone",dataKey:"views",stroke:"hsl(var(--primary))",strokeWidth:2,dot:!1,name:"Current Period"})]})}):e.jsx("div",{className:"h-full flex items-center justify-center text-muted-foreground",children:"No page views data for selected period"})})})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsx(ee,{className:"text-sm font-medium",children:"Top 10 Sites by Page Views"})}),e.jsx(G,{children:e.jsx("div",{className:"h-[300px]",children:K.length>0?e.jsx(Ce,{width:"100%",height:"100%",children:e.jsxs(ze,{data:[...K].sort((s,t)=>t.pageViews-s.pageViews).slice(0,10),layout:"vertical",children:[e.jsx(Se,{strokeDasharray:"3 3",className:"stroke-muted"}),e.jsx(Te,{type:"number",tick:{fontSize:12}}),e.jsx(Ve,{dataKey:"cityName",type:"category",tick:{fontSize:11},width:120}),e.jsx(qe,{contentStyle:{backgroundColor:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:"8px"},formatter:(s,t)=>[s.toLocaleString(),t==="pageViews"?"Page Views":t]}),e.jsx(Pe,{dataKey:"pageViews",fill:"hsl(var(--primary))",radius:[0,4,4,0],name:"Page Views"})]})}):e.jsx("div",{className:"h-full flex items-center justify-center text-muted-foreground",children:"No data for selected period"})})})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsx(ee,{className:"text-sm font-medium",children:"Businesses by Category"})}),e.jsx(G,{children:e.jsx("div",{className:"h-[300px]",children:Re&&Re.length>0?e.jsx(Ce,{width:"100%",height:"100%",children:e.jsxs(ze,{data:Re,layout:"vertical",margin:{left:10,right:30},children:[e.jsx(Se,{strokeDasharray:"3 3",className:"stroke-muted"}),e.jsx(Te,{type:"number",tick:{fontSize:11}}),e.jsx(Ve,{dataKey:"name",type:"category",tick:{fontSize:11},width:100}),e.jsx(qe,{contentStyle:{backgroundColor:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:"8px"},formatter:s=>[s.toLocaleString(),"Businesses"]}),e.jsx(Pe,{dataKey:"value",fill:"hsl(var(--primary))",radius:[0,4,4,0]})]})}):e.jsx("div",{className:"h-full flex items-center justify-center text-muted-foreground",children:"No data available"})})})]}),e.jsxs(R,{className:"lg:col-span-2",children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Oe,{className:"h-4 w-4"}),"Top Performing Businesses"]})}),e.jsx(G,{children:He&&He.length>0?e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(B,{children:"Business Name"}),e.jsx(B,{children:"Site"}),e.jsx(B,{className:"text-right",children:"Views"}),e.jsx(B,{className:"text-right",children:"Clicks"}),e.jsx(B,{className:"text-right",children:"Leads"})]})}),e.jsx(be,{children:He.map(s=>e.jsxs(W,{children:[e.jsx(j,{className:"font-medium",children:s.name}),e.jsx(j,{className:"text-muted-foreground",children:s.siteName||"—"}),e.jsx(j,{className:"text-right",children:s.views.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.clicks.toLocaleString()}),e.jsx(j,{className:"text-right",children:s.submissions.toLocaleString()})]},s.id))})]}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No anal
1ytics data for selected period"})})]})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(hs,{className:"h-4 w-4"}),"Recent Signups"]})}),e.jsx(G,{children:Ge&&Ge.length>0?e.jsx("div",{className:"space-y-3",children:Ge.map(s=>e.jsxs("div",{className:"flex items-center justify-between py-2 border-b border-border/50 last:border-0",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s.full_name||"No name"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.email})]}),e.jsx("span",{className:"text-sm text-muted-foreground",children:A(new Date(s.created_at),"MMM d, yyyy")})]},s.id))}):e.jsx("p",{className:"py-4 text-center text-muted-foreground",children:"No recent signups"})})]}),e.jsxs(R,{children:[e.jsx(Z,{className:"pb-2",children:e.jsxs(ee,{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(Zs,{className:"h-4 w-4"}),"Top Guide Pages",Qe&&Qe.total>0&&e.jsxs(je,{variant:"secondary",className:"ml-auto",children:[Qe.total," conversions"]})]})}),e.jsx(G,{children:We&&We.length>0?e.jsxs(ye,{children:[e.jsx(we,{children:e.jsxs(W,{children:[e.jsx(B,{children:"Question"}),e.jsx(B,{children:"Site"}),e.jsx(B,{className:"text-right",children:"Views"}),e.jsx(B,{className:"text-right",children:"Search Vol"})]})}),e.jsx(be,{children:We.slice(0,5).map(s=>{var t;return e.jsxs(W,{children:[e.jsx(j,{className:"font-medium max-w-[300px] truncate",children:s.question}),e.jsx(j,{className:"text-muted-foreground",children:s.cityName||"—"}),e.jsx(j,{className:"text-right",children:s.views.toLocaleString()}),e.jsx(j,{className:"text-right text-muted-foreground",children:((t=s.volume)==null?void 0:t.toLocaleString())||"—"})]},s.id)})})]}):e.jsx("div",{className:"py-8 text-center text-muted-foreground",children:"No FAQ page views for selected period"})})]})]})}export{Wt as default};

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.