PageSourceSearch

https://cridergpt.com/assets/ReceiptPanel-CLUTgB5F.js

js cridergpt.com collected 2026-10-02 01:27:01 UTC 7,839 bytes, 1 lines download raw bytes

1import{u as se,a as te,r as a,s as o,j as e,ai as N,C as m,e as x,aj as ae,ak as re,B as v,Y as le,n as ie,E as O,G as z,H as B,J as V,N as w,b as ne,c as ce,y as n,a6 as y,z as de,U as oe,I as me,d as xe,al as pe,T as ue}from"./index-0skl7k4W.js";const Y=["general","groceries","fuel","farm-supplies","equipment","feed","veterinary","repairs","clothing","food","entertainment","utilities","insurance","other"];function ge(){const{user:l}=se(),{toast:g}=te(),[b,S]=a.useState([]),[G,C]=a.useState(!0),[p,R]=a.useState(!1),[D,F]=a.useState(!1),[j,H]=a.useState("all"),[u,T]=a.useState(""),[h,U]=a.useState(""),[_,I]=a.useState("general"),[k,$]=a.useState(new Date().toISOString().split("T")[0]),[A,E]=a.useState(""),[c,P]=a.useState(null),[q,L]=a.useState(null),f=a.useCallback(async()=>{if(!l)return;C(!0);const{data:s,error:t}=await o.from("receipts").select("*").eq("user_id",l.id).order("receipt_date",{ascending:!1});!t&&s&&S(s),C(!1)},[l]);a.useEffect(()=>{f()},[f]);const J=s=>{var i;const t=(i=s.target.files)==null?void 0:i[0];if(!t)return;P(t);const r=new FileReader;r.onloadend=()=>L(r.result),r.readAsDataURL(t)},W=async s=>{if(s.preventDefault(),!l||!u||!h)return;F(!0);let t=null;try{if(c){const i=c.name.split(".").pop(),M=`${l.id}/${Date.now()}.${i}`,{error:Z}=await o.storage.from("receipts").upload(M,c);if(!Z){const{data:ee}=o.storage.from("receipts").getPublicUrl(M);t=ee.publicUrl}}const{error:r}=await o.from("receipts").insert({user_id:l.id,store_name:u,amount:parseFloat(h),category:_,receipt_date:k,notes:A||null,image_url:t});if(r)throw r;g({title:"Receipt saved",description:`$${parseFloat(h).toFixed(2)} at ${u}`}),T(""),U(""),I("general"),E(""),P(null),L(null),R(!1),$(new Date().toISOString().split("T")[0]),f()}catch(r){g({title:"Error",description:r.message,variant:"destructive"})}finally{F(!1)}},X=async s=>{const{error:t}=await o.from("receipts").delete().eq("id",s);t||(S(r=>r.filter(i=>i.id!==s)),g({title:"Deleted",description:"Receipt removed"}))},d=j==="all"?b:b.filter(s=>s.category===j),K=d.reduce((s,t)=>s+Number(t.amount),0),Q=d.filter(s=>{const t=new Date(s.receipt_date),r=new Date;return t.getMonth()===r.getMonth()&&t.getFullYear()===r.getFullYear()}).reduce((s,t)=>s+Number(t.amount),0);return l?e.jsxs("div",{className:"p-4 md:p-6 space-y-6 max-w-4xl mx-auto",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsx(m,{children:e.jsxs(x,{className:"pt-6 flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-primary/10",children:e.jsx(ae,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Total Spent"}),e.jsxs("p",{className:"text-xl font-bold",children:["$",K.toFixed(2)]})]})]})}),e.jsx(m,{children:e.jsxs(x,{className:"pt-6 flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-primary/10",children:e.jsx(re,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"This Month"}),e.jsxs("p",{className:"text-xl font-bold",children:["$",Q.toFixed(2)]})]})]})}),e.jsx(m,{children:e.jsxs(x,{className:"pt-6 flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-primary/10",children:e.jsx(N,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Receipts"}),e.jsx("p",{className:"text-xl font-bold",children:d.length})]})]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsxs(v,{onClick:()=>R(!p),className:"gap-2",children:[p?e.jsx(le,{className:"h-4 w-4"}):e.jsx(ie,{className:"h-4 w-4"}),p?"Cancel":"Add Receipt"]}),e.jsxs(O,{value:j,onValueChange:H,children:[e.jsx(z,{className:"w-[160px]",children:e.jsx(B,{placeholder:"Filter"})}),e.jsxs(V,{children:[e.jsx(w,{value:"all",children:"All Categories"}),Y.map(s=>e.jsx(w,{value:s,children:s.replace("-"," ").replace(/\b\w/g,t=>t.toUpperCase())},s))]})]})]}),p&&e.jsxs(m,{children:[e.jsx(ne,{children:e.jsx(ce,{className:"text-lg",children:"New Receipt"})}),e.jsx(x,{children:e.jsxs("form",{onSubmit:W,className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(n,{children:"Store Name *"}),e.jsx(y,{value:u,onChange:s=>T(s.target.value),placeholder:"Walmart, Tractor Supply...",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(n,{children:"Amount *"}),e.jsx(y,{type:"number",step:"0.01",min:"0",value:h,onChange:s=>U(s.target.value),placeholder:"0.00",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(n,{children:"Category"}),e.jsxs(O,{value:_,onValueChange:I,children:[e.jsx(z,{children:e.jsx(B,{})}),e.jsx(V,{children:Y.map(s=>e.jsx(w,{value:s,children:s.replace("-"," ").replace(/\b\w/g,t=>t.toUpperCase())}
1,s))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(n,{children:"Date"}),e.jsx(y,{type:"date",value:k,onChange:s=>$(s.target.value)})]}),e.jsxs("div",{className:"space-y-2 sm:col-span-2",children:[e.jsx(n,{children:"Notes"}),e.jsx(de,{value:A,onChange:s=>E(s.target.value),placeholder:"Optional notes...",rows:2})]}),e.jsxs("div",{className:"space-y-2 sm:col-span-2",children:[e.jsx(n,{children:"Receipt Photo"}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("label",{className:"cursor-pointer flex items-center gap-2 px-4 py-2 border border-dashed border-border rounded-lg hover:bg-muted/50 transition-colors",children:[e.jsx(oe,{className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:c?c.name:"Upload image"}),e.jsx("input",{type:"file",accept:"image/*",className:"hidden",onChange:J})]}),q&&e.jsx("img",{src:q,alt:"Preview",className:"h-16 w-16 object-cover rounded-lg border"})]})]}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(v,{type:"submit",disabled:D,className:"w-full",children:D?"Saving...":"Save Receipt"})})]})})]}),G?e.jsx("p",{className:"text-center text-muted-foreground py-8",children:"Loading receipts..."}):d.length===0?e.jsxs("div",{className:"text-center py-12 text-muted-foreground",children:[e.jsx(N,{className:"h-12 w-12 mx-auto mb-3 opacity-40"}),e.jsx("p",{children:'No receipts yet. Tap "Add Receipt" to start tracking.'})]}):e.jsx("div",{className:"space-y-3",children:d.map(s=>e.jsx(m,{className:"overflow-hidden",children:e.jsxs(x,{className:"p-4 flex items-center gap-4",children:[s.image_url?e.jsx("img",{src:s.image_url,alt:"Receipt",className:"h-14 w-14 object-cover rounded-lg border flex-shrink-0"}):e.jsx("div",{className:"h-14 w-14 rounded-lg border bg-muted flex items-center justify-center flex-shrink-0",children:e.jsx(me,{className:"h-5 w-5 text-muted-foreground"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("p",{className:"font-medium truncate",children:s.store_name}),e.jsx(xe,{variant:"outline",className:"text-xs capitalize",children:s.category.replace("-"," ")})]}),e.jsxs("div",{className:"flex items-center gap-3 text-xs text-muted-foreground mt-1",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(pe,{className:"h-3 w-3"}),new Date(s.receipt_date).toLocaleDateString()]}),s.notes&&e.jsx("span",{className:"truncate",children:s.notes})]})]}),e.jsxs("p",{className:"text-lg font-bold text-primary whitespace-nowrap",children:["$",Number(s.amount).toFixed(2)]}),e.jsx(v,{variant:"ghost",size:"icon",onClick:()=>X(s.id),className:"flex-shrink-0 text-destructive hover:text-destructive",children:e.jsx(ue,{className:"h-4 w-4"})})]})},s.id))})]}):e.jsxs("div",{className:"p-6 text-center text-muted-foreground",children:[e.jsx(N,{className:"h-12 w-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{children:"Sign in to track your receipts and spending."})]})}export{ge as ReceiptPanel};

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.