PageSourceSearch

https://the-gazel.lovable.app/assets/CoopDashboardPage-Pitd1727.js

js the-gazel.lovable.app collected 2026-10-03 03:52:11 UTC 7,250 bytes, 1 lines download raw bytes

1import{j as e}from"./ui-BcZpBtGC.js";import{C as m,a as u,T as f,bE as b,e as x,g as p,k as j,P as N,f as y,m as C,aw as v,u as _,s as L}from"./index-D4z10nuM.js";import{T as w}from"./trending-down-BgsDNpCw.js";import{R as D}from"./receipt-text-BDuc8Q-l.js";import{C as R}from"./calendar-clock-BoUWnyKO.js";import{f as T}from"./format-BE36S-lJ.js";import{C as F}from"./CoopNav-Dh0DiAdM.js";import{r as M}from"./vendor-CbTYwD9p.js";import{u as q}from"./useQuery-Bg5MGr3j.js";import{u as S}from"./useContributions-DXvSKsHo.js";import{u as $}from"./useLoans-D6UTaWaf.js";import{u as A}from"./useRepayments-BViyJ28U.js";import"./router-C21RS5Se.js";import"./constants-DQX8fu4l.js";import"./startOfYear-CRigkeXM.js";import"./useMutation-Bk0igXSc.js";const E=({wallet:t,isLoading:n})=>{if(n)return e.jsx(m,{children:e.jsx(u,{className:"p-6",children:e.jsx("div",{className:"animate-pulse h-20 bg-muted rounded"})})});const a=[{label:"Contributions",value:(t==null?void 0:t.contribution_balance)||0,icon:f,color:"text-green-600"},{label:"Loan Balance",value:(t==null?void 0:t.loan_balance)||0,icon:w,color:"text-red-500"},{label:"Net Equity",value:(t==null?void 0:t.net_equity)||0,icon:b,color:"text-primary"}];return e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:a.map(r=>e.jsxs(m,{children:[e.jsxs(x,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(p,{className:"text-sm font-medium text-muted-foreground",children:r.label}),e.jsx(r.icon,{className:`h-4 w-4 ${r.color}`})]}),e.jsx(u,{children:e.jsxs("div",{className:`text-2xl font-bold ${r.color}`,children:["$",r.value.toLocaleString("en-US",{minimumFractionDigits:2})]})})]},r.label))})},Q=({wallet:t,isLoadingWallet:n,eligibility:a,loans:r,contributions:c=[],repayments:o=[]})=>{const l=r.filter(s=>["disbursed","repaying","approved"].includes(s.status)),d=r.filter(s=>s.status==="pending"),h=c.reduce((s,i)=>s+Number(i.amount),0),g=o.filter(s=>s.status!=="paid").sort((s,i)=>new Date(s.due_date).getTime()-new Date(i.due_date).getTime())[0];return e.jsxs("div",{className:"space-y-6",children:[e.jsx(E,{wallet:t,isLoading:n}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs(m,{children:[e.jsxs(x,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(p,{className:"text-sm font-medium text-muted-foreground",children:"My Contributions"}),e.jsx(D,{className:"h-4 w-4 text-primary"})]}),e.jsxs(u,{children:[e.jsxs("p",{className:"text-2xl font-bold",children:["$",h.toLocaleString("en-US",{minimumFractionDigits:2})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[c.length," contribution",c.length===1?"":"s"," on record"]})]})]}),e.jsxs(m,{children:[e.jsxs(x,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(p,{className:"text-sm font-medium text-muted-foreground",children:"Current Loan Amount"}),e.jsx(j,{className:"h-4 w-4 text-primary"})]}),e.jsxs(u,{children:[e.jsxs("p",{className:"text-2xl font-bold",children:["$",Number((t==null?void 0:t.loan_balance)||0).toLocaleString("en-US",{minimumFractionDigits:2})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Outstanding cooperative loan balance"})]})]}),e.jsxs(m,{children:[e.jsxs(x,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(p,{className:"text-sm font-medium text-muted-foreground",children:"Next Repayment"}),e.jsx(R,{className:"h-4 w-4 text-primary"})]}),e.jsx(u,{children:g?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-2xl font-bold",children:["$",Number(g.amount).toFixed(2)]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Due ",T(new Date(g.due_date),"MMM d, yyyy")]})]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-2xl font-bold",children:"—"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"No upcoming repayments"})]})})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs(m,{children:[e.jsx(x,{children:e.jsx(p,{className:"text-sm",children:"Loan Eligibility"})}),e.jsx(u,{children:a?e.jsxs("div",{className:"flex items-start gap-3",children:[a.eligible?e.jsx(N,{className:"h-5 w-5 text-green-600 mt-0.5"}):e.jsx(y,{className:"h-5 w-5 text-yellow-600 mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm",children:a.reason}),a.eligible&&e.jsxs("p",{className:"text-lg font-bold text-primary mt-1",children:["Max: $",a.max_loan_amount.toLocaleStr
1ing("en-US",{minimumFractionDigits:2})]})]})]}):e.jsx("p",{className:"text-muted-foreground text-sm",children:"Loading..."})})]}),e.jsxs(m,{children:[e.jsx(x,{children:e.jsx(p,{className:"text-sm",children:"Active Loans"})}),e.jsxs(u,{children:[l.length>0?e.jsx("ul",{className:"space-y-2",children:l.map(s=>e.jsxs("li",{className:"flex justify-between items-center text-sm",children:[e.jsxs("span",{children:["$",Number(s.amount_approved||s.amount_requested).toFixed(2)]}),e.jsx(C,{variant:"secondary",className:"capitalize",children:s.status})]},s.id))}):e.jsx("p",{className:"text-muted-foreground text-sm",children:"No active loans."}),d.length>0&&e.jsxs("div",{className:"mt-3 flex items-center gap-2 text-sm text-yellow-600",children:[e.jsx(j,{className:"h-4 w-4"}),d.length," pending application",d.length>1?"s":""]})]})]})]})]})};function U(){const{currentOrg:t}=v(),{user:n}=_(),a=t==null?void 0:t.id,{data:r,isLoading:c}=q({queryKey:["coop-wallet",a,n==null?void 0:n.id],queryFn:async()=>{if(!a||!(n!=null&&n.id))return null;const{data:o,error:l}=await L.rpc("get_coop_wallet",{_org_id:a,_user_id:n.id});if(l)throw l;const d=o==null?void 0:o[0];return d||{contribution_balance:0,loan_balance:0,net_equity:0}},enabled:!!a&&!!(n!=null&&n.id)});return{wallet:r,isLoading:c}}function k(){const t=U(),n=S(),a=$(),r=A(),c=M.useMemo(()=>{const o=n.contributions,l=a.loans,d=r.repayments,h=d.filter(s=>s.status==="paid"),g=d.filter(s=>s.status!=="paid");return{totalContributed:o.reduce((s,i)=>s+Number(i.amount),0),contributionCount:o.length,latestContribution:o[0]??null,recurringCount:o.filter(s=>s.is_recurring).length,activeLoans:l.filter(s=>
1["approved","disbursed","repaying"].includes(s.status)),pendingLoans:l.filter(s=>s.status==="pending"),totalRequested:l.reduce((s,i)=>s+Number(i.amount_requested),0),totalApproved:l.reduce((s,i)=>s+Number(i.amount_approved||0),0),totalRepaid:h.reduce((s,i)=>s+Number(i.amount),0),nextRepayment:g.sort((s,i)=>new Date(s.due_date).getTime()-new Date(i.due_date).getTime())[0]??null}},[n.contributions,a.loans,r.repayments]);return{wallet:t.wallet,contributions:n.contributions,loans:a.loans,eligibility:a.eligibility,repayments:r.repayments,summary:c,isLoading:t.isLoading||n.isLoading||a.isLoading||r.isLoading}}const te=()=>{const{wallet:t,isLoading:n,eligibility:a,loans:r,contributions:c,repayments:o}=k();return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"My Cooperative Account"}),e.jsx("p",{className:"text-muted-foreground",children:"Your contributions, loan balance, eligibility, and repayment information"})]}),e.jsx(F,{}),e.jsx(Q,{wallet:t,isLoadingWallet:n,eligibility:a,loans:r,contributions:c,repayments:o})]})};export{te 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.