ghost 6.13.1 → 6.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/components/tryghost-i18n-6.13.2.tgz +0 -0
  2. package/core/built/admin/assets/{_baseAssignValue-CPzElAl9.js → _baseAssignValue-qTINVNgk.js} +1 -1
  3. package/core/built/admin/assets/{a-large-small-2Oh9oqBr.js → a-large-small-D-nhKFBX.js} +1 -1
  4. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +2 -2
  5. package/core/built/admin/assets/admin-x-settings/{code-editor-view-B5QudVu-.mjs → code-editor-view-CXaEQbfL.mjs} +2 -2
  6. package/core/built/admin/assets/admin-x-settings/{index-D3C8sdqQ.mjs → index-BrqKezEN.mjs} +30 -24
  7. package/core/built/admin/assets/admin-x-settings/{index-B66mLTSp.mjs → index-CwXvgyDY.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-CdWUpaGD.mjs → index-Dc7foGQ2.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{modals-lYrPGC_E.mjs → modals-Ba1hMizc.mjs} +2 -2
  10. package/core/built/admin/assets/{at-sign-BtKGpnjs.js → at-sign-DHUgIxNb.js} +1 -1
  11. package/core/built/admin/assets/{audience-select-DuSCQEyi.js → audience-select-C17Kh6Hl.js} +1 -1
  12. package/core/built/admin/assets/{avatar-flipboard-CcvOD0pV.js → avatar-flipboard-Cdj8uoBX.js} +1 -1
  13. package/core/built/admin/assets/{bluesky-sharing-Frg4QWOQ.js → bluesky-sharing-DYSv4ewp.js} +1 -1
  14. package/core/built/admin/assets/{chart-tL51cfF9.js → chart-BYGpVun6.js} +1 -1
  15. package/core/built/admin/assets/{chunk.397.a720333cfffc99c47e71.js → chunk.397.71f16fce8de382622bb4.js} +2 -2
  16. package/core/built/admin/assets/{chunk.524.6168e2262e63b155f63e.js → chunk.524.ccb5a082c09fdedaf1d0.js} +6 -6
  17. package/core/built/admin/assets/{chunk.582.45f8c5479d11e969ddc2.js → chunk.582.311f93280422738b8a5d.js} +7 -7
  18. package/core/built/admin/assets/{code-editor-view-BHiySSgi.js → code-editor-view-BnOaGsRA.js} +1 -1
  19. package/core/built/admin/assets/{comments-svHZXAlu.js → comments-DiZAz2yU.js} +1 -1
  20. package/core/built/admin/assets/{copy-B8yuX-e4.js → copy-CCj6xx5V.js} +1 -1
  21. package/core/built/admin/assets/{data-list-C_WXxmo3.js → data-list-By9zN-Ma.js} +1 -1
  22. package/core/built/admin/assets/{deleted-feed-item-OXPcC4Z2.js → deleted-feed-item-Dl0oQ0DH.js} +1 -1
  23. package/core/built/admin/assets/{edit-profile-DgMLvoyu.js → edit-profile-DZhjWF_f.js} +1 -1
  24. package/core/built/admin/assets/{empty-indicator-DOQCKEXD.js → empty-indicator-B7WXKrac.js} +1 -1
  25. package/core/built/admin/assets/{en-Z93BzXte.js → en-B8oRL8Ua.js} +1 -1
  26. package/core/built/admin/assets/{feed-BKXpQU0e.js → feed-DU5QhfRX.js} +1 -1
  27. package/core/built/admin/assets/{filters-dwDByCkK.js → filters-C-v3cGt0.js} +1 -1
  28. package/core/built/admin/assets/{gh-chart-CaA6rQiP.js → gh-chart-B98YGgzG.js} +1 -1
  29. package/core/built/admin/assets/{growth-DKtJYCNb.js → growth-_giTyVF8.js} +1 -1
  30. package/core/built/admin/assets/{hash-ZzZYv2ek.js → hash-B4UtN3nq.js} +1 -1
  31. package/core/built/admin/assets/{inbox-C5KDymI8.js → inbox-D336Mbic.js} +1 -1
  32. package/core/built/admin/assets/{index-VdGL6HfS.js → index-B3CWs1Pb.js} +1 -1
  33. package/core/built/admin/assets/{index-CM3YmTO5.js → index-Bl3YnEiK.js} +1 -1
  34. package/core/built/admin/assets/{index-OPvny56_.js → index-BuFp5nYK.js} +1 -1
  35. package/core/built/admin/assets/{index-BX3p0DcO.js → index-C9PDrFEW.js} +1 -1
  36. package/core/built/admin/assets/{index-DethZCE1.js → index-CEEPij-w.js} +1 -1
  37. package/core/built/admin/assets/{index-BNkw6KwF.js → index-CLdEbHsV.js} +1 -1
  38. package/core/built/admin/assets/{index-CQVI9TPr.js → index-CdIdIOil.js} +1 -1
  39. package/core/built/admin/assets/{index-B6mBuUxr.js → index-DI4OotZO.js} +1 -1
  40. package/core/built/admin/assets/{index-BniBHF2r.js → index-DXuLaG0T.js} +1 -1
  41. package/core/built/admin/assets/{index-6_RXbq08.css → index-DbjfIcZe.css} +1 -1
  42. package/core/built/admin/assets/{index-X_uC_0DD.js → index-Dq_j8mTf.js} +3 -3
  43. package/core/built/admin/assets/{index-DOORRiFo.js → index-cWfIWdIX.js} +1 -1
  44. package/core/built/admin/assets/{index-CF6UHTsD.js → index-iHz8ZTSi.js} +1 -1
  45. package/core/built/admin/assets/{index-D9gfkxEz.js → index-k2aVq6ms.js} +1 -1
  46. package/core/built/admin/assets/{index-syvYkr47.js → index-w7Tz4ytz.js} +1 -1
  47. package/core/built/admin/assets/koenig-lexical/index.css +2 -2
  48. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +21800 -23540
  49. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +177 -177
  50. package/core/built/admin/assets/{koenig-lexical-D4CBYCN7.js → koenig-lexical-5o67f7C9.js} +155 -155
  51. package/core/built/admin/assets/{kpi-card-DOIcNxgg.js → kpi-card-XLCPc_4J.js} +1 -1
  52. package/core/built/admin/assets/{kpis-BrSBq5c9.js → kpis-Czdhg1qV.js} +1 -1
  53. package/core/built/admin/assets/{links-DkVK8XO7.js → links-CY3nuFg7.js} +1 -1
  54. package/core/built/admin/assets/{lucide-react-DNj9Mt50.js → lucide-react-B7CWr8XP.js} +1 -1
  55. package/core/built/admin/assets/{main-layout-A6BaeVIm.js → main-layout-CmX429hf.js} +1 -1
  56. package/core/built/admin/assets/{message-square-text-DJWDCab0.js → message-square-text-Cqodm1uC.js} +1 -1
  57. package/core/built/admin/assets/{minus-B7zQY2p1.js → minus-K1Fj4qFh.js} +1 -1
  58. package/core/built/admin/assets/{modals-DJQDv_48.js → modals-C0x0SG_a.js} +1 -1
  59. package/core/built/admin/assets/{moderation-DikYZSIC.js → moderation-DqX2eQNM.js} +1 -1
  60. package/core/built/admin/assets/{newsletter-ok4p5aPZ.js → newsletter-BaZVL4Rg.js} +1 -1
  61. package/core/built/admin/assets/{newsletters-ClUaZMbc.js → newsletters-DpmHk1Kf.js} +1 -1
  62. package/core/built/admin/assets/{note-C445n_od.js → note-Bqr3ECo6.js} +1 -1
  63. package/core/built/admin/assets/{overview-vPttXZEx.js → overview-CGTvSQfN.js} +1 -1
  64. package/core/built/admin/assets/{pagemenu-CUEgz3GC.js → pagemenu-z-Nc5-Yy.js} +1 -1
  65. package/core/built/admin/assets/{post-analytics-DPIgO2YG.js → post-analytics-DCAOPWEx.js} +1 -1
  66. package/core/built/admin/assets/{post-analytics-context-DGNsxT8V.js → post-analytics-context-DctS9fHu.js} +1 -1
  67. package/core/built/admin/assets/{post-analytics-header-B1f7HAy_.js → post-analytics-header-C6tJIKtV.js} +1 -1
  68. package/core/built/admin/assets/{post-share-modal-BIddzWjJ.js → post-share-modal-CtQTpIsC.js} +1 -1
  69. package/core/built/admin/assets/{posts-DOThg8yh.js → posts-D0erEci0.js} +1 -1
  70. package/core/built/admin/assets/{referrers-BK-mXdat.js → referrers-D4s1ncIT.js} +1 -1
  71. package/core/built/admin/assets/{repeat-CQvZJI02.js → repeat-BNamsVQr.js} +1 -1
  72. package/core/built/admin/assets/{reply-BET0l7FZ.js → reply-DqXFv78k.js} +1 -1
  73. package/core/built/admin/assets/{select-BH3t_tDB.js → select-CFBw9aAY.js} +1 -1
  74. package/core/built/admin/assets/{settings-CpkvyD93.js → settings-B_8Oslb0.js} +5 -5
  75. package/core/built/admin/assets/{settings-OIq7tQiJ.js → settings-BnZOyHrT.js} +1 -1
  76. package/core/built/admin/assets/{sort-button-DkfQ-8QJ.js → sort-button-K1rs2zWp.js} +1 -1
  77. package/core/built/admin/assets/{source-icon-DOOAvJR8.js → source-icon-KI6QTdIv.js} +1 -1
  78. package/core/built/admin/assets/{sprout-gjsBxaCU.js → sprout-C96gimQS.js} +1 -1
  79. package/core/built/admin/assets/{square-DsGufPa-.js → square-s6ZVKvbY.js} +1 -1
  80. package/core/built/admin/assets/{stats-Cu49FJzo.js → stats-C8Qt0L-1.js} +1 -1
  81. package/core/built/admin/assets/{stats-view-DUoDKh7r.js → stats-view-0eaQf_pM.js} +1 -1
  82. package/core/built/admin/assets/{step-1-QOnWlIzD.js → step-1-Gnp7iGGY.js} +1 -1
  83. package/core/built/admin/assets/{step-2-CDFj1bR5.js → step-2-DFbY2-K1.js} +1 -1
  84. package/core/built/admin/assets/{step-3-Cjmt9ecL.js → step-3-CoA_-aRF.js} +1 -1
  85. package/core/built/admin/assets/{table-PBYP6iVu.js → table-DpY57zP6.js} +1 -1
  86. package/core/built/admin/assets/{tabs--ia9i-R8.js → tabs-BTEs4Aby.js} +1 -1
  87. package/core/built/admin/assets/{tags-DwsoamaL.js → tags-CIEzegXe.js} +1 -1
  88. package/core/built/admin/assets/{tags-DK91bj9-.js → tags-DUcQDnmf.js} +1 -1
  89. package/core/built/admin/assets/{toggle-group-my6OlgUp.js → toggle-group-qaH0bKBM.js} +1 -1
  90. package/core/built/admin/assets/{topic-filter-Cdat1Ona.js → topic-filter-BmvO9gja.js} +1 -1
  91. package/core/built/admin/assets/{trash-C2kuVkXA.js → trash-DIVNO9rU.js} +1 -1
  92. package/core/built/admin/assets/{url-helpers-BuFo9dQz.js → url-helpers-Cn69VioM.js} +1 -1
  93. package/core/built/admin/assets/{use-growth-stats-DY2E0ltn.js → use-growth-stats-DPN4F7Mt.js} +1 -1
  94. package/core/built/admin/assets/{use-infinite-virtual-scroll-CS20HV8J.js → use-infinite-virtual-scroll-D5U6oSIq.js} +1 -1
  95. package/core/built/admin/assets/{use-simple-pagination-kb9H2Ssw.js → use-simple-pagination-_Ui1WbsL.js} +1 -1
  96. package/core/built/admin/assets/{user-round-check-Biw6QBQA.js → user-round-check-pBOLjTqi.js} +1 -1
  97. package/core/built/admin/assets/{wallet-cards-aM5Ct3OB.js → wallet-cards-yxIjXIK2.js} +1 -1
  98. package/core/built/admin/assets/{web-DiBDLMW8.js → web-CtBMATfv.js} +1 -1
  99. package/core/built/admin/index-forward.html +5 -5
  100. package/core/built/admin/index.html +3 -3
  101. package/core/server/services/member-welcome-emails/constants.js +1 -22
  102. package/core/server/services/member-welcome-emails/service.js +2 -20
  103. package/core/server/services/members/members-api/repositories/member-repository.js +7 -12
  104. package/package.json +13 -13
  105. package/yarn.lock +72 -89
  106. package/components/tryghost-i18n-6.13.1.tgz +0 -0
  107. /package/core/built/admin/assets/{chunk.397.a720333cfffc99c47e71.js.LICENSE.txt → chunk.397.71f16fce8de382622bb4.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- import{aR as le,j as e,aW as ve,ap as Ce,B as ne,b5 as Ne,aY as _e,b6 as Z,aP as Le,aO as Ee,bJ as Fe,bK as ye,bL as Pe,bM as De,bN as Te,bO as Ae,b$ as Ie,aj as ke,ai as Oe,r as l,c0 as Me,aQ as ae,bS as we,af as ce,ag as Q,c1 as Ue,bR as Re,aM as Ve,u as Be,aS as ze,aN as $e}from"./index-X_uC_0DD.js";import{A as oe,a as p,u as $,S as ue,b as de,U as me}from"./post-analytics-context-DGNsxT8V.js";import{S as Ke,a as Ge,b as We,c as He,d as Qe,e as Ye,f as qe}from"./select-BH3t_tDB.js";import{a as Je,F as Xe,b as Ze,c as et}from"./message-square-text-DJWDCab0.js";import{g as tt,a as st,S as at,b as nt}from"./kpis-BrSBq5c9.js";import{F as ot,c as q,e as pe}from"./en-Z93BzXte.js";import{C as he,a as it,b as rt,h as lt,c as ge,i as ct,u as W,j as ee}from"./pagemenu-CUEgz3GC.js";import{D as ut,h as dt,i as ie,a as mt,b as pt,c as ht,d as gt,e as ft,f as bt,g as xt}from"./data-list-C_WXxmo3.js";import{a as jt,U as St}from"./wallet-cards-aM5Ct3OB.js";import{P as vt,a as Ct}from"./post-analytics-header-B1f7HAy_.js";import{F as Nt,c as _t}from"./filters-dwDByCkK.js";import{b as Lt,c as Et,d as Ft,S as yt,T as Pt}from"./lucide-react-DNj9Mt50.js";import{E as Dt}from"./empty-indicator-DOQCKEXD.js";import"./posts-DOThg8yh.js";import"./source-icon-DOOAvJR8.js";import"./source-utils-B1S3ZHA2.js";import"./gh-chart-CaA6rQiP.js";import"./chart-tL51cfF9.js";import"./_baseAssignValue-CPzElAl9.js";import"./tabs--ia9i-R8.js";import"./index-BNkw6KwF.js";import"./post-share-modal-BIddzWjJ.js";import"./post-helpers-gInwAwEv.js";import"./trash-C2kuVkXA.js";import"./sprout-gjsBxaCU.js";import"./a-large-small-2Oh9oqBr.js";import"./at-sign-BtKGpnjs.js";import"./copy-B8yuX-e4.js";import"./hash-ZzZYv2ek.js";import"./inbox-C5KDymI8.js";import"./minus-B7zQY2p1.js";import"./tags-DwsoamaL.js";import"./square-DsGufPa-.js";import"./user-round-check-Biw6QBQA.js";import"./repeat-CQvZJI02.js";import"./reply-BET0l7FZ.js";const H=[{name:"Public visitors",value:"undefined",bit:p.PUBLIC},{name:"Free members",value:"free",bit:p.FREE},{name:"Paid members",value:"paid",bit:p.PAID}],fe=t=>!t||t.length===0?oe:H.filter(s=>t.includes(s.value)).reduce((s,a)=>s|a.bit,0)||oe,be=t=>{const s=[];return(t&p.PUBLIC)!==0&&s.push(H[0].value),(t&p.FREE)!==0&&s.push(H[1].value),(t&p.PAID)!==0&&s.push(H[2].value),s.join(",")},Tt=()=>{const{audience:t,setAudience:s}=$(),{appSettings:a}=le(),i=o=>{s(t^o)},n=o=>(t&o)!==0,c=(o,m)=>{o.preventDefault(),i(m)},u=()=>{const o=[];if(n(p.PUBLIC)&&o.push("Public visitors"),n(p.FREE)&&o.push("Free members"),!a?.paidMembersEnabled){if(o.length===2)return"All audiences";if(o.length===1)return n(p.FREE)?"Free members":"Public visitors";if(o.length===0)return"Select audience"}return n(p.PAID)&&o.push("Paid members"),o.length===0?"Select audience":o.length===3?"All audiences":n(p.FREE)&&n(p.PAID)&&!n(p.PUBLIC)?"Members-only":o.join(" & ")};return e.jsxs(ve,{children:[e.jsx(Ce,{asChild:!0,children:e.jsxs(ne,{variant:"dropdown",children:[e.jsx(Ne,{}),e.jsx("span",{className:"lowercase first-letter:capitalize",children:u()})]})}),e.jsxs(_e,{align:"end",className:"w-full min-w-48",children:[e.jsx(Z,{checked:n(p.PUBLIC),onSelect:o=>c(o,p.PUBLIC),children:"Public visitors"}),e.jsx(Z,{checked:n(p.FREE),onSelect:o=>c(o,p.FREE),children:"Free members"}),a?.paidMembersEnabled&&e.jsx(Z,{checked:n(p.PAID),onSelect:o=>c(o,p.PAID),children:"Paid members"})]})]})},te=()=>{const{range:t,setRange:s}=$();return e.jsxs(Ke,{value:`${t}`,onValueChange:a=>{s(Number(a))},children:[e.jsxs(Ge,{className:"w-auto",children:[e.jsx(Je,{className:"mr-2",size:16,strokeWidth:1.5}),e.jsx(We,{placeholder:"Select a period"})]}),e.jsx(He,{align:"end",children:e.jsxs(Qe,{children:[e.jsx(Ye,{children:"Period"}),Object.values(ue).map(a=>e.jsx(qe,{value:`${a.value}`,children:a.name},a.value))]})})]})};q.registerLocale(pe);const At=t=>de[t]||q.getName(t,"en")||"Unknown",It=t=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=t.toUpperCase();return s[a]||(t.length>2?t.substring(0,2):t)},re=({tableHeader:t,data:s,onLocationClick:a})=>e.jsxs(ut,{children:[t&&e.jsxs(dt,{children:[e.jsx(ie,{children:"Country"}),e.jsx(ie,{children:"Visitors"})]}),e.jsx(mt,{children:s.map(i=>{const n=At(`${i.location}`),c=a&&i.location!=="Unknown",u=i.location?i.location.toLowerCase():"unknown";return e.jsxs(pt,{className:c?"cursor-pointer":"","data-testid":`location-row-${u}`,onClick:c?()=>a(i.location):void 0,children:[e.jsx(ht,{style:{width:`${i.percentage?Math.round(i.percentage*100):0}%`}}),e.jsx(gt,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:e.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:n,children:[e.jsx(ot,{countryCode:`${It(i.location)}`,fallback:e.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:e.jsx(Ie.SkullAndBones,{className:"size-3"})})}),e.jsx("div",{className:"truncate font-medium",children:n})]})}),e.jsxs(ft,{children:[e.jsx(bt,{children:ke(Number(i.visits))}),e.jsx(xt,{children:Oe(i.percentage)})]})]},i.location||"unknown")})})]}),kt=({data:t,isLoading:s,onLocationClick:a})=>{const i=t.slice(0,10);return e.jsx(e.Fragment,{children:s?"":e.jsx(e.Fragment,{children:t&&t.length>0&&e.jsxs(he,{className:"group/datalist","data-testid":"locations-card",children:[e.jsxs("div",{className:"flex items-center justify-between p-6",children:[e.jsxs(it,{className:"p-0",children:[e.jsx(rt,{children:"Locations"}),e.jsx(lt,{children:"Where are the readers of this post"})]}),e.jsx(Le,{className:"mr-2",children:"Visitors"})]}),e.jsxs(ge,{className:"overflow-hidden",children:[e.jsx(Ee,{}),e.jsx(re,{data:i,tableHeader:!1,onLocationClick:a})]}),t.length>10&&e.jsx(ct,{children:e.jsxs(Fe,{children:[e.jsx(ye,{asChild:!0,children:e.jsxs(ne,{variant:"outline",children:["View all ",e.jsx(jt,{})]})}),e.jsxs(Pe,{className:"overflow-y-auto pt-0 sm:max-w-[600px]",children:[e.jsxs(De,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[e.jsx(Te,{children:"Top locations"}),e.jsx(Ae,{children:"Where are the readers of this post"})]}),e.jsx("div",{className:"group/datalist",children:e.jsx(re,{data:t,tableHeader:!0,onLocationClick:a})})]})]})})]})})})};q.registerLocale(pe);const Ot=t=>de[t]||q.getName(t,"en")||t,Mt=({visits:t})=>e.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:t.toLocaleString()}),wt={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:t=>({value:t||"",label:t||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(t){const s=String(t.location||"");return s!==""&&!me.includes(s)},transformValue:t=>({value:t,label:Ot(t)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:t=>({value:t,label:t==="mobile-ios"?"iOS":t==="mobile-android"?"Android":t==="desktop"?"Desktop":t==="bot"?"Bot":t})}},Ut=(t,s,a)=>{const i={...a};return t.forEach(n=>{if(n.field===s||n.values.length===0)return;const c=n.values[0];n.field!=="audience"&&(n.field==="source"||n.field==="device"||n.field==="location"||n.field.startsWith("utm_"))&&(i[n.field]=c)}),i},P=(t,s=[],a,i={})=>{const{enabled:n=!0}=i,{statsConfig:c,range:u}=$(),{startDate:o,endDate:m,timezone:b}=ce(u),h=wt[t],f=l.useMemo(()=>{const N=s.find(v=>v.field==="audience");return fe(N?.values)},[s]),g=l.useMemo(()=>{const N={site_uuid:c?.id||"",date_from:Q(o),date_to:Q(m),timezone:b,member_status:be(f),limit:"50"};return a&&(N.post_uuid=a),Ut(s,t,N)},[c?.id,o,m,b,f,s,t,a]),{data:C,loading:D}=W({endpoint:h?.endpoint||"",statsConfig:c,params:g,enabled:n&&!!h});return{options:l.useMemo(()=>h?(C||[]).filter(v=>h.filterItem?h.filterItem(v):!0).map(v=>{const F=String(v[h.valueKey]??""),y=Number(v.visits)||0,{value:w,label:U}=h.transformValue?h.transformValue(F):{value:F,label:F};return{label:U,value:w,icon:e.jsx(Mt,{visits:y})}}):[],[C,h]),loading:D}};function Rt({filters:t,utmTrackingEnabled:s=!1,onChange:a,...i}){const{appSettings:n}=le(),{post:c}=$(),u=c?.uuid,[o,m]=l.useState(null),[b,h]=l.useState(!1);l.useEffect(()=>{const j=window.matchMedia("(max-width: 1024px)"),_=k=>{h(k.matches)};return _(j),j.addEventListener("change",_),()=>j.removeEventListener("change",_)},[]);const f=l.useMemo(()=>{const j=[{value:"undefined",label:"Public visitors",icon:e.jsx(ae,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:e.jsx(we,{className:"text-green"})},{value:"paid",label:"Paid members",icon:e.jsx(St,{className:"text-orange"})}];return n?.paidMembersEnabled?j:j.filter(_=>_.value!=="paid")},[n?.paidMembersEnabled]),g=l.useCallback(j=>{const _=o===j,k=t.some(O=>O.field===j);return _||k},[o,t]),{options:C,loading:D}=P("utm_source",t,u,{enabled:g("utm_source")}),{options:M,loading:N}=P("utm_medium",t,u,{enabled:g("utm_medium")}),{options:v,loading:F}=P("utm_campaign",t,u,{enabled:g("utm_campaign")}),{options:y,loading:w}=P("utm_content",t,u,{enabled:g("utm_content")}),{options:U,loading:R}=P("utm_term",t,u,{enabled:g("utm_term")}),{options:T,loading:K}=P("source",t,u,{enabled:g("source")}),{options:A,loading:B}=P("device",t,u,{enabled:g("device")}),{options:I,loading:G}=P("location",t,u,{enabled:g("location")}),x=l.useMemo(()=>[{value:"is",label:"is"}],[]),J=l.useMemo(()=>{const j=s?[{key:"utm_source",label:"UTM Source",type:"select",icon:e.jsx(Ft,{className:"size-4"}),placeholder:"Select source",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:C,isLoading:D,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:e.jsx(yt,{className:"size-4"}),placeholder:"Select medium",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:M,isLoading:N,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:e.jsx(et,{className:"size-4"}),placeholder:"Select campaign",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:v,isLoading:F,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:e.jsx(Pt,{className:"size-4"}),placeholder:"Select content",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:y,isLoading:w,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:e.jsx(Ue,{className:"size-4"}),placeholder:"Select term",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:U,isLoading:R,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}]:[];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:e.jsx(Me,{}),options:f.map(({value:_,label:k,icon:O})=>({value:_,label:k,icon:O})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:e.jsx(ae,{className:"size-4"}),placeholder:"Select source",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:T,isLoading:K,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:e.jsx(Lt,{className:"size-4"}),placeholder:"Select device",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:A,isLoading:B,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:e.jsx(Et,{className:"size-4"}),placeholder:"Select location",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:I,isLoading:G,searchable:!0,selectedOptionsClassName:"hidden"}]},...s?[{group:"UTM parameters",fields:j}]:[]]},[s,C,D,M,N,v,F,y,w,U,R,x,f,T,K,A,B,I,G]),V=t.length>0,X=l.useCallback(()=>{a&&a([])},[a]);return e.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[e.jsx(Nt,{addButtonIcon:e.jsx(Xe,{}),addButtonText:V?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${V&&"[&>button]:border-none"}`,fields:J,filters:t,keyboardShortcut:"f",popoverAlign:b||V?"start":"end",showSearchInput:!1,onActiveFieldChange:m,onChange:a||(()=>{}),...i}),V&&e.jsxs(ne,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:X,children:[e.jsx(Ze,{}),"Clear"]})]})}const Y=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],xe="__empty__",je="%2C";function Vt(t){const s=new URLSearchParams;return t.forEach(a=>{if(Y.includes(a.field)&&a.values.length>0){const i=a.values.map(n=>n===""?xe:String(n).replace(/,/g,je)).join(",");s.set(a.field,i)}}),s}const se=new Map;function Bt(t){return se.has(t)||se.set(t,`url-${t}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),se.get(t)}function zt(t){const s=[],a=new Set(Y);return t.forEach((i,n)=>{if(!a.has(n))return;const c=i.split(",").map(u=>u===xe?"":u.replace(new RegExp(je,"g"),","));if(c.length>0){const u=n==="audience"?"is any of":"is";s.push({id:Bt(n),field:n,operator:u,values:c})}}),s}function $t(t={}){const[s,a]=Re(),{onFiltersChange:i}=t,n=l.useRef(!1),c=l.useMemo(()=>zt(s),[s]);l.useEffect(()=>{!n.current&&i&&i(c)},[c,i]);const u=l.useCallback(m=>{n.current=!0;const b=typeof m=="function"?m(c):m,h=Vt(b),f=new URLSearchParams(s);Y.forEach(g=>{f.delete(g)}),h.forEach((g,C)=>{f.set(C,g)}),a(f,{replace:!0}),setTimeout(()=>{n.current=!1},0)},[c,s,a]),o=l.useCallback(()=>{n.current=!0;const m=new URLSearchParams(s);Y.forEach(b=>{m.delete(b)}),a(m,{replace:!0}),setTimeout(()=>{n.current=!1},0)},[s,a]);return{filters:c,setFilters:u,clearFilters:o}}const Es=()=>{const t=Ve(),{postId:s}=Be(),{statsConfig:a,isLoading:i,range:n,audience:c,data:u,post:o,isPostLoading:m}=$(),{filters:b,setFilters:h}=$t(),f=u?.labs?.utmTracking??!0,g=l.useMemo(()=>{if(!f)return c;const r=b.find(S=>S.field==="audience");return fe(r?.values)},[f,c,b]);l.useEffect(()=>{!m&&o?.email_only&&t(`/posts/analytics/${s}`)},[m,o?.email_only,t,s]);const C=l.useMemo(()=>{if(!o?.published_at)return ue.ALL_TIME.value;const r=ze(o.published_at);return n>r?r:n},[o?.published_at,n]),{startDate:D,endDate:M,timezone:N}=ce(C),v=l.useCallback(()=>{const r=document.querySelector(".overflow-y-scroll");r&&r.scrollTo({top:0,behavior:"smooth"})},[]),F=l.useMemo(()=>{const r={};return b.forEach(S=>{const L=S.field,E=S.values;if(L==="audience")return;const d=E&&E.length>0&&E[0]!==null&&E[0]!==void 0,z=L==="source"&&E?.[0]==="";if(d&&(E[0]!==""||z)){const Se=String(E[0]);r[L]=Se}}),r},[b]),y=l.useCallback((r,S)=>{h(L=>L.find(d=>d.field===r)?L.map(d=>d.field===r?{...d,values:[S]}:d):[...L,_t(r,"is",[S])]),v()},[h,v]),w=l.useCallback(r=>y("location",r),[y]),U=l.useCallback(r=>y("source",r),[y]),R=l.useMemo(()=>{const r={site_uuid:a?.id||"",date_from:Q(D),date_to:Q(M),timezone:N,member_status:be(g),post_uuid:"",...F};return!m&&o?.uuid?{...r,post_uuid:o.uuid}:r},[m,o,a?.id,D,M,N,g,F]),{data:T,loading:K}=W({endpoint:"api_kpis",statsConfig:a||{id:""},params:R}),{data:A,loading:B}=W({endpoint:"api_top_locations",statsConfig:a||{id:""},params:R}),{data:I,loading:G}=W({endpoint:"api_top_sources",statsConfig:a||{id:""},params:R}),x=l.useMemo(()=>A?.reduce((r,S)=>r+Number(S.visits),0)||0,[A]),J=l.useMemo(()=>I?I.reduce((r,S)=>r+Number(S.visits||0),0):0,[I]),V=u?.url,X=u?.icon,j=l.useMemo(()=>{const r=A?.map(d=>({location:String(d.location),visits:Number(d.visits),percentage:x>0?Number(d.visits)/x:0,isUnknown:me.includes(String(d.location))}))||[],S=r.filter(d=>!d.isUnknown),L=r.filter(d=>d.isUnknown),E=L.length>0?[{location:"Unknown",visits:L.reduce((d,z)=>d+z.visits,0),percentage:L.reduce((d,z)=>d+z.percentage,0)}]:[];return[...S,...E]},[A,x]),_=i||m||K||B||G,k=tt(T),O=b.length>0;return e.jsxs(e.Fragment,{children:[e.jsx(vt,{currentTab:"Web",children:f?e.jsxs(e.Fragment,{children:[O&&e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(ee,{className:`${O?"!mt-0 [grid-area:subactions] lg:!mt-[25px]":"[grid-area:actions]"}`,children:[e.jsx(Rt,{filters:b,utmTrackingEnabled:f,onChange:h}),!O&&e.jsx(te,{})]})]}):e.jsxs(ee,{children:[e.jsx(Tt,{}),e.jsx(te,{})]})}),e.jsx(Ct,{children:_?e.jsx(he,{className:"size-full",variant:"plain",children:e.jsx(ge,{className:"size-full items-center justify-center",children:e.jsx($e,{})})}):T&&T.length!==0&&k.visits!=="0"?e.jsxs(e.Fragment,{children:[e.jsx(st,{data:T,range:C}),e.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[e.jsx(kt,{data:j,isLoading:B,onLocationClick:f?w:void 0}),e.jsx(at,{data:I,range:C,siteIcon:X,siteUrl:V,totalVisitors:J,onSourceClick:f?U:void 0})]})]}):e.jsx("div",{className:"grow",children:e.jsx(Dt,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${nt(n)}`,children:e.jsx(ae,{strokeWidth:1.5})})})})]})};export{Es as default};
1
+ import{aR as le,j as e,aW as ve,ap as Ce,B as ne,b5 as Ne,aY as _e,b6 as Z,aP as Le,aO as Ee,bJ as Fe,bK as ye,bL as Pe,bM as De,bN as Te,bO as Ae,b$ as Ie,aj as ke,ai as Oe,r as l,c0 as Me,aQ as ae,bS as we,af as ce,ag as Q,c1 as Ue,bR as Re,aM as Ve,u as Be,aS as ze,aN as $e}from"./index-Dq_j8mTf.js";import{A as oe,a as p,u as $,S as ue,b as de,U as me}from"./post-analytics-context-DctS9fHu.js";import{S as Ke,a as Ge,b as We,c as He,d as Qe,e as Ye,f as qe}from"./select-CFBw9aAY.js";import{a as Je,F as Xe,b as Ze,c as et}from"./message-square-text-Cqodm1uC.js";import{g as tt,a as st,S as at,b as nt}from"./kpis-Czdhg1qV.js";import{F as ot,c as q,e as pe}from"./en-B8oRL8Ua.js";import{C as he,a as it,b as rt,h as lt,c as ge,i as ct,u as W,j as ee}from"./pagemenu-z-Nc5-Yy.js";import{D as ut,h as dt,i as ie,a as mt,b as pt,c as ht,d as gt,e as ft,f as bt,g as xt}from"./data-list-By9zN-Ma.js";import{a as jt,U as St}from"./wallet-cards-yxIjXIK2.js";import{P as vt,a as Ct}from"./post-analytics-header-C6tJIKtV.js";import{F as Nt,c as _t}from"./filters-C-v3cGt0.js";import{b as Lt,c as Et,d as Ft,S as yt,T as Pt}from"./lucide-react-B7CWr8XP.js";import{E as Dt}from"./empty-indicator-B7WXKrac.js";import"./posts-D0erEci0.js";import"./source-icon-KI6QTdIv.js";import"./source-utils-B1S3ZHA2.js";import"./gh-chart-B98YGgzG.js";import"./chart-BYGpVun6.js";import"./_baseAssignValue-qTINVNgk.js";import"./tabs-BTEs4Aby.js";import"./index-CLdEbHsV.js";import"./post-share-modal-CtQTpIsC.js";import"./post-helpers-gInwAwEv.js";import"./trash-DIVNO9rU.js";import"./sprout-C96gimQS.js";import"./a-large-small-D-nhKFBX.js";import"./at-sign-DHUgIxNb.js";import"./copy-CCj6xx5V.js";import"./hash-B4UtN3nq.js";import"./inbox-D336Mbic.js";import"./minus-K1Fj4qFh.js";import"./tags-CIEzegXe.js";import"./square-s6ZVKvbY.js";import"./user-round-check-pBOLjTqi.js";import"./repeat-BNamsVQr.js";import"./reply-DqXFv78k.js";const H=[{name:"Public visitors",value:"undefined",bit:p.PUBLIC},{name:"Free members",value:"free",bit:p.FREE},{name:"Paid members",value:"paid",bit:p.PAID}],fe=t=>!t||t.length===0?oe:H.filter(s=>t.includes(s.value)).reduce((s,a)=>s|a.bit,0)||oe,be=t=>{const s=[];return(t&p.PUBLIC)!==0&&s.push(H[0].value),(t&p.FREE)!==0&&s.push(H[1].value),(t&p.PAID)!==0&&s.push(H[2].value),s.join(",")},Tt=()=>{const{audience:t,setAudience:s}=$(),{appSettings:a}=le(),i=o=>{s(t^o)},n=o=>(t&o)!==0,c=(o,m)=>{o.preventDefault(),i(m)},u=()=>{const o=[];if(n(p.PUBLIC)&&o.push("Public visitors"),n(p.FREE)&&o.push("Free members"),!a?.paidMembersEnabled){if(o.length===2)return"All audiences";if(o.length===1)return n(p.FREE)?"Free members":"Public visitors";if(o.length===0)return"Select audience"}return n(p.PAID)&&o.push("Paid members"),o.length===0?"Select audience":o.length===3?"All audiences":n(p.FREE)&&n(p.PAID)&&!n(p.PUBLIC)?"Members-only":o.join(" & ")};return e.jsxs(ve,{children:[e.jsx(Ce,{asChild:!0,children:e.jsxs(ne,{variant:"dropdown",children:[e.jsx(Ne,{}),e.jsx("span",{className:"lowercase first-letter:capitalize",children:u()})]})}),e.jsxs(_e,{align:"end",className:"w-full min-w-48",children:[e.jsx(Z,{checked:n(p.PUBLIC),onSelect:o=>c(o,p.PUBLIC),children:"Public visitors"}),e.jsx(Z,{checked:n(p.FREE),onSelect:o=>c(o,p.FREE),children:"Free members"}),a?.paidMembersEnabled&&e.jsx(Z,{checked:n(p.PAID),onSelect:o=>c(o,p.PAID),children:"Paid members"})]})]})},te=()=>{const{range:t,setRange:s}=$();return e.jsxs(Ke,{value:`${t}`,onValueChange:a=>{s(Number(a))},children:[e.jsxs(Ge,{className:"w-auto",children:[e.jsx(Je,{className:"mr-2",size:16,strokeWidth:1.5}),e.jsx(We,{placeholder:"Select a period"})]}),e.jsx(He,{align:"end",children:e.jsxs(Qe,{children:[e.jsx(Ye,{children:"Period"}),Object.values(ue).map(a=>e.jsx(qe,{value:`${a.value}`,children:a.name},a.value))]})})]})};q.registerLocale(pe);const At=t=>de[t]||q.getName(t,"en")||"Unknown",It=t=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=t.toUpperCase();return s[a]||(t.length>2?t.substring(0,2):t)},re=({tableHeader:t,data:s,onLocationClick:a})=>e.jsxs(ut,{children:[t&&e.jsxs(dt,{children:[e.jsx(ie,{children:"Country"}),e.jsx(ie,{children:"Visitors"})]}),e.jsx(mt,{children:s.map(i=>{const n=At(`${i.location}`),c=a&&i.location!=="Unknown",u=i.location?i.location.toLowerCase():"unknown";return e.jsxs(pt,{className:c?"cursor-pointer":"","data-testid":`location-row-${u}`,onClick:c?()=>a(i.location):void 0,children:[e.jsx(ht,{style:{width:`${i.percentage?Math.round(i.percentage*100):0}%`}}),e.jsx(gt,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:e.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:n,children:[e.jsx(ot,{countryCode:`${It(i.location)}`,fallback:e.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:e.jsx(Ie.SkullAndBones,{className:"size-3"})})}),e.jsx("div",{className:"truncate font-medium",children:n})]})}),e.jsxs(ft,{children:[e.jsx(bt,{children:ke(Number(i.visits))}),e.jsx(xt,{children:Oe(i.percentage)})]})]},i.location||"unknown")})})]}),kt=({data:t,isLoading:s,onLocationClick:a})=>{const i=t.slice(0,10);return e.jsx(e.Fragment,{children:s?"":e.jsx(e.Fragment,{children:t&&t.length>0&&e.jsxs(he,{className:"group/datalist","data-testid":"locations-card",children:[e.jsxs("div",{className:"flex items-center justify-between p-6",children:[e.jsxs(it,{className:"p-0",children:[e.jsx(rt,{children:"Locations"}),e.jsx(lt,{children:"Where are the readers of this post"})]}),e.jsx(Le,{className:"mr-2",children:"Visitors"})]}),e.jsxs(ge,{className:"overflow-hidden",children:[e.jsx(Ee,{}),e.jsx(re,{data:i,tableHeader:!1,onLocationClick:a})]}),t.length>10&&e.jsx(ct,{children:e.jsxs(Fe,{children:[e.jsx(ye,{asChild:!0,children:e.jsxs(ne,{variant:"outline",children:["View all ",e.jsx(jt,{})]})}),e.jsxs(Pe,{className:"overflow-y-auto pt-0 sm:max-w-[600px]",children:[e.jsxs(De,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[e.jsx(Te,{children:"Top locations"}),e.jsx(Ae,{children:"Where are the readers of this post"})]}),e.jsx("div",{className:"group/datalist",children:e.jsx(re,{data:t,tableHeader:!0,onLocationClick:a})})]})]})})]})})})};q.registerLocale(pe);const Ot=t=>de[t]||q.getName(t,"en")||t,Mt=({visits:t})=>e.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:t.toLocaleString()}),wt={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:t=>({value:t||"(not set)",label:t||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:t=>({value:t||"",label:t||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(t){const s=String(t.location||"");return s!==""&&!me.includes(s)},transformValue:t=>({value:t,label:Ot(t)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:t=>({value:t,label:t==="mobile-ios"?"iOS":t==="mobile-android"?"Android":t==="desktop"?"Desktop":t==="bot"?"Bot":t})}},Ut=(t,s,a)=>{const i={...a};return t.forEach(n=>{if(n.field===s||n.values.length===0)return;const c=n.values[0];n.field!=="audience"&&(n.field==="source"||n.field==="device"||n.field==="location"||n.field.startsWith("utm_"))&&(i[n.field]=c)}),i},P=(t,s=[],a,i={})=>{const{enabled:n=!0}=i,{statsConfig:c,range:u}=$(),{startDate:o,endDate:m,timezone:b}=ce(u),h=wt[t],f=l.useMemo(()=>{const N=s.find(v=>v.field==="audience");return fe(N?.values)},[s]),g=l.useMemo(()=>{const N={site_uuid:c?.id||"",date_from:Q(o),date_to:Q(m),timezone:b,member_status:be(f),limit:"50"};return a&&(N.post_uuid=a),Ut(s,t,N)},[c?.id,o,m,b,f,s,t,a]),{data:C,loading:D}=W({endpoint:h?.endpoint||"",statsConfig:c,params:g,enabled:n&&!!h});return{options:l.useMemo(()=>h?(C||[]).filter(v=>h.filterItem?h.filterItem(v):!0).map(v=>{const F=String(v[h.valueKey]??""),y=Number(v.visits)||0,{value:w,label:U}=h.transformValue?h.transformValue(F):{value:F,label:F};return{label:U,value:w,icon:e.jsx(Mt,{visits:y})}}):[],[C,h]),loading:D}};function Rt({filters:t,utmTrackingEnabled:s=!1,onChange:a,...i}){const{appSettings:n}=le(),{post:c}=$(),u=c?.uuid,[o,m]=l.useState(null),[b,h]=l.useState(!1);l.useEffect(()=>{const j=window.matchMedia("(max-width: 1024px)"),_=k=>{h(k.matches)};return _(j),j.addEventListener("change",_),()=>j.removeEventListener("change",_)},[]);const f=l.useMemo(()=>{const j=[{value:"undefined",label:"Public visitors",icon:e.jsx(ae,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:e.jsx(we,{className:"text-green"})},{value:"paid",label:"Paid members",icon:e.jsx(St,{className:"text-orange"})}];return n?.paidMembersEnabled?j:j.filter(_=>_.value!=="paid")},[n?.paidMembersEnabled]),g=l.useCallback(j=>{const _=o===j,k=t.some(O=>O.field===j);return _||k},[o,t]),{options:C,loading:D}=P("utm_source",t,u,{enabled:g("utm_source")}),{options:M,loading:N}=P("utm_medium",t,u,{enabled:g("utm_medium")}),{options:v,loading:F}=P("utm_campaign",t,u,{enabled:g("utm_campaign")}),{options:y,loading:w}=P("utm_content",t,u,{enabled:g("utm_content")}),{options:U,loading:R}=P("utm_term",t,u,{enabled:g("utm_term")}),{options:T,loading:K}=P("source",t,u,{enabled:g("source")}),{options:A,loading:B}=P("device",t,u,{enabled:g("device")}),{options:I,loading:G}=P("location",t,u,{enabled:g("location")}),x=l.useMemo(()=>[{value:"is",label:"is"}],[]),J=l.useMemo(()=>{const j=s?[{key:"utm_source",label:"UTM Source",type:"select",icon:e.jsx(Ft,{className:"size-4"}),placeholder:"Select source",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:C,isLoading:D,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:e.jsx(yt,{className:"size-4"}),placeholder:"Select medium",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:M,isLoading:N,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:e.jsx(et,{className:"size-4"}),placeholder:"Select campaign",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:v,isLoading:F,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:e.jsx(Pt,{className:"size-4"}),placeholder:"Select content",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:y,isLoading:w,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:e.jsx(Ue,{className:"size-4"}),placeholder:"Select term",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:U,isLoading:R,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}]:[];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:e.jsx(Me,{}),options:f.map(({value:_,label:k,icon:O})=>({value:_,label:k,icon:O})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:e.jsx(ae,{className:"size-4"}),placeholder:"Select source",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:T,isLoading:K,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:e.jsx(Lt,{className:"size-4"}),placeholder:"Select device",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:A,isLoading:B,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:e.jsx(Et,{className:"size-4"}),placeholder:"Select location",operators:x,defaultOperator:"is",hideOperatorSelect:!0,options:I,isLoading:G,searchable:!0,selectedOptionsClassName:"hidden"}]},...s?[{group:"UTM parameters",fields:j}]:[]]},[s,C,D,M,N,v,F,y,w,U,R,x,f,T,K,A,B,I,G]),V=t.length>0,X=l.useCallback(()=>{a&&a([])},[a]);return e.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[e.jsx(Nt,{addButtonIcon:e.jsx(Xe,{}),addButtonText:V?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${V&&"[&>button]:border-none"}`,fields:J,filters:t,keyboardShortcut:"f",popoverAlign:b||V?"start":"end",showSearchInput:!1,onActiveFieldChange:m,onChange:a||(()=>{}),...i}),V&&e.jsxs(ne,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:X,children:[e.jsx(Ze,{}),"Clear"]})]})}const Y=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],xe="__empty__",je="%2C";function Vt(t){const s=new URLSearchParams;return t.forEach(a=>{if(Y.includes(a.field)&&a.values.length>0){const i=a.values.map(n=>n===""?xe:String(n).replace(/,/g,je)).join(",");s.set(a.field,i)}}),s}const se=new Map;function Bt(t){return se.has(t)||se.set(t,`url-${t}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),se.get(t)}function zt(t){const s=[],a=new Set(Y);return t.forEach((i,n)=>{if(!a.has(n))return;const c=i.split(",").map(u=>u===xe?"":u.replace(new RegExp(je,"g"),","));if(c.length>0){const u=n==="audience"?"is any of":"is";s.push({id:Bt(n),field:n,operator:u,values:c})}}),s}function $t(t={}){const[s,a]=Re(),{onFiltersChange:i}=t,n=l.useRef(!1),c=l.useMemo(()=>zt(s),[s]);l.useEffect(()=>{!n.current&&i&&i(c)},[c,i]);const u=l.useCallback(m=>{n.current=!0;const b=typeof m=="function"?m(c):m,h=Vt(b),f=new URLSearchParams(s);Y.forEach(g=>{f.delete(g)}),h.forEach((g,C)=>{f.set(C,g)}),a(f,{replace:!0}),setTimeout(()=>{n.current=!1},0)},[c,s,a]),o=l.useCallback(()=>{n.current=!0;const m=new URLSearchParams(s);Y.forEach(b=>{m.delete(b)}),a(m,{replace:!0}),setTimeout(()=>{n.current=!1},0)},[s,a]);return{filters:c,setFilters:u,clearFilters:o}}const Es=()=>{const t=Ve(),{postId:s}=Be(),{statsConfig:a,isLoading:i,range:n,audience:c,data:u,post:o,isPostLoading:m}=$(),{filters:b,setFilters:h}=$t(),f=u?.labs?.utmTracking??!0,g=l.useMemo(()=>{if(!f)return c;const r=b.find(S=>S.field==="audience");return fe(r?.values)},[f,c,b]);l.useEffect(()=>{!m&&o?.email_only&&t(`/posts/analytics/${s}`)},[m,o?.email_only,t,s]);const C=l.useMemo(()=>{if(!o?.published_at)return ue.ALL_TIME.value;const r=ze(o.published_at);return n>r?r:n},[o?.published_at,n]),{startDate:D,endDate:M,timezone:N}=ce(C),v=l.useCallback(()=>{const r=document.querySelector(".overflow-y-scroll");r&&r.scrollTo({top:0,behavior:"smooth"})},[]),F=l.useMemo(()=>{const r={};return b.forEach(S=>{const L=S.field,E=S.values;if(L==="audience")return;const d=E&&E.length>0&&E[0]!==null&&E[0]!==void 0,z=L==="source"&&E?.[0]==="";if(d&&(E[0]!==""||z)){const Se=String(E[0]);r[L]=Se}}),r},[b]),y=l.useCallback((r,S)=>{h(L=>L.find(d=>d.field===r)?L.map(d=>d.field===r?{...d,values:[S]}:d):[...L,_t(r,"is",[S])]),v()},[h,v]),w=l.useCallback(r=>y("location",r),[y]),U=l.useCallback(r=>y("source",r),[y]),R=l.useMemo(()=>{const r={site_uuid:a?.id||"",date_from:Q(D),date_to:Q(M),timezone:N,member_status:be(g),post_uuid:"",...F};return!m&&o?.uuid?{...r,post_uuid:o.uuid}:r},[m,o,a?.id,D,M,N,g,F]),{data:T,loading:K}=W({endpoint:"api_kpis",statsConfig:a||{id:""},params:R}),{data:A,loading:B}=W({endpoint:"api_top_locations",statsConfig:a||{id:""},params:R}),{data:I,loading:G}=W({endpoint:"api_top_sources",statsConfig:a||{id:""},params:R}),x=l.useMemo(()=>A?.reduce((r,S)=>r+Number(S.visits),0)||0,[A]),J=l.useMemo(()=>I?I.reduce((r,S)=>r+Number(S.visits||0),0):0,[I]),V=u?.url,X=u?.icon,j=l.useMemo(()=>{const r=A?.map(d=>({location:String(d.location),visits:Number(d.visits),percentage:x>0?Number(d.visits)/x:0,isUnknown:me.includes(String(d.location))}))||[],S=r.filter(d=>!d.isUnknown),L=r.filter(d=>d.isUnknown),E=L.length>0?[{location:"Unknown",visits:L.reduce((d,z)=>d+z.visits,0),percentage:L.reduce((d,z)=>d+z.percentage,0)}]:[];return[...S,...E]},[A,x]),_=i||m||K||B||G,k=tt(T),O=b.length>0;return e.jsxs(e.Fragment,{children:[e.jsx(vt,{currentTab:"Web",children:f?e.jsxs(e.Fragment,{children:[O&&e.jsx(ee,{children:e.jsx(te,{})}),e.jsxs(ee,{className:`${O?"!mt-0 [grid-area:subactions] lg:!mt-[25px]":"[grid-area:actions]"}`,children:[e.jsx(Rt,{filters:b,utmTrackingEnabled:f,onChange:h}),!O&&e.jsx(te,{})]})]}):e.jsxs(ee,{children:[e.jsx(Tt,{}),e.jsx(te,{})]})}),e.jsx(Ct,{children:_?e.jsx(he,{className:"size-full",variant:"plain",children:e.jsx(ge,{className:"size-full items-center justify-center",children:e.jsx($e,{})})}):T&&T.length!==0&&k.visits!=="0"?e.jsxs(e.Fragment,{children:[e.jsx(st,{data:T,range:C}),e.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[e.jsx(kt,{data:j,isLoading:B,onLocationClick:f?w:void 0}),e.jsx(at,{data:I,range:C,siteIcon:X,siteUrl:V,totalVisitors:J,onSourceClick:f?U:void 0})]})]}):e.jsx("div",{className:"grow",children:e.jsx(Dt,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${nt(n)}`,children:e.jsx(ae,{strokeWidth:1.5})})})})]})};export{Es as default};
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <link rel="stylesheet" href="/ghost/assets/vendor-0ede59da8efb5e28fa929557f7ff7154.css">
5
5
  <link rel="stylesheet" href="/ghost/assets/ghost-6d6ad79b0c1d0cc8cfab210b2a210a73.css">
6
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.13%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%2272bf569b01%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%2271de20d4b9%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%2223cfe9f6a7%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22fac762c99c%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
6
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.13%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%220498d48b89%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22349cd43ce1%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%2271de20d4b9%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%2223cfe9f6a7%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22fac762c99c%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
7
7
 
8
8
  <meta charset="UTF-8" />
9
9
 
@@ -17,8 +17,8 @@
17
17
  <meta name="apple-mobile-web-app-title" content="Ghost" />
18
18
  <meta name="apple-mobile-web-app-capable" content="yes" />
19
19
  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
20
- <script type="module" crossorigin src="/ghost/assets/index-X_uC_0DD.js"></script>
21
- <link rel="stylesheet" crossorigin href="/ghost/assets/index-6_RXbq08.css">
20
+ <script type="module" crossorigin src="/ghost/assets/index-Dq_j8mTf.js"></script>
21
+ <link rel="stylesheet" crossorigin href="/ghost/assets/index-DbjfIcZe.css">
22
22
  </head>
23
23
  <body class="react-admin">
24
24
  <div id="ember-alerts-wormhole"></div>
@@ -37,8 +37,8 @@
37
37
  <div id="ember-modal-wormhole"></div>
38
38
  <div id="ember-liquid-wormhole"></div>
39
39
  <script src="/ghost/assets/vendor-5d0617fe9c4d9e94211f5ffdfde620aa.js"></script>
40
- <script src="/ghost/assets/chunk.397.a720333cfffc99c47e71.js"></script>
41
- <script src="/ghost/assets/chunk.524.6168e2262e63b155f63e.js"></script>
40
+ <script src="/ghost/assets/chunk.397.71f16fce8de382622bb4.js"></script>
41
+ <script src="/ghost/assets/chunk.524.ccb5a082c09fdedaf1d0.js"></script>
42
42
  <script src="/ghost/assets/ghost-76f06be97ddf46462a01eab50a612972.js"></script>
43
43
  </body>
44
44
  </html>
@@ -6,7 +6,7 @@
6
6
  <title>Ghost</title>
7
7
 
8
8
 
9
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.13%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%2272bf569b01%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%2271de20d4b9%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%2223cfe9f6a7%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22fac762c99c%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D" />
9
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.13%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%220498d48b89%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22349cd43ce1%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%2271de20d4b9%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%2223cfe9f6a7%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22fac762c99c%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D" />
10
10
 
11
11
  <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1, minimal-ui, viewport-fit=cover" />
12
12
  <meta name="pinterest" content="nopin" />
@@ -48,8 +48,8 @@
48
48
  <div id="ember-basic-dropdown-wormhole"></div>
49
49
 
50
50
  <script src="assets/vendor-5d0617fe9c4d9e94211f5ffdfde620aa.js"></script>
51
- <script src="assets/chunk.397.a720333cfffc99c47e71.js"></script>
52
- <script src="assets/chunk.524.6168e2262e63b155f63e.js"></script>
51
+ <script src="assets/chunk.397.71f16fce8de382622bb4.js"></script>
52
+ <script src="assets/chunk.524.ccb5a082c09fdedaf1d0.js"></script>
53
53
  <script src="assets/ghost-76f06be97ddf46462a01eab50a612972.js"></script>
54
54
  </body>
55
55
  </html>
@@ -14,29 +14,8 @@ const MESSAGES = {
14
14
  memberWelcomeEmailInactive: memberStatus => `Member welcome email for "${memberStatus}" members is inactive`
15
15
  };
16
16
 
17
- // Default welcome email content in Lexical JSON format
18
- // Uses __GHOST_URL__ placeholder which Ghost replaces with the actual site URL
19
- // These match the defaults used in the admin UI (apps/admin-x-settings/src/components/settings/membership/member-emails.tsx)
20
- const DEFAULT_FREE_LEXICAL_CONTENT = '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Welcome! Thanks for subscribing — it\'s great to have you here.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"You\'ll now receive new posts straight to your inbox. You can also log in any time to read the ","type":"extended-text","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"full archive","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"link","version":1,"rel":"noreferrer","target":null,"title":null,"url":"__GHOST_URL__/"},{"detail":0,"format":0,"mode":"normal","style":"","text":" or catch up on new posts as they go live.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"A little housekeeping: If this email landed in spam or promotions, try moving it to your primary inbox and adding this address to your contacts. Small signals like that help your inbox recognize that these messages matter to you.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Have questions or just want to say hi? Feel free to reply directly to this email or any newsletter in the future.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}';
21
-
22
- const DEFAULT_PAID_LEXICAL_CONTENT = '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Welcome, and thank you for your support — it means a lot.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"As a paid member, you now have full access to everything: the complete archive, and any paid-only content going forward. New posts will land straight to your inbox, and you can log in any time to ","type":"extended-text","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"catch up","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"link","version":1,"rel":"noreferrer","target":null,"title":null,"url":"__GHOST_URL__/"},{"detail":0,"format":0,"mode":"normal","style":"","text":" on anything you\'ve missed.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"A little housekeeping: If this email landed in spam or promotions, try moving it to your primary inbox and adding this address to your contacts. Small signals like that help your inbox recognize that these messages matter to you.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Have questions or just want to say hi? Feel free to reply directly to this email or any newsletter in the future.","type":"extended-text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}';
23
-
24
- const DEFAULT_WELCOME_EMAILS = {
25
- free: {
26
- lexical: DEFAULT_FREE_LEXICAL_CONTENT,
27
- subject: 'Welcome to {site_title}',
28
- status: 'active'
29
- },
30
- paid: {
31
- lexical: DEFAULT_PAID_LEXICAL_CONTENT,
32
- subject: 'Welcome to your paid subscription',
33
- status: 'active'
34
- }
35
- };
36
-
37
17
  module.exports = {
38
18
  MEMBER_WELCOME_EMAIL_LOG_KEY,
39
19
  MEMBER_WELCOME_EMAIL_SLUGS,
40
- MESSAGES,
41
- DEFAULT_WELCOME_EMAILS
20
+ MESSAGES
42
21
  };
@@ -8,7 +8,7 @@ const mail = require('../mail');
8
8
  // @ts-expect-error type checker has trouble with the dynamic exporting in models
9
9
  const {AutomatedEmail} = require('../../models');
10
10
  const MemberWelcomeEmailRenderer = require('./member-welcome-email-renderer');
11
- const {MEMBER_WELCOME_EMAIL_LOG_KEY, MEMBER_WELCOME_EMAIL_SLUGS, MESSAGES, DEFAULT_WELCOME_EMAILS} = require('./constants');
11
+ const {MEMBER_WELCOME_EMAIL_LOG_KEY, MEMBER_WELCOME_EMAIL_SLUGS, MESSAGES} = require('./constants');
12
12
 
13
13
  class MemberWelcomeEmailService {
14
14
  #mailer;
@@ -30,32 +30,14 @@ class MemberWelcomeEmailService {
30
30
  }
31
31
 
32
32
  async loadMemberWelcomeEmails() {
33
- const useDefaults = Boolean(config.get('memberWelcomeEmailTestInbox'));
34
-
35
33
  for (const [memberStatus, slug] of Object.entries(MEMBER_WELCOME_EMAIL_SLUGS)) {
36
34
  const row = await AutomatedEmail.findOne({slug});
37
35
 
38
- if (!row) {
39
- // No row - use default template when test inbox is configured
40
- if (useDefaults) {
41
- const defaultEmail = DEFAULT_WELCOME_EMAILS[memberStatus];
42
- this.#memberWelcomeEmails[memberStatus] = {
43
- ...defaultEmail,
44
- lexical: urlUtils.transformReadyToAbsolute(defaultEmail.lexical)
45
- };
46
- } else {
47
- this.#memberWelcomeEmails[memberStatus] = null;
48
- }
49
- continue;
50
- }
51
-
52
- // Row exists - check if it has content
53
- if (!row.get('lexical')) {
36
+ if (!row || !row.get('lexical')) {
54
37
  this.#memberWelcomeEmails[memberStatus] = null;
55
38
  continue;
56
39
  }
57
40
 
58
- // Use DB template (status check happens in send())
59
41
  this.#memberWelcomeEmails[memberStatus] = {
60
42
  lexical: row.get('lexical'),
61
43
  subject: row.get('subject'),
@@ -348,8 +348,6 @@ module.exports = class MemberRepository {
348
348
  const freeWelcomeEmail = this._AutomatedEmail ? await this._AutomatedEmail.findOne({slug: MEMBER_WELCOME_EMAIL_SLUGS.free}) : null;
349
349
  const isFreeWelcomeEmailActive = freeWelcomeEmail && freeWelcomeEmail.get('lexical') && freeWelcomeEmail.get('status') === 'active';
350
350
  const isFreeSignup = !stripeCustomer;
351
- // Use default template only when no DB row exists (not when inactive - respect explicit user choice)
352
- const useDefaultFreeTemplate = !freeWelcomeEmail && hasTestInbox;
353
351
 
354
352
  const runMemberCreation = async (transacting) => {
355
353
  const newMember = await this._Member.add({
@@ -358,10 +356,10 @@ module.exports = class MemberRepository {
358
356
  labels
359
357
  }, {...memberAddOptions, transacting});
360
358
 
361
- // Send the free welcome email if:
362
- // 1. The free welcome email is active OR no DB row exists and test inbox is configured (uses default template)
359
+ // Only send the free welcome email if:
360
+ // 1. The free welcome email is active
363
361
  // 2. The member is not signing up for a paid subscription (no stripeCustomer)
364
- if ((isFreeWelcomeEmailActive || useDefaultFreeTemplate) && isFreeSignup) {
362
+ if (isFreeWelcomeEmailActive && isFreeSignup) {
365
363
  const timestamp = eventData.created_at || newMember.get('created_at');
366
364
 
367
365
  await this._Outbox.add({
@@ -387,7 +385,7 @@ module.exports = class MemberRepository {
387
385
  member = await this._Member.transaction(runMemberCreation);
388
386
  }
389
387
 
390
- if ((isFreeWelcomeEmailActive || useDefaultFreeTemplate) && isFreeSignup) {
388
+ if (isFreeWelcomeEmailActive && isFreeSignup) {
391
389
  this.dispatchEvent(StartOutboxProcessingEvent.create({memberId: member.id}), memberAddOptions);
392
390
  }
393
391
  } else {
@@ -1441,17 +1439,14 @@ module.exports = class MemberRepository {
1441
1439
  const source = this._resolveContextSource(context);
1442
1440
  const shouldSendPaidWelcomeEmail = config.get('memberWelcomeEmailTestInbox') && WELCOME_EMAIL_SOURCES.includes(source);
1443
1441
  let isPaidWelcomeEmailActive = false;
1444
- let paidWelcomeEmail = null;
1445
1442
  if (shouldSendPaidWelcomeEmail && this._AutomatedEmail) {
1446
- paidWelcomeEmail = await this._AutomatedEmail.findOne({slug: MEMBER_WELCOME_EMAIL_SLUGS.paid}, options);
1443
+ const paidWelcomeEmail = await this._AutomatedEmail.findOne({slug: MEMBER_WELCOME_EMAIL_SLUGS.paid}, options);
1447
1444
  isPaidWelcomeEmailActive = paidWelcomeEmail && paidWelcomeEmail.get('lexical') && paidWelcomeEmail.get('status') === 'active';
1448
1445
  }
1449
- // Use default template only when no DB row exists (not when inactive - respect explicit user choice)
1450
- const useDefaultPaidTemplate = !paidWelcomeEmail && shouldSendPaidWelcomeEmail;
1451
1446
  // Send paid welcome email if:
1452
- // 1. The paid welcome email is active OR no DB row exists and test inbox is configured (uses default template)
1447
+ // 1. The paid welcome email is active
1453
1448
  // 2. The member status changed to 'paid'
1454
- if (updatedMember.get('status') === 'paid' && (isPaidWelcomeEmailActive || useDefaultPaidTemplate)) {
1449
+ if (updatedMember.get('status') === 'paid' && isPaidWelcomeEmailActive) {
1455
1450
  await this._Outbox.add({
1456
1451
  id: ObjectId().toHexString(),
1457
1452
  event_type: MemberCreatedEvent.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "6.13.1",
3
+ "version": "6.13.2",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -83,20 +83,20 @@
83
83
  "@tryghost/helpers": "1.1.97",
84
84
  "@tryghost/html-to-plaintext": "1.0.4",
85
85
  "@tryghost/http-cache-utils": "0.1.20",
86
- "@tryghost/i18n": "file:components/tryghost-i18n-6.13.1.tgz",
86
+ "@tryghost/i18n": "file:components/tryghost-i18n-6.13.2.tgz",
87
87
  "@tryghost/image-transform": "1.4.6",
88
88
  "@tryghost/job-manager": "1.0.3",
89
- "@tryghost/kg-card-factory": "5.1.2",
89
+ "@tryghost/kg-card-factory": "5.1.6",
90
90
  "@tryghost/kg-clean-basic-html": "4.2.7",
91
- "@tryghost/kg-converters": "1.1.7",
91
+ "@tryghost/kg-converters": "1.1.11",
92
92
  "@tryghost/kg-default-atoms": "5.1.1",
93
- "@tryghost/kg-default-cards": "10.2.2",
94
- "@tryghost/kg-default-nodes": "2.0.1",
95
- "@tryghost/kg-default-transforms": "1.2.24",
96
- "@tryghost/kg-html-to-lexical": "1.2.24",
97
- "@tryghost/kg-lexical-html-renderer": "1.3.24",
98
- "@tryghost/kg-markdown-html-renderer": "7.1.3",
99
- "@tryghost/kg-mobiledoc-html-renderer": "7.1.3",
93
+ "@tryghost/kg-default-cards": "10.2.3",
94
+ "@tryghost/kg-default-nodes": "2.0.5",
95
+ "@tryghost/kg-default-transforms": "1.2.28",
96
+ "@tryghost/kg-html-to-lexical": "1.2.28",
97
+ "@tryghost/kg-lexical-html-renderer": "1.3.28",
98
+ "@tryghost/kg-markdown-html-renderer": "7.1.7",
99
+ "@tryghost/kg-mobiledoc-html-renderer": "7.1.7",
100
100
  "@tryghost/limit-service": "1.4.1",
101
101
  "@tryghost/logging": "2.5.0",
102
102
  "@tryghost/members-csv": "2.0.3",
@@ -217,7 +217,7 @@
217
217
  "xml": "1.0.1"
218
218
  },
219
219
  "optionalDependencies": {
220
- "@tryghost/html-to-mobiledoc": "3.2.8",
220
+ "@tryghost/html-to-mobiledoc": "3.2.12",
221
221
  "sqlite3": "5.1.7"
222
222
  },
223
223
  "devDependencies": {
@@ -270,7 +270,7 @@
270
270
  "jackspeak": "2.3.6",
271
271
  "moment": "2.24.0",
272
272
  "moment-timezone": "0.5.45",
273
- "@tryghost/i18n": "file:components/tryghost-i18n-6.13.1.tgz"
273
+ "@tryghost/i18n": "file:components/tryghost-i18n-6.13.2.tgz"
274
274
  },
275
275
  "nx": {
276
276
  "targets": {