1import{u as T,a as B,j as e}from"./query-BfvAKYUz.js";import{e as R,r as p}from"./react-vendor-BTIQH4FS.js";import{B as m,I as q,s as u,t as i}from"./index-DK8CeD3M.js";import{a as E,H,B as K}from"./Header-BpKcuf2S.js";import{C as A,a as D,b as I,c as M,d as P}from"./card-8nUqnZfy.js";import{T as Q,a as z,b as v,c as n,d as $,e as r}from"./table-C_YeYDyG.js";import{Z as f,x as F,R as G,a6 as J}from"./icons-B_WIxKAl.js";import"./radix-DIIfJIjL.js";import"./supabase-CXidNrjy.js";import"./charts-z6ppYIt6.js";const V=l=>l?new Date(l).toLocaleString("ms-MY",{day:"2-digit",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}):"â",ie=()=>{const l=R(),{isAdmin:o,loading:x}=E(),h=T(),[d,b]=p.useState("");p.useEffect(()=>{!x&&!o&&l("/")},[x,o,l]);const{data:N=[],isLoading:C,refetch:w,isRefetching:j}=B({queryKey:["admin-payment-intents"],queryFn:async()=>{const{data:a,error:s}=await u.from("payment_intents").select("*").order("created_at",{ascending:!1}).limit(300);if(s)throw s;return a??[]},enabled:o}),_=async a=>{const{error:s}=await u.from("payment_intents").update({status:"paid",claimed_by_user_id:null,claimed_at:null}).eq("id",a.id);if(s){i({title:"Ralat",description:s.message,variant:"destructive"});return}i({title:"Bayaran dibuka semula",description:a.email}),h.invalidateQueries({queryKey:["admin-payment-intents"]})},S=async a=>{const s=window.prompt("Emel akaun pelajar yang betul:",a.email);if(!s||!s.trim())return;const{error:c}=await u.from("payment_intents").update({email:s.trim().toLowerCase(),status:"paid",claimed_by_user_id:null,claimed_at:null}).eq("id",a.id);if(c){i({title:"Ralat",description:c.message,variant:"destructive"});return}i({title:"Emel dikemas kini",description:"Pelajar boleh log masuk semula untuk menuntut pakej."}),h.invalidateQueries({queryKey:["admin-payment-intents"]})},[y,k]=p.useState(null),L=async a=>{k(a.id);try{const{data:s,error:c}=await u.functions.invoke("verify-topup",{body:{intentId:a.id}});if(c)throw c;const t=((s==null?void 0:s.results)??[])[0];t!=null&&t.applied?i({title:"Kredit dimasukkan",description:a.email}):(t==null?void 0:t.status)==="claimed"?i({title:"Sudah selesai",description:"Kredit telah pun dimasukkan sebelum ini."}):i({title:"Belum dibayar",description:`Status di gerbang bayaran: ${(t==null?void 0:t.hitpay)??(t==null?void 0:t.error)??"tidak diketahui"}`}),h.invalidateQueries({queryKey:["admin-payment-intents"]})}catch(s){i({title:"Ralat",description:(s==null?void 0:s.message)??"Gagal menyemak",variant:"destructive"})}finally{k(null)}},g=N.filter(a=>!d.trim()||a.email.toLowerCase().includes(d.toLowerCase())||a.product_key.toLowerCase().includes(d.toLowerCase())||a.external_ref.toLowerCase().includes(d.toLowerCase()));return x?e.jsx("div",{className:"min-h-screen bg-background flex items-center justify-center",children:e.jsx(f,{className:"h-8 w-8 animate-spin"})}):o?e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx(H,{}),e.jsxs("main",{className:"max-w-6xl mx-auto px-4 py-8 space-y-6",children:[e.jsxs(m,{variant:"ghost",className:"gap-2 px-0",onClick:()=>l("/admin"),children:[e.jsx(F,{className:"h-4 w-4"})," Panel Admin"]}),e.jsxs("div",{className:"flex items-start justify-between gap-4 flex-wrap",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"font-fredoka text-3xl font-semibold",children:"Bayaran Masuk"}),e.jsx("p",{className:"text-muted-foreground mt-1",children:"Semua transaksi topup kredit melalui HitPay."})]}),e.jsxs(m,{variant:"outline",className:"gap-2",onClick:()=>w(),disabled:j,children:[e.jsx(G,{className:`h-4 w-4 ${j?"animate-spin":""}`})," Muat Semula"]})]}),e.jsxs(A,{children:[e.jsxs(D,{children:[e.jsx(I,{className:"font-fredoka text-lg",children:"Senarai Bayaran"}),e.jsx(M,{children:'Status "Selesai" bermakna kredit telah dimasukkan ke akaun pelajar secara automatik.'})]}),e.jsxs(P,{className:"space-y-4",children:[e.jsxs("div",{className:"relative",children:[e.jsx(J,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(q,{className:"pl-9",placeholder:"Cari emel, produk atau rujukanâ¦",value:d,onChange:a=>b(a.target.value)})]}),C?e.jsx("div",{className:"py-8 flex justify-center",children:e.jsx(f,{className:"h-6 w-6 animate-spin"})}):g.length===0?e.jsx("p",{className:"text-sm text-muted-foreground py-6 text-center",children:"Tiada bayaran dijumpai."}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(Q,{children:[e.jsx(z,{children:e.jsxs(v,{children:[e.jsx(n,{children:"Emel"}),e.jsx(n,{children:"Produk"}),e.jsx(n,{children:"Jumlah"}),e.jsx(n,{children:"Rujukan"}),e.jsx(n,{children:"Status"}),e.jsx(n,{children:"Tarikh"}),e.jsx(n,{children:"Tindakan"})]})}),e.jsx($,{children:g.map(a=>e.jsxs(v,{children:[e.jsx(r,{className:"text-sm",children:a.email}),e.jsx(r,{className:"font-mono text-xs",children:a.product_key}),e.jsx(r,{children:a.amount!=null?`RM ${Number(a.amount).toFixed(2)}`:"â"}),e.jsx(r,{className:"font-mono text-xs",children:a.external_ref}),e.jsx(r,{children:e.jsx(K,{variant:a.status==="claimed"?"default":a.status==="failed"||a.status==="void"?"destructive":"secondary",children:a.status==="claimed"?"Selesai":a.status==="paid"?"Dibayar":a.status==="failed"?"Gagal":a.status==="void"?"Dibatalkan":"Menunggu bayaran"})}),e.jsx(r,{className:"text-xs text-muted-foreground",children:V(a.created_at)}),e.jsx(r,{children:e.jsxs("div",{className:"flex gap-1",children:[a.status!=="claimed"&&e.jsx(m,{variant:"outline",size:"sm",onClick:()=>L(a),disabled:y===a.id,children:y===a.id?e.jsx(f,{className:"h-3 w-3 animate-spin"}):"Semak semula"}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>S(a),children:"Tukar emel"}),a.status==="claimed"&&e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>_(a),children:"Buka semula"})]})})]},a.id))})]})})]})]})]})]}):null};export{ie 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.