Files
2026-10-20 16:52:05 +03:30

2 lines
34 KiB
JavaScript

import{_ as Ae}from"./BasicShowContext.vue_vue_type_script_setup_true_lang-2980cfed.js";import{_ as pe,u as de}from"./useBaseTable-e7a67916.js";import{_ as De}from"./button.vue_vue_type_style_index_0_lang-f90e25b2.js";import{g as Le,a as Ue,p as Be,s as je,b as qe,c as Oe,d as Me,e as Ne,f as me,r as Ee,h as Fe,i as Ve,j as fe,u as ge,k as Ke}from"./pushNotification-4801c800.js";import{t as ve}from"./useDataTime-6e234adb.js";import{_ as He,v as be,t as he}from"./AudienceSegmentPicker.vue_vue_type_script_setup_true_lang-65f61d77.js";import{M as ye,_ as Je}from"./index-ec322234.js";import{I as oe,_ as ze}from"./index-aafc0fe2.js";import{P as Ge}from"./index-65e13d19.js";import{d as _e,i as v,j as E,x as Qe,y as We,o as x,c as S,b as e,e as s,l as L,w as l,f as u,t as o,s as xe,n as A,R as ce,H as p,T as Xe,k as ie,F as ke,h as Ye}from"./index-1ba0f9ec.js";import{_ as we}from"./BasicModal.vue_vue_type_style_index_0_lang-aed8f5e4.js";import{I as re}from"./Icon-29e38d16.js";import{B as $e}from"./index-8f2b7e91.js";import{D as Ie,_ as Se}from"./index-5258a30e.js";import{S as Pe}from"./index-4bff02a6.js";import{T as ue}from"./isSymbol-355a1404.js";import{_ as Ze}from"./BasicInput.vue_vue_type_style_index_0_lang-e6a4e582.js";import{S as et,_ as tt}from"./index-e0664925.js";import{C as st}from"./index-e22339b6.js";import{_ as at,T as lt}from"./index-f22a4554.js";import"./updateLocale-a8654270.js";import"./shallowequal-e0d9eafb.js";import"./_plugin-vue_export-helper-31e07528.js";import"./vnode-c4e67237.js";import"./useState-dcd360f8.js";import"./useMemo-ee45fb46.js";import"./FormItemContext-33ef1221.js";import"./omit-f5d28cd3.js";import"./lodash-27f814e6.js";import"./BaseSwitch.vue_vue_type_script_setup_true_lang-36a1ea6e.js";import"./index-c8127d4e.js";import"./Badge-8a8eeb58.js";import"./isNumeric-3f69e2aa.js";import"./index-a8579634.js";import"./index-73cafb1e.js";import"./index-175b83cf.js";import"./userSegments-081d8da2.js";import"./index-f847a367.js";import"./isMobile-e2e89480.js";import"./dayjs-1cfa00b1.js";import"./index-0d716d4e.js";import"./DialogWrap-394d7eb0.js";import"./pickAttrs-0ddf9a54.js";import"./styleChecker-19ce40ea.js";import"./SearchOutlined-95278fe5.js";import"./isPlainObject-e945bc1f.js";import"./useRefs-5e33302c.js";import"./usePrice-bc935b83.js";import"./toArray-41940180.js";import"./index-3f6d5caa.js";import"./index-876da578.js";import"./LeftOutlined-93011b30.js";import"./css-aae66f86.js";import"./_flatRest-7877cdf8.js";const nt=[{title:"ردیف",dataIndex:"id",key:"id",filterable:!1,customRender:a=>{var M;const r=((M=a==null?void 0:a.record)==null?void 0:M.record)??(a==null?void 0:a.record)??a;return(typeof(r==null?void 0:r.index)=="number"?r.index:0)+1}},{title:"نام",dataIndex:"first_name",key:"first_name",filterable:!0},{title:"نام خانوادگی",dataIndex:"last_name",key:"last_name",filterable:!0},{title:"شماره همراه",dataIndex:"phone",key:"phone",filterable:!0},{title:"اعلان فعال",dataIndex:"has_push",key:"has_push",filterField:"has_push",type:"Select",filterable:!0,filterComponentProps:{options:[{label:"فعال",value:"1"},{label:"غیرفعال",value:"0"}]},customRender:a=>{var D;const r=((D=a==null?void 0:a.record)==null?void 0:D.record)??(a==null?void 0:a.record)??a;return r!=null&&r.has_push?"✓ فعال":"—"}},{title:"زمان ثبت‌نام",dataIndex:"created_at",key:"created_at",type:"Date",filterable:!0,customRender:a=>{var D;const r=((D=a==null?void 0:a.record)==null?void 0:D.record)??(a==null?void 0:a.record)??a;return r!=null&&r.created_at?ve(r.created_at):"-"}}],ot={class:"space-y-4"},it={class:"grid grid-cols-1 xl:grid-cols-3 gap-4"},rt={class:"xl:col-span-2 space-y-4"},ut=e("div",{class:"mb-1 text-sm text-gray-600"},"عنوان نوتیفیکیشن *",-1),dt=e("div",{class:"mb-1 text-sm text-gray-600"},"متن نوتیفیکیشن *",-1),ct=e("div",{class:"mb-1 text-sm text-gray-600"},"لینک (اختیاری)",-1),vt={class:"flex flex-wrap gap-2"},_t={key:0,class:"rounded-lg border border-blue-200 bg-blue-50/60 p-4 space-y-3"},mt={class:"flex items-center justify-between gap-2"},pt=e("div",{class:"font-semibold text-gray-800"},"روند ارسال نوتیفیکیشن",-1),ft={class:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-sm"},gt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},bt=e("div",{class:"text-gray-500 text-xs"},"پیشرفت",-1),ht={class:"font-semibold"},yt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},xt=e("div",{class:"text-gray-500 text-xs"},"موفق",-1),kt={class:"font-semibold text-green-700"},wt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},$t=e("div",{class:"text-gray-500 text-xs"},"ناموفق",-1),It={class:"font-semibold text-red-600"},St={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},Pt=e("div",{class:"text-gray-500 text-xs"},"درصد",-1),Ct={class:"font-semibold"},Rt={key:0,class:"text-sm text-gray-600 m-0"},Tt={key:1,class:"text-sm text-red-600 m-0"},At={class:"bg-gray-50 rounded-lg p-4 border border-gray-200 space-y-2 text-sm"},Dt=e("div",{class:"font-semibold text-gray-700 mb-2"},"آمار اعلان‌ها",-1),Lt={class:"grid grid-cols-1 gap-2"},Ut={class:"flex justify-between items-center bg-white rounded-md px-3 py-2 border border-gray-100"},Bt=e("span",{class:"text-gray-600"},"کاربران با اعلان فعال",-1),jt={class:"text-green-700"},qt={class:"flex justify-between items-center bg-white rounded-md px-3 py-2 border border-gray-100"},Ot=e("span",{class:"text-gray-600"},"کل اشتراک push",-1),Mt=e("div",{class:"font-semibold text-gray-700 mb-2 pt-2"},"راهنما",-1),Nt=e("p",{class:"text-gray-600 leading-6 m-0"}," فقط کاربرانی که اعلان را در اپ فعال کرده‌اند، نوتیف دریافت می‌کنند. ",-1),Et=e("p",{class:"text-gray-600 leading-6 m-0"}," از فیلتر «اعلان فعال» می‌توانید فقط کاربران با اعلان روشن یا خاموش را ببینید. ",-1),Ft=e("p",{class:"text-gray-600 leading-6 m-0"}," برای ارسال محدود، کاربران را از جدول پایین انتخاب کنید. ",-1),Vt={key:0,class:"pt-2 border-t border-gray-200"},Kt=e("div",{class:"font-medium mb-1"},"آخرین ارسال:",-1),Ht={key:0,class:"text-amber-700 mb-1"},Jt={key:1,class:"text-amber-700 mb-1"},zt={key:2},Gt={key:3},Qt={key:4},Wt={key:5},Xt={key:6},Yt={key:7},Zt={class:"border-t border-gray-200 pt-4"},es=e("div",{class:"mb-2 text-sm text-gray-600"}," کاربران را جستجو کنید و برای ارسال محدود، آن‌ها را انتخاب کنید. ",-1),ts=_e({__name:"PushSendPanel",emits:["sent"],setup(a,{emit:r}){const{TextArea:D}=oe,[M]=de(),g=v({title:"ماچارتا",body:"",url:"/"}),C=v(!1),b=v([]),h=v(null),t=v(null),j=v({uniqueUsers:0,totalSubscriptions:0}),f=v(!1),q=v({segments:[],inactiveDays:7,subscriberInactiveDays:3}),N=v(!1),O=v("");let V=null;const Y=E(()=>({selectedRowKeys:b.value,onChange:n=>{b.value=n.map(String)},preserveSelectedRowKeys:!0})),w=E(()=>{var i;const n=(i=t.value)==null?void 0:i.status;return n==="queued"||n==="running"}),J=E(()=>t.value?Math.max(t.value.total,t.value.processed):0),z=E(()=>{var n;switch((n=t.value)==null?void 0:n.status){case"queued":return"در صف";case"running":return"در حال ارسال";case"completed":return"تمام شد";case"failed":return"ناموفق";default:return""}}),G=E(()=>{var n;switch((n=t.value)==null?void 0:n.status){case"queued":return"bg-amber-100 text-amber-800";case"running":return"bg-blue-100 text-blue-800";case"completed":return"bg-green-100 text-green-800";case"failed":return"bg-red-100 text-red-700";default:return"bg-gray-100 text-gray-600"}}),te=E(()=>{var n,i;return((n=t.value)==null?void 0:n.status)==="failed"?"exception":((i=t.value)==null?void 0:i.status)==="completed"?"success":"active"}),R=E(()=>{var n,i;return((n=t.value)==null?void 0:n.status)==="failed"?"#ef4444":((i=t.value)==null?void 0:i.status)==="completed"?"#16a34a":"#2563eb"});function k(n){return Number(n||0).toLocaleString("fa-IR")}function U(){V&&(clearInterval(V),V=null)}async function $(n){var i,P;try{const m=await Me(n);t.value=m,(m.status==="completed"||m.status==="failed")&&(U(),C.value=!1,h.value&&(h.value={...h.value,queued:!1,sent:m.sent,failed:m.failed,subscribed:m.total}),m.status==="completed"?(p.success(`ارسال تمام شد (${k(m.sent)} موفق، ${k(m.failed)} ناموفق)`),r("sent"),Q()):p.error(m.error||"ارسال نوتیفیکیشن ناموفق بود"))}catch(m){U(),C.value=!1,p.error(((P=(i=m==null?void 0:m.response)==null?void 0:i.data)==null?void 0:P.error)||m.message||"خطا در دریافت وضعیت ارسال")}}function B(n){U(),$(n),V=setInterval(()=>{$(n)},1e3)}async function Q(){f.value=!0;try{j.value=await Ue()}finally{f.value=!1}}Qe(()=>{Q()}),We(()=>{U()});const se=v({columns:nt,api:Le,defaultPageLimit:20,height:"45vh"}),Z=E(()=>{var n,i;return!!((n=g.value.title)!=null&&n.trim()&&((i=g.value.body)!=null&&i.trim()))});function K(){var n,i;return(n=g.value.title)!=null&&n.trim()?(i=g.value.body)!=null&&i.trim()?!0:(p.error("لطفاً متن نوتیفیکیشن را وارد کنید"),!1):(p.error("لطفاً عنوان نوتیفیکیشن را وارد کنید"),!1)}async function ae(n){if(!K())return;if(n==="selected"&&!b.value.length){p.warning("حداقل یک کاربر انتخاب کنید");return}if(w.value){p.warning("یک ارسال در حال انجام است. لطفاً صبر کنید.");return}const i=n==="selected"?`آیا از ارسال نوتیفیکیشن به ${b.value.length} کاربر انتخاب‌شده مطمئن هستید؟`:"آیا از ارسال نوتیفیکیشن به همه کاربران مطمئن هستید؟";ye.confirm({title:"تأیید ارسال نوتیفیکیشن",content:i,okText:"بله، ارسال کن",cancelText:"انصراف",centered:!0,onOk:async()=>{var P,m,c;C.value=!0;try{const y={title:g.value.title.trim(),body:g.value.body.trim(),url:((P=g.value.url)==null?void 0:P.trim())||"/"},T=n==="selected"?await qe(y.title,y.body,b.value,y.url):await Oe(y.title,y.body,y.url);if(h.value=T,T.queued&&T.jobId){t.value={jobId:T.jobId,status:"queued",kind:n==="selected"?"selected":"broadcast",title:y.title,total:T.subscribed??0,sent:0,failed:0,processed:0,percent:0,message:T.message||"در صف ارسال",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},p.success(T.message||"نوتیفیکیشن در صف ارسال قرار گرفت؛ در صورت قطع از همان نقطه ادامه می‌یابد"),B(T.jobId),n==="all"&&(g.value.body="");return}p.success(`نوتیفیکیشن ارسال شد (${T.sent} موفق، ${T.failed} ناموفق)`),r("sent"),Q(),C.value=!1}catch(y){C.value=!1,p.error(((c=(m=y==null?void 0:y.response)==null?void 0:m.data)==null?void 0:c.error)||y.message||"خطا در ارسال نوتیفیکیشن")}}})}function le(){return ae("all")}function ne(){return ae("selected")}async function _(){var P,m;const n={...q.value,includeUserIds:b.value},i=be(n);if(i){p.warning(i);return}N.value=!0,O.value="";try{const c=await Be(he(n)),y=b.value.length>0?` (شامل ${k(b.value.length)} کاربر اضافه از جدول)`:"",T=Array.isArray(c==null?void 0:c.progressItems)?c.progressItems:[];c!=null&&c.matchedExactly&&T.length===1?O.value=`کاربران دسته: ${k(c.userCount)} (همان آمار پیشرفت) — اشتراک push: ${k(c.pushSubscriptions)}${y}`:O.value=`کاربران دسته: ${k(c.userCount)} — اشتراک push: ${k(c.pushSubscriptions)}${y}`}catch(c){p.error(((m=(P=c==null?void 0:c.response)==null?void 0:P.data)==null?void 0:m.error)||c.message||"خطا در پیش‌نمایش")}finally{N.value=!1}}async function d(){if(!K())return;const n={...q.value,includeUserIds:b.value},i=be(n);if(i){p.warning(i);return}if(w.value){p.warning("یک ارسال در حال انجام است. لطفاً صبر کنید.");return}const P=q.value.segments.length,m=b.value.length,c=m>0?`ارسال به ${P} دسته (OR) به‌علاوه ${m} کاربر انتخاب‌شده؟`:`ارسال به ${P} دسته مخاطب (اتحاد / OR)؟`;ye.confirm({title:"تأیید ارسال نوتیفیکیشن",content:c,okText:"بله، ارسال کن",cancelText:"انصراف",centered:!0,onOk:async()=>{var y,T,X;C.value=!0;try{const H={title:g.value.title.trim(),body:g.value.body.trim(),url:((y=g.value.url)==null?void 0:y.trim())||"/"},F=await je(H.title,H.body,he(n),H.url);if(h.value=F,F.queued&&F.jobId){t.value={jobId:F.jobId,status:"queued",kind:"segment",title:H.title,total:F.subscribed??0,sent:0,failed:0,processed:0,percent:0,message:F.message||"در صف ارسال",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},p.success(F.message||"نوتیفیکیشن در صف ارسال قرار گرفت؛ در صورت قطع از همان نقطه ادامه می‌یابد"),B(F.jobId);return}p.success(`نوتیفیکیشن ارسال شد (${F.sent} موفق، ${F.failed} ناموفق)`),r("sent"),Q(),C.value=!1}catch(H){C.value=!1,p.error(((X=(T=H==null?void 0:H.response)==null?void 0:T.data)==null?void 0:X.error)||H.message||"خطا در ارسال نوتیفیکیشن")}}})}return(n,i)=>{const P=De,m=pe;return x(),S("div",ot,[e("div",it,[e("div",rt,[e("div",null,[ut,s(L(oe),{value:g.value.title,"onUpdate:value":i[0]||(i[0]=c=>g.value.title=c),placeholder:"مثلاً: اطلاعیه مهم"},null,8,["value"])]),e("div",null,[dt,s(L(D),{value:g.value.body,"onUpdate:value":i[1]||(i[1]=c=>g.value.body=c),placeholder:"متن دلخواه برای کاربران",rows:4,maxlength:500,"show-count":""},null,8,["value"])]),e("div",null,[ct,s(L(oe),{value:g.value.url,"onUpdate:value":i[2]||(i[2]=c=>g.value.url=c),placeholder:"/shop یا /matches"},null,8,["value"])]),e("div",vt,[s(P,{type:"primary",loading:C.value,disabled:!Z.value||w.value,onClick:le},{default:l(()=>[u(" ارسال به همه کاربران ")]),_:1},8,["loading","disabled"]),s(P,{type:"primary",ghost:"",loading:C.value,disabled:!Z.value||!b.value.length||w.value,onClick:ne},{default:l(()=>[u(" ارسال به انتخاب‌شده‌ها ("+o(b.value.length)+") ",1)]),_:1},8,["loading","disabled"])]),s(He,{modelValue:q.value,"onUpdate:modelValue":i[3]||(i[3]=c=>q.value=c),"include-user-count":b.value.length,"preview-loading":N.value,sending:C.value,disabled:!Z.value||w.value,"preview-text":O.value,onPreview:_,onSend:d},null,8,["modelValue","include-user-count","preview-loading","sending","disabled","preview-text"]),t.value?(x(),S("div",_t,[e("div",mt,[pt,e("span",{class:xe(["text-xs px-2 py-1 rounded-full",G.value])},o(z.value),3)]),s(L(Ge),{percent:t.value.percent,status:te.value,"stroke-color":R.value},null,8,["percent","status","stroke-color"]),e("div",ft,[e("div",gt,[bt,e("div",ht,o(k(t.value.processed))+" / "+o(k(J.value)),1)]),e("div",yt,[xt,e("div",kt,o(k(t.value.sent)),1)]),e("div",wt,[$t,e("div",It,o(k(t.value.failed)),1)]),e("div",St,[Pt,e("div",Ct,o(t.value.percent)+"٪",1)])]),t.value.message?(x(),S("p",Rt,o(t.value.message),1)):A("",!0),t.value.error?(x(),S("p",Tt,o(t.value.error),1)):A("",!0)])):A("",!0)]),e("div",At,[Dt,e("div",Lt,[e("div",Ut,[Bt,e("strong",jt,o(j.value.uniqueUsers)+" نفر",1)]),e("div",qt,[Ot,e("strong",null,o(j.value.totalSubscriptions),1)])]),Mt,Nt,Et,Ft,h.value?(x(),S("div",Vt,[Kt,t.value&&w.value?(x(),S("div",Ht,"در حال ارسال…")):h.value.queued&&!t.value?(x(),S("div",Jt," در صف ارسال (دسته‌ای) ")):A("",!0),t.value?(x(),S("div",zt,[u(" موفق: "),e("strong",null,o(k(t.value.sent)),1)])):A("",!0),t.value?(x(),S("div",Gt,[u(" ناموفق: "),e("strong",null,o(k(t.value.failed)),1)])):h.value.queued?A("",!0):(x(),S("div",Qt,[u(" موفق: "),e("strong",null,o(h.value.sent),1)])),!t.value&&!h.value.queued?(x(),S("div",Wt,[u(" ناموفق: "),e("strong",null,o(h.value.failed),1)])):A("",!0),h.value.targeted!=null?(x(),S("div",Xt,[u(" انتخاب‌شده: "),e("strong",null,o(h.value.targeted),1)])):A("",!0),h.value.subscribed!=null?(x(),S("div",Yt,[u(" دارای اشتراک push: "),e("strong",null,o(h.value.subscribed),1)])):A("",!0)])):A("",!0)])]),e("div",Zt,[es,s(m,ce(se.value,{"row-selection":Y.value,onRegister:L(M)}),null,16,["row-selection","onRegister"])])])}}}),Ce={custom:"همه کاربران",custom_selected:"کاربران انتخاب‌شده",story:"قصه جدید",book:"کتاب صوتی",product:"محصول جدید",match:"مسابقه جدید"},Re={pending:"در صف",sending:"در حال ارسال",completed:"تمام شده",failed:"متوقف / شکست"},ss={pending:"text-amber-700",sending:"text-blue-700",completed:"text-green-700",failed:"text-red-600"},as=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"شناسه",dataIndex:"id",key:"id",filterable:!1},{title:"عنوان",dataIndex:"title",key:"title",filterable:!1,customRender:a=>{const r=a.record.title||"";return r.length>40?`${r.slice(0,40)}...`:r}},{title:"نوع ارسال",dataIndex:"type",key:"type",filterable:!1,customRender:a=>Ce[a.record.type]||a.record.type},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:a=>{const r=a.record.status||"completed";return Xe("span",{class:ss[r]||"text-gray-700"},Re[r]||r)}},{title:"موفق",dataIndex:"sent_count",key:"sent_count",filterable:!1,customRender:a=>a.record.sent_count??0},{title:"ناموفق",dataIndex:"failed_count",key:"failed_count",filterable:!1,customRender:a=>a.record.failed_count??0},{title:"تاریخ",dataIndex:"created_at",key:"created_at",filterable:!1,customRender:a=>a.record.created_at?ve(a.record.created_at):"-"},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}];function ls(a){return Ce[a]||a}function ns(a){return Re[a]||a}const os={class:"gap-2 flex justify-center"},is=e("span",null,"جزئیات ارسال",-1),rs={class:"flex justify-end gap-2 w-full flex-wrap"},us={class:"whitespace-pre-wrap text-sm"},ds={class:"text-red-600"},cs={class:"grid grid-cols-1 sm:grid-cols-4 gap-3 mb-4"},vs={class:"rounded-lg border border-green-200 bg-green-50 p-4 text-center"},_s={class:"text-2xl font-bold text-green-600"},ms=e("div",{class:"text-sm text-gray-600 mt-1"},"ارسال موفق",-1),ps={class:"rounded-lg border border-red-200 bg-red-50 p-4 text-center"},fs={class:"text-2xl font-bold text-red-600"},gs=e("div",{class:"text-sm text-gray-600 mt-1"},"ارسال ناموفق",-1),bs={class:"rounded-lg border border-amber-200 bg-amber-50 p-4 text-center"},hs={class:"text-2xl font-bold text-amber-700"},ys=e("div",{class:"text-sm text-gray-600 mt-1"},"قابل ارسال مجدد",-1),xs={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 text-center"},ks={class:"text-2xl font-bold text-gray-700"},ws=e("div",{class:"text-sm text-gray-600 mt-1"},"مجموع تلاش‌ها",-1),$s={key:0,class:"mb-3 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-800"},Is={key:1,class:"mb-3 rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-800"},Ss={key:2,class:"text-sm text-gray-600"},Ps={class:"text-green-600"},Cs={class:"text-green-600"},Rs={class:"text-red-600"},Ts={key:3,class:"text-sm text-gray-500"},As=_e({__name:"PushHistoryPanel",setup(a,{expose:r}){const[D,M]=de(),g=v(!1),C=v(!1),b=v(!1),h=v(!1),t=v(null),j=v({columns:as,api:Ne,defaultPageLimit:20,height:"55vh"}),f=E(()=>t.value?(t.value.sent_count||0)+(t.value.failed_count||0):0),q=E(()=>!f.value||!t.value?0:Math.round(t.value.sent_count/f.value*100)),N=E(()=>!t.value||t.value.status==="completed"?!1:t.value.can_resume!==!1),O=E(()=>!t.value||t.value.can_retry_timeouts===!1?!1:(t.value.timeout_count||0)>0),V=E(()=>{var R;switch((R=t.value)==null?void 0:R.status){case"failed":return"text-red-600 font-medium";case"sending":return"text-blue-700 font-medium";case"pending":return"text-amber-700 font-medium";case"completed":return"text-green-700 font-medium";default:return"text-gray-700"}});function Y(R){return R?ve(R):"-"}async function w(R){g.value=!0,C.value=!0,t.value=null;try{t.value=await me(R.id)}finally{C.value=!1}}function J(){g.value=!1,t.value=null}async function z(){var R,k,U;if(!(!((R=t.value)!=null&&R.id)||!N.value)){b.value=!0;try{const $=await Ee(t.value.id);p.success($.message||"ارسال از همان نقطه ادامه یافت"),t.value=await me(t.value.id),M()}catch($){p.error(((U=(k=$==null?void 0:$.response)==null?void 0:k.data)==null?void 0:U.error)||$.message||"خطا در ادامه ارسال")}finally{b.value=!1}}}async function G(){var R,k,U;if(!(!((R=t.value)!=null&&R.id)||!O.value)){h.value=!0;try{const $=await Fe(t.value.id);p.success($.message||"ارسال مجدد موارد ناموفق شروع شد"),t.value=await me(t.value.id),M()}catch($){p.error(((U=(k=$==null?void 0:$.response)==null?void 0:k.data)==null?void 0:U.error)||$.message||"خطا در ارسال مجدد")}finally{h.value=!1}}}function te(){M()}return r({reload:te}),(R,k)=>{const U=pe,$=$e,B=Ie,Q=Se,se=Pe,Z=we;return x(),S("div",null,[s(U,ce(j.value,{onRegister:L(D)}),{action:l(({record:K})=>[e("div",os,[s(L(ue),{class:"cursor-pointer"},{title:l(()=>[is]),default:l(()=>[s(re,{icon:"vuesax-linear:eye",color:"#1D4ED8",onClick:ae=>w(K)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"]),s(Z,{visible:g.value,"onUpdate:visible":k[0]||(k[0]=K=>g.value=K),title:"جزئیات نوتیفیکیشن ارسالی","custom-footer":"",width:"720px",onClose:J},{footer:l(()=>[e("div",rs,[O.value?(x(),ie($,{key:0,type:"primary",ghost:"",loading:h.value,onClick:G},{default:l(()=>{var K;return[u(" ارسال مجدد موارد ناموفق ("+o(((K=t.value)==null?void 0:K.timeout_count)||0)+") ",1)]}),_:1},8,["loading"])):A("",!0),N.value?(x(),ie($,{key:1,type:"primary",loading:b.value,onClick:z},{default:l(()=>[u(" ادامه ارسال از همین نقطه ")]),_:1},8,["loading"])):A("",!0),s($,{onClick:J},{default:l(()=>[u("بستن")]),_:1})])]),default:l(()=>[s(se,{spinning:C.value},{default:l(()=>[t.value?(x(),S(ke,{key:0},[s(Q,{bordered:"",column:2,size:"small",class:"mb-4"},{default:l(()=>[s(B,{label:"شناسه"},{default:l(()=>[u("#"+o(t.value.id),1)]),_:1}),s(B,{label:"نوع ارسال"},{default:l(()=>[u(o(L(ls)(t.value.type)),1)]),_:1}),s(B,{label:"وضعیت"},{default:l(()=>[e("span",{class:xe(V.value)},o(L(ns)(t.value.status||"completed")),3)]),_:1}),s(B,{label:"تاریخ ارسال"},{default:l(()=>[u(o(Y(t.value.created_at)),1)]),_:1}),s(B,{label:"ارسال‌کننده"},{default:l(()=>[u(o(t.value.admin_name||"-"),1)]),_:1}),s(B,{label:"کل هدف"},{default:l(()=>[u(o(t.value.total_subscriptions??"-"),1)]),_:1}),s(B,{label:"عنوان",span:2},{default:l(()=>[u(o(t.value.title),1)]),_:1}),s(B,{label:"متن",span:2},{default:l(()=>[e("div",us,o(t.value.body),1)]),_:1}),s(B,{label:"لینک",span:2},{default:l(()=>[u(o(t.value.url||"/"),1)]),_:1}),t.value.error_message?(x(),ie(B,{key:0,label:"آخرین خطا",span:2},{default:l(()=>[e("span",ds,o(t.value.error_message),1)]),_:1})):A("",!0)]),_:1}),e("div",cs,[e("div",vs,[e("div",_s,o(t.value.sent_count),1),ms]),e("div",ps,[e("div",fs,o(t.value.failed_count),1),gs]),e("div",bs,[e("div",hs,o(t.value.timeout_count||0),1),ys]),e("div",xs,[e("div",ks,o(f.value),1),ws])]),N.value?(x(),S("div",$s," این کمپین کامل نشده است. با زدن دکمه «ادامه ارسال» از همان نقطه قبلی ادامه می‌یابد و از اول شروع نمی‌شود. ")):A("",!0),O.value?(x(),S("div",Is," برخی ارسال‌ها به‌خاطر Timeout یا خطای موقت شکست خورده‌اند. با دکمه «ارسال مجدد موارد ناموفق» دوباره تلاش می‌شود. سابسکریپشن‌های مرده (۴۰۴/۴۱۰) در این صف نیستند. ")):A("",!0),f.value>0?(x(),S("div",Ss,[u(" نرخ موفقیت: "),e("strong",Ps,o(q.value)+"%",1),u(" — "),e("span",Cs,o(t.value.sent_count)+" موفق",1),u(" / "),e("span",Rs,o(t.value.failed_count)+" ناموفق",1)])):(x(),S("div",Ts," هنوز ارسالی برای این کمپین ثبت نشده است. "))],64)):A("",!0)]),_:1},8,["spinning"])]),_:1},8,["visible"])])}}}),Ds=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"نام",dataIndex:"name",key:"name",filterable:!1},{title:"کد",dataIndex:"code",key:"code",filterable:!1},{title:"عنوان",dataIndex:"title",key:"title",filterable:!1},{title:"متن",dataIndex:"message",key:"message",filterable:!1,customRender:a=>{const r=a.record.message||"";return r.length>40?`${r.slice(0,40)}...`:r}},{title:"فعال",dataIndex:"is_active",key:"is_active",slot:"is_active",filterable:!1,align:"center"},{title:"ارسال‌شده",dataIndex:"sent_count",key:"sent_count",filterable:!1},{title:"ناموفق",dataIndex:"failed_count",key:"failed_count",filterable:!1},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}],Ls={pending:"در انتظار",sent:"ارسال شده",failed:"ناموفق",cancelled:"لغو شده",skipped:"رد شده"},Us=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"کاربر",dataIndex:"user_id",key:"user_id",filterable:!1,customRender:a=>{const r=a.record.user_id||"-";return r.length>12?`${r.slice(0,8)}…`:r}},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:a=>Ls[a.record.status]||a.record.status},{title:"تاریخ برنامه‌ریزی",dataIndex:"scheduled_for",key:"scheduled_for",filterable:!1},{title:"زمان ارسال",dataIndex:"sent_at",key:"sent_at",filterable:!1,customRender:a=>a.record.sent_at?ve(a.record.sent_at):"-"},{title:"توضیح",dataIndex:"error_message",key:"error_message",filterable:!1,customRender:a=>a.record.error_message||"-"}],Bs=e("p",{class:"text-sm text-gray-500 mb-4"}," اتوماسیون‌های نوتیفیکیشن کدوبلو. عنوان، متن، لینک و فعال بودن قابل ویرایش است؛ شرط ارسال در سیستم ثابت است. ",-1),js={class:"gap-2 flex justify-center"},qs=e("span",null,"ویرایش",-1),Os=e("span",null,"آمار ارسال",-1),Ms=e("span",null,"ارسال تست",-1),Ns={class:"space-y-4"},Es=e("div",{class:"mb-1 text-sm text-gray-600"},"نام",-1),Fs={class:"font-medium"},Vs=e("div",{class:"mb-1 text-sm text-gray-600"},"شرط ارسال",-1),Ks={class:"text-sm text-gray-700 whitespace-pre-wrap"},Hs=e("div",{class:"mb-1 text-sm text-gray-600"},"عنوان *",-1),Js=e("div",{class:"mb-1 text-sm text-gray-600"},"متن پیام *",-1),zs=e("div",{class:"mb-1 text-sm text-gray-600"},"Deep Link",-1),Gs={class:"space-y-3"},Qs={class:"text-sm text-gray-600"},Ws={class:"text-green-600"},Xs={class:"text-red-600"},Ys={class:"text-gray-500"},Zs={class:"whitespace-pre-wrap text-sm"},ea={class:"flex flex-wrap gap-2 items-center mb-3"},ta=e("span",{class:"text-sm text-gray-600"},"فیلتر وضعیت:",-1),sa=_e({__name:"PushAutomationsPanel",setup(a,{expose:r}){const{TextArea:D}=oe,[M,g]=de(),[C,b]=de(),h=v({columns:Ds,api:Ve,defaultPageLimit:50,height:"55vh",showOptionHeader:!1}),t=v(!1),j=v(null),f=Ye({title:"",message:"",deep_link:"/challenges",is_active:!0}),q=v(!1),N=v(null),O=v(""),V=v(!1),Y=v(!1),w=v(null),J=v(null),z=v(),G=v(""),te=v({columns:Us,api:Z,defaultPageLimit:20,height:"40vh",showOptionHeader:!1});async function R(_,d){if(_.is_active===d)return;const n=_.is_active;_.is_active=d;try{await ge(_.id,{is_active:d}),p.success(d?"اتوماسیون فعال شد":"اتوماسیون غیرفعال شد")}catch{_.is_active=n,p.error("تغییر وضعیت ناموفق بود")}}function k(_){j.value=_,f.title=_.title||"",f.message=_.message||"",f.deep_link=_.deep_link||"/challenges",f.is_active=_.is_active!==!1,t.value=!0}function U(){t.value=!1,j.value=null}async function $(){if(j.value){if(!f.title.trim()||!f.message.trim()){p.error("عنوان و متن الزامی است");return}try{await ge(j.value.id,{title:f.title.trim(),message:f.message.trim(),deep_link:f.deep_link.trim()||"/",is_active:f.is_active}),p.success("اتوماسیون ذخیره شد"),U(),await g()}catch{p.error("ذخیره ناموفق بود")}}}function B(_){N.value=_,O.value="",q.value=!0}function Q(){q.value=!1,N.value=null,O.value=""}async function se(){var d,n;if(!N.value)return;const _=O.value.trim();if(!_){p.error("شماره موبایل الزامی است");return}try{await Ke(N.value.id,{phone:_}),p.success("نوتیف تست ارسال شد"),Q()}catch(i){p.error(((n=(d=i==null?void 0:i.response)==null?void 0:d.data)==null?void 0:n.error)||(i==null?void 0:i.message)||"ارسال تست ناموفق بود")}}async function Z(_){if(!J.value)return{rows:[],total:0,query:{..._,total:0}};const d=await fe(J.value,{page:_.page,limit:_.limit,status:z.value,search:G.value||_.search||void 0});w.value=d;const n=_.page||1,i=_.limit||20,P=(n-1)*i;return{rows:d.sends.rows.map((m,c)=>({...m,index:P+c})),total:d.sends.total,query:{..._,total:d.sends.total,page:n,limit:i}}}async function K(_){Y.value=!0;try{J.value=_,w.value=await fe(_,{page:1,limit:20,status:z.value,search:G.value||void 0}),await b()}finally{Y.value=!1}}function ae(_){z.value=void 0,G.value="",V.value=!0,K(_.id)}function le(){V.value=!1,w.value=null,J.value=null}function ne(){b()}return r({reload:g}),(_,d)=>{const n=Je,i=pe,P=Ze,m=we,c=$e,y=Ie,T=Se,X=et,H=tt,F=ze,Te=Pe;return x(),S("div",null,[Bs,s(i,ce(h.value,{onRegister:L(M)}),{is_active:l(({record:I})=>[s(n,{checked:I.is_active,onChange:W=>R(I,W)},null,8,["checked","onChange"])]),action:l(({record:I})=>[e("div",js,[s(L(ue),{class:"cursor-pointer"},{title:l(()=>[qs]),default:l(()=>[s(re,{icon:"vuesax-linear:edit",color:"#1D4ED8",onClick:W=>k(I)},null,8,["onClick"])]),_:2},1024),s(L(ue),{class:"cursor-pointer"},{title:l(()=>[Os]),default:l(()=>[s(re,{icon:"vuesax-linear:eye",color:"#059669",onClick:W=>ae(I)},null,8,["onClick"])]),_:2},1024),s(L(ue),{class:"cursor-pointer"},{title:l(()=>[Ms]),default:l(()=>[s(re,{icon:"vuesax-linear:notification",color:"#7C3AED",onClick:W=>B(I)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"]),s(m,{visible:t.value,"onUpdate:visible":d[4]||(d[4]=I=>t.value=I),title:"ویرایش اتوماسیون نوتیف",width:"640px",onOk:$,onCancel:U},{default:l(()=>{var I,W;return[e("div",Ns,[e("div",null,[Es,e("div",Fs,o((I=j.value)==null?void 0:I.name),1)]),e("div",null,[Vs,e("div",Ks,o((W=j.value)==null?void 0:W.trigger_summary),1)]),e("div",null,[Hs,s(P,{value:f.title,"onUpdate:value":d[0]||(d[0]=ee=>f.title=ee),placeholder:"عنوان نوتیف"},null,8,["value"])]),e("div",null,[Js,s(L(D),{value:f.message,"onUpdate:value":d[1]||(d[1]=ee=>f.message=ee),rows:4,placeholder:"متن نوتیف"},null,8,["value"])]),e("div",null,[zs,s(P,{value:f.deep_link,"onUpdate:value":d[2]||(d[2]=ee=>f.deep_link=ee),placeholder:"/challenges"},null,8,["value"])]),e("div",null,[s(L(st),{checked:f.is_active,"onUpdate:checked":d[3]||(d[3]=ee=>f.is_active=ee)},{default:l(()=>[u("فعال")]),_:1},8,["checked"])])])]}),_:1},8,["visible"]),s(m,{visible:q.value,"onUpdate:visible":d[6]||(d[6]=I=>q.value=I),title:"ارسال تست نوتیف",width:"480px",onOk:se,onCancel:Q},{default:l(()=>{var I;return[e("div",Gs,[e("div",Qs," نوتیف «"+o((I=N.value)==null?void 0:I.name)+"» برای کاربری که Push فعال دارد ارسال می‌شود. ",1),s(P,{value:O.value,"onUpdate:value":d[5]||(d[5]=W=>O.value=W),placeholder:"شماره موبایل کاربر (09...)"},null,8,["value"])])]}),_:1},8,["visible"]),s(m,{visible:V.value,"onUpdate:visible":d[9]||(d[9]=I=>V.value=I),title:"آمار ارسال اتوماسیون نوتیف","custom-footer":"",width:"90%",onClose:le},{footer:l(()=>[s(c,{onClick:le},{default:l(()=>[u("بستن")]),_:1})]),default:l(()=>[s(Te,{spinning:Y.value},{default:l(()=>[w.value?(x(),S(ke,{key:0},[s(T,{bordered:"",column:2,size:"small",class:"mb-4"},{default:l(()=>[s(y,{label:"نام"},{default:l(()=>[u(o(w.value.automation.name),1)]),_:1}),s(y,{label:"کد"},{default:l(()=>[u(o(w.value.automation.code),1)]),_:1}),s(y,{label:"وضعیت"},{default:l(()=>[u(o(w.value.automation.is_active?"فعال":"غیرفعال"),1)]),_:1}),s(y,{label:"آمار کلی"},{default:l(()=>[e("span",Ws,o(w.value.automation.sent_count),1),u(" / "),e("span",Xs,o(w.value.automation.failed_count),1),u(" / "),e("span",Ys,o(w.value.automation.cancelled_count),1)]),_:1}),s(y,{label:"Deep Link",span:2},{default:l(()=>[u(o(w.value.automation.deep_link),1)]),_:1}),s(y,{label:"شرط",span:2},{default:l(()=>[u(o(w.value.automation.trigger_summary),1)]),_:1}),s(y,{label:"عنوان",span:2},{default:l(()=>[u(o(w.value.automation.title),1)]),_:1}),s(y,{label:"متن",span:2},{default:l(()=>[e("div",Zs,o(w.value.automation.message),1)]),_:1})]),_:1}),e("div",ea,[ta,s(H,{value:z.value,"onUpdate:value":d[7]||(d[7]=I=>z.value=I),"allow-clear":"",placeholder:"همه",style:{width:"160px"},onChange:ne},{default:l(()=>[s(X,{value:"sent"},{default:l(()=>[u("ارسال شده")]),_:1}),s(X,{value:"failed"},{default:l(()=>[u("ناموفق")]),_:1}),s(X,{value:"pending"},{default:l(()=>[u("در انتظار")]),_:1}),s(X,{value:"skipped"},{default:l(()=>[u("رد شده")]),_:1}),s(X,{value:"cancelled"},{default:l(()=>[u("لغو شده")]),_:1})]),_:1},8,["value"]),s(F,{value:G.value,"onUpdate:value":d[8]||(d[8]=I=>G.value=I),placeholder:"جستجو user id",style:{width:"220px"},onSearch:ne},null,8,["value"])]),s(i,ce(te.value,{onRegister:L(C)}),null,16,["onRegister"])],64)):A("",!0)]),_:1},8,["spinning"])]),_:1},8,["visible"])])}}}),aa=e("div",{class:"flex justify-between items-center mb-4"},[e("h2",null,"نوتیفیکیشن Push")],-1),ll=_e({__name:"index",setup(a){const r=v("send"),D=v(null),M=v(null);function g(){var b;(b=D.value)==null||b.reload()}function C(b){var h,t;b==="history"&&((h=D.value)==null||h.reload()),b==="automations"&&((t=M.value)==null||t.reload())}return(b,h)=>{const t=at,j=lt,f=Ae;return x(),ie(f,null,{default:l(()=>[aa,s(j,{activeKey:r.value,"onUpdate:activeKey":h[0]||(h[0]=q=>r.value=q),onChange:C},{default:l(()=>[s(t,{key:"send",tab:"ارسال نوتیفیکیشن"},{default:l(()=>[s(ts,{onSent:g})]),_:1}),s(t,{key:"history",tab:"سوابق ارسالی"},{default:l(()=>[s(As,{ref_key:"historyPanelRef",ref:D},null,512)]),_:1}),s(t,{key:"automations",tab:"اتوماسیون‌ها"},{default:l(()=>[s(sa,{ref_key:"automationsPanelRef",ref:M},null,512)]),_:1})]),_:1},8,["activeKey"])]),_:1})}}});export{ll as default};