1import{c as ce,r as i,s as F,z as B,j as e,q as u,l as $,S as H,w as de,v as oe,U as xe}from"./index-BLhVDQc-.js";import{C as f,a as y,b as N,c as g}from"./card-BvRELbOp.js";import{B as I}from"./badge-Dnp4vARG.js";import{I as me}from"./input-DEtobceX.js";import{L as j}from"./label-DPuU5dB6.js";import{S as C,a as D,b as T,c as k,d as x}from"./select-DMmXCdeL.js";import{T as te,a as ie,b as q,c as d,d as re,e as o}from"./table-BFreQIZA.js";import{D as he,a as ue,b as je,c as pe,e as fe,f as ge}from"./dialog-CAWyJL1n.js";import{T as ve,a as ye,b as G,c as J}from"./tabs-Co1pwA6c.js";import{s as Ne,a as _e,e as be,f as _,C as Y,b as Q}from"./calendar-CC-qYJjr.js";import{P as W,a as X,b as Z}from"./popover-C9q4vKmI.js";import{F as we}from"./filter-B-Q62lJm.js";import{C as K}from"./calendar-C4VY7eBV.js";import{R as le}from"./refresh-cw-BrTRsioG.js";import{T as Se}from"./triangle-alert-CaLyxqVz.js";import{K as Ce}from"./key-BnVTfOXR.js";import{A as ee}from"./arrow-left-BhrjJlvc.js";import{C as se}from"./credit-card-BSqo3k8K.js";import{F as De}from"./file-text-BXemc2FZ.js";import"./index-BOZcxEjx.js";import"./index-DSQvConV.js";import"./chevron-left-BGsp5ZCN.js";/** 2 * @license lucide-react v0.462.0 - ISC 3 * 4 * This source code is licensed under the ISC license. 5 * See the LICENSE file in the root directory of this source tree. 6 */const Te=ce("SquarePen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]]),ke=[{value:"all",label:"All Events"},{value:"api_key_created",label:"API Key Created"},{value:"api_key_updated",label:"API Key Updated"},{value:"api_key_deleted",label:"API Key Deleted"},{value:"suspicious_api_activity",label:"â ï¸ Suspicious Activity"}];function Pe(){const[h,P]=i.useState([]),[b,w]=i.useState([]),[L,p]=i.useState(!0),[S,O]=i.useState("all"),[v,l]=i.useState("all"),[m,t]=i.useState(Ne(new Date,30)),[c,R]=i.useState(new Date);i.useEffect(()=>{E(),A()},[]),i.useEffect(()=>{A()},[S,v,m,c]);const E=async()=>{const{data:a,error:n}=await F.from("sites").select("id, domain, name").order("domain");!n&&a&&w(a)},A=async()=>{p(!0);let a=F.from("security_audit_logs").select(` 7 *, 8 profiles:user_id ( 9 email, 10 full_name 11 ), 12 sites:site_id ( 13 domain, 14 name 15 ) 16 `).gte("created_at",_e(m).toISOString()).lte("created_at",be(c).toISOString()).order("created_at",{ascending:!1}).limit(100);S!=="all"&&(a=a.eq("event_type",S)),v!=="all"&&(a=a.eq("site_id",v));const{data:n,error:s}=await a;s?(console.error("Error fetching audit logs:",s),B.error("Failed to load audit logs")):P(n),p(!1)},U=a=>{const n={api_key_created:"default",api_key_updated:"secondary",api_key_deleted:"destructive",suspicious_api_activity:"destructive"},s={api_key_created:"Created",api_key_updated:"Updated",api_key_deleted:"Deleted",suspicious_api_activity:"â ï¸ Suspicious"};return e.jsx(I,{variant:n[a]||"outline",children:s[a]||a})},V=a=>
16{if(!a||Object.keys(a).length===0)return"-";const n=a.key_name,s=a.key_prefix;return n?e.jsxs("div",{className:"text-sm",children:[e.jsx("span",{className:"font-medium",children:n}),s&&e.jsxs("span",{className:"text-muted-foreground ml-2",children:["(",s,"...)"]})]}):e.jsx("span",{className:"text-xs text-muted-foreground",children:JSON.stringify(a)})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs(f,{children:[e.jsx(y,{className:"pb-4",children:e.jsxs(N,{className:"text-lg flex items-center gap-2",children:[e.jsx(we,{className:"w-5 h-5"}),"Filters"]})}),e.jsxs(g,{children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Event Type"}),e.jsxs(C,{value:S,onValueChange:O,children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsx(k,{children:ke.map(a=>e.jsx(x,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Site"}),e.jsxs(C,{value:v,onValueChange:l,children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsxs(k,{children:[e.jsx(x,{value:"all",children:"All Sites"}),b.map(a=>e.jsx(x,{value:a.id,children:a.domain},a.id))]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Start Date"}),e.jsxs(W,{children:[e.jsx(X,{asChild:!0,children:e.jsxs(u,{variant:"outline",className:$("w-full justify-start text-left font-normal",!m&&"text-muted-foreground"),children:[e.jsx(K,{className:"mr-2 h-4 w-4"}),m?_(m,"PPP"):"Pick a date"]})}),e.jsx(Z,{className:"w-auto p-0",align:"start",children:e.jsx(Y,{mode:"single",selected:m,onSelect:a=>a&&t(a),initialFocus:!0})})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"End Date"}),e.jsxs(W,{children:[e.jsx(X,{asChild:!0,children:e.jsxs(u,{variant:"outline",className:$("w-full justify-start text-left font-normal",!c&&"text-muted-foreground"),children:[e.jsx(K,{className:"mr-2 h-4 w-4"}),c?_(c,"PPP"):"Pick a date"]})}),e.jsx(Z,{className:"w-auto p-0",align:"start",children:e.jsx(Y,{mode:"single",selected:c,onSelect:a=>a&&R(a),initialFocus:!0})})]})]})]}),e.jsx("div",{className:"flex justify-end mt-4",children:e.jsxs(u,{variant:"outline",size:"sm",onClick:A,children:[e.jsx(le,{className:"w-4 h-4 mr-2"}),"Refresh"]})})]})]}),e.jsxs(f,{children:[e.jsx(y,{children:e.jsxs(N,{className:"flex items-center gap-2",children:[e.jsx(H,{className:"w-5 h-5"}),"Security Audit Logs",e.jsxs(I,{variant:"outline",className:"ml-2",children:[h.length," events"]})]})}),e.jsx(g,{children:L?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary"})}):h.length===0?e.jsxs("div",{className:"text-center py-12",children:[e.jsx(Se,{className:"w-12 h-12 mx-auto text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"No audit logs found"}),e.jsx("p",{className:"text-muted-foreground",children:"No security events match your current filters."})]}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(te,{children:[e.jsx(ie,{children:e.jsxs(q,{children:[e.jsx(d,{children:"Timestamp"}),e.jsx(d,{children:"Event"}),e.jsx(d,{children:"User"}),e.jsx(d,{children:"Site"}),e.jsx(d,{children:"Resource"}),e.jsx(d,{children:"Details"})]})}),e.jsx(re,{children:h.map(a=>{var n,s,r,M;return e.jsxs(q,{children:[e.jsxs(o,{className:"whitespace-nowrap",children:[e.jsx("div",{className:"text-sm",children:_(new Date(a.created_at),"MMM d, yyyy")}),e.jsx("div",{className:"text-xs text-muted-foreground",children:_(new Date(a.created_at),"HH:mm:ss")})]}),e.jsx(o,{children:U(a.event_type)}),e.jsxs(o,{children:[e.jsx("div",{className:"text-sm",children:((n=a.profiles)==null?void 0:n.full_name)||"Unknown"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:((s=a.profiles)==null?void 0:s.email)||a.user_id.slice(0,8)+"..."})]}),e.jsx(o,{children:e.jsx("div",{className:"text-sm",children:((r=a.sites)==null?void 0:r.domain)||"-"})}),e.jsx(o,{children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Ce,{className:"w-3.5 h-3.5 text-muted-foreground"}),e.jsxs("span",{className:"text-xs font-mono",children:[(M=a.resource_id)==null?void 0:M.slice(0,8),"..."]})]})}),e.jsx(o,{children:V(a.metadata)})]},a.id)})})]})})})]})]})}const ae=[{tier:0,label:"10K pageviews",price:9},{tier:1,label:"100K pageviews",price:19},{tier:2,label:"500K pageviews",price:49},{tier:3,label:"1M pageviews",price:89},{tier:4,label:"5M pageviews",price:199},{tier:5,label:"10M+ pageviews",price:399}];function Ze(){var n;const{user:h,loading:P}=de(),b=oe(),[w,L]=i.useState(null),[p,S]=i.useState([]),[O,v]=i.useState(!0),[l,m]=i.useState(null),[t,c]=i.useState({plan:"",status:"",pageview_tier:0,billing_period:"",extend_trial_days:0});i.useEffect(()=>{!P&&!h&&b("/auth")},[h,P,b]),i.useEffect(()=>{h&&R()}
16,[h]),i.useEffect(()=>{w&&E()},[w]);const R=async()=>{if(!h)return;const{data:s,error:r}=await F.from("user_roles").select("role").eq("user_id",h.id).maybeSingle();if(r){console.error("Error checking admin role:",r),L(!1);return}L((s==null?void 0:s.role)==="admin"||(s==null?void 0:s.role)==="owner")},E=async()=>{v(!0);const{data:s,error:r}=await F.from("subscriptions").select(` 17 *, 18 profiles:user_id ( 19 email, 20 full_name 21 ) 22 `).order("created_at",{ascending:!1});r?(console.error("Error fetching subscriptions:",r),B.error("Failed to load subscriptions")):S(s),v(!1)},A=s=>{m(s),c({plan:s.plan,status:s.status,pageview_tier:s.pageview_tier,billing_period:s.billing_period,extend_trial_days:0})},U=async()=>{if(!l)return;let s=l.trial_ends_at;t.extend_trial_days>0&&(s=Q(new Date(l.trial_ends_at),t.extend_trial_days).toISOString());const{error:r}=await F.from("subscriptions").update({plan:t.plan,status:t.status,pageview_tier:t.pageview_tier,billing_period:t.billing_period,trial_ends_at:s}).eq("id",l.id);r?(console.error("Error updating subscription:",r),B.error("Failed to update subscription")):(B.success("Subscription updated successfully"),m(null),E())},V=s=>{const r={active:"default",trialing:"secondary",canceled:"destructive",past_due:"destructive"};return e.jsx(I,{variant:r[s]||"outline",children:s})},a=s=>s==="trial"?e.jsx(I,{variant:"outline",children:"Trial"}):e.jsx(I,{variant:"default",children:s});return P||w===null?e.jsx("div",{className:"min-h-screen flex items-center justify-center",children:e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary"})}):w?e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx("header",{className:"border-b bg-card",children:e.jsxs("div",{className:"container mx-auto px-4 py-4 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(H,{className:"w-6 h-6 text-primary"}),e.jsx("h1",{className:"text-xl font-semibold",children:"Admin Panel"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(u,{variant:"outline",size:"sm",onClick:E,children:[e.jsx(le,{className:"w-4 h-4 mr-2"}),"Refresh"]}),e.jsxs(u,{variant:"ghost",size:"sm",onClick:()=>b("/dashboard"),children:[e.jsx(ee,{className:"w-4 h-4 mr-2"}),"Dashboard"]})]})]})}),e.jsx("main",{className:"container mx-auto px-4 py-8",children:e.jsxs(ve,{defaultValue:"subscriptions",className:"space-y-6",children:[e.jsxs(ye,{children:[e.jsxs(G,{value:"subscriptions",className:"gap-2",children:[e.jsx(se,{className:"w-4 h-4"}),"Subscriptions"]}),e.jsxs(G,{value:"audit-logs",className:"gap-2",children:[e.jsx(De,{className:"w-4 h-4"}),"Audit Logs"]})]}),e.jsxs(J,{value:"subscriptions",className:"space-y-8",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[e.jsxs(f,{children:[e.jsx(y,{className:"pb-2",children:e.jsxs(N,{className:"text-sm font-medium text-muted-foreground flex items-center gap-2",children:[e.jsx(xe,{className:"w-4 h-4"}),"Total Users"]})}),e.jsx(g,{children:e.jsx("p",{className:"text-2xl font-bold",children:p.length})})]}),e.jsxs(f,{children:[e.jsx(y,{className:"pb-2",children:e.jsxs(N,{className:"text-sm font-medium text-muted-foreground flex items-center gap-2",children:[e.jsx(K,{className:"w-4 h-4"}),"Active Trials"]})}),e.jsx(g,{children:e.jsx("p",{className:"text-2xl font-bold",children:p.filter(s=>s.plan==="trial"&&new Date(s.trial_ends_at)>new Date).length})})]}),e.jsxs(f,{children:[e.jsx(y,{className:"pb-2",children:e.jsxs(N,{className:"text-sm font-medium text-muted-foreground flex items-center gap-2",children:[e.jsx(se,{className:"w-4 h-4"}),"Paid Subscribers"]}
22)}),e.jsx(g,{children:e.jsx("p",{className:"text-2xl font-bold",children:p.filter(s=>s.plan!=="trial"&&s.status==="active").length})})]}),e.jsxs(f,{children:[e.jsx(y,{className:"pb-2",children:e.jsxs(N,{className:"text-sm font-medium text-muted-foreground flex items-center gap-2",children:[e.jsx(K,{className:"w-4 h-4"}),"Expired Trials"]})}),e.jsx(g,{children:e.jsx("p",{className:"text-2xl font-bold text-destructive",children:p.filter(s=>s.plan==="trial"&&new Date(s.trial_ends_at)<=new Date).length})})]})]}),e.jsxs(f,{children:[e.jsx(y,{children:e.jsx(N,{children:"All Subscriptions"})}),e.jsx(g,{children:O?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary"})}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(te,{children:[e.jsx(ie,{children:e.jsxs(q,{children:[e.jsx(d,{children:"User"}),e.jsx(d,{children:"Plan"}),e.jsx(d,{children:"Status"}),e.jsx(d,{children:"Pageview Tier"}),e.jsx(d,{children:"Trial Ends"}),e.jsx(d,{children:"Created"}),e.jsx(d,{className:"text-right",children:"Actions"})]})}),e.jsx(re,{children:p.map(s=>{var r,M,z;return e.jsxs(q,{children:[e.jsx(o,{children:e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:((r=s.profiles)==null?void 0:r.full_name)||"No name"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:((M=s.profiles)==null?void 0:M.email)||s.user_id})]})}),e.jsx(o,{children:a(s.plan)}),e.jsx(o,{children:V(s.status)}),e.jsx(o,{children:e.jsx("span",{className:"text-sm",children:((z=ae.find(ne=>ne.tier===s.pageview_tier))==null?void 0:z.label)||`Tier ${s.pageview_tier}`})}),e.jsx(o,{children:e.jsx("span",{className:new Date(s.trial_ends_at)<=new Date?"text-destructive":"",children:_(new Date(s.trial_ends_at),"MMM d, yyyy")})}),e.jsx(o,{children:_(new Date(s.created_at),"MMM d, yyyy")}),e.jsx(o,{className:"text-right",children:e.jsx(u,{variant:"ghost",size:"sm",onClick:()=>A(s),children:e.jsx(Te,{className:"w-4 h-4"})})})]},s.id)})})]})})})]})]}),e.jsx(J,{value:"audit-logs",children:e.jsx(Pe,{})})]})}),e.jsx(he,{open:!!l,onOpenChange:()=>m(null),children:e.jsxs(ue,{children:[e.jsxs(je,{children:[e.jsx(pe,{children:"Edit Subscription"}),e.jsx(fe,{children:((n=l==null?void 0:l.profiles)==null?void 0:n.email)||(l==null?void 0:l.user_id)})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Plan"}),e.jsxs(C,{value:t.plan,onValueChange:s=>c({...t,plan:s}),children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsxs(k,{children:[e.jsx(x,{value:"trial",children:"Trial"}),e.jsx(x,{value:"starter",children:"Starter"}),e.jsx(x,{value:"growth",children:"Growth"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Status"}),e.jsxs(C,{value:t.status,onValueChange:s=>c({...t,status:s}),children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsxs(k,{children:[e.jsx(x,{value:"active",children:"Active"}),e.jsx(x,{value:"canceled",children:"Canceled"}),e.jsx(x,{value:"past_due",children:"Past Due"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Pageview Tier"}),e.jsxs(C,{value:t.pageview_tier.toString(),onValueChange:s=>c({...t,pageview_tier:parseInt(s)}),children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsx(k,{children:ae.map(s=>e.jsxs(x,{value:s.tier.toString(),children:[s.label," - $",s.price,"/mo"]},s.tier))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Billing Period"}),e.jsxs(C,{value:t.billing_period,onValueChange:s=>c({...t,billing_period:s}),children:[e.jsx(D,{children:e.jsx(T,{})}),e.jsxs(k,{children:[e.jsx(x,{value:"monthly",children:"Monthly"}),e.jsx(x,{value:"annual",children:"Annual"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Extend Trial (days)"}),e.jsx(me,{type:"number",min:"0",value:t.extend_trial_days,onChange:s=>c({...t,extend_trial_days:parseInt(s.target.value)||0}),placeholder:"0"}),t.extend_trial_days>0&&l&&e.jsxs("p",{className:"text-sm text-muted-foreground",children:["New trial end: ",_(Q(new Date(l.trial_ends_at),t.extend_trial_days),"MMM d, yyyy")]})]})]}),e.jsxs(ge,{children:[e.jsx(u,{variant:"outline",onClick:()=>m(null),children:"Cancel"}),e.jsx(u,{onClick:U,children:"Save Changes"})]})]})})]}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:e.jsx(f,{className:"max-w-md",children:e.jsxs(g,{className:"pt-6 text-center",children:[e.jsx(H,{className:"w-16 h-16 mx-auto text-destructive mb-4"}),e.jsx("h2",{className:"text-xl font-semibold mb-2",children:"Access Denied"}),e.jsx("p",{className:"text-muted-foreground mb-4",children:"You don't have permission to access the admin panel."}),e.jsxs(u,{onClick:()=>
22b("/dashboard"),children:[e.jsx(ee,{className:"w-4 h-4 mr-2"}),"Back to Dashboard"]})]})})})}export{Ze 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.