PageSourceSearch

https://veny.ai/assets/AdminKoiReservationsPage-DRFpmRCe.js

js veny.ai collected 2026-10-05 13:15:09 UTC 9,745 bytes, 1 lines download raw bytes

1import{u as le,af as oe,ag as de,j as e,B as V,ah as ce}from"./index-ChOdbEJN.js";import{C as me}from"./calendar.esm-BNmS-lHz.js";import{D as ue,C as l}from"./datatable.esm-DbCbHG9R.js";import{D as pe}from"./dialog.esm-G7esLAWk.js";import{D as f}from"./dropdown.esm-LCWSAFrC.js";import{I as xe}from"./inputtext.esm-Y2aIBeKw.js";import{M as w}from"./message.esm-D3LVuJ7p.js";import{T as fe}from"./toast.esm-B5ewaiHI.js";import{r as a,N as he,L as A}from"./react-D_YziTm7.js";import{h as p,f as P}from"./adminFormat-CDkP-i5h.js";import{I as K}from"./IncidentStatusBadge-gL4AH49f.js";import{B as je}from"./Badge-D5-_N4Zg.js";import"./index.esm-7sxvL-zo.js";import"./index.esm-QdiYKyCO.js";import"./index.esm-fKObiNN3.js";import"./overlayservice.esm-Be5AqYuX.js";import"./csstransition.esm-BDhP0-LB.js";import"./inputnumber.esm-DHTwVdwF.js";import"./index.esm-BZ4swbPz.js";import"./index.esm-DYyGOYry.js";import"./TransitionGroup-MNsm6gAs.js";const ye="_summaryGrid_1sk40_1",ve="_summaryCard_1sk40_7",ge="_summaryLabel_1sk40_16",Ne="_summaryValue_1sk40_21",Se="_rowAttention_1sk40_26",be="_detailGrid_1sk40_30",Ie="_detailDialogContent_1sk40_36",r={summaryGrid:ye,summaryCard:ve,summaryLabel:ge,summaryValue:Ne,rowAttention:Se,detailGrid:be,detailDialogContent:Ie},Re=[{label:"All",value:""},{label:"Needs attention",value:"true"},{label:"OK",value:"false"}],Ce=[{label:"All statuses",value:""},...["pending_payment","payment_processing","payment_failed","confirming","confirmed","confirmation_failed","cancelled","completed","expired","refunded"].map(n=>({label:p(n),value:n}))],_e=[{label:"All payments",value:""},...["pending","succeeded","failed","refunded","expired"].map(n=>({label:p(n),value:n}))],we=[{label:"All confirmations",value:""},...["not_started","confirming","confirmed","failed","n/a"].map(n=>({label:p(n),value:n}))],Ae=[{label:"All refund states",value:""},...["none","requested","completed","failed"].map(n=>({label:p(n),value:n}))];function We(){const{isAdmin:n,loading:v}=le(),T=a.useRef(null),[M,z]=a.useState([]),[h,U]=a.useState(null),[H,k]=a.useState(!0),[D,O]=a.useState(null),[g,o]=a.useState(1),[x,$]=a.useState(20),[q,Y]=a.useState(0),[N,J]=a.useState(""),[F,Q]=a.useState(""),[j,W]=a.useState(""),[t,E]=a.useState(null),[L,B]=a.useState(!1),[S,X]=a.useState(""),[b,Z]=a.useState(""),[I,ee]=a.useState(""),[R,se]=a.useState(""),[C,te]=a.useState(null),[d,ae]=a.useState({}),G=a.useCallback(async()=>{try{k(!0),O(null);const s=j==="true"?!0:j==="false"?!1:void 0,[i,c]=C??[],m=i?new Date(i):null;m==null||m.setHours(0,0,0,0);const u=c?new Date(c):i?new Date(i):null;u==null||u.setHours(23,59,59,999);const y=await oe({page:g,pageSize:x,search:F||void 0,needsAttention:s,status:S||void 0,paymentStatus:b||void 0,confirmationStatus:I||void 0,refundStatus:R||void 0,startDate:m==null?void 0:m.toISOString(),endDate:u==null?void 0:u.toISOString()});z(y.data.items),U(y.data.summary),Y(y.data.totalRecords),de("koi_reservation",y.data.items.map(_=>_.internalReservationId)).then(_=>ae(ie=>({...ie,..._}))).catch(()=>{})}catch(s){O(s instanceof Error?s.message:"Failed to load reservations")}finally{k(!1)}},[g,x,F,j,S,b,I,R,C]);a.useEffect(()=>{!v&&n&&G()},[v,n,G]),a.useEffect(()=>{const s=setTimeout(()=>Q(N),400);return()=>clearTimeout(s)},[N]);const ne=async s=>{var i;try{B(!0);const c=await ce(s.internalReservationId);E(c)}catch(c){(i=T.current)==null||i.show({severity:"error",summary:"Error",detail:c instanceof Error?c.message:"Failed to load detail"})}finally{B(!1)}},re=s=>{o((s.page??0)+1),$(s.rows??x)};return v?e.jsx("div",{className:"p-4",children:"Loading..."}):n?e.jsxs("div",{className:"p-4 flex flex-column gap-4",children:[e.jsx(fe,{ref:T}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold m-0",children:"KOI Reservations"}),e.jsx("p",{className:"text-600 mt-2 mb-0",children:"Veny ride reservations across all users. Nomadly rides are managed under Nomadly Orders. Retry and refund are done from the reservation's incident in Failed Purchases."})]}),h&&e.jsxs("div",{className:r.summaryGrid,children:[e.jsxs("div",{className:r.summaryCard,children:[e.jsx("span",{className:r.summaryLabel,children:"Total"}),e.jsx("span",{className:r.summaryValue,children:h.total})]}),e.jsxs("div",{className:r.summaryCard,children:[e.jsx("span",{className:r.summaryLabel,children:"Confirmed"}),e.jsx("span",{className:r.summaryValue,children:h.confirmed})]}),e.jsxs("div",{className:r.summaryCard,children:[e.jsx("span",{className:r.summaryLabel,children:"Needs attention"}),e.jsx("span",{className:r.summaryValue,children:h.needsAttention})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-3 align-items-center",children:[e.jsx(xe,{value:N,onChange:s=>J(s.target.value),placeholder:"Search ID, email, phone, reference...",className:"w-full md:w-20rem"}
1),e.jsx(f,{value:j,options:Re,onChange:s=>{W(s.value),o(1)},placeholder:"Attention filter",className:"w-12rem"}),e.jsx(f,{value:S,options:Ce,onChange:s=>{X(s.value),o(1)},className:"w-14rem","aria-label":"Status filter"}),e.jsx(f,{value:b,options:_e,onChange:s=>{Z(s.value),o(1)},className:"w-12rem","aria-label":"Payment filter"}),e.jsx(f,{value:I,options:we,onChange:s=>{ee(s.value),o(1)},className:"w-14rem","aria-label":"Confirmation filter"}),e.jsx(f,{value:R,options:Ae,onChange:s=>{se(s.value),o(1)},className:"w-14rem","aria-label":"Refund filter"}),e.jsx(me,{value:C,onChange:s=>{te(s.value??null),o(1)},selectionMode:"range",readOnlyInput:!0,showButtonBar:!0,placeholder:"Created between",className:"w-14rem","aria-label":"Date range"})]}),D&&e.jsx(w,{severity:"error",text:D,className:"w-full"}),e.jsxs(ue,{value:M,loading:H,paginator:!0,lazy:!0,rows:x,first:(g-1)*x,totalRecords:q,onPage:re,rowClassName:s=>s.needsAttention?r.rowAttention:"",emptyMessage:"No reservations found",children:[e.jsx(l,{header:"Customer",body:s=>e.jsxs("div",{className:"flex flex-column gap-1",children:[e.jsx("span",{className:"font-semibold",children:s.customerName}),e.jsx("span",{className:"text-sm text-600",children:s.customerEmail})]})}),e.jsx(l,{field:"pickupDate",header:"Pickup"}),e.jsx(l,{header:"Route",body:s=>e.jsxs("span",{className:"text-sm",children:[s.pickupAddress??"—"," → ",s.dropoffAddress??"—"]})}),e.jsx(l,{header:"Status",body:s=>e.jsxs("div",{className:"flex flex-column gap-1",children:[e.jsx(je,{tone:s.needsAttention?"warning":"neutral",children:s.status}),s.needsAttention&&e.jsx("span",{className:"text-xs text-orange-600",children:s.attentionReasons.join(", ")})]})}),e.jsx(l,{header:"Total",body:s=>`${s.currency} ${Number(s.totalPrice).toFixed(2)}`}),e.jsx(l,{header:"Fulfilment",body:s=>p(s.confirmationStatus)}),e.jsx(l,{header:"Refund",body:s=>p(s.refundStatus)}),e.jsx(l,{header:"Incident",body:s=>{const i=d[s.internalReservationId];return i?e.jsxs("div",{className:"flex flex-column gap-1",children:[e.jsx(K,{status:i.status,resolution:i.resolution}),e.jsx(A,{to:P(i.incidentId),className:"text-sm",children:"Open in Failed Purchases"})]}):e.jsx("span",{className:"text-500",children:"—"})}}),e.jsx(l,{header:"Actions",body:s=>e.jsx(V,{label:"View",icon:"pi pi-eye",text:!0,onClick:()=>ne(s)})})]}),e.jsxs(pe,{header:"Reservation detail",visible:!!t,onHide:()=>E(null),style:{width:"min(720px, 95vw)"},contentClassName:r.detailDialogContent,maximizable:!0,children:[L&&e.jsx("p",{children:"Loading..."}),t&&!L&&e.jsxs("div",{className:"flex flex-column gap-3",children:[e.jsxs("div",{className:r.detailGrid,children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Customer"}),e.jsxs("p",{className:"m-0 mt-1",children:[t.customerName,e.jsx("br",{}),t.customerEmail," · ",t.customerPhone]})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"IDs"}),e.jsxs("p",{className:"m-0 mt-1 text-sm font-mono",children:["Internal: ",t.internalReservationId,e.jsx("br",{}),"KOI: ",t.reservationId??"—"," · Ref:"," ",t.reference??"—"]})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Payment"}),e.jsxs("p",{className:"m-0 mt-1 text-sm",children:[t.paymentStatus," · ",t.currency," ",t.calculatedTotalPrice.toFixed(2),e.jsx("br",{}),"PI: ",t.stripePaymentIntentId??"—"]})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Pickup"}),e.jsxs("p",{className:"m-0 mt-1 text-sm",children:[t.pickupDate," ",t.pickupTime,e.jsx("br",{}),t.pickupAddress," → ",t.dropoffAddress]})]})]}),(t.canRetry||t.canRefund)&&e.jsx(w,{severity:"warn",className:"w-full justify-content-start",content:e.jsxs("span",{children:["This reservation needs action (",[t.canRetry&&"retry",t.canRefund&&"refund"].filter(
1Boolean).join(" / "),")."," ",d[t.internalReservationId]?e.jsx(A,{to:P(d[t.internalReservationId].incidentId),children:"Open the incident in Failed Purchases"}):"Its incident will appear in Failed Purchases."]})}),d[t.internalReservationId]&&e.jsxs("div",{className:"flex flex-wrap align-items-center gap-2",children:[e.jsx("strong",{children:"Incident"}),e.jsx(K,{status:d[t.internalReservationId].status,resolution:d[t.internalReservationId].resolution}),e.jsx(A,{to:P(d[t.internalReservationId].incidentId),children:"Open in Failed Purchases"})]}),t.lastConfirmationError&&e.jsx(w,{severity:"error",text:t.lastConfirmationError}),t.timeline.length>0&&e.jsxs("div",{children:[e.jsx("strong",{children:"Timeline"}),e.jsx("ul",{className:"m-0 mt-2 pl-3 text-sm",children:t.timeline.map(s=>e.jsxs("li",{children:[s.createdAt,": ",s.eventType," ",s.fromStatus?`${s.fromStatus} → `:"",s.toStatus]},s.eventId))})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:t.stripeReceiptUrl&&e.jsx(V,{label:"Stripe receipt",icon:"pi pi-external-link",text:!0,onClick:()=>window.open(t.stripeReceiptUrl,"_blank")})})]})]})]}):e.jsx(he,{to:"/app/dashboard",replace:!0})}export{We as AdminKoiReservationsPage};

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.