PageSourceSearch

https://nsketch.ai/assets/billing-Dp920-9o.js

js nsketch.ai collected 2026-10-05 12:20:18 UTC 13,789 bytes, 1 lines download raw bytes

1import{a as e}from"./chunk-Cyuzqnbw.js";import{t}from"./react-hOUQDXBo.js";import{t as n}from"./jsx-runtime-CXk3X59i.js";import{J as r,t as i}from"./index-C0yy3Chk.js";import{c as a,t as o}from"./api-DmRlxYBM.js";import{t as s}from"./img-C4B7T8q3.js";import{t as c}from"./index-DD-KJ2LK.js";import{t as l}from"./createLucideIcon-BhWRccz-.js";import{t as u}from"./arrow-left-Brbj-OM7.js";import{t as d}from"./calendar-CoAN0eE1.js";import{t as f}from"./clock-ClCcr8DW.js";import{t as p}from"./coins-BSnMexqw.js";import{t as m}from"./cpu-Raz8D5Ta.js";import{t as h}from"./credit-card-CJ0vTH1v.js";import{t as g}from"./external-link-ryBPcTRo.js";import{t as _}from"./settings-CxalnFT_.js";import{t as v}from"./smartphone-6QMuiBIn.js";import{t as y}from"./separator-CJ3oEQr0.js";import{a as b,n as x,o as S,t as C}from"./card-boPmWYoz.js";import{t as w}from"./badge-CRLMHWp9.js";var T=l(`crown`,[[`path`,{d:`M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z`,key:`1vdc57`}],[`path`,{d:`M5 21h14`,key:`11awu3`}]]),E=e(t()),D=n(),O=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch subscription`);return t.json()};function k(){let[e,t]=(0,E.useState)(50),n=a(o.users.getCurrentUser),l=a(o.users.getUserCreditsBreakdown),k=a(o.sessions.getUserUsageHistory,{limit:e})??[],{data:A,isLoading:j}=c(`/api/subscription`,O,{revalidateOnFocus:!1,revalidateOnReconnect:!1,shouldRetryOnError:!1}),[M,N]=(0,E.useState)(!1),P=async()=>{N(!0);try{let e=await fetch(`/api/create-portal-session`,{method:`POST`});if(e.ok){let{url:t}=await e.json();window.location.href=t}else console.error(`Failed to create portal session`)}catch(e){console.error(`Error creating portal session:`,e)}finally{N(!1)}},F=e=>new Date(e*1e3).toLocaleDateString(`en-US`,{year:`numeric`,month:`long`,day:`numeric`}),I=e=>{let t=Date.now()-e,n=Math.floor(t/1e3),r=Math.floor(n/60),i=Math.floor(r/60),a=Math.floor(i/24);return a>0?`${a} day${a>1?`s`:``} ago`:i>0?`${i} hour${i>1?`s`:``} ago`:r>0?`${r} minute${r>1?`s`:``} ago`:`just now`},L={totalCreditsUsed:k.reduce((e,t)=>e+(t.credits??0),0),totalImages:k.filter(e=>e.type===`image`).reduce((e,t)=>e+(t.numImages??1),0),totalGenerations:k.length,byType:{image:k.filter(e=>e.type===`image`).length,video:k.filter(e=>e.type===`video`).length,edit:k.filter(e=>e.type===`edit`).length}},R=e=>(0,D.jsx)(w,{variant:{active:`default`,trialing:`secondary`,canceled:`destructive`,incomplete:`secondary`,none:`secondary`}[e]||`secondary`,children:e===`none`?`Free Plan`:e.charAt(0).toUpperCase()+e.slice(1)});if(j)return(0,D.jsx)(`div`,{className:`min-h-screen bg-background p-6`,children:(0,D.jsx)(`div`,{className:`max-w-4xl mx-auto`,children:(0,D.jsxs)(`div`,{className:`animate-pulse space-y-6`,children:[(0,D.jsx)(`div`,{className:`h-8 bg-muted rounded w-1/3`}),(0,D.jsx)(`div`,{className:`h-64 bg-muted rounded`})]})})});let z=n?.subscriptionSource===`revenuecat`&&n?.subscriptionStatus===`active`,B=A?.subscription?.status!==`none`&&[`active`,`trialing`].includes(A?.subscription?.status||``),V=z||B,H=n?.subscriptionStore===`PLAY_STORE`?`Google Play`:`App Store`,U=n?.subscriptionStore===`PLAY_STORE`?`https://play.google.com/store/account/subscriptions`:`https://apps.apple.com/account/subscriptions`,W=e=>{let t=(e||``).toLowerCase();return t===`weekly`||t===`weeklyintro`?`weekly`:t===`annual`||n?.subscriptionInterval===`yearly`?`yearly`:`monthly`},G=(e,t)=>{let r=(e||``).toLowerCase();return!r||r===`free`?`Free`:t===`revenuecat`?r===`weekly`?`${H} Weekly`:r===`weeklyintro`?`${H} Weekly 150`:r===`annual`||n?.subscriptionInterval===`yearly`?`${H} Yearly`:`${H} Monthly`:{starter:`Starter`,starter_legacy:`Starter`,basic:`Basic`,basic_legacy:`Basic`,pro:`Pro`,max:`Max`,max_plus:`Max 9K`,max_ultra:`Max 20K`}[r]||r},K=()=>z&&n?.subscriptionPlan?G(n.subscriptionPlan,`revenuecat`):A?.plan?.name||`Free`,q=Math.max(0,l?.planAvailable??0),J=Math.max(0,l?.additionalAvailable??0),Y=q+J;return(0,D.jsx)(`div`,{className:`min-h-screen bg-background p-6`,children:(0,D.jsxs)(`div`,{className:`max-w-4xl mx-auto 
1space-y-6`,children:[(0,D.jsx)(`div`,{className:`flex items-center gap-4`,children:(0,D.jsx)(i,{asChild:!0,variant:`ghost`,size:`sm`,children:(0,D.jsxs)(r,{href:`/`,children:[(0,D.jsx)(u,{className:`size-4`}),`Back to Dashboard`]})})}),(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(`h1`,{className:`text-3xl font-bold`,children:`Usage & Billing`}),(0,D.jsx)(`p`,{className:`text-muted-foreground`,children:`Manage your subscription, view usage, and billing information.`})]}),(0,D.jsxs)(`div`,{className:`grid gap-6 md:grid-cols-2`,children:[(0,D.jsxs)(C,{children:[(0,D.jsx)(b,{children:(0,D.jsxs)(S,{className:`flex items-center gap-2`,children:[(0,D.jsx)(T,{className:`size-5`}),`Current Plan`]})}),(0,D.jsxs)(x,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,D.jsx)(`span`,{className:`font-medium`,children:K()}),z?(0,D.jsxs)(w,{variant:`default`,children:[`Active (`,H,`)`]}):R(A?.subscription?.status||`none`)]}),(A?.plan||z)&&(0,D.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:z?(0,D.jsxs)(D.Fragment,{children:[`Billed `,W(n?.subscriptionPlan),` via `,H]}):(0,D.jsxs)(D.Fragment,{children:[`Billed `,A?.plan?.interval]})}),V&&(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,D.jsx)(d,{className:`size-4`}),(0,D.jsx)(`span`,{children:z?n?.subscriptionPeriodEnd?(0,D.jsxs)(D.Fragment,{children:[n.subscriptionWillRenew===!1?`Cancels`:`Renews`,` on`,` `,F(n.subscriptionPeriodEnd)]}):(0,D.jsx)(D.Fragment,{children:`Managed via App Store`}):A?.subscription?.currentPeriodEnd?(0,D.jsxs)(D.Fragment,{children:[A.subscription.cancelAtPeriodEnd?`Cancels`:`Renews`,` on`,` `,F(A.subscription.currentPeriodEnd)]}):null})]})]})]}),(0,D.jsxs)(C,{children:[(0,D.jsx)(b,{children:(0,D.jsxs)(S,{className:`flex items-center gap-2`,children:[(0,D.jsx)(p,{className:`size-5`}),`Credits`]})}),(0,D.jsxs)(x,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`text-3xl font-bold`,children:Y}),(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Total available credits`})]}),(0,D.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-3 space-y-3`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:`Plan credits`}),(0,D.jsx)(`span`,{className:`font-medium`,children:q})]}),(0,D.jsx)(y,{}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[(0,D.jsxs)(`span`,{className:`text-muted-foreground flex items-center gap-2`,children:[`Additional credits`,(0,D.jsx)(w,{variant:`outline`,className:`text-[10px] font-medium uppercase tracking-wide`,children:`Never expire`})]}),(0,D.jsx)(`span`,{className:`font-medium`,children:J})]})]}),(0,D.jsx)(`div`,{className:`pt-1`,children:(0,D.jsx)(i,{asChild:!0,className:`flex items-center gap-2`,children:(0,D.jsxs)(r,{href:`/credits`,children:[(0,D.jsx)(s,{src:`/coin.svg`,alt:`credits`,className:`size-4`}),`Buy additional credits`]})})})]})]})]}),(0,D.jsxs)(C,{children:[(0,D.jsx)(b,{children:(0,D.jsxs)(S,{className:`flex items-center gap-2`,children:[(0,D.jsx)(_,{className:`size-5`}),`Subscription Management`]})}),(0,D.jsx)(x,{className:`space-y-4`,children:V&&n?.subscriptionSource===`revenuecat`?(0,D.jsxs)(`div`,{className:`rounded-lg border border-blue-200 dark:border-blue-800 bg-blue-50 dark:bg-blue-950/30 p-4 space-y-2`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-blue-700 dark:text-blue-400 font-medium`,children:[(0,D.jsx)(v,{className:`size-5`}),`Subscription purchased in mobile app`]}),(0,D.jsxs)(`p`,{className:`text-sm text-blue-600 dark:text-blue-300`,children:[`Your subscription was purchased through `,H,`. To manage, cancel, or update your subscription, please open your device's subscription settings.`]}),(0,D.jsxs)(i,{variant:`outline`,size:`sm`,onClick:()=>window.open(U,`_blank`),className:`flex items-center gap-2 mt-2`,children:[`Open `,H,` Subscriptions`,(0,D.jsx)(g,{className:`size-4`})]})]}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`p`,{className:`text-muted-foreground`,children:V?`Manage your subscription, update payment methods, view invoices, or cancel your plan.`:`Upgrade to a paid plan to get more credits and access to premium features.`}),(0,D.jsx)(`div`,{className:`flex gap-3`,children:V?(0,D.jsxs)(i,{onClick:P,disabled:M,className:`flex items-center gap-2`,children:[(0,D.jsx)(h,{className:`size-4`}),M?`Opening...`:`Manage Subscription`,(0,D.jsx)(g,{className:`size-4`})]}):(0,D.jsx)(r,{href:`/pricing`,children:(0,D.jsxs)(i,{className:`flex items-center gap-2`,children:[(0,D.jsx)(T,{className:`size-4`}),`Upgrade Plan`]})})})]})})]}),(0,D.jsxs)(C,{children:[(0,D.jsx)(b,{children:(0,D.jsx)(S,{children:`Usage Summary`})}),(0,D.jsx)(x,{children:(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,D.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4`,children:[(0,D.jsx)(`div`,{className:`text-sm text-muted-foreground mb-1`,children:`Total Generations`}),(0,D.jsx)(`div`,{className:`text-2xl font-bold`,children:L.totalGenerations})]}),(0,D.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4`,children:[(0,D.jsx)(`div`,{className:`text-sm text-muted-foreground mb-1`,children:`Images Generated`}),(0,D.jsx)(`div`,{className:`text-2xl font-bold`,children:L.totalImages})]}),(0,D.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4`,children:[(0,D.jsx)(`div`,{className:`text-sm text-muted-foreground mb-1`,children:`Credits Used`}),(0,D.jsx)(`div`,{className:`text-2xl font-bold`,children:L.totalCreditsUsed})]})]})})]}),(0,D.jsxs)(C,{children:[(0,D.jsx)(b,{children:(0,D.jsx)(S,{children:`Usage History`})}),(0,D.jsxs)(x,{children:[(0,D.jsx)(`div`,{className:`overflow-x-auto -mx-6 px-6 md:mx-0 md:px-0`,children:(0,D.jsxs)(`table`,{className:`w-full text-sm md:text-base`,children:[(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{className:`text-left text-muted-foreground border-b`,children:[(0,D.jsxs)(`th`,{className:`py-2 md:py-3 px-2 md:px-0 font-medium whitespace-nowrap`,children:[(0,D.jsxs)(`span`,{className:`hidden md:inline-flex items-center gap-2`,children:[(0,D.jsx)(f,{className:`size-4`}),`Completed At`]}),(0,D.jsx)(`span`,{className:`md:hidden text-xs`,children:`Time`})]}),(0,D.jsxs)(`th`,{className:`py-2 md:py-3 px-2 md:px-0 font-medium whitespace-nowrap`,children:[(0,D.jsxs)(`span`,{className:`hidden md:inline-flex items-center gap-2`,children:[(0,D.jsx)(m,{className:`size-4`}),`Model`]}),(0,D.jsx)(`span`,{className:`md:hidden text-xs`,children:`Model`})]}),(0,D.jsxs)(`th`,{className:`py-2 md:py-3 px-2 md:px-0 font-medium whitespace-nowrap`,children:[(0,D.jsxs)(`span`,{className:`hidden md:inline-flex items-center gap-2`,children:[(0,D.jsx)(s,{src:`/imgicon.svg`,alt:`count`,className:`size-4 opacity-50`}),`Items`]}),(0,D.jsx)(`span`,{className:`md:hidden text-xs`,children:`#`})]}),(0,D.jsxs)(`th`,{className:`py-2 md:py-3 px-2 md:px-0 font-medium whitespace-nowrap`,children:[(0,D.jsxs)(`span`,{className:`hidden md:inline-flex items-center gap-2`,children:[(0,D.jsx)(s,{src:`/coin.svg`,alt:`credits`,className:`size-4`}),`Credits`]}),(0,D.jsx)(`span`,{className:`md:hidden text-xs`,children:`Credits`})]}),(0,D.jsxs)(`th`,{className:`py-2 md:py-3 px-2 md:px-0 font-medium whitespace-nowrap`,children:[(0,D.jsxs)(`span`,{className:`hidden md:inline-flex items-center gap-2`,children:[(0,D.jsx)(T,{className:`size-4`}),`Consumed From`]}),(0,D.jsx)(`span`,{className:`md:hidden text-xs`,children:`From`})]})]})}),(0,D.jsx)(`tbody`,{children:k.length===0?(0,D.jsx)(`tr`,{children:(0,D.jsx)(`td`,{className:`py-4 text-muted-foreground`,colSpan:5,children:`No usage yet.`})}):k.map(e=>(0,D.jsxs)(`tr`,{className:`border-b last:border-b-0 text-xs md:text-sm`,children:[(0,D.jsx)(`td`,{className:`py-3 md:py-4 px-2 md:px-0`,children:I(e.completedAt)}),(0,D.jsx)(`td`,{className:`py-3 md:py-4 px-2 md:px-0`,children:(0,D.jsx)(`span`,{className:`inline-flex items-center rounded-md bg-secondary px-1.5 md:px-2 py-0.5 text-xs font-medium`,children:e.tool.length>15?e.tool.substring(0,12)+`...`:e.tool})}),(0,D.jsx)(`td`,{className:`py-3 md:py-4 px-2 md:px-0 font-medium`,children:e.numImages??(e.type===`image`?1:`-`)}),(0,D.jsx)(`td`,{className:`py-3 md:py-4 px-2 md:px-0 font-medium`,children:e.refunded?(0,D.jsx)(`span`,{className:`inline-flex items-center rounded-md bg-amber-100 dar
1k:bg-amber-900/30 text-amber-700 dark:text-amber-400 px-1.5 md:px-2 py-0.5 text-xs font-medium`,children:`Refunded`}):e.credits??`-`}),(0,D.jsx)(`td`,{className:`py-3 md:py-4 px-2 md:px-0`,children:G(n?.subscriptionPlan,n?.subscriptionSource)})]},e.id))})]})}),k.length>0&&(0,D.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[(0,D.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Showing `,k.length,` entries (limit: `,e,`)`]}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,D.jsx)(i,{onClick:()=>t(50),variant:e===50?`default`:`outline`,size:`sm`,className:`text-xs`,children:`50`}),(0,D.jsx)(i,{onClick:()=>t(100),variant:e===100?`default`:`outline`,size:`sm`,className:`text-xs`,children:`100`}),(0,D.jsx)(i,{onClick:()=>t(250),variant:e===250?`default`:`outline`,size:`sm`,className:`text-xs`,children:`250`}),(0,D.jsx)(i,{onClick:()=>t(500),variant:e===500?`default`:`outline`,size:`sm`,className:`text-xs`,children:`500`}),(0,D.jsx)(i,{onClick:()=>t(1e4),variant:e===1e4?`default`:`outline`,size:`sm`,className:`text-xs`,children:`All`})]})]})]})]})]})})}var A=k;export{A as component};

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.