1import{u as K,_ as G}from"./BVDYKSTs.js";import{_ as Q}from"./s_p18_pm.js";import{J as X,i as T,r as g,e as Z,f as M,p as ee,u as te,c as i,b as V,a as e,s as k,h as o,F as S,v as O,g as P,t as p,x as D,y as L,d as R,z as B,A as N,o as d,n as ae}from"./ztzPJAFk.js";import{v as re}from"./Dnyct6Ft.js";import{c as oe}from"./700ePK0G.js";import{_ as se}from"./DlAUqK2U.js";import"./CN1dmOzU.js";const le=X("rewards",()=>{const y=T(),b=g([]),f=g(!1),C=async()=>{f.value=!0;try{const{data:s,error:a}=await y.from("rewards_cards").select("*").order("created_at",{ascending:!1});if(a)throw a;b.value=s||[]}catch(s){console.error("Error fetching rewards cards:",s)}finally{f.value=!1}},U=async(s,a=null,n=null,m="custom")=>{try{const{data:{user:c}}=await y.auth.getUser();if(!c)throw new Error("User not authenticated");const l={id:re(),user_id:c.id,retailer_name:s,retailer_logo:a,card_number:n,card_type:m,is_linked:!1,linked_at:null,created_at:new Date().toISOString(),updated_at:new Date().toISOString()},{error:A}=await y.from("rewards_cards").insert([l]);if(A)throw A;return b.value.unshift(l),l}catch(c){throw console.error("Error adding rewards card:",c),c}},v=async(s,a)=>{try{const n={...a,updated_at:new Date().toISOString()},{error:m}=await y.from("rewards_cards").update(n).eq("id",s);if(m)throw m;const c=b.value.findIndex(l=>l.id===s);if(c!==-1){const l=b.value[c];if(!l)return;b.value[c]={id:l.id,user_id:l.user_id,retailer_name:a.retailer_name??l.retailer_name,retailer_logo:a.retailer_logo!==void 0?a.retailer_logo:l.retailer_logo,card_number:a.card_number!==void 0?a.card_number:l.card_number,card_type:a.card_type??l.card_type,is_linked:a.is_linked??l.is_linked,linked_at:a.linked_at!==void 0?a.linked_at:l.linked_at,created_at:l.created_at,updated_at:n.updated_at}}}catch(n){throw console.error("Error updating rewards card:",n),n}};return{cards:b,isLoading:f,fetchCards:C,addCard:U,updateCard:v,linkCard:async s=>{try{await v(s,{is_linked:!0,linked_at:new Date().toISOString()})}catch(a){throw console.error("Error linking card:",a),a}},deleteCard:async s=>{try{const{error:a}=await y.from("rewards_cards").delete().eq("id",s);if(a)throw a;b.value=b.value.filter(n=>n.id!==s)}catch(a){throw console.error("Error deleting rewards card:",a),a}}}}),ne=[{name:"Kroger",logo:"ð",type:"grocery",loginUrl:"https://www.kroger.com/signin"},{name:"Safeway",logo:"ðª",type:"grocery",loginUrl:"https://www.safeway.com/account/sign-in.html"},{name:"Walmart",logo:"ð¬",type:"general",loginUrl:"https://www.walmart.com/account/login"},{name:"Target",logo:"ð¯",type:"general",loginUrl:"https://www.target.com/login"},{name:"Costco",logo:"ð¦",type:"warehouse",loginUrl:"https://www.costco.com/LogonForm"},{name:"Sam's Club",logo:"ð",type:"warehouse",loginUrl:"https://www.samsclub.com/login"},{name:"Fry's",logo:"ðï¸",type:"grocery",loginUrl:"https://www.frysfood.com/signin"},{name:"Sprouts",logo:"ð±",type:"grocery",loginUrl:"https://shop.sprouts.com/login"},{name:"Whole Foods",logo:"ð¥¬",type:"grocery",loginUrl:"https://www.amazon.com/ap/signin"},{name:"Trader Joes",logo:"ðº",type:"grocery"},{name:"Albertsons",logo:"ðï¸",type:"grocery",loginUrl:"https://www.albertsons.com/account/sign-in.html"},{name:"Publix",logo:"ðï¸",type:"grocery",loginUrl:"https://www.publix.com/myaccount/login"}],ie={class:"app-container"},de={id:"main-content",class:"main-content"},ce={class:"container"},ue={key:0,class:"loading-state"},me={class:"cards-grid"},ge={class:"card-header"},pe={class:"card-logo"},be=["onClick","aria-label"],ve={class:"card-name"},ye=["onClick","aria-label","aria-pressed"],we={"aria-hidden":"true"},_e={xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},he={class:"card-status"},fe={key:0,class:"status-badge status-linked has-number"},ke={key:1,class:"status-badge status-not-linked"},Ce={key:0},xe={class:"retailers-grid"},Ae=["onClick"],Se={class:"retailer-logo"},De={class:"retailer-name"},Ue={key:1},Ee={class:"selected-retailer"},Le={class:"retailer-logo"},Re={class:"selected-retailer-name"},Be={class:"form-group"},Ne={class:"dialog-actions"},$e=["disabled"],Fe={key:2},Me={class:"form-group"},Ve={class:"form-group"},Oe={class:"dialog-actions"},Pe=["disabled"],Te={key:3,class:"dialog-actions"},ze={id:"delete-card-description",class:"dialog-description"},He={class:"dialog-actions"},Ie=["disabled"],je=Z({__name:"rewards",setup(y){const{avatarUrl:b,userInitials:f,loadAvatar:C}=K();M(C);const U=ee(),v=le(),x=g(!1),w=g(!1),s=g(null),a=g(""),n=g(""),m=g(!1),c=g(null),l=g(!1),A=T(),E=g(!1);M(async()=>{await C(),await v.fetchCards()});const z=async()=>
1{if(!(!s.value||m.value)){m.value=!0;try{await v.addCard(s.value.name,s.value.logo,n.value.trim()||null,"popular"),h()}catch(u){console.error("Error adding card:",u),alert("Failed to add card. Please try again.")}finally{m.value=!1}}},H=async()=>{if(!(!a.value.trim()||m.value)){m.value=!0;try{await v.addCard(a.value.trim(),"ðª",n.value.trim()||null,"custom"),h()}catch(u){console.error("Error adding custom card:",u),alert("Failed to add card. Please try again.")}finally{m.value=!1}}},_=g(new Set),I=u=>{const t=new Set(_.value);t.has(u)?t.delete(u):t.add(u),_.value=t},j=u=>{c.value=u},$=()=>{c.value=null},q=async()=>{if(!(!c.value||l.value)){l.value=!0;try{await v.deleteCard(c.value.id),c.value=null}catch(u){console.error("Error deleting card:",u),alert("Failed to delete card. Please try again.")}finally{l.value=!1}}},h=()=>{x.value=!1,w.value=!1,s.value=null,a.value="",n.value=""},J=async()=>{E.value=!0;try{await oe(),await A.auth.signOut(),await new Promise(u=>setTimeout(u,300)),await U.replace("/login")}catch(u){console.error("Logout error:",u),window.location.href="/login"}finally{E.value=!1}};return te({title:"Rewards Cards - BasketBuddy"}),(u,t)=>{const W=G,Y=Q;return d(),i("div",ie,[V(W,{title:"BasketBuddy","show-back":!0,"is-logging-out":o(E),"avatar-url":o(b),"user-initials":o(f),onLogout:J},null,8,["is-logging-out","avatar-url","user-initials"]),e("main",de,[e("div",ce,[t[17]||(t[17]=e("p",{class:"page-description"}," Link your store rewards cards to track savings and get personalized deals. ",-1)),o(v).isLoading?(d(),i("div",ue,[...t[9]||(t[9]=[e("div",{class:"spinner"},null,-1),e("p",{class:"loading-text"},"Loading your cards...",-1)])])):k("",!0),e("div",me,[(d(!0),i(S,null,O(o(v).cards,r=>(d(),i("div",{key:r.id,class:ae(["reward-card",{"card-has-number":r.card_number}])},[e("div",ge,[e("div",pe,p(r.retailer_logo||"ðª"),1),e("button",{onClick:F=>j(r),class:"button-icon button-danger","aria-label":`Delete ${r.retailer_name} card`},[...t[10]||(t[10]=[P('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-v-9bad707c><path d="M3 6h18" data-v-9bad707c></path><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" data-v-9bad707c></path><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" data-v-9bad707c></path><line x1="10" y1="11" x2="10" y2="17" data-v-9bad707c></line><line x1="14" y1="11" x2="14" y2="17" data-v-9bad707c></line></svg>',1)])],8,be)]),e("h3",ve,p(r.retailer_name),1),r.card_number?(d(),i("button",{key:0,onClick:F=>I(r.id),class:"card-number-toggle","aria-label":o(_).has(r.id)?`Hide card number for ${r.retailer_name}`:`Show full card number for ${r.retailer_name}`,"aria-pressed":o(_).has(r.id)},[e("span",we,p(o(_).has(r.id)?r.card_number:`â¢â¢â¢â¢ 2 ${r.card_number.slice(-4)}`),1),(d(),i("svg",_e,[o(_).has(r.id)?(d(),i(S,{key:0},[t[11]||(t[11]=e("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94"},null,-1)),t[12]||(t[12]=e("path",{d:"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19"},null,-1)),t[13]||(t[13]=e("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1))],64)):(d(),i(S,{key:1},[t[14]||(t[14]=e("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1)),t[15]||(t[15]=e("circle",{cx:"12",cy:"12",r:"3"},null,-1))],64))]))],8,ye)):k("",!0),e("div",he,[r.card_number?(d(),i("span",fe,"â Card saved")):(d(),i("span",ke,"No card number"))])],2))),128)),e("button",{class:"reward-card add-card-cta",onClick:t[0]||(t[0]=r=>x.value=!0),"aria-label":"Add a new rewards card"},[...t[16]||(t[16]=[P('<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-v-9bad707c><circle cx="12" cy="12" r="10" data-v-9bad707c></circle><line x1="12" y1="8" x2="12" y2="16" data-v-9bad707c></line><line x1="8" y1="12" x2="16" y2="12" data-v-9bad707c></line></svg><span class="add-card-label" data-v-9bad707c>Add Card</span>',2)])])])])]),o(x)?(d(),i("div",{key:0,class:"dialog-overlay",onClick:h,role:"dialog","aria-labelledby":"add-card-title","aria-modal":"true"},[e("div",{class:"dialog dialog-large",onClick:t[7]||(t[7]=D(()=>{},["stop"]))},[t[24]||(t[24]=e("h2",{id:"add-card-title",class:"dialog-title"},"Add Rewards Card",-1)),!o(s)&&!o(w)?(d(),i("div",Ce,[t[18]||(t[18]=e("p",{class:"dialog-description"},"Choose a popular retailer or add a custom card",-1)),e("div",xe,[(d(!0),i(S,null,O(o(ne),r=>(d(),i("button",{key:r.name,onClick:F=>s.value=r,class:"retailer-button"},[e("span",Se,p(r.logo),1),e("span",De,p(r.name),1)],8,Ae))),128))]),e("button",{onClick:t[1]||(t[1]=r=>w.value=!0),class:"button button-secondary button-full"}," Add Custom Card ")])):o(s)?(d(),i("div",Ue,[e("button",{onClick:t[2]||(t[2]=r=>s.value=null),class:"button button-secondary button-small back-button"}," â Back "),e("div",Ee,[e("span",Le,p(o(s).logo),1),e("span",Re,p(o(s).name),1)]),e("form",{onSubmit:D(z,["prevent"]),class:"custom-card-form"},[e("div",Be,[t[19]||(t[19]=e("label",{for:"retailer-card-number",class:"form-label"},[R(" Card Number "),e("span",{class:"label-optional"},"(optional)")],-1)),L(e("input",{id:"retailer-card-number","onUpdate:modelValue":t[3]||(t[3]=r=>N(n)?n.value=r:null),type:"text",class:"input",placeholder:"Enter your card number"},null,512),[[B,o(n)]]),t[20]||(t[20]=e("p",{class:"form-hint"},"You can find this on the back of your physical card or in the retailer's app.",-1))]),e("div",Ne,[e("button",{type:"button",onClick:h,class:"button button-secondary"}," Cancel "),e("button",{type:"submit",class:"button button-primary",disabled:o(m)},p(o(m)?"Adding...":"Add Card"),9,$e)])],32)])):(d(),i("div",Fe,[e("button",{onClick:t[4]||(t[4]=r=>w.value=!1),class:"button button-secondary button-small back-button"}," â Back "),e("form",{onSubmit:D(H,["prevent"]),class:"custom-card-form"},[e("div",Me,[t[21]||(t[21]=e("label",{for:"custom-retailer",class:"form-label"},[R(" Retailer Name "),e("span",{"aria-hidden":"true"},"*")],-1)),L(e("input",{id:"custom-retailer","onUpdate:modelValue":t[5]||(t[5]=r=>N(a)?a.value=r:null),type:"text",class:"input",required:"",placeholder:"e.g., Local Market"},null,512),[[B,o(a)]])]),e("div",Ve,[t[22]||(t[22]=e("label",{for:"custom-card-number",class:"form-label"},[R(" Card Number "),e("span",{class:"label-optional"},"(optional)")],-1)),L(e("input",{id:"custom-card-number","onUpdate:modelValue":t[6]||(t[6]=r=>N(n)?n.value=r:null),type:"text",class:"input",placeholder:"Enter your card number"},null,512),[[B,o(n)]]),t[23]||(t[23]=e("p",{class:"form-hint"},"You can find this on the back of your physical card or in the retailer's app.",-1))]),e("div",Oe,[e("button",{type:"button",onClick:h,class:"button button-secondary"}," Cancel "),e("button",{type:"submit",class:"button button-primary",disabled:!o(a).trim()||o(m)},p(o(m)?"Adding...":"Add Card"),9,Pe)])],32)])),!o(s)&&!o(w)?(d(),i("div",Te,[e("button",{type:"button",onClick:h,class:"button button-secondary"}," Cancel ")])):k("",!0)])])):k("",!0),o(c)?(d(),i("div",{key:1,class:"dialog-overlay",onClick:$,role:"alertdialog","aria-labelledby":"delete-card-title","aria-describedby":"delete-card-description","aria-modal":"true"},[e("div",{class:"dialog",onClick:t[8]||(t[8]=D(()=>{},["stop"]))},[t[25]||(t[25]=e("h2",{id:"delete-card-title",class:"dialog-title"},"Delete Card?",-1)),e("p",ze," Are you sure you want to delete your "+p(o(c).retailer_name)+" rewards card? ",1),e("div",He,[e("button",{type:"button",onClick:$,class:"button button-secondary"}," Cancel "),e("button",{onClick:q,class:"button button-danger",disabled:o(l)},p(o(l)?"Deleting...":"Delete"),9,Ie)])])])):k("",!0),V(Y)])}}}),Xe=se(je,[["__scopeId","data-v-9bad707c"]]);export{Xe 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.