1import{G as le,cd as De,db as Ae,dc as K,u as M,af as ce,dd as Me,de,df as re,dg as Te,b5 as Fe,j as e,a4 as Se,a6 as ke,a7 as Ee,a8 as Ie,bL as Re,dh as _e,aI as Pe,di as qe,b7 as Le,b8 as S,b9 as k,ba as E,bb as I,bc as ee,bf as R,bd as O,co as se,bn as ne,bg as Oe,dj as Be,B as L,h as T,dk as ue,aq as q,dl as We,bv as me,bo as pe,bp as xe,bq as he,br as fe,bs as je,m as $e,c1 as Ke,c as Q,L as Qe,cj as G,bV as V,bJ as ze,bC as He,dm as Ge}from"./index-onZ-siV6.js";import{r as h}from"./sentry-CwTBLAGw.js";import{u as Ve}from"./index-dfuXivrf.js";import{A as Ye}from"./AdminPageHeader-DMjmiDyT.js";import{o as j,d as i,s as r,_ as l,g as C,S as g,n as U,h as D,i as p,j as Je,R as oe,an as ae,l as Ze,q as te}from"./utils-SJutkBrZ.js";import{T as Xe,a as es,b as ie,e as Y,c as ss,d as J}from"./table-Cdw6YMfO.js";import{E as ns,a as os,b as as,c as ts,d as is}from"./empty-D8xgqxdd.js";import{D as ls}from"./data-table-CvtVVMM-.js";import"./posthog-C-TxGGwT.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};s.SENTRY_RELEASE={id:"36665b27cc5c935a9a1384aae7c036cb424779c4"};var o=new s.Error().stack;o&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[o]="a6a6f939-1b51-4883-9712-babfbd9f9cce",s._sentryDebugIdIdentifier="sentry-dbid-a6a6f939-1b51-4883-9712-babfbd9f9cce")}catch{}})();const cs=[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],ds=le("power-off",cs);const rs=[["path",{d:"M2 9a3 3 0 1 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 1 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",key:"1l48ns"}],["path",{d:"M9 9h.01",key:"1q5me6"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"M15 15h.01",key:"lqbp3k"}]],us=le("ticket-percent",rs);function ms({limit:s=50}={}){return De({queryKey:[...K(),"infinite",{limit:s}],queryFn:async({pageParam:o=0})=>{const c={skip:o*s,limit:s};return{coupons:await Ae(c),pageParam:o}},initialPageParam:0,getNextPageParam:(o,c)=>{if(!(o.coupons.length<s))return c.length}})}const ps=50,xs=!0,hs=1e3,fs=j({code:r().max(ps).describe("Unique coupon code (case-insensitive)"),maxUses:i([U().min(1),l()]).optional().describe("Maximum number of redemptions (null = unlimited)"),validFrom:i([g(),l()]).optional().describe("When coupon becomes valid (null = immediately)"),validUntil:i([g(),l()]).optional().describe("When coupon expires (null = never)"),isActive:C().default(xs).describe("Admin can disable anytime"),allowTournaments:C().optional().describe("Whether this coupon can pay for tournament seats"),note:i([r().max(hs),l()]).optional().describe("Internal note/observation about this coupon")}),js=100;j({skip:U().optional(),limit:U().default(js)});const vs=50,bs=!0,gs=1e3;j({code:r().max(vs).describe("Unique coupon code (case-insensitive)"),maxUses:i([U().min(1),l()]).optional().describe("Maximum number of redemptions (null = unlimited)"),validFrom:i([g(),l()]).optional().describe("When coupon becomes valid (null = immediately)"),validUntil:i([g(),l()]).optional().describe("When coupon expires (null = never)"),isActive:C().default(bs).describe("Admin can disable anytime"),allowTournaments:C().optional().describe("Whether this coupon can pay for tournament seats"),note:i([r().max(gs),l()]).optional().describe("Internal note/observation about this coupon"),id:p(),timesUsed:U(),createdById:p(),createdAt:D({}),updatedAt:D({})});j({code:r().describe("A random code not yet used by any coupon")});j({coupon_id:p()});const ys=50,Cs=!0,ws=1e3,Ns=0,Us=500;j({code:r().max(ys).describe("Unique coupon code (case-insensitive)"),maxUses:i([U().min(1),l()]).optional().describe("Maximum number of redemptions (null = unlimited)"),validFrom:i([g(),l()]).optional().describe("When coupon becomes valid (null = immediately)"),validUntil:i([g(),l()]).optional().describe("When coupon expires (null = never)"),isActive:C().default(Cs).describe("Admin can disable anytime"),allowTournaments:C().optional().describe("Whether this coupon can pay for tournament seats"),note:i([r().max(ws),l()]).optional().describe("Internal note/observation about this coupon"),id:p(),timesUsed:U(),createdById:p(),createdAt:D({}),updatedAt:D({}),redemptions:Je(j({eventPriceWaived:U().min(Ns).describe("Price that was waived in cents"),id:p(),couponId:p(),userId:p(),user:i([j({id:p(),name:i([r(),l()]).optional(),email:i([r(),l()]).optional(),username:i([r(),l()]).optional(),avatarUrl:i([r(),l()]).optional(),taxNumber:i([r(),l()]).optional()}),l()]).optional(),eventRegistrationId:i([p(),l()]).optional(),purchaseId:i([p(),l()]).optional(),eventRegistration:i([j({event:j({id:p(),title:r(),slug:i([r(),l()]).optional(),fromDate:g(),fromTime:oe({}),toDate:g(),toTime:oe({}
1),timezone:r(),location:r(),splashUrl:i([r().max(Us),l()]).optional().describe("Event splash image URL, else its group's default image"),ogImageUrl:i([r(),l()]).optional(),cancelledAt:i([D({}),l()]).optional(),confirmedAt:i([D({}),l()]).optional(),seriesId:i([p(),l()]).optional(),isOverridden:C().optional()})}),l()]).optional(),redeemedAt:D({}),createdAt:D({}),updatedAt:D({})})).optional()});j({coupon_id:p()});const Ds=1e3;j({code:i([r(),l()]).optional(),maxUses:i([U().min(1),l()]).optional(),validFrom:i([g(),l()]).optional(),validUntil:i([g(),l()]).optional(),isActive:i([C(),l()]).optional(),allowTournaments:i([C(),l()]).optional(),note:i([r().max(Ds),l()]).optional()});const As=50,Ms=!0,Ts=1e3;j({code:r().max(As).describe("Unique coupon code (case-insensitive)"),maxUses:i([U().min(1),l()]).optional().describe("Maximum number of redemptions (null = unlimited)"),validFrom:i([g(),l()]).optional().describe("When coupon becomes valid (null = immediately)"),validUntil:i([g(),l()]).optional().describe("When coupon expires (null = never)"),isActive:C().default(Ms).describe("Admin can disable anytime"),allowTournaments:C().optional().describe("Whether this coupon can pay for tournament seats"),note:i([r().max(Ts),l()]).optional().describe("Internal note/observation about this coupon"),id:p(),timesUsed:U(),createdById:p(),createdAt:D({}),updatedAt:D({})});j({coupon_id:p()});j({code:r().describe("Coupon code to validate"),forTournament:C().optional().describe("Validate for a tournament seat (requires allow_tournaments)")});j({valid:C().describe("Whether the coupon is valid"),reason:i([r(),l()]).optional().describe("Reason if invalid: invalid_code, inactive, expired, not_yet_valid, usage_limit_reached, not_valid_for_tournaments"),couponId:i([p(),l()]).optional().describe("Coupon ID if valid")});function B(s){if(!s)return null;const o=new Date(s),c=o.getFullYear(),u=String(o.getMonth()+1).padStart(2,"0"),n=String(o.getDate()).padStart(2,"0");return`${c}-${u}-${n}`}function Fs(){return e.jsxs("div",{className:"space-y-6",children:[e.jsx(T,{className:"h-10 w-full"}),e.jsx(T,{className:"h-10 w-full"}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(T,{className:"h-10 w-full"}),e.jsx(T,{className:"h-10 w-full"})]}),e.jsx(T,{className:"h-16 w-full"})]})}function Ss({open:s,onOpenChange:o,couponId:c,onSuccess:u}){const{t:n}=M("common"),v=ce(),d=!!c,b=Me(),t=de(),{data:f,isLoading:w}=re(d&&s?c||"":void 0),{data:A}=Te({query:{enabled:s&&!d,retry:!1}}),N=(f?.timesUsed??0)>0,_=h.useMemo(()=>fs.extend({code:r().min(1,n("admin.coupons.codeRequired")),maxUses:U().int().min(1,n("admin.coupons.maxUsesMin")).nullish(),validFrom:i([ae(),g(),l()]).optional(),validUntil:i([ae(),g(),l()]).optional()}),[n]),m=Ze({resolver:Fe(_),defaultValues:{code:"",maxUses:null,validFrom:null,validUntil:null,isActive:!0,allowTournaments:!1,note:null}});h.useEffect(()=>{s&&!d&&m.reset({code:"",maxUses:null,validFrom:null,validUntil:null,isActive:!0,allowTournaments:!1,note:null})},[s,d,m]),h.useEffect(()=>{!s||d||!A?.code||m.getValues("code")||m.setValue("code",A.code)},[s,d,A?.code,m]),h.useEffect(()=>{f&&d&&m.reset({code:f.code,maxUses:f.maxUses,validFrom:f.validFrom,validUntil:f.validUntil,isActive:f.isActive,allowTournaments:f.allowTournaments??!1,note:f.note??null})},[f,d,m]);const x=async a=>{try{if(d&&c){const y=N?{maxUses:a.maxUses??null,validUntil:B(a.validUntil),isActive:a.isActive,allowTournaments:a.allowTournaments??!1,note:a.note?.trim()||null}:{code:a.code.toUpperCase(),maxUses:a.maxUses??null,validFrom:B(a.validFrom),validUntil:B(a.validUntil),isActive:a.isActive,allowTournaments:a.allowTournaments??!1,note:a.note?.trim()||null};await t.mutateAsync({couponId:c,data:y}),await v.invalidateQueries({queryKey:ue(c)}),await v.invalidateQueries({queryKey:K()}),q.success(n("admin.coupons.updated"))}else await b.mutateAsync({data:{code:a.code.toUpperCase(),maxUses:a.maxUses??null,validFrom:B(a.validFrom),validUntil:B(a.validUntil),isActive:a.isActive,allowTournaments:a.allowTournaments??!1,note:a.note?.trim()||null}}),await v.invalidateQueries({queryKey:K()}),v.removeQueries({queryKey:We()}),q.success(n("admin.coupons.created"));u?.(),o(!1)}catch(y){const P=d?"admin.coupons.updateFailed":"admin.coupons.createFailed";q.error(n(P),{description:me(y)})}},W=b.isPending||t.isPending;return e.jsx(Se,{open:s,onOpenChange:o,children:e.jsxs(ke,{side:"right",className:"w-full sm:max-w-lg overflow-y-auto",children:[e.jsxs(Ee,{children:[e.jsx(Ie,{children:n(d?"admin.coupons.editCoupon":"admin.coupons.createCoupon")}),e.jsx(Re,{children:n(d?"admin.coupons.editDescription":"admin.coupons.createDescription")})]}),e.jsx("div",{className:"mt-6",children:d&&w?e.jsx(Fs,{}):e.jsxs(e.Fragment,{children:[d&&N&&e.jsxs(_e,{className:"mb-6",children:[e.jsx(Pe,{className:"size-4"}),e.jsx(qe,{children:n("admin.coupons.usedCouponRestriction")})]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Le,{...m,children:e.jsxs("form",{id:"coupon-form-sheet",onSubmit:m.handleSubmit(x),className:"space-y-6",children:[e.jsx(S,{control:m.control,name:"code",render:({field:a})=>e.jsxs(k,{children:[e.jsx(E,{children:n("admin.coupons.code")}),e.jsx(I,{children:e.jsx(ee,{placeholder:"SUMMER2026",...a,onBlur:y=>{a.onBlur(),a.onChange(y.target.value.toUpperCase())},className:"font-mono uppercase",disabled:d&&N})}),e.jsx(R,{children:d&&N?n("admin.coupons.codeLockedDescription"):!d&&A?.code?n("admin.coupons.codeGeneratedDescription"):n("admin.coupons.codeDescription")}),e.jsx(O,{})]})}),e.jsx(S,{control:m.control,name:"maxUses",render:({field:a})=>e.jsxs(k,{children:[e.jsx(E,{children:n("admin.coupons.maxUses")}),e.jsx(I,{children:e.jsx(ee,{type:"number",placeholder:n("admin.coupons.unlimited"),...a,onChange:y=>{const P=y.target.value;a.onChange(P===""?null:Number(P))}})}),e.jsx(R,{children:n("admin.coupons.maxUsesDescription")}),e.jsx(O,{})]})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{control:m.control,name:"validFrom",render:({field:a})=>e.jsxs(k,{children:[e.jsx(E,{children:n("admin.coupons.validFrom")}),e.jsx(I,{children:e.jsx(se,{date:a.value,onDateChange:y=>a.onChange(y??null),placeholder:n("admin.coupons.always"),readOnly:d&&N})}),e.jsx(R,{children:n(d&&N?"admin.coupons.validFromLockedDescription":"admin.coupons.validFromDescription")}),e.jsx(O,{})]})}),e.jsx(S,{control:m.control,name:"validUntil",render:({field:a})=>e.jsxs(k,{children:[e.jsx(E,{children:n("admin.coupons.validUntil")}),e.jsx(I,{children:e.jsx(se,{date:a.value??void 0,onDateChange:y=>a.onChange(y??null),placeholder:n("admin.coupons.never")})}),e.jsx(R,{children:n("admin.coupons.validUntilDescription")}),e.jsx(O,{})]})})]}),e.jsx(S,{control:m.control,name:"isActive",render:({field:a})=>e.jsxs(k,{className:"flex flex-row items-center justify-between rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{className:"text-base",children:n("admin.coupons.isActive")}
1),e.jsx(R,{children:n("admin.coupons.isActiveDescription")})]}),e.jsx(I,{children:e.jsx(ne,{checked:a.value,onCheckedChange:a.onChange})})]})}),e.jsx(S,{control:m.control,name:"allowTournaments",render:({field:a})=>e.jsxs(k,{className:"flex flex-row items-center justify-between rounded-lg border p-4",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx(E,{className:"text-base",children:n("admin.coupons.allowTournaments")}),e.jsx(R,{children:n("admin.coupons.allowTournamentsDescription")})]}),e.jsx(I,{children:e.jsx(ne,{checked:a.value??!1,onCheckedChange:a.onChange})})]})}),e.jsx(S,{control:m.control,name:"note",render:({field:a})=>e.jsxs(k,{children:[e.jsx(E,{children:n("admin.coupons.note")}),e.jsx(I,{children:e.jsx(Oe,{placeholder:n("admin.coupons.notePlaceholder"),rows:3,...a,value:a.value??""})}),e.jsx(R,{children:n("admin.coupons.noteDescription")}),e.jsx(O,{})]})})]})}),e.jsxs(Be,{children:[e.jsx(L,{type:"button",variant:"outline",onClick:()=>o(!1),children:n("buttons.cancel")}),e.jsx(L,{type:"submit",form:"coupon-form-sheet",disabled:W,children:n(W?"ui.loading":d?"admin.coupons.saveChanges":"admin.coupons.createCoupon")})]})]})]})})]})})}const ks=["open","code","limits","dates","note"],Es=["share","tournaments","track","disable"];function Is({open:s,onOpenChange:o}){const{t:c}=M("common");return e.jsx(pe,{open:s,onOpenChange:o,children:e.jsxs(xe,{className:"sm:max-w-lg max-h-[85vh] overflow-y-auto",children:[e.jsxs(he,{children:[e.jsx(fe,{children:c("admin.coupons.help.title")}),e.jsx(je,{children:c("admin.coupons.help.description")})]}),e.jsxs("div",{className:"space-y-6 text-sm",children:[e.jsxs("section",{className:"space-y-3",children:[e.jsx("h3",{className:"font-semibold",children:c("admin.coupons.help.stepsTitle")}),e.jsx("ol",{className:"space-y-3",children:ks.map((u,n)=>e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-medium",children:n+1}),e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("p",{className:"font-medium",children:c(`admin.coupons.help.steps.${u}.title`)}),e.jsx("p",{className:"text-muted-foreground",children:c(`admin.coupons.help.steps.${u}.body`)})]})]},u))})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"font-semibold",children:c("admin.coupons.help.tipsTitle")}),e.jsx("ul",{className:"list-disc space-y-1.5 pl-5 text-muted-foreground",children:Es.map(u=>e.jsx("li",{children:c(`admin.coupons.help.tips.${u}`)},u))})]})]})]})})}function Rs(s){if(s.maxUses!==null&&s.timesUsed>=(s.maxUses??0))return"exhausted";if(s.validUntil){const o=new Date(s.validUntil);if(o.setHours(23,59,59,999),o<new Date)return"expired"}return s.isActive?"active":"disabled"}function _s({status:s}){const{t:o}=M("common"),c={active:"default",disabled:"secondary",expired:"destructive",exhausted:"outline"};return e.jsx(Q,{variant:c[s],children:o(`admin.coupons.${s}`)})}function Ps(){return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"space-y-4",children:[...Array(6)].map((s,o)=>e.jsxs("div",{className:"flex justify-between",children:[e.jsx(T,{className:"h-4 w-24"}),e.jsx(T,{className:"h-4 w-32"})]},o))}),e.jsx(T,{className:"h-40 w-full"})]})}function qs({couponId:s,open:o,onOpenChange:c,onEdit:u}){const{t:n}=M("common"),v=ce(),{formatDate:d,formatPrice:b}=$e(),{data:t,isLoading:f,isError:w}=re(o&&s?s:void 0),A=de(),N=async()=>{if(t)try{await A.mutateAsync({couponId:t.id,data:{isActive:!1}}),await v.invalidateQueries({queryKey:ue(t.id)}),await v.invalidateQueries({queryKey:K()}),q.success(n("admin.coupons.disabled"))}catch(x){q.error(n("admin.coupons.disableFailed"),{description:me(x)})}},_=t?Rs(t):null,m=t?.isActive;return e.jsx(pe,{open:o,onOpenChange:c,children:e.jsxs(xe,{className:"sm:max-w-lg overflow-y-auto",children:[e.jsxs(he,{children:[e.jsx(fe,{className:"font-mono",children:t?.code||n("admin.coupons.details")}),e.jsx(je,{children:n("admin.coupons.detailDescription")})]}),f&&e.jsx(Ps,{}),w&&e.jsx("div",{className:"flex justify-center py-8",children:e.jsx("p",{className:"text-destructive",children:"Error loading coupon"})}),t&&_&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex gap-2",children:[m&&e.jsxs(L,{variant:"outline",size:"sm",onClick:N,disabled:A.isPending,children:[e.jsx(ds,{className:"size-4"}),n("admin.coupons.disable")]}),e.jsxs(L,{size:"sm",onClick:()=>{c(!1),u(t.id)},children:[e.jsx(Ke,{className:"size-4"}),n("admin.coupons.edit")]})]}),e.jsxs("div",{className:"space-y-2 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.status")}),e.jsx(_s,{status:_})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.code")}
1),e.jsx("span",{className:"font-mono cursor-pointer hover:text-muted-foreground transition-colors",onClick:()=>{navigator.clipboard.writeText(t.code),q.success(n("admin.coupons.codeCopied"))},title:n("admin.coupons.clickToCopy"),children:t.code})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.usableFor")}),e.jsx(Q,{variant:t.allowTournaments?"default":"secondary",children:n(t.allowTournaments?"admin.coupons.eventsAndTournaments":"admin.coupons.eventsOnly")})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.uses")}),e.jsxs("span",{children:[t.timesUsed,t.maxUses!==null?` / ${t.maxUses}`:" / â"]})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.validFrom")}),e.jsx("span",{children:t.validFrom?d(t.validFrom):"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.validUntil")}),e.jsx("span",{children:t.validUntil?d(t.validUntil):"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.createdAt")}),e.jsx("span",{children:d(t.createdAt)})]}),t.note&&e.jsxs("div",{className:"flex flex-col gap-1 pt-1",children:[e.jsx("span",{className:"text-muted-foreground",children:n("admin.coupons.note")}),e.jsx("span",{className:"whitespace-pre-wrap",children:t.note})]})]}),e.jsxs("div",{className:"border-t pt-4",children:[e.jsx("h4",{className:"font-medium mb-3",children:n("admin.coupons.redemptionHistory")}),(!t.redemptions||t.redemptions.length===0)&&e.jsx("p",{className:"text-muted-foreground text-center py-4 text-sm",children:n("admin.coupons.noRedemptions")}),t.redemptions&&t.redemptions.length>0&&e.jsxs(Xe,{children:[e.jsx(es,{children:e.jsxs(ie,{children:[e.jsx(Y,{children:n("admin.coupons.user")}),e.jsx(Y,{children:n("admin.coupons.date")}),e.jsx(Y,{className:"text-right",children:n("admin.coupons.amountWaived")})]})}),e.jsx(ss,{children:t.redemptions.map(x=>e.jsxs(ie,{children:[e.jsx(J,{className:"text-sm",children:x.eventRegistration?e.jsxs(Qe,{to:"/events/$slug",params:{slug:x.eventRegistration.event.slug||x.eventRegistration.event.id},target:"_blank",className:"flex flex-col",children:[x.user?.name,e.jsx("span",{className:"text-xs text-muted-foreground",children:x.eventRegistration.event.title})]}):e.jsxs("div",{className:"flex flex-col",children:[x.user?.name,e.jsx("span",{className:"text-xs text-muted-foreground",children:n("admin.coupons.tournamentPurchase")})]})}),e.jsx(J,{className:"text-sm",children:d(x.redeemedAt)}),e.jsx(J,{className:"text-right text-sm",children:b(x.eventPriceWaived/100)})]},x.id))})]})]})]})]})})}const Ls=h.memo(function({showExpired:o,onShowExpiredChange:c,showExhausted:u,onShowExhaustedChange:n,showDisabled:v,onShowDisabledChange:d}){const{t:b}=M("common");return e.jsxs("div",{className:"mb-6 flex flex-col sm:flex-row gap-4 flex-wrap",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(G,{id:"show-expired",checked:o,onCheckedChange:t=>c(t===!0)}),e.jsx(V,{htmlFor:"show-expired",className:"text-sm cursor-pointer",children:b("admin.coupons.showExpired")})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(G,{id:"show-exhausted",checked:u,onCheckedChange:t=>n(t===!0)}),e.jsx(V,{htmlFor:"show-exhausted",className:"text-sm cursor-pointer",children:b("admin.coupons.showExhausted")})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(G,{id:"show-disabled",checked:v,onCheckedChange:t=>d(t===!0)}),e.jsx(V,{htmlFor:"show-disabled",className:"text-sm cursor-pointer",children:b("admin.coupons.showDisabled")})]})]})});function Os({data:s,columns:o,isLoading:c=!1,isError:u=!1,onRowClick:n,hasNextPage:v=!1,isFetchingNextPage:d=!1,loadMoreRef:b,toolbar:t,footer:f}){const{t:w}=M("common");return e.jsx(ls,{data:s,columns:o,isLoading:c,isError:u,isFetchingMore:d,hasMore:v,loadMoreRef:b,toolbar:t,footer
1:f,errorMessage:w("admin.coupons.errorLoading"),loadingMoreText:w("admin.coupons.loadingMore"),onRowClick:n,emptyState:e.jsx(ns,{children:e.jsxs(os,{children:[e.jsx(as,{variant:"icon",children:e.jsx(us,{})}),e.jsx(ts,{children:w("admin.coupons.noCoupons")}),e.jsx(is,{children:w("admin.coupons.createFirst")})]})})})}const Bs=h.memo(Os);function ve(s){return s.maxUses&&s.timesUsed>=s.maxUses?"exhausted":s.validUntil&&new Date(s.validUntil)<new Date?"expired":s.isActive?"active":"disabled"}function Ws({status:s}){const{t:o}=M("common"),c={active:"default",disabled:"secondary",expired:"destructive",exhausted:"outline"};return e.jsx(Q,{variant:c[s],children:o(`admin.coupons.${s}`)})}function $s(s,o,c){const u=s?te(new Date(s),"MMM d, yyyy"):c("admin.coupons.always"),n=o?te(new Date(o),"MMM d, yyyy"):c("admin.coupons.never");return`${u} - ${n}`}function Ks(s,o,c){return o===null?c("admin.coupons.usesUnlimited",{used:s}):c("admin.coupons.usesFormat",{used:s,max:o})}function Qs(){const{t:s}=M("common");return[{accessorKey:"code",header:s("admin.coupons.code"),cell:({row:o})=>e.jsx("span",{className:"font-mono font-medium",children:o.original.code})},{id:"status",header:s("admin.coupons.status"),cell:({row:o})=>e.jsx(Ws,{status:ve(o.original)})},{id:"usableFor",header:s("admin.coupons.usableFor"),cell:({row:o})=>e.jsx(Q,{variant:o.original.allowTournaments?"default":"secondary",children:s(o.original.allowTournaments?"admin.coupons.eventsAndTournaments":"admin.coupons.eventsOnly")})},{id:"uses",header:s("admin.coupons.uses"),cell:({row:o})=>Ks(o.original.timesUsed,o.original.maxUses??null,s)},{id:"validDates",header:s("admin.coupons.validDates"),cell:({row:o})=>e.jsx("span",{className:"whitespace-nowrap text-muted-foreground",children:$s(o.original.validFrom??null,o.original.validUntil??null,s)})},{id:"note",header:s("admin.coupons.note"),cell:({row:o})=>o.original.note?e.jsx("span",{className:"whitespace-nowrap wrap-break-word text-muted-foreground line-clamp-2",children:o.original.note}):e.jsx("span",{className:"text-muted-foreground",children:"-"})}]}function zs(){const{t:s}=M("common"),o=Qs(),{data:c,isLoading:u,isError:n,isFetchingNextPage:v,fetchNextPage:d,hasNextPage:b}=ms({limit:50}),[t,f]=h.useState(!1),[w,A]=h.useState(!1),[N,_]=h.useState(!1),[m,x]=h.useState(!1),[W,a]=h.useState(null),[y,P]=h.useState(null),[be,z]=h.useState(!1),[ge,Z]=h.useState(!1),{ref:ye,inView:X}=Ve({threshold:0,rootMargin:"20px"});h.useEffect(()=>{X&&b&&!v&&d()},[X,b,v,d]);const H=h.useMemo(()=>c?.pages?.flatMap(F=>F.coupons)??[],[c]),Ce=h.useMemo(()=>H.length?H.filter(F=>{const $=ve(F);return $==="active"?!0:!($==="expired"&&!t||$==="exhausted"&&!w||$==="disabled"&&!N)}):[],[H,t,w,N]),we=()=>{a(null),x(!0)},Ne=F=>{P(F.id),z(!0)},Ue=F=>{z(!1),a(F),x(!0)};return e.jsxs(ze,{children:[e.jsx(Ye,{title:s("admin.coupons.title"),description:s("admin.coupons.description"),action:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(L,{onClick:we,children:[e.jsx(He,{className:"size-4"}),s("admin.coupons.createCoupon")]}),e.jsx(L,{variant:"outline",size:"icon",onClick:()=>Z(!0),"aria-label":s("admin.coupons.help.title"),children:e.jsx(Ge,{className:"size-4"})})]})}),e.jsx(Bs,{data:Ce,columns:o,isLoading:u,isError:n,onRowClick:Ne,hasNextPage:b,isFetchingNextPage:v,loadMoreRef:ye,toolbar:e.jsx(Ls,{showExpired:t,onShowExpiredChange:f,showExhausted:w,onShowExhaustedChange:A,showDisabled:N,onShowDisabledChange:_})}),e.jsx(Is,{open:ge,onOpenChange:Z}),e.jsx(Ss,{open:m,onOpenChange:x,couponId:W,onSuccess:()=>{a(null)}}),e.jsx(qs,{couponId:y,open:be,onOpenChange:z,onEdit:Ue})]})}const nn=zs;export{nn 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.