diff --git a/apps/admin/.env.production b/apps/admin/.env.production index 5b24675..6421bd5 100644 --- a/apps/admin/.env.production +++ b/apps/admin/.env.production @@ -1 +1 @@ -VITE_API_BASE_URL=https://api.wheel.montzar.ir/api +VITE_API_BASE_URL=https://api.wheel.montest.ir/api diff --git a/apps/admin/dist/assets/AuditLogView-DlV2c1uL.js b/apps/admin/dist/assets/AuditLogView-DUQqTRnR.js similarity index 98% rename from apps/admin/dist/assets/AuditLogView-DlV2c1uL.js rename to apps/admin/dist/assets/AuditLogView-DUQqTRnR.js index 3f2b0bf..62e2f79 100644 --- a/apps/admin/dist/assets/AuditLogView-DlV2c1uL.js +++ b/apps/admin/dist/assets/AuditLogView-DUQqTRnR.js @@ -1 +1 @@ -import{t as x}from"./farsi-number-stB7JMN0.js";import{d as j,j as J,a as v,b as s,c as l,w as a,h as k,m as K,r as y,g as M,o as p,f as n,e as f,R as $,t as i,s as C,G as q,q as N,_ as F}from"./index-Dx9ODHpC.js";const G={class:"audit-log-page"},h={class:"page-header-title"},H={class:"table-header"},Q={class:"filters"},W={key:0,class:"admin-name"},X={key:1,class:"text-muted"},Y={key:4,class:"code-badge"},Z={key:5,class:"date-cell"},ee={key:6,class:"date-cell"},te={key:0},ae={class:"json-box"},le={class:"json-box"},ne=j({__name:"AuditLogView",setup(ie){const w=k(!1),b=k([]),I=k(0),r=M({page:1,pageSize:10,action:void 0,entityType:void 0}),A=k(!1),u=k(null);async function T(){var o,e,c,g;w.value=!0;try{const m=await K.get("/admin/audit-logs",{params:{page:r.page,pageSize:r.pageSize,action:r.action||void 0,entityType:r.entityType||void 0}}),_=Array.isArray(m.data)?m.data:((o=m.data)==null?void 0:o.data)||[];b.value=_,I.value=((e=m.meta)==null?void 0:e.total)||((g=(c=m.data)==null?void 0:c.meta)==null?void 0:g.total)||_.length}finally{w.value=!1}}function D(o){u.value=o,A.value=!0}const S={Campaign:"کمپین",Prize:"جایزه",User:"کاربر",Chance:"شانس",UserPrize:"وضعیت برنده"},U=[{title:"مدیر انجام‌دهنده",dataIndex:["admin","name"],key:"adminName",width:150},{title:"ایمیل مدیر",dataIndex:["admin","email"],key:"adminEmail",width:180},{title:"نوع موجودیت",dataIndex:"entityType",key:"entityType",width:140},{title:"عملیات",dataIndex:"action",key:"action",width:160},{title:"شناسه موجودیت",dataIndex:"entityId",key:"entityId",ellipsis:!0},{title:"آی‌پی",dataIndex:"ipAddress",key:"ipAddress",width:130},{title:"زمان ثبت",dataIndex:"createdAt",key:"createdAt",width:160},{title:"عملیات",key:"details",width:70,align:"center"}];function E(o){return o.includes("CREATE")||o.includes("INSERT")?"green":o.includes("UPDATE")||o.includes("EDIT")||o.includes("ADJUST")?"blue":o.includes("DELETE")||o.includes("BLOCK")?"red":"default"}return J(()=>{T()}),(o,e)=>{const c=y("a-button"),g=y("a-select-option"),m=y("a-select"),_=y("a-tag"),O=y("a-tooltip"),P=y("a-table"),z=y("a-divider"),B=y("a-modal"),R=y("a-card");return p(),v("div",G,[s("div",h,[e[4]||(e[4]=s("div",null,[s("h1",{class:"title"},"لاگ بازرسی (Audit Log)"),s("p",{class:"subtitle"},"ثبت امن و تغییرناپذیر تمامی عملیات مدیران در سامانه")],-1)),l(c,{onClick:T,loading:w.value},{icon:a(()=>[l(f($))]),default:a(()=>[e[3]||(e[3]=n(" به‌روزرسانی ",-1))]),_:1},8,["loading"])]),l(R,{bordered:!1,class:"main-card"},{default:a(()=>[s("div",H,[s("div",Q,[l(m,{value:r.entityType,"onUpdate:value":e[0]||(e[0]=t=>r.entityType=t),placeholder:"فیلتر بخش (موجودیت)",allowClear:"",style:{width:"200px"},onChange:e[1]||(e[1]=()=>{r.page=1,T()})},{default:a(()=>[l(g,{value:"Campaign"},{default:a(()=>[...e[5]||(e[5]=[n("کمپین",-1)])]),_:1}),l(g,{value:"Prize"},{default:a(()=>[...e[6]||(e[6]=[n("جایزه",-1)])]),_:1}),l(g,{value:"User"},{default:a(()=>[...e[7]||(e[7]=[n("کاربر",-1)])]),_:1}),l(g,{value:"Chance"},{default:a(()=>[...e[8]||(e[8]=[n("شانس",-1)])]),_:1}),l(g,{value:"UserPrize"},{default:a(()=>[...e[9]||(e[9]=[n("وضعیت برنده",-1)])]),_:1})]),_:1},8,["value"])])]),l(P,{dataSource:b.value,columns:U,loading:w.value,rowKey:"id",size:"middle",pagination:{current:r.page,pageSize:r.pageSize,total:I.value,showTotal:t=>`مجموع: ${f(x)(t)} ردیف لاگ`,onChange:t=>{r.page=t,T()}}},{bodyCell:a(({column:t,record:d})=>{var V,L;return[t.key==="adminName"?(p(),v("span",W,i(((V=d.admin)==null?void 0:V.name)||"مدیر سیستم"),1)):t.key==="adminEmail"?(p(),v("span",X,i(((L=d.admin)==null?void 0:L.email)||"—"),1)):t.key==="entityType"?(p(),C(_,{key:2,color:"geekblue"},{default:a(()=>[n(i(S[d.entityType]||d.entityType),1)]),_:2},1024)):t.key==="action"?(p(),C(_,{key:3,color:E(d.action)},{default:a(()=>[n(i(d.action),1)]),_:2},1032,["color"])):t.key==="entityId"?(p(),v("code",Y,i(d.entityId),1)):t.key==="ipAddress"?(p(),v("span",Z,i(f(x)(d.ipAddress)),1)):t.key==="createdAt"?(p(),v("span",ee,i(f(x)(new Date(d.createdAt).toLocaleString("fa-IR"))),1)):t.key==="details"?(p(),C(O,{key:7,title:"مشاهده جزئیات تغییرات"},{default:a(()=>[l(c,{type:"text",shape:"circle",class:"action-more-btn",onClick:se=>D(d)},{default:a(()=>[l(f(q),{style:{"font-size":"16px",color:"#4f46e5"}})]),_:1},8,["onClick"])]),_:2},1024)):N("",!0)]}),_:1},8,["dataSource","loading","pagination"]),l(B,{open:A.value,"onUpdate:open":e[2]||(e[2]=t=>A.value=t),title:"جزئیات لاگ بازرسی (Audit Log)",footer:null,width:"700px"},{default:a(()=>{var t,d;return[u.value?(p(),v("div",te,[s("p",null,[e[10]||(e[10]=s("strong",null,"اقدام:",-1)),e[11]||(e[11]=n()),l(_,{color:E(u.value.action)},{default:a(()=>[n(i(u.value.action),1)]),_:1},8,["color"]),e[12]||(e[12]=n(" بر روی ",-1)),s("strong",null,i(S[u.value.entityType]||u.value.entityType),1),e[13]||(e[13]=n(" (شناسه: ",-1)),s("code",null,i(u.value.entityId),1),e[14]||(e[14]=n(")",-1))]),s("p",null,[e[15]||(e[15]=s("strong",null,"توسط:",-1)),n(" "+i((t=u.value.admin)==null?void 0:t.name)+" ("+i((d=u.value.admin)==null?void 0:d.email)+") | IP: "+i(f(x)(u.value.ipAddress)),1)]),l(z,null,{default:a(()=>[...e[16]||(e[16]=[n("مقادیر قبلی (Old Values)",-1)])]),_:1}),s("pre",ae,i(JSON.stringify(u.value.oldValues,null,2)||"ندارد"),1),l(z,null,{default:a(()=>[...e[17]||(e[17]=[n("مقادیر جدید (New Values)",-1)])]),_:1}),s("pre",le,i(JSON.stringify(u.value.newValues,null,2)||"ندارد"),1)])):N("",!0)]}),_:1},8,["open"])]),_:1})])}}}),ue=F(ne,[["__scopeId","data-v-ec85b8e1"]]);export{ue as default}; +import{t as x}from"./farsi-number-stB7JMN0.js";import{d as j,j as J,a as v,b as s,c as l,w as a,h as k,m as K,r as y,g as M,o as p,f as n,e as f,R as $,t as i,s as C,G as q,q as N,_ as F}from"./index-iu4REYcj.js";const G={class:"audit-log-page"},h={class:"page-header-title"},H={class:"table-header"},Q={class:"filters"},W={key:0,class:"admin-name"},X={key:1,class:"text-muted"},Y={key:4,class:"code-badge"},Z={key:5,class:"date-cell"},ee={key:6,class:"date-cell"},te={key:0},ae={class:"json-box"},le={class:"json-box"},ne=j({__name:"AuditLogView",setup(ie){const w=k(!1),b=k([]),I=k(0),r=M({page:1,pageSize:10,action:void 0,entityType:void 0}),A=k(!1),u=k(null);async function T(){var o,e,c,g;w.value=!0;try{const m=await K.get("/admin/audit-logs",{params:{page:r.page,pageSize:r.pageSize,action:r.action||void 0,entityType:r.entityType||void 0}}),_=Array.isArray(m.data)?m.data:((o=m.data)==null?void 0:o.data)||[];b.value=_,I.value=((e=m.meta)==null?void 0:e.total)||((g=(c=m.data)==null?void 0:c.meta)==null?void 0:g.total)||_.length}finally{w.value=!1}}function D(o){u.value=o,A.value=!0}const S={Campaign:"کمپین",Prize:"جایزه",User:"کاربر",Chance:"شانس",UserPrize:"وضعیت برنده"},U=[{title:"مدیر انجام‌دهنده",dataIndex:["admin","name"],key:"adminName",width:150},{title:"ایمیل مدیر",dataIndex:["admin","email"],key:"adminEmail",width:180},{title:"نوع موجودیت",dataIndex:"entityType",key:"entityType",width:140},{title:"عملیات",dataIndex:"action",key:"action",width:160},{title:"شناسه موجودیت",dataIndex:"entityId",key:"entityId",ellipsis:!0},{title:"آی‌پی",dataIndex:"ipAddress",key:"ipAddress",width:130},{title:"زمان ثبت",dataIndex:"createdAt",key:"createdAt",width:160},{title:"عملیات",key:"details",width:70,align:"center"}];function E(o){return o.includes("CREATE")||o.includes("INSERT")?"green":o.includes("UPDATE")||o.includes("EDIT")||o.includes("ADJUST")?"blue":o.includes("DELETE")||o.includes("BLOCK")?"red":"default"}return J(()=>{T()}),(o,e)=>{const c=y("a-button"),g=y("a-select-option"),m=y("a-select"),_=y("a-tag"),O=y("a-tooltip"),P=y("a-table"),z=y("a-divider"),B=y("a-modal"),R=y("a-card");return p(),v("div",G,[s("div",h,[e[4]||(e[4]=s("div",null,[s("h1",{class:"title"},"لاگ بازرسی (Audit Log)"),s("p",{class:"subtitle"},"ثبت امن و تغییرناپذیر تمامی عملیات مدیران در سامانه")],-1)),l(c,{onClick:T,loading:w.value},{icon:a(()=>[l(f($))]),default:a(()=>[e[3]||(e[3]=n(" به‌روزرسانی ",-1))]),_:1},8,["loading"])]),l(R,{bordered:!1,class:"main-card"},{default:a(()=>[s("div",H,[s("div",Q,[l(m,{value:r.entityType,"onUpdate:value":e[0]||(e[0]=t=>r.entityType=t),placeholder:"فیلتر بخش (موجودیت)",allowClear:"",style:{width:"200px"},onChange:e[1]||(e[1]=()=>{r.page=1,T()})},{default:a(()=>[l(g,{value:"Campaign"},{default:a(()=>[...e[5]||(e[5]=[n("کمپین",-1)])]),_:1}),l(g,{value:"Prize"},{default:a(()=>[...e[6]||(e[6]=[n("جایزه",-1)])]),_:1}),l(g,{value:"User"},{default:a(()=>[...e[7]||(e[7]=[n("کاربر",-1)])]),_:1}),l(g,{value:"Chance"},{default:a(()=>[...e[8]||(e[8]=[n("شانس",-1)])]),_:1}),l(g,{value:"UserPrize"},{default:a(()=>[...e[9]||(e[9]=[n("وضعیت برنده",-1)])]),_:1})]),_:1},8,["value"])])]),l(P,{dataSource:b.value,columns:U,loading:w.value,rowKey:"id",size:"middle",pagination:{current:r.page,pageSize:r.pageSize,total:I.value,showTotal:t=>`مجموع: ${f(x)(t)} ردیف لاگ`,onChange:t=>{r.page=t,T()}}},{bodyCell:a(({column:t,record:d})=>{var V,L;return[t.key==="adminName"?(p(),v("span",W,i(((V=d.admin)==null?void 0:V.name)||"مدیر سیستم"),1)):t.key==="adminEmail"?(p(),v("span",X,i(((L=d.admin)==null?void 0:L.email)||"—"),1)):t.key==="entityType"?(p(),C(_,{key:2,color:"geekblue"},{default:a(()=>[n(i(S[d.entityType]||d.entityType),1)]),_:2},1024)):t.key==="action"?(p(),C(_,{key:3,color:E(d.action)},{default:a(()=>[n(i(d.action),1)]),_:2},1032,["color"])):t.key==="entityId"?(p(),v("code",Y,i(d.entityId),1)):t.key==="ipAddress"?(p(),v("span",Z,i(f(x)(d.ipAddress)),1)):t.key==="createdAt"?(p(),v("span",ee,i(f(x)(new Date(d.createdAt).toLocaleString("fa-IR"))),1)):t.key==="details"?(p(),C(O,{key:7,title:"مشاهده جزئیات تغییرات"},{default:a(()=>[l(c,{type:"text",shape:"circle",class:"action-more-btn",onClick:se=>D(d)},{default:a(()=>[l(f(q),{style:{"font-size":"16px",color:"#4f46e5"}})]),_:1},8,["onClick"])]),_:2},1024)):N("",!0)]}),_:1},8,["dataSource","loading","pagination"]),l(B,{open:A.value,"onUpdate:open":e[2]||(e[2]=t=>A.value=t),title:"جزئیات لاگ بازرسی (Audit Log)",footer:null,width:"700px"},{default:a(()=>{var t,d;return[u.value?(p(),v("div",te,[s("p",null,[e[10]||(e[10]=s("strong",null,"اقدام:",-1)),e[11]||(e[11]=n()),l(_,{color:E(u.value.action)},{default:a(()=>[n(i(u.value.action),1)]),_:1},8,["color"]),e[12]||(e[12]=n(" بر روی ",-1)),s("strong",null,i(S[u.value.entityType]||u.value.entityType),1),e[13]||(e[13]=n(" (شناسه: ",-1)),s("code",null,i(u.value.entityId),1),e[14]||(e[14]=n(")",-1))]),s("p",null,[e[15]||(e[15]=s("strong",null,"توسط:",-1)),n(" "+i((t=u.value.admin)==null?void 0:t.name)+" ("+i((d=u.value.admin)==null?void 0:d.email)+") | IP: "+i(f(x)(u.value.ipAddress)),1)]),l(z,null,{default:a(()=>[...e[16]||(e[16]=[n("مقادیر قبلی (Old Values)",-1)])]),_:1}),s("pre",ae,i(JSON.stringify(u.value.oldValues,null,2)||"ندارد"),1),l(z,null,{default:a(()=>[...e[17]||(e[17]=[n("مقادیر جدید (New Values)",-1)])]),_:1}),s("pre",le,i(JSON.stringify(u.value.newValues,null,2)||"ندارد"),1)])):N("",!0)]}),_:1},8,["open"])]),_:1})])}}}),ue=F(ne,[["__scopeId","data-v-ec85b8e1"]]);export{ue as default}; diff --git a/apps/admin/dist/assets/CampaignFormView-COR08E-o.js b/apps/admin/dist/assets/CampaignFormView-OBaKvIJ_.js similarity index 99% rename from apps/admin/dist/assets/CampaignFormView-COR08E-o.js rename to apps/admin/dist/assets/CampaignFormView-OBaKvIJ_.js index a094ff7..ca0ff9c 100644 --- a/apps/admin/dist/assets/CampaignFormView-COR08E-o.js +++ b/apps/admin/dist/assets/CampaignFormView-OBaKvIJ_.js @@ -1 +1 @@ -import{d as q,o as b,a as v,F as P,x as V,c as l,w as o,D as E,b as n,t as k,f as C,q as U,h as I,r as p,e as A,R as K,G as Q,s as H,H as W,J as ee,_ as G,g as te,j as le,K as z,N as oe,m as B,O as ae,Q as ne,i as se,y as T}from"./index-Dx9ODHpC.js";import{U as j}from"./UploadOutlined-Byko1TmG.js";var L=(h=>(h.CLASSIC_CASINO="CLASSIC_CASINO",h.NEON_CYBER="NEON_CYBER",h.MINIMAL_FLAT="MINIMAL_FLAT",h.LUXURY_GOLD="LUXURY_GOLD",h.PLAYFUL_CARTOON="PLAYFUL_CARTOON",h))(L||{});const re={class:"wheel-picker-grid"},ie=["onClick"],de={class:"wheel-wrapper"},ce={class:"pointer-wrapper"},ue={width:"18",height:"22",viewBox:"0 0 18 22",fill:"none"},fe=["fill"],pe=["d","fill","stroke"],ge=["cx","cy"],_e=["fill","stroke"],be=["fill"],me={class:"stage-tools"},ve={class:"card-body"},he={class:"card-title-row"},Ce={class:"title-text"},xe={class:"card-desc"},ye={class:"modal-wheel-box"},we={class:"large-pointer"},ke={width:"28",height:"34",viewBox:"0 0 28 34",fill:"none"},Ae=["fill"],Me={class:"large-wheel-svg",viewBox:"0 0 260 260"},$e=["d","fill","stroke"],Le=["fill"],Ie={x:"130",y:"136","text-anchor":"middle",fill:"#fff","font-size":"14","font-weight":"bold"},Se={style:{"margin-top":"20px","text-align":"center"}},Re=q({__name:"WheelDesignPicker",props:{modelValue:{}},emits:["update:modelValue"],setup(h,{emit:O}){const S=O,w=I(!1),g=I(null),M=I(null),R=I({}),e=[{id:L.CLASSIC_CASINO,title:"کلاسیک کازینویی (Classic Casino)",badge:"جشنواره‌ها و قرعه‌کشی",badgeColor:"gold",desc:"طرح سنتی و مجلل با حباب‌های نور طلایی چشمک‌زن، اسلایس‌های قرمز و مشکی و ستاره برنجی",bg:"radial-gradient(circle, #2d0a0a 0%, #150505 100%)",accent:"#fbbf24",border:"#d97706",slices:["#b91c1c","#1e293b","#b91c1c","#1e293b","#b91c1c","#1e293b"],pointerColor:"#f59e0b",centerColor:"#fbbf24",centerText:"★"},{id:L.NEON_CYBER,title:"نئون سایبری (Neon Cyber)",badge:"مدرن و گیمینگ",badgeColor:"cyan",desc:"تم سایبرپانک تیره با درخشش نور فیروزه‌ای و سرخابی، نشانگر لیزری و پالس نوری آینده‌نگرانه",bg:"radial-gradient(circle, #100e26 0%, #060512 100%)",accent:"#00f0ff",border:"#ec4899",slices:["#111827","#1e1b4b","#111827","#1e1b4b","#111827","#1e1b4b"],pointerColor:"#00f0ff",centerColor:"#00f0ff",centerText:"⚡"},{id:L.MINIMAL_FLAT,title:"مینیمال تخت (Minimal Flat)",badge:"فین‌تک و B2B",badgeColor:"blue",desc:"طراحی مدرن، بدون حاشیه سنگین، فوق‌العاده خوانا، شارپ و متناسب با برندهای رسمی",bg:"radial-gradient(circle, #1e293b 0%, #0f172a 100%)",accent:"#38bdf8",border:"#3b82f6",slices:["#3b82f6","#6366f1","#3b82f6","#6366f1","#3b82f6","#6366f1"],pointerColor:"#38bdf8",centerColor:"#ffffff",centerText:"●"},{id:L.LUXURY_GOLD,title:"لوکس سلطنتی (Luxury Gold)",badge:"VIP و پرمیوم",badgeColor:"orange",desc:"پس‌زمینه مشکی ابسیدین با شیب‌های طلای متالیک، حاشیه اشرافی و مدالیون کریستالی",bg:"radial-gradient(circle, #241c0e 0%, #0d0a06 100%)",accent:"#facc15",border:"#ca8a04",slices:["#1c1917","#0c0a09","#1c1917","#0c0a09","#1c1917","#0c0a09"],pointerColor:"#eab308",centerColor:"#facc15",centerText:"VIP"},{id:L.PLAYFUL_CARTOON,title:"کارتونی فانتزی (Playful Cartoon)",badge:"خانواده و بازی",badgeColor:"magenta",desc:"رنگ‌های شاداب آب‌نباتی، بردر ضخیم و نرم، نشانگر جهنده و حس پویای بازی‌های موبایلی",bg:"radial-gradient(circle, #fef3c7 0%, #fde68a 100%)",accent:"#f43f5e",border:"#f59e0b",slices:["#f43f5e","#8b5cf6","#06b6d4","#10b981","#f59e0b","#ec4899"],pointerColor:"#ef4444",centerColor:"#facc15",centerText:"✨"}];function D(r){S("update:modelValue",r)}function Y(r,d){d.stopPropagation();const u=R.value[r]||0;R.value[r]=u+1440+Math.floor(Math.random()*360),M.value=r,setTimeout(()=>{M.value===r&&(M.value=null)},2500)}function F(r,d){d.stopPropagation(),g.value=r,w.value=!0}function x(r,d=6,u=46,i=50,s=50){const _=360/d,m=(r*_-90)*(Math.PI/180),y=((r+1)*_-90)*(Math.PI/180),a=i+u*Math.cos(m),f=s+u*Math.sin(m),$=i+u*Math.cos(y),N=s+u*Math.sin(y);return`M ${i} ${s} L ${a} ${f} A ${u} ${u} 0 0 1 ${$} ${N} Z`}function t(r,d=6,u=110,i=130,s=130){const _=360/d,m=(r*_-90)*(Math.PI/180),y=((r+1)*_-90)*(Math.PI/180),a=i+u*Math.cos(m),f=s+u*Math.sin(m),$=i+u*Math.cos(y),N=s+u*Math.sin(y);return`M ${i} ${s} L ${a} ${f} A ${u} ${u} 0 0 1 ${$} ${N} Z`}return(r,d)=>{var y;const u=p("a-tag"),i=p("a-button"),s=p("a-tooltip"),_=p("a-radio"),m=p("a-modal");return b(),v("div",re,[(b(),v(P,null,V(e,a=>n("div",{key:a.id,class:ee(["design-card",{"is-selected":h.modelValue===a.id}]),onClick:f=>D(a.id)},[n("div",{class:"preview-stage",style:E({background:a.bg})},[l(u,{color:a.badgeColor,class:"theme-tag"},{default:o(()=>[C(k(a.badge),1)]),_:2},1032,["color"]),n("div",de,[n("div",ce,[(b(),v("svg",ue,[n("path",{d:"M9 22L2 6C0.5 3 2.5 0 6 0H12C15.5 0 17.5 3 16 6L9 22Z",fill:a.pointerColor,stroke:"#ffffff","stroke-width":"1.2"},null,8,fe)]))]),(b(),v("svg",{class:"mini-wheel-svg",viewBox:"0 0 100 100",style:E({transform:`rotate(${R.value[a.id]||0}deg)`,transition:M.value===a.id?"transform 2.5s cubic-bezier(0.15, 0.9, 0.2, 1)":"none"})},[(b(!0),v(P,null,V(a.slices,(f,$)=>(b(),v("g",{key:$},[n("path",{d:x($,a.slices.length),fill:f,stroke:a.accent,"stroke-width":"0.8"},null,8,pe)]))),128)),a.id===A(L).CLASSIC_CASINO?(b(),v(P,{key:0},V(12,f=>n("circle",{key:f,cx:50+46*Math.cos((f*30-90)*(Math.PI/180)),cy:50+46*Math.sin((f*30-90)*(Math.PI/180)),r:"1.8",fill:"#fef08a"},null,8,ge)),64)):U("",!0),n("circle",{cx:"50",cy:"50",r:"13",fill:a.centerColor,stroke:a.border,"stroke-width":"1"},null,8,_e),d[2]||(d[2]=n("circle",{cx:"50",cy:"50",r:"8",fill:"#1e293b"},null,-1)),n("text",{x:"50",y:"53","text-anchor":"middle",fill:a.accent,"font-size":"6","font-weight":"bold"},k(a.centerText),9,be)],4))]),n("div",me,[l(s,{title:"تست چرخش آزمایشی"},{default:o(()=>[l(i,{size:"small",shape:"circle",class:"tool-btn",onClick:f=>Y(a.id,f)},{icon:o(()=>[l(A(K))]),_:1},8,["onClick"])]),_:2},1024),l(s,{title:"مشاهده پیش‌نمایش بزرگ"},{default:o(()=>[l(i,{size:"small",shape:"circle",class:"tool-btn",onClick:f=>F(a,f)},{icon:o(()=>[l(A(Q))]),_:1},8,["onClick"])]),_:2},1024)])],4),n("div",ve,[n("div",he,[l(_,{checked:h.modelValue===a.id},{default:o(()=>[n("span",Ce,k(a.title),1)]),_:2},1032,["checked"]),h.modelValue===a.id?(b(),H(A(W),{key:0,class:"selected-icon"})):U("",!0)]),n("p",xe,k(a.desc),1)])],10,ie)),64)),l(m,{open:w.value,"onUpdate:open":d[1]||(d[1]=a=>w.value=a),title:`پیش‌نمایش طرح: ${((y=g.value)==null?void 0:y.title)||""}`,footer:null,width:"420px",centered:""},{default:o(()=>[g.value?(b(),v("div",{key:0,class:"modal-preview-container",style:E({background:g.value.bg})},[n("div",ye,[n("div",we,[(b(),v("svg",ke,[n("path",{d:"M14 34L4 10C2 5 6 1 11 1H17C22 1 26 5 24 10L14 34Z",fill:g.value.pointerColor,stroke:"#fff","stroke-width":"1.5"},null,8,Ae)]))]),(b(),v("svg",Me,[(b(!0),v(P,null,V(g.value.slices,(a,f)=>(b(),v("g",{key:f},[n("path",{d:t(f,g.value.slices.length),fill:a,stroke:g.value.accent,"stroke-width":"1.5"},null,8,$e)]))),128)),n("circle",{cx:"130",cy:"130",r:"30",fill:g.value.centerColor,stroke:"#fff","stroke-width":"2"},null,8,Le),d[3]||(d[3]=n("circle",{cx:"130",cy:"130",r:"18",fill:"#0f172a"},null,-1)),n("text",Ie,k(g.value.centerText),1)]))]),n("div",Se,[l(i,{type:"primary",size:"large",onClick:d[0]||(d[0]=a=>{D(g.value.id),w.value=!1})},{default:o(()=>[...d[4]||(d[4]=[C(" انتخاب این طرح برای کمپین ",-1)])]),_:1})])],4)):U("",!0)]),_:1},8,["open","title"])])}}}),Te=G(Re,[["__scopeId","data-v-31298959"]]),Ne={style:{display:"flex","flex-direction":"column",gap:"8px"}},Ue={key:0,style:{position:"relative",width:"90px",height:"90px","border-radius":"12px",border:"1px solid #e2e8f0",overflow:"hidden",background:"#f8fafc",padding:"4px","box-shadow":"0 2px 6px rgba(0,0,0,0.05)"}},Oe=["src"],De={style:{display:"flex","flex-direction":"column",gap:"8px"}},Fe={key:0,style:{position:"relative",width:"160px",height:"90px","border-radius":"12px",border:"1px solid #e2e8f0",overflow:"hidden",background:"#f8fafc","box-shadow":"0 2px 6px rgba(0,0,0,0.05)"}},Pe=["src"],Ve={style:{"margin-top":"24px",display:"flex",gap:"12px"}},ze=q({__name:"CampaignFormView",setup(h){const O=oe(),S=se(),w=I(!1),g=I(null),M=I(!1),R=I(!1),e=te({title:"",slug:"",description:"",banner:"",logo:"",dateRange:[],status:"DRAFT",defaultChances:3,rules:"",ctaText:"بچرخون و برنده شو!",wheelDesign:L.CLASSIC_CASINO,primaryColor:"#FFD700",secondaryColor:"#B22222"});async function D(){if(g.value){M.value=!0;try{const t=(await B.get(`/admin/campaigns/${g.value}`)).data;e.title=t.title,e.slug=t.slug,e.description=t.description||"",e.banner=t.banner||"",e.logo=t.logo||"",e.status=t.status,e.defaultChances=t.defaultChances,e.rules=t.rules||"",e.ctaText=t.ctaText||"بچرخون و برنده شو!",e.wheelDesign=t.wheelDesign,e.dateRange=[z(t.startAt),z(t.endAt)],t.settings&&(e.primaryColor=t.settings.primaryColor||"#FFD700",e.secondaryColor=t.settings.secondaryColor||"#B22222")}finally{M.value=!1}}}async function Y(){var t,r,d,u,i;if(!e.title||!e.title.trim()){T.error("لطفاً عنوان کمپین را وارد کنید.");return}let x=(e.slug||"").trim().toLowerCase().replace(/\s+/g,"-");if(x||(x="campaign-"+Math.random().toString(36).substring(2,8)),e.slug=x,!/^[a-z0-9-]+$/.test(x)){T.error("شناسه URL (اسلاگ) باید فقط شامل حروف کوچک انگلیسی، اعداد و خط تیره (-) باشد.");return}if(!e.dateRange||e.dateRange.length<2){T.error("لطفاً بازه زمانی شروع و پایان کمپین را انتخاب کنید.");return}R.value=!0;try{const s={title:e.title.trim(),slug:e.slug.trim(),description:((t=e.description)==null?void 0:t.trim())||void 0,banner:e.banner?e.banner.trim():null,logo:e.logo?e.logo.trim():null,startAt:e.dateRange[0].toISOString(),endAt:e.dateRange[1].toISOString(),status:e.status,defaultChances:Number(e.defaultChances)||0,rules:((r=e.rules)==null?void 0:r.trim())||void 0,ctaText:e.ctaText||"بچرخون و برنده شو!",wheelDesign:e.wheelDesign,settings:{primaryColor:e.primaryColor,secondaryColor:e.secondaryColor}};if(w.value&&g.value)await B.patch(`/admin/campaigns/${g.value}`,s),T.success("کمپین با موفقیت به‌روزرسانی شد."),S.push("/campaigns");else{const _=await B.post("/admin/campaigns",s);T.success("کمپین با موفقیت ایجاد گردید.");const m=((d=_.data)==null?void 0:d.id)||_.id;m?S.push(`/campaigns/${m}/prizes`):S.push("/campaigns")}}catch(s){const _=((i=(u=s.response)==null?void 0:u.data)==null?void 0:i.message)||s.message||"خطایی در ثبت اطلاعات کمپین رخ داد.";T.error(Array.isArray(_)?_.join(" | "):_)}finally{R.value=!1}}async function F(x,t){const r=new FormData;r.append("file",x);try{const d=await B.post("/admin/uploads",r,{headers:{"Content-Type":"multipart/form-data"}});e[t]=d.data.url,T.success("تصویر با موفقیت آپلود شد.")}catch{}return!1}return le(()=>{O.params.id?(w.value=!0,g.value=O.params.id,D()):e.dateRange=[z(),z().add(1,"month")]}),(x,t)=>{const r=p("a-button"),d=p("a-space"),u=p("a-input"),i=p("a-form-item"),s=p("a-col"),_=p("a-range-picker"),m=p("a-select-option"),y=p("a-select"),a=p("a-input-number"),f=p("a-upload"),$=p("a-divider"),N=p("a-textarea"),Z=p("a-row"),X=p("a-form"),J=p("a-card");return b(),H(J,{bordered:!1,loading:M.value},{title:o(()=>[l(d,null,{default:o(()=>[l(r,{type:"text",onClick:t[0]||(t[0]=c=>A(S).push("/campaigns"))},{icon:o(()=>[l(A(ne))]),_:1}),n("span",null,k(w.value?"ویرایش اطلاعات کمپین":"تعریف کمپین جدید گردونه شانس"),1)]),_:1})]),default:o(()=>[l(X,{model:e,layout:"vertical",onSubmit:ae(Y,["prevent"])},{default:o(()=>[l(Z,{gutter:24},{default:o(()=>[l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"عنوان کمپین",name:"title",required:"",rules:[{required:!0,message:"عنوان کمپین الزامی است"}]},{default:o(()=>[l(u,{value:e.title,"onUpdate:value":t[1]||(t[1]=c=>e.title=c),placeholder:"مثال: جشنواره عیدانه گردونه شانس"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"شناسه URL (اسلاگ)",name:"slug",required:"",extra:"فقط حروف کوچک انگلیسی، اعداد و خط تیره (-) مانند: norooz-1405",rules:[{required:!0,message:"اسلاگ الزامی است"}]},{default:o(()=>[l(u,{value:e.slug,"onUpdate:value":t[2]||(t[2]=c=>e.slug=c),placeholder:"eid-1405"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"بازه زمانی اعتبار (شروع و پایان)",name:"dateRange",required:""},{default:o(()=>[l(_,{value:e.dateRange,"onUpdate:value":t[3]||(t[3]=c=>e.dateRange=c),"show-time":"",format:"YYYY/MM/DD HH:mm",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"وضعیت کمپین"},{default:o(()=>[l(y,{value:e.status,"onUpdate:value":t[4]||(t[4]=c=>e.status=c)},{default:o(()=>[l(m,{value:"DRAFT"},{default:o(()=>[...t[13]||(t[13]=[C("پیش‌نویس",-1)])]),_:1}),l(m,{value:"ACTIVE"},{default:o(()=>[...t[14]||(t[14]=[C("فعال",-1)])]),_:1}),l(m,{value:"PAUSED"},{default:o(()=>[...t[15]||(t[15]=[C("متوقف",-1)])]),_:1}),l(m,{value:"FINISHED"},{default:o(()=>[...t[16]||(t[16]=[C("پایان‌یافته",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"تعداد شانس پیش‌فرض کاربران"},{default:o(()=>[l(a,{value:e.defaultChances,"onUpdate:value":t[5]||(t[5]=c=>e.defaultChances=c),min:0,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"متن دکمه چرخاندن (CTA)"},{default:o(()=>[l(u,{value:e.ctaText,"onUpdate:value":t[6]||(t[6]=c=>e.ctaText=c),placeholder:"بچرخون و برنده شو!"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"لوگوی کمپین"},{default:o(()=>[n("div",Ne,[e.logo?(b(),v("div",Ue,[n("img",{src:e.logo,alt:"لوگو",style:{width:"100%",height:"100%","object-fit":"contain"}},null,8,Oe),n("button",{type:"button",style:{position:"absolute",top:"4px",left:"4px",width:"20px",height:"20px","border-radius":"50%",background:"#ef4444",color:"#fff",border:"none","font-size":"11px",cursor:"pointer",display:"flex","justify-content":"center","line-height":"1"},title:"حذف لوگو",onClick:t[7]||(t[7]=c=>e.logo="")}," ✕ ")])):U("",!0),l(f,{"before-upload":c=>F(c,"logo"),"show-upload-list":!1},{default:o(()=>[l(r,null,{icon:o(()=>[l(A(j))]),default:o(()=>[C(" "+k(e.logo?"تغییر لوگو":"انتخاب فایل لوگو"),1)]),_:1})]),_:1},8,["before-upload"])])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"بنر کمپین"},{default:o(()=>[n("div",De,[e.banner?(b(),v("div",Fe,[n("img",{src:e.banner,alt:"بنر",style:{width:"100%",height:"100%","object-fit":"cover"}},null,8,Pe),n("button",{type:"button",style:{position:"absolute",top:"4px",left:"4px",width:"20px",height:"20px","border-radius":"50%",background:"#ef4444",color:"#fff",border:"none","font-size":"11px",cursor:"pointer",display:"flex","justify-content":"center","line-height":"1"},title:"حذف بنر",onClick:t[8]||(t[8]=c=>e.banner="")}," ✕ ")])):U("",!0),l(f,{"before-upload":c=>F(c,"banner"),"show-upload-list":!1},{default:o(()=>[l(r,null,{icon:o(()=>[l(A(j))]),default:o(()=>[C(" "+k(e.banner?"تغییر بنر":"انتخاب فایل بنر"),1)]),_:1})]),_:1},8,["before-upload"])])]),_:1})]),_:1}),l(s,{xs:24},{default:o(()=>[l($,null,{default:o(()=>[...t[17]||(t[17]=[C("طرح بصری گردونه شانس (انتخاب از بین ۵ طرح استاندار)",-1)])]),_:1}),l(i,null,{default:o(()=>[l(Te,{modelValue:e.wheelDesign,"onUpdate:modelValue":t[9]||(t[9]=c=>e.wheelDesign=c)},null,8,["modelValue"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"توضیحات کوتاه کمپین"},{default:o(()=>[l(N,{value:e.description,"onUpdate:value":t[10]||(t[10]=c=>e.description=c),rows:3},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"قوانین و مقررات کمپین"},{default:o(()=>[l(N,{value:e.rules,"onUpdate:value":t[11]||(t[11]=c=>e.rules=c),rows:3},null,8,["value"])]),_:1})]),_:1})]),_:1}),n("div",Ve,[l(r,{type:"primary","html-type":"submit",size:"large",loading:R.value,class:"submit-btn"},{default:o(()=>[C(k(w.value?"ذخیره تغییرات":"ایجاد کمپین و ورود به تعریف جوایز"),1)]),_:1},8,["loading"]),l(r,{size:"large",onClick:t[12]||(t[12]=c=>A(S).push("/campaigns"))},{default:o(()=>[...t[18]||(t[18]=[C("انصراف",-1)])]),_:1})])]),_:1},8,["model"])]),_:1},8,["loading"])}}}),Ee=G(ze,[["__scopeId","data-v-c11ffb22"]]);export{Ee as default}; +import{d as q,o as b,a as v,F as P,x as V,c as l,w as o,D as E,b as n,t as k,f as C,q as U,h as I,r as p,e as A,R as K,G as Q,s as H,H as W,J as ee,_ as G,g as te,j as le,K as z,N as oe,m as B,O as ae,Q as ne,i as se,y as T}from"./index-iu4REYcj.js";import{U as j}from"./UploadOutlined-C2J5ghkD.js";var L=(h=>(h.CLASSIC_CASINO="CLASSIC_CASINO",h.NEON_CYBER="NEON_CYBER",h.MINIMAL_FLAT="MINIMAL_FLAT",h.LUXURY_GOLD="LUXURY_GOLD",h.PLAYFUL_CARTOON="PLAYFUL_CARTOON",h))(L||{});const re={class:"wheel-picker-grid"},ie=["onClick"],de={class:"wheel-wrapper"},ce={class:"pointer-wrapper"},ue={width:"18",height:"22",viewBox:"0 0 18 22",fill:"none"},fe=["fill"],pe=["d","fill","stroke"],ge=["cx","cy"],_e=["fill","stroke"],be=["fill"],me={class:"stage-tools"},ve={class:"card-body"},he={class:"card-title-row"},Ce={class:"title-text"},xe={class:"card-desc"},ye={class:"modal-wheel-box"},we={class:"large-pointer"},ke={width:"28",height:"34",viewBox:"0 0 28 34",fill:"none"},Ae=["fill"],Me={class:"large-wheel-svg",viewBox:"0 0 260 260"},$e=["d","fill","stroke"],Le=["fill"],Ie={x:"130",y:"136","text-anchor":"middle",fill:"#fff","font-size":"14","font-weight":"bold"},Se={style:{"margin-top":"20px","text-align":"center"}},Re=q({__name:"WheelDesignPicker",props:{modelValue:{}},emits:["update:modelValue"],setup(h,{emit:O}){const S=O,w=I(!1),g=I(null),M=I(null),R=I({}),e=[{id:L.CLASSIC_CASINO,title:"کلاسیک کازینویی (Classic Casino)",badge:"جشنواره‌ها و قرعه‌کشی",badgeColor:"gold",desc:"طرح سنتی و مجلل با حباب‌های نور طلایی چشمک‌زن، اسلایس‌های قرمز و مشکی و ستاره برنجی",bg:"radial-gradient(circle, #2d0a0a 0%, #150505 100%)",accent:"#fbbf24",border:"#d97706",slices:["#b91c1c","#1e293b","#b91c1c","#1e293b","#b91c1c","#1e293b"],pointerColor:"#f59e0b",centerColor:"#fbbf24",centerText:"★"},{id:L.NEON_CYBER,title:"نئون سایبری (Neon Cyber)",badge:"مدرن و گیمینگ",badgeColor:"cyan",desc:"تم سایبرپانک تیره با درخشش نور فیروزه‌ای و سرخابی، نشانگر لیزری و پالس نوری آینده‌نگرانه",bg:"radial-gradient(circle, #100e26 0%, #060512 100%)",accent:"#00f0ff",border:"#ec4899",slices:["#111827","#1e1b4b","#111827","#1e1b4b","#111827","#1e1b4b"],pointerColor:"#00f0ff",centerColor:"#00f0ff",centerText:"⚡"},{id:L.MINIMAL_FLAT,title:"مینیمال تخت (Minimal Flat)",badge:"فین‌تک و B2B",badgeColor:"blue",desc:"طراحی مدرن، بدون حاشیه سنگین، فوق‌العاده خوانا، شارپ و متناسب با برندهای رسمی",bg:"radial-gradient(circle, #1e293b 0%, #0f172a 100%)",accent:"#38bdf8",border:"#3b82f6",slices:["#3b82f6","#6366f1","#3b82f6","#6366f1","#3b82f6","#6366f1"],pointerColor:"#38bdf8",centerColor:"#ffffff",centerText:"●"},{id:L.LUXURY_GOLD,title:"لوکس سلطنتی (Luxury Gold)",badge:"VIP و پرمیوم",badgeColor:"orange",desc:"پس‌زمینه مشکی ابسیدین با شیب‌های طلای متالیک، حاشیه اشرافی و مدالیون کریستالی",bg:"radial-gradient(circle, #241c0e 0%, #0d0a06 100%)",accent:"#facc15",border:"#ca8a04",slices:["#1c1917","#0c0a09","#1c1917","#0c0a09","#1c1917","#0c0a09"],pointerColor:"#eab308",centerColor:"#facc15",centerText:"VIP"},{id:L.PLAYFUL_CARTOON,title:"کارتونی فانتزی (Playful Cartoon)",badge:"خانواده و بازی",badgeColor:"magenta",desc:"رنگ‌های شاداب آب‌نباتی، بردر ضخیم و نرم، نشانگر جهنده و حس پویای بازی‌های موبایلی",bg:"radial-gradient(circle, #fef3c7 0%, #fde68a 100%)",accent:"#f43f5e",border:"#f59e0b",slices:["#f43f5e","#8b5cf6","#06b6d4","#10b981","#f59e0b","#ec4899"],pointerColor:"#ef4444",centerColor:"#facc15",centerText:"✨"}];function D(r){S("update:modelValue",r)}function Y(r,d){d.stopPropagation();const u=R.value[r]||0;R.value[r]=u+1440+Math.floor(Math.random()*360),M.value=r,setTimeout(()=>{M.value===r&&(M.value=null)},2500)}function F(r,d){d.stopPropagation(),g.value=r,w.value=!0}function x(r,d=6,u=46,i=50,s=50){const _=360/d,m=(r*_-90)*(Math.PI/180),y=((r+1)*_-90)*(Math.PI/180),a=i+u*Math.cos(m),f=s+u*Math.sin(m),$=i+u*Math.cos(y),N=s+u*Math.sin(y);return`M ${i} ${s} L ${a} ${f} A ${u} ${u} 0 0 1 ${$} ${N} Z`}function t(r,d=6,u=110,i=130,s=130){const _=360/d,m=(r*_-90)*(Math.PI/180),y=((r+1)*_-90)*(Math.PI/180),a=i+u*Math.cos(m),f=s+u*Math.sin(m),$=i+u*Math.cos(y),N=s+u*Math.sin(y);return`M ${i} ${s} L ${a} ${f} A ${u} ${u} 0 0 1 ${$} ${N} Z`}return(r,d)=>{var y;const u=p("a-tag"),i=p("a-button"),s=p("a-tooltip"),_=p("a-radio"),m=p("a-modal");return b(),v("div",re,[(b(),v(P,null,V(e,a=>n("div",{key:a.id,class:ee(["design-card",{"is-selected":h.modelValue===a.id}]),onClick:f=>D(a.id)},[n("div",{class:"preview-stage",style:E({background:a.bg})},[l(u,{color:a.badgeColor,class:"theme-tag"},{default:o(()=>[C(k(a.badge),1)]),_:2},1032,["color"]),n("div",de,[n("div",ce,[(b(),v("svg",ue,[n("path",{d:"M9 22L2 6C0.5 3 2.5 0 6 0H12C15.5 0 17.5 3 16 6L9 22Z",fill:a.pointerColor,stroke:"#ffffff","stroke-width":"1.2"},null,8,fe)]))]),(b(),v("svg",{class:"mini-wheel-svg",viewBox:"0 0 100 100",style:E({transform:`rotate(${R.value[a.id]||0}deg)`,transition:M.value===a.id?"transform 2.5s cubic-bezier(0.15, 0.9, 0.2, 1)":"none"})},[(b(!0),v(P,null,V(a.slices,(f,$)=>(b(),v("g",{key:$},[n("path",{d:x($,a.slices.length),fill:f,stroke:a.accent,"stroke-width":"0.8"},null,8,pe)]))),128)),a.id===A(L).CLASSIC_CASINO?(b(),v(P,{key:0},V(12,f=>n("circle",{key:f,cx:50+46*Math.cos((f*30-90)*(Math.PI/180)),cy:50+46*Math.sin((f*30-90)*(Math.PI/180)),r:"1.8",fill:"#fef08a"},null,8,ge)),64)):U("",!0),n("circle",{cx:"50",cy:"50",r:"13",fill:a.centerColor,stroke:a.border,"stroke-width":"1"},null,8,_e),d[2]||(d[2]=n("circle",{cx:"50",cy:"50",r:"8",fill:"#1e293b"},null,-1)),n("text",{x:"50",y:"53","text-anchor":"middle",fill:a.accent,"font-size":"6","font-weight":"bold"},k(a.centerText),9,be)],4))]),n("div",me,[l(s,{title:"تست چرخش آزمایشی"},{default:o(()=>[l(i,{size:"small",shape:"circle",class:"tool-btn",onClick:f=>Y(a.id,f)},{icon:o(()=>[l(A(K))]),_:1},8,["onClick"])]),_:2},1024),l(s,{title:"مشاهده پیش‌نمایش بزرگ"},{default:o(()=>[l(i,{size:"small",shape:"circle",class:"tool-btn",onClick:f=>F(a,f)},{icon:o(()=>[l(A(Q))]),_:1},8,["onClick"])]),_:2},1024)])],4),n("div",ve,[n("div",he,[l(_,{checked:h.modelValue===a.id},{default:o(()=>[n("span",Ce,k(a.title),1)]),_:2},1032,["checked"]),h.modelValue===a.id?(b(),H(A(W),{key:0,class:"selected-icon"})):U("",!0)]),n("p",xe,k(a.desc),1)])],10,ie)),64)),l(m,{open:w.value,"onUpdate:open":d[1]||(d[1]=a=>w.value=a),title:`پیش‌نمایش طرح: ${((y=g.value)==null?void 0:y.title)||""}`,footer:null,width:"420px",centered:""},{default:o(()=>[g.value?(b(),v("div",{key:0,class:"modal-preview-container",style:E({background:g.value.bg})},[n("div",ye,[n("div",we,[(b(),v("svg",ke,[n("path",{d:"M14 34L4 10C2 5 6 1 11 1H17C22 1 26 5 24 10L14 34Z",fill:g.value.pointerColor,stroke:"#fff","stroke-width":"1.5"},null,8,Ae)]))]),(b(),v("svg",Me,[(b(!0),v(P,null,V(g.value.slices,(a,f)=>(b(),v("g",{key:f},[n("path",{d:t(f,g.value.slices.length),fill:a,stroke:g.value.accent,"stroke-width":"1.5"},null,8,$e)]))),128)),n("circle",{cx:"130",cy:"130",r:"30",fill:g.value.centerColor,stroke:"#fff","stroke-width":"2"},null,8,Le),d[3]||(d[3]=n("circle",{cx:"130",cy:"130",r:"18",fill:"#0f172a"},null,-1)),n("text",Ie,k(g.value.centerText),1)]))]),n("div",Se,[l(i,{type:"primary",size:"large",onClick:d[0]||(d[0]=a=>{D(g.value.id),w.value=!1})},{default:o(()=>[...d[4]||(d[4]=[C(" انتخاب این طرح برای کمپین ",-1)])]),_:1})])],4)):U("",!0)]),_:1},8,["open","title"])])}}}),Te=G(Re,[["__scopeId","data-v-31298959"]]),Ne={style:{display:"flex","flex-direction":"column",gap:"8px"}},Ue={key:0,style:{position:"relative",width:"90px",height:"90px","border-radius":"12px",border:"1px solid #e2e8f0",overflow:"hidden",background:"#f8fafc",padding:"4px","box-shadow":"0 2px 6px rgba(0,0,0,0.05)"}},Oe=["src"],De={style:{display:"flex","flex-direction":"column",gap:"8px"}},Fe={key:0,style:{position:"relative",width:"160px",height:"90px","border-radius":"12px",border:"1px solid #e2e8f0",overflow:"hidden",background:"#f8fafc","box-shadow":"0 2px 6px rgba(0,0,0,0.05)"}},Pe=["src"],Ve={style:{"margin-top":"24px",display:"flex",gap:"12px"}},ze=q({__name:"CampaignFormView",setup(h){const O=oe(),S=se(),w=I(!1),g=I(null),M=I(!1),R=I(!1),e=te({title:"",slug:"",description:"",banner:"",logo:"",dateRange:[],status:"DRAFT",defaultChances:3,rules:"",ctaText:"بچرخون و برنده شو!",wheelDesign:L.CLASSIC_CASINO,primaryColor:"#FFD700",secondaryColor:"#B22222"});async function D(){if(g.value){M.value=!0;try{const t=(await B.get(`/admin/campaigns/${g.value}`)).data;e.title=t.title,e.slug=t.slug,e.description=t.description||"",e.banner=t.banner||"",e.logo=t.logo||"",e.status=t.status,e.defaultChances=t.defaultChances,e.rules=t.rules||"",e.ctaText=t.ctaText||"بچرخون و برنده شو!",e.wheelDesign=t.wheelDesign,e.dateRange=[z(t.startAt),z(t.endAt)],t.settings&&(e.primaryColor=t.settings.primaryColor||"#FFD700",e.secondaryColor=t.settings.secondaryColor||"#B22222")}finally{M.value=!1}}}async function Y(){var t,r,d,u,i;if(!e.title||!e.title.trim()){T.error("لطفاً عنوان کمپین را وارد کنید.");return}let x=(e.slug||"").trim().toLowerCase().replace(/\s+/g,"-");if(x||(x="campaign-"+Math.random().toString(36).substring(2,8)),e.slug=x,!/^[a-z0-9-]+$/.test(x)){T.error("شناسه URL (اسلاگ) باید فقط شامل حروف کوچک انگلیسی، اعداد و خط تیره (-) باشد.");return}if(!e.dateRange||e.dateRange.length<2){T.error("لطفاً بازه زمانی شروع و پایان کمپین را انتخاب کنید.");return}R.value=!0;try{const s={title:e.title.trim(),slug:e.slug.trim(),description:((t=e.description)==null?void 0:t.trim())||void 0,banner:e.banner?e.banner.trim():null,logo:e.logo?e.logo.trim():null,startAt:e.dateRange[0].toISOString(),endAt:e.dateRange[1].toISOString(),status:e.status,defaultChances:Number(e.defaultChances)||0,rules:((r=e.rules)==null?void 0:r.trim())||void 0,ctaText:e.ctaText||"بچرخون و برنده شو!",wheelDesign:e.wheelDesign,settings:{primaryColor:e.primaryColor,secondaryColor:e.secondaryColor}};if(w.value&&g.value)await B.patch(`/admin/campaigns/${g.value}`,s),T.success("کمپین با موفقیت به‌روزرسانی شد."),S.push("/campaigns");else{const _=await B.post("/admin/campaigns",s);T.success("کمپین با موفقیت ایجاد گردید.");const m=((d=_.data)==null?void 0:d.id)||_.id;m?S.push(`/campaigns/${m}/prizes`):S.push("/campaigns")}}catch(s){const _=((i=(u=s.response)==null?void 0:u.data)==null?void 0:i.message)||s.message||"خطایی در ثبت اطلاعات کمپین رخ داد.";T.error(Array.isArray(_)?_.join(" | "):_)}finally{R.value=!1}}async function F(x,t){const r=new FormData;r.append("file",x);try{const d=await B.post("/admin/uploads",r,{headers:{"Content-Type":"multipart/form-data"}});e[t]=d.data.url,T.success("تصویر با موفقیت آپلود شد.")}catch{}return!1}return le(()=>{O.params.id?(w.value=!0,g.value=O.params.id,D()):e.dateRange=[z(),z().add(1,"month")]}),(x,t)=>{const r=p("a-button"),d=p("a-space"),u=p("a-input"),i=p("a-form-item"),s=p("a-col"),_=p("a-range-picker"),m=p("a-select-option"),y=p("a-select"),a=p("a-input-number"),f=p("a-upload"),$=p("a-divider"),N=p("a-textarea"),Z=p("a-row"),X=p("a-form"),J=p("a-card");return b(),H(J,{bordered:!1,loading:M.value},{title:o(()=>[l(d,null,{default:o(()=>[l(r,{type:"text",onClick:t[0]||(t[0]=c=>A(S).push("/campaigns"))},{icon:o(()=>[l(A(ne))]),_:1}),n("span",null,k(w.value?"ویرایش اطلاعات کمپین":"تعریف کمپین جدید گردونه شانس"),1)]),_:1})]),default:o(()=>[l(X,{model:e,layout:"vertical",onSubmit:ae(Y,["prevent"])},{default:o(()=>[l(Z,{gutter:24},{default:o(()=>[l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"عنوان کمپین",name:"title",required:"",rules:[{required:!0,message:"عنوان کمپین الزامی است"}]},{default:o(()=>[l(u,{value:e.title,"onUpdate:value":t[1]||(t[1]=c=>e.title=c),placeholder:"مثال: جشنواره عیدانه گردونه شانس"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"شناسه URL (اسلاگ)",name:"slug",required:"",extra:"فقط حروف کوچک انگلیسی، اعداد و خط تیره (-) مانند: norooz-1405",rules:[{required:!0,message:"اسلاگ الزامی است"}]},{default:o(()=>[l(u,{value:e.slug,"onUpdate:value":t[2]||(t[2]=c=>e.slug=c),placeholder:"eid-1405"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"بازه زمانی اعتبار (شروع و پایان)",name:"dateRange",required:""},{default:o(()=>[l(_,{value:e.dateRange,"onUpdate:value":t[3]||(t[3]=c=>e.dateRange=c),"show-time":"",format:"YYYY/MM/DD HH:mm",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"وضعیت کمپین"},{default:o(()=>[l(y,{value:e.status,"onUpdate:value":t[4]||(t[4]=c=>e.status=c)},{default:o(()=>[l(m,{value:"DRAFT"},{default:o(()=>[...t[13]||(t[13]=[C("پیش‌نویس",-1)])]),_:1}),l(m,{value:"ACTIVE"},{default:o(()=>[...t[14]||(t[14]=[C("فعال",-1)])]),_:1}),l(m,{value:"PAUSED"},{default:o(()=>[...t[15]||(t[15]=[C("متوقف",-1)])]),_:1}),l(m,{value:"FINISHED"},{default:o(()=>[...t[16]||(t[16]=[C("پایان‌یافته",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"تعداد شانس پیش‌فرض کاربران"},{default:o(()=>[l(a,{value:e.defaultChances,"onUpdate:value":t[5]||(t[5]=c=>e.defaultChances=c),min:0,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"متن دکمه چرخاندن (CTA)"},{default:o(()=>[l(u,{value:e.ctaText,"onUpdate:value":t[6]||(t[6]=c=>e.ctaText=c),placeholder:"بچرخون و برنده شو!"},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"لوگوی کمپین"},{default:o(()=>[n("div",Ne,[e.logo?(b(),v("div",Ue,[n("img",{src:e.logo,alt:"لوگو",style:{width:"100%",height:"100%","object-fit":"contain"}},null,8,Oe),n("button",{type:"button",style:{position:"absolute",top:"4px",left:"4px",width:"20px",height:"20px","border-radius":"50%",background:"#ef4444",color:"#fff",border:"none","font-size":"11px",cursor:"pointer",display:"flex","justify-content":"center","line-height":"1"},title:"حذف لوگو",onClick:t[7]||(t[7]=c=>e.logo="")}," ✕ ")])):U("",!0),l(f,{"before-upload":c=>F(c,"logo"),"show-upload-list":!1},{default:o(()=>[l(r,null,{icon:o(()=>[l(A(j))]),default:o(()=>[C(" "+k(e.logo?"تغییر لوگو":"انتخاب فایل لوگو"),1)]),_:1})]),_:1},8,["before-upload"])])]),_:1})]),_:1}),l(s,{xs:24,md:6},{default:o(()=>[l(i,{label:"بنر کمپین"},{default:o(()=>[n("div",De,[e.banner?(b(),v("div",Fe,[n("img",{src:e.banner,alt:"بنر",style:{width:"100%",height:"100%","object-fit":"cover"}},null,8,Pe),n("button",{type:"button",style:{position:"absolute",top:"4px",left:"4px",width:"20px",height:"20px","border-radius":"50%",background:"#ef4444",color:"#fff",border:"none","font-size":"11px",cursor:"pointer",display:"flex","justify-content":"center","line-height":"1"},title:"حذف بنر",onClick:t[8]||(t[8]=c=>e.banner="")}," ✕ ")])):U("",!0),l(f,{"before-upload":c=>F(c,"banner"),"show-upload-list":!1},{default:o(()=>[l(r,null,{icon:o(()=>[l(A(j))]),default:o(()=>[C(" "+k(e.banner?"تغییر بنر":"انتخاب فایل بنر"),1)]),_:1})]),_:1},8,["before-upload"])])]),_:1})]),_:1}),l(s,{xs:24},{default:o(()=>[l($,null,{default:o(()=>[...t[17]||(t[17]=[C("طرح بصری گردونه شانس (انتخاب از بین ۵ طرح استاندار)",-1)])]),_:1}),l(i,null,{default:o(()=>[l(Te,{modelValue:e.wheelDesign,"onUpdate:modelValue":t[9]||(t[9]=c=>e.wheelDesign=c)},null,8,["modelValue"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"توضیحات کوتاه کمپین"},{default:o(()=>[l(N,{value:e.description,"onUpdate:value":t[10]||(t[10]=c=>e.description=c),rows:3},null,8,["value"])]),_:1})]),_:1}),l(s,{xs:24,md:12},{default:o(()=>[l(i,{label:"قوانین و مقررات کمپین"},{default:o(()=>[l(N,{value:e.rules,"onUpdate:value":t[11]||(t[11]=c=>e.rules=c),rows:3},null,8,["value"])]),_:1})]),_:1})]),_:1}),n("div",Ve,[l(r,{type:"primary","html-type":"submit",size:"large",loading:R.value,class:"submit-btn"},{default:o(()=>[C(k(w.value?"ذخیره تغییرات":"ایجاد کمپین و ورود به تعریف جوایز"),1)]),_:1},8,["loading"]),l(r,{size:"large",onClick:t[12]||(t[12]=c=>A(S).push("/campaigns"))},{default:o(()=>[...t[18]||(t[18]=[C("انصراف",-1)])]),_:1})])]),_:1},8,["model"])]),_:1},8,["loading"])}}}),Ee=G(ze,[["__scopeId","data-v-c11ffb22"]]);export{Ee as default}; diff --git a/apps/admin/dist/assets/CampaignListView-Czzgz98v.js b/apps/admin/dist/assets/CampaignListView-CLT23C_L.js similarity index 97% rename from apps/admin/dist/assets/CampaignListView-Czzgz98v.js rename to apps/admin/dist/assets/CampaignListView-CLT23C_L.js index d0cb180..0543333 100644 --- a/apps/admin/dist/assets/CampaignListView-Czzgz98v.js +++ b/apps/admin/dist/assets/CampaignListView-CLT23C_L.js @@ -1 +1 @@ -import{t as x,f as U}from"./farsi-number-stB7JMN0.js";import{d as H,j as X,a as _,b as n,c as a,w as s,e as i,i as K,m as I,r,h as D,g as J,o as u,f,B as Q,S as W,t as g,s as w,D as Z,G as tt,E as et,C as at,F as st,z as nt,q as b,M as ot,y as E,_ as it}from"./index-Dx9ODHpC.js";import{M as lt}from"./MoreOutlined-BVlNw6dC.js";import{G as dt}from"./GiftOutlined-B8oIapKF.js";import{P as ut}from"./PauseCircleOutlined-Bifiy1P2.js";const ct={class:"campaign-list-page"},rt={class:"page-header-title"},pt={class:"table-header"},mt={class:"filters"},_t=["onClick"],gt={key:1,class:"slug-badge"},yt={key:4,class:"date-cell"},ft={key:5,class:"date-cell"},kt={key:6,class:"num-cell"},Ct={key:7,class:"num-cell"},vt=["href"],wt={class:"dropdown-action-item"},At={class:"dropdown-action-item"},ht={class:"dropdown-action-item"},St={class:"dropdown-action-item text-success"},xt={class:"dropdown-action-item text-warning"},It=H({__name:"CampaignListView",setup(Dt){const A=K(),h=D(!1),L=D([]),T=D(0),c=J({page:1,pageSize:10,status:void 0,search:""});async function k(){var l,t,p,y;h.value=!0;try{const d=await I.get("/admin/campaigns",{params:{page:c.page,pageSize:c.pageSize,status:c.status,search:c.search||void 0}}),m=Array.isArray(d.data)?d.data:((l=d.data)==null?void 0:l.data)||[];L.value=m,T.value=((t=d.meta)==null?void 0:t.total)||((y=(p=d.data)==null?void 0:p.meta)==null?void 0:y.total)||m.length}finally{h.value=!1}}async function V(l){try{await I.post(`/admin/campaigns/${l}/duplicate`),E.success("کمپین و جوایز آن با موفقیت کپی شدند."),k()}catch{}}function R(l){ot.confirm({title:"کپی‌برداری از کمپین",content:`آیا از کپی کردن کمپین «${l.title}» و تمام جوایز آن اطمینان دارید؟`,okText:"بله، کپی کن",cancelText:"انصراف",onOk:()=>V(l.id)})}async function z(l,t){var p,y;try{await I.patch(`/admin/campaigns/${l}`,{status:t}),E.success(t==="ACTIVE"?"کمپین با موفقیت فعال و منتشر شد.":"وضعیت کمپین تغییر یافت."),k()}catch(d){const m=((y=(p=d.response)==null?void 0:p.data)==null?void 0:y.message)||d.message||"خطا در تغییر وضعیت کمپین.";E.error(Array.isArray(m)?m.join(" | "):m)}}const M={CLASSIC:"کلاسیک",CLASSIC_CASINO:"کلاسیک کازینو",NEON:"نئون دیجیتال",NEON_CYBER:"نئون سایبر",MINIMAL:"مینیمال مدرن",MINIMAL_FLAT:"مینیمال فلت",LUXURY:"لاکچری طلایی",LUXURY_GOLD:"لاکچری طلایی",FESTIVAL:"جشنواره‌ای شاد",PLAYFUL_CARTOON:"کارتونی شاد"},P=[{title:"عنوان کمپین",dataIndex:"title",key:"title"},{title:"اسلاگ (URL)",dataIndex:"slug",key:"slug"},{title:"طرح گردونه",dataIndex:"wheelDesign",key:"wheelDesign"},{title:"وضعیت",dataIndex:"status",key:"status"},{title:"شروع",dataIndex:"startAt",key:"startAt"},{title:"پایان",dataIndex:"endAt",key:"endAt"},{title:"تعداد جوایز",key:"prizesCount",align:"center"},{title:"تعداد اسپین‌ها",key:"spinsCount",align:"center"},{title:"عملیات",key:"actions",width:70,align:"center"}];function S(l){switch(l){case"ACTIVE":return{color:"green",dotColor:"#10b981",text:"فعال"};case"PAUSED":return{color:"orange",dotColor:"#f59e0b",text:"متوقف"};case"FINISHED":return{color:"red",dotColor:"#ef4444",text:"پایان‌یافته"};case"DRAFT":return{color:"gold",dotColor:"#d97706",text:"پیش‌نویس"};default:return{color:"default",dotColor:"#94a3b8",text:l}}}return X(()=>{k()}),(l,t)=>{const p=r("a-button"),y=r("a-input-search"),d=r("a-select-option"),m=r("a-select"),O=r("a-tag"),C=r("a-menu-item"),B=r("a-menu-divider"),G=r("a-menu"),Y=r("a-dropdown"),j=r("a-table"),q=r("a-card");return u(),_("div",ct,[n("div",rt,[t[4]||(t[4]=n("div",null,[n("h1",{class:"title"},"مدیریت کمپین‌ها"),n("p",{class:"subtitle"},"تعریف، پیکربندی و مدیریت رویدادهای گردونه شانس")],-1)),a(p,{type:"primary",size:"middle",class:"create-btn",onClick:t[0]||(t[0]=o=>i(A).push("/campaigns/create"))},{icon:s(()=>[a(i(Q))]),default:s(()=>[t[3]||(t[3]=f(" ایجاد کمپین جدید ",-1))]),_:1})]),a(q,{bordered:!1,class:"main-card"},{default:s(()=>[n("div",pt,[n("div",mt,[a(y,{value:c.search,"onUpdate:value":t[1]||(t[1]=o=>c.search=o),placeholder:"جستجوی عنوان یا اسلاگ...",style:{width:"270px"},allowClear:"",onSearch:k},{prefix:s(()=>[a(i(W),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),a(m,{value:c.status,"onUpdate:value":t[2]||(t[2]=o=>c.status=o),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"150px"},onChange:k},{default:s(()=>[a(d,{value:"DRAFT"},{default:s(()=>[...t[5]||(t[5]=[f("پیش‌نویس",-1)])]),_:1}),a(d,{value:"ACTIVE"},{default:s(()=>[...t[6]||(t[6]=[f("فعال",-1)])]),_:1}),a(d,{value:"PAUSED"},{default:s(()=>[...t[7]||(t[7]=[f("متوقف",-1)])]),_:1}),a(d,{value:"FINISHED"},{default:s(()=>[...t[8]||(t[8]=[f("پایان‌یافته",-1)])]),_:1})]),_:1},8,["value"])])]),a(j,{dataSource:L.value,columns:P,loading:h.value,rowKey:"id",size:"middle",pagination:{current:c.page,pageSize:c.pageSize,total:T.value,showTotal:o=>`مجموع: ${i(x)(o)} کمپین`,onChange:o=>{c.page=o,k()}}},{bodyCell:s(({column:o,record:e})=>{var N,$,F;return[o.key==="title"?(u(),_("span",{key:0,class:"campaign-title",onClick:v=>i(A).push(`/campaigns/${e.id}/edit`)},g(e.title),9,_t)):o.key==="slug"?(u(),_("code",gt,g(e.slug),1)):o.key==="wheelDesign"?(u(),w(O,{key:2,color:"purple",style:{"border-radius":"6px"}},{default:s(()=>[f(g(M[e.wheelDesign]||e.wheelDesign),1)]),_:2},1024)):o.key==="status"?(u(),w(O,{key:3,color:S(e.status).color,class:"status-tag"},{default:s(()=>[n("span",{class:"status-dot",style:Z({backgroundColor:S(e.status).dotColor})},null,4),f(" "+g(S(e.status).text),1)]),_:2},1032,["color"])):o.key==="startAt"?(u(),_("span",yt,g(i(x)(new Date(e.startAt).toLocaleDateString("fa-IR"))),1)):o.key==="endAt"?(u(),_("span",ft,g(i(x)(new Date(e.endAt).toLocaleDateString("fa-IR"))),1)):o.key==="prizesCount"?(u(),_("span",kt,g(i(U)(((N=e._count)==null?void 0:N.prizes)??((($=e.prizes)==null?void 0:$.length)||0))),1)):o.key==="spinsCount"?(u(),_("span",Ct,g(i(U)(((F=e._count)==null?void 0:F.spins)??0)),1)):o.key==="actions"?(u(),w(Y,{key:8,trigger:["click"],placement:"bottomLeft"},{overlay:s(()=>[a(G,{class:"action-dropdown-menu"},{default:s(()=>[a(C,{key:"view"},{default:s(()=>[n("a",{href:"http://localhost:5174/c/"+e.slug,target:"_blank",class:"dropdown-action-item"},[a(i(tt),{class:"dropdown-item-icon"}),t[9]||(t[9]=n("span",null,"مشاهده گردونه",-1))],8,vt)]),_:2},1024),a(C,{key:"edit",onClick:v=>i(A).push(`/campaigns/${e.id}/edit`)},{default:s(()=>[n("div",wt,[a(i(et),{class:"dropdown-item-icon"}),t[10]||(t[10]=n("span",null,"ویرایش اطلاعات",-1))])]),_:1},8,["onClick"]),a(C,{key:"prizes",onClick:v=>i(A).push(`/campaigns/${e.id}/prizes`)},{default:s(()=>[n("div",At,[a(i(dt),{class:"dropdown-item-icon"}),t[11]||(t[11]=n("span",null,"مدیریت جوایز",-1))])]),_:1},8,["onClick"]),a(C,{key:"duplicate",onClick:v=>R(e)},{default:s(()=>[n("div",ht,[a(i(at),{class:"dropdown-item-icon"}),t[12]||(t[12]=n("span",null,"کپی‌برداری",-1))])]),_:1},8,["onClick"]),e.status==="DRAFT"||e.status==="ACTIVE"||e.status==="PAUSED"?(u(),_(st,{key:0},[a(B),e.status==="DRAFT"||e.status==="PAUSED"?(u(),w(C,{key:"activate",onClick:v=>z(e.id,"ACTIVE")},{default:s(()=>[n("div",St,[a(i(nt),{class:"dropdown-item-icon"}),t[13]||(t[13]=n("span",null,"فعال‌سازی و انتشار",-1))])]),_:1},8,["onClick"])):e.status==="ACTIVE"?(u(),w(C,{key:"pause",onClick:v=>z(e.id,"PAUSED")},{default:s(()=>[n("div",xt,[a(i(ut),{class:"dropdown-item-icon"}),t[14]||(t[14]=n("span",null,"توقف موقت",-1))])]),_:1},8,["onClick"])):b("",!0)],64)):b("",!0)]),_:2},1024)]),default:s(()=>[a(p,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:s(()=>[a(i(lt),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):b("",!0)]}),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),Ot=it(It,[["__scopeId","data-v-d90ae09e"]]);export{Ot as default}; +import{t as x,f as U}from"./farsi-number-stB7JMN0.js";import{d as H,j as X,a as _,b as n,c as a,w as s,e as i,i as K,m as I,r,h as D,g as J,o as u,f,B as Q,S as W,t as g,s as w,D as Z,G as tt,E as et,C as at,F as st,z as nt,q as b,M as ot,y as E,_ as it}from"./index-iu4REYcj.js";import{M as lt}from"./MoreOutlined-B9LhmUnJ.js";import{G as dt}from"./GiftOutlined-Du5L-j2h.js";import{P as ut}from"./PauseCircleOutlined-MyjHwEZJ.js";const ct={class:"campaign-list-page"},rt={class:"page-header-title"},pt={class:"table-header"},mt={class:"filters"},_t=["onClick"],gt={key:1,class:"slug-badge"},yt={key:4,class:"date-cell"},ft={key:5,class:"date-cell"},kt={key:6,class:"num-cell"},Ct={key:7,class:"num-cell"},vt=["href"],wt={class:"dropdown-action-item"},At={class:"dropdown-action-item"},ht={class:"dropdown-action-item"},St={class:"dropdown-action-item text-success"},xt={class:"dropdown-action-item text-warning"},It=H({__name:"CampaignListView",setup(Dt){const A=K(),h=D(!1),L=D([]),T=D(0),c=J({page:1,pageSize:10,status:void 0,search:""});async function k(){var l,t,p,y;h.value=!0;try{const d=await I.get("/admin/campaigns",{params:{page:c.page,pageSize:c.pageSize,status:c.status,search:c.search||void 0}}),m=Array.isArray(d.data)?d.data:((l=d.data)==null?void 0:l.data)||[];L.value=m,T.value=((t=d.meta)==null?void 0:t.total)||((y=(p=d.data)==null?void 0:p.meta)==null?void 0:y.total)||m.length}finally{h.value=!1}}async function V(l){try{await I.post(`/admin/campaigns/${l}/duplicate`),E.success("کمپین و جوایز آن با موفقیت کپی شدند."),k()}catch{}}function R(l){ot.confirm({title:"کپی‌برداری از کمپین",content:`آیا از کپی کردن کمپین «${l.title}» و تمام جوایز آن اطمینان دارید؟`,okText:"بله، کپی کن",cancelText:"انصراف",onOk:()=>V(l.id)})}async function z(l,t){var p,y;try{await I.patch(`/admin/campaigns/${l}`,{status:t}),E.success(t==="ACTIVE"?"کمپین با موفقیت فعال و منتشر شد.":"وضعیت کمپین تغییر یافت."),k()}catch(d){const m=((y=(p=d.response)==null?void 0:p.data)==null?void 0:y.message)||d.message||"خطا در تغییر وضعیت کمپین.";E.error(Array.isArray(m)?m.join(" | "):m)}}const M={CLASSIC:"کلاسیک",CLASSIC_CASINO:"کلاسیک کازینو",NEON:"نئون دیجیتال",NEON_CYBER:"نئون سایبر",MINIMAL:"مینیمال مدرن",MINIMAL_FLAT:"مینیمال فلت",LUXURY:"لاکچری طلایی",LUXURY_GOLD:"لاکچری طلایی",FESTIVAL:"جشنواره‌ای شاد",PLAYFUL_CARTOON:"کارتونی شاد"},P=[{title:"عنوان کمپین",dataIndex:"title",key:"title"},{title:"اسلاگ (URL)",dataIndex:"slug",key:"slug"},{title:"طرح گردونه",dataIndex:"wheelDesign",key:"wheelDesign"},{title:"وضعیت",dataIndex:"status",key:"status"},{title:"شروع",dataIndex:"startAt",key:"startAt"},{title:"پایان",dataIndex:"endAt",key:"endAt"},{title:"تعداد جوایز",key:"prizesCount",align:"center"},{title:"تعداد اسپین‌ها",key:"spinsCount",align:"center"},{title:"عملیات",key:"actions",width:70,align:"center"}];function S(l){switch(l){case"ACTIVE":return{color:"green",dotColor:"#10b981",text:"فعال"};case"PAUSED":return{color:"orange",dotColor:"#f59e0b",text:"متوقف"};case"FINISHED":return{color:"red",dotColor:"#ef4444",text:"پایان‌یافته"};case"DRAFT":return{color:"gold",dotColor:"#d97706",text:"پیش‌نویس"};default:return{color:"default",dotColor:"#94a3b8",text:l}}}return X(()=>{k()}),(l,t)=>{const p=r("a-button"),y=r("a-input-search"),d=r("a-select-option"),m=r("a-select"),O=r("a-tag"),C=r("a-menu-item"),B=r("a-menu-divider"),G=r("a-menu"),Y=r("a-dropdown"),j=r("a-table"),q=r("a-card");return u(),_("div",ct,[n("div",rt,[t[4]||(t[4]=n("div",null,[n("h1",{class:"title"},"مدیریت کمپین‌ها"),n("p",{class:"subtitle"},"تعریف، پیکربندی و مدیریت رویدادهای گردونه شانس")],-1)),a(p,{type:"primary",size:"middle",class:"create-btn",onClick:t[0]||(t[0]=o=>i(A).push("/campaigns/create"))},{icon:s(()=>[a(i(Q))]),default:s(()=>[t[3]||(t[3]=f(" ایجاد کمپین جدید ",-1))]),_:1})]),a(q,{bordered:!1,class:"main-card"},{default:s(()=>[n("div",pt,[n("div",mt,[a(y,{value:c.search,"onUpdate:value":t[1]||(t[1]=o=>c.search=o),placeholder:"جستجوی عنوان یا اسلاگ...",style:{width:"270px"},allowClear:"",onSearch:k},{prefix:s(()=>[a(i(W),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),a(m,{value:c.status,"onUpdate:value":t[2]||(t[2]=o=>c.status=o),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"150px"},onChange:k},{default:s(()=>[a(d,{value:"DRAFT"},{default:s(()=>[...t[5]||(t[5]=[f("پیش‌نویس",-1)])]),_:1}),a(d,{value:"ACTIVE"},{default:s(()=>[...t[6]||(t[6]=[f("فعال",-1)])]),_:1}),a(d,{value:"PAUSED"},{default:s(()=>[...t[7]||(t[7]=[f("متوقف",-1)])]),_:1}),a(d,{value:"FINISHED"},{default:s(()=>[...t[8]||(t[8]=[f("پایان‌یافته",-1)])]),_:1})]),_:1},8,["value"])])]),a(j,{dataSource:L.value,columns:P,loading:h.value,rowKey:"id",size:"middle",pagination:{current:c.page,pageSize:c.pageSize,total:T.value,showTotal:o=>`مجموع: ${i(x)(o)} کمپین`,onChange:o=>{c.page=o,k()}}},{bodyCell:s(({column:o,record:e})=>{var N,$,F;return[o.key==="title"?(u(),_("span",{key:0,class:"campaign-title",onClick:v=>i(A).push(`/campaigns/${e.id}/edit`)},g(e.title),9,_t)):o.key==="slug"?(u(),_("code",gt,g(e.slug),1)):o.key==="wheelDesign"?(u(),w(O,{key:2,color:"purple",style:{"border-radius":"6px"}},{default:s(()=>[f(g(M[e.wheelDesign]||e.wheelDesign),1)]),_:2},1024)):o.key==="status"?(u(),w(O,{key:3,color:S(e.status).color,class:"status-tag"},{default:s(()=>[n("span",{class:"status-dot",style:Z({backgroundColor:S(e.status).dotColor})},null,4),f(" "+g(S(e.status).text),1)]),_:2},1032,["color"])):o.key==="startAt"?(u(),_("span",yt,g(i(x)(new Date(e.startAt).toLocaleDateString("fa-IR"))),1)):o.key==="endAt"?(u(),_("span",ft,g(i(x)(new Date(e.endAt).toLocaleDateString("fa-IR"))),1)):o.key==="prizesCount"?(u(),_("span",kt,g(i(U)(((N=e._count)==null?void 0:N.prizes)??((($=e.prizes)==null?void 0:$.length)||0))),1)):o.key==="spinsCount"?(u(),_("span",Ct,g(i(U)(((F=e._count)==null?void 0:F.spins)??0)),1)):o.key==="actions"?(u(),w(Y,{key:8,trigger:["click"],placement:"bottomLeft"},{overlay:s(()=>[a(G,{class:"action-dropdown-menu"},{default:s(()=>[a(C,{key:"view"},{default:s(()=>[n("a",{href:"http://localhost:5174/c/"+e.slug,target:"_blank",class:"dropdown-action-item"},[a(i(tt),{class:"dropdown-item-icon"}),t[9]||(t[9]=n("span",null,"مشاهده گردونه",-1))],8,vt)]),_:2},1024),a(C,{key:"edit",onClick:v=>i(A).push(`/campaigns/${e.id}/edit`)},{default:s(()=>[n("div",wt,[a(i(et),{class:"dropdown-item-icon"}),t[10]||(t[10]=n("span",null,"ویرایش اطلاعات",-1))])]),_:1},8,["onClick"]),a(C,{key:"prizes",onClick:v=>i(A).push(`/campaigns/${e.id}/prizes`)},{default:s(()=>[n("div",At,[a(i(dt),{class:"dropdown-item-icon"}),t[11]||(t[11]=n("span",null,"مدیریت جوایز",-1))])]),_:1},8,["onClick"]),a(C,{key:"duplicate",onClick:v=>R(e)},{default:s(()=>[n("div",ht,[a(i(at),{class:"dropdown-item-icon"}),t[12]||(t[12]=n("span",null,"کپی‌برداری",-1))])]),_:1},8,["onClick"]),e.status==="DRAFT"||e.status==="ACTIVE"||e.status==="PAUSED"?(u(),_(st,{key:0},[a(B),e.status==="DRAFT"||e.status==="PAUSED"?(u(),w(C,{key:"activate",onClick:v=>z(e.id,"ACTIVE")},{default:s(()=>[n("div",St,[a(i(nt),{class:"dropdown-item-icon"}),t[13]||(t[13]=n("span",null,"فعال‌سازی و انتشار",-1))])]),_:1},8,["onClick"])):e.status==="ACTIVE"?(u(),w(C,{key:"pause",onClick:v=>z(e.id,"PAUSED")},{default:s(()=>[n("div",xt,[a(i(ut),{class:"dropdown-item-icon"}),t[14]||(t[14]=n("span",null,"توقف موقت",-1))])]),_:1},8,["onClick"])):b("",!0)],64)):b("",!0)]),_:2},1024)]),default:s(()=>[a(p,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:s(()=>[a(i(lt),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):b("",!0)]}),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),Ot=it(It,[["__scopeId","data-v-d90ae09e"]]);export{Ot as default}; diff --git a/apps/admin/dist/assets/DashboardView-B1JpTeJR.js b/apps/admin/dist/assets/DashboardView-po4OVtHF.js similarity index 99% rename from apps/admin/dist/assets/DashboardView-B1JpTeJR.js rename to apps/admin/dist/assets/DashboardView-po4OVtHF.js index a9573fc..65414f1 100644 --- a/apps/admin/dist/assets/DashboardView-B1JpTeJR.js +++ b/apps/admin/dist/assets/DashboardView-po4OVtHF.js @@ -1,4 +1,4 @@ -import{c as at,I as ig,d as pI,j as dI,k as gI,a as Ce,b as X,l as yI,w as gt,e as mt,f as he,i as mI,h as Vl,m as _I,n as SI,r as na,o as ve,R as ym,T as mm,L as xI,U as _m,t as $t,P as Sm,p as bI,v as wI,q as Di,s as $h,A as xm,F as bm,x as TI,C as AI,y as CI,z as DI,E as MI,_ as II}from"./index-Dx9ODHpC.js";import{t as tr,f as Xe}from"./farsi-number-stB7JMN0.js";import{P as wm}from"./PlusCircleOutlined-46hEPOWa.js";import{T as LI}from"./TeamOutlined-D0tX_kEo.js";import{G as Tm}from"./GiftOutlined-B8oIapKF.js";var PI={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z"}}]},name:"arrow-up",theme:"outlined"};function Am(r){for(var e=1;e{const v=c("a-input"),u=c("a-form-item"),b=c("a-input-password"),w=c("a-button"),y=c("a-form");return S(),V("div",A,[o[4]||(o[4]=n("div",{class:"login-bg-decorations"},[n("div",{class:"decor-circle circle-1"}),n("div",{class:"decor-circle circle-2"})],-1)),n("div",C,[o[3]||(o[3]=n("div",{class:"header"},[n("div",{class:"logo-wrapper"},[n("span",{class:"logo"},"🎡")]),n("h1",null,"ورود به پنل مدیریت"),n("p",null,"سامانه گردونه شانس و قرعه‌کشی")],-1)),l(y,{model:e,layout:"vertical",onFinish:_},{default:i(()=>[l(u,{label:"ایمیل مدیریت",name:"email",rules:[{required:!0,message:"لطفاً ایمیل را وارد کنید"},{type:"email",message:"فرمت ایمیل نامعتبر است"}]},{default:i(()=>[l(v,{value:e.email,"onUpdate:value":o[0]||(o[0]=d=>e.email=d),size:"large",placeholder:"admin@example.com"},{prefix:i(()=>[l(p(m),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{label:"کلمه عبور",name:"password",rules:[{required:!0,message:"لطفاً کلمه عبور را وارد کنید"}]},{default:i(()=>[l(b,{value:e.password,"onUpdate:value":o[1]||(o[1]=d=>e.password=d),size:"large",placeholder:"••••••••"},{prefix:i(()=>[l(p(B),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{style:{"margin-top":"28px"}},{default:i(()=>[l(w,{type:"primary","html-type":"submit",size:"large",block:"",loading:s.value,class:"login-submit-btn"},{default:i(()=>[...o[2]||(o[2]=[z(" ورود به پنل ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])])}}}),H=j(I,[["__scopeId","data-v-20e1793e"]]);export{H as default}; +import{c as l,I as h,d as O,u as x,a as V,b as n,w as i,r as c,o as S,e as p,f as z,g as L,h as M,i as P,_ as j}from"./index-iu4REYcj.js";import{L as B}from"./LockOutlined-NIokxtdn.js";var N={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0068.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z"}}]},name:"mail",theme:"outlined"};function f(r){for(var a=1;a{const v=c("a-input"),u=c("a-form-item"),b=c("a-input-password"),w=c("a-button"),y=c("a-form");return S(),V("div",A,[o[4]||(o[4]=n("div",{class:"login-bg-decorations"},[n("div",{class:"decor-circle circle-1"}),n("div",{class:"decor-circle circle-2"})],-1)),n("div",C,[o[3]||(o[3]=n("div",{class:"header"},[n("div",{class:"logo-wrapper"},[n("span",{class:"logo"},"🎡")]),n("h1",null,"ورود به پنل مدیریت"),n("p",null,"سامانه گردونه شانس و قرعه‌کشی")],-1)),l(y,{model:e,layout:"vertical",onFinish:_},{default:i(()=>[l(u,{label:"ایمیل مدیریت",name:"email",rules:[{required:!0,message:"لطفاً ایمیل را وارد کنید"},{type:"email",message:"فرمت ایمیل نامعتبر است"}]},{default:i(()=>[l(v,{value:e.email,"onUpdate:value":o[0]||(o[0]=d=>e.email=d),size:"large",placeholder:"admin@example.com"},{prefix:i(()=>[l(p(m),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{label:"کلمه عبور",name:"password",rules:[{required:!0,message:"لطفاً کلمه عبور را وارد کنید"}]},{default:i(()=>[l(b,{value:e.password,"onUpdate:value":o[1]||(o[1]=d=>e.password=d),size:"large",placeholder:"••••••••"},{prefix:i(()=>[l(p(B),{style:{color:"#6366f1"}})]),_:1},8,["value"])]),_:1}),l(u,{style:{"margin-top":"28px"}},{default:i(()=>[l(w,{type:"primary","html-type":"submit",size:"large",block:"",loading:s.value,class:"login-submit-btn"},{default:i(()=>[...o[2]||(o[2]=[z(" ورود به پنل ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])])}}}),H=j(I,[["__scopeId","data-v-20e1793e"]]);export{H as default}; diff --git a/apps/admin/dist/assets/MoreOutlined-BVlNw6dC.js b/apps/admin/dist/assets/MoreOutlined-B9LhmUnJ.js similarity index 92% rename from apps/admin/dist/assets/MoreOutlined-BVlNw6dC.js rename to apps/admin/dist/assets/MoreOutlined-B9LhmUnJ.js index 12e4c70..a1e4b0e 100644 --- a/apps/admin/dist/assets/MoreOutlined-BVlNw6dC.js +++ b/apps/admin/dist/assets/MoreOutlined-B9LhmUnJ.js @@ -1 +1 @@ -import{c as u,I as l}from"./index-Dx9ODHpC.js";var c={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M456 231a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0z"}}]},name:"more",theme:"outlined"};function o(r){for(var e=1;e{const l=$(a.weight,1),d=V.value.reduce((y,T)=>L.value&&T.id===L.value?y:y+((T.status==="ACTIVE"||T.isActive)&&T.weight||0),0)+l;if(d<=0)return"۰";const r=(l/d*100).toFixed(1);return R(r)});function ge(l){l==="NO_PRIZE"&&(a.stockType="UNLIMITED",(!a.title||a.title.trim()==="")&&(a.title="پوچ (دفعه بعد)"))}const k=de({prizeId:"",prizeTitle:"",currentStock:0,change:0,reason:""}),Q=ce(()=>V.value.reduce((l,e)=>l+(e.status==="ACTIVE"||e.isActive?e.weight:0),0));async function G(){if(g.value)try{const l=await O.get(`/admin/campaigns/${g.value}`);m.value=l.data}catch{}}const N=h(!1);async function ye(){var l,e;if(g.value){if(V.value.length<1){_.warning("برای فعال‌سازی کمپین، حداقل یک جایزه فعال تعریف کنید.");return}N.value=!0;try{await O.patch(`/admin/campaigns/${g.value}`,{status:"ACTIVE"}),_.success("کمپین با موفقیت فعال و منتشر شد! هم‌اکنون برای کاربران در دسترس است."),await G()}catch(d){const r=((e=(l=d.response)==null?void 0:l.data)==null?void 0:e.message)||d.message||"خطا در فعال‌سازی کمپین.";_.error(Array.isArray(r)?r.join(" | "):r)}finally{N.value=!1}}}async function ve(){var l,e;if(g.value){N.value=!0;try{await O.patch(`/admin/campaigns/${g.value}`,{status:"PAUSED"}),_.info("کمپین متوقف شد."),await G()}catch(d){const r=((e=(l=d.response)==null?void 0:l.data)==null?void 0:e.message)||d.message||"خطا در توقف کمپین.";_.error(Array.isArray(r)?r.join(" | "):r)}finally{N.value=!1}}}async function H(){var l;if(g.value){B.value=!0;try{const e=await O.get(`/admin/campaigns/${g.value}/prizes`);V.value=Array.isArray(e.data)?e.data:((l=e.data)==null?void 0:l.data)||[]}finally{B.value=!1}}}function K(){L.value=null,a.title="",a.description="",a.type="DISCOUNT_CODE",a.stockType="LIMITED",a.initialStock=100,a.remainingStock=100,a.weight=10,a.segmentColor="#3880ff",a.image="",a.sortOrder=V.value.length+1,a.status="ACTIVE",a.smsTemplate="",F.value=!0}function ke(l){L.value=l.id;const e=l.type||l.prizeType||"DISCOUNT_CODE";a.title=l.title,a.description=l.description||l.subtitle||"",a.type=e,a.stockType=l.stockType||(e==="NO_PRIZE"?"UNLIMITED":"LIMITED"),a.initialStock=l.initialStock??100,a.remainingStock=l.remainingStock??l.initialStock??100,a.weight=l.weight??10,a.segmentColor=l.segmentColor||l.color||"#3880ff",a.image=l.image||l.iconUrl||"",a.sortOrder=l.sortOrder??1,a.status=l.status||(l.isActive===!1?"INACTIVE":"ACTIVE"),a.smsTemplate=l.smsTemplate||"",F.value=!0}function _e(l){k.prizeId=l.id,k.prizeTitle=l.title,k.currentStock=l.remainingStock,k.change=0,k.reason="",Z.value=!0}async function Te(){var l,e,d,r;if(!a.title||!a.title.trim()){_.error("عنوان جایزه الزامی است.");return}M.value=!0;try{a.type==="NO_PRIZE"&&(a.stockType="UNLIMITED");const y=$(a.weight,1),T=$(a.initialStock,1),j=$(a.remainingStock,T),Y=$(a.sortOrder,1),D={title:a.title.trim(),description:((l=a.description)==null?void 0:l.trim())||void 0,type:a.type,stockType:a.stockType,weight:y>0?y:1,segmentColor:a.segmentColor||"#3880ff",image:a.image||void 0,sortOrder:Y>0?Y:1,status:a.status,smsTemplate:((e=a.smsTemplate)==null?void 0:e.trim())||void 0};a.stockType==="LIMITED"&&(D.initialStock=T,D.remainingStock=j),L.value?(await O.patch(`/admin/prizes/${L.value}`,D),_.success("جایزه با موفقیت به‌روزرسانی شد.")):(await O.post(`/admin/campaigns/${g.value}/prizes`,D),_.success("جایزه با موفقیت ایجاد شد.")),F.value=!1,H()}catch(y){const T=((r=(d=y.response)==null?void 0:d.data)==null?void 0:r.message)||y.message||"خطا در ثبت جایزه.";_.error(Array.isArray(T)?T.join(" | "):T)}finally{M.value=!1}}async function be(){const l=$(k.change,0);if(l===0){_.warning("میزان تغییر باید غیر صفر باشد.");return}M.value=!0;try{await O.patch(`/admin/prizes/${k.prizeId}/stock`,{change:l,reason:k.reason||void 0}),_.success("موجودی جایزه با موفقیت تغییر یافت."),Z.value=!1,H()}finally{M.value=!1}}async function xe(l){try{await O.delete(`/admin/prizes/${l}`),_.success("جایزه با موفقیت حذف شد."),H()}catch{}}function Ie(l){Be.confirm({title:"حذف جایزه",content:`آیا از حذف جایزه «${l.title}» اطمینان دارید؟ (در صورت ثبت چرخش روی این جایزه، امکان حذف وجود ندارد)`,okText:"بله، حذف کن",okType:"danger",cancelText:"انصراف",onOk:()=>xe(l.id)})}async function we({file:l,onSuccess:e,onError:d}){const r=new FormData;r.append("file",l);try{const y=await O.post("/admin/uploads",r,{headers:{"Content-Type":"multipart/form-data"}});a.image=y.data.url,e(y.data),_.success("تصویر با موفقیت بارگذاری شد.")}catch(y){d(y),_.error("خطا در بارگذاری تصویر")}}const Ce=[{title:"ترتیب",dataIndex:"sortOrder",key:"sortOrder",width:70,align:"center"},{title:"رنگ",key:"color",width:70,align:"center"},{title:"عنوان جایزه",dataIndex:"title",key:"title"},{title:"نوع جایزه",key:"type",width:140},{title:"نوع موجودی",dataIndex:"stockType",key:"stockType"},{title:"موجودی اولیه",dataIndex:"initialStock",key:"initialStock"},{title:"موجودی مانده",key:"remainingStock"},{title:"وزن / شانس",key:"weight"},{title:"وضعیت",key:"status",width:90},{title:"عملیات",key:"actions",width:70,align:"center"}];function ee(l){switch(l){case"PHYSICAL":return{text:"کالای فیزیکی",color:"blue"};case"DISCOUNT_CODE":return{text:"کد تخفیف",color:"green"};case"CREDIT":case"WALLET_CREDIT":return{text:"شارژ کیف پول",color:"purple"};case"CASH":return{text:"جایزه نقدی",color:"gold"};case"NO_PRIZE":return{text:"پوچ / بدون جایزه",color:"error"};case"OTHER":case"CHANCE":return{text:"شانس مجدد / سایر",color:"orange"};default:return{text:l||"—",color:"default"}}}return Le(()=>{G(),H()}),(l,e)=>{var le,oe,ie,se;const d=p("a-tag"),r=p("a-button"),y=p("a-space"),T=p("a-page-header"),j=p("a-alert"),Y=p("a-empty"),D=p("a-menu-item"),Se=p("a-menu-divider"),Ee=p("a-menu"),he=p("a-dropdown"),Oe=p("a-table"),De=p("a-card"),P=p("a-input"),b=p("a-form-item"),E=p("a-col"),W=p("a-input-number"),X=p("a-row"),A=p("a-select-option"),te=p("a-select"),Ae=p("a-upload"),ze=p("a-switch"),ae=p("a-form"),ne=p("a-modal");return s(),w("div",null,[t(T,{style:{background:"#fff","margin-bottom":"20px","border-radius":"12px",border:"1px solid #f1f5f9","box-shadow":"0 1px 3px rgba(0, 0, 0, 0.04)"},title:`مدیریت جوایز کمپین: ${((le=m.value)==null?void 0:le.title)||"در حال بارگذاری..."}`,"sub-title":`طرح گردونه: ${((oe=m.value)==null?void 0:oe.wheelDesign)||"-"}`,onBack:e[0]||(e[0]=o=>c(I).push("/campaigns"))},{tags:n(()=>{var o,i,z;return[((o=m.value)==null?void 0:o.status)==="DRAFT"?(s(),v(d,{key:0,color:"orange"},{default:n(()=>[...e[18]||(e[18]=[u("پیش‌نویس (DRAFT)",-1)])]),_:1})):((i=m.value)==null?void 0:i.status)==="ACTIVE"?(s(),v(d,{key:1,color:"green"},{default:n(()=>[...e[19]||(e[19]=[u("فعال و در دسترس (ACTIVE)",-1)])]),_:1})):((z=m.value)==null?void 0:z.status)==="PAUSED"?(s(),v(d,{key:2,color:"red"},{default:n(()=>[...e[20]||(e[20]=[u("متوقف (PAUSED)",-1)])]),_:1})):(s(),v(d,{key:3},{default:n(()=>{var re;return[u(C((re=m.value)==null?void 0:re.status),1)]}),_:1}))]}),extra:n(()=>[t(y,null,{default:n(()=>{var o,i,z;return[(o=m.value)!=null&&o.slug?(s(),v(r,{key:0,href:"http://localhost:5174/c/"+m.value.slug,target:"_blank"},{icon:n(()=>[t(c(Pe))]),default:n(()=>[e[21]||(e[21]=u(" مشاهده گردونه کاربر ↗ ",-1))]),_:1},8,["href"])):U("",!0),((i=m.value)==null?void 0:i.status)==="DRAFT"?(s(),v(r,{key:1,type:"primary",style:{background:"#52c41a","border-color":"#52c41a"},loading:N.value,onClick:ye},{icon:n(()=>[t(c(Re))]),default:n(()=>[e[22]||(e[22]=u(" 🚀 فعال‌سازی و انتشار کمپین ",-1))]),_:1},8,["loading"])):((z=m.value)==null?void 0:z.status)==="ACTIVE"?(s(),v(r,{key:2,danger:"",loading:N.value,onClick:ve},{icon:n(()=>[t(c(Ye))]),default:n(()=>[e[23]||(e[23]=u(" توقف موقت کمپین ",-1))]),_:1},8,["loading"])):U("",!0),t(r,{onClick:H},{icon:n(()=>[t(c($e))]),default:n(()=>[e[24]||(e[24]=u(" به‌روزرسانی ",-1))]),_:1}),t(r,{type:"primary",onClick:K},{icon:n(()=>[t(c(Fe))]),default:n(()=>[e[25]||(e[25]=u(" افزودن جایزه جدید ",-1))]),_:1})]}),_:1})]),_:1},8,["title","sub-title"]),((ie=m.value)==null?void 0:ie.status)==="DRAFT"?(s(),v(j,{key:0,message:"کمپین در وضعیت پیش‌نویس (DRAFT) قرار دارد",description:"جوایز خود را در جدول زیر تعریف یا ویرایش کنید. پس از پایان تنظیمات جوایز، برای فعال‌سازی و در دسترس قرار گرفتن گردونه برای کاربران، بر روی دکمه سبز رنگ «🚀 فعال‌سازی و انتشار کمپین» در بالا کلیک نمایید.",type:"warning","show-icon":"",style:{"margin-bottom":"20px"}})):((se=m.value)==null?void 0:se.status)==="ACTIVE"?(s(),v(j,{key:1,message:"این کمپین فعال و منتشر شده است",description:"کاربران می‌توانند با مراجعه به صفحه گردونه، شانس خود را امتحان کنند.",type:"success","show-icon":"",style:{"margin-bottom":"20px"}})):U("",!0),t(De,{bordered:!1},{default:n(()=>[V.value.length===0&&!B.value?(s(),w("div",Ke,[t(Y,{description:"هنوز جایزه‌ای برای این کمپین تعریف نشده است."},{default:n(()=>[t(r,{type:"primary",onClick:K},{default:n(()=>[...e[26]||(e[26]=[u("ایجاد اولین جایزه",-1)])]),_:1})]),_:1})])):(s(),v(Oe,{key:1,dataSource:V.value,columns:Ce,loading:B.value,rowKey:"id",pagination:!1},{bodyCell:n(({column:o,record:i})=>[o.key==="color"?(s(),w("div",{key:0,style:ue({backgroundColor:i.segmentColor||i.color||"#ddd",color:"#fff",width:"40px",height:"24px",borderRadius:"4px",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:"bold",border:"1px solid rgba(0,0,0,0.1)",textShadow:"0 1px 2px rgba(0,0,0,0.6)"})},C(c(R)(i.sortOrder)),5)):o.key==="type"?(s(),v(d,{key:1,color:ee(i.type||i.prizeType).color},{default:n(()=>[u(C(ee(i.type||i.prizeType).text),1)]),_:2},1032,["color"])):o.key==="stockType"?(s(),v(d,{key:2,color:i.stockType==="LIMITED"?"cyan":"blue"},{default:n(()=>[u(C(i.stockType==="LIMITED"?"محدود":"نامحدود"),1)]),_:2},1032,["color"])):o.key==="initialStock"?(s(),w("span",et,C(c(R)(i.initialStock)),1)):o.key==="remainingStock"?(s(),w(pe,{key:4},[i.stockType==="UNLIMITED"?(s(),w("span",tt,"∞")):(s(),w("span",{key:1,style:ue({color:i.remainingStock===0?"red":i.remainingStock<10?"orange":"inherit",fontWeight:i.remainingStock<10?700:"normal"})},C(c(R)(i.remainingStock)),5))],64)):o.key==="weight"?(s(),w("span",at,[u(C(c(R)(i.weight))+" ",1),Q.value>0?(s(),w("span",nt," ("+C(c(R)((i.weight/Q.value*100).toFixed(1)))+"٪) ",1)):U("",!0)])):o.key==="status"?(s(),v(d,{key:6,color:i.status==="ACTIVE"||i.isActive?"green":"default"},{default:n(()=>[u(C(i.status==="ACTIVE"||i.isActive?"فعال":"غیرفعال"),1)]),_:2},1032,["color"])):o.key==="actions"?(s(),v(he,{key:7,trigger:["click"],placement:"bottomLeft"},{overlay:n(()=>[t(Ee,{class:"action-dropdown-menu"},{default:n(()=>[t(D,{key:"edit",onClick:z=>ke(i)},{default:n(()=>[f("div",lt,[t(c(He),{class:"dropdown-item-icon"}),e[27]||(e[27]=f("span",null,"ویرایش جایزه",-1))])]),_:1},8,["onClick"]),i.stockType==="LIMITED"?(s(),v(D,{key:"stock",onClick:z=>_e(i)},{default:n(()=>[f("div",ot,[t(c(J),{class:"dropdown-item-icon"}),e[28]||(e[28]=f("span",null,"تنظیم سریع موجودی",-1))])]),_:1},8,["onClick"])):U("",!0),t(Se),t(D,{key:"delete",onClick:z=>Ie(i)},{default:n(()=>[f("div",it,[t(c(je),{class:"dropdown-item-icon"}),e[29]||(e[29]=f("span",null,"حذف جایزه",-1))])]),_:1},8,["onClick"])]),_:2},1024)]),default:n(()=>[t(r,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:n(()=>[t(c(Xe),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):U("",!0)]),_:1},8,["dataSource","loading"]))]),_:1}),t(ne,{open:F.value,"onUpdate:open":e[14]||(e[14]=o=>F.value=o),title:L.value?"ویرایش جایزه":"افزودن جایزه جدید",confirmLoading:M.value,okText:"ذخیره",cancelText:"انصراف",width:"680px",style:{top:"24px"},"body-style":{maxHeight:"calc(100vh - 160px)",overflowY:"auto",overflowX:"hidden"},onOk:Te},{default:n(()=>[t(ae,{layout:"vertical",class:"prize-modal-form"},{default:n(()=>[t(X,{gutter:16},{default:n(()=>[t(E,{span:16},{default:n(()=>[t(b,{label:"عنوان جایزه",required:""},{default:n(()=>[t(P,{value:a.title,"onUpdate:value":e[1]||(e[1]=o=>a.title=o),placeholder:"مثال: آیفون ۱۵ یا کد تخفیف ۵۰٪"},null,8,["value"])]),_:1})]),_:1}),t(E,{span:8},{default:n(()=>[t(b,{label:"ترتیب در گردونه (۱ به بعد)",required:"",tooltip:"شماره موقعیت این اسلایس روی گردونه"},{default:n(()=>[t(W,{value:a.sortOrder,"onUpdate:value":e[2]||(e[2]=o=>a.sortOrder=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1})]),_:1}),t(b,{label:"توضیحات جایزه"},{default:n(()=>[t(P,{value:a.description,"onUpdate:value":e[3]||(e[3]=o=>a.description=o),placeholder:"مثال: خریدهای بالای ۵۰۰ هزار تومان یا تحویل حضوری"},null,8,["value"])]),_:1}),t(X,{gutter:16},{default:n(()=>[t(E,{span:12},{default:n(()=>[t(b,{label:"نوع جایزه",required:""},{default:n(()=>[t(te,{value:a.type,"onUpdate:value":e[4]||(e[4]=o=>a.type=o),onChange:ge},{default:n(()=>[t(A,{value:"DISCOUNT_CODE"},{default:n(()=>[...e[30]||(e[30]=[u("کد تخفیف",-1)])]),_:1}),t(A,{value:"PHYSICAL"},{default:n(()=>[...e[31]||(e[31]=[u("کالای فیزیکی",-1)])]),_:1}),t(A,{value:"CREDIT"},{default:n(()=>[...e[32]||(e[32]=[u("شارژ کیف پول (اعتبار)",-1)])]),_:1}),t(A,{value:"CASH"},{default:n(()=>[...e[33]||(e[33]=[u("جایزه نقدی",-1)])]),_:1}),t(A,{value:"NO_PRIZE"},{default:n(()=>[...e[34]||(e[34]=[u("پوچ (بدون جایزه)",-1)])]),_:1}),t(A,{value:"OTHER"},{default:n(()=>[...e[35]||(e[35]=[u("سایر / شانس مجدد",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1}),t(E,{span:12},{default:n(()=>[t(b,{label:"وزن شانس (ضریب احتمالات)",required:"",tooltip:"هرچه وزن نسبت به سایر جوایز بالاتر باشد احتمال اصابت بیشتر خواهد بود"},{default:n(()=>[t(W,{value:a.weight,"onUpdate:value":e[5]||(e[5]=o=>a.weight=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"]),f("div",st,[e[36]||(e[36]=f("span",{style:{color:"#64748b"}},"تخمین احتمال اصابت:",-1)),t(d,{color:"processing",style:{"font-weight":"600",margin:"0"}},{default:n(()=>[u(C(fe.value)+"٪ از کل شانس‌ها ",1)]),_:1})])]),_:1})]),_:1})]),_:1}),f("div",rt,[e[39]||(e[39]=f("div",{style:{"font-weight":"600","font-size":"13px",color:"#334155","margin-bottom":"10px"}}," 📦 تنظیمات موجودی و انبار ",-1)),t(X,{gutter:16},{default:n(()=>[t(E,{span:a.stockType==="LIMITED"?8:24},{default:n(()=>[t(b,{label:"نوع موجودی",required:"",style:{"margin-bottom":"0"}},{default:n(()=>[t(te,{value:a.stockType,"onUpdate:value":e[6]||(e[6]=o=>a.stockType=o),disabled:a.type==="NO_PRIZE"},{default:n(()=>[t(A,{value:"LIMITED"},{default:n(()=>[...e[37]||(e[37]=[u("محدود (شمارش‌دار)",-1)])]),_:1}),t(A,{value:"UNLIMITED"},{default:n(()=>[...e[38]||(e[38]=[u("نامحدود",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1})]),_:1},8,["span"]),a.stockType==="LIMITED"?(s(),w(pe,{key:0},[t(E,{span:8},{default:n(()=>[t(b,{label:"موجودی اولیه",style:{"margin-bottom":"0"}},{default:n(()=>[t(W,{value:a.initialStock,"onUpdate:value":e[7]||(e[7]=o=>a.initialStock=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1}),t(E,{span:8},{default:n(()=>[t(b,{label:"موجودی باقی‌مانده",tooltip:"موجودی قابل استفاده فعلی در انبار",style:{"margin-bottom":"0"}},{default:n(()=>[t(W,{value:a.remainingStock,"onUpdate:value":e[8]||(e[8]=o=>a.remainingStock=o),min:0,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1})],64)):U("",!0)]),_:1})]),t(X,{gutter:16},{default:n(()=>[t(E,{span:12},{default:n(()=>[t(b,{label:"رنگ پس‌زمینه اسلایس (Hex)",required:""},{default:n(()=>[f("div",ut,[We(f("input",{"onUpdate:modelValue":e[9]||(e[9]=o=>a.segmentColor=o),type:"color",style:{width:"40px",height:"32px",border:"none",cursor:"pointer","border-radius":"4px"}},null,512),[[qe,a.segmentColor]]),t(P,{value:a.segmentColor,"onUpdate:value":e[10]||(e[10]=o=>a.segmentColor=o),placeholder:"#3880ff",style:{flex:"1"}},null,8,["value"])])]),_:1})]),_:1}),t(E,{span:12},{default:n(()=>[t(b,{label:"قالب پیامک برنده (اختیاری)",tooltip:"متغیرها: {prize} و {code}"},{default:n(()=>[t(P,{value:a.smsTemplate,"onUpdate:value":e[11]||(e[11]=o=>a.smsTemplate=o),placeholder:"تبریک! برنده {prize} شدید. کد: {code}"},null,8,["value"])]),_:1})]),_:1})]),_:1}),t(b,{label:"آیکون یا تصویر جایزه"},{default:n(()=>[f("div",pt,[t(Ae,{customRequest:we,showUploadList:!1,accept:"image/*"},{default:n(()=>[t(r,null,{icon:n(()=>[t(c(Ge))]),default:n(()=>[e[40]||(e[40]=u(" بارگذاری تصویر ",-1))]),_:1})]),_:1}),t(P,{value:a.image,"onUpdate:value":e[12]||(e[12]=o=>a.image=o),placeholder:"آدرس تصویر (URL)",style:{flex:"1"}},null,8,["value"])]),a.image?(s(),w("div",dt,[f("img",{src:a.image,alt:"icon preview",style:{"max-height":"48px","border-radius":"4px"}},null,8,ct)])):U("",!0)]),_:1}),f("div",mt,[e[41]||(e[41]=f("span",{style:{"font-size":"14px","font-weight":"500",color:"#1e293b"}},"وضعیت:",-1)),t(ze,{checked:a.status==="ACTIVE","checked-children":"فعال","un-checked-children":"غیرفعال",onChange:e[13]||(e[13]=o=>a.status=o?"ACTIVE":"INACTIVE")},null,8,["checked"])])]),_:1})]),_:1},8,["open","title","confirmLoading"]),t(ne,{open:Z.value,"onUpdate:open":e[17]||(e[17]=o=>Z.value=o),title:"تنظیم سریع موجودی جایزه",confirmLoading:M.value,okText:"اعمال تغییرات",cancelText:"انصراف",onOk:be},{default:n(()=>[t(ae,{layout:"vertical"},{default:n(()=>[t(j,{message:`جایزه: ${k.prizeTitle}`,description:`موجودی فعلی باقی‌مانده: ${k.currentStock} عدد`,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),t(b,{label:"تغییر موجودی (+ برای افزایش، - برای کاهش)",required:"",tooltip:"مثال: برای اضافه کردن ۵۰ عدد مقدار 50+ و برای کاهش مقدار 20- وارد کنید"},{default:n(()=>[t(W,{value:k.change,"onUpdate:value":e[15]||(e[15]=o=>k.change=o),parser:o=>c(q)(o).replace(/[^0-9.-]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1}),t(b,{label:"دلیل تغییر (جهت ثبت در لاگ بازرسی)"},{default:n(()=>[t(P,{value:k.reason,"onUpdate:value":e[16]||(e[16]=o=>k.reason=o),placeholder:"مثال: ورود محموله جدید به انبار"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])])}}}),Tt=Ze(ft,[["__scopeId","data-v-b0ebd2d6"]]);export{Tt as default}; +import{c as t,I as Ue,d as Ve,h,j as Le,a as w,w as n,e as c,s as v,q as U,N as Me,i as Ne,m as O,r as p,o as s,f as u,G as Pe,z as Re,R as $e,B as Fe,t as C,D as ue,F as pe,b as f,E as He,V as je,p as We,W as qe,g as de,X as ce,M as Be,y as _,_ as Ze}from"./index-iu4REYcj.js";import{t as R,a as q,p as $}from"./farsi-number-stB7JMN0.js";import{P as Ye}from"./PauseCircleOutlined-MyjHwEZJ.js";import{M as Xe}from"./MoreOutlined-B9LhmUnJ.js";import{U as Ge}from"./UploadOutlined-C2J5ghkD.js";var Je={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M885.2 446.3l-.2-.8-112.2-285.1c-5-16.1-19.9-27.2-36.8-27.2H281.2c-17 0-32.1 11.3-36.9 27.6L139.4 443l-.3.7-.2.8c-1.3 4.9-1.7 9.9-1 14.8-.1 1.6-.2 3.2-.2 4.8V830a60.9 60.9 0 0060.8 60.8h627.2c33.5 0 60.8-27.3 60.9-60.8V464.1c0-1.3 0-2.6-.1-3.7.4-4.9 0-9.6-1.3-14.1zm-295.8-43l-.3 15.7c-.8 44.9-31.8 75.1-77.1 75.1-22.1 0-41.1-7.1-54.8-20.6S436 441.2 435.6 419l-.3-15.7H229.5L309 210h399.2l81.7 193.3H589.4zm-375 76.8h157.3c24.3 57.1 76 90.8 140.4 90.8 33.7 0 65-9.4 90.3-27.2 22.2-15.6 39.5-37.4 50.7-63.6h156.5V814H214.4V480.1z"}}]},name:"inbox",theme:"outlined"};function me(S){for(var x=1;x{const l=$(a.weight,1),d=V.value.reduce((y,T)=>L.value&&T.id===L.value?y:y+((T.status==="ACTIVE"||T.isActive)&&T.weight||0),0)+l;if(d<=0)return"۰";const r=(l/d*100).toFixed(1);return R(r)});function ge(l){l==="NO_PRIZE"&&(a.stockType="UNLIMITED",(!a.title||a.title.trim()==="")&&(a.title="پوچ (دفعه بعد)"))}const k=de({prizeId:"",prizeTitle:"",currentStock:0,change:0,reason:""}),Q=ce(()=>V.value.reduce((l,e)=>l+(e.status==="ACTIVE"||e.isActive?e.weight:0),0));async function G(){if(g.value)try{const l=await O.get(`/admin/campaigns/${g.value}`);m.value=l.data}catch{}}const N=h(!1);async function ye(){var l,e;if(g.value){if(V.value.length<1){_.warning("برای فعال‌سازی کمپین، حداقل یک جایزه فعال تعریف کنید.");return}N.value=!0;try{await O.patch(`/admin/campaigns/${g.value}`,{status:"ACTIVE"}),_.success("کمپین با موفقیت فعال و منتشر شد! هم‌اکنون برای کاربران در دسترس است."),await G()}catch(d){const r=((e=(l=d.response)==null?void 0:l.data)==null?void 0:e.message)||d.message||"خطا در فعال‌سازی کمپین.";_.error(Array.isArray(r)?r.join(" | "):r)}finally{N.value=!1}}}async function ve(){var l,e;if(g.value){N.value=!0;try{await O.patch(`/admin/campaigns/${g.value}`,{status:"PAUSED"}),_.info("کمپین متوقف شد."),await G()}catch(d){const r=((e=(l=d.response)==null?void 0:l.data)==null?void 0:e.message)||d.message||"خطا در توقف کمپین.";_.error(Array.isArray(r)?r.join(" | "):r)}finally{N.value=!1}}}async function H(){var l;if(g.value){B.value=!0;try{const e=await O.get(`/admin/campaigns/${g.value}/prizes`);V.value=Array.isArray(e.data)?e.data:((l=e.data)==null?void 0:l.data)||[]}finally{B.value=!1}}}function K(){L.value=null,a.title="",a.description="",a.type="DISCOUNT_CODE",a.stockType="LIMITED",a.initialStock=100,a.remainingStock=100,a.weight=10,a.segmentColor="#3880ff",a.image="",a.sortOrder=V.value.length+1,a.status="ACTIVE",a.smsTemplate="",F.value=!0}function ke(l){L.value=l.id;const e=l.type||l.prizeType||"DISCOUNT_CODE";a.title=l.title,a.description=l.description||l.subtitle||"",a.type=e,a.stockType=l.stockType||(e==="NO_PRIZE"?"UNLIMITED":"LIMITED"),a.initialStock=l.initialStock??100,a.remainingStock=l.remainingStock??l.initialStock??100,a.weight=l.weight??10,a.segmentColor=l.segmentColor||l.color||"#3880ff",a.image=l.image||l.iconUrl||"",a.sortOrder=l.sortOrder??1,a.status=l.status||(l.isActive===!1?"INACTIVE":"ACTIVE"),a.smsTemplate=l.smsTemplate||"",F.value=!0}function _e(l){k.prizeId=l.id,k.prizeTitle=l.title,k.currentStock=l.remainingStock,k.change=0,k.reason="",Z.value=!0}async function Te(){var l,e,d,r;if(!a.title||!a.title.trim()){_.error("عنوان جایزه الزامی است.");return}M.value=!0;try{a.type==="NO_PRIZE"&&(a.stockType="UNLIMITED");const y=$(a.weight,1),T=$(a.initialStock,1),j=$(a.remainingStock,T),Y=$(a.sortOrder,1),D={title:a.title.trim(),description:((l=a.description)==null?void 0:l.trim())||void 0,type:a.type,stockType:a.stockType,weight:y>0?y:1,segmentColor:a.segmentColor||"#3880ff",image:a.image||void 0,sortOrder:Y>0?Y:1,status:a.status,smsTemplate:((e=a.smsTemplate)==null?void 0:e.trim())||void 0};a.stockType==="LIMITED"&&(D.initialStock=T,D.remainingStock=j),L.value?(await O.patch(`/admin/prizes/${L.value}`,D),_.success("جایزه با موفقیت به‌روزرسانی شد.")):(await O.post(`/admin/campaigns/${g.value}/prizes`,D),_.success("جایزه با موفقیت ایجاد شد.")),F.value=!1,H()}catch(y){const T=((r=(d=y.response)==null?void 0:d.data)==null?void 0:r.message)||y.message||"خطا در ثبت جایزه.";_.error(Array.isArray(T)?T.join(" | "):T)}finally{M.value=!1}}async function be(){const l=$(k.change,0);if(l===0){_.warning("میزان تغییر باید غیر صفر باشد.");return}M.value=!0;try{await O.patch(`/admin/prizes/${k.prizeId}/stock`,{change:l,reason:k.reason||void 0}),_.success("موجودی جایزه با موفقیت تغییر یافت."),Z.value=!1,H()}finally{M.value=!1}}async function xe(l){try{await O.delete(`/admin/prizes/${l}`),_.success("جایزه با موفقیت حذف شد."),H()}catch{}}function Ie(l){Be.confirm({title:"حذف جایزه",content:`آیا از حذف جایزه «${l.title}» اطمینان دارید؟ (در صورت ثبت چرخش روی این جایزه، امکان حذف وجود ندارد)`,okText:"بله، حذف کن",okType:"danger",cancelText:"انصراف",onOk:()=>xe(l.id)})}async function we({file:l,onSuccess:e,onError:d}){const r=new FormData;r.append("file",l);try{const y=await O.post("/admin/uploads",r,{headers:{"Content-Type":"multipart/form-data"}});a.image=y.data.url,e(y.data),_.success("تصویر با موفقیت بارگذاری شد.")}catch(y){d(y),_.error("خطا در بارگذاری تصویر")}}const Ce=[{title:"ترتیب",dataIndex:"sortOrder",key:"sortOrder",width:70,align:"center"},{title:"رنگ",key:"color",width:70,align:"center"},{title:"عنوان جایزه",dataIndex:"title",key:"title"},{title:"نوع جایزه",key:"type",width:140},{title:"نوع موجودی",dataIndex:"stockType",key:"stockType"},{title:"موجودی اولیه",dataIndex:"initialStock",key:"initialStock"},{title:"موجودی مانده",key:"remainingStock"},{title:"وزن / شانس",key:"weight"},{title:"وضعیت",key:"status",width:90},{title:"عملیات",key:"actions",width:70,align:"center"}];function ee(l){switch(l){case"PHYSICAL":return{text:"کالای فیزیکی",color:"blue"};case"DISCOUNT_CODE":return{text:"کد تخفیف",color:"green"};case"CREDIT":case"WALLET_CREDIT":return{text:"شارژ کیف پول",color:"purple"};case"CASH":return{text:"جایزه نقدی",color:"gold"};case"NO_PRIZE":return{text:"پوچ / بدون جایزه",color:"error"};case"OTHER":case"CHANCE":return{text:"شانس مجدد / سایر",color:"orange"};default:return{text:l||"—",color:"default"}}}return Le(()=>{G(),H()}),(l,e)=>{var le,oe,ie,se;const d=p("a-tag"),r=p("a-button"),y=p("a-space"),T=p("a-page-header"),j=p("a-alert"),Y=p("a-empty"),D=p("a-menu-item"),Se=p("a-menu-divider"),Ee=p("a-menu"),he=p("a-dropdown"),Oe=p("a-table"),De=p("a-card"),P=p("a-input"),b=p("a-form-item"),E=p("a-col"),W=p("a-input-number"),X=p("a-row"),A=p("a-select-option"),te=p("a-select"),Ae=p("a-upload"),ze=p("a-switch"),ae=p("a-form"),ne=p("a-modal");return s(),w("div",null,[t(T,{style:{background:"#fff","margin-bottom":"20px","border-radius":"12px",border:"1px solid #f1f5f9","box-shadow":"0 1px 3px rgba(0, 0, 0, 0.04)"},title:`مدیریت جوایز کمپین: ${((le=m.value)==null?void 0:le.title)||"در حال بارگذاری..."}`,"sub-title":`طرح گردونه: ${((oe=m.value)==null?void 0:oe.wheelDesign)||"-"}`,onBack:e[0]||(e[0]=o=>c(I).push("/campaigns"))},{tags:n(()=>{var o,i,z;return[((o=m.value)==null?void 0:o.status)==="DRAFT"?(s(),v(d,{key:0,color:"orange"},{default:n(()=>[...e[18]||(e[18]=[u("پیش‌نویس (DRAFT)",-1)])]),_:1})):((i=m.value)==null?void 0:i.status)==="ACTIVE"?(s(),v(d,{key:1,color:"green"},{default:n(()=>[...e[19]||(e[19]=[u("فعال و در دسترس (ACTIVE)",-1)])]),_:1})):((z=m.value)==null?void 0:z.status)==="PAUSED"?(s(),v(d,{key:2,color:"red"},{default:n(()=>[...e[20]||(e[20]=[u("متوقف (PAUSED)",-1)])]),_:1})):(s(),v(d,{key:3},{default:n(()=>{var re;return[u(C((re=m.value)==null?void 0:re.status),1)]}),_:1}))]}),extra:n(()=>[t(y,null,{default:n(()=>{var o,i,z;return[(o=m.value)!=null&&o.slug?(s(),v(r,{key:0,href:"http://localhost:5174/c/"+m.value.slug,target:"_blank"},{icon:n(()=>[t(c(Pe))]),default:n(()=>[e[21]||(e[21]=u(" مشاهده گردونه کاربر ↗ ",-1))]),_:1},8,["href"])):U("",!0),((i=m.value)==null?void 0:i.status)==="DRAFT"?(s(),v(r,{key:1,type:"primary",style:{background:"#52c41a","border-color":"#52c41a"},loading:N.value,onClick:ye},{icon:n(()=>[t(c(Re))]),default:n(()=>[e[22]||(e[22]=u(" 🚀 فعال‌سازی و انتشار کمپین ",-1))]),_:1},8,["loading"])):((z=m.value)==null?void 0:z.status)==="ACTIVE"?(s(),v(r,{key:2,danger:"",loading:N.value,onClick:ve},{icon:n(()=>[t(c(Ye))]),default:n(()=>[e[23]||(e[23]=u(" توقف موقت کمپین ",-1))]),_:1},8,["loading"])):U("",!0),t(r,{onClick:H},{icon:n(()=>[t(c($e))]),default:n(()=>[e[24]||(e[24]=u(" به‌روزرسانی ",-1))]),_:1}),t(r,{type:"primary",onClick:K},{icon:n(()=>[t(c(Fe))]),default:n(()=>[e[25]||(e[25]=u(" افزودن جایزه جدید ",-1))]),_:1})]}),_:1})]),_:1},8,["title","sub-title"]),((ie=m.value)==null?void 0:ie.status)==="DRAFT"?(s(),v(j,{key:0,message:"کمپین در وضعیت پیش‌نویس (DRAFT) قرار دارد",description:"جوایز خود را در جدول زیر تعریف یا ویرایش کنید. پس از پایان تنظیمات جوایز، برای فعال‌سازی و در دسترس قرار گرفتن گردونه برای کاربران، بر روی دکمه سبز رنگ «🚀 فعال‌سازی و انتشار کمپین» در بالا کلیک نمایید.",type:"warning","show-icon":"",style:{"margin-bottom":"20px"}})):((se=m.value)==null?void 0:se.status)==="ACTIVE"?(s(),v(j,{key:1,message:"این کمپین فعال و منتشر شده است",description:"کاربران می‌توانند با مراجعه به صفحه گردونه، شانس خود را امتحان کنند.",type:"success","show-icon":"",style:{"margin-bottom":"20px"}})):U("",!0),t(De,{bordered:!1},{default:n(()=>[V.value.length===0&&!B.value?(s(),w("div",Ke,[t(Y,{description:"هنوز جایزه‌ای برای این کمپین تعریف نشده است."},{default:n(()=>[t(r,{type:"primary",onClick:K},{default:n(()=>[...e[26]||(e[26]=[u("ایجاد اولین جایزه",-1)])]),_:1})]),_:1})])):(s(),v(Oe,{key:1,dataSource:V.value,columns:Ce,loading:B.value,rowKey:"id",pagination:!1},{bodyCell:n(({column:o,record:i})=>[o.key==="color"?(s(),w("div",{key:0,style:ue({backgroundColor:i.segmentColor||i.color||"#ddd",color:"#fff",width:"40px",height:"24px",borderRadius:"4px",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:"bold",border:"1px solid rgba(0,0,0,0.1)",textShadow:"0 1px 2px rgba(0,0,0,0.6)"})},C(c(R)(i.sortOrder)),5)):o.key==="type"?(s(),v(d,{key:1,color:ee(i.type||i.prizeType).color},{default:n(()=>[u(C(ee(i.type||i.prizeType).text),1)]),_:2},1032,["color"])):o.key==="stockType"?(s(),v(d,{key:2,color:i.stockType==="LIMITED"?"cyan":"blue"},{default:n(()=>[u(C(i.stockType==="LIMITED"?"محدود":"نامحدود"),1)]),_:2},1032,["color"])):o.key==="initialStock"?(s(),w("span",et,C(c(R)(i.initialStock)),1)):o.key==="remainingStock"?(s(),w(pe,{key:4},[i.stockType==="UNLIMITED"?(s(),w("span",tt,"∞")):(s(),w("span",{key:1,style:ue({color:i.remainingStock===0?"red":i.remainingStock<10?"orange":"inherit",fontWeight:i.remainingStock<10?700:"normal"})},C(c(R)(i.remainingStock)),5))],64)):o.key==="weight"?(s(),w("span",at,[u(C(c(R)(i.weight))+" ",1),Q.value>0?(s(),w("span",nt," ("+C(c(R)((i.weight/Q.value*100).toFixed(1)))+"٪) ",1)):U("",!0)])):o.key==="status"?(s(),v(d,{key:6,color:i.status==="ACTIVE"||i.isActive?"green":"default"},{default:n(()=>[u(C(i.status==="ACTIVE"||i.isActive?"فعال":"غیرفعال"),1)]),_:2},1032,["color"])):o.key==="actions"?(s(),v(he,{key:7,trigger:["click"],placement:"bottomLeft"},{overlay:n(()=>[t(Ee,{class:"action-dropdown-menu"},{default:n(()=>[t(D,{key:"edit",onClick:z=>ke(i)},{default:n(()=>[f("div",lt,[t(c(He),{class:"dropdown-item-icon"}),e[27]||(e[27]=f("span",null,"ویرایش جایزه",-1))])]),_:1},8,["onClick"]),i.stockType==="LIMITED"?(s(),v(D,{key:"stock",onClick:z=>_e(i)},{default:n(()=>[f("div",ot,[t(c(J),{class:"dropdown-item-icon"}),e[28]||(e[28]=f("span",null,"تنظیم سریع موجودی",-1))])]),_:1},8,["onClick"])):U("",!0),t(Se),t(D,{key:"delete",onClick:z=>Ie(i)},{default:n(()=>[f("div",it,[t(c(je),{class:"dropdown-item-icon"}),e[29]||(e[29]=f("span",null,"حذف جایزه",-1))])]),_:1},8,["onClick"])]),_:2},1024)]),default:n(()=>[t(r,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:n(()=>[t(c(Xe),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):U("",!0)]),_:1},8,["dataSource","loading"]))]),_:1}),t(ne,{open:F.value,"onUpdate:open":e[14]||(e[14]=o=>F.value=o),title:L.value?"ویرایش جایزه":"افزودن جایزه جدید",confirmLoading:M.value,okText:"ذخیره",cancelText:"انصراف",width:"680px",style:{top:"24px"},"body-style":{maxHeight:"calc(100vh - 160px)",overflowY:"auto",overflowX:"hidden"},onOk:Te},{default:n(()=>[t(ae,{layout:"vertical",class:"prize-modal-form"},{default:n(()=>[t(X,{gutter:16},{default:n(()=>[t(E,{span:16},{default:n(()=>[t(b,{label:"عنوان جایزه",required:""},{default:n(()=>[t(P,{value:a.title,"onUpdate:value":e[1]||(e[1]=o=>a.title=o),placeholder:"مثال: آیفون ۱۵ یا کد تخفیف ۵۰٪"},null,8,["value"])]),_:1})]),_:1}),t(E,{span:8},{default:n(()=>[t(b,{label:"ترتیب در گردونه (۱ به بعد)",required:"",tooltip:"شماره موقعیت این اسلایس روی گردونه"},{default:n(()=>[t(W,{value:a.sortOrder,"onUpdate:value":e[2]||(e[2]=o=>a.sortOrder=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1})]),_:1}),t(b,{label:"توضیحات جایزه"},{default:n(()=>[t(P,{value:a.description,"onUpdate:value":e[3]||(e[3]=o=>a.description=o),placeholder:"مثال: خریدهای بالای ۵۰۰ هزار تومان یا تحویل حضوری"},null,8,["value"])]),_:1}),t(X,{gutter:16},{default:n(()=>[t(E,{span:12},{default:n(()=>[t(b,{label:"نوع جایزه",required:""},{default:n(()=>[t(te,{value:a.type,"onUpdate:value":e[4]||(e[4]=o=>a.type=o),onChange:ge},{default:n(()=>[t(A,{value:"DISCOUNT_CODE"},{default:n(()=>[...e[30]||(e[30]=[u("کد تخفیف",-1)])]),_:1}),t(A,{value:"PHYSICAL"},{default:n(()=>[...e[31]||(e[31]=[u("کالای فیزیکی",-1)])]),_:1}),t(A,{value:"CREDIT"},{default:n(()=>[...e[32]||(e[32]=[u("شارژ کیف پول (اعتبار)",-1)])]),_:1}),t(A,{value:"CASH"},{default:n(()=>[...e[33]||(e[33]=[u("جایزه نقدی",-1)])]),_:1}),t(A,{value:"NO_PRIZE"},{default:n(()=>[...e[34]||(e[34]=[u("پوچ (بدون جایزه)",-1)])]),_:1}),t(A,{value:"OTHER"},{default:n(()=>[...e[35]||(e[35]=[u("سایر / شانس مجدد",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1}),t(E,{span:12},{default:n(()=>[t(b,{label:"وزن شانس (ضریب احتمالات)",required:"",tooltip:"هرچه وزن نسبت به سایر جوایز بالاتر باشد احتمال اصابت بیشتر خواهد بود"},{default:n(()=>[t(W,{value:a.weight,"onUpdate:value":e[5]||(e[5]=o=>a.weight=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"]),f("div",st,[e[36]||(e[36]=f("span",{style:{color:"#64748b"}},"تخمین احتمال اصابت:",-1)),t(d,{color:"processing",style:{"font-weight":"600",margin:"0"}},{default:n(()=>[u(C(fe.value)+"٪ از کل شانس‌ها ",1)]),_:1})])]),_:1})]),_:1})]),_:1}),f("div",rt,[e[39]||(e[39]=f("div",{style:{"font-weight":"600","font-size":"13px",color:"#334155","margin-bottom":"10px"}}," 📦 تنظیمات موجودی و انبار ",-1)),t(X,{gutter:16},{default:n(()=>[t(E,{span:a.stockType==="LIMITED"?8:24},{default:n(()=>[t(b,{label:"نوع موجودی",required:"",style:{"margin-bottom":"0"}},{default:n(()=>[t(te,{value:a.stockType,"onUpdate:value":e[6]||(e[6]=o=>a.stockType=o),disabled:a.type==="NO_PRIZE"},{default:n(()=>[t(A,{value:"LIMITED"},{default:n(()=>[...e[37]||(e[37]=[u("محدود (شمارش‌دار)",-1)])]),_:1}),t(A,{value:"UNLIMITED"},{default:n(()=>[...e[38]||(e[38]=[u("نامحدود",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1})]),_:1},8,["span"]),a.stockType==="LIMITED"?(s(),w(pe,{key:0},[t(E,{span:8},{default:n(()=>[t(b,{label:"موجودی اولیه",style:{"margin-bottom":"0"}},{default:n(()=>[t(W,{value:a.initialStock,"onUpdate:value":e[7]||(e[7]=o=>a.initialStock=o),min:1,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1}),t(E,{span:8},{default:n(()=>[t(b,{label:"موجودی باقی‌مانده",tooltip:"موجودی قابل استفاده فعلی در انبار",style:{"margin-bottom":"0"}},{default:n(()=>[t(W,{value:a.remainingStock,"onUpdate:value":e[8]||(e[8]=o=>a.remainingStock=o),min:0,parser:o=>c(q)(o).replace(/[^0-9]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1})]),_:1})],64)):U("",!0)]),_:1})]),t(X,{gutter:16},{default:n(()=>[t(E,{span:12},{default:n(()=>[t(b,{label:"رنگ پس‌زمینه اسلایس (Hex)",required:""},{default:n(()=>[f("div",ut,[We(f("input",{"onUpdate:modelValue":e[9]||(e[9]=o=>a.segmentColor=o),type:"color",style:{width:"40px",height:"32px",border:"none",cursor:"pointer","border-radius":"4px"}},null,512),[[qe,a.segmentColor]]),t(P,{value:a.segmentColor,"onUpdate:value":e[10]||(e[10]=o=>a.segmentColor=o),placeholder:"#3880ff",style:{flex:"1"}},null,8,["value"])])]),_:1})]),_:1}),t(E,{span:12},{default:n(()=>[t(b,{label:"قالب پیامک برنده (اختیاری)",tooltip:"متغیرها: {prize} و {code}"},{default:n(()=>[t(P,{value:a.smsTemplate,"onUpdate:value":e[11]||(e[11]=o=>a.smsTemplate=o),placeholder:"تبریک! برنده {prize} شدید. کد: {code}"},null,8,["value"])]),_:1})]),_:1})]),_:1}),t(b,{label:"آیکون یا تصویر جایزه"},{default:n(()=>[f("div",pt,[t(Ae,{customRequest:we,showUploadList:!1,accept:"image/*"},{default:n(()=>[t(r,null,{icon:n(()=>[t(c(Ge))]),default:n(()=>[e[40]||(e[40]=u(" بارگذاری تصویر ",-1))]),_:1})]),_:1}),t(P,{value:a.image,"onUpdate:value":e[12]||(e[12]=o=>a.image=o),placeholder:"آدرس تصویر (URL)",style:{flex:"1"}},null,8,["value"])]),a.image?(s(),w("div",dt,[f("img",{src:a.image,alt:"icon preview",style:{"max-height":"48px","border-radius":"4px"}},null,8,ct)])):U("",!0)]),_:1}),f("div",mt,[e[41]||(e[41]=f("span",{style:{"font-size":"14px","font-weight":"500",color:"#1e293b"}},"وضعیت:",-1)),t(ze,{checked:a.status==="ACTIVE","checked-children":"فعال","un-checked-children":"غیرفعال",onChange:e[13]||(e[13]=o=>a.status=o?"ACTIVE":"INACTIVE")},null,8,["checked"])])]),_:1})]),_:1},8,["open","title","confirmLoading"]),t(ne,{open:Z.value,"onUpdate:open":e[17]||(e[17]=o=>Z.value=o),title:"تنظیم سریع موجودی جایزه",confirmLoading:M.value,okText:"اعمال تغییرات",cancelText:"انصراف",onOk:be},{default:n(()=>[t(ae,{layout:"vertical"},{default:n(()=>[t(j,{message:`جایزه: ${k.prizeTitle}`,description:`موجودی فعلی باقی‌مانده: ${k.currentStock} عدد`,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),t(b,{label:"تغییر موجودی (+ برای افزایش، - برای کاهش)",required:"",tooltip:"مثال: برای اضافه کردن ۵۰ عدد مقدار 50+ و برای کاهش مقدار 20- وارد کنید"},{default:n(()=>[t(W,{value:k.change,"onUpdate:value":e[15]||(e[15]=o=>k.change=o),parser:o=>c(q)(o).replace(/[^0-9.-]/g,""),style:{width:"100%"}},null,8,["value","parser"])]),_:1}),t(b,{label:"دلیل تغییر (جهت ثبت در لاگ بازرسی)"},{default:n(()=>[t(P,{value:k.reason,"onUpdate:value":e[16]||(e[16]=o=>k.reason=o),placeholder:"مثال: ورود محموله جدید به انبار"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])])}}}),Tt=Ze(ft,[["__scopeId","data-v-b0ebd2d6"]]);export{Tt as default}; diff --git a/apps/admin/dist/assets/ReportView-CKpII8Mv.js b/apps/admin/dist/assets/ReportView-Bsg1kGeu.js similarity index 97% rename from apps/admin/dist/assets/ReportView-CKpII8Mv.js rename to apps/admin/dist/assets/ReportView-Bsg1kGeu.js index cd39526..1b05299 100644 --- a/apps/admin/dist/assets/ReportView-CKpII8Mv.js +++ b/apps/admin/dist/assets/ReportView-Bsg1kGeu.js @@ -1 +1 @@ -import{f as b}from"./farsi-number-stB7JMN0.js";import{c as e,I as N,d as D,j as E,a as I,b as s,w as o,h,m as x,r as f,g as A,o as y,f as w,e as i,R as B,Y as F,F as G,x as M,t as m,T as $,y as V,s as H,_ as Y}from"./index-Dx9ODHpC.js";import{T as O}from"./TeamOutlined-D0tX_kEo.js";import{G as Z}from"./GiftOutlined-B8oIapKF.js";var q={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-600-80h56c4.4 0 8-3.6 8-8V560c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V384c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v320c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V462c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v242c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v400c0 4.4 3.6 8 8 8z"}}]},name:"bar-chart",theme:"outlined"};function R(c){for(var n=1;n{S(),g()}),(p,t)=>{const u=f("a-button"),j=f("a-space"),z=f("a-select-option"),P=f("a-select"),_=f("a-card"),k=f("a-col"),T=f("a-row"),L=f("a-spin");return y(),I("div",Q,[s("div",W,[t[3]||(t[3]=s("div",null,[s("h1",{class:"title"},"گزارش‌ها و شاخص‌های کلیدی (KPI)"),s("p",{class:"subtitle"},"تحلیل مشارکت کاربران، شانس‌های تخصیصی، نرخ مصرف و خروجی آماری")],-1)),e(j,null,{default:o(()=>[e(u,{onClick:g,loading:n.value},{icon:o(()=>[e(i(B))]),default:o(()=>[t[1]||(t[1]=w(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),e(u,{type:"primary",loading:d.value,onClick:U},{icon:o(()=>[e(i(F))]),default:o(()=>[t[2]||(t[2]=w(" خروجی اکسل گزارش ",-1))]),_:1},8,["loading"])]),_:1})]),e(_,{bordered:!1,class:"main-card",style:{"margin-bottom":"20px"}},{default:o(()=>[s("div",X,[s("div",K,[e(P,{value:r.campaignId,"onUpdate:value":t[0]||(t[0]=a=>r.campaignId=a),placeholder:"انتخاب کمپین (اختیاری)",allowClear:"",style:{width:"260px"},onChange:g},{default:o(()=>[(y(!0),I(G,null,M(v.value,a=>(y(),H(z,{key:a.id,value:a.id},{default:o(()=>[w(m(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])])]),_:1}),e(L,{spinning:n.value},{default:o(()=>[e(T,{gutter:[16,16]},{default:o(()=>[e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",ss,[s("div",es,[e(i(O))]),s("div",as,[t[4]||(t[4]=s("span",{class:"kpi-label"},"تعداد کل کاربران ثبت‌نامی",-1)),s("span",ts,m(i(b)(((a=l.value)==null?void 0:a.totalUsers)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",os,[s("div",is,[e(i(B))]),s("div",ns,[t[5]||(t[5]=s("span",{class:"kpi-label"},"تعداد کل چرخش‌ها (Spins)",-1)),s("span",ls,m(i(b)(((a=l.value)==null?void 0:a.totalSpins)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",ds,[s("div",cs,[e(i($))]),s("div",rs,[t[6]||(t[6]=s("span",{class:"kpi-label"},"تعداد کل جوایز برنده شده",-1)),s("span",ps,m(i(b)(((a=l.value)==null?void 0:a.winnersCount)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",us,[s("div",_s,[e(i(Z))]),s("div",fs,[t[7]||(t[7]=s("span",{class:"kpi-label"},"کل شانس‌های تخصیص‌یافته",-1)),s("span",ms,m(i(b)(((a=l.value)==null?void 0:a.totalChancesAllocated)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",vs,[s("div",ks,[e(i(C))]),s("div",bs,[t[8]||(t[8]=s("span",{class:"kpi-label"},"کل شانس‌های مصرف‌شده",-1)),s("span",hs,m(i(b)(((a=l.value)==null?void 0:a.totalChancesUsed)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",gs,[s("div",xs,[e(i(O))]),s("div",ys,[t[9]||(t[9]=s("span",{class:"kpi-label"},"کاربران بدون چرخش (Zero Spin)",-1)),s("span",ws,m(i(b)(((a=l.value)==null?void 0:a.zeroSpinUsers)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",Os,[s("div",Cs,[e(i(O))]),s("div",Is,[t[10]||(t[10]=s("span",{class:"kpi-label"},"کاربران دارای شانس باقی‌مانده",-1)),s("span",Bs,m(i(b)(((a=l.value)==null?void 0:a.remainingChanceUsers)||0)),1)])])]}),_:1})]),_:1})]),_:1})]),_:1},8,["spinning"])])}}}),zs=Y(Vs,[["__scopeId","data-v-ee1ef293"]]);export{zs as default}; +import{f as b}from"./farsi-number-stB7JMN0.js";import{c as e,I as N,d as D,j as E,a as I,b as s,w as o,h,m as x,r as f,g as A,o as y,f as w,e as i,R as B,Y as F,F as G,x as M,t as m,T as $,y as V,s as H,_ as Y}from"./index-iu4REYcj.js";import{T as O}from"./TeamOutlined-BXroJ-y-.js";import{G as Z}from"./GiftOutlined-Du5L-j2h.js";var q={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-600-80h56c4.4 0 8-3.6 8-8V560c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V384c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v320c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V462c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v242c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v400c0 4.4 3.6 8 8 8z"}}]},name:"bar-chart",theme:"outlined"};function R(c){for(var n=1;n{S(),g()}),(p,t)=>{const u=f("a-button"),j=f("a-space"),z=f("a-select-option"),P=f("a-select"),_=f("a-card"),k=f("a-col"),T=f("a-row"),L=f("a-spin");return y(),I("div",Q,[s("div",W,[t[3]||(t[3]=s("div",null,[s("h1",{class:"title"},"گزارش‌ها و شاخص‌های کلیدی (KPI)"),s("p",{class:"subtitle"},"تحلیل مشارکت کاربران، شانس‌های تخصیصی، نرخ مصرف و خروجی آماری")],-1)),e(j,null,{default:o(()=>[e(u,{onClick:g,loading:n.value},{icon:o(()=>[e(i(B))]),default:o(()=>[t[1]||(t[1]=w(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),e(u,{type:"primary",loading:d.value,onClick:U},{icon:o(()=>[e(i(F))]),default:o(()=>[t[2]||(t[2]=w(" خروجی اکسل گزارش ",-1))]),_:1},8,["loading"])]),_:1})]),e(_,{bordered:!1,class:"main-card",style:{"margin-bottom":"20px"}},{default:o(()=>[s("div",X,[s("div",K,[e(P,{value:r.campaignId,"onUpdate:value":t[0]||(t[0]=a=>r.campaignId=a),placeholder:"انتخاب کمپین (اختیاری)",allowClear:"",style:{width:"260px"},onChange:g},{default:o(()=>[(y(!0),I(G,null,M(v.value,a=>(y(),H(z,{key:a.id,value:a.id},{default:o(()=>[w(m(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])])]),_:1}),e(L,{spinning:n.value},{default:o(()=>[e(T,{gutter:[16,16]},{default:o(()=>[e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",ss,[s("div",es,[e(i(O))]),s("div",as,[t[4]||(t[4]=s("span",{class:"kpi-label"},"تعداد کل کاربران ثبت‌نامی",-1)),s("span",ts,m(i(b)(((a=l.value)==null?void 0:a.totalUsers)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",os,[s("div",is,[e(i(B))]),s("div",ns,[t[5]||(t[5]=s("span",{class:"kpi-label"},"تعداد کل چرخش‌ها (Spins)",-1)),s("span",ls,m(i(b)(((a=l.value)==null?void 0:a.totalSpins)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",ds,[s("div",cs,[e(i($))]),s("div",rs,[t[6]||(t[6]=s("span",{class:"kpi-label"},"تعداد کل جوایز برنده شده",-1)),s("span",ps,m(i(b)(((a=l.value)==null?void 0:a.winnersCount)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",us,[s("div",_s,[e(i(Z))]),s("div",fs,[t[7]||(t[7]=s("span",{class:"kpi-label"},"کل شانس‌های تخصیص‌یافته",-1)),s("span",ms,m(i(b)(((a=l.value)==null?void 0:a.totalChancesAllocated)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",vs,[s("div",ks,[e(i(C))]),s("div",bs,[t[8]||(t[8]=s("span",{class:"kpi-label"},"کل شانس‌های مصرف‌شده",-1)),s("span",hs,m(i(b)(((a=l.value)==null?void 0:a.totalChancesUsed)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",gs,[s("div",xs,[e(i(O))]),s("div",ys,[t[9]||(t[9]=s("span",{class:"kpi-label"},"کاربران بدون چرخش (Zero Spin)",-1)),s("span",ws,m(i(b)(((a=l.value)==null?void 0:a.zeroSpinUsers)||0)),1)])])]}),_:1})]),_:1}),e(k,{xs:24,sm:12,md:8},{default:o(()=>[e(_,{bordered:!1,class:"kpi-card"},{default:o(()=>{var a;return[s("div",Os,[s("div",Cs,[e(i(O))]),s("div",Is,[t[10]||(t[10]=s("span",{class:"kpi-label"},"کاربران دارای شانس باقی‌مانده",-1)),s("span",Bs,m(i(b)(((a=l.value)==null?void 0:a.remainingChanceUsers)||0)),1)])])]}),_:1})]),_:1})]),_:1})]),_:1},8,["spinning"])])}}}),zs=Y(Vs,[["__scopeId","data-v-ee1ef293"]]);export{zs as default}; diff --git a/apps/admin/dist/assets/SmsLogListView-Dzz9zkVI.js b/apps/admin/dist/assets/SmsLogListView-BQrgELdy.js similarity index 98% rename from apps/admin/dist/assets/SmsLogListView-Dzz9zkVI.js rename to apps/admin/dist/assets/SmsLogListView-BQrgELdy.js index 6db70b4..e577922 100644 --- a/apps/admin/dist/assets/SmsLogListView-Dzz9zkVI.js +++ b/apps/admin/dist/assets/SmsLogListView-BQrgELdy.js @@ -1 +1 @@ -import{t as C}from"./farsi-number-stB7JMN0.js";import{c as l,I as P,d as T,j as U,a as d,b as _,w as i,h as S,m as M,r as m,g as V,o,f as b,e as y,R as j,S as B,t as k,F as I,s as E,D as $,q as Q,y as q,_ as G}from"./index-Dx9ODHpC.js";var H={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 01-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 01-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 00-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z"}}]},name:"redo",theme:"outlined"};function A(c){for(var a=1;a{f()}),(g,e)=>{const v=m("a-button"),x=m("a-input-search"),u=m("a-select-option"),h=m("a-select"),z=m("a-tag"),N=m("a-tooltip"),R=m("a-table"),F=m("a-card");return o(),d("div",W,[_("div",X,[e[5]||(e[5]=_("div",null,[_("h1",{class:"title"},"لاگ‌های پیامک"),_("p",{class:"subtitle"},"تاریخچه ارسال پیامک‌های رمز یکبار مصرف (OTP) و اطلاع‌رسانی جوایز")],-1)),l(v,{onClick:f,loading:a.value},{icon:i(()=>[l(y(j))]),default:i(()=>[e[4]||(e[4]=b(" به‌روزرسانی ",-1))]),_:1},8,["loading"])]),l(F,{bordered:!1,class:"main-card"},{default:i(()=>[_("div",Y,[_("div",Z,[l(x,{value:t.mobile,"onUpdate:value":e[0]||(e[0]=s=>t.mobile=s),placeholder:"جستجوی شماره همراه...",style:{width:"240px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{t.page=1,f()})},{prefix:i(()=>[l(y(B),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),l(h,{value:t.status,"onUpdate:value":e[2]||(e[2]=s=>t.status=s),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"150px"},onChange:e[3]||(e[3]=()=>{t.page=1,f()})},{default:i(()=>[l(u,{value:"SENT"},{default:i(()=>[...e[6]||(e[6]=[b("ارسال شد",-1)])]),_:1}),l(u,{value:"QUEUED"},{default:i(()=>[...e[7]||(e[7]=[b("در صف ارسال",-1)])]),_:1}),l(u,{value:"FAILED"},{default:i(()=>[...e[8]||(e[8]=[b("خطا در ارسال",-1)])]),_:1})]),_:1},8,["value"])])]),l(R,{dataSource:n.value,columns:L,loading:a.value,rowKey:"id",size:"middle",pagination:{current:t.page,pageSize:t.pageSize,total:p.value,showTotal:s=>`مجموع: ${y(C)(s)} پیامک`,onChange:s=>{t.page=s,f()}}},{bodyCell:i(({column:s,record:r})=>[s.key==="mobile"?(o(),d("span",K,k(y(C)(r.mobile)),1)):s.key==="providerMessageId"?(o(),d(I,{key:1},[r.providerMessageId?(o(),d("code",ee,k(r.providerMessageId),1)):(o(),d("span",te,"—"))],64)):s.key==="status"?(o(),E(z,{key:2,color:w(r.status).color,class:"status-tag"},{default:i(()=>[_("span",{class:"status-dot",style:$({backgroundColor:w(r.status).dotColor})},null,4),b(" "+k(w(r.status).text),1)]),_:2},1032,["color"])):s.key==="errorMessage"?(o(),d(I,{key:3},[r.errorMessage?(o(),d("span",ae,k(r.errorMessage),1)):(o(),d("span",se,"—"))],64)):s.key==="createdAt"?(o(),d("span",oe,k(y(C)(new Date(r.createdAt).toLocaleString("fa-IR"))),1)):s.key==="actions"?(o(),d(I,{key:5},[r.status==="FAILED"?(o(),E(N,{key:0,title:"ارسال مجدد پیامک"},{default:i(()=>[l(v,{type:"text",shape:"circle",class:"action-more-btn",onClick:ie=>D(r.id)},{default:i(()=>[l(y(O),{style:{"font-size":"15px",color:"#4f46e5"}})]),_:1},8,["onClick"])]),_:2},1024)):(o(),d("span",le,"—"))],64)):Q("",!0)]),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),ce=G(ne,[["__scopeId","data-v-1ae7a208"]]);export{ce as default}; +import{t as C}from"./farsi-number-stB7JMN0.js";import{c as l,I as P,d as T,j as U,a as d,b as _,w as i,h as S,m as M,r as m,g as V,o,f as b,e as y,R as j,S as B,t as k,F as I,s as E,D as $,q as Q,y as q,_ as G}from"./index-iu4REYcj.js";var H={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 01-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 01-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 00-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z"}}]},name:"redo",theme:"outlined"};function A(c){for(var a=1;a{f()}),(g,e)=>{const v=m("a-button"),x=m("a-input-search"),u=m("a-select-option"),h=m("a-select"),z=m("a-tag"),N=m("a-tooltip"),R=m("a-table"),F=m("a-card");return o(),d("div",W,[_("div",X,[e[5]||(e[5]=_("div",null,[_("h1",{class:"title"},"لاگ‌های پیامک"),_("p",{class:"subtitle"},"تاریخچه ارسال پیامک‌های رمز یکبار مصرف (OTP) و اطلاع‌رسانی جوایز")],-1)),l(v,{onClick:f,loading:a.value},{icon:i(()=>[l(y(j))]),default:i(()=>[e[4]||(e[4]=b(" به‌روزرسانی ",-1))]),_:1},8,["loading"])]),l(F,{bordered:!1,class:"main-card"},{default:i(()=>[_("div",Y,[_("div",Z,[l(x,{value:t.mobile,"onUpdate:value":e[0]||(e[0]=s=>t.mobile=s),placeholder:"جستجوی شماره همراه...",style:{width:"240px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{t.page=1,f()})},{prefix:i(()=>[l(y(B),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),l(h,{value:t.status,"onUpdate:value":e[2]||(e[2]=s=>t.status=s),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"150px"},onChange:e[3]||(e[3]=()=>{t.page=1,f()})},{default:i(()=>[l(u,{value:"SENT"},{default:i(()=>[...e[6]||(e[6]=[b("ارسال شد",-1)])]),_:1}),l(u,{value:"QUEUED"},{default:i(()=>[...e[7]||(e[7]=[b("در صف ارسال",-1)])]),_:1}),l(u,{value:"FAILED"},{default:i(()=>[...e[8]||(e[8]=[b("خطا در ارسال",-1)])]),_:1})]),_:1},8,["value"])])]),l(R,{dataSource:n.value,columns:L,loading:a.value,rowKey:"id",size:"middle",pagination:{current:t.page,pageSize:t.pageSize,total:p.value,showTotal:s=>`مجموع: ${y(C)(s)} پیامک`,onChange:s=>{t.page=s,f()}}},{bodyCell:i(({column:s,record:r})=>[s.key==="mobile"?(o(),d("span",K,k(y(C)(r.mobile)),1)):s.key==="providerMessageId"?(o(),d(I,{key:1},[r.providerMessageId?(o(),d("code",ee,k(r.providerMessageId),1)):(o(),d("span",te,"—"))],64)):s.key==="status"?(o(),E(z,{key:2,color:w(r.status).color,class:"status-tag"},{default:i(()=>[_("span",{class:"status-dot",style:$({backgroundColor:w(r.status).dotColor})},null,4),b(" "+k(w(r.status).text),1)]),_:2},1032,["color"])):s.key==="errorMessage"?(o(),d(I,{key:3},[r.errorMessage?(o(),d("span",ae,k(r.errorMessage),1)):(o(),d("span",se,"—"))],64)):s.key==="createdAt"?(o(),d("span",oe,k(y(C)(new Date(r.createdAt).toLocaleString("fa-IR"))),1)):s.key==="actions"?(o(),d(I,{key:5},[r.status==="FAILED"?(o(),E(N,{key:0,title:"ارسال مجدد پیامک"},{default:i(()=>[l(v,{type:"text",shape:"circle",class:"action-more-btn",onClick:ie=>D(r.id)},{default:i(()=>[l(y(O),{style:{"font-size":"15px",color:"#4f46e5"}})]),_:1},8,["onClick"])]),_:2},1024)):(o(),d("span",le,"—"))],64)):Q("",!0)]),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),ce=G(ne,[["__scopeId","data-v-1ae7a208"]]);export{ce as default}; diff --git a/apps/admin/dist/assets/SpinListView-WIkO8yaF.js b/apps/admin/dist/assets/SpinListView-CL9S5010.js similarity index 98% rename from apps/admin/dist/assets/SpinListView-WIkO8yaF.js rename to apps/admin/dist/assets/SpinListView-CL9S5010.js index 1c08570..eb9b3a5 100644 --- a/apps/admin/dist/assets/SpinListView-WIkO8yaF.js +++ b/apps/admin/dist/assets/SpinListView-CL9S5010.js @@ -1 +1 @@ -import{t as h}from"./farsi-number-stB7JMN0.js";import{d as $,j,a as i,b as m,c as d,w as l,m as z,r as c,h as g,g as H,o as n,f as k,e as u,R as Y,Y as q,S as G,F as C,x as P,t as r,s as I,D as J,q as Q,i as X,y as O,_ as Z}from"./index-Dx9ODHpC.js";const ee={class:"spin-list-page"},ae={class:"page-header-title"},te={class:"table-header"},se={class:"filters"},ne=["onClick"],ie={key:1,class:"user-name"},le={key:0,class:"prize-text"},oe={key:1,class:"text-muted"},de={key:1,class:"text-muted"},pe={key:5,class:"code-badge"},re={key:6,class:"date-cell"},ce={key:7,class:"date-cell"},ue=$({__name:"SpinListView",setup(ye){const U=X(),v=g(!1),x=g(!1),w=g([]),S=g(0),A=g([]),t=H({page:1,pageSize:10,campaignId:void 0,search:""});async function E(){var p;try{const e=await z.get("/admin/campaigns",{params:{pageSize:100}});A.value=Array.isArray(e.data)?e.data:((p=e.data)==null?void 0:p.data)||[]}catch{}}async function _(){var p,e,o,f;v.value=!0;try{const y=await z.get("/admin/spins",{params:{page:t.page,pageSize:t.pageSize,campaignId:t.campaignId||void 0,search:t.search||void 0}}),b=Array.isArray(y.data)?y.data:((p=y.data)==null?void 0:p.data)||[];w.value=b,S.value=((e=y.meta)==null?void 0:e.total)||((f=(o=y.data)==null?void 0:o.meta)==null?void 0:f.total)||b.length}finally{v.value=!1}}async function V(){x.value=!0;try{const p=await z.get("/admin/spins/export",{params:{campaignId:t.campaignId||void 0,search:t.search||void 0},responseType:"blob"}),e=window.URL.createObjectURL(new Blob([p.data])),o=document.createElement("a");o.href=e,o.setAttribute("download",`spins-${Date.now()}.xlsx`),document.body.appendChild(o),o.click(),document.body.removeChild(o),window.URL.revokeObjectURL(e),O.success("فایل اکسل با موفقیت دانلود شد.")}catch{O.error("خطا در دریافت فایل اکسل")}finally{x.value=!1}}const W={DIGITAL_CODE:"کد دیجیتال",PHYSICAL:"کالای فیزیکی",DISCOUNT:"کد تخفیف",CASH:"جایزه نقدی",FREE_CHANCE:"شانس مجدد",CUSTOM:"سفارشی"},B=[{title:"شماره همراه",dataIndex:["user","mobile"],key:"userMobile"},{title:"نام کاربر",dataIndex:["user","name"],key:"userName"},{title:"کمپین",dataIndex:["campaign","title"],key:"campaignTitle"},{title:"جایزه / نتیجه",dataIndex:["prize","title"],key:"prizeTitle"},{title:"نوع جایزه",dataIndex:["prize","prizeType"],key:"prizeType"},{title:"نتیجه",dataIndex:"isWin",key:"isWin",align:"center"},{title:"کلید تکرارناپذیری (Idempotency)",dataIndex:"idempotencyKey",key:"idempotencyKey",ellipsis:!0},{title:"آی‌پی کاربر",dataIndex:"ipAddress",key:"ipAddress"},{title:"زمان اسپین",dataIndex:"createdAt",key:"createdAt"}];return j(()=>{E(),_()}),(p,e)=>{const o=c("a-button"),f=c("a-space"),y=c("a-input-search"),b=c("a-select-option"),K=c("a-select"),T=c("a-tag"),F=c("a-table"),M=c("a-card");return n(),i("div",ee,[m("div",ae,[e[6]||(e[6]=m("div",null,[m("h1",{class:"title"},"تاریخچه چرخش‌ها (Spins)"),m("p",{class:"subtitle"},"گزارش لحظه‌ای تمام تلاش‌ها، برندگان، کدها و آی‌پی‌های ثبت‌شده")],-1)),d(f,null,{default:l(()=>[d(o,{onClick:_,loading:v.value},{icon:l(()=>[d(u(Y))]),default:l(()=>[e[4]||(e[4]=k(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),d(o,{type:"primary",loading:x.value,onClick:V},{icon:l(()=>[d(u(q))]),default:l(()=>[e[5]||(e[5]=k(" خروجی اکسل ",-1))]),_:1},8,["loading"])]),_:1})]),d(M,{bordered:!1,class:"main-card"},{default:l(()=>[m("div",te,[m("div",se,[d(y,{value:t.search,"onUpdate:value":e[0]||(e[0]=a=>t.search=a),placeholder:"جستجوی شماره همراه یا نام...",style:{width:"260px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{t.page=1,_()})},{prefix:l(()=>[d(u(G),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),d(K,{value:t.campaignId,"onUpdate:value":e[2]||(e[2]=a=>t.campaignId=a),placeholder:"فیلتر کمپین",allowClear:"",style:{width:"200px"},onChange:e[3]||(e[3]=()=>{t.page=1,_()})},{default:l(()=>[(n(!0),i(C,null,P(A.value,a=>(n(),I(b,{key:a.id,value:a.id},{default:l(()=>[k(r(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),d(F,{dataSource:w.value,columns:B,loading:v.value,rowKey:"id",size:"middle",pagination:{current:t.page,pageSize:t.pageSize,total:S.value,showTotal:a=>`مجموع: ${u(h)(a)} چرخش`,onChange:a=>{t.page=a,_()}}},{bodyCell:l(({column:a,record:s})=>{var L,D,R,N;return[a.key==="userMobile"?(n(),i("span",{key:0,class:"mobile-cell user-mobile-link",onClick:me=>s.userId?u(U).push(`/users/${s.userId}`):null},r(u(h)((L=s.user)==null?void 0:L.mobile)),9,ne)):a.key==="userName"?(n(),i("span",ie,r(((D=s.user)==null?void 0:D.name)||"—"),1)):a.key==="prizeTitle"?(n(),i(C,{key:2},[(R=s.prize)!=null&&R.title?(n(),i("span",le,r(s.prize.title),1)):(n(),i("span",oe,"بدون جایزه (پوچ)"))],64)):a.key==="prizeType"?(n(),i(C,{key:3},[(N=s.prize)!=null&&N.prizeType?(n(),I(T,{key:0},{default:l(()=>[k(r(W[s.prize.prizeType]||s.prize.prizeType),1)]),_:2},1024)):(n(),i("span",de,"—"))],64)):a.key==="isWin"?(n(),I(T,{key:4,color:s.isWin?"green":"default",class:"status-tag"},{default:l(()=>[m("span",{class:"status-dot",style:J({backgroundColor:s.isWin?"#10b981":"#94a3b8"})},null,4),k(" "+r(s.isWin?"برنده":"پوچ"),1)]),_:2},1032,["color"])):a.key==="idempotencyKey"?(n(),i("code",pe,r(s.idempotencyKey),1)):a.key==="ipAddress"?(n(),i("span",re,r(u(h)(s.ipAddress)),1)):a.key==="createdAt"?(n(),i("span",ce,r(u(h)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):Q("",!0)]}),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),ke=Z(ue,[["__scopeId","data-v-aaf12675"]]);export{ke as default}; +import{t as h}from"./farsi-number-stB7JMN0.js";import{d as $,j,a as i,b as m,c as d,w as l,m as z,r as c,h as g,g as H,o as n,f as k,e as u,R as Y,Y as q,S as G,F as C,x as P,t as r,s as I,D as J,q as Q,i as X,y as O,_ as Z}from"./index-iu4REYcj.js";const ee={class:"spin-list-page"},ae={class:"page-header-title"},te={class:"table-header"},se={class:"filters"},ne=["onClick"],ie={key:1,class:"user-name"},le={key:0,class:"prize-text"},oe={key:1,class:"text-muted"},de={key:1,class:"text-muted"},pe={key:5,class:"code-badge"},re={key:6,class:"date-cell"},ce={key:7,class:"date-cell"},ue=$({__name:"SpinListView",setup(ye){const U=X(),v=g(!1),x=g(!1),w=g([]),S=g(0),A=g([]),t=H({page:1,pageSize:10,campaignId:void 0,search:""});async function E(){var p;try{const e=await z.get("/admin/campaigns",{params:{pageSize:100}});A.value=Array.isArray(e.data)?e.data:((p=e.data)==null?void 0:p.data)||[]}catch{}}async function _(){var p,e,o,f;v.value=!0;try{const y=await z.get("/admin/spins",{params:{page:t.page,pageSize:t.pageSize,campaignId:t.campaignId||void 0,search:t.search||void 0}}),b=Array.isArray(y.data)?y.data:((p=y.data)==null?void 0:p.data)||[];w.value=b,S.value=((e=y.meta)==null?void 0:e.total)||((f=(o=y.data)==null?void 0:o.meta)==null?void 0:f.total)||b.length}finally{v.value=!1}}async function V(){x.value=!0;try{const p=await z.get("/admin/spins/export",{params:{campaignId:t.campaignId||void 0,search:t.search||void 0},responseType:"blob"}),e=window.URL.createObjectURL(new Blob([p.data])),o=document.createElement("a");o.href=e,o.setAttribute("download",`spins-${Date.now()}.xlsx`),document.body.appendChild(o),o.click(),document.body.removeChild(o),window.URL.revokeObjectURL(e),O.success("فایل اکسل با موفقیت دانلود شد.")}catch{O.error("خطا در دریافت فایل اکسل")}finally{x.value=!1}}const W={DIGITAL_CODE:"کد دیجیتال",PHYSICAL:"کالای فیزیکی",DISCOUNT:"کد تخفیف",CASH:"جایزه نقدی",FREE_CHANCE:"شانس مجدد",CUSTOM:"سفارشی"},B=[{title:"شماره همراه",dataIndex:["user","mobile"],key:"userMobile"},{title:"نام کاربر",dataIndex:["user","name"],key:"userName"},{title:"کمپین",dataIndex:["campaign","title"],key:"campaignTitle"},{title:"جایزه / نتیجه",dataIndex:["prize","title"],key:"prizeTitle"},{title:"نوع جایزه",dataIndex:["prize","prizeType"],key:"prizeType"},{title:"نتیجه",dataIndex:"isWin",key:"isWin",align:"center"},{title:"کلید تکرارناپذیری (Idempotency)",dataIndex:"idempotencyKey",key:"idempotencyKey",ellipsis:!0},{title:"آی‌پی کاربر",dataIndex:"ipAddress",key:"ipAddress"},{title:"زمان اسپین",dataIndex:"createdAt",key:"createdAt"}];return j(()=>{E(),_()}),(p,e)=>{const o=c("a-button"),f=c("a-space"),y=c("a-input-search"),b=c("a-select-option"),K=c("a-select"),T=c("a-tag"),F=c("a-table"),M=c("a-card");return n(),i("div",ee,[m("div",ae,[e[6]||(e[6]=m("div",null,[m("h1",{class:"title"},"تاریخچه چرخش‌ها (Spins)"),m("p",{class:"subtitle"},"گزارش لحظه‌ای تمام تلاش‌ها، برندگان، کدها و آی‌پی‌های ثبت‌شده")],-1)),d(f,null,{default:l(()=>[d(o,{onClick:_,loading:v.value},{icon:l(()=>[d(u(Y))]),default:l(()=>[e[4]||(e[4]=k(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),d(o,{type:"primary",loading:x.value,onClick:V},{icon:l(()=>[d(u(q))]),default:l(()=>[e[5]||(e[5]=k(" خروجی اکسل ",-1))]),_:1},8,["loading"])]),_:1})]),d(M,{bordered:!1,class:"main-card"},{default:l(()=>[m("div",te,[m("div",se,[d(y,{value:t.search,"onUpdate:value":e[0]||(e[0]=a=>t.search=a),placeholder:"جستجوی شماره همراه یا نام...",style:{width:"260px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{t.page=1,_()})},{prefix:l(()=>[d(u(G),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),d(K,{value:t.campaignId,"onUpdate:value":e[2]||(e[2]=a=>t.campaignId=a),placeholder:"فیلتر کمپین",allowClear:"",style:{width:"200px"},onChange:e[3]||(e[3]=()=>{t.page=1,_()})},{default:l(()=>[(n(!0),i(C,null,P(A.value,a=>(n(),I(b,{key:a.id,value:a.id},{default:l(()=>[k(r(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),d(F,{dataSource:w.value,columns:B,loading:v.value,rowKey:"id",size:"middle",pagination:{current:t.page,pageSize:t.pageSize,total:S.value,showTotal:a=>`مجموع: ${u(h)(a)} چرخش`,onChange:a=>{t.page=a,_()}}},{bodyCell:l(({column:a,record:s})=>{var L,D,R,N;return[a.key==="userMobile"?(n(),i("span",{key:0,class:"mobile-cell user-mobile-link",onClick:me=>s.userId?u(U).push(`/users/${s.userId}`):null},r(u(h)((L=s.user)==null?void 0:L.mobile)),9,ne)):a.key==="userName"?(n(),i("span",ie,r(((D=s.user)==null?void 0:D.name)||"—"),1)):a.key==="prizeTitle"?(n(),i(C,{key:2},[(R=s.prize)!=null&&R.title?(n(),i("span",le,r(s.prize.title),1)):(n(),i("span",oe,"بدون جایزه (پوچ)"))],64)):a.key==="prizeType"?(n(),i(C,{key:3},[(N=s.prize)!=null&&N.prizeType?(n(),I(T,{key:0},{default:l(()=>[k(r(W[s.prize.prizeType]||s.prize.prizeType),1)]),_:2},1024)):(n(),i("span",de,"—"))],64)):a.key==="isWin"?(n(),I(T,{key:4,color:s.isWin?"green":"default",class:"status-tag"},{default:l(()=>[m("span",{class:"status-dot",style:J({backgroundColor:s.isWin?"#10b981":"#94a3b8"})},null,4),k(" "+r(s.isWin?"برنده":"پوچ"),1)]),_:2},1032,["color"])):a.key==="idempotencyKey"?(n(),i("code",pe,r(s.idempotencyKey),1)):a.key==="ipAddress"?(n(),i("span",re,r(u(h)(s.ipAddress)),1)):a.key==="createdAt"?(n(),i("span",ce,r(u(h)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):Q("",!0)]}),_:1},8,["dataSource","loading","pagination"])]),_:1})])}}}),ke=Z(ue,[["__scopeId","data-v-aaf12675"]]);export{ke as default}; diff --git a/apps/admin/dist/assets/TeamOutlined-D0tX_kEo.js b/apps/admin/dist/assets/TeamOutlined-BXroJ-y-.js similarity index 96% rename from apps/admin/dist/assets/TeamOutlined-D0tX_kEo.js rename to apps/admin/dist/assets/TeamOutlined-BXroJ-y-.js index da006cd..0175fcb 100644 --- a/apps/admin/dist/assets/TeamOutlined-D0tX_kEo.js +++ b/apps/admin/dist/assets/TeamOutlined-BXroJ-y-.js @@ -1 +1 @@ -import{c as u,I as l}from"./index-Dx9ODHpC.js";var o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.8a8 8 0 008 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 0 01-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 01-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 008 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};function c(r){for(var e=1;e{T(),J()}),(m,n)=>{var W,q;const v=l("a-button"),D=l("a-space"),w=l("a-page-header"),y=l("a-descriptions-item"),x=l("a-tag"),ne=l("a-descriptions"),M=l("a-card"),se=l("a-col"),le=l("a-row"),N=l("a-table"),P=l("a-tab-pane"),oe=l("a-tabs"),ie=l("a-select-option"),de=l("a-select"),R=l("a-form-item"),ue=l("a-input-number"),ce=l("a-input"),re=l("a-form"),pe=l("a-modal");return d(),_("div",Ce,[t(w,{class:"detail-header",title:`پروفایل کاربر: ${(W=o.value)!=null&&W.mobile?c(z)(o.value.mobile):"در حال بارگذاری..."}`,"sub-title":((q=o.value)==null?void 0:q.name)||"بدون نام",onBack:n[1]||(n[1]=a=>c(Y).push("/users"))},{extra:e(()=>[t(D,null,{default:e(()=>[t(v,{onClick:T,loading:f.value},{icon:e(()=>[t(c(ve))]),default:e(()=>[n[6]||(n[6]=r(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),t(v,{type:"primary",onClick:n[0]||(n[0]=()=>K())},{icon:e(()=>[t(c(G))]),default:e(()=>[n[7]||(n[7]=r(" افزودن شانس ",-1))]),_:1})]),_:1})]),_:1},8,["title","sub-title"]),t(le,{gutter:16},{default:e(()=>[t(se,{span:24},{default:e(()=>[t(M,{title:"اطلاعات هویتی و حساب",bordered:!1,class:"section-card",style:{"margin-bottom":"20px"}},{default:e(()=>[t(ne,{bordered:"",size:"small",column:{xs:1,sm:2,md:4}},{default:e(()=>[t(y,{label:"شماره موبایل"},{default:e(()=>{var a;return[j("span",be,u(c(z)((a=o.value)==null?void 0:a.mobile)),1)]}),_:1}),t(y,{label:"نام و نام خانوادگی"},{default:e(()=>{var a;return[r(u(((a=o.value)==null?void 0:a.name)||"—"),1)]}),_:1}),t(y,{label:"وضعیت حساب"},{default:e(()=>{var a,i;return[t(x,{color:((a=o.value)==null?void 0:a.status)==="BLOCKED"||(i=o.value)!=null&&i.isBlocked?"red":"green"},{default:e(()=>{var s,g;return[r(u(((s=o.value)==null?void 0:s.status)==="BLOCKED"||(g=o.value)!=null&&g.isBlocked?"مسدود شده":"فعال"),1)]}),_:1},8,["color"])]}),_:1}),t(y,{label:"تاریخ ثبت‌نام"},{default:e(()=>{var a;return[j("span",xe,u((a=o.value)!=null&&a.createdAt?c(z)(new Date(o.value.createdAt).toLocaleDateString("fa-IR")):"—"),1)]}),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(M,{title:"موجودی شانس در کمپین‌ها",bordered:!1,class:"section-card",style:{"margin-bottom":"20px"}},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.userCampaigns)||[],columns:ee,loading:f.value,rowKey:"id",size:"middle",pagination:!1},{bodyCell:e(({column:i,record:s})=>[i.key==="remainingChances"?(d(),k(x,{key:0,color:"success",style:{"font-size":"13px","font-weight":"600"}},{default:e(()=>[r(u(c(U)(s.remainingChances)),1)]),_:2},1024)):i.key==="totalChances"?(d(),_("span",Ie,u(c(U)(s.totalChances)),1)):i.key==="usedChances"?(d(),_("span",ze,u(c(U)(s.usedChances)),1)):i.key==="actions"?(d(),k(v,{key:3,type:"text",size:"small",class:"action-text-btn",onClick:g=>K(s.campaignId)},{icon:e(()=>[t(c(G),{style:{color:"#4f46e5"}})]),default:e(()=>[n[8]||(n[8]=r(" تغییر شانس ",-1))]),_:1},8,["onClick"])):O("",!0)]),_:1},8,["dataSource","loading"])]}),_:1}),t(oe,{defaultActiveKey:"prizes",type:"card",class:"detail-tabs"},{default:e(()=>[t(P,{key:"prizes",tab:"جوایز دریافت‌شده"},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.prizes)||[],columns:ae,loading:f.value,rowKey:"id",size:"middle",pagination:{pageSize:5}},{bodyCell:e(({column:i,record:s})=>{var g;return[i.key==="prizeType"?(d(),k(x,{key:0},{default:e(()=>{var I,$;return[r(u(Z[(I=s.prize)==null?void 0:I.prizeType]||(($=s.prize)==null?void 0:$.prizeType)||"—"),1)]}),_:2},1024)):i.key==="code"?(d(),_(H,{key:1},[s.code?(d(),_("code",he,u(s.code),1)):(d(),_("span",Ae,"—"))],64)):i.key==="status"?(d(),k(x,{key:2,color:((g=F[s.status])==null?void 0:g.color)||"blue"},{default:e(()=>{var I;return[r(u(((I=F[s.status])==null?void 0:I.text)||s.status),1)]}),_:2},1032,["color"])):i.key==="createdAt"?(d(),_("span",De,u(c(z)(new Date(s.createdAt).toLocaleDateString("fa-IR"))),1)):O("",!0)]}),_:1},8,["dataSource","loading"])]}),_:1}),t(P,{key:"spins",tab:"تاریخچه اسپین‌ها"},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.spins)||[],columns:te,loading:f.value,rowKey:"id",size:"middle",pagination:{pageSize:5}},{bodyCell:e(({column:i,record:s})=>[i.key==="isWin"?(d(),k(x,{key:0,color:s.isWin?"green":"default"},{default:e(()=>[r(u(s.isWin?"برنده":"پوچ"),1)]),_:2},1032,["color"])):i.key==="createdAt"?(d(),_("span",we,u(c(z)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):O("",!0)]),_:1},8,["dataSource","loading"])]}),_:1})]),_:1}),t(pe,{open:h.value,"onUpdate:open":n[5]||(n[5]=a=>h.value=a),title:"تنظیم شانس کاربر در کمپین",confirmLoading:E.value,okText:"ثبت تغییرات",cancelText:"انصراف",onOk:Q},{default:e(()=>[t(re,{layout:"vertical"},{default:e(()=>[t(R,{label:"کمپین مورد نظر",required:""},{default:e(()=>[t(de,{value:C.value,"onUpdate:value":n[2]||(n[2]=a=>C.value=a),placeholder:"انتخاب کمپین",style:{width:"100%"}},{default:e(()=>[(d(!0),_(H,null,ge(L.value,a=>(d(),k(ie,{key:a.id,value:a.id},{default:e(()=>[r(u(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),t(R,{label:"تغییر شانس (+ برای افزایش، - برای کسر)",required:""},{default:e(()=>[t(ue,{value:b.value,"onUpdate:value":n[3]||(n[3]=a=>b.value=a),style:{width:"100%"}},null,8,["value"])]),_:1}),t(R,{label:"دلیل / بابت",required:""},{default:e(()=>[t(ce,{value:A.value,"onUpdate:value":n[4]||(n[4]=a=>A.value=a),placeholder:"مثال: خرید مجدد مشتری"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])])}}}),Re=ke(Se,[["__scopeId","data-v-331e5087"]]);export{Re as default}; +import{t as z,f as U}from"./farsi-number-stB7JMN0.js";import{d as _e,h as p,j as me,a as _,c as t,w as e,e as c,N as ye,i as fe,m as B,r as l,o as d,f as r,R as ve,b as j,t as u,s as k,q as O,F as H,x as ge,y as V,_ as ke}from"./index-iu4REYcj.js";import{P as G}from"./PlusCircleOutlined-D0DwpFnG.js";const Ce={class:"user-detail-page"},be={class:"num-cell"},xe={class:"date-cell"},Ie={key:1,class:"num-cell"},ze={key:2,class:"num-cell"},he={key:0,class:"code-badge"},Ae={key:1,class:"text-muted"},De={key:3,class:"date-cell"},we={key:1,class:"date-cell"},Se=_e({__name:"UserDetailView",setup(Ee){const X=ye(),Y=fe(),S=p(X.params.id||""),f=p(!1),o=p(null),h=p(!1),E=p(!1),C=p(""),b=p(1),A=p(""),L=p([]);async function J(){var m;try{const n=await B.get("/admin/campaigns",{params:{pageSize:100}});L.value=Array.isArray(n.data)?n.data:((m=n.data)==null?void 0:m.data)||[]}catch{}}async function T(){if(S.value){f.value=!0;try{const m=await B.get(`/admin/users/${S.value}`);o.value=m.data}finally{f.value=!1}}}function K(m){var n,v,D,w,y;C.value=m||((D=(v=(n=o.value)==null?void 0:n.userCampaigns)==null?void 0:v[0])==null?void 0:D.campaignId)||((y=(w=L.value)==null?void 0:w[0])==null?void 0:y.id)||"",b.value=1,A.value="اهدای شانس تشویقی توسط مدیر",h.value=!0}async function Q(){if(!C.value){V.error("انتخاب کمپین الزامی است.");return}if(!b.value){V.error("مقدار شانس نامعتبر است.");return}E.value=!0;try{await B.post("/admin/chances/adjust",{userId:S.value,campaignId:C.value,amount:b.value,reason:A.value}),V.success("شانس کاربر با موفقیت تغییر کرد."),h.value=!1,T()}finally{E.value=!1}}const F={PENDING:{text:"در انتظار",color:"processing"},DELIVERED:{text:"تحویل داده شده",color:"success"},USED:{text:"استفاده شده",color:"cyan"},CANCELLED:{text:"لغو شده",color:"error"},EXPIRED:{text:"منقضی شده",color:"default"}},Z={DIGITAL_CODE:"کد دیجیتال",PHYSICAL:"کالای فیزیکی",DISCOUNT:"کد تخفیف",CASH:"جایزه نقدی",FREE_CHANCE:"شانس مجدد",CUSTOM:"سفارشی"},ee=[{title:"عنوان کمپین",dataIndex:["campaign","title"],key:"title"},{title:"شانس باقی‌مانده",dataIndex:"remainingChances",key:"remainingChances"},{title:"کل شانس‌ها",dataIndex:"totalChances",key:"totalChances",align:"center"},{title:"شانس مصرف‌شده",dataIndex:"usedChances",key:"usedChances",align:"center"},{title:"عملیات",key:"actions",width:110,align:"center"}],ae=[{title:"عنوان جایزه",dataIndex:["prize","title"],key:"title"},{title:"نوع جایزه",dataIndex:["prize","prizeType"],key:"prizeType"},{title:"کد دیجیتال",dataIndex:"code",key:"code"},{title:"وضعیت",dataIndex:"status",key:"status"},{title:"تاریخ دریافت",dataIndex:"createdAt",key:"createdAt"}],te=[{title:"کمپین",dataIndex:["campaign","title"],key:"campaign"},{title:"نتیجه / جایزه",dataIndex:["prize","title"],key:"prize"},{title:"برد؟",dataIndex:"isWin",key:"isWin"},{title:"آی‌پی",dataIndex:"ipAddress",key:"ipAddress"},{title:"تاریخ اسپین",dataIndex:"createdAt",key:"createdAt"}];return me(()=>{T(),J()}),(m,n)=>{var W,q;const v=l("a-button"),D=l("a-space"),w=l("a-page-header"),y=l("a-descriptions-item"),x=l("a-tag"),ne=l("a-descriptions"),M=l("a-card"),se=l("a-col"),le=l("a-row"),N=l("a-table"),P=l("a-tab-pane"),oe=l("a-tabs"),ie=l("a-select-option"),de=l("a-select"),R=l("a-form-item"),ue=l("a-input-number"),ce=l("a-input"),re=l("a-form"),pe=l("a-modal");return d(),_("div",Ce,[t(w,{class:"detail-header",title:`پروفایل کاربر: ${(W=o.value)!=null&&W.mobile?c(z)(o.value.mobile):"در حال بارگذاری..."}`,"sub-title":((q=o.value)==null?void 0:q.name)||"بدون نام",onBack:n[1]||(n[1]=a=>c(Y).push("/users"))},{extra:e(()=>[t(D,null,{default:e(()=>[t(v,{onClick:T,loading:f.value},{icon:e(()=>[t(c(ve))]),default:e(()=>[n[6]||(n[6]=r(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),t(v,{type:"primary",onClick:n[0]||(n[0]=()=>K())},{icon:e(()=>[t(c(G))]),default:e(()=>[n[7]||(n[7]=r(" افزودن شانس ",-1))]),_:1})]),_:1})]),_:1},8,["title","sub-title"]),t(le,{gutter:16},{default:e(()=>[t(se,{span:24},{default:e(()=>[t(M,{title:"اطلاعات هویتی و حساب",bordered:!1,class:"section-card",style:{"margin-bottom":"20px"}},{default:e(()=>[t(ne,{bordered:"",size:"small",column:{xs:1,sm:2,md:4}},{default:e(()=>[t(y,{label:"شماره موبایل"},{default:e(()=>{var a;return[j("span",be,u(c(z)((a=o.value)==null?void 0:a.mobile)),1)]}),_:1}),t(y,{label:"نام و نام خانوادگی"},{default:e(()=>{var a;return[r(u(((a=o.value)==null?void 0:a.name)||"—"),1)]}),_:1}),t(y,{label:"وضعیت حساب"},{default:e(()=>{var a,i;return[t(x,{color:((a=o.value)==null?void 0:a.status)==="BLOCKED"||(i=o.value)!=null&&i.isBlocked?"red":"green"},{default:e(()=>{var s,g;return[r(u(((s=o.value)==null?void 0:s.status)==="BLOCKED"||(g=o.value)!=null&&g.isBlocked?"مسدود شده":"فعال"),1)]}),_:1},8,["color"])]}),_:1}),t(y,{label:"تاریخ ثبت‌نام"},{default:e(()=>{var a;return[j("span",xe,u((a=o.value)!=null&&a.createdAt?c(z)(new Date(o.value.createdAt).toLocaleDateString("fa-IR")):"—"),1)]}),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(M,{title:"موجودی شانس در کمپین‌ها",bordered:!1,class:"section-card",style:{"margin-bottom":"20px"}},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.userCampaigns)||[],columns:ee,loading:f.value,rowKey:"id",size:"middle",pagination:!1},{bodyCell:e(({column:i,record:s})=>[i.key==="remainingChances"?(d(),k(x,{key:0,color:"success",style:{"font-size":"13px","font-weight":"600"}},{default:e(()=>[r(u(c(U)(s.remainingChances)),1)]),_:2},1024)):i.key==="totalChances"?(d(),_("span",Ie,u(c(U)(s.totalChances)),1)):i.key==="usedChances"?(d(),_("span",ze,u(c(U)(s.usedChances)),1)):i.key==="actions"?(d(),k(v,{key:3,type:"text",size:"small",class:"action-text-btn",onClick:g=>K(s.campaignId)},{icon:e(()=>[t(c(G),{style:{color:"#4f46e5"}})]),default:e(()=>[n[8]||(n[8]=r(" تغییر شانس ",-1))]),_:1},8,["onClick"])):O("",!0)]),_:1},8,["dataSource","loading"])]}),_:1}),t(oe,{defaultActiveKey:"prizes",type:"card",class:"detail-tabs"},{default:e(()=>[t(P,{key:"prizes",tab:"جوایز دریافت‌شده"},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.prizes)||[],columns:ae,loading:f.value,rowKey:"id",size:"middle",pagination:{pageSize:5}},{bodyCell:e(({column:i,record:s})=>{var g;return[i.key==="prizeType"?(d(),k(x,{key:0},{default:e(()=>{var I,$;return[r(u(Z[(I=s.prize)==null?void 0:I.prizeType]||(($=s.prize)==null?void 0:$.prizeType)||"—"),1)]}),_:2},1024)):i.key==="code"?(d(),_(H,{key:1},[s.code?(d(),_("code",he,u(s.code),1)):(d(),_("span",Ae,"—"))],64)):i.key==="status"?(d(),k(x,{key:2,color:((g=F[s.status])==null?void 0:g.color)||"blue"},{default:e(()=>{var I;return[r(u(((I=F[s.status])==null?void 0:I.text)||s.status),1)]}),_:2},1032,["color"])):i.key==="createdAt"?(d(),_("span",De,u(c(z)(new Date(s.createdAt).toLocaleDateString("fa-IR"))),1)):O("",!0)]}),_:1},8,["dataSource","loading"])]}),_:1}),t(P,{key:"spins",tab:"تاریخچه اسپین‌ها"},{default:e(()=>{var a;return[t(N,{dataSource:((a=o.value)==null?void 0:a.spins)||[],columns:te,loading:f.value,rowKey:"id",size:"middle",pagination:{pageSize:5}},{bodyCell:e(({column:i,record:s})=>[i.key==="isWin"?(d(),k(x,{key:0,color:s.isWin?"green":"default"},{default:e(()=>[r(u(s.isWin?"برنده":"پوچ"),1)]),_:2},1032,["color"])):i.key==="createdAt"?(d(),_("span",we,u(c(z)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):O("",!0)]),_:1},8,["dataSource","loading"])]}),_:1})]),_:1}),t(pe,{open:h.value,"onUpdate:open":n[5]||(n[5]=a=>h.value=a),title:"تنظیم شانس کاربر در کمپین",confirmLoading:E.value,okText:"ثبت تغییرات",cancelText:"انصراف",onOk:Q},{default:e(()=>[t(re,{layout:"vertical"},{default:e(()=>[t(R,{label:"کمپین مورد نظر",required:""},{default:e(()=>[t(de,{value:C.value,"onUpdate:value":n[2]||(n[2]=a=>C.value=a),placeholder:"انتخاب کمپین",style:{width:"100%"}},{default:e(()=>[(d(!0),_(H,null,ge(L.value,a=>(d(),k(ie,{key:a.id,value:a.id},{default:e(()=>[r(u(a.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),t(R,{label:"تغییر شانس (+ برای افزایش، - برای کسر)",required:""},{default:e(()=>[t(ue,{value:b.value,"onUpdate:value":n[3]||(n[3]=a=>b.value=a),style:{width:"100%"}},null,8,["value"])]),_:1}),t(R,{label:"دلیل / بابت",required:""},{default:e(()=>[t(ce,{value:A.value,"onUpdate:value":n[4]||(n[4]=a=>A.value=a),placeholder:"مثال: خرید مجدد مشتری"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])])}}}),Re=ke(Se,[["__scopeId","data-v-331e5087"]]);export{Re as default}; diff --git a/apps/admin/dist/assets/UserListView-CUMm4H4J.js b/apps/admin/dist/assets/UserListView-DkY1i72N.js similarity index 98% rename from apps/admin/dist/assets/UserListView-CUMm4H4J.js rename to apps/admin/dist/assets/UserListView-DkY1i72N.js index b34df66..8357303 100644 --- a/apps/admin/dist/assets/UserListView-CUMm4H4J.js +++ b/apps/admin/dist/assets/UserListView-DkY1i72N.js @@ -1 +1 @@ -import{t as h,f as P}from"./farsi-number-stB7JMN0.js";import{c as a,I as le,d as ie,j as re,a as _,b as p,w as n,m as S,r as l,h as x,g as K,o as m,e as r,S as ue,f as B,t as k,s as E,D as ce,G as de,q as pe,F as me,x as _e,i as fe,M as ge,y as O,_ as ve}from"./index-Dx9ODHpC.js";import{M as ye}from"./MoreOutlined-BVlNw6dC.js";import{P as ke}from"./PlusCircleOutlined-46hEPOWa.js";import{L as be}from"./LockOutlined-ihCI0sD8.js";var Ce={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v68c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-68c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zm-40 376H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"unlock",theme:"outlined"};function N(f){for(var u=1;uq(o)})}function R(o){var e;s.userId=o.id,s.userMobile=o.mobile,s.campaignId=((e=z.value[0])==null?void 0:e.id)||"",s.amount=1,s.reason="اهدای شانس تشویقی توسط مدیر",I.value=!0}async function G(){if(!s.campaignId){O.error("لطفاً کمپین مورد نظر را انتخاب کنید.");return}if(!s.amount||s.amount===0){O.error("مقدار شانس باید غیر صفر باشد.");return}if(!s.reason){O.error("دلیل تغییر شانس الزامی است.");return}A.value=!0;try{await S.post("/admin/chances/adjust",{userId:s.userId,campaignId:s.campaignId,amount:s.amount,reason:s.reason}),O.success("شانس کاربر با موفقیت تغییر یافت."),I.value=!1,w()}finally{A.value=!1}}const J=[{title:"شماره موبایل",dataIndex:"mobile",key:"mobile"},{title:"نام کاربر",dataIndex:"name",key:"name"},{title:"تاریخ ثبت‌نام",dataIndex:"createdAt",key:"createdAt"},{title:"آخرین ورود",dataIndex:"lastLoginAt",key:"lastLoginAt"},{title:"تعداد اسپین",dataIndex:["_count","spins"],key:"spinsCount",align:"center"},{title:"تعداد جوایز برنده",key:"prizesCount",align:"center"},{title:"وضعیت حساب",dataIndex:"status",key:"status",align:"center"},{title:"عملیات",key:"actions",width:70,align:"center"}];return re(()=>{F(),w()}),(o,e)=>{const v=l("a-input-search"),C=l("a-select-option"),y=l("a-select"),L=l("a-tag"),Q=l("a-button"),D=l("a-menu-item"),W=l("a-menu-divider"),X=l("a-menu"),Y=l("a-dropdown"),Z=l("a-table"),ee=l("a-alert"),U=l("a-form-item"),te=l("a-input-number"),ae=l("a-input"),ne=l("a-form"),se=l("a-modal"),oe=l("a-card");return m(),_("div",we,[e[14]||(e[14]=p("div",{class:"page-header-title"},[p("div",null,[p("h1",{class:"title"},"مدیریت کاربران"),p("p",{class:"subtitle"},"مشاهده لیست کاربران، وضعیت حساب و تنظیم دستی شانس‌ها")])],-1)),a(oe,{bordered:!1,class:"main-card"},{default:n(()=>[p("div",xe,[p("div",Oe,[a(v,{value:d.search,"onUpdate:value":e[0]||(e[0]=t=>d.search=t),placeholder:"جستجوی موبایل یا نام...",style:{width:"270px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{d.page=1,w()})},{prefix:n(()=>[a(r(ue),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),a(y,{value:d.status,"onUpdate:value":e[2]||(e[2]=t=>d.status=t),placeholder:"وضعیت حساب",allowClear:"",style:{width:"150px"},onChange:e[3]||(e[3]=()=>{d.page=1,w()})},{default:n(()=>[a(C,{value:"ACTIVE"},{default:n(()=>[...e[8]||(e[8]=[B("فعال",-1)])]),_:1}),a(C,{value:"BLOCKED"},{default:n(()=>[...e[9]||(e[9]=[B("مسدود",-1)])]),_:1})]),_:1},8,["value"])])]),a(Z,{dataSource:g.value,columns:J,loading:c.value,rowKey:"id",size:"middle",pagination:{current:d.page,pageSize:d.pageSize,total:b.value,showTotal:t=>`مجموع: ${r(h)(t)} کاربر`,onChange:t=>{d.page=t,w()}}},{bodyCell:n(({column:t,record:i})=>{var V,T,j;return[t.key==="mobile"?(m(),_("span",{key:0,class:"user-mobile-link",onClick:$=>r(u).push(`/users/${i.id}`)},k(r(h)(i.mobile)),9,Ie)):t.key==="name"?(m(),_("span",Le,k(i.name||"—"),1)):t.key==="createdAt"?(m(),_("span",Se,k(r(h)(new Date(i.createdAt).toLocaleDateString("fa-IR"))),1)):t.key==="lastLoginAt"?(m(),_("span",Be,k(i.lastLoginAt?r(h)(new Date(i.lastLoginAt).toLocaleDateString("fa-IR")):"—"),1)):t.key==="spinsCount"?(m(),_("span",Ae,k(r(P)(((V=i._count)==null?void 0:V.spins)??0)),1)):t.key==="prizesCount"?(m(),_("span",ze,k(r(P)(((T=i._count)==null?void 0:T.userPrizes)??((j=i._count)==null?void 0:j.prizes)??0)),1)):t.key==="status"?(m(),E(L,{key:6,color:i.status==="BLOCKED"?"red":"green",class:"status-tag"},{default:n(()=>[p("span",{class:"status-dot",style:ce({backgroundColor:i.status==="BLOCKED"?"#ef4444":"#10b981"})},null,4),B(" "+k(i.status==="BLOCKED"?"مسدود":"فعال"),1)]),_:2},1032,["color"])):t.key==="actions"?(m(),E(Y,{key:7,trigger:["click"],placement:"bottomLeft"},{overlay:n(()=>[a(X,{class:"action-dropdown-menu"},{default:n(()=>[a(D,{key:"profile",onClick:$=>r(u).push(`/users/${i.id}`)},{default:n(()=>[p("div",De,[a(r(de),{class:"dropdown-item-icon"}),e[10]||(e[10]=p("span",null,"مشاهده پروفایل و جزییات",-1))])]),_:1},8,["onClick"]),a(D,{key:"chance",onClick:$=>R(i)},{default:n(()=>[p("div",Ue,[a(r(ke),{class:"dropdown-item-icon"}),e[11]||(e[11]=p("span",null,"تنظیم دستی شانس",-1))])]),_:1},8,["onClick"]),a(W),a(D,{key:"block",onClick:$=>H(i)},{default:n(()=>[i.status==="BLOCKED"?(m(),_("div",$e,[a(r(M),{class:"dropdown-item-icon"}),e[12]||(e[12]=p("span",null,"رفع مسدودی حساب",-1))])):(m(),_("div",Ee,[a(r(be),{class:"dropdown-item-icon"}),e[13]||(e[13]=p("span",null,"مسدودسازی کاربر",-1))]))]),_:2},1032,["onClick"])]),_:2},1024)]),default:n(()=>[a(Q,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:n(()=>[a(r(ye),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):pe("",!0)]}),_:1},8,["dataSource","loading","pagination"]),a(se,{open:I.value,"onUpdate:open":e[7]||(e[7]=t=>I.value=t),title:"افزایش / کاهش شانس کاربر",confirmLoading:A.value,okText:"ثبت تغییر شانس",cancelText:"انصراف",onOk:G},{default:n(()=>[a(ne,{layout:"vertical"},{default:n(()=>[a(ee,{message:`کاربر: ${r(h)(s.userMobile)}`,description:"تغییر شانس مستقیماً در دفترکل تراکنش‌های شانس (Ledger) و اسنپ‌شات کاربر با لاگ بازرسی ثبت می‌گردد.",type:"info","show-icon":"",style:{"margin-bottom":"16px","border-radius":"8px"}},null,8,["message"]),a(U,{label:"کمپین مورد نظر",required:""},{default:n(()=>[a(y,{value:s.campaignId,"onUpdate:value":e[4]||(e[4]=t=>s.campaignId=t),placeholder:"انتخاب کمپین"},{default:n(()=>[(m(!0),_(me,null,_e(z.value,t=>(m(),E(C,{key:t.id,value:t.id},{default:n(()=>[B(k(t.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(U,{label:"مقدار تغییر (+ برای افزایش، - برای کسر)",required:"",tooltip:"مثال: ۱ برای اهدای یک شانس، ۲- برای کسر دو شانس"},{default:n(()=>[a(te,{value:s.amount,"onUpdate:value":e[5]||(e[5]=t=>s.amount=t),style:{width:"100%"}},null,8,["value"])]),_:1}),a(U,{label:"دلیل / بابت",required:""},{default:n(()=>[a(ae,{value:s.reason,"onUpdate:value":e[6]||(e[6]=t=>s.reason=t),placeholder:"مثال: خرید از فروشگاه / هدیه پشتیبانی"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})])}}}),Ne=ve(Me,[["__scopeId","data-v-fd1c9633"]]);export{Ne as default}; +import{t as h,f as P}from"./farsi-number-stB7JMN0.js";import{c as a,I as le,d as ie,j as re,a as _,b as p,w as n,m as S,r as l,h as x,g as K,o as m,e as r,S as ue,f as B,t as k,s as E,D as ce,G as de,q as pe,F as me,x as _e,i as fe,M as ge,y as O,_ as ve}from"./index-iu4REYcj.js";import{M as ye}from"./MoreOutlined-B9LhmUnJ.js";import{P as ke}from"./PlusCircleOutlined-D0DwpFnG.js";import{L as be}from"./LockOutlined-NIokxtdn.js";var Ce={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v68c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-68c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zm-40 376H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"unlock",theme:"outlined"};function N(f){for(var u=1;uq(o)})}function R(o){var e;s.userId=o.id,s.userMobile=o.mobile,s.campaignId=((e=z.value[0])==null?void 0:e.id)||"",s.amount=1,s.reason="اهدای شانس تشویقی توسط مدیر",I.value=!0}async function G(){if(!s.campaignId){O.error("لطفاً کمپین مورد نظر را انتخاب کنید.");return}if(!s.amount||s.amount===0){O.error("مقدار شانس باید غیر صفر باشد.");return}if(!s.reason){O.error("دلیل تغییر شانس الزامی است.");return}A.value=!0;try{await S.post("/admin/chances/adjust",{userId:s.userId,campaignId:s.campaignId,amount:s.amount,reason:s.reason}),O.success("شانس کاربر با موفقیت تغییر یافت."),I.value=!1,w()}finally{A.value=!1}}const J=[{title:"شماره موبایل",dataIndex:"mobile",key:"mobile"},{title:"نام کاربر",dataIndex:"name",key:"name"},{title:"تاریخ ثبت‌نام",dataIndex:"createdAt",key:"createdAt"},{title:"آخرین ورود",dataIndex:"lastLoginAt",key:"lastLoginAt"},{title:"تعداد اسپین",dataIndex:["_count","spins"],key:"spinsCount",align:"center"},{title:"تعداد جوایز برنده",key:"prizesCount",align:"center"},{title:"وضعیت حساب",dataIndex:"status",key:"status",align:"center"},{title:"عملیات",key:"actions",width:70,align:"center"}];return re(()=>{F(),w()}),(o,e)=>{const v=l("a-input-search"),C=l("a-select-option"),y=l("a-select"),L=l("a-tag"),Q=l("a-button"),D=l("a-menu-item"),W=l("a-menu-divider"),X=l("a-menu"),Y=l("a-dropdown"),Z=l("a-table"),ee=l("a-alert"),U=l("a-form-item"),te=l("a-input-number"),ae=l("a-input"),ne=l("a-form"),se=l("a-modal"),oe=l("a-card");return m(),_("div",we,[e[14]||(e[14]=p("div",{class:"page-header-title"},[p("div",null,[p("h1",{class:"title"},"مدیریت کاربران"),p("p",{class:"subtitle"},"مشاهده لیست کاربران، وضعیت حساب و تنظیم دستی شانس‌ها")])],-1)),a(oe,{bordered:!1,class:"main-card"},{default:n(()=>[p("div",xe,[p("div",Oe,[a(v,{value:d.search,"onUpdate:value":e[0]||(e[0]=t=>d.search=t),placeholder:"جستجوی موبایل یا نام...",style:{width:"270px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{d.page=1,w()})},{prefix:n(()=>[a(r(ue),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),a(y,{value:d.status,"onUpdate:value":e[2]||(e[2]=t=>d.status=t),placeholder:"وضعیت حساب",allowClear:"",style:{width:"150px"},onChange:e[3]||(e[3]=()=>{d.page=1,w()})},{default:n(()=>[a(C,{value:"ACTIVE"},{default:n(()=>[...e[8]||(e[8]=[B("فعال",-1)])]),_:1}),a(C,{value:"BLOCKED"},{default:n(()=>[...e[9]||(e[9]=[B("مسدود",-1)])]),_:1})]),_:1},8,["value"])])]),a(Z,{dataSource:g.value,columns:J,loading:c.value,rowKey:"id",size:"middle",pagination:{current:d.page,pageSize:d.pageSize,total:b.value,showTotal:t=>`مجموع: ${r(h)(t)} کاربر`,onChange:t=>{d.page=t,w()}}},{bodyCell:n(({column:t,record:i})=>{var V,T,j;return[t.key==="mobile"?(m(),_("span",{key:0,class:"user-mobile-link",onClick:$=>r(u).push(`/users/${i.id}`)},k(r(h)(i.mobile)),9,Ie)):t.key==="name"?(m(),_("span",Le,k(i.name||"—"),1)):t.key==="createdAt"?(m(),_("span",Se,k(r(h)(new Date(i.createdAt).toLocaleDateString("fa-IR"))),1)):t.key==="lastLoginAt"?(m(),_("span",Be,k(i.lastLoginAt?r(h)(new Date(i.lastLoginAt).toLocaleDateString("fa-IR")):"—"),1)):t.key==="spinsCount"?(m(),_("span",Ae,k(r(P)(((V=i._count)==null?void 0:V.spins)??0)),1)):t.key==="prizesCount"?(m(),_("span",ze,k(r(P)(((T=i._count)==null?void 0:T.userPrizes)??((j=i._count)==null?void 0:j.prizes)??0)),1)):t.key==="status"?(m(),E(L,{key:6,color:i.status==="BLOCKED"?"red":"green",class:"status-tag"},{default:n(()=>[p("span",{class:"status-dot",style:ce({backgroundColor:i.status==="BLOCKED"?"#ef4444":"#10b981"})},null,4),B(" "+k(i.status==="BLOCKED"?"مسدود":"فعال"),1)]),_:2},1032,["color"])):t.key==="actions"?(m(),E(Y,{key:7,trigger:["click"],placement:"bottomLeft"},{overlay:n(()=>[a(X,{class:"action-dropdown-menu"},{default:n(()=>[a(D,{key:"profile",onClick:$=>r(u).push(`/users/${i.id}`)},{default:n(()=>[p("div",De,[a(r(de),{class:"dropdown-item-icon"}),e[10]||(e[10]=p("span",null,"مشاهده پروفایل و جزییات",-1))])]),_:1},8,["onClick"]),a(D,{key:"chance",onClick:$=>R(i)},{default:n(()=>[p("div",Ue,[a(r(ke),{class:"dropdown-item-icon"}),e[11]||(e[11]=p("span",null,"تنظیم دستی شانس",-1))])]),_:1},8,["onClick"]),a(W),a(D,{key:"block",onClick:$=>H(i)},{default:n(()=>[i.status==="BLOCKED"?(m(),_("div",$e,[a(r(M),{class:"dropdown-item-icon"}),e[12]||(e[12]=p("span",null,"رفع مسدودی حساب",-1))])):(m(),_("div",Ee,[a(r(be),{class:"dropdown-item-icon"}),e[13]||(e[13]=p("span",null,"مسدودسازی کاربر",-1))]))]),_:2},1032,["onClick"])]),_:2},1024)]),default:n(()=>[a(Q,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:n(()=>[a(r(ye),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):pe("",!0)]}),_:1},8,["dataSource","loading","pagination"]),a(se,{open:I.value,"onUpdate:open":e[7]||(e[7]=t=>I.value=t),title:"افزایش / کاهش شانس کاربر",confirmLoading:A.value,okText:"ثبت تغییر شانس",cancelText:"انصراف",onOk:G},{default:n(()=>[a(ne,{layout:"vertical"},{default:n(()=>[a(ee,{message:`کاربر: ${r(h)(s.userMobile)}`,description:"تغییر شانس مستقیماً در دفترکل تراکنش‌های شانس (Ledger) و اسنپ‌شات کاربر با لاگ بازرسی ثبت می‌گردد.",type:"info","show-icon":"",style:{"margin-bottom":"16px","border-radius":"8px"}},null,8,["message"]),a(U,{label:"کمپین مورد نظر",required:""},{default:n(()=>[a(y,{value:s.campaignId,"onUpdate:value":e[4]||(e[4]=t=>s.campaignId=t),placeholder:"انتخاب کمپین"},{default:n(()=>[(m(!0),_(me,null,_e(z.value,t=>(m(),E(C,{key:t.id,value:t.id},{default:n(()=>[B(k(t.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(U,{label:"مقدار تغییر (+ برای افزایش، - برای کسر)",required:"",tooltip:"مثال: ۱ برای اهدای یک شانس، ۲- برای کسر دو شانس"},{default:n(()=>[a(te,{value:s.amount,"onUpdate:value":e[5]||(e[5]=t=>s.amount=t),style:{width:"100%"}},null,8,["value"])]),_:1}),a(U,{label:"دلیل / بابت",required:""},{default:n(()=>[a(ae,{value:s.reason,"onUpdate:value":e[6]||(e[6]=t=>s.reason=t),placeholder:"مثال: خرید از فروشگاه / هدیه پشتیبانی"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})])}}}),Ne=ve(Me,[["__scopeId","data-v-fd1c9633"]]);export{Ne as default}; diff --git a/apps/admin/dist/assets/WinnerListView-FE9kM-NV.js b/apps/admin/dist/assets/WinnerListView-ttRyORJt.js similarity index 98% rename from apps/admin/dist/assets/WinnerListView-FE9kM-NV.js rename to apps/admin/dist/assets/WinnerListView-ttRyORJt.js index 576067c..db19fdb 100644 --- a/apps/admin/dist/assets/WinnerListView-FE9kM-NV.js +++ b/apps/admin/dist/assets/WinnerListView-ttRyORJt.js @@ -1 +1 @@ -import{t as L}from"./farsi-number-stB7JMN0.js";import{d as ue,j as re,a as v,b as m,c as t,w as a,m as I,r as u,h as k,g as q,o as r,f as i,e as f,R as pe,Y as ce,S as me,F as Y,x as fe,t as y,s as b,D as ve,E as ye,U as _e,q as R,C as ge,i as Ce,y as z,_ as ke}from"./index-Dx9ODHpC.js";import{M as be}from"./MoreOutlined-BVlNw6dC.js";const we={class:"winner-list-page"},xe={class:"page-header-title"},Ee={class:"table-header"},Te={class:"filters"},Ie=["onClick"],ze={key:1,class:"user-name"},De={key:2,class:"campaign-cell"},Se={key:3,class:"prize-text"},Ae=["onClick"],Oe={key:1,class:"text-muted"},Ue={key:7,class:"date-cell"},Le={class:"dropdown-action-item"},Re={class:"dropdown-action-item"},Ne={class:"dropdown-action-item"},Ve=ue({__name:"WinnerListView",setup($e){const N=Ce(),x=k(!1),D=k(!1),V=k([]),$=k(0),M=k([]),l=q({page:1,pageSize:10,campaignId:void 0,status:void 0,search:""}),E=k(!1),S=k(!1),c=q({id:"",winnerMobile:"",prizeTitle:"",status:"CONTACTED",note:""});async function G(){var n;try{const e=await I.get("/admin/campaigns",{params:{pageSize:100}});M.value=Array.isArray(e.data)?e.data:((n=e.data)==null?void 0:n.data)||[]}catch{}}async function _(){var n,e,p,T;x.value=!0;try{const g=await I.get("/admin/user-prizes",{params:{page:l.page,pageSize:l.pageSize,campaignId:l.campaignId||void 0,status:l.status||void 0,search:l.search||void 0}}),d=Array.isArray(g.data)?g.data:((n=g.data)==null?void 0:n.data)||[];V.value=d,$.value=((e=g.meta)==null?void 0:e.total)||((T=(p=g.data)==null?void 0:p.meta)==null?void 0:T.total)||d.length}finally{x.value=!1}}function K(n){var e,p;c.id=n.id,c.winnerMobile=((e=n.user)==null?void 0:e.mobile)||"",c.prizeTitle=((p=n.prize)==null?void 0:p.title)||"",c.status=n.status||"CONTACTED",c.note=n.note||"",E.value=!0}async function J(){S.value=!0;try{await I.patch(`/admin/user-prizes/${c.id}/status`,{status:c.status,note:c.note||void 0}),z.success("وضعیت جایزه برنده با موفقیت به‌روزرسانی شد."),E.value=!1,_()}catch{}finally{S.value=!1}}async function Q(){D.value=!0;try{const n=await I.get("/admin/user-prizes/export",{params:{campaignId:l.campaignId||void 0,status:l.status||void 0,search:l.search||void 0},responseType:"blob"}),e=window.URL.createObjectURL(new Blob([n.data])),p=document.createElement("a");p.href=e,p.setAttribute("download",`winners-${Date.now()}.xlsx`),document.body.appendChild(p),p.click(),document.body.removeChild(p),window.URL.revokeObjectURL(e),z.success("فایل اکسل برندگان با موفقیت دانلود شد.")}catch{z.error("خطا در دریافت فایل اکسل برندگان")}finally{D.value=!1}}function W(n,e){navigator.clipboard.writeText(n),z.success(`${e} با موفقیت کپی شد.`)}const Z={DIGITAL_CODE:"کد دیجیتال",PHYSICAL:"کالای فیزیکی",DISCOUNT:"کد تخفیف",CASH:"جایزه نقدی",FREE_CHANCE:"شانس مجدد",CUSTOM:"سفارشی"},ee=[{title:"شماره همراه",dataIndex:["user","mobile"],key:"mobile"},{title:"نام کاربر",dataIndex:["user","name"],key:"name"},{title:"کمپین",dataIndex:["campaign","title"],key:"campaign"},{title:"عنوان جایزه",dataIndex:["prize","title"],key:"prizeTitle"},{title:"نوع جایزه",dataIndex:["prize","prizeType"],key:"prizeType"},{title:"کد دیجیتال / پیگیری",dataIndex:"code",key:"code"},{title:"وضعیت پیگیری",dataIndex:"status",key:"status"},{title:"تاریخ برنده شدن",dataIndex:"createdAt",key:"createdAt"},{title:"عملیات",key:"actions",width:70,align:"center"}];function A(n){switch(n){case"NEW":return{text:"جدید",color:"blue",dotColor:"#3b82f6"};case"CONTACTED":return{text:"تماس گرفته شده",color:"orange",dotColor:"#f59e0b"};case"DELIVERED":return{text:"تحویل داده شده",color:"green",dotColor:"#10b981"};case"ACTIVE_CODE":return{text:"کد فعال",color:"cyan",dotColor:"#06b6d4"};case"USED":return{text:"مصرف شده",color:"purple",dotColor:"#8b5cf6"};case"EXPIRED":return{text:"منقضی شده",color:"red",dotColor:"#ef4444"};default:return{text:n,color:"default",dotColor:"#94a3b8"}}}return re(()=>{G(),_()}),(n,e)=>{const p=u("a-button"),T=u("a-space"),g=u("a-input-search"),d=u("a-select-option"),O=u("a-select"),B=u("a-tag"),U=u("a-menu-item"),te=u("a-menu"),ae=u("a-dropdown"),oe=u("a-table"),se=u("a-alert"),F=u("a-form-item"),ne=u("a-textarea"),le=u("a-form"),ie=u("a-modal"),de=u("a-card");return r(),v("div",we,[m("div",xe,[e[11]||(e[11]=m("div",null,[m("h1",{class:"title"},"مدیریت برندگان"),m("p",{class:"subtitle"},"پیگیری، تأیید و تغییر وضعیت اهدای جوایز به برندگان")],-1)),t(T,null,{default:a(()=>[t(p,{onClick:_,loading:x.value},{icon:a(()=>[t(f(pe))]),default:a(()=>[e[9]||(e[9]=i(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),t(p,{type:"primary",loading:D.value,onClick:Q},{icon:a(()=>[t(f(ce))]),default:a(()=>[e[10]||(e[10]=i(" خروجی اکسل برندگان ",-1))]),_:1},8,["loading"])]),_:1})]),t(de,{bordered:!1,class:"main-card"},{default:a(()=>[m("div",Ee,[m("div",Te,[t(g,{value:l.search,"onUpdate:value":e[0]||(e[0]=o=>l.search=o),placeholder:"جستجوی موبایل یا نام...",style:{width:"240px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{l.page=1,_()})},{prefix:a(()=>[t(f(me),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),t(O,{value:l.campaignId,"onUpdate:value":e[2]||(e[2]=o=>l.campaignId=o),placeholder:"فیلتر کمپین",allowClear:"",style:{width:"180px"},onChange:e[3]||(e[3]=()=>{l.page=1,_()})},{default:a(()=>[(r(!0),v(Y,null,fe(M.value,o=>(r(),b(d,{key:o.id,value:o.id},{default:a(()=>[i(y(o.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),t(O,{value:l.status,"onUpdate:value":e[4]||(e[4]=o=>l.status=o),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"160px"},onChange:e[5]||(e[5]=()=>{l.page=1,_()})},{default:a(()=>[t(d,{value:"NEW"},{default:a(()=>[...e[12]||(e[12]=[i("جدید",-1)])]),_:1}),t(d,{value:"CONTACTED"},{default:a(()=>[...e[13]||(e[13]=[i("تماس گرفته شده",-1)])]),_:1}),t(d,{value:"DELIVERED"},{default:a(()=>[...e[14]||(e[14]=[i("تحویل شده",-1)])]),_:1}),t(d,{value:"ACTIVE_CODE"},{default:a(()=>[...e[15]||(e[15]=[i("کد فعال",-1)])]),_:1}),t(d,{value:"USED"},{default:a(()=>[...e[16]||(e[16]=[i("مصرف شده",-1)])]),_:1}),t(d,{value:"EXPIRED"},{default:a(()=>[...e[17]||(e[17]=[i("منقضی شده",-1)])]),_:1})]),_:1},8,["value"])])]),t(oe,{dataSource:V.value,columns:ee,loading:x.value,rowKey:"id",size:"middle",pagination:{current:l.page,pageSize:l.pageSize,total:$.value,showTotal:o=>`مجموع: ${f(L)(o)} برنده`,onChange:o=>{l.page=o,_()}}},{bodyCell:a(({column:o,record:s})=>{var P,j,H,X;return[o.key==="mobile"?(r(),v("span",{key:0,class:"mobile-cell user-link",onClick:C=>s.userId?f(N).push(`/users/${s.userId}`):null},y(f(L)((P=s.user)==null?void 0:P.mobile)),9,Ie)):o.key==="name"?(r(),v("span",ze,y(((j=s.user)==null?void 0:j.name)||"—"),1)):o.key==="campaign"?(r(),v("span",De,y(((H=s.campaign)==null?void 0:H.title)||"—"),1)):o.key==="prizeTitle"?(r(),v("span",Se,y((X=s.prize)==null?void 0:X.title),1)):o.key==="prizeType"?(r(),b(B,{key:4},{default:a(()=>{var C,w;return[i(y(Z[(C=s.prize)==null?void 0:C.prizeType]||((w=s.prize)==null?void 0:w.prizeType)||"—"),1)]}),_:2},1024)):o.key==="code"?(r(),v(Y,{key:5},[s.code?(r(),v("code",{key:0,class:"code-badge clickable-code",title:"برای کپی کلیک کنید",onClick:C=>W(s.code,"کد جایزه")},y(s.code),9,Ae)):(r(),v("span",Oe,"—"))],64)):o.key==="status"?(r(),b(B,{key:6,color:A(s.status).color,class:"status-tag"},{default:a(()=>[m("span",{class:"status-dot",style:ve({backgroundColor:A(s.status).dotColor})},null,4),i(" "+y(A(s.status).text),1)]),_:2},1032,["color"])):o.key==="createdAt"?(r(),v("span",Ue,y(f(L)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):o.key==="actions"?(r(),b(ae,{key:8,trigger:["click"],placement:"bottomLeft"},{overlay:a(()=>[t(te,{class:"action-dropdown-menu"},{default:a(()=>{var C;return[t(U,{key:"status",onClick:w=>K(s)},{default:a(()=>[m("div",Le,[t(f(ye),{class:"dropdown-item-icon"}),e[18]||(e[18]=m("span",null,"تغییر وضعیت پیگیری",-1))])]),_:1},8,["onClick"]),s.userId||(C=s.user)!=null&&C.id?(r(),b(U,{key:"user",onClick:w=>{var h;return f(N).push(`/users/${s.userId||((h=s.user)==null?void 0:h.id)}`)}},{default:a(()=>[m("div",Re,[t(f(_e),{class:"dropdown-item-icon"}),e[19]||(e[19]=m("span",null,"پروفایل کاربر",-1))])]),_:1},8,["onClick"])):R("",!0),s.code?(r(),b(U,{key:"copy",onClick:w=>W(s.code,"کد جایزه")},{default:a(()=>[m("div",Ne,[t(f(ge),{class:"dropdown-item-icon"}),e[20]||(e[20]=m("span",null,"کپی کد دیجیتال",-1))])]),_:1},8,["onClick"])):R("",!0)]}),_:2},1024)]),default:a(()=>[t(p,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:a(()=>[t(f(be),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):R("",!0)]}),_:1},8,["dataSource","loading","pagination"]),t(ie,{open:E.value,"onUpdate:open":e[8]||(e[8]=o=>E.value=o),title:"تغییر وضعیت پیگیری جایزه برنده",confirmLoading:S.value,okText:"ثبت تغییر وضعیت",cancelText:"انصراف",onOk:J},{default:a(()=>[t(le,{layout:"vertical"},{default:a(()=>[t(se,{message:`برنده: ${c.winnerMobile} | جایزه: ${c.prizeTitle}`,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"]),t(F,{label:"وضعیت جدید",required:""},{default:a(()=>[t(O,{value:c.status,"onUpdate:value":e[6]||(e[6]=o=>c.status=o)},{default:a(()=>[t(d,{value:"NEW"},{default:a(()=>[...e[21]||(e[21]=[i("جدید",-1)])]),_:1}),t(d,{value:"CONTACTED"},{default:a(()=>[...e[22]||(e[22]=[i("تماس گرفته شده (هماهنگی آدرس)",-1)])]),_:1}),t(d,{value:"DELIVERED"},{default:a(()=>[...e[23]||(e[23]=[i("ارسال و تحویل شد",-1)])]),_:1}),t(d,{value:"ACTIVE_CODE"},{default:a(()=>[...e[24]||(e[24]=[i("کد دیجیتال فعال",-1)])]),_:1}),t(d,{value:"USED"},{default:a(()=>[...e[25]||(e[25]=[i("کد مصرف شد",-1)])]),_:1}),t(d,{value:"EXPIRED"},{default:a(()=>[...e[26]||(e[26]=[i("منقضی شد",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(F,{label:"یادداشت و توضیحات پیگیری"},{default:a(()=>[t(ne,{value:c.note,"onUpdate:value":e[7]||(e[7]=o=>c.note=o),rows:"3",placeholder:"مثال: کد رهگیری پست: 123456789 یا هماهنگی با کاربر"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})])}}}),Fe=ke(Ve,[["__scopeId","data-v-b623e0ea"]]);export{Fe as default}; +import{t as L}from"./farsi-number-stB7JMN0.js";import{d as ue,j as re,a as v,b as m,c as t,w as a,m as I,r as u,h as k,g as q,o as r,f as i,e as f,R as pe,Y as ce,S as me,F as Y,x as fe,t as y,s as b,D as ve,E as ye,U as _e,q as R,C as ge,i as Ce,y as z,_ as ke}from"./index-iu4REYcj.js";import{M as be}from"./MoreOutlined-B9LhmUnJ.js";const we={class:"winner-list-page"},xe={class:"page-header-title"},Ee={class:"table-header"},Te={class:"filters"},Ie=["onClick"],ze={key:1,class:"user-name"},De={key:2,class:"campaign-cell"},Se={key:3,class:"prize-text"},Ae=["onClick"],Oe={key:1,class:"text-muted"},Ue={key:7,class:"date-cell"},Le={class:"dropdown-action-item"},Re={class:"dropdown-action-item"},Ne={class:"dropdown-action-item"},Ve=ue({__name:"WinnerListView",setup($e){const N=Ce(),x=k(!1),D=k(!1),V=k([]),$=k(0),M=k([]),l=q({page:1,pageSize:10,campaignId:void 0,status:void 0,search:""}),E=k(!1),S=k(!1),c=q({id:"",winnerMobile:"",prizeTitle:"",status:"CONTACTED",note:""});async function G(){var n;try{const e=await I.get("/admin/campaigns",{params:{pageSize:100}});M.value=Array.isArray(e.data)?e.data:((n=e.data)==null?void 0:n.data)||[]}catch{}}async function _(){var n,e,p,T;x.value=!0;try{const g=await I.get("/admin/user-prizes",{params:{page:l.page,pageSize:l.pageSize,campaignId:l.campaignId||void 0,status:l.status||void 0,search:l.search||void 0}}),d=Array.isArray(g.data)?g.data:((n=g.data)==null?void 0:n.data)||[];V.value=d,$.value=((e=g.meta)==null?void 0:e.total)||((T=(p=g.data)==null?void 0:p.meta)==null?void 0:T.total)||d.length}finally{x.value=!1}}function K(n){var e,p;c.id=n.id,c.winnerMobile=((e=n.user)==null?void 0:e.mobile)||"",c.prizeTitle=((p=n.prize)==null?void 0:p.title)||"",c.status=n.status||"CONTACTED",c.note=n.note||"",E.value=!0}async function J(){S.value=!0;try{await I.patch(`/admin/user-prizes/${c.id}/status`,{status:c.status,note:c.note||void 0}),z.success("وضعیت جایزه برنده با موفقیت به‌روزرسانی شد."),E.value=!1,_()}catch{}finally{S.value=!1}}async function Q(){D.value=!0;try{const n=await I.get("/admin/user-prizes/export",{params:{campaignId:l.campaignId||void 0,status:l.status||void 0,search:l.search||void 0},responseType:"blob"}),e=window.URL.createObjectURL(new Blob([n.data])),p=document.createElement("a");p.href=e,p.setAttribute("download",`winners-${Date.now()}.xlsx`),document.body.appendChild(p),p.click(),document.body.removeChild(p),window.URL.revokeObjectURL(e),z.success("فایل اکسل برندگان با موفقیت دانلود شد.")}catch{z.error("خطا در دریافت فایل اکسل برندگان")}finally{D.value=!1}}function W(n,e){navigator.clipboard.writeText(n),z.success(`${e} با موفقیت کپی شد.`)}const Z={DIGITAL_CODE:"کد دیجیتال",PHYSICAL:"کالای فیزیکی",DISCOUNT:"کد تخفیف",CASH:"جایزه نقدی",FREE_CHANCE:"شانس مجدد",CUSTOM:"سفارشی"},ee=[{title:"شماره همراه",dataIndex:["user","mobile"],key:"mobile"},{title:"نام کاربر",dataIndex:["user","name"],key:"name"},{title:"کمپین",dataIndex:["campaign","title"],key:"campaign"},{title:"عنوان جایزه",dataIndex:["prize","title"],key:"prizeTitle"},{title:"نوع جایزه",dataIndex:["prize","prizeType"],key:"prizeType"},{title:"کد دیجیتال / پیگیری",dataIndex:"code",key:"code"},{title:"وضعیت پیگیری",dataIndex:"status",key:"status"},{title:"تاریخ برنده شدن",dataIndex:"createdAt",key:"createdAt"},{title:"عملیات",key:"actions",width:70,align:"center"}];function A(n){switch(n){case"NEW":return{text:"جدید",color:"blue",dotColor:"#3b82f6"};case"CONTACTED":return{text:"تماس گرفته شده",color:"orange",dotColor:"#f59e0b"};case"DELIVERED":return{text:"تحویل داده شده",color:"green",dotColor:"#10b981"};case"ACTIVE_CODE":return{text:"کد فعال",color:"cyan",dotColor:"#06b6d4"};case"USED":return{text:"مصرف شده",color:"purple",dotColor:"#8b5cf6"};case"EXPIRED":return{text:"منقضی شده",color:"red",dotColor:"#ef4444"};default:return{text:n,color:"default",dotColor:"#94a3b8"}}}return re(()=>{G(),_()}),(n,e)=>{const p=u("a-button"),T=u("a-space"),g=u("a-input-search"),d=u("a-select-option"),O=u("a-select"),B=u("a-tag"),U=u("a-menu-item"),te=u("a-menu"),ae=u("a-dropdown"),oe=u("a-table"),se=u("a-alert"),F=u("a-form-item"),ne=u("a-textarea"),le=u("a-form"),ie=u("a-modal"),de=u("a-card");return r(),v("div",we,[m("div",xe,[e[11]||(e[11]=m("div",null,[m("h1",{class:"title"},"مدیریت برندگان"),m("p",{class:"subtitle"},"پیگیری، تأیید و تغییر وضعیت اهدای جوایز به برندگان")],-1)),t(T,null,{default:a(()=>[t(p,{onClick:_,loading:x.value},{icon:a(()=>[t(f(pe))]),default:a(()=>[e[9]||(e[9]=i(" به‌روزرسانی ",-1))]),_:1},8,["loading"]),t(p,{type:"primary",loading:D.value,onClick:Q},{icon:a(()=>[t(f(ce))]),default:a(()=>[e[10]||(e[10]=i(" خروجی اکسل برندگان ",-1))]),_:1},8,["loading"])]),_:1})]),t(de,{bordered:!1,class:"main-card"},{default:a(()=>[m("div",Ee,[m("div",Te,[t(g,{value:l.search,"onUpdate:value":e[0]||(e[0]=o=>l.search=o),placeholder:"جستجوی موبایل یا نام...",style:{width:"240px"},allowClear:"",onSearch:e[1]||(e[1]=()=>{l.page=1,_()})},{prefix:a(()=>[t(f(me),{style:{color:"#94a3b8","margin-left":"4px"}})]),_:1},8,["value"]),t(O,{value:l.campaignId,"onUpdate:value":e[2]||(e[2]=o=>l.campaignId=o),placeholder:"فیلتر کمپین",allowClear:"",style:{width:"180px"},onChange:e[3]||(e[3]=()=>{l.page=1,_()})},{default:a(()=>[(r(!0),v(Y,null,fe(M.value,o=>(r(),b(d,{key:o.id,value:o.id},{default:a(()=>[i(y(o.title),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),t(O,{value:l.status,"onUpdate:value":e[4]||(e[4]=o=>l.status=o),placeholder:"فیلتر وضعیت",allowClear:"",style:{width:"160px"},onChange:e[5]||(e[5]=()=>{l.page=1,_()})},{default:a(()=>[t(d,{value:"NEW"},{default:a(()=>[...e[12]||(e[12]=[i("جدید",-1)])]),_:1}),t(d,{value:"CONTACTED"},{default:a(()=>[...e[13]||(e[13]=[i("تماس گرفته شده",-1)])]),_:1}),t(d,{value:"DELIVERED"},{default:a(()=>[...e[14]||(e[14]=[i("تحویل شده",-1)])]),_:1}),t(d,{value:"ACTIVE_CODE"},{default:a(()=>[...e[15]||(e[15]=[i("کد فعال",-1)])]),_:1}),t(d,{value:"USED"},{default:a(()=>[...e[16]||(e[16]=[i("مصرف شده",-1)])]),_:1}),t(d,{value:"EXPIRED"},{default:a(()=>[...e[17]||(e[17]=[i("منقضی شده",-1)])]),_:1})]),_:1},8,["value"])])]),t(oe,{dataSource:V.value,columns:ee,loading:x.value,rowKey:"id",size:"middle",pagination:{current:l.page,pageSize:l.pageSize,total:$.value,showTotal:o=>`مجموع: ${f(L)(o)} برنده`,onChange:o=>{l.page=o,_()}}},{bodyCell:a(({column:o,record:s})=>{var P,j,H,X;return[o.key==="mobile"?(r(),v("span",{key:0,class:"mobile-cell user-link",onClick:C=>s.userId?f(N).push(`/users/${s.userId}`):null},y(f(L)((P=s.user)==null?void 0:P.mobile)),9,Ie)):o.key==="name"?(r(),v("span",ze,y(((j=s.user)==null?void 0:j.name)||"—"),1)):o.key==="campaign"?(r(),v("span",De,y(((H=s.campaign)==null?void 0:H.title)||"—"),1)):o.key==="prizeTitle"?(r(),v("span",Se,y((X=s.prize)==null?void 0:X.title),1)):o.key==="prizeType"?(r(),b(B,{key:4},{default:a(()=>{var C,w;return[i(y(Z[(C=s.prize)==null?void 0:C.prizeType]||((w=s.prize)==null?void 0:w.prizeType)||"—"),1)]}),_:2},1024)):o.key==="code"?(r(),v(Y,{key:5},[s.code?(r(),v("code",{key:0,class:"code-badge clickable-code",title:"برای کپی کلیک کنید",onClick:C=>W(s.code,"کد جایزه")},y(s.code),9,Ae)):(r(),v("span",Oe,"—"))],64)):o.key==="status"?(r(),b(B,{key:6,color:A(s.status).color,class:"status-tag"},{default:a(()=>[m("span",{class:"status-dot",style:ve({backgroundColor:A(s.status).dotColor})},null,4),i(" "+y(A(s.status).text),1)]),_:2},1032,["color"])):o.key==="createdAt"?(r(),v("span",Ue,y(f(L)(new Date(s.createdAt).toLocaleString("fa-IR"))),1)):o.key==="actions"?(r(),b(ae,{key:8,trigger:["click"],placement:"bottomLeft"},{overlay:a(()=>[t(te,{class:"action-dropdown-menu"},{default:a(()=>{var C;return[t(U,{key:"status",onClick:w=>K(s)},{default:a(()=>[m("div",Le,[t(f(ye),{class:"dropdown-item-icon"}),e[18]||(e[18]=m("span",null,"تغییر وضعیت پیگیری",-1))])]),_:1},8,["onClick"]),s.userId||(C=s.user)!=null&&C.id?(r(),b(U,{key:"user",onClick:w=>{var h;return f(N).push(`/users/${s.userId||((h=s.user)==null?void 0:h.id)}`)}},{default:a(()=>[m("div",Re,[t(f(_e),{class:"dropdown-item-icon"}),e[19]||(e[19]=m("span",null,"پروفایل کاربر",-1))])]),_:1},8,["onClick"])):R("",!0),s.code?(r(),b(U,{key:"copy",onClick:w=>W(s.code,"کد جایزه")},{default:a(()=>[m("div",Ne,[t(f(ge),{class:"dropdown-item-icon"}),e[20]||(e[20]=m("span",null,"کپی کد دیجیتال",-1))])]),_:1},8,["onClick"])):R("",!0)]}),_:2},1024)]),default:a(()=>[t(p,{type:"text",shape:"circle",class:"action-more-btn",title:"عملیات"},{default:a(()=>[t(f(be),{style:{"font-size":"18px"}})]),_:1})]),_:2},1024)):R("",!0)]}),_:1},8,["dataSource","loading","pagination"]),t(ie,{open:E.value,"onUpdate:open":e[8]||(e[8]=o=>E.value=o),title:"تغییر وضعیت پیگیری جایزه برنده",confirmLoading:S.value,okText:"ثبت تغییر وضعیت",cancelText:"انصراف",onOk:J},{default:a(()=>[t(le,{layout:"vertical"},{default:a(()=>[t(se,{message:`برنده: ${c.winnerMobile} | جایزه: ${c.prizeTitle}`,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"]),t(F,{label:"وضعیت جدید",required:""},{default:a(()=>[t(O,{value:c.status,"onUpdate:value":e[6]||(e[6]=o=>c.status=o)},{default:a(()=>[t(d,{value:"NEW"},{default:a(()=>[...e[21]||(e[21]=[i("جدید",-1)])]),_:1}),t(d,{value:"CONTACTED"},{default:a(()=>[...e[22]||(e[22]=[i("تماس گرفته شده (هماهنگی آدرس)",-1)])]),_:1}),t(d,{value:"DELIVERED"},{default:a(()=>[...e[23]||(e[23]=[i("ارسال و تحویل شد",-1)])]),_:1}),t(d,{value:"ACTIVE_CODE"},{default:a(()=>[...e[24]||(e[24]=[i("کد دیجیتال فعال",-1)])]),_:1}),t(d,{value:"USED"},{default:a(()=>[...e[25]||(e[25]=[i("کد مصرف شد",-1)])]),_:1}),t(d,{value:"EXPIRED"},{default:a(()=>[...e[26]||(e[26]=[i("منقضی شد",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(F,{label:"یادداشت و توضیحات پیگیری"},{default:a(()=>[t(ne,{value:c.note,"onUpdate:value":e[7]||(e[7]=o=>c.note=o),rows:"3",placeholder:"مثال: کد رهگیری پست: 123456789 یا هماهنگی با کاربر"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})])}}}),Fe=ke(Ve,[["__scopeId","data-v-b623e0ea"]]);export{Fe as default}; diff --git a/apps/admin/dist/assets/index-Dx9ODHpC.js b/apps/admin/dist/assets/index-iu4REYcj.js similarity index 99% rename from apps/admin/dist/assets/index-Dx9ODHpC.js rename to apps/admin/dist/assets/index-iu4REYcj.js index ef54d7f..2c05678 100644 --- a/apps/admin/dist/assets/index-Dx9ODHpC.js +++ b/apps/admin/dist/assets/index-iu4REYcj.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-Bp7KAPzQ.js","assets/LockOutlined-ihCI0sD8.js","assets/LoginView-Bbw7jGtv.css","assets/DashboardView-B1JpTeJR.js","assets/farsi-number-stB7JMN0.js","assets/PlusCircleOutlined-46hEPOWa.js","assets/TeamOutlined-D0tX_kEo.js","assets/GiftOutlined-B8oIapKF.js","assets/DashboardView-ButQruRh.css","assets/CampaignListView-Czzgz98v.js","assets/MoreOutlined-BVlNw6dC.js","assets/PauseCircleOutlined-Bifiy1P2.js","assets/CampaignListView-vbWsx4Hh.css","assets/CampaignFormView-COR08E-o.js","assets/UploadOutlined-Byko1TmG.js","assets/CampaignFormView-BZrQh5q2.css","assets/PrizeListView-DVU9hmdY.js","assets/PrizeListView-BGBJ3pZ7.css","assets/UserListView-CUMm4H4J.js","assets/UserListView-CulU6O7K.css","assets/UserDetailView-CkEjSYSH.js","assets/UserDetailView-D6JtGOSO.css","assets/SpinListView-WIkO8yaF.js","assets/SpinListView-C9JGpa2K.css","assets/WinnerListView-FE9kM-NV.js","assets/WinnerListView-C6VCoyx1.css","assets/SmsLogListView-Dzz9zkVI.js","assets/SmsLogListView-DxBDhwbh.css","assets/ReportView-CKpII8Mv.js","assets/ReportView-B9vUeUVV.css","assets/AuditLogView-DlV2c1uL.js","assets/AuditLogView-BNOFR0wt.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-DcnnMjq0.js","assets/LockOutlined-NIokxtdn.js","assets/LoginView-Bbw7jGtv.css","assets/DashboardView-po4OVtHF.js","assets/farsi-number-stB7JMN0.js","assets/PlusCircleOutlined-D0DwpFnG.js","assets/TeamOutlined-BXroJ-y-.js","assets/GiftOutlined-Du5L-j2h.js","assets/DashboardView-ButQruRh.css","assets/CampaignListView-CLT23C_L.js","assets/MoreOutlined-B9LhmUnJ.js","assets/PauseCircleOutlined-MyjHwEZJ.js","assets/CampaignListView-vbWsx4Hh.css","assets/CampaignFormView-OBaKvIJ_.js","assets/UploadOutlined-C2J5ghkD.js","assets/CampaignFormView-BZrQh5q2.css","assets/PrizeListView-C4OunB6P.js","assets/PrizeListView-BGBJ3pZ7.css","assets/UserListView-DkY1i72N.js","assets/UserListView-CulU6O7K.css","assets/UserDetailView-_Osv-8R9.js","assets/UserDetailView-D6JtGOSO.css","assets/SpinListView-CL9S5010.js","assets/SpinListView-C9JGpa2K.css","assets/WinnerListView-ttRyORJt.js","assets/WinnerListView-C6VCoyx1.css","assets/SmsLogListView-BQrgELdy.js","assets/SmsLogListView-DxBDhwbh.css","assets/ReportView-Bsg1kGeu.js","assets/ReportView-B9vUeUVV.css","assets/AuditLogView-DUQqTRnR.js","assets/AuditLogView-BNOFR0wt.css"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&o(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();function Tc(e){"@babel/helpers - typeof";return Tc=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Tc(e)}function gA(e,t){if(Tc(e)!="object"||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var o=n.call(e,t);if(Tc(o)!="object")return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function vA(e){var t=gA(e,"string");return Tc(t)=="symbol"?t:t+""}function mA(e,t,n){return(t=vA(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i$(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),n.push.apply(n,o)}return n}function D(e){for(var t=1;t{delete i[v]}),n.headers=Bn.concat(l,i);const a=[];let s=!0;this.interceptors.request.forEach(function(g){if(typeof g.runWhen=="function"&&g.runWhen(n)===!1)return;s=s&&g.synchronous;const y=n.transitional||GS;y&&y.legacyInterceptorReqResOrdering?a.unshift(g.fulfilled,g.rejected):a.push(g.fulfilled,g.rejected)});const c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let u,d=0,f;if(!s){const v=[cm.bind(this),void 0];for(v.unshift(...a),v.push(...c),f=v.length,u=Promise.resolve(n);dcm.call(this,h)))}catch(b){u=Promise.reject(b)}break}}if(!u)try{u=cm.call(this,h)}catch(v){u=Promise.reject(v)}for(d=0,f=c.length;d{if(!o._listeners)return;let i=o._listeners.length;for(;i-- >0;)o._listeners[i](r);o._listeners=null}),this.promise.then=r=>{let i;const l=new Promise(a=>{o.subscribe(a),i=a}).then(r);return l.cancel=function(){o.unsubscribe(i)},l},t(function(i,l,a){o.reason||(o.reason=new ku(i,l,a),n(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=o=>{t.abort(o)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new eA(function(r){t=r}),cancel:t}}};function rme(e){return function(n){return e.apply(null,n)}}function ime(e){return ve.isObject(e)&&e.isAxiosError===!0}const yf={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(yf).forEach(([e,t])=>{yf[t]===void 0&&(yf[t]=e)});function tA(e){const t=new zl(e),n=OM(zl.prototype.request,t);return ve.extend(n,zl.prototype,t,{allOwnKeys:!0}),ve.extend(n,t,null,{allOwnKeys:!0}),n.create=function(r){return tA(Ql(e,r))},n}const Yt=tA(Fu);Yt.Axios=zl;Yt.CanceledError=ku;Yt.CancelToken=ome;Yt.isCancel=UM;Yt.VERSION=YS;Yt.toFormData=hg;Yt.AxiosError=Le;Yt.Cancel=Yt.CanceledError;Yt.all=function(t){return Promise.all(t)};Yt.spread=rme;Yt.isAxiosError=ime;Yt.mergeConfig=Ql;Yt.AxiosHeaders=Bn;Yt.formToJSON=e=>WM(ve.isHTMLForm(e)?new FormData(e):e);Yt.getAdapter=QM.getAdapter;Yt.HttpStatusCode=yf;Yt.default=Yt;const{Axios:Gme,AxiosError:Xme,CanceledError:Yme,isCancel:qme,CancelToken:Zme,VERSION:Jme,all:Qme,Cancel:e0e,isAxiosError:t0e,spread:n0e,toFormData:o0e,AxiosHeaders:r0e,HttpStatusCode:i0e,formToJSON:l0e,getAdapter:a0e,mergeConfig:s0e,create:c0e}=Yt,nA="https://api.wheel.montzar.ir/api",ki=Yt.create({baseURL:nA,headers:{"Content-Type":"application/json"}});ki.interceptors.request.use(e=>{const t=localStorage.getItem("admin_access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e));let um=!1,ib=[];const CO=(e,t=null)=>{ib.forEach(n=>{e?n.reject(e):n.resolve(t)}),ib=[]};ki.interceptors.response.use(e=>{if(e.data instanceof Blob)return e;if(e.data&&typeof e.data=="object"){if("success"in e.data&&"data"in e.data)return{...e,data:e.data.data,meta:e.data.meta};if("data"in e.data&&"meta"in e.data)return{...e,data:e.data.data,meta:e.data.meta}}return e},async e=>{var o,r,i,l,a,s,c,u,d,f,h;const t=e.config;if(((o=e.response)==null?void 0:o.status)===401&&!t._retry){if((r=t.url)!=null&&r.includes("/admin/auth/login")||(i=t.url)!=null&&i.includes("/admin/auth/refresh"))return Promise.reject(e);if(um)return new Promise((g,y)=>{ib.push({resolve:g,reject:y})}).then(g=>(t.headers.Authorization=`Bearer ${g}`,ki(t))).catch(g=>Promise.reject(g));t._retry=!0,um=!0;const v=localStorage.getItem("admin_refresh_token");if(!v)return localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_info"),window.location.href="/login",Promise.reject(e);try{const{data:g}=await Yt.post(`${nA}/admin/auth/refresh`,{refreshToken:v}),y=((l=g.data)==null?void 0:l.accessToken)||g.accessToken;return localStorage.setItem("admin_access_token",y),ki.defaults.headers.common.Authorization=`Bearer ${y}`,CO(null,y),ki(t)}catch(g){return CO(g,null),localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_refresh_token"),localStorage.removeItem("admin_info"),window.location.href="/login",Promise.reject(g)}finally{um=!1}}const n=((s=(a=e.response)==null?void 0:a.data)==null?void 0:s.message)||(Array.isArray((u=(c=e.response)==null?void 0:c.data)==null?void 0:u.message)?(f=(d=e.response)==null?void 0:d.data)==null?void 0:f.message.join(" - "):"خطایی در ارتباط با سرور رخ داده است.");return((h=e.response)==null?void 0:h.status)!==401&&lo.error(n),Promise.reject(e)});const oA=Dpe("adminAuth",()=>{const e=le(localStorage.getItem("admin_access_token")),t=le(localStorage.getItem("admin_info")?JSON.parse(localStorage.getItem("admin_info")):null),n=le(!1),o=I(()=>!!e.value);async function r(a){n.value=!0;try{const c=(await ki.post("/admin/auth/login",a)).data;return e.value=c.accessToken,t.value=c.admin,localStorage.setItem("admin_access_token",c.accessToken),localStorage.setItem("admin_refresh_token",c.refreshToken),localStorage.setItem("admin_info",JSON.stringify(c.admin)),c}finally{n.value=!1}}async function i(){try{await ki.post("/admin/auth/logout")}catch{}finally{e.value=null,t.value=null,localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_refresh_token"),localStorage.removeItem("admin_info")}}async function l(a){n.value=!0;try{const s=await ki.patch("/admin/auth/profile",a);return t.value=s.data,localStorage.setItem("admin_info",JSON.stringify(s.data)),s.data}finally{n.value=!1}}return{token:e,admin:t,loading:n,isAuthenticated:o,login:r,logout:i,updateProfile:l}}),lme={class:"logo-box"},ame={key:0,class:"logo-text"},sme={key:0,class:"search-container"},cme={class:"search-bar"},ume={class:"menu-scroll-wrap"},dme={class:"sider-nav"},fme={key:0,class:"nav-group"},pme={key:0,class:"nav-group-header"},hme={class:"nav-group-items"},gme=["onClick"],vme={key:0,class:"nav-link-text"},mme={key:1,class:"nav-group nav-group-secondary"},bme={key:0,class:"nav-group-header"},yme={class:"nav-group-items"},Sme=["onClick"],$me={key:0,class:"nav-link-text"},Cme={key:2,class:"empty-search-text"},xme={class:"header-right"},wme={class:"user-profile-trigger"},Ome={class:"user-info-text"},Pme={class:"user-name"},Ime={class:"user-role-label"},Tme={class:"dropdown-user-card"},Eme={class:"card-avatar-wrap"},_me={class:"card-text"},Mme={class:"card-name"},Ame={class:"card-sub"},Rme={class:"card-badge-row"},Dme={class:"dropdown-menu-item"},Nme={class:"dropdown-menu-item text-danger"},Bme=re({__name:"AdminLayout",setup(e){const t=Yhe(),n=Xhe(),o=oA(),r=le(!1),i=le([t.name||"dashboard"]),l=le(""),a=[{key:"dashboard",label:"داشبورد آماری",icon:AS,path:"/dashboard"},{key:"campaigns",label:"مدیریت کمپین‌ها",icon:FS,path:"/campaigns"},{key:"users",label:"مدیریت کاربران",icon:wc,path:"/users"},{key:"winners",label:"مدیریت برندگان",icon:kS,path:"/winners"},{key:"spins",label:"تاریخچه اسپین‌ها",icon:cg,path:"/spins"}],s=[{key:"sms",label:"لاگ‌های پیامک",icon:LS,path:"/sms"},{key:"reports",label:"گزارش‌ها و KPI",icon:RS,path:"/reports"},{key:"audit",label:"لاگ بازرسی (Audit)",icon:MS,path:"/audit"}],c=I(()=>{if(!l.value.trim())return a;const x=l.value.toLowerCase().trim();return a.filter(C=>C.label.toLowerCase().includes(x))}),u=I(()=>{if(!l.value.trim())return s;const x=l.value.toLowerCase().trim();return s.filter(C=>C.label.toLowerCase().includes(x))});function d(x){i.value=[x.key],n.push(x.path)}Se(()=>t.name,x=>{x&&(i.value=[x])});const f=I(()=>{var x;return((x=o.admin)==null?void 0:x.name)||"مدیر سیستم"}),h=I(()=>{var x;return((x=o.admin)==null?void 0:x.role)||"OPERATOR"}),v=le(!1),g=le(!1),y=ut({name:"",mobile:"",email:"",password:""});function b(){var x,C,O;y.name=((x=o.admin)==null?void 0:x.name)||"",y.mobile=((C=o.admin)==null?void 0:C.mobile)||"",y.email=((O=o.admin)==null?void 0:O.email)||"",y.password="",v.value=!0}async function S(){var x,C;if(!y.name.trim()){lo.error("لطفاً نام و نام خانوادگی را وارد کنید.");return}if(!y.mobile.trim()||!/^09\d{9}$/.test(y.mobile.trim())){lo.error("شماره موبایل باید ۱۱ رقمی باشد و با ۰۹ شروع شود.");return}if(!y.email.trim()){lo.error("لطفاً ایمیل را وارد کنید.");return}if(y.password&&y.password.length<6){lo.error("کلمه عبور جدید باید حداقل ۶ کاراکتر باشد.");return}g.value=!0;try{const O={name:y.name.trim(),mobile:y.mobile.trim(),email:y.email.trim()};y.password&&(O.password=y.password),await o.updateProfile(O),lo.success("اطلاعات کاربر با موفقیت به‌روزرسانی شد."),v.value=!1}catch(O){const w=((C=(x=O==null?void 0:O.response)==null?void 0:x.data)==null?void 0:C.message)||"خطا در ویرایش اطلاعات کاربر.";lo.error(typeof w=="string"?w:"اطلاعات وارد شده نامعتبر است.")}finally{g.value=!1}}function $(){cn.confirm({title:"خروج از حساب کاربری",icon:p(bu),content:"آیا اطمینان دارید که می‌خواهید از پنل مدیریت خارج شوید؟",okText:"خروج",cancelText:"انصراف",okButtonProps:{danger:!0},onOk:async()=>{await o.logout(),n.push("/login")}})}return(x,C)=>{const O=Jt("a-tooltip"),w=Jt("a-layout-sider"),P=Jt("a-avatar"),T=Jt("a-tag"),M=Jt("a-menu-divider"),E=Jt("a-menu-item"),A=Jt("a-menu"),R=Jt("a-dropdown"),k=Jt("a-layout-header"),_=Jt("router-view"),N=Jt("a-layout-content"),B=Jt("a-layout"),L=Jt("a-input"),F=Jt("a-form-item"),z=Jt("a-col"),H=Jt("a-row"),j=Jt("a-input-password"),Y=Jt("a-form"),Z=Jt("a-modal");return Wt(),Wr(B,{style:{"min-height":"100vh"}},{default:It(()=>[p(w,{collapsed:r.value,"onUpdate:collapsed":C[5]||(C[5]=G=>r.value=G),trigger:null,collapsible:"",width:236,collapsedWidth:72,theme:"light",class:"app-sider"},{default:It(()=>[vt("div",lme,[vt("div",{class:"brand-wrap",onClick:C[0]||(C[0]=G=>mt(n).push("/dashboard"))},[C[11]||(C[11]=vt("div",{class:"logo-emblem"},[vt("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[vt("rect",{width:"24",height:"24",rx:"6",fill:"url(#brandGrad)"}),vt("circle",{cx:"12",cy:"12",r:"7.5",stroke:"white","stroke-width":"1.8","stroke-dasharray":"3 2"}),vt("path",{d:"M12 4.5V12L16.5 7.5",stroke:"white","stroke-width":"1.8","stroke-linecap":"round"}),vt("circle",{cx:"12",cy:"12",r:"2",fill:"white"}),vt("defs",null,[vt("linearGradient",{id:"brandGrad",x1:"0",y1:"0",x2:"24",y2:"24",gradientUnits:"userSpaceOnUse"},[vt("stop",{"stop-color":"#7c3aed"}),vt("stop",{offset:"1","stop-color":"#4f46e5"})])])])],-1)),r.value?er("",!0):(Wt(),fo("h2",ame,"گردونه شانس"))]),r.value?(Wt(),fo("button",{key:1,type:"button",class:"sider-collapse-btn collapsed-toggle",title:"باز کردن سایدبار",onClick:C[2]||(C[2]=G=>r.value=!r.value)},[p(mt(BS))])):(Wt(),fo("button",{key:0,type:"button",class:"sider-collapse-btn",title:"بستن سایدبار",onClick:C[1]||(C[1]=G=>r.value=!r.value)},[p(mt(NS))]))]),r.value?er("",!0):(Wt(),fo("div",sme,[vt("div",cme,[p(mt(sa),{class:"search-bar-icon"}),In(vt("input",{"onUpdate:modelValue":C[3]||(C[3]=G=>l.value=G),type:"text",placeholder:"جستجو در منو...",class:"search-bar-input"},null,512),[[LR,l.value]]),l.value?(Wt(),Wr(mt(yu),{key:0,class:"clear-search-icon",onClick:C[4]||(C[4]=G=>l.value="")})):er("",!0)])])),vt("div",ume,[vt("nav",dme,[c.value.length>0?(Wt(),fo("div",fme,[r.value?er("",!0):(Wt(),fo("div",pme,"اصلی")),vt("div",hme,[(Wt(!0),fo(Ke,null,m$(c.value,G=>(Wt(),Wr(O,{key:G.key,title:r.value?G.label:"",placement:"left"},{default:It(()=>[vt("div",{class:Ec(["nav-link-item",{"is-active":i.value.includes(G.key)}]),onClick:te=>d(G)},[(Wt(),Wr(Eg(G.icon),{class:"nav-link-icon"})),r.value?er("",!0):(Wt(),fo("span",vme,jr(G.label),1))],10,gme)]),_:2},1032,["title"]))),128))])])):er("",!0),u.value.length>0?(Wt(),fo("div",mme,[r.value?er("",!0):(Wt(),fo("div",bme,"سیستم و ابزارها")),vt("div",yme,[(Wt(!0),fo(Ke,null,m$(u.value,G=>(Wt(),Wr(O,{key:G.key,title:r.value?G.label:"",placement:"left"},{default:It(()=>[vt("div",{class:Ec(["nav-link-item",{"is-active":i.value.includes(G.key)}]),onClick:te=>d(G)},[(Wt(),Wr(Eg(G.icon),{class:"nav-link-icon"})),r.value?er("",!0):(Wt(),fo("span",$me,jr(G.label),1))],10,Sme)]),_:2},1032,["title"]))),128))])])):er("",!0),!r.value&&c.value.length===0&&u.value.length===0?(Wt(),fo("div",Cme," موردی یافت نشد ")):er("",!0)])])]),_:1},8,["collapsed"]),p(B,null,{default:It(()=>[p(k,{class:"app-header"},{default:It(()=>[C[14]||(C[14]=vt("div",{class:"header-left"},[vt("span",{class:"header-title"},"سامانه مدیریت گردونه شانس")],-1)),vt("div",xme,[p(R,{trigger:["click"],placement:"bottomLeft",overlayClassName:"admin-user-dropdown-popover"},{overlay:It(()=>[p(A,{class:"user-dropdown-menu"},{default:It(()=>{var G,te;return[vt("div",Tme,[vt("div",Eme,[p(P,{size:40,class:"card-avatar"},{icon:It(()=>[p(mt(wc))]),_:1}),vt("div",_me,[vt("div",Mme,jr(f.value),1),vt("div",Ame,jr(((G=mt(o).admin)==null?void 0:G.mobile)||((te=mt(o).admin)==null?void 0:te.email)||"حساب کاربری ادمین"),1)])]),vt("div",Rme,[p(T,{color:h.value==="SUPER_ADMIN"?"purple":"blue",class:"role-pill"},{default:It(()=>[$n(jr(h.value==="SUPER_ADMIN"?"مدیر ارشد سامانه":"اپراتور سامانه"),1)]),_:1},8,["color"])])]),p(M),p(E,{key:"edit-profile",onClick:b},{default:It(()=>[vt("div",Dme,[p(mt(sg),{class:"menu-item-icon"}),C[12]||(C[12]=vt("span",null,"ویرایش کاربر",-1))])]),_:1}),p(M),p(E,{key:"logout",onClick:$},{default:It(()=>[vt("div",Nme,[p(mt(DS),{class:"menu-item-icon"}),C[13]||(C[13]=vt("span",null,"خروج از سامانه",-1))])]),_:1})]}),_:1})]),default:It(()=>[vt("div",wme,[p(P,{size:"small",class:"user-avatar"},{icon:It(()=>[p(mt(wc))]),_:1}),vt("div",Ome,[vt("span",Pme,jr(f.value),1),vt("span",Ime,jr(h.value==="SUPER_ADMIN"?"مدیر ارشد":"اپراتور"),1)]),p(mt(Qi),{class:"dropdown-chevron"})])]),_:1})])]),_:1}),p(N,{class:"app-content"},{default:It(()=>[p(_,null,{default:It(({Component:G})=>[p(dn,{name:"fade-slide",mode:"out-in"},{default:It(()=>[(Wt(),Wr(Eg(G)))]),_:2},1024)]),_:1})]),_:1})]),_:1}),p(Z,{open:v.value,"onUpdate:open":C[10]||(C[10]=G=>v.value=G),title:"ویرایش اطلاعات حساب کاربر",confirmLoading:g.value,okText:"ذخیره تغییرات",cancelText:"انصراف",width:"500px",style:{top:"40px"},onOk:S},{default:It(()=>[p(Y,{layout:"vertical",style:{"margin-top":"16px"}},{default:It(()=>[p(F,{label:"نام و نام خانوادگی",required:""},{default:It(()=>[p(L,{value:y.name,"onUpdate:value":C[6]||(C[6]=G=>y.name=G),placeholder:"مثال: مدیر ارشد سامانه"},null,8,["value"])]),_:1}),p(H,{gutter:16},{default:It(()=>[p(z,{span:12},{default:It(()=>[p(F,{label:"شماره موبایل",required:"",tooltip:"شماره همراه ۱۱ رقمی مدیر"},{default:It(()=>[p(L,{value:y.mobile,"onUpdate:value":C[7]||(C[7]=G=>y.mobile=G),placeholder:"۰۹۱۲۰۰۰۰۰۰۰"},null,8,["value"])]),_:1})]),_:1}),p(z,{span:12},{default:It(()=>[p(F,{label:"آدرس ایمیل",required:""},{default:It(()=>[p(L,{value:y.email,"onUpdate:value":C[8]||(C[8]=G=>y.email=G),placeholder:"admin@luckywheel.local"},null,8,["value"])]),_:1})]),_:1})]),_:1}),p(F,{label:"کلمه عبور جدید (اختیاری)",tooltip:"در صورتی که نمی‌خواهید رمز را تغییر دهید، خالی بگذارید"},{default:It(()=>[p(j,{value:y.password,"onUpdate:value":C[9]||(C[9]=G=>y.password=G),placeholder:"حداقل ۶ کاراکتر"},null,8,["value"])]),_:1}),p(F,{label:"نقش و سطح دسترسی",style:{"margin-bottom":"0"}},{default:It(()=>[p(T,{color:h.value==="SUPER_ADMIN"?"purple":"blue",style:{"font-size":"13px",padding:"4px 12px","border-radius":"6px"}},{default:It(()=>[$n(jr(h.value==="SUPER_ADMIN"?"مدیر ارشد سامانه (SUPER_ADMIN)":"اپراتور سامانه (OPERATOR)"),1)]),_:1},8,["color"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})}}}),Lme=(e,t)=>{const n=e.__vccOpts||e;for(const[o,r]of t)n[o]=r;return n},Fme=Lme(Bme,[["__scopeId","data-v-addabc1f"]]),kme=[{path:"/login",name:"login",component:()=>mo(()=>import("./LoginView-Bp7KAPzQ.js"),__vite__mapDeps([0,1,2])),meta:{guestOnly:!0}},{path:"/",component:Fme,meta:{requiresAuth:!0},children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"dashboard",component:()=>mo(()=>import("./DashboardView-B1JpTeJR.js"),__vite__mapDeps([3,4,5,6,7,8]))},{path:"campaigns",name:"campaigns",component:()=>mo(()=>import("./CampaignListView-Czzgz98v.js"),__vite__mapDeps([9,4,10,7,11,12]))},{path:"campaigns/create",name:"campaign-create",component:()=>mo(()=>import("./CampaignFormView-COR08E-o.js"),__vite__mapDeps([13,14,15]))},{path:"campaigns/:id/edit",name:"campaign-edit",component:()=>mo(()=>import("./CampaignFormView-COR08E-o.js"),__vite__mapDeps([13,14,15]))},{path:"campaigns/:campaignId/prizes",name:"campaign-prizes",component:()=>mo(()=>import("./PrizeListView-DVU9hmdY.js"),__vite__mapDeps([16,4,11,10,14,17]))},{path:"users",name:"users",component:()=>mo(()=>import("./UserListView-CUMm4H4J.js"),__vite__mapDeps([18,4,10,5,1,19]))},{path:"users/:id",name:"user-detail",component:()=>mo(()=>import("./UserDetailView-CkEjSYSH.js"),__vite__mapDeps([20,4,5,21]))},{path:"spins",name:"spins",component:()=>mo(()=>import("./SpinListView-WIkO8yaF.js"),__vite__mapDeps([22,4,23]))},{path:"winners",name:"winners",component:()=>mo(()=>import("./WinnerListView-FE9kM-NV.js"),__vite__mapDeps([24,4,10,25]))},{path:"sms",name:"sms",component:()=>mo(()=>import("./SmsLogListView-Dzz9zkVI.js"),__vite__mapDeps([26,4,27]))},{path:"reports",name:"reports",component:()=>mo(()=>import("./ReportView-CKpII8Mv.js"),__vite__mapDeps([28,4,6,7,29]))},{path:"audit",name:"audit",component:()=>mo(()=>import("./AuditLogView-DlV2c1uL.js"),__vite__mapDeps([30,4,31]))}]},{path:"/:pathMatch(.*)*",redirect:"/dashboard"}],rA=Ghe({history:Ohe(),routes:kme});rA.beforeEach(async(e,t,n)=>{oA();const o=localStorage.getItem("admin_access_token");e.meta.requiresAuth&&!o?n("/login"):e.meta.guestOnly&&o?n("/dashboard"):n()});const vg=UP(kpe),zme=Tpe();vg.use(zme);vg.use(rA);vg.use(Ipe);vg.mount("#app");export{rS as A,$1 as B,PS as C,cb as D,sg as E,Ke as F,_u as G,hr as H,We as I,Ec as J,an as K,RS as L,cn as M,Yhe as N,W$ as O,FS as P,iS as Q,cg as R,sa as S,kS as T,wc as U,ag as V,LR as W,I as X,_S as Y,Lme as _,fo as a,vt as b,p as c,re as d,mt as e,$n as f,ut as g,le as h,Xhe as i,Ue as j,zn as k,Vme as l,ki as m,it as n,Wt as o,In as p,er as q,Jt as r,Wr as s,jr as t,oA as u,Zn as v,It as w,m$ as x,lo as y,Th as z}; +`+l)}}catch{}throw o}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ql(this.defaults,n);const{transitional:o,paramsSerializer:r,headers:i}=n;o!==void 0&&bf.assertOptions(o,{silentJSONParsing:_n.transitional(_n.boolean),forcedJSONParsing:_n.transitional(_n.boolean),clarifyTimeoutError:_n.transitional(_n.boolean),legacyInterceptorReqResOrdering:_n.transitional(_n.boolean),advertiseZstdAcceptEncoding:_n.transitional(_n.boolean),validateStatusUndefinedResolves:_n.transitional(_n.boolean)},!1),r!=null&&(ve.isFunction(r)?n.paramsSerializer={serialize:r}:bf.assertOptions(r,{encode:_n.function,serialize:_n.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),bf.assertOptions(n,{baseUrl:_n.spelling("baseURL"),withXsrfToken:_n.spelling("withXSRFToken")},!0),n.method=(ve.getSafeProp(n,"method")||ve.getSafeProp(this.defaults,"method")||"get").toLowerCase();let l=i&&ve.merge(i.common,i[n.method]);i&&ve.forEach(KM.concat("common"),v=>{delete i[v]}),n.headers=Bn.concat(l,i);const a=[];let s=!0;this.interceptors.request.forEach(function(g){if(typeof g.runWhen=="function"&&g.runWhen(n)===!1)return;s=s&&g.synchronous;const y=n.transitional||GS;y&&y.legacyInterceptorReqResOrdering?a.unshift(g.fulfilled,g.rejected):a.push(g.fulfilled,g.rejected)});const c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let u,d=0,f;if(!s){const v=[cm.bind(this),void 0];for(v.unshift(...a),v.push(...c),f=v.length,u=Promise.resolve(n);dcm.call(this,h)))}catch(b){u=Promise.reject(b)}break}}if(!u)try{u=cm.call(this,h)}catch(v){u=Promise.reject(v)}for(d=0,f=c.length;d{if(!o._listeners)return;let i=o._listeners.length;for(;i-- >0;)o._listeners[i](r);o._listeners=null}),this.promise.then=r=>{let i;const l=new Promise(a=>{o.subscribe(a),i=a}).then(r);return l.cancel=function(){o.unsubscribe(i)},l},t(function(i,l,a){o.reason||(o.reason=new ku(i,l,a),n(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=o=>{t.abort(o)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new eA(function(r){t=r}),cancel:t}}};function rme(e){return function(n){return e.apply(null,n)}}function ime(e){return ve.isObject(e)&&e.isAxiosError===!0}const yf={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(yf).forEach(([e,t])=>{yf[t]===void 0&&(yf[t]=e)});function tA(e){const t=new zl(e),n=OM(zl.prototype.request,t);return ve.extend(n,zl.prototype,t,{allOwnKeys:!0}),ve.extend(n,t,null,{allOwnKeys:!0}),n.create=function(r){return tA(Ql(e,r))},n}const Yt=tA(Fu);Yt.Axios=zl;Yt.CanceledError=ku;Yt.CancelToken=ome;Yt.isCancel=UM;Yt.VERSION=YS;Yt.toFormData=hg;Yt.AxiosError=Le;Yt.Cancel=Yt.CanceledError;Yt.all=function(t){return Promise.all(t)};Yt.spread=rme;Yt.isAxiosError=ime;Yt.mergeConfig=Ql;Yt.AxiosHeaders=Bn;Yt.formToJSON=e=>WM(ve.isHTMLForm(e)?new FormData(e):e);Yt.getAdapter=QM.getAdapter;Yt.HttpStatusCode=yf;Yt.default=Yt;const{Axios:Gme,AxiosError:Xme,CanceledError:Yme,isCancel:qme,CancelToken:Zme,VERSION:Jme,all:Qme,Cancel:e0e,isAxiosError:t0e,spread:n0e,toFormData:o0e,AxiosHeaders:r0e,HttpStatusCode:i0e,formToJSON:l0e,getAdapter:a0e,mergeConfig:s0e,create:c0e}=Yt,nA="https://api.wheel.montest.ir/api",ki=Yt.create({baseURL:nA,headers:{"Content-Type":"application/json"}});ki.interceptors.request.use(e=>{const t=localStorage.getItem("admin_access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e));let um=!1,ib=[];const CO=(e,t=null)=>{ib.forEach(n=>{e?n.reject(e):n.resolve(t)}),ib=[]};ki.interceptors.response.use(e=>{if(e.data instanceof Blob)return e;if(e.data&&typeof e.data=="object"){if("success"in e.data&&"data"in e.data)return{...e,data:e.data.data,meta:e.data.meta};if("data"in e.data&&"meta"in e.data)return{...e,data:e.data.data,meta:e.data.meta}}return e},async e=>{var o,r,i,l,a,s,c,u,d,f,h;const t=e.config;if(((o=e.response)==null?void 0:o.status)===401&&!t._retry){if((r=t.url)!=null&&r.includes("/admin/auth/login")||(i=t.url)!=null&&i.includes("/admin/auth/refresh"))return Promise.reject(e);if(um)return new Promise((g,y)=>{ib.push({resolve:g,reject:y})}).then(g=>(t.headers.Authorization=`Bearer ${g}`,ki(t))).catch(g=>Promise.reject(g));t._retry=!0,um=!0;const v=localStorage.getItem("admin_refresh_token");if(!v)return localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_info"),window.location.href="/login",Promise.reject(e);try{const{data:g}=await Yt.post(`${nA}/admin/auth/refresh`,{refreshToken:v}),y=((l=g.data)==null?void 0:l.accessToken)||g.accessToken;return localStorage.setItem("admin_access_token",y),ki.defaults.headers.common.Authorization=`Bearer ${y}`,CO(null,y),ki(t)}catch(g){return CO(g,null),localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_refresh_token"),localStorage.removeItem("admin_info"),window.location.href="/login",Promise.reject(g)}finally{um=!1}}const n=((s=(a=e.response)==null?void 0:a.data)==null?void 0:s.message)||(Array.isArray((u=(c=e.response)==null?void 0:c.data)==null?void 0:u.message)?(f=(d=e.response)==null?void 0:d.data)==null?void 0:f.message.join(" - "):"خطایی در ارتباط با سرور رخ داده است.");return((h=e.response)==null?void 0:h.status)!==401&&lo.error(n),Promise.reject(e)});const oA=Dpe("adminAuth",()=>{const e=le(localStorage.getItem("admin_access_token")),t=le(localStorage.getItem("admin_info")?JSON.parse(localStorage.getItem("admin_info")):null),n=le(!1),o=I(()=>!!e.value);async function r(a){n.value=!0;try{const c=(await ki.post("/admin/auth/login",a)).data;return e.value=c.accessToken,t.value=c.admin,localStorage.setItem("admin_access_token",c.accessToken),localStorage.setItem("admin_refresh_token",c.refreshToken),localStorage.setItem("admin_info",JSON.stringify(c.admin)),c}finally{n.value=!1}}async function i(){try{await ki.post("/admin/auth/logout")}catch{}finally{e.value=null,t.value=null,localStorage.removeItem("admin_access_token"),localStorage.removeItem("admin_refresh_token"),localStorage.removeItem("admin_info")}}async function l(a){n.value=!0;try{const s=await ki.patch("/admin/auth/profile",a);return t.value=s.data,localStorage.setItem("admin_info",JSON.stringify(s.data)),s.data}finally{n.value=!1}}return{token:e,admin:t,loading:n,isAuthenticated:o,login:r,logout:i,updateProfile:l}}),lme={class:"logo-box"},ame={key:0,class:"logo-text"},sme={key:0,class:"search-container"},cme={class:"search-bar"},ume={class:"menu-scroll-wrap"},dme={class:"sider-nav"},fme={key:0,class:"nav-group"},pme={key:0,class:"nav-group-header"},hme={class:"nav-group-items"},gme=["onClick"],vme={key:0,class:"nav-link-text"},mme={key:1,class:"nav-group nav-group-secondary"},bme={key:0,class:"nav-group-header"},yme={class:"nav-group-items"},Sme=["onClick"],$me={key:0,class:"nav-link-text"},Cme={key:2,class:"empty-search-text"},xme={class:"header-right"},wme={class:"user-profile-trigger"},Ome={class:"user-info-text"},Pme={class:"user-name"},Ime={class:"user-role-label"},Tme={class:"dropdown-user-card"},Eme={class:"card-avatar-wrap"},_me={class:"card-text"},Mme={class:"card-name"},Ame={class:"card-sub"},Rme={class:"card-badge-row"},Dme={class:"dropdown-menu-item"},Nme={class:"dropdown-menu-item text-danger"},Bme=re({__name:"AdminLayout",setup(e){const t=Yhe(),n=Xhe(),o=oA(),r=le(!1),i=le([t.name||"dashboard"]),l=le(""),a=[{key:"dashboard",label:"داشبورد آماری",icon:AS,path:"/dashboard"},{key:"campaigns",label:"مدیریت کمپین‌ها",icon:FS,path:"/campaigns"},{key:"users",label:"مدیریت کاربران",icon:wc,path:"/users"},{key:"winners",label:"مدیریت برندگان",icon:kS,path:"/winners"},{key:"spins",label:"تاریخچه اسپین‌ها",icon:cg,path:"/spins"}],s=[{key:"sms",label:"لاگ‌های پیامک",icon:LS,path:"/sms"},{key:"reports",label:"گزارش‌ها و KPI",icon:RS,path:"/reports"},{key:"audit",label:"لاگ بازرسی (Audit)",icon:MS,path:"/audit"}],c=I(()=>{if(!l.value.trim())return a;const x=l.value.toLowerCase().trim();return a.filter(C=>C.label.toLowerCase().includes(x))}),u=I(()=>{if(!l.value.trim())return s;const x=l.value.toLowerCase().trim();return s.filter(C=>C.label.toLowerCase().includes(x))});function d(x){i.value=[x.key],n.push(x.path)}Se(()=>t.name,x=>{x&&(i.value=[x])});const f=I(()=>{var x;return((x=o.admin)==null?void 0:x.name)||"مدیر سیستم"}),h=I(()=>{var x;return((x=o.admin)==null?void 0:x.role)||"OPERATOR"}),v=le(!1),g=le(!1),y=ut({name:"",mobile:"",email:"",password:""});function b(){var x,C,O;y.name=((x=o.admin)==null?void 0:x.name)||"",y.mobile=((C=o.admin)==null?void 0:C.mobile)||"",y.email=((O=o.admin)==null?void 0:O.email)||"",y.password="",v.value=!0}async function S(){var x,C;if(!y.name.trim()){lo.error("لطفاً نام و نام خانوادگی را وارد کنید.");return}if(!y.mobile.trim()||!/^09\d{9}$/.test(y.mobile.trim())){lo.error("شماره موبایل باید ۱۱ رقمی باشد و با ۰۹ شروع شود.");return}if(!y.email.trim()){lo.error("لطفاً ایمیل را وارد کنید.");return}if(y.password&&y.password.length<6){lo.error("کلمه عبور جدید باید حداقل ۶ کاراکتر باشد.");return}g.value=!0;try{const O={name:y.name.trim(),mobile:y.mobile.trim(),email:y.email.trim()};y.password&&(O.password=y.password),await o.updateProfile(O),lo.success("اطلاعات کاربر با موفقیت به‌روزرسانی شد."),v.value=!1}catch(O){const w=((C=(x=O==null?void 0:O.response)==null?void 0:x.data)==null?void 0:C.message)||"خطا در ویرایش اطلاعات کاربر.";lo.error(typeof w=="string"?w:"اطلاعات وارد شده نامعتبر است.")}finally{g.value=!1}}function $(){cn.confirm({title:"خروج از حساب کاربری",icon:p(bu),content:"آیا اطمینان دارید که می‌خواهید از پنل مدیریت خارج شوید؟",okText:"خروج",cancelText:"انصراف",okButtonProps:{danger:!0},onOk:async()=>{await o.logout(),n.push("/login")}})}return(x,C)=>{const O=Jt("a-tooltip"),w=Jt("a-layout-sider"),P=Jt("a-avatar"),T=Jt("a-tag"),M=Jt("a-menu-divider"),E=Jt("a-menu-item"),A=Jt("a-menu"),R=Jt("a-dropdown"),k=Jt("a-layout-header"),_=Jt("router-view"),N=Jt("a-layout-content"),B=Jt("a-layout"),L=Jt("a-input"),F=Jt("a-form-item"),z=Jt("a-col"),H=Jt("a-row"),j=Jt("a-input-password"),Y=Jt("a-form"),Z=Jt("a-modal");return Wt(),Wr(B,{style:{"min-height":"100vh"}},{default:It(()=>[p(w,{collapsed:r.value,"onUpdate:collapsed":C[5]||(C[5]=G=>r.value=G),trigger:null,collapsible:"",width:236,collapsedWidth:72,theme:"light",class:"app-sider"},{default:It(()=>[vt("div",lme,[vt("div",{class:"brand-wrap",onClick:C[0]||(C[0]=G=>mt(n).push("/dashboard"))},[C[11]||(C[11]=vt("div",{class:"logo-emblem"},[vt("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[vt("rect",{width:"24",height:"24",rx:"6",fill:"url(#brandGrad)"}),vt("circle",{cx:"12",cy:"12",r:"7.5",stroke:"white","stroke-width":"1.8","stroke-dasharray":"3 2"}),vt("path",{d:"M12 4.5V12L16.5 7.5",stroke:"white","stroke-width":"1.8","stroke-linecap":"round"}),vt("circle",{cx:"12",cy:"12",r:"2",fill:"white"}),vt("defs",null,[vt("linearGradient",{id:"brandGrad",x1:"0",y1:"0",x2:"24",y2:"24",gradientUnits:"userSpaceOnUse"},[vt("stop",{"stop-color":"#7c3aed"}),vt("stop",{offset:"1","stop-color":"#4f46e5"})])])])],-1)),r.value?er("",!0):(Wt(),fo("h2",ame,"گردونه شانس"))]),r.value?(Wt(),fo("button",{key:1,type:"button",class:"sider-collapse-btn collapsed-toggle",title:"باز کردن سایدبار",onClick:C[2]||(C[2]=G=>r.value=!r.value)},[p(mt(BS))])):(Wt(),fo("button",{key:0,type:"button",class:"sider-collapse-btn",title:"بستن سایدبار",onClick:C[1]||(C[1]=G=>r.value=!r.value)},[p(mt(NS))]))]),r.value?er("",!0):(Wt(),fo("div",sme,[vt("div",cme,[p(mt(sa),{class:"search-bar-icon"}),In(vt("input",{"onUpdate:modelValue":C[3]||(C[3]=G=>l.value=G),type:"text",placeholder:"جستجو در منو...",class:"search-bar-input"},null,512),[[LR,l.value]]),l.value?(Wt(),Wr(mt(yu),{key:0,class:"clear-search-icon",onClick:C[4]||(C[4]=G=>l.value="")})):er("",!0)])])),vt("div",ume,[vt("nav",dme,[c.value.length>0?(Wt(),fo("div",fme,[r.value?er("",!0):(Wt(),fo("div",pme,"اصلی")),vt("div",hme,[(Wt(!0),fo(Ke,null,m$(c.value,G=>(Wt(),Wr(O,{key:G.key,title:r.value?G.label:"",placement:"left"},{default:It(()=>[vt("div",{class:Ec(["nav-link-item",{"is-active":i.value.includes(G.key)}]),onClick:te=>d(G)},[(Wt(),Wr(Eg(G.icon),{class:"nav-link-icon"})),r.value?er("",!0):(Wt(),fo("span",vme,jr(G.label),1))],10,gme)]),_:2},1032,["title"]))),128))])])):er("",!0),u.value.length>0?(Wt(),fo("div",mme,[r.value?er("",!0):(Wt(),fo("div",bme,"سیستم و ابزارها")),vt("div",yme,[(Wt(!0),fo(Ke,null,m$(u.value,G=>(Wt(),Wr(O,{key:G.key,title:r.value?G.label:"",placement:"left"},{default:It(()=>[vt("div",{class:Ec(["nav-link-item",{"is-active":i.value.includes(G.key)}]),onClick:te=>d(G)},[(Wt(),Wr(Eg(G.icon),{class:"nav-link-icon"})),r.value?er("",!0):(Wt(),fo("span",$me,jr(G.label),1))],10,Sme)]),_:2},1032,["title"]))),128))])])):er("",!0),!r.value&&c.value.length===0&&u.value.length===0?(Wt(),fo("div",Cme," موردی یافت نشد ")):er("",!0)])])]),_:1},8,["collapsed"]),p(B,null,{default:It(()=>[p(k,{class:"app-header"},{default:It(()=>[C[14]||(C[14]=vt("div",{class:"header-left"},[vt("span",{class:"header-title"},"سامانه مدیریت گردونه شانس")],-1)),vt("div",xme,[p(R,{trigger:["click"],placement:"bottomLeft",overlayClassName:"admin-user-dropdown-popover"},{overlay:It(()=>[p(A,{class:"user-dropdown-menu"},{default:It(()=>{var G,te;return[vt("div",Tme,[vt("div",Eme,[p(P,{size:40,class:"card-avatar"},{icon:It(()=>[p(mt(wc))]),_:1}),vt("div",_me,[vt("div",Mme,jr(f.value),1),vt("div",Ame,jr(((G=mt(o).admin)==null?void 0:G.mobile)||((te=mt(o).admin)==null?void 0:te.email)||"حساب کاربری ادمین"),1)])]),vt("div",Rme,[p(T,{color:h.value==="SUPER_ADMIN"?"purple":"blue",class:"role-pill"},{default:It(()=>[$n(jr(h.value==="SUPER_ADMIN"?"مدیر ارشد سامانه":"اپراتور سامانه"),1)]),_:1},8,["color"])])]),p(M),p(E,{key:"edit-profile",onClick:b},{default:It(()=>[vt("div",Dme,[p(mt(sg),{class:"menu-item-icon"}),C[12]||(C[12]=vt("span",null,"ویرایش کاربر",-1))])]),_:1}),p(M),p(E,{key:"logout",onClick:$},{default:It(()=>[vt("div",Nme,[p(mt(DS),{class:"menu-item-icon"}),C[13]||(C[13]=vt("span",null,"خروج از سامانه",-1))])]),_:1})]}),_:1})]),default:It(()=>[vt("div",wme,[p(P,{size:"small",class:"user-avatar"},{icon:It(()=>[p(mt(wc))]),_:1}),vt("div",Ome,[vt("span",Pme,jr(f.value),1),vt("span",Ime,jr(h.value==="SUPER_ADMIN"?"مدیر ارشد":"اپراتور"),1)]),p(mt(Qi),{class:"dropdown-chevron"})])]),_:1})])]),_:1}),p(N,{class:"app-content"},{default:It(()=>[p(_,null,{default:It(({Component:G})=>[p(dn,{name:"fade-slide",mode:"out-in"},{default:It(()=>[(Wt(),Wr(Eg(G)))]),_:2},1024)]),_:1})]),_:1})]),_:1}),p(Z,{open:v.value,"onUpdate:open":C[10]||(C[10]=G=>v.value=G),title:"ویرایش اطلاعات حساب کاربر",confirmLoading:g.value,okText:"ذخیره تغییرات",cancelText:"انصراف",width:"500px",style:{top:"40px"},onOk:S},{default:It(()=>[p(Y,{layout:"vertical",style:{"margin-top":"16px"}},{default:It(()=>[p(F,{label:"نام و نام خانوادگی",required:""},{default:It(()=>[p(L,{value:y.name,"onUpdate:value":C[6]||(C[6]=G=>y.name=G),placeholder:"مثال: مدیر ارشد سامانه"},null,8,["value"])]),_:1}),p(H,{gutter:16},{default:It(()=>[p(z,{span:12},{default:It(()=>[p(F,{label:"شماره موبایل",required:"",tooltip:"شماره همراه ۱۱ رقمی مدیر"},{default:It(()=>[p(L,{value:y.mobile,"onUpdate:value":C[7]||(C[7]=G=>y.mobile=G),placeholder:"۰۹۱۲۰۰۰۰۰۰۰"},null,8,["value"])]),_:1})]),_:1}),p(z,{span:12},{default:It(()=>[p(F,{label:"آدرس ایمیل",required:""},{default:It(()=>[p(L,{value:y.email,"onUpdate:value":C[8]||(C[8]=G=>y.email=G),placeholder:"admin@luckywheel.local"},null,8,["value"])]),_:1})]),_:1})]),_:1}),p(F,{label:"کلمه عبور جدید (اختیاری)",tooltip:"در صورتی که نمی‌خواهید رمز را تغییر دهید، خالی بگذارید"},{default:It(()=>[p(j,{value:y.password,"onUpdate:value":C[9]||(C[9]=G=>y.password=G),placeholder:"حداقل ۶ کاراکتر"},null,8,["value"])]),_:1}),p(F,{label:"نقش و سطح دسترسی",style:{"margin-bottom":"0"}},{default:It(()=>[p(T,{color:h.value==="SUPER_ADMIN"?"purple":"blue",style:{"font-size":"13px",padding:"4px 12px","border-radius":"6px"}},{default:It(()=>[$n(jr(h.value==="SUPER_ADMIN"?"مدیر ارشد سامانه (SUPER_ADMIN)":"اپراتور سامانه (OPERATOR)"),1)]),_:1},8,["color"])]),_:1})]),_:1})]),_:1},8,["open","confirmLoading"])]),_:1})}}}),Lme=(e,t)=>{const n=e.__vccOpts||e;for(const[o,r]of t)n[o]=r;return n},Fme=Lme(Bme,[["__scopeId","data-v-addabc1f"]]),kme=[{path:"/login",name:"login",component:()=>mo(()=>import("./LoginView-DcnnMjq0.js"),__vite__mapDeps([0,1,2])),meta:{guestOnly:!0}},{path:"/",component:Fme,meta:{requiresAuth:!0},children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"dashboard",component:()=>mo(()=>import("./DashboardView-po4OVtHF.js"),__vite__mapDeps([3,4,5,6,7,8]))},{path:"campaigns",name:"campaigns",component:()=>mo(()=>import("./CampaignListView-CLT23C_L.js"),__vite__mapDeps([9,4,10,7,11,12]))},{path:"campaigns/create",name:"campaign-create",component:()=>mo(()=>import("./CampaignFormView-OBaKvIJ_.js"),__vite__mapDeps([13,14,15]))},{path:"campaigns/:id/edit",name:"campaign-edit",component:()=>mo(()=>import("./CampaignFormView-OBaKvIJ_.js"),__vite__mapDeps([13,14,15]))},{path:"campaigns/:campaignId/prizes",name:"campaign-prizes",component:()=>mo(()=>import("./PrizeListView-C4OunB6P.js"),__vite__mapDeps([16,4,11,10,14,17]))},{path:"users",name:"users",component:()=>mo(()=>import("./UserListView-DkY1i72N.js"),__vite__mapDeps([18,4,10,5,1,19]))},{path:"users/:id",name:"user-detail",component:()=>mo(()=>import("./UserDetailView-_Osv-8R9.js"),__vite__mapDeps([20,4,5,21]))},{path:"spins",name:"spins",component:()=>mo(()=>import("./SpinListView-CL9S5010.js"),__vite__mapDeps([22,4,23]))},{path:"winners",name:"winners",component:()=>mo(()=>import("./WinnerListView-ttRyORJt.js"),__vite__mapDeps([24,4,10,25]))},{path:"sms",name:"sms",component:()=>mo(()=>import("./SmsLogListView-BQrgELdy.js"),__vite__mapDeps([26,4,27]))},{path:"reports",name:"reports",component:()=>mo(()=>import("./ReportView-Bsg1kGeu.js"),__vite__mapDeps([28,4,6,7,29]))},{path:"audit",name:"audit",component:()=>mo(()=>import("./AuditLogView-DUQqTRnR.js"),__vite__mapDeps([30,4,31]))}]},{path:"/:pathMatch(.*)*",redirect:"/dashboard"}],rA=Ghe({history:Ohe(),routes:kme});rA.beforeEach(async(e,t,n)=>{oA();const o=localStorage.getItem("admin_access_token");e.meta.requiresAuth&&!o?n("/login"):e.meta.guestOnly&&o?n("/dashboard"):n()});const vg=UP(kpe),zme=Tpe();vg.use(zme);vg.use(rA);vg.use(Ipe);vg.mount("#app");export{rS as A,$1 as B,PS as C,cb as D,sg as E,Ke as F,_u as G,hr as H,We as I,Ec as J,an as K,RS as L,cn as M,Yhe as N,W$ as O,FS as P,iS as Q,cg as R,sa as S,kS as T,wc as U,ag as V,LR as W,I as X,_S as Y,Lme as _,fo as a,vt as b,p as c,re as d,mt as e,$n as f,ut as g,le as h,Xhe as i,Ue as j,zn as k,Vme as l,ki as m,it as n,Wt as o,In as p,er as q,Jt as r,Wr as s,jr as t,oA as u,Zn as v,It as w,m$ as x,lo as y,Th as z}; diff --git a/apps/admin/dist/index.html b/apps/admin/dist/index.html index 20eb6b0..4d07e05 100644 --- a/apps/admin/dist/index.html +++ b/apps/admin/dist/index.html @@ -18,7 +18,7 @@ direction: rtl; } - + diff --git a/apps/api/release/prisma/migrations/20260909192201_init/migration.sql b/apps/api/release/prisma/migrations/20260909192201_init/migration.sql index bc82dae..ddcc842 100644 --- a/apps/api/release/prisma/migrations/20260909192201_init/migration.sql +++ b/apps/api/release/prisma/migrations/20260909192201_init/migration.sql @@ -1,320 +1,320 @@ --- CreateEnum -CREATE TYPE "AdminStatus" AS ENUM ('ACTIVE', 'DISABLED'); - --- CreateEnum -CREATE TYPE "AdminRole" AS ENUM ('SUPER_ADMIN', 'OPERATOR', 'SUPPORT'); - --- CreateEnum -CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'BLOCKED'); - --- CreateEnum -CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'FINISHED'); - --- CreateEnum -CREATE TYPE "PrizeType" AS ENUM ('PHYSICAL', 'DISCOUNT_CODE', 'CREDIT', 'CASH', 'NO_PRIZE', 'OTHER'); - --- CreateEnum -CREATE TYPE "StockType" AS ENUM ('LIMITED', 'UNLIMITED'); - --- CreateEnum -CREATE TYPE "PrizeStatus" AS ENUM ('ACTIVE', 'INACTIVE'); - --- CreateEnum -CREATE TYPE "SpinStatus" AS ENUM ('SUCCESS', 'FAILED', 'DUPLICATE'); - --- CreateEnum -CREATE TYPE "ChanceTxnType" AS ENUM ('SIGNUP_BONUS', 'ADMIN_ADJUSTMENT', 'SPIN_CONSUME', 'CAMPAIGN_BONUS', 'REFUND'); - --- CreateEnum -CREATE TYPE "UserPrizeStatus" AS ENUM ('NEW', 'CONTACTED', 'DELIVERED', 'ACTIVE_CODE', 'USED', 'EXPIRED'); - --- CreateEnum -CREATE TYPE "SmsType" AS ENUM ('OTP', 'WINNING', 'NO_PRIZE', 'PRIZE_REMINDER'); - --- CreateEnum -CREATE TYPE "SmsStatus" AS ENUM ('PENDING', 'SENT', 'FAILED'); - --- CreateEnum -CREATE TYPE "WheelDesign" AS ENUM ('CLASSIC_CASINO', 'NEON_CYBER', 'MINIMAL_FLAT', 'LUXURY_GOLD', 'PLAYFUL_CARTOON'); - --- CreateTable -CREATE TABLE "admins" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "mobile" TEXT NOT NULL, - "email" TEXT NOT NULL, - "password_hash" TEXT NOT NULL, - "role" "AdminRole" NOT NULL DEFAULT 'OPERATOR', - "status" "AdminStatus" NOT NULL DEFAULT 'ACTIVE', - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "admins_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "users" ( - "id" TEXT NOT NULL, - "mobile" TEXT NOT NULL, - "name" TEXT, - "status" "UserStatus" NOT NULL DEFAULT 'ACTIVE', - "last_login_at" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "users_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "otp_codes" ( - "id" TEXT NOT NULL, - "mobile" TEXT NOT NULL, - "code" TEXT NOT NULL, - "user_id" TEXT, - "attempts" INTEGER NOT NULL DEFAULT 0, - "consumed" BOOLEAN NOT NULL DEFAULT false, - "expires_at" TIMESTAMP(3) NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "otp_codes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "campaigns" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "description" TEXT, - "image" TEXT, - "banner" TEXT, - "logo" TEXT, - "start_at" TIMESTAMP(3) NOT NULL, - "end_at" TIMESTAMP(3) NOT NULL, - "status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT', - "default_chances" INTEGER NOT NULL DEFAULT 0, - "rules" TEXT, - "cta_text" TEXT, - "wheel_design" "WheelDesign" NOT NULL DEFAULT 'CLASSIC_CASINO', - "settings" JSONB, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "prizes" ( - "id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "image" TEXT, - "type" "PrizeType" NOT NULL, - "stock_type" "StockType" NOT NULL, - "initial_stock" INTEGER, - "remaining_stock" INTEGER, - "weight" INTEGER NOT NULL, - "status" "PrizeStatus" NOT NULL DEFAULT 'ACTIVE', - "sort_order" INTEGER NOT NULL DEFAULT 0, - "segment_color" TEXT NOT NULL, - "expires_at" TIMESTAMP(3), - "sms_template" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "prizes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "user_campaigns" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "total_chances" INTEGER NOT NULL DEFAULT 0, - "used_chances" INTEGER NOT NULL DEFAULT 0, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "user_campaigns_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "chance_transactions" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "amount" INTEGER NOT NULL, - "type" "ChanceTxnType" NOT NULL, - "reference_type" TEXT, - "reference_id" TEXT, - "description" TEXT, - "created_by" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "chance_transactions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "spins" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "prize_id" TEXT, - "status" "SpinStatus" NOT NULL DEFAULT 'SUCCESS', - "idempotency_key" TEXT NOT NULL, - "ip" TEXT, - "user_agent" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "spins_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "user_prizes" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "prize_id" TEXT NOT NULL, - "spin_id" TEXT NOT NULL, - "code" TEXT, - "status" "UserPrizeStatus" NOT NULL DEFAULT 'NEW', - "won_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "redeemed_at" TIMESTAMP(3), - - CONSTRAINT "user_prizes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "sms_logs" ( - "id" TEXT NOT NULL, - "user_id" TEXT, - "mobile" TEXT NOT NULL, - "type" "SmsType" NOT NULL, - "message" TEXT NOT NULL, - "provider" TEXT NOT NULL DEFAULT 'raygansms', - "status" "SmsStatus" NOT NULL DEFAULT 'PENDING', - "provider_response" JSONB, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "sms_logs_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "admin_logs" ( - "id" TEXT NOT NULL, - "admin_id" TEXT NOT NULL, - "action" TEXT NOT NULL, - "entity_type" TEXT NOT NULL, - "entity_id" TEXT NOT NULL, - "old_value" JSONB, - "new_value" JSONB, - "ip" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "admins_mobile_key" ON "admins"("mobile"); - --- CreateIndex -CREATE UNIQUE INDEX "admins_email_key" ON "admins"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "users_mobile_key" ON "users"("mobile"); - --- CreateIndex -CREATE INDEX "users_mobile_idx" ON "users"("mobile"); - --- CreateIndex -CREATE INDEX "otp_codes_mobile_consumed_idx" ON "otp_codes"("mobile", "consumed"); - --- CreateIndex -CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug"); - --- CreateIndex -CREATE INDEX "campaigns_status_start_at_end_at_idx" ON "campaigns"("status", "start_at", "end_at"); - --- CreateIndex -CREATE INDEX "prizes_campaign_id_status_idx" ON "prizes"("campaign_id", "status"); - --- CreateIndex -CREATE UNIQUE INDEX "user_campaigns_user_id_campaign_id_key" ON "user_campaigns"("user_id", "campaign_id"); - --- CreateIndex -CREATE INDEX "chance_transactions_user_id_campaign_id_idx" ON "chance_transactions"("user_id", "campaign_id"); - --- CreateIndex -CREATE UNIQUE INDEX "spins_idempotency_key_key" ON "spins"("idempotency_key"); - --- CreateIndex -CREATE INDEX "spins_user_id_campaign_id_idx" ON "spins"("user_id", "campaign_id"); - --- CreateIndex -CREATE INDEX "spins_campaign_id_created_at_idx" ON "spins"("campaign_id", "created_at"); - --- CreateIndex -CREATE UNIQUE INDEX "user_prizes_spin_id_key" ON "user_prizes"("spin_id"); - --- CreateIndex -CREATE UNIQUE INDEX "user_prizes_code_key" ON "user_prizes"("code"); - --- CreateIndex -CREATE INDEX "user_prizes_user_id_idx" ON "user_prizes"("user_id"); - --- CreateIndex -CREATE INDEX "user_prizes_status_idx" ON "user_prizes"("status"); - --- CreateIndex -CREATE INDEX "sms_logs_mobile_type_idx" ON "sms_logs"("mobile", "type"); - --- CreateIndex -CREATE INDEX "admin_logs_entity_type_entity_id_idx" ON "admin_logs"("entity_type", "entity_id"); - --- AddForeignKey -ALTER TABLE "otp_codes" ADD CONSTRAINT "otp_codes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "prizes" ADD CONSTRAINT "prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "admins"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "spins" ADD CONSTRAINT "spins_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "spins" ADD CONSTRAINT "spins_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "spins" ADD CONSTRAINT "spins_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_spin_id_fkey" FOREIGN KEY ("spin_id") REFERENCES "spins"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "sms_logs" ADD CONSTRAINT "sms_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "admins"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- CreateEnum +CREATE TYPE "AdminStatus" AS ENUM ('ACTIVE', 'DISABLED'); + +-- CreateEnum +CREATE TYPE "AdminRole" AS ENUM ('SUPER_ADMIN', 'OPERATOR', 'SUPPORT'); + +-- CreateEnum +CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'BLOCKED'); + +-- CreateEnum +CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'FINISHED'); + +-- CreateEnum +CREATE TYPE "PrizeType" AS ENUM ('PHYSICAL', 'DISCOUNT_CODE', 'CREDIT', 'CASH', 'NO_PRIZE', 'OTHER'); + +-- CreateEnum +CREATE TYPE "StockType" AS ENUM ('LIMITED', 'UNLIMITED'); + +-- CreateEnum +CREATE TYPE "PrizeStatus" AS ENUM ('ACTIVE', 'INACTIVE'); + +-- CreateEnum +CREATE TYPE "SpinStatus" AS ENUM ('SUCCESS', 'FAILED', 'DUPLICATE'); + +-- CreateEnum +CREATE TYPE "ChanceTxnType" AS ENUM ('SIGNUP_BONUS', 'ADMIN_ADJUSTMENT', 'SPIN_CONSUME', 'CAMPAIGN_BONUS', 'REFUND'); + +-- CreateEnum +CREATE TYPE "UserPrizeStatus" AS ENUM ('NEW', 'CONTACTED', 'DELIVERED', 'ACTIVE_CODE', 'USED', 'EXPIRED'); + +-- CreateEnum +CREATE TYPE "SmsType" AS ENUM ('OTP', 'WINNING', 'NO_PRIZE', 'PRIZE_REMINDER'); + +-- CreateEnum +CREATE TYPE "SmsStatus" AS ENUM ('PENDING', 'SENT', 'FAILED'); + +-- CreateEnum +CREATE TYPE "WheelDesign" AS ENUM ('CLASSIC_CASINO', 'NEON_CYBER', 'MINIMAL_FLAT', 'LUXURY_GOLD', 'PLAYFUL_CARTOON'); + +-- CreateTable +CREATE TABLE "admins" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "mobile" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password_hash" TEXT NOT NULL, + "role" "AdminRole" NOT NULL DEFAULT 'OPERATOR', + "status" "AdminStatus" NOT NULL DEFAULT 'ACTIVE', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "admins_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "users" ( + "id" TEXT NOT NULL, + "mobile" TEXT NOT NULL, + "name" TEXT, + "status" "UserStatus" NOT NULL DEFAULT 'ACTIVE', + "last_login_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "users_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "otp_codes" ( + "id" TEXT NOT NULL, + "mobile" TEXT NOT NULL, + "code" TEXT NOT NULL, + "user_id" TEXT, + "attempts" INTEGER NOT NULL DEFAULT 0, + "consumed" BOOLEAN NOT NULL DEFAULT false, + "expires_at" TIMESTAMP(3) NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "otp_codes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "campaigns" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "description" TEXT, + "image" TEXT, + "banner" TEXT, + "logo" TEXT, + "start_at" TIMESTAMP(3) NOT NULL, + "end_at" TIMESTAMP(3) NOT NULL, + "status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT', + "default_chances" INTEGER NOT NULL DEFAULT 0, + "rules" TEXT, + "cta_text" TEXT, + "wheel_design" "WheelDesign" NOT NULL DEFAULT 'CLASSIC_CASINO', + "settings" JSONB, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "prizes" ( + "id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "image" TEXT, + "type" "PrizeType" NOT NULL, + "stock_type" "StockType" NOT NULL, + "initial_stock" INTEGER, + "remaining_stock" INTEGER, + "weight" INTEGER NOT NULL, + "status" "PrizeStatus" NOT NULL DEFAULT 'ACTIVE', + "sort_order" INTEGER NOT NULL DEFAULT 0, + "segment_color" TEXT NOT NULL, + "expires_at" TIMESTAMP(3), + "sms_template" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "prizes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_campaigns" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "total_chances" INTEGER NOT NULL DEFAULT 0, + "used_chances" INTEGER NOT NULL DEFAULT 0, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "user_campaigns_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "chance_transactions" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "amount" INTEGER NOT NULL, + "type" "ChanceTxnType" NOT NULL, + "reference_type" TEXT, + "reference_id" TEXT, + "description" TEXT, + "created_by" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "chance_transactions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "spins" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "prize_id" TEXT, + "status" "SpinStatus" NOT NULL DEFAULT 'SUCCESS', + "idempotency_key" TEXT NOT NULL, + "ip" TEXT, + "user_agent" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "spins_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_prizes" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "prize_id" TEXT NOT NULL, + "spin_id" TEXT NOT NULL, + "code" TEXT, + "status" "UserPrizeStatus" NOT NULL DEFAULT 'NEW', + "won_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "redeemed_at" TIMESTAMP(3), + + CONSTRAINT "user_prizes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "sms_logs" ( + "id" TEXT NOT NULL, + "user_id" TEXT, + "mobile" TEXT NOT NULL, + "type" "SmsType" NOT NULL, + "message" TEXT NOT NULL, + "provider" TEXT NOT NULL DEFAULT 'raygansms', + "status" "SmsStatus" NOT NULL DEFAULT 'PENDING', + "provider_response" JSONB, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "sms_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "admin_logs" ( + "id" TEXT NOT NULL, + "admin_id" TEXT NOT NULL, + "action" TEXT NOT NULL, + "entity_type" TEXT NOT NULL, + "entity_id" TEXT NOT NULL, + "old_value" JSONB, + "new_value" JSONB, + "ip" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "admins_mobile_key" ON "admins"("mobile"); + +-- CreateIndex +CREATE UNIQUE INDEX "admins_email_key" ON "admins"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_mobile_key" ON "users"("mobile"); + +-- CreateIndex +CREATE INDEX "users_mobile_idx" ON "users"("mobile"); + +-- CreateIndex +CREATE INDEX "otp_codes_mobile_consumed_idx" ON "otp_codes"("mobile", "consumed"); + +-- CreateIndex +CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug"); + +-- CreateIndex +CREATE INDEX "campaigns_status_start_at_end_at_idx" ON "campaigns"("status", "start_at", "end_at"); + +-- CreateIndex +CREATE INDEX "prizes_campaign_id_status_idx" ON "prizes"("campaign_id", "status"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_campaigns_user_id_campaign_id_key" ON "user_campaigns"("user_id", "campaign_id"); + +-- CreateIndex +CREATE INDEX "chance_transactions_user_id_campaign_id_idx" ON "chance_transactions"("user_id", "campaign_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "spins_idempotency_key_key" ON "spins"("idempotency_key"); + +-- CreateIndex +CREATE INDEX "spins_user_id_campaign_id_idx" ON "spins"("user_id", "campaign_id"); + +-- CreateIndex +CREATE INDEX "spins_campaign_id_created_at_idx" ON "spins"("campaign_id", "created_at"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_prizes_spin_id_key" ON "user_prizes"("spin_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_prizes_code_key" ON "user_prizes"("code"); + +-- CreateIndex +CREATE INDEX "user_prizes_user_id_idx" ON "user_prizes"("user_id"); + +-- CreateIndex +CREATE INDEX "user_prizes_status_idx" ON "user_prizes"("status"); + +-- CreateIndex +CREATE INDEX "sms_logs_mobile_type_idx" ON "sms_logs"("mobile", "type"); + +-- CreateIndex +CREATE INDEX "admin_logs_entity_type_entity_id_idx" ON "admin_logs"("entity_type", "entity_id"); + +-- AddForeignKey +ALTER TABLE "otp_codes" ADD CONSTRAINT "otp_codes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "prizes" ADD CONSTRAINT "prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_campaigns" ADD CONSTRAINT "user_campaigns_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "chance_transactions" ADD CONSTRAINT "chance_transactions_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "admins"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "spins" ADD CONSTRAINT "spins_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "spins" ADD CONSTRAINT "spins_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "spins" ADD CONSTRAINT "spins_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_prize_id_fkey" FOREIGN KEY ("prize_id") REFERENCES "prizes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_prizes" ADD CONSTRAINT "user_prizes_spin_id_fkey" FOREIGN KEY ("spin_id") REFERENCES "spins"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "sms_logs" ADD CONSTRAINT "sms_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "admins"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/api/release/prisma/migrations/migration_lock.toml b/apps/api/release/prisma/migrations/migration_lock.toml index fbffa92..6bf9015 100644 --- a/apps/api/release/prisma/migrations/migration_lock.toml +++ b/apps/api/release/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) provider = "postgresql" \ No newline at end of file diff --git a/apps/api/release/prisma/schema.prisma b/apps/api/release/prisma/schema.prisma index 7d38377..502c31d 100644 --- a/apps/api/release/prisma/schema.prisma +++ b/apps/api/release/prisma/schema.prisma @@ -1,315 +1,315 @@ -generator client { - provider = "prisma-client-js" - // native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker - binaryTargets = ["native", "debian-openssl-3.0.x"] -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -// ==================== ENUMS ==================== - -enum AdminStatus { - ACTIVE - DISABLED -} - -enum AdminRole { - SUPER_ADMIN - OPERATOR - SUPPORT -} - -enum UserStatus { - ACTIVE - BLOCKED -} - -enum CampaignStatus { - DRAFT - ACTIVE - PAUSED - FINISHED -} - -enum PrizeType { - PHYSICAL - DISCOUNT_CODE - CREDIT - CASH - NO_PRIZE - OTHER -} - -enum StockType { - LIMITED - UNLIMITED -} - -enum PrizeStatus { - ACTIVE - INACTIVE -} - -enum SpinStatus { - SUCCESS - FAILED - DUPLICATE -} - -enum ChanceTxnType { - SIGNUP_BONUS - ADMIN_ADJUSTMENT - SPIN_CONSUME - CAMPAIGN_BONUS - REFUND -} - -enum UserPrizeStatus { - NEW - CONTACTED - DELIVERED - ACTIVE_CODE - USED - EXPIRED -} - -enum SmsType { - OTP - WINNING - NO_PRIZE - PRIZE_REMINDER -} - -enum SmsStatus { - PENDING - SENT - FAILED -} - -enum WheelDesign { - CLASSIC_CASINO - NEON_CYBER - MINIMAL_FLAT - LUXURY_GOLD - PLAYFUL_CARTOON -} - -// ==================== MODELS ==================== - -model Admin { - id String @id @default(uuid()) - name String - mobile String @unique - email String @unique - passwordHash String @map("password_hash") - role AdminRole @default(OPERATOR) - status AdminStatus @default(ACTIVE) - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - auditLogs AdminLog[] - chanceTxns ChanceTransaction[] @relation("AdminCreatedTxn") - - @@map("admins") -} - -model User { - id String @id @default(uuid()) - mobile String @unique - name String? - status UserStatus @default(ACTIVE) - lastLoginAt DateTime? @map("last_login_at") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - userCampaigns UserCampaign[] - chanceTransactions ChanceTransaction[] - spins Spin[] - userPrizes UserPrize[] - otpCodes OtpCode[] - smsLogs SmsLog[] - - @@index([mobile]) - @@map("users") -} - -model OtpCode { - id String @id @default(uuid()) - mobile String - code String - userId String? @map("user_id") - user User? @relation(fields: [userId], references: [id]) - attempts Int @default(0) - consumed Boolean @default(false) - expiresAt DateTime @map("expires_at") - createdAt DateTime @default(now()) @map("created_at") - - @@index([mobile, consumed]) - @@map("otp_codes") -} - -model Campaign { - id String @id @default(uuid()) - title String - slug String @unique - description String? - image String? - banner String? - logo String? - startAt DateTime @map("start_at") - endAt DateTime @map("end_at") - status CampaignStatus @default(DRAFT) - defaultChances Int @default(0) @map("default_chances") - rules String? - ctaText String? @map("cta_text") - wheelDesign WheelDesign @default(CLASSIC_CASINO) @map("wheel_design") - settings Json? // primaryColor, secondaryColor, headerText, buttonText, headerImage, celebrationEffect... - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - prizes Prize[] - userCampaigns UserCampaign[] - chanceTxns ChanceTransaction[] - spins Spin[] - userPrizes UserPrize[] - - @@index([status, startAt, endAt]) - @@map("campaigns") -} - -model Prize { - id String @id @default(uuid()) - campaignId String @map("campaign_id") - campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade) - title String - description String? - image String? - type PrizeType - stockType StockType @map("stock_type") - initialStock Int? @map("initial_stock") - remainingStock Int? @map("remaining_stock") - weight Int - status PrizeStatus @default(ACTIVE) - sortOrder Int @default(0) @map("sort_order") - segmentColor String @map("segment_color") - expiresAt DateTime? @map("expires_at") - smsTemplate String? @map("sms_template") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - spins Spin[] - userPrizes UserPrize[] - - @@index([campaignId, status]) - @@map("prizes") -} - -model UserCampaign { - id String @id @default(uuid()) - userId String @map("user_id") - user User @relation(fields: [userId], references: [id]) - campaignId String @map("campaign_id") - campaign Campaign @relation(fields: [campaignId], references: [id]) - totalChances Int @default(0) @map("total_chances") - usedChances Int @default(0) @map("used_chances") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - @@unique([userId, campaignId]) - @@map("user_campaigns") -} - -model ChanceTransaction { - id String @id @default(uuid()) - userId String @map("user_id") - user User @relation(fields: [userId], references: [id]) - campaignId String @map("campaign_id") - campaign Campaign @relation(fields: [campaignId], references: [id]) - amount Int // مثبت یا منفی - type ChanceTxnType - referenceType String? @map("reference_type") // e.g. "spin", "manual" - referenceId String? @map("reference_id") - description String? - createdById String? @map("created_by") // admin id در صورت تغییر دستی - createdBy Admin? @relation("AdminCreatedTxn", fields: [createdById], references: [id]) - createdAt DateTime @default(now()) @map("created_at") - - @@index([userId, campaignId]) - @@map("chance_transactions") -} - -model Spin { - id String @id @default(uuid()) - userId String @map("user_id") - user User @relation(fields: [userId], references: [id]) - campaignId String @map("campaign_id") - campaign Campaign @relation(fields: [campaignId], references: [id]) - prizeId String? @map("prize_id") - prize Prize? @relation(fields: [prizeId], references: [id]) - status SpinStatus @default(SUCCESS) - idempotencyKey String @unique @map("idempotency_key") - ip String? - userAgent String? @map("user_agent") - createdAt DateTime @default(now()) @map("created_at") - - userPrize UserPrize? - - @@index([userId, campaignId]) - @@index([campaignId, createdAt]) - @@map("spins") -} - -model UserPrize { - id String @id @default(uuid()) - userId String @map("user_id") - user User @relation(fields: [userId], references: [id]) - campaignId String @map("campaign_id") - campaign Campaign @relation(fields: [campaignId], references: [id]) - prizeId String @map("prize_id") - prize Prize @relation(fields: [prizeId], references: [id]) - spinId String @unique @map("spin_id") - spin Spin @relation(fields: [spinId], references: [id]) - code String? @unique - status UserPrizeStatus @default(NEW) - wonAt DateTime @default(now()) @map("won_at") - redeemedAt DateTime? @map("redeemed_at") - - @@index([userId]) - @@index([status]) - @@map("user_prizes") -} - -model SmsLog { - id String @id @default(uuid()) - userId String? @map("user_id") - user User? @relation(fields: [userId], references: [id]) - mobile String - type SmsType - message String - provider String @default("raygansms") - status SmsStatus @default(PENDING) - providerResponse Json? @map("provider_response") - createdAt DateTime @default(now()) @map("created_at") - - @@index([mobile, type]) - @@map("sms_logs") -} - -model AdminLog { - id String @id @default(uuid()) - adminId String @map("admin_id") - admin Admin @relation(fields: [adminId], references: [id]) - action String // e.g. "prize.update", "chance.add" - entityType String @map("entity_type") - entityId String @map("entity_id") - oldValue Json? @map("old_value") - newValue Json? @map("new_value") - ip String? - createdAt DateTime @default(now()) @map("created_at") - - @@index([entityType, entityId]) - @@map("admin_logs") -} +generator client { + provider = "prisma-client-js" + // native = ویندوز/مک لوکال؛ debian = ایمیج node:20-bookworm-slim در Docker + binaryTargets = ["native", "debian-openssl-3.0.x"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// ==================== ENUMS ==================== + +enum AdminStatus { + ACTIVE + DISABLED +} + +enum AdminRole { + SUPER_ADMIN + OPERATOR + SUPPORT +} + +enum UserStatus { + ACTIVE + BLOCKED +} + +enum CampaignStatus { + DRAFT + ACTIVE + PAUSED + FINISHED +} + +enum PrizeType { + PHYSICAL + DISCOUNT_CODE + CREDIT + CASH + NO_PRIZE + OTHER +} + +enum StockType { + LIMITED + UNLIMITED +} + +enum PrizeStatus { + ACTIVE + INACTIVE +} + +enum SpinStatus { + SUCCESS + FAILED + DUPLICATE +} + +enum ChanceTxnType { + SIGNUP_BONUS + ADMIN_ADJUSTMENT + SPIN_CONSUME + CAMPAIGN_BONUS + REFUND +} + +enum UserPrizeStatus { + NEW + CONTACTED + DELIVERED + ACTIVE_CODE + USED + EXPIRED +} + +enum SmsType { + OTP + WINNING + NO_PRIZE + PRIZE_REMINDER +} + +enum SmsStatus { + PENDING + SENT + FAILED +} + +enum WheelDesign { + CLASSIC_CASINO + NEON_CYBER + MINIMAL_FLAT + LUXURY_GOLD + PLAYFUL_CARTOON +} + +// ==================== MODELS ==================== + +model Admin { + id String @id @default(uuid()) + name String + mobile String @unique + email String @unique + passwordHash String @map("password_hash") + role AdminRole @default(OPERATOR) + status AdminStatus @default(ACTIVE) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + auditLogs AdminLog[] + chanceTxns ChanceTransaction[] @relation("AdminCreatedTxn") + + @@map("admins") +} + +model User { + id String @id @default(uuid()) + mobile String @unique + name String? + status UserStatus @default(ACTIVE) + lastLoginAt DateTime? @map("last_login_at") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + userCampaigns UserCampaign[] + chanceTransactions ChanceTransaction[] + spins Spin[] + userPrizes UserPrize[] + otpCodes OtpCode[] + smsLogs SmsLog[] + + @@index([mobile]) + @@map("users") +} + +model OtpCode { + id String @id @default(uuid()) + mobile String + code String + userId String? @map("user_id") + user User? @relation(fields: [userId], references: [id]) + attempts Int @default(0) + consumed Boolean @default(false) + expiresAt DateTime @map("expires_at") + createdAt DateTime @default(now()) @map("created_at") + + @@index([mobile, consumed]) + @@map("otp_codes") +} + +model Campaign { + id String @id @default(uuid()) + title String + slug String @unique + description String? + image String? + banner String? + logo String? + startAt DateTime @map("start_at") + endAt DateTime @map("end_at") + status CampaignStatus @default(DRAFT) + defaultChances Int @default(0) @map("default_chances") + rules String? + ctaText String? @map("cta_text") + wheelDesign WheelDesign @default(CLASSIC_CASINO) @map("wheel_design") + settings Json? // primaryColor, secondaryColor, headerText, buttonText, headerImage, celebrationEffect... + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + prizes Prize[] + userCampaigns UserCampaign[] + chanceTxns ChanceTransaction[] + spins Spin[] + userPrizes UserPrize[] + + @@index([status, startAt, endAt]) + @@map("campaigns") +} + +model Prize { + id String @id @default(uuid()) + campaignId String @map("campaign_id") + campaign Campaign @relation(fields: [campaignId], references: [id], onDelete: Cascade) + title String + description String? + image String? + type PrizeType + stockType StockType @map("stock_type") + initialStock Int? @map("initial_stock") + remainingStock Int? @map("remaining_stock") + weight Int + status PrizeStatus @default(ACTIVE) + sortOrder Int @default(0) @map("sort_order") + segmentColor String @map("segment_color") + expiresAt DateTime? @map("expires_at") + smsTemplate String? @map("sms_template") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + spins Spin[] + userPrizes UserPrize[] + + @@index([campaignId, status]) + @@map("prizes") +} + +model UserCampaign { + id String @id @default(uuid()) + userId String @map("user_id") + user User @relation(fields: [userId], references: [id]) + campaignId String @map("campaign_id") + campaign Campaign @relation(fields: [campaignId], references: [id]) + totalChances Int @default(0) @map("total_chances") + usedChances Int @default(0) @map("used_chances") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@unique([userId, campaignId]) + @@map("user_campaigns") +} + +model ChanceTransaction { + id String @id @default(uuid()) + userId String @map("user_id") + user User @relation(fields: [userId], references: [id]) + campaignId String @map("campaign_id") + campaign Campaign @relation(fields: [campaignId], references: [id]) + amount Int // مثبت یا منفی + type ChanceTxnType + referenceType String? @map("reference_type") // e.g. "spin", "manual" + referenceId String? @map("reference_id") + description String? + createdById String? @map("created_by") // admin id در صورت تغییر دستی + createdBy Admin? @relation("AdminCreatedTxn", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) @map("created_at") + + @@index([userId, campaignId]) + @@map("chance_transactions") +} + +model Spin { + id String @id @default(uuid()) + userId String @map("user_id") + user User @relation(fields: [userId], references: [id]) + campaignId String @map("campaign_id") + campaign Campaign @relation(fields: [campaignId], references: [id]) + prizeId String? @map("prize_id") + prize Prize? @relation(fields: [prizeId], references: [id]) + status SpinStatus @default(SUCCESS) + idempotencyKey String @unique @map("idempotency_key") + ip String? + userAgent String? @map("user_agent") + createdAt DateTime @default(now()) @map("created_at") + + userPrize UserPrize? + + @@index([userId, campaignId]) + @@index([campaignId, createdAt]) + @@map("spins") +} + +model UserPrize { + id String @id @default(uuid()) + userId String @map("user_id") + user User @relation(fields: [userId], references: [id]) + campaignId String @map("campaign_id") + campaign Campaign @relation(fields: [campaignId], references: [id]) + prizeId String @map("prize_id") + prize Prize @relation(fields: [prizeId], references: [id]) + spinId String @unique @map("spin_id") + spin Spin @relation(fields: [spinId], references: [id]) + code String? @unique + status UserPrizeStatus @default(NEW) + wonAt DateTime @default(now()) @map("won_at") + redeemedAt DateTime? @map("redeemed_at") + + @@index([userId]) + @@index([status]) + @@map("user_prizes") +} + +model SmsLog { + id String @id @default(uuid()) + userId String? @map("user_id") + user User? @relation(fields: [userId], references: [id]) + mobile String + type SmsType + message String + provider String @default("raygansms") + status SmsStatus @default(PENDING) + providerResponse Json? @map("provider_response") + createdAt DateTime @default(now()) @map("created_at") + + @@index([mobile, type]) + @@map("sms_logs") +} + +model AdminLog { + id String @id @default(uuid()) + adminId String @map("admin_id") + admin Admin @relation(fields: [adminId], references: [id]) + action String // e.g. "prize.update", "chance.add" + entityType String @map("entity_type") + entityId String @map("entity_id") + oldValue Json? @map("old_value") + newValue Json? @map("new_value") + ip String? + createdAt DateTime @default(now()) @map("created_at") + + @@index([entityType, entityId]) + @@map("admin_logs") +} diff --git a/apps/api/release/prisma/seed-user.ts b/apps/api/release/prisma/seed-user.ts index e1ee101..81fa182 100644 --- a/apps/api/release/prisma/seed-user.ts +++ b/apps/api/release/prisma/seed-user.ts @@ -1,52 +1,52 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -async function main() { - const user = await prisma.user.upsert({ - where: { mobile: '09382507041' }, - create: { - mobile: '09382507041', - name: 'کاربر ویژه', - status: 'ACTIVE', - }, - update: { - status: 'ACTIVE', - }, - }); - - const campaign = await prisma.campaign.findUnique({ - where: { slug: 'default-campaign' }, - }); - - if (campaign) { - await prisma.userCampaign.upsert({ - where: { - userId_campaignId: { - userId: user.id, - campaignId: campaign.id, - }, - }, - create: { - userId: user.id, - campaignId: campaign.id, - totalChances: 10, - usedChances: 0, - }, - update: { - totalChances: { increment: 10 }, - }, - }); - } - - console.log('SUCCESS: User 09382507041 is authorized and ready with 10 chances!'); -} - -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + const user = await prisma.user.upsert({ + where: { mobile: '09382507041' }, + create: { + mobile: '09382507041', + name: 'کاربر ویژه', + status: 'ACTIVE', + }, + update: { + status: 'ACTIVE', + }, + }); + + const campaign = await prisma.campaign.findUnique({ + where: { slug: 'default-campaign' }, + }); + + if (campaign) { + await prisma.userCampaign.upsert({ + where: { + userId_campaignId: { + userId: user.id, + campaignId: campaign.id, + }, + }, + create: { + userId: user.id, + campaignId: campaign.id, + totalChances: 10, + usedChances: 0, + }, + update: { + totalChances: { increment: 10 }, + }, + }); + } + + console.log('SUCCESS: User 09382507041 is authorized and ready with 10 chances!'); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/apps/api/release/prisma/seed.ts b/apps/api/release/prisma/seed.ts index 2595e9a..c0a3d63 100644 --- a/apps/api/release/prisma/seed.ts +++ b/apps/api/release/prisma/seed.ts @@ -1,116 +1,116 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -async function main() { - console.log('Seeding default demo campaign and prizes...'); - - const existingCampaign = await prisma.campaign.findUnique({ - where: { slug: 'default-campaign' }, - }); - - if (existingCampaign) { - console.log('Default campaign already exists.'); - return; - } - - const campaign = await prisma.campaign.create({ - data: { - title: 'گردونه شانس جشنواره بزرگ نوروزی', - slug: 'default-campaign', - description: 'هر روز با چرخاندن گردونه، شانس برنده شدن آیفون، سکه طلا، و کدهای تخفیف شگفت‌انگیز را داشته باشید!', - startAt: new Date(Date.now() - 24 * 3600 * 1000), - endAt: new Date(Date.now() + 60 * 24 * 3600 * 1000), - status: 'ACTIVE', - defaultChances: 3, - ctaText: 'بچرخون و برنده شو!', - wheelDesign: 'CLASSIC_CASINO', - rules: '۱. هر کاربر در بدو ورود ۳ شانس چرخاندن رایگان دریافت می‌کند.\n۲. جوایز فیزیکی پس از هماهنگی تلفنی توسط پشتیبانی ارسال خواهد شد.\n۳. کدهای تخفیف بلافاصله پیامک شده و تا ۷ روز پس از دریافت معتبر هستند.', - prizes: { - create: [ - { - title: 'آیفون ۱۵ پرو', - type: 'PHYSICAL', - stockType: 'LIMITED', - initialStock: 3, - remainingStock: 3, - weight: 1, - sortOrder: 1, - segmentColor: '#b91c1c', - }, - { - title: 'تخفیف ۵۰٪ دیجی‌کالا', - type: 'DISCOUNT_CODE', - stockType: 'UNLIMITED', - weight: 25, - sortOrder: 2, - segmentColor: '#1e293b', - }, - { - title: 'کارت هدیه ۵۰۰ تومانی', - type: 'CREDIT', - stockType: 'LIMITED', - initialStock: 50, - remainingStock: 50, - weight: 10, - sortOrder: 3, - segmentColor: '#b91c1c', - }, - { - title: 'پوچ (دفعه بعد)', - type: 'NO_PRIZE', - stockType: 'UNLIMITED', - weight: 20, - sortOrder: 4, - segmentColor: '#1e293b', - }, - { - title: 'تخفیف ۳۰٪ اسنپ', - type: 'DISCOUNT_CODE', - stockType: 'UNLIMITED', - weight: 20, - sortOrder: 5, - segmentColor: '#b91c1c', - }, - { - title: 'ساعت هوشمند', - type: 'PHYSICAL', - stockType: 'LIMITED', - initialStock: 10, - remainingStock: 10, - weight: 4, - sortOrder: 6, - segmentColor: '#1e293b', - }, - { - title: 'شانس مجدد', - type: 'OTHER', - stockType: 'UNLIMITED', - weight: 15, - sortOrder: 7, - segmentColor: '#b91c1c', - }, - { - title: 'پوچ (بدون جایزه)', - type: 'NO_PRIZE', - stockType: 'UNLIMITED', - weight: 5, - sortOrder: 8, - segmentColor: '#1e293b', - }, - ], - }, - }, - }); - - console.log(`Campaign created with ID: ${campaign.id} and 8 prizes.`); -} - -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('Seeding default demo campaign and prizes...'); + + const existingCampaign = await prisma.campaign.findUnique({ + where: { slug: 'default-campaign' }, + }); + + if (existingCampaign) { + console.log('Default campaign already exists.'); + return; + } + + const campaign = await prisma.campaign.create({ + data: { + title: 'گردونه شانس جشنواره بزرگ نوروزی', + slug: 'default-campaign', + description: 'هر روز با چرخاندن گردونه، شانس برنده شدن آیفون، سکه طلا، و کدهای تخفیف شگفت‌انگیز را داشته باشید!', + startAt: new Date(Date.now() - 24 * 3600 * 1000), + endAt: new Date(Date.now() + 60 * 24 * 3600 * 1000), + status: 'ACTIVE', + defaultChances: 3, + ctaText: 'بچرخون و برنده شو!', + wheelDesign: 'CLASSIC_CASINO', + rules: '۱. هر کاربر در بدو ورود ۳ شانس چرخاندن رایگان دریافت می‌کند.\n۲. جوایز فیزیکی پس از هماهنگی تلفنی توسط پشتیبانی ارسال خواهد شد.\n۳. کدهای تخفیف بلافاصله پیامک شده و تا ۷ روز پس از دریافت معتبر هستند.', + prizes: { + create: [ + { + title: 'آیفون ۱۵ پرو', + type: 'PHYSICAL', + stockType: 'LIMITED', + initialStock: 3, + remainingStock: 3, + weight: 1, + sortOrder: 1, + segmentColor: '#b91c1c', + }, + { + title: 'تخفیف ۵۰٪ دیجی‌کالا', + type: 'DISCOUNT_CODE', + stockType: 'UNLIMITED', + weight: 25, + sortOrder: 2, + segmentColor: '#1e293b', + }, + { + title: 'کارت هدیه ۵۰۰ تومانی', + type: 'CREDIT', + stockType: 'LIMITED', + initialStock: 50, + remainingStock: 50, + weight: 10, + sortOrder: 3, + segmentColor: '#b91c1c', + }, + { + title: 'پوچ (دفعه بعد)', + type: 'NO_PRIZE', + stockType: 'UNLIMITED', + weight: 20, + sortOrder: 4, + segmentColor: '#1e293b', + }, + { + title: 'تخفیف ۳۰٪ اسنپ', + type: 'DISCOUNT_CODE', + stockType: 'UNLIMITED', + weight: 20, + sortOrder: 5, + segmentColor: '#b91c1c', + }, + { + title: 'ساعت هوشمند', + type: 'PHYSICAL', + stockType: 'LIMITED', + initialStock: 10, + remainingStock: 10, + weight: 4, + sortOrder: 6, + segmentColor: '#1e293b', + }, + { + title: 'شانس مجدد', + type: 'OTHER', + stockType: 'UNLIMITED', + weight: 15, + sortOrder: 7, + segmentColor: '#b91c1c', + }, + { + title: 'پوچ (بدون جایزه)', + type: 'NO_PRIZE', + stockType: 'UNLIMITED', + weight: 5, + sortOrder: 8, + segmentColor: '#1e293b', + }, + ], + }, + }, + }); + + console.log(`Campaign created with ID: ${campaign.id} and 8 prizes.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/apps/client/.env.production b/apps/client/.env.production index 5b24675..6421bd5 100644 --- a/apps/client/.env.production +++ b/apps/client/.env.production @@ -1 +1 @@ -VITE_API_BASE_URL=https://api.wheel.montzar.ir/api +VITE_API_BASE_URL=https://api.wheel.montest.ir/api diff --git a/apps/client/dist/assets/CampaignWheelView-D2XZF_HU.js b/apps/client/dist/assets/CampaignWheelView-NeK9mDgs.js similarity index 99% rename from apps/client/dist/assets/CampaignWheelView-D2XZF_HU.js rename to apps/client/dist/assets/CampaignWheelView-NeK9mDgs.js index 1ae4115..061183d 100644 --- a/apps/client/dist/assets/CampaignWheelView-D2XZF_HU.js +++ b/apps/client/dist/assets/CampaignWheelView-NeK9mDgs.js @@ -1,4 +1,4 @@ -import{d as de,u as Ae,w as pe,m as De,c as f,a as s,e as Z,b as i,j as Q,t as j,k as D,p as Be,q as Ve,v as ze,g as z,i as c,s as at,h as Ue,f as We,n as Te,l as Ge,x as W,y as oe,F as le,r as re,z as _e,o as ot,A as lt,B as rt}from"./index-ilYp-WvI.js";import{c as K,t as ie,L as ke,C as Ze,A as it,b as ct,a as ut}from"./loader-circle-w-52iWEJ.js";var me=(k=>(k.CLASSIC_CASINO="CLASSIC_CASINO",k.NEON_CYBER="NEON_CYBER",k.MINIMAL_FLAT="MINIMAL_FLAT",k.LUXURY_GOLD="LUXURY_GOLD",k.PLAYFUL_CARTOON="PLAYFUL_CARTOON",k))(me||{});/** +import{d as de,u as Ae,w as pe,m as De,c as f,a as s,e as Z,b as i,j as Q,t as j,k as D,p as Be,q as Ve,v as ze,g as z,i as c,s as at,h as Ue,f as We,n as Te,l as Ge,x as W,y as oe,F as le,r as re,z as _e,o as ot,A as lt,B as rt}from"./index-CFILnBxv.js";import{c as K,t as ie,L as ke,C as Ze,A as it,b as ct,a as ut}from"./loader-circle-CjrTYK9r.js";var me=(k=>(k.CLASSIC_CASINO="CLASSIC_CASINO",k.NEON_CYBER="NEON_CYBER",k.MINIMAL_FLAT="MINIMAL_FLAT",k.LUXURY_GOLD="LUXURY_GOLD",k.PLAYFUL_CARTOON="PLAYFUL_CARTOON",k))(me||{});/** * @license lucide-vue-next v0.378.0 - ISC * * This source code is licensed under the ISC license. diff --git a/apps/client/dist/assets/MyPrizesView-g_lvWtzt.js b/apps/client/dist/assets/MyPrizesView-jVO1o30M.js similarity index 97% rename from apps/client/dist/assets/MyPrizesView-g_lvWtzt.js rename to apps/client/dist/assets/MyPrizesView-jVO1o30M.js index 4aa7e84..e868740 100644 --- a/apps/client/dist/assets/MyPrizesView-g_lvWtzt.js +++ b/apps/client/dist/assets/MyPrizesView-jVO1o30M.js @@ -1,4 +1,4 @@ -import{c as k,A as D,a as j,L as E,C as z,b as I,t as y}from"./loader-circle-w-52iWEJ.js";import{d as L,u as S,o as V,c as r,a as e,b as a,e as i,F as N,r as R,f as T,g as b,h as B,i as l,j as p,t as n,n as M,k as w,l as F}from"./index-ilYp-WvI.js";/** +import{c as k,A as D,a as j,L as E,C as z,b as I,t as y}from"./loader-circle-CjrTYK9r.js";import{d as L,u as S,o as V,c as r,a as e,b as a,e as i,F as N,r as R,f as T,g as b,h as B,i as l,j as p,t as n,n as M,k as w,l as F}from"./index-CFILnBxv.js";/** * @license lucide-vue-next v0.378.0 - ISC * * This source code is licensed under the ISC license. diff --git a/apps/client/dist/assets/index-ilYp-WvI.js b/apps/client/dist/assets/index-CFILnBxv.js similarity index 99% rename from apps/client/dist/assets/index-ilYp-WvI.js rename to apps/client/dist/assets/index-CFILnBxv.js index 45e4a72..3150578 100644 --- a/apps/client/dist/assets/index-ilYp-WvI.js +++ b/apps/client/dist/assets/index-CFILnBxv.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MyPrizesView-g_lvWtzt.js","assets/loader-circle-w-52iWEJ.js","assets/CampaignWheelView-D2XZF_HU.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MyPrizesView-jVO1o30M.js","assets/loader-circle-CjrTYK9r.js","assets/CampaignWheelView-NeK9mDgs.js"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();/** * @vue/shared v3.5.42 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -28,7 +28,7 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MyPrizesView-g_ `);i=l===-1?"":o.slice(l+1)}if(!r.stack)r.stack=i;else if(i){const l=i.indexOf(` `),c=l===-1?-1:i.indexOf(` `,l+1),f=c===-1?"":i.slice(c+1);String(r.stack).endsWith(f)||(r.stack+=` -`+i)}}catch{}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ht(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&Zn.assertOptions(r,{silentJSONParsing:Oe.transitional(Oe.boolean),forcedJSONParsing:Oe.transitional(Oe.boolean),clarifyTimeoutError:Oe.transitional(Oe.boolean),legacyInterceptorReqResOrdering:Oe.transitional(Oe.boolean),advertiseZstdAcceptEncoding:Oe.transitional(Oe.boolean),validateStatusUndefinedResolves:Oe.transitional(Oe.boolean)},!1),s!=null&&(m.isFunction(s)?n.paramsSerializer={serialize:s}:Zn.assertOptions(s,{encode:Oe.function,serialize:Oe.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Zn.assertOptions(n,{baseUrl:Oe.spelling("baseURL"),withXsrfToken:Oe.spelling("withXSRFToken")},!0),n.method=(m.getSafeProp(n,"method")||m.getSafeProp(this.defaults,"method")||"get").toLowerCase();let i=o&&m.merge(o.common,o[n.method]);o&&m.forEach(oc.concat("common"),P=>{delete o[P]}),n.headers=xe.concat(i,o);const l=[];let c=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;c=c&&v.synchronous;const U=n.transitional||Ws;U&&U.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const f=[];this.interceptors.response.forEach(function(v){f.push(v.fulfilled,v.rejected)});let a,u=0,p;if(!c){const P=[Zr.bind(this),void 0];for(P.unshift(...l),P.push(...f),p=P.length,a=Promise.resolve(n);uZr.call(this,g)))}catch(_){a=Promise.reject(_)}break}}if(!a)try{a=Zr.call(this,g)}catch(P){a=Promise.reject(P)}for(u=0,p=f.length;u{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(l=>{r.subscribe(l),o=l}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,l){r.reason||(r.reason=new Bn(o,i,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new pc(function(s){t=s}),cancel:t}}};function mh(e){return function(n){return e.apply(null,n)}}function gh(e){return m.isObject(e)&&e.isAxiosError===!0}const er={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(er).forEach(([e,t])=>{er[t]===void 0&&(er[t]=e)});function mc(e){const t=new jt(e),n=Bl(jt.prototype.request,t);return m.extend(n,jt.prototype,t,{allOwnKeys:!0}),m.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return mc(Ht(e,s))},n}const he=mc(Mn);he.Axios=jt;he.CanceledError=Bn;he.CancelToken=ph;he.isCancel=ic;he.VERSION=zs;he.toFormData=Nr;he.AxiosError=D;he.Cancel=he.CanceledError;he.all=function(t){return Promise.all(t)};he.spread=mh;he.isAxiosError=gh;he.mergeConfig=Ht;he.AxiosHeaders=xe;he.formToJSON=e=>sc(m.isHTMLForm(e)?new FormData(e):e);he.getAdapter=hc.getAdapter;he.HttpStatusCode=er;he.default=he;const{Axios:Vp,AxiosError:qp,CanceledError:$p,isCancel:Wp,CancelToken:Kp,VERSION:zp,all:Gp,Cancel:Jp,isAxiosError:Xp,spread:Qp,toFormData:Yp,AxiosHeaders:Zp,HttpStatusCode:em,formToJSON:tm,getAdapter:nm,mergeConfig:rm,create:sm}=he,yh="https://api.wheel.montzar.ir/api",Gt=he.create({baseURL:yh,headers:{"Content-Type":"application/json"}});Gt.interceptors.request.use(e=>{const t=localStorage.getItem("user_access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e));Gt.interceptors.response.use(e=>e.data&&e.data.success!==void 0&&e.data.data!==void 0?{...e,data:e.data.data,meta:e.data.meta}:e,e=>Promise.reject(e));const _h=of("userAuth",()=>{const e=gn(localStorage.getItem("user_access_token")),t=gn(localStorage.getItem("user_info")?JSON.parse(localStorage.getItem("user_info")):null),n=gn({totalChances:0,usedChances:0,remainingChances:0}),r=ke(()=>!!e.value);async function s(u){return(await Gt.post("/auth/send-otp",{mobile:u})).data}async function o(u,p,g){const v=(await Gt.post("/auth/verify-otp",{mobile:u,code:p})).data;return e.value=v.accessToken,t.value=v.user,localStorage.setItem("user_access_token",v.accessToken),localStorage.setItem("user_info",JSON.stringify(v.user)),g&&await l(g),v}async function i(){if(!e.value)return null;try{const u=await Gt.get("/me");return t.value=u.data,localStorage.setItem("user_info",JSON.stringify(u.data)),u.data}catch{return a(),null}}async function l(u){if(!(!e.value||!u))try{const p=await Gt.get("/me/chances",{params:{campaignId:u}});n.value=p.data}catch{}}function c(){n.value.remainingChances>0&&(n.value.remainingChances--,n.value.usedChances++)}function f(u){n.value.remainingChances=u}function a(){e.value=null,t.value=null,n.value={totalChances:0,usedChances:0,remainingChances:0},localStorage.removeItem("user_access_token"),localStorage.removeItem("user_info")}return{token:e,user:t,chances:n,isAuthenticated:r,requestOtp:s,verifyOtp:o,loadProfile:i,loadChances:l,decrementChance:c,setRemainingChances:f,logout:a}}),bh=Ms({__name:"App",setup(e){const t=_h();return nl(async()=>{t.isAuthenticated&&await t.loadProfile()}),(n,r)=>{const s=Ua("router-view");return Ol(),xl(s)}}}),Eh="modulepreload",wh=function(e){return"/"+e},ti={},es=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));s=Promise.allSettled(n.map(c=>{if(c=wh(c),c in ti)return;ti[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const u=document.createElement("link");if(u.rel=f?"stylesheet":Eh,f||(u.as="script"),u.crossOrigin="",u.href=c,l&&u.setAttribute("nonce",l),document.head.appendChild(u),f)return new Promise((p,g)=>{u.addEventListener("load",p),u.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return s.then(i=>{for(const l of i||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})};/*! +`+i)}}catch{}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ht(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&Zn.assertOptions(r,{silentJSONParsing:Oe.transitional(Oe.boolean),forcedJSONParsing:Oe.transitional(Oe.boolean),clarifyTimeoutError:Oe.transitional(Oe.boolean),legacyInterceptorReqResOrdering:Oe.transitional(Oe.boolean),advertiseZstdAcceptEncoding:Oe.transitional(Oe.boolean),validateStatusUndefinedResolves:Oe.transitional(Oe.boolean)},!1),s!=null&&(m.isFunction(s)?n.paramsSerializer={serialize:s}:Zn.assertOptions(s,{encode:Oe.function,serialize:Oe.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Zn.assertOptions(n,{baseUrl:Oe.spelling("baseURL"),withXsrfToken:Oe.spelling("withXSRFToken")},!0),n.method=(m.getSafeProp(n,"method")||m.getSafeProp(this.defaults,"method")||"get").toLowerCase();let i=o&&m.merge(o.common,o[n.method]);o&&m.forEach(oc.concat("common"),P=>{delete o[P]}),n.headers=xe.concat(i,o);const l=[];let c=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;c=c&&v.synchronous;const U=n.transitional||Ws;U&&U.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const f=[];this.interceptors.response.forEach(function(v){f.push(v.fulfilled,v.rejected)});let a,u=0,p;if(!c){const P=[Zr.bind(this),void 0];for(P.unshift(...l),P.push(...f),p=P.length,a=Promise.resolve(n);uZr.call(this,g)))}catch(_){a=Promise.reject(_)}break}}if(!a)try{a=Zr.call(this,g)}catch(P){a=Promise.reject(P)}for(u=0,p=f.length;u{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(l=>{r.subscribe(l),o=l}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,l){r.reason||(r.reason=new Bn(o,i,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new pc(function(s){t=s}),cancel:t}}};function mh(e){return function(n){return e.apply(null,n)}}function gh(e){return m.isObject(e)&&e.isAxiosError===!0}const er={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(er).forEach(([e,t])=>{er[t]===void 0&&(er[t]=e)});function mc(e){const t=new jt(e),n=Bl(jt.prototype.request,t);return m.extend(n,jt.prototype,t,{allOwnKeys:!0}),m.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return mc(Ht(e,s))},n}const he=mc(Mn);he.Axios=jt;he.CanceledError=Bn;he.CancelToken=ph;he.isCancel=ic;he.VERSION=zs;he.toFormData=Nr;he.AxiosError=D;he.Cancel=he.CanceledError;he.all=function(t){return Promise.all(t)};he.spread=mh;he.isAxiosError=gh;he.mergeConfig=Ht;he.AxiosHeaders=xe;he.formToJSON=e=>sc(m.isHTMLForm(e)?new FormData(e):e);he.getAdapter=hc.getAdapter;he.HttpStatusCode=er;he.default=he;const{Axios:Vp,AxiosError:qp,CanceledError:$p,isCancel:Wp,CancelToken:Kp,VERSION:zp,all:Gp,Cancel:Jp,isAxiosError:Xp,spread:Qp,toFormData:Yp,AxiosHeaders:Zp,HttpStatusCode:em,formToJSON:tm,getAdapter:nm,mergeConfig:rm,create:sm}=he,yh="https://api.wheel.montest.ir/api",Gt=he.create({baseURL:yh,headers:{"Content-Type":"application/json"}});Gt.interceptors.request.use(e=>{const t=localStorage.getItem("user_access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e));Gt.interceptors.response.use(e=>e.data&&e.data.success!==void 0&&e.data.data!==void 0?{...e,data:e.data.data,meta:e.data.meta}:e,e=>Promise.reject(e));const _h=of("userAuth",()=>{const e=gn(localStorage.getItem("user_access_token")),t=gn(localStorage.getItem("user_info")?JSON.parse(localStorage.getItem("user_info")):null),n=gn({totalChances:0,usedChances:0,remainingChances:0}),r=ke(()=>!!e.value);async function s(u){return(await Gt.post("/auth/send-otp",{mobile:u})).data}async function o(u,p,g){const v=(await Gt.post("/auth/verify-otp",{mobile:u,code:p})).data;return e.value=v.accessToken,t.value=v.user,localStorage.setItem("user_access_token",v.accessToken),localStorage.setItem("user_info",JSON.stringify(v.user)),g&&await l(g),v}async function i(){if(!e.value)return null;try{const u=await Gt.get("/me");return t.value=u.data,localStorage.setItem("user_info",JSON.stringify(u.data)),u.data}catch{return a(),null}}async function l(u){if(!(!e.value||!u))try{const p=await Gt.get("/me/chances",{params:{campaignId:u}});n.value=p.data}catch{}}function c(){n.value.remainingChances>0&&(n.value.remainingChances--,n.value.usedChances++)}function f(u){n.value.remainingChances=u}function a(){e.value=null,t.value=null,n.value={totalChances:0,usedChances:0,remainingChances:0},localStorage.removeItem("user_access_token"),localStorage.removeItem("user_info")}return{token:e,user:t,chances:n,isAuthenticated:r,requestOtp:s,verifyOtp:o,loadProfile:i,loadChances:l,decrementChance:c,setRemainingChances:f,logout:a}}),bh=Ms({__name:"App",setup(e){const t=_h();return nl(async()=>{t.isAuthenticated&&await t.loadProfile()}),(n,r)=>{const s=Ua("router-view");return Ol(),xl(s)}}}),Eh="modulepreload",wh=function(e){return"/"+e},ti={},es=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));s=Promise.allSettled(n.map(c=>{if(c=wh(c),c in ti)return;ti[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const u=document.createElement("link");if(u.rel=f?"stylesheet":Eh,f||(u.as="script"),u.crossOrigin="",u.href=c,l&&u.setAttribute("nonce",l),document.head.appendChild(u),f)return new Promise((p,g)=>{u.addEventListener("load",p),u.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return s.then(i=>{for(const l of i||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})};/*! * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT @@ -36,4 +36,4 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MyPrizesView-g_ * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let np=()=>location.protocol+"//"+location.host;function Ac(e,t){const{pathname:n,search:r,hash:s}=t,o=e.indexOf("#");if(o>-1){let i=s.includes(e.slice(o))?e.slice(o).length:1,l=s.slice(i);return l[0]!=="/"&&(l="/"+l),ri(l,"")}return ri(n,e)+r+s}function rp(e,t,n,r){let s=[],o=[],i=null;const l=({state:p})=>{const g=Ac(e,location),P=n.value,v=t.value;let U=0;if(p){if(n.value=g,t.value=p,i&&i===P){i=null;return}U=v?p.position-v.position:0}else r(g);s.forEach(_=>{_(n.value,P,{delta:U,type:Es.pop,direction:U?U>0?rs.forward:rs.back:rs.unknown})})};function c(){i=n.value}function f(p){s.push(p);const g=()=>{const P=s.indexOf(p);P>-1&&s.splice(P,1)};return o.push(g),g}function a(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(te({},p.state,{scroll:Dr()}),"")}}function u(){for(const p of o)p();o=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",a),document.removeEventListener("visibilitychange",a)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",a),document.addEventListener("visibilitychange",a),{pauseListeners:c,listen:f,destroy:u}}function ci(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?Dr():null}}function sp(e){const{history:t,location:n}=window,r={value:Ac(e,n)},s={value:t.state};s.value||o(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(c,f,a){const u=e.indexOf("#"),p=u>-1?(n.host&&document.querySelector("base")?e:e.slice(u))+c:np()+e+c;try{t[a?"replaceState":"pushState"](f,"",p),s.value=f}catch(g){console.error(g),n[a?"replace":"assign"](p)}}function i(c,f){o(c,te({},t.state,ci(s.value.back,c,s.value.forward,!0),f,{position:s.value.position}),!0),r.value=c}function l(c,f){const a=te({},s.value,t.state,{forward:c,scroll:Dr()});o(a.current,a,!0),o(c,te({},ci(r.value,c,null),{position:a.position+1},f),!1),r.value=c}return{location:r,state:s,push:l,replace:i}}function op(e){e=Vh(e);const t=sp(e),n=rp(e,t.state,t.location,t.replace);function r(o,i=!0){i||n.pauseListeners(),history.go(o)}const s=te({location:"",base:e,go:r,createHref:$h.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}let It=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var ge=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(ge||{});const ip={type:It.Static,value:""},lp=/[a-zA-Z0-9_]/;function cp(e){if(!e)return[[]];if(e==="/")return[[ip]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${f}": ${g}`)}let n=ge.Static,r=n;const s=[];let o;function i(){o&&s.push(o),o=[]}let l=0,c,f="",a="";function u(){f&&(n===ge.Static?o.push({type:It.Static,value:f}):n===ge.Param||n===ge.ParamRegExp||n===ge.ParamRegExpEnd?(o.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),o.push({type:It.Param,value:f,regexp:a,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function p(){f+=c}for(;lt.length?t.length===1&&t[0]===Te.Static+Te.Segment?1:-1:0}function vc(e,t){let n=0;const r=e.score,s=t.score;for(;n0&&t[t.length-1]<0}const hp={strict:!1,end:!0,sensitive:!1};function pp(e,t,n){const r=fp(cp(e.path),n),s=te(r,{record:e,parent:t,children:[],alias:[]});return t&&!s.record.aliasOf==!t.record.aliasOf&&t.children.push(s),s}function mp(e,t){const n=[],r=new Map;t=ni(hp,t);function s(u){return r.get(u)}function o(u,p,g){const P=!g,v=di(u);v.aliasOf=g&&g.record;const U=ni(t,u),_=[v];if("alias"in u){const x=typeof u.alias=="string"?[u.alias]:u.alias;for(const M of x)_.push(di(te({},v,{components:g?g.record.components:v.components,path:M,aliasOf:g?g.record:v})))}let E,C;for(const x of _){const{path:M}=x;if(p&&M[0]!=="/"){const G=p.record.path,k=G[G.length-1]==="/"?"":"/";x.path=p.record.path+(M&&k+M)}if(E=pp(x,p,U),g?g.alias.push(E):(C=C||E,C!==E&&C.alias.push(E),P&&u.name&&!hi(E)&&i(u.name)),xc(E)&&c(E),v.children){const G=v.children;for(let k=0;k{i(C)}:Rn}function i(u){if(Sc(u)){const p=r.get(u);p&&(r.delete(u),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(u);p>-1&&(n.splice(p,1),u.record.name&&r.delete(u.record.name),u.children.forEach(i),u.alias.forEach(i))}}function l(){return n}function c(u){const p=_p(u,n);n.splice(p,0,u),u.record.name&&!hi(u)&&r.set(u.record.name,u)}function f(u,p){let g,P={},v,U;if("name"in u&&u.name){if(g=r.get(u.name),!g)throw en(fe.MATCHER_NOT_FOUND,{location:u});U=g.record.name,P=te(fi(p.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),u.params&&fi(u.params,g.keys.map(C=>C.name))),v=g.stringify(P)}else if(u.path!=null)v=u.path,g=n.find(C=>C.re.test(v)),g&&(P=g.parse(v),U=g.record.name);else{if(g=p.name?r.get(p.name):n.find(C=>C.re.test(p.path)),!g)throw en(fe.MATCHER_NOT_FOUND,{location:u,currentLocation:p});U=g.record.name,P=te({},p.params,u.params),v=g.stringify(P)}const _=[];let E=g;for(;E;)_.unshift(E.record),E=E.parent;return{name:U,path:v,params:P,matched:_,meta:yp(_)}}e.forEach(u=>o(u));function a(){n.length=0,r.clear()}return{addRoute:o,resolve:f,removeRoute:i,clearRoutes:a,getRoutes:l,getRecordMatcher:s}}function fi(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function di(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:gp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function gp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function hi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function yp(e){return e.reduce((t,n)=>te(t,n.meta),{})}function _p(e,t){let n=0,r=t.length;for(;n!==r;){const o=n+r>>1;vc(e,t[o])<0?r=o:n=o+1}const s=bp(e);return s&&(r=t.lastIndexOf(s,r-1)),r}function bp(e){let t=e;for(;t=t.parent;)if(xc(t)&&vc(e,t)===0)return t}function xc({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function pi(e){const t=We(Lr),n=We(Xs),r=ke(()=>{const c=Lt(e.to);return t.resolve(c)}),s=ke(()=>{const{matched:c}=r.value,{length:f}=c,a=c[f-1],u=n.matched;if(!a||!u.length)return-1;const p=u.findIndex(Zt.bind(null,a));if(p>-1)return p;const g=mi(c[f-2]);return f>1&&mi(a)===g&&u[u.length-1].path!==g?u.findIndex(Zt.bind(null,c[f-2])):p}),o=ke(()=>s.value>-1&&Op(n.params,r.value.params)),i=ke(()=>s.value>-1&&s.value===n.matched.length-1&&Rc(n.params,r.value.params));function l(c={}){if(Sp(c)){const f=t[Lt(e.replace)?"replace":"push"](Lt(e.to)).catch(Rn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:r,href:ke(()=>r.value.href),isActive:o,isExactActive:i,navigate:l}}function Ep(e){return e.length===1?e[0]:e}const wp=Ms({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:pi,setup(e,{slots:t}){const n=Dn(pi(e)),{options:r}=We(Lr),s=ke(()=>({[gi(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[gi(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Ep(t.default(n));return e.custom?o:Dl("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},o)}}}),Rp=wp;function Sp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Op(e,t){for(const n in t){const r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!Ze(s)||s.length!==r.length||r.some((o,i)=>o.valueOf()!==s[i].valueOf()))return!1}return!0}function mi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const gi=(e,t,n)=>e??t??n,Ap=Ms({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=We(Rs),s=ke(()=>e.route||r.value),o=We(li,0),i=ke(()=>{let f=Lt(o);const{matched:a}=s.value;let u;for(;(u=a[f])&&!u.components;)f++;return f}),l=ke(()=>s.value.matched[i.value]);Gn(li,ke(()=>i.value+1)),Gn(ep,l),Gn(Rs,s);const c=gn();return yn(()=>[c.value,l.value,e.name],([f,a,u],[p,g,P])=>{a&&(a.instances[u]=f,g&&g!==a&&f&&f===p&&(a.leaveGuards.size||(a.leaveGuards=g.leaveGuards),a.updateGuards.size||(a.updateGuards=g.updateGuards))),f&&a&&(!g||!Zt(a,g)||!p)&&(a.enterCallbacks[u]||[]).forEach(v=>v(f))},{flush:"post"}),()=>{const f=s.value,a=e.name,u=l.value,p=u&&u.components[a];if(!p)return yi(n.default,{Component:p,route:f});const g=u.props[a],P=g?g===!0?f.params:typeof g=="function"?g(f):g:null,U=Dl(p,te({},P,t,{onVnodeUnmounted:_=>{_.component.isUnmounted&&(u.instances[a]=null)},ref:c}));return yi(n.default,{Component:U,route:f})||U}}});function yi(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vp=Ap;function xp(e){const t=mp(e.routes,e),n=e.parseQuery||Yh,r=e.stringifyQuery||ii,s=e.history,o=un(),i=un(),l=un(),c=oa(Rt);let f=Rt;zt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const a=ts.bind(null,b=>""+b),u=ts.bind(null,Fh),p=ts.bind(null,Nn);function g(b,I){let L,B;return Sc(b)?(L=t.getRecordMatcher(b),B=I):B=b,t.addRoute(B,L)}function P(b){const I=t.getRecordMatcher(b);I&&t.removeRoute(I)}function v(){return t.getRoutes().map(b=>b.record)}function U(b){return!!t.getRecordMatcher(b)}function _(b,I){if(I=te({},I||c.value),typeof b=="string"){const y=ns(n,b,I.path),R=t.resolve({path:y.path},I),O=s.createHref(y.fullPath);return te(y,R,{params:p(R.params),hash:Nn(y.hash),redirectedFrom:void 0,href:O})}let L;if(b.path!=null)L=te({},b,{path:ns(n,b.path,I.path).path});else{const y=te({},b.params);for(const R in y)y[R]==null&&delete y[R];L=te({},b,{params:u(y)}),I.params=u(I.params)}const B=t.resolve(L,I),J=b.hash||"";B.params=a(p(B.params));const d=Mh(r,te({},b,{hash:Ih(J),path:B.path})),h=s.createHref(d);return te({fullPath:d,hash:J,query:r===ii?Zh(b.query):b.query||{}},B,{redirectedFrom:void 0,href:h})}function E(b){return typeof b=="string"?ns(n,b,c.value.path):te({},b)}function C(b,I){if(f!==b)return en(fe.NAVIGATION_CANCELLED,{from:I,to:b})}function x(b){return k(b)}function M(b){return x(te(E(b),{replace:!0}))}function G(b,I){const L=b.matched[b.matched.length-1];if(L&&L.redirect){const{redirect:B}=L;let J=typeof B=="function"?B(b,I):B;return typeof J=="string"&&(J=J.includes("?")||J.includes("#")?J=E(J):{path:J},J.params={}),te({query:b.query,hash:b.hash,params:J.path!=null?{}:b.params},J)}}function k(b,I){const L=f=_(b),B=c.value,J=b.state,d=b.force,h=b.replace===!0,y=G(L,B);if(y)return k(te(E(y),{state:typeof y=="object"?te({},J,y.state):J,force:d,replace:h}),I||L);const R=L;R.redirectedFrom=I;let O;return!d&&Bh(r,B,L)&&(O=en(fe.NAVIGATION_DUPLICATED,{to:R,from:B}),me(B,B,!0,!1)),(O?Promise.resolve(O):Y(R,B)).catch(w=>ut(w)?ut(w,fe.NAVIGATION_GUARD_REDIRECT)?w:Je(w):X(w,R,B)).then(w=>{if(w){if(ut(w,fe.NAVIGATION_GUARD_REDIRECT))return k(te({replace:h},E(w.to),{state:typeof w.to=="object"?te({},J,w.to.state):J,force:d}),I||R)}else w=_e(R,B,!0,h,J);return ae(R,B,w),w})}function q(b,I){const L=C(b,I);return L?Promise.reject(L):Promise.resolve()}function K(b){const I=Me.values().next().value;return I&&typeof I.runWithContext=="function"?I.runWithContext(b):b()}function Y(b,I){let L;const[B,J,d]=tp(b,I);L=ss(B.reverse(),"beforeRouteLeave",b,I);for(const y of B)y.leaveGuards.forEach(R=>{L.push(At(R,b,I))});const h=q.bind(null,b,I);return L.push(h),Ce(L).then(()=>{L=[];for(const y of o.list())L.push(At(y,b,I));return L.push(h),Ce(L)}).then(()=>{L=ss(J,"beforeRouteUpdate",b,I);for(const y of J)y.updateGuards.forEach(R=>{L.push(At(R,b,I))});return L.push(h),Ce(L)}).then(()=>{L=[];for(const y of d)if(y.beforeEnter)if(Ze(y.beforeEnter))for(const R of y.beforeEnter)L.push(At(R,b,I));else L.push(At(y.beforeEnter,b,I));return L.push(h),Ce(L)}).then(()=>(b.matched.forEach(y=>y.enterCallbacks={}),L=ss(d,"beforeRouteEnter",b,I,K),L.push(h),Ce(L))).then(()=>{L=[];for(const y of i.list())L.push(At(y,b,I));return L.push(h),Ce(L)}).catch(y=>ut(y,fe.NAVIGATION_CANCELLED)?y:Promise.reject(y))}function ae(b,I,L){l.list().forEach(B=>K(()=>B(b,I,L)))}function _e(b,I,L,B,J){const d=C(b,I);if(d)return d;const h=I===Rt,y=zt?history.state:{};L&&(B||h?s.replace(b.fullPath,te({scroll:h&&y&&y.scroll},J)):s.push(b.fullPath,J)),c.value=b,me(b,I,L,h),Je()}let be;function Ee(){be||(be=s.listen((b,I,L)=>{if(!Be.listening)return;const B=_(b),J=G(B,Be.currentRoute.value);if(J){k(te(J,{replace:!0,force:!0}),B).catch(Rn);return}f=B;const d=c.value;zt&&zh(oi(d.fullPath,L.delta),Dr()),Y(B,d).catch(h=>ut(h,fe.NAVIGATION_ABORTED|fe.NAVIGATION_CANCELLED)?h:ut(h,fe.NAVIGATION_GUARD_REDIRECT)?(k(te(E(h.to),{force:!0}),B).then(y=>{ut(y,fe.NAVIGATION_ABORTED|fe.NAVIGATION_DUPLICATED)&&!L.delta&&L.type===Es.pop&&s.go(-1,!1)}).catch(Rn),Promise.reject()):(L.delta&&s.go(-L.delta,!1),X(h,B,d))).then(h=>{h=h||_e(B,d,!1),h&&(L.delta&&!ut(h,fe.NAVIGATION_CANCELLED)?s.go(-L.delta,!1):L.type===Es.pop&&ut(h,fe.NAVIGATION_ABORTED|fe.NAVIGATION_DUPLICATED)&&s.go(-1,!1)),ae(B,d,h)}).catch(Rn)}))}let je=un(),le=un(),$;function X(b,I,L){Je(b);const B=le.list();return B.length?B.forEach(J=>J(b,I,L)):console.error(b),Promise.reject(b)}function Ge(){return $&&c.value!==Rt?Promise.resolve():new Promise((b,I)=>{je.add([b,I])})}function Je(b){return $||($=!b,Ee(),je.list().forEach(([I,L])=>b?L(b):I()),je.reset()),b}function me(b,I,L,B){const{scrollBehavior:J}=e;if(!zt||!J)return Promise.resolve();const d=!L&&Gh(oi(b.fullPath,0))||(B||!L)&&history.state&&history.state.scroll||null;return Fs().then(()=>J(b,I,d)).then(h=>h&&Kh(h)).catch(h=>X(h,b,I))}const Z=b=>s.go(b);let De;const Me=new Set,Be={currentRoute:c,listening:!0,addRoute:g,removeRoute:P,clearRoutes:t.clearRoutes,hasRoute:U,getRoutes:v,resolve:_,options:e,push:x,replace:M,go:Z,back:()=>Z(-1),forward:()=>Z(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:Ge,install(b){b.component("RouterLink",Rp),b.component("RouterView",vp),b.config.globalProperties.$router=Be,Object.defineProperty(b.config.globalProperties,"$route",{enumerable:!0,get:()=>Lt(c)}),zt&&!De&&c.value===Rt&&(De=!0,x(s.location).catch(B=>{}));const I={};for(const B in Rt)Object.defineProperty(I,B,{get:()=>c.value[B],enumerable:!0});b.provide(Lr,Be),b.provide(Xs,qi(I)),b.provide(Rs,c);const L=b.unmount;Me.add(b),b.unmount=function(){Me.delete(b),Me.size<1&&(f=Rt,be&&be(),be=null,c.value=Rt,De=!1,$=!1),L()}}};function Ce(b){return b.reduce((I,L)=>I.then(()=>K(L)),Promise.resolve())}return Be}function om(){return We(Lr)}function im(e){return We(Xs)}const Cp=[{path:"/my-prizes",name:"my-prizes",component:()=>es(()=>import("./MyPrizesView-g_lvWtzt.js"),__vite__mapDeps([0,1]))},{path:"/c/:slug",name:"campaign-wheel-slug",component:()=>es(()=>import("./CampaignWheelView-D2XZF_HU.js"),__vite__mapDeps([2,1]))},{path:"/:slug",name:"campaign-wheel",component:()=>es(()=>import("./CampaignWheelView-D2XZF_HU.js"),__vite__mapDeps([2,1]))},{path:"/",name:"home",redirect:"/c/default-campaign"},{path:"/:pathMatch(.*)*",redirect:"/"}],Pp=xp({history:op(),routes:Cp}),Qs=Xu(bh),Tp=Zu();Qs.use(Tp);Qs.use(Pp);Qs.mount("#app");export{Ip as A,im as B,Dl as C,dt as F,Pl as a,Lt as b,Lp as c,Ms as d,Fe as e,om as f,gn as g,Gt as h,Ol as i,xl as j,Up as k,fu as l,rl as m,xs as n,nl as o,Mp as p,Np as q,Dp as r,of as s,Bc as t,_h as u,jp as v,yn as w,ke as x,vs as y,Fp as z}; + */let np=()=>location.protocol+"//"+location.host;function Ac(e,t){const{pathname:n,search:r,hash:s}=t,o=e.indexOf("#");if(o>-1){let i=s.includes(e.slice(o))?e.slice(o).length:1,l=s.slice(i);return l[0]!=="/"&&(l="/"+l),ri(l,"")}return ri(n,e)+r+s}function rp(e,t,n,r){let s=[],o=[],i=null;const l=({state:p})=>{const g=Ac(e,location),P=n.value,v=t.value;let U=0;if(p){if(n.value=g,t.value=p,i&&i===P){i=null;return}U=v?p.position-v.position:0}else r(g);s.forEach(_=>{_(n.value,P,{delta:U,type:Es.pop,direction:U?U>0?rs.forward:rs.back:rs.unknown})})};function c(){i=n.value}function f(p){s.push(p);const g=()=>{const P=s.indexOf(p);P>-1&&s.splice(P,1)};return o.push(g),g}function a(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(te({},p.state,{scroll:Dr()}),"")}}function u(){for(const p of o)p();o=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",a),document.removeEventListener("visibilitychange",a)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",a),document.addEventListener("visibilitychange",a),{pauseListeners:c,listen:f,destroy:u}}function ci(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?Dr():null}}function sp(e){const{history:t,location:n}=window,r={value:Ac(e,n)},s={value:t.state};s.value||o(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(c,f,a){const u=e.indexOf("#"),p=u>-1?(n.host&&document.querySelector("base")?e:e.slice(u))+c:np()+e+c;try{t[a?"replaceState":"pushState"](f,"",p),s.value=f}catch(g){console.error(g),n[a?"replace":"assign"](p)}}function i(c,f){o(c,te({},t.state,ci(s.value.back,c,s.value.forward,!0),f,{position:s.value.position}),!0),r.value=c}function l(c,f){const a=te({},s.value,t.state,{forward:c,scroll:Dr()});o(a.current,a,!0),o(c,te({},ci(r.value,c,null),{position:a.position+1},f),!1),r.value=c}return{location:r,state:s,push:l,replace:i}}function op(e){e=Vh(e);const t=sp(e),n=rp(e,t.state,t.location,t.replace);function r(o,i=!0){i||n.pauseListeners(),history.go(o)}const s=te({location:"",base:e,go:r,createHref:$h.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}let It=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var ge=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(ge||{});const ip={type:It.Static,value:""},lp=/[a-zA-Z0-9_]/;function cp(e){if(!e)return[[]];if(e==="/")return[[ip]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${f}": ${g}`)}let n=ge.Static,r=n;const s=[];let o;function i(){o&&s.push(o),o=[]}let l=0,c,f="",a="";function u(){f&&(n===ge.Static?o.push({type:It.Static,value:f}):n===ge.Param||n===ge.ParamRegExp||n===ge.ParamRegExpEnd?(o.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),o.push({type:It.Param,value:f,regexp:a,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function p(){f+=c}for(;lt.length?t.length===1&&t[0]===Te.Static+Te.Segment?1:-1:0}function vc(e,t){let n=0;const r=e.score,s=t.score;for(;n0&&t[t.length-1]<0}const hp={strict:!1,end:!0,sensitive:!1};function pp(e,t,n){const r=fp(cp(e.path),n),s=te(r,{record:e,parent:t,children:[],alias:[]});return t&&!s.record.aliasOf==!t.record.aliasOf&&t.children.push(s),s}function mp(e,t){const n=[],r=new Map;t=ni(hp,t);function s(u){return r.get(u)}function o(u,p,g){const P=!g,v=di(u);v.aliasOf=g&&g.record;const U=ni(t,u),_=[v];if("alias"in u){const x=typeof u.alias=="string"?[u.alias]:u.alias;for(const M of x)_.push(di(te({},v,{components:g?g.record.components:v.components,path:M,aliasOf:g?g.record:v})))}let E,C;for(const x of _){const{path:M}=x;if(p&&M[0]!=="/"){const G=p.record.path,k=G[G.length-1]==="/"?"":"/";x.path=p.record.path+(M&&k+M)}if(E=pp(x,p,U),g?g.alias.push(E):(C=C||E,C!==E&&C.alias.push(E),P&&u.name&&!hi(E)&&i(u.name)),xc(E)&&c(E),v.children){const G=v.children;for(let k=0;k{i(C)}:Rn}function i(u){if(Sc(u)){const p=r.get(u);p&&(r.delete(u),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(u);p>-1&&(n.splice(p,1),u.record.name&&r.delete(u.record.name),u.children.forEach(i),u.alias.forEach(i))}}function l(){return n}function c(u){const p=_p(u,n);n.splice(p,0,u),u.record.name&&!hi(u)&&r.set(u.record.name,u)}function f(u,p){let g,P={},v,U;if("name"in u&&u.name){if(g=r.get(u.name),!g)throw en(fe.MATCHER_NOT_FOUND,{location:u});U=g.record.name,P=te(fi(p.params,g.keys.filter(C=>!C.optional).concat(g.parent?g.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),u.params&&fi(u.params,g.keys.map(C=>C.name))),v=g.stringify(P)}else if(u.path!=null)v=u.path,g=n.find(C=>C.re.test(v)),g&&(P=g.parse(v),U=g.record.name);else{if(g=p.name?r.get(p.name):n.find(C=>C.re.test(p.path)),!g)throw en(fe.MATCHER_NOT_FOUND,{location:u,currentLocation:p});U=g.record.name,P=te({},p.params,u.params),v=g.stringify(P)}const _=[];let E=g;for(;E;)_.unshift(E.record),E=E.parent;return{name:U,path:v,params:P,matched:_,meta:yp(_)}}e.forEach(u=>o(u));function a(){n.length=0,r.clear()}return{addRoute:o,resolve:f,removeRoute:i,clearRoutes:a,getRoutes:l,getRecordMatcher:s}}function fi(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function di(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:gp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function gp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function hi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function yp(e){return e.reduce((t,n)=>te(t,n.meta),{})}function _p(e,t){let n=0,r=t.length;for(;n!==r;){const o=n+r>>1;vc(e,t[o])<0?r=o:n=o+1}const s=bp(e);return s&&(r=t.lastIndexOf(s,r-1)),r}function bp(e){let t=e;for(;t=t.parent;)if(xc(t)&&vc(e,t)===0)return t}function xc({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function pi(e){const t=We(Lr),n=We(Xs),r=ke(()=>{const c=Lt(e.to);return t.resolve(c)}),s=ke(()=>{const{matched:c}=r.value,{length:f}=c,a=c[f-1],u=n.matched;if(!a||!u.length)return-1;const p=u.findIndex(Zt.bind(null,a));if(p>-1)return p;const g=mi(c[f-2]);return f>1&&mi(a)===g&&u[u.length-1].path!==g?u.findIndex(Zt.bind(null,c[f-2])):p}),o=ke(()=>s.value>-1&&Op(n.params,r.value.params)),i=ke(()=>s.value>-1&&s.value===n.matched.length-1&&Rc(n.params,r.value.params));function l(c={}){if(Sp(c)){const f=t[Lt(e.replace)?"replace":"push"](Lt(e.to)).catch(Rn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:r,href:ke(()=>r.value.href),isActive:o,isExactActive:i,navigate:l}}function Ep(e){return e.length===1?e[0]:e}const wp=Ms({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:pi,setup(e,{slots:t}){const n=Dn(pi(e)),{options:r}=We(Lr),s=ke(()=>({[gi(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[gi(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Ep(t.default(n));return e.custom?o:Dl("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},o)}}}),Rp=wp;function Sp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Op(e,t){for(const n in t){const r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!Ze(s)||s.length!==r.length||r.some((o,i)=>o.valueOf()!==s[i].valueOf()))return!1}return!0}function mi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const gi=(e,t,n)=>e??t??n,Ap=Ms({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=We(Rs),s=ke(()=>e.route||r.value),o=We(li,0),i=ke(()=>{let f=Lt(o);const{matched:a}=s.value;let u;for(;(u=a[f])&&!u.components;)f++;return f}),l=ke(()=>s.value.matched[i.value]);Gn(li,ke(()=>i.value+1)),Gn(ep,l),Gn(Rs,s);const c=gn();return yn(()=>[c.value,l.value,e.name],([f,a,u],[p,g,P])=>{a&&(a.instances[u]=f,g&&g!==a&&f&&f===p&&(a.leaveGuards.size||(a.leaveGuards=g.leaveGuards),a.updateGuards.size||(a.updateGuards=g.updateGuards))),f&&a&&(!g||!Zt(a,g)||!p)&&(a.enterCallbacks[u]||[]).forEach(v=>v(f))},{flush:"post"}),()=>{const f=s.value,a=e.name,u=l.value,p=u&&u.components[a];if(!p)return yi(n.default,{Component:p,route:f});const g=u.props[a],P=g?g===!0?f.params:typeof g=="function"?g(f):g:null,U=Dl(p,te({},P,t,{onVnodeUnmounted:_=>{_.component.isUnmounted&&(u.instances[a]=null)},ref:c}));return yi(n.default,{Component:U,route:f})||U}}});function yi(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vp=Ap;function xp(e){const t=mp(e.routes,e),n=e.parseQuery||Yh,r=e.stringifyQuery||ii,s=e.history,o=un(),i=un(),l=un(),c=oa(Rt);let f=Rt;zt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const a=ts.bind(null,b=>""+b),u=ts.bind(null,Fh),p=ts.bind(null,Nn);function g(b,I){let L,B;return Sc(b)?(L=t.getRecordMatcher(b),B=I):B=b,t.addRoute(B,L)}function P(b){const I=t.getRecordMatcher(b);I&&t.removeRoute(I)}function v(){return t.getRoutes().map(b=>b.record)}function U(b){return!!t.getRecordMatcher(b)}function _(b,I){if(I=te({},I||c.value),typeof b=="string"){const y=ns(n,b,I.path),R=t.resolve({path:y.path},I),O=s.createHref(y.fullPath);return te(y,R,{params:p(R.params),hash:Nn(y.hash),redirectedFrom:void 0,href:O})}let L;if(b.path!=null)L=te({},b,{path:ns(n,b.path,I.path).path});else{const y=te({},b.params);for(const R in y)y[R]==null&&delete y[R];L=te({},b,{params:u(y)}),I.params=u(I.params)}const B=t.resolve(L,I),J=b.hash||"";B.params=a(p(B.params));const d=Mh(r,te({},b,{hash:Ih(J),path:B.path})),h=s.createHref(d);return te({fullPath:d,hash:J,query:r===ii?Zh(b.query):b.query||{}},B,{redirectedFrom:void 0,href:h})}function E(b){return typeof b=="string"?ns(n,b,c.value.path):te({},b)}function C(b,I){if(f!==b)return en(fe.NAVIGATION_CANCELLED,{from:I,to:b})}function x(b){return k(b)}function M(b){return x(te(E(b),{replace:!0}))}function G(b,I){const L=b.matched[b.matched.length-1];if(L&&L.redirect){const{redirect:B}=L;let J=typeof B=="function"?B(b,I):B;return typeof J=="string"&&(J=J.includes("?")||J.includes("#")?J=E(J):{path:J},J.params={}),te({query:b.query,hash:b.hash,params:J.path!=null?{}:b.params},J)}}function k(b,I){const L=f=_(b),B=c.value,J=b.state,d=b.force,h=b.replace===!0,y=G(L,B);if(y)return k(te(E(y),{state:typeof y=="object"?te({},J,y.state):J,force:d,replace:h}),I||L);const R=L;R.redirectedFrom=I;let O;return!d&&Bh(r,B,L)&&(O=en(fe.NAVIGATION_DUPLICATED,{to:R,from:B}),me(B,B,!0,!1)),(O?Promise.resolve(O):Y(R,B)).catch(w=>ut(w)?ut(w,fe.NAVIGATION_GUARD_REDIRECT)?w:Je(w):X(w,R,B)).then(w=>{if(w){if(ut(w,fe.NAVIGATION_GUARD_REDIRECT))return k(te({replace:h},E(w.to),{state:typeof w.to=="object"?te({},J,w.to.state):J,force:d}),I||R)}else w=_e(R,B,!0,h,J);return ae(R,B,w),w})}function q(b,I){const L=C(b,I);return L?Promise.reject(L):Promise.resolve()}function K(b){const I=Me.values().next().value;return I&&typeof I.runWithContext=="function"?I.runWithContext(b):b()}function Y(b,I){let L;const[B,J,d]=tp(b,I);L=ss(B.reverse(),"beforeRouteLeave",b,I);for(const y of B)y.leaveGuards.forEach(R=>{L.push(At(R,b,I))});const h=q.bind(null,b,I);return L.push(h),Ce(L).then(()=>{L=[];for(const y of o.list())L.push(At(y,b,I));return L.push(h),Ce(L)}).then(()=>{L=ss(J,"beforeRouteUpdate",b,I);for(const y of J)y.updateGuards.forEach(R=>{L.push(At(R,b,I))});return L.push(h),Ce(L)}).then(()=>{L=[];for(const y of d)if(y.beforeEnter)if(Ze(y.beforeEnter))for(const R of y.beforeEnter)L.push(At(R,b,I));else L.push(At(y.beforeEnter,b,I));return L.push(h),Ce(L)}).then(()=>(b.matched.forEach(y=>y.enterCallbacks={}),L=ss(d,"beforeRouteEnter",b,I,K),L.push(h),Ce(L))).then(()=>{L=[];for(const y of i.list())L.push(At(y,b,I));return L.push(h),Ce(L)}).catch(y=>ut(y,fe.NAVIGATION_CANCELLED)?y:Promise.reject(y))}function ae(b,I,L){l.list().forEach(B=>K(()=>B(b,I,L)))}function _e(b,I,L,B,J){const d=C(b,I);if(d)return d;const h=I===Rt,y=zt?history.state:{};L&&(B||h?s.replace(b.fullPath,te({scroll:h&&y&&y.scroll},J)):s.push(b.fullPath,J)),c.value=b,me(b,I,L,h),Je()}let be;function Ee(){be||(be=s.listen((b,I,L)=>{if(!Be.listening)return;const B=_(b),J=G(B,Be.currentRoute.value);if(J){k(te(J,{replace:!0,force:!0}),B).catch(Rn);return}f=B;const d=c.value;zt&&zh(oi(d.fullPath,L.delta),Dr()),Y(B,d).catch(h=>ut(h,fe.NAVIGATION_ABORTED|fe.NAVIGATION_CANCELLED)?h:ut(h,fe.NAVIGATION_GUARD_REDIRECT)?(k(te(E(h.to),{force:!0}),B).then(y=>{ut(y,fe.NAVIGATION_ABORTED|fe.NAVIGATION_DUPLICATED)&&!L.delta&&L.type===Es.pop&&s.go(-1,!1)}).catch(Rn),Promise.reject()):(L.delta&&s.go(-L.delta,!1),X(h,B,d))).then(h=>{h=h||_e(B,d,!1),h&&(L.delta&&!ut(h,fe.NAVIGATION_CANCELLED)?s.go(-L.delta,!1):L.type===Es.pop&&ut(h,fe.NAVIGATION_ABORTED|fe.NAVIGATION_DUPLICATED)&&s.go(-1,!1)),ae(B,d,h)}).catch(Rn)}))}let je=un(),le=un(),$;function X(b,I,L){Je(b);const B=le.list();return B.length?B.forEach(J=>J(b,I,L)):console.error(b),Promise.reject(b)}function Ge(){return $&&c.value!==Rt?Promise.resolve():new Promise((b,I)=>{je.add([b,I])})}function Je(b){return $||($=!b,Ee(),je.list().forEach(([I,L])=>b?L(b):I()),je.reset()),b}function me(b,I,L,B){const{scrollBehavior:J}=e;if(!zt||!J)return Promise.resolve();const d=!L&&Gh(oi(b.fullPath,0))||(B||!L)&&history.state&&history.state.scroll||null;return Fs().then(()=>J(b,I,d)).then(h=>h&&Kh(h)).catch(h=>X(h,b,I))}const Z=b=>s.go(b);let De;const Me=new Set,Be={currentRoute:c,listening:!0,addRoute:g,removeRoute:P,clearRoutes:t.clearRoutes,hasRoute:U,getRoutes:v,resolve:_,options:e,push:x,replace:M,go:Z,back:()=>Z(-1),forward:()=>Z(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:le.add,isReady:Ge,install(b){b.component("RouterLink",Rp),b.component("RouterView",vp),b.config.globalProperties.$router=Be,Object.defineProperty(b.config.globalProperties,"$route",{enumerable:!0,get:()=>Lt(c)}),zt&&!De&&c.value===Rt&&(De=!0,x(s.location).catch(B=>{}));const I={};for(const B in Rt)Object.defineProperty(I,B,{get:()=>c.value[B],enumerable:!0});b.provide(Lr,Be),b.provide(Xs,qi(I)),b.provide(Rs,c);const L=b.unmount;Me.add(b),b.unmount=function(){Me.delete(b),Me.size<1&&(f=Rt,be&&be(),be=null,c.value=Rt,De=!1,$=!1),L()}}};function Ce(b){return b.reduce((I,L)=>I.then(()=>K(L)),Promise.resolve())}return Be}function om(){return We(Lr)}function im(e){return We(Xs)}const Cp=[{path:"/my-prizes",name:"my-prizes",component:()=>es(()=>import("./MyPrizesView-jVO1o30M.js"),__vite__mapDeps([0,1]))},{path:"/c/:slug",name:"campaign-wheel-slug",component:()=>es(()=>import("./CampaignWheelView-NeK9mDgs.js"),__vite__mapDeps([2,1]))},{path:"/:slug",name:"campaign-wheel",component:()=>es(()=>import("./CampaignWheelView-NeK9mDgs.js"),__vite__mapDeps([2,1]))},{path:"/",name:"home",redirect:"/c/default-campaign"},{path:"/:pathMatch(.*)*",redirect:"/"}],Pp=xp({history:op(),routes:Cp}),Qs=Xu(bh),Tp=Zu();Qs.use(Tp);Qs.use(Pp);Qs.mount("#app");export{Ip as A,im as B,Dl as C,dt as F,Pl as a,Lt as b,Lp as c,Ms as d,Fe as e,om as f,gn as g,Gt as h,Ol as i,xl as j,Up as k,fu as l,rl as m,xs as n,nl as o,Mp as p,Np as q,Dp as r,of as s,Bc as t,_h as u,jp as v,yn as w,ke as x,vs as y,Fp as z}; diff --git a/apps/client/dist/assets/loader-circle-w-52iWEJ.js b/apps/client/dist/assets/loader-circle-CjrTYK9r.js similarity index 98% rename from apps/client/dist/assets/loader-circle-w-52iWEJ.js rename to apps/client/dist/assets/loader-circle-CjrTYK9r.js index b34f5fb..392a1be 100644 --- a/apps/client/dist/assets/loader-circle-w-52iWEJ.js +++ b/apps/client/dist/assets/loader-circle-CjrTYK9r.js @@ -1,4 +1,4 @@ -import{C as a}from"./index-ilYp-WvI.js";const s=["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"];function g(e){return e==null||typeof e=="object"&&e!==null&&"value"in e&&(e=e.value,e==null)||typeof e=="object"?"":String(e).replace(/[0-9]/g,t=>s[+t]).replace(/[٠-٩]/g,t=>s[t.charCodeAt(0)-1632])}/** +import{C as a}from"./index-CFILnBxv.js";const s=["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"];function g(e){return e==null||typeof e=="object"&&e!==null&&"value"in e&&(e=e.value,e==null)||typeof e=="object"?"":String(e).replace(/[0-9]/g,t=>s[+t]).replace(/[٠-٩]/g,t=>s[t.charCodeAt(0)-1632])}/** * @license lucide-vue-next v0.378.0 - ISC * * This source code is licensed under the ISC license. diff --git a/apps/client/dist/index.html b/apps/client/dist/index.html index d583530..9576739 100644 --- a/apps/client/dist/index.html +++ b/apps/client/dist/index.html @@ -9,7 +9,7 @@ - +