33 lines
12 KiB
JavaScript
33 lines
12 KiB
JavaScript
import{c as y,d as u,q as B,o as I,a as A,b as f,s as v,e as k,f as T,l as M,w as E,g as U,i as D,h as N,j as R,k as H,m as P,n as F,p as q,r as C}from"./donors-BfBdprwo.js";/* empty css */const S=y(u,"comments");let b=null;function O(e){const o=B(S,I("timestamp","desc"));return b=A(o,n=>{const t=[];n.forEach(a=>{t.push({id:a.id,...a.data()})}),e(t)},n=>{console.error("Error fetching comments:",n),e([])}),b}async function Y(e,o){return!e||!o.trim()?null:f(S,{userId:e.uid,userName:e.displayName||"Anonymous",userPhoto:e.photoURL||"",text:o.trim(),timestamp:v()})}async function _(e){return k(T(u,"comments",e))}const j=y(u,"students");async function W(e){const o=e.trim().toLowerCase();if(!o)return[];const n=o+"",t=B(j,E("nameLower",">=",o),E("nameLower","<=",n),I("nameLower"),M(50));try{const a=await U(t),s=[];return a.forEach(r=>{s.push({id:r.id,...r.data()})}),s}catch(a){return console.error("Error searching students:",a),[]}}const G=y(u,"subscribers");async function J(e){return f(G,{email:e,subscribedAt:v()})}const X=y(u,"pendingDonations"),z="dominica-methodist-circuit",K="https://pay.shopdm.store";async function Q({name:e,amount:o,classYear:n,message:t,anonymous:a}){return(await f(X,{name:a?"Anonymous":e,amount:Number(o),classYear:n||"",message:t||"",anonymous:!!a,status:"pending",env:"production",createdAt:v()})).id}function V(e,o,n){const t=Number(o).toFixed(2),a=`WHS 100th Anniversary Donation - ${n}`,s=new URLSearchParams({total_xcd:t,reason:a,invoice_id:e,redirect:"true"});return`${K}/${z}?${s.toString()}`}let w=[],g=[];document.addEventListener("DOMContentLoaded",()=>{D(),Z(),ee(),te(),ne(),se(),ie(),me(),ue(),le(),he(),N(re),O(de)});function Z(){const e=document.getElementById("tabNav");e.addEventListener("click",o=>{const n=o.target.closest(".tab-btn");if(!n)return;e.querySelectorAll(".tab-btn").forEach(a=>a.classList.remove("active")),n.classList.add("active"),document.querySelectorAll(".tab-panel").forEach(a=>a.classList.remove("active"));const t=document.getElementById(`tab-${n.dataset.tab}`);t&&t.classList.add("active")})}function ee(){const e=document.getElementById("carouselTrack"),o=e.querySelectorAll(".carousel-slide"),n=document.querySelectorAll(".dot"),t=document.getElementById("carouselPrev"),a=document.getElementById("carouselNext");let s=0,r;function i(c){s=(c%o.length+o.length)%o.length,e.style.transform=`translateX(-${s*100}%)`,n.forEach((p,$)=>p.classList.toggle("active",$===s))}function l(){h(),r=setInterval(()=>i(s+1),5e3)}function h(){clearInterval(r)}t.addEventListener("click",()=>{i(s-1),l()}),a.addEventListener("click",()=>{i(s+1),l()}),n.forEach(c=>{c.addEventListener("click",()=>{i(Number(c.dataset.index)),l()})}),l()}function te(){const e=window.location.href,o="Wesley High School - 100th Anniversary Fundraiser",n="Support Wesley High School's 100th Anniversary Celebrations! Help us celebrate a century of excellence.";document.getElementById("shareFacebook").addEventListener("click",()=>{window.open(`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(e)}`,"_blank","width=600,height=400")}),document.getElementById("shareTwitter").addEventListener("click",()=>{window.open(`https://twitter.com/intent/tweet?text=${encodeURIComponent(n)}&url=${encodeURIComponent(e)}`,"_blank","width=600,height=400")}),document.getElementById("shareEmail").addEventListener("click",()=>{window.location.href=`mailto:?subject=${encodeURIComponent(o)}&body=${encodeURIComponent(n+`
|
|
|
|
`+e)}`})}function ne(){document.getElementById("loginGoogle").addEventListener("click",R),document.getElementById("logoutBtn").addEventListener("click",H),P(oe)}function oe(e){const o=document.getElementById("authPrompt"),n=document.getElementById("commentForm"),t=document.getElementById("userAvatar"),a=document.getElementById("userName");e?(o.classList.add("hidden"),n.classList.remove("hidden"),t.src=e.photoURL||ae(e.displayName||"U"),t.alt=e.displayName||"User",a.textContent=e.displayName||e.email||"User"):(o.classList.remove("hidden"),n.classList.add("hidden"))}function ae(e){const o=e.charAt(0).toUpperCase(),n=document.createElement("canvas");n.width=80,n.height=80;const t=n.getContext("2d");return t.fillStyle="#1a1a6e",t.fillRect(0,0,80,80),t.fillStyle="#ffffff",t.font="bold 36px Inter, sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillText(o,40,40),n.toDataURL()}function se(){const e=document.getElementById("commentText"),o=document.getElementById("charCount"),n=document.getElementById("postCommentBtn");e.addEventListener("input",()=>{o.textContent=`${e.value.length}/500`}),n.addEventListener("click",async()=>{const t=C(),a=e.value.trim();if(!(!t||!a)){n.disabled=!0,n.textContent="Posting...";try{await Y(t,a),e.value="",o.textContent="0/500"}catch(s){console.error("Error posting comment:",s),m("Failed to post comment. Please try again.","error")}finally{n.disabled=!1,n.textContent="Post Comment"}}})}function re(e){w=e.filter(n=>!n.status||n.status==="confirmed");const o=q(e);document.getElementById("totalRaised").textContent=`$${o.toLocaleString()}`,x()}function ie(){document.getElementById("donorSort").addEventListener("change",x)}function x(){const e=document.getElementById("donorsList"),o=document.getElementById("donorsEmpty"),n=document.getElementById("donorSort").value,t=F(w,n);if(t.length===0){e.innerHTML="",e.appendChild(o),o.classList.remove("hidden");return}e.innerHTML=t.map(a=>{const s=(a.name||"A").charAt(0).toUpperCase(),r=a.date?.toDate?a.date.toDate().toLocaleDateString():"",i=a.classYear?` · Class of ${a.classYear}`:"";return`
|
|
<div class="donor-card">
|
|
<div class="donor-info">
|
|
<div class="donor-avatar">${s}</div>
|
|
<div class="donor-details">
|
|
<h4>${d(a.name)}</h4>
|
|
<p>${r}${i}</p>
|
|
${a.message?`<p style="margin-top:4px;color:#374151;font-size:0.85rem">"${d(a.message)}"</p>`:""}
|
|
</div>
|
|
</div>
|
|
<div class="donor-amount">$${(a.amount||0).toLocaleString()}</div>
|
|
</div>`}).join("")}function de(e){g=e,ce()}function ce(){const e=document.getElementById("commentsList"),o=document.getElementById("commentsEmpty"),n=C();if(g.length===0){e.innerHTML="",e.appendChild(o),o.classList.remove("hidden");return}e.innerHTML=g.map(t=>{const a=t.timestamp?.toDate?ye(t.timestamp.toDate()):"just now",s=t.userPhoto?`<img class="comment-avatar" src="${d(t.userPhoto)}" alt="${d(t.userName)}" />`:`<div class="comment-avatar-placeholder">${(t.userName||"U").charAt(0).toUpperCase()}</div>`,r=n&&n.uid===t.userId?`<button class="comment-delete" data-id="${t.id}">Delete</button>`:"";return`
|
|
<div class="comment-card">
|
|
${s}
|
|
<div class="comment-body">
|
|
<div class="comment-header">
|
|
<span class="comment-author">${d(t.userName)}</span>
|
|
<span class="comment-time">${a}</span>
|
|
</div>
|
|
<p class="comment-text">${d(t.text)}</p>
|
|
${r}
|
|
</div>
|
|
</div>`}).join(""),e.querySelectorAll(".comment-delete").forEach(t=>{t.addEventListener("click",async()=>{if(confirm("Delete this comment?"))try{await _(t.dataset.id)}catch(a){console.error("Error deleting comment:",a),m("Failed to delete comment.","error")}})})}function le(){const e=document.getElementById("studentSearch"),o=document.getElementById("studentResults"),n=document.getElementById("studentSearchEmpty");let t;e.addEventListener("input",()=>{clearTimeout(t);const a=e.value.trim();if(!a){o.innerHTML="",o.appendChild(n),n.querySelector("p").textContent="Enter a name above to search for students.",n.classList.remove("hidden");return}t=setTimeout(async()=>{o.innerHTML='<div class="search-loading"><div class="loading-spinner"></div> Searching...</div>';const s=await W(a);if(s.length===0){o.innerHTML="",o.appendChild(n),n.querySelector("p").textContent=`No students found matching "${d(a)}".`,n.classList.remove("hidden");return}o.innerHTML=s.map(r=>`
|
|
<div class="student-card">
|
|
<div class="student-avatar">${(r.name||"?").charAt(0).toUpperCase()}</div>
|
|
<div class="student-info">
|
|
<h4>${d(r.name)}</h4>
|
|
<p>Class of ${d(String(r.classYear||"N/A"))}</p>
|
|
</div>
|
|
</div>`).join("")},350)})}function me(){const e=document.getElementById("newsletterForm"),o=e.querySelector('button[type="submit"]');e.addEventListener("submit",async n=>{n.preventDefault();const t=document.getElementById("newsletterEmail").value.trim();if(t){o.disabled=!0,o.textContent="Joining...";try{await J(t),m("Thank you for subscribing!","success"),e.reset()}catch(a){console.error("Newsletter subscribe error:",a),m("Failed to subscribe. Please try again.","error")}finally{o.disabled=!1,o.textContent="Join"}}})}function ue(){const e=document.getElementById("modalOverlay");document.getElementById("modalClose").addEventListener("click",()=>e.classList.add("hidden")),e.addEventListener("click",t=>{t.target===e&&e.classList.add("hidden")}),document.getElementById("becomeFundraiserBtn").addEventListener("click",()=>{L(`<h2>Become a Fundraiser</h2><p style="margin-top:12px">Create your own fundraising page and rally your classmates! Share the donation link with friends and family to help Wesley High School reach its goal.</p><button class="btn btn-primary open-donation-modal" style="margin-top:20px;display:inline-flex" onclick="document.getElementById('modalOverlay').classList.add('hidden');document.getElementById('donationModalOverlay').classList.remove('hidden')">Start Fundraising</button>`)});const n=document.getElementById("startFundraiserBtn");n&&n.addEventListener("click",()=>{L(`<h2>Start Your Fundraiser</h2><p style="margin-top:12px">Share the Wesley High School donation page with your network and help us celebrate 100 years!</p><button class="btn btn-primary open-donation-modal" style="margin-top:20px;display:inline-flex" onclick="document.getElementById('modalOverlay').classList.add('hidden');document.getElementById('donationModalOverlay').classList.remove('hidden')">Get Started</button>`)})}function L(e){document.getElementById("modalContent").innerHTML=e,document.getElementById("modalOverlay").classList.remove("hidden")}function he(){const e=document.getElementById("donationModalOverlay"),o=document.getElementById("donationModalClose"),n=document.getElementById("donationForm"),t=document.getElementById("donationSubmitBtn");document.querySelectorAll(".open-donation-modal").forEach(a=>{a.addEventListener("click",()=>e.classList.remove("hidden"))}),o.addEventListener("click",()=>e.classList.add("hidden")),e.addEventListener("click",a=>{a.target===e&&e.classList.add("hidden")}),n.addEventListener("submit",async a=>{a.preventDefault();const s=document.getElementById("donorName").value.trim(),r=document.getElementById("donorAmount").value,i=document.getElementById("donorClassYear").value.trim(),l=document.getElementById("donorMessage").value.trim(),h=document.getElementById("donorAnonymous").checked;if(!(!s||!r)){t.disabled=!0,t.textContent="Processing...";try{const c=await Q({name:s,amount:r,classYear:i,message:l,anonymous:h}),p=V(c,r,h?"Anonymous":s);window.open(p,"_blank"),e.classList.add("hidden"),n.reset(),m("Redirecting to payment. Complete your donation on the Shopdm Pay page.","success")}catch(c){console.error("Error creating donation:",c),m("Failed to process donation. Please try again.","error")}finally{t.disabled=!1,t.textContent="Proceed to Payment"}}})}function d(e){const o=document.createElement("div");return o.textContent=e||"",o.innerHTML}function ye(e){const o=Math.floor((Date.now()-e.getTime())/1e3);if(o<60)return"just now";const n=Math.floor(o/60);if(n<60)return`${n}m ago`;const t=Math.floor(n/60);if(t<24)return`${t}h ago`;const a=Math.floor(t/24);if(a<30)return`${a}d ago`;const s=Math.floor(a/30);return s<12?`${s}mo ago`:`${Math.floor(s/12)}y ago`}function m(e,o="info"){const n=document.querySelector(".toast");n&&n.remove();const t=document.createElement("div");t.className=`toast ${o}`,t.textContent=e,document.body.appendChild(t),setTimeout(()=>t.remove(),4e3)}
|