PageSourceSearch

https://porncompanions.com/assets/AdminPaymentPlans-CziBfOcx.js

js porncompanions.com collected 2026-10-02 14:57:39 UTC 5,093 bytes, 1 lines download raw bytes

1import{j as e,Q as o,aH as N,aI as S,aJ as T,aK as w,a9 as n,I as c,b as k,c as P,d as D,e as E,f as j,aM as I,s as h,V as d}from"./index-DUpyFvrn.js";import{r as x}from"./recharts-BP1V14u_.js";import{S as p}from"./switch-ebkPFhxQ.js";import{C as L,a as A,b as q,d as H}from"./card-STmbApQS.js";import{T as M,a as F,b as v,c as i,d as R,e as l}from"./table--HT4J_2_.js";import{T as U}from"./textarea-DyRVJPxl.js";import"./jszip-Dj6QSqRp.js";const V={code:"",label:"",description:"",amount_cents:0,currency:"USD",interval:"one_time",interval_count:1,membership_duration_days:null,active:!0,sort_order:0};function Y(){const[u,y]=x.useState([]),[s,r]=x.useState(null),[b,g]=x.useState(!0),m=async()=>{g(!0);const{data:a,error:t}=await h.from("payment_plans").select("*").order("sort_order");t&&d.error(t.message),y(a??[]),g(!1)};x.useEffect(()=>{m()},[]);const C=async()=>{if(!s)return;const a={...s};if(s.interval!=="one_time"&&!s.membership_duration_days){d.error("Recurring plans require a membership duration");return}if(s.currency.length!==3){d.error("Currency must be a 3-letter code");return}const{error:t}=s.id?await h.from("payment_plans").update(a).eq("id",s.id):await h.from("payment_plans").insert(a);if(t){d.error(t.message);return}d.success("Plan saved"),r(null),m()},f=async a=>{await h.from("payment_plans").update({active:!a.active}).eq("id",a.id),m()},_=(a,t)=>{try{return new Intl.NumberFormat("en-US",{style:"currency",currency:t}).format(a/100)}catch{return`${(a/100).toFixed(2)} ${t}`}};return e.jsxs("div",{className:"container mx-auto p-6 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Payment plans"}),e.jsx(o,{onClick:()=>r({...V}),children:"New plan"})]}),e.jsxs(L,{children:[e.jsx(A,{children:e.jsxs(q,{children:["Plans (",u.length,")"]})}),e.jsx(H,{children:b?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading…"}):e.jsxs(M,{children:[e.jsx(F,{children:e.jsxs(v,{children:[e.jsx(i,{children:"Code"}),e.jsx(i,{children:"Label"}),e.jsx(i,{children:"Price"}),e.jsx(i,{children:"Interval"}),e.jsx(i,{children:"Duration (days)"}),e.jsx(i,{children:"Active"}),e.jsx(i,{})]})}),e.jsxs(R,{children:[u.map(a=>e.jsxs(v,{children:[e.jsx(l,{className:"font-mono text-xs",children:a.code}),e.jsx(l,{children:a.label}),e.jsx(l,{children:_(a.amount_cents,a.currency)}),e.jsx(l,{children:a.interval}),e.jsx(l,{children:a.membership_duration_days??"—"}),e.jsx(l,{children:e.jsx(p,{checked:a.active,onCheckedChange:()=>f(a)})}),e.jsx(l,{children:e.jsx(o,{variant:"ghost",size:"sm",onClick:()=>r({...a}),children:"Edit"})})]},a.id)),u.length===0&&e.jsx(v,{children:e.jsx(l,{colSpan:7,className:"text-center text-muted-foreground",children:"No plans yet."})})]})]})})]}),e.jsx(N,{open:!!s,onOpenChange:a=>!a&&r(null),children:e.jsxs(S,{className:"max-w-lg",children:[e.jsx(T,{children:e.jsx(w,{children:s!=null&&s.id?"Edit plan":"New plan"})}),s&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Code (unique)"}),e.jsx(c,{value:s.code,onChange:a=>r({...s,code:a.target.value.toLowerCase().replace(/[^a-z0-9_]/g,"_")})})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Label"}),e.jsx(c,{value:s.label,onChange:a=>r({...s,label:a.target.value})})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Description"}),e.jsx(U,{value:s.description??"",onChange:a=>r({...s,description:a.target.value})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Amount (cents)"}),e.jsx(c,{type:"number",min:0,value:s.amount_cents,onChange:a=>r({...s,amount_cents:Number(a.target.value)})})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Currency (3-letter)"}),e.jsx(c,{maxLength:3,value:s.currency,onChange:a=>r({...s,currency:a.target.value.toUpperCase()})})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Interval"}),e.jsxs(k,{value:s.interval,onValueChange:a=>r({...s,interval:a}),children:[e.jsx(P,{children:e.jsx(D,{})}),e.jsxs(E,{children:[e.jsx(j,{value:"one_time",children:"One-time"}),e.jsx(j,{value:"annual",children:"Annual"}),e.jsx(j,{value:"monthly",children:"Monthly"})]})]})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Membership duration (days)"}),e.jsx(c,{type:"number",min:1,value:s.membership_duration_days??"",placeholder:s.interval==="one_time"?"blank = lifetime":"required",onChange:a=>r({...s,membership_duration_days:a.target.value?Number(a.target.value):null})})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Sort order"}),e.jsx(c,{type:"number",value:s.sort_order,onChange:a=>r({...s,sort_order:Number(a.target.value)})})]}),e.jsxs("div",{className:"flex items-end gap-2",children:[e.jsx(p,{checked:s.active,onCheckedChange:a=>r({...s,active:a})}),e.jsx(n,{children:"Active"})]})]})]}),e.jsxs(I,{children:[e.jsx(o,{variant:"ghost",onClick:()=>r(null),children:"Cancel"}),e.jsx(o,{onClick:C,children:"Save"})]})]})})]})}export{Y 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.