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.
- package/components/tryghost-i18n-6.13.2.tgz +0 -0
- package/core/built/admin/assets/{_baseAssignValue-CPzElAl9.js → _baseAssignValue-qTINVNgk.js} +1 -1
- package/core/built/admin/assets/{a-large-small-2Oh9oqBr.js → a-large-small-D-nhKFBX.js} +1 -1
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +2 -2
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-B5QudVu-.mjs → code-editor-view-CXaEQbfL.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-D3C8sdqQ.mjs → index-BrqKezEN.mjs} +30 -24
- package/core/built/admin/assets/admin-x-settings/{index-B66mLTSp.mjs → index-CwXvgyDY.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-CdWUpaGD.mjs → index-Dc7foGQ2.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{modals-lYrPGC_E.mjs → modals-Ba1hMizc.mjs} +2 -2
- package/core/built/admin/assets/{at-sign-BtKGpnjs.js → at-sign-DHUgIxNb.js} +1 -1
- package/core/built/admin/assets/{audience-select-DuSCQEyi.js → audience-select-C17Kh6Hl.js} +1 -1
- package/core/built/admin/assets/{avatar-flipboard-CcvOD0pV.js → avatar-flipboard-Cdj8uoBX.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-Frg4QWOQ.js → bluesky-sharing-DYSv4ewp.js} +1 -1
- package/core/built/admin/assets/{chart-tL51cfF9.js → chart-BYGpVun6.js} +1 -1
- package/core/built/admin/assets/{chunk.397.a720333cfffc99c47e71.js → chunk.397.71f16fce8de382622bb4.js} +2 -2
- package/core/built/admin/assets/{chunk.524.6168e2262e63b155f63e.js → chunk.524.ccb5a082c09fdedaf1d0.js} +6 -6
- package/core/built/admin/assets/{chunk.582.45f8c5479d11e969ddc2.js → chunk.582.311f93280422738b8a5d.js} +7 -7
- package/core/built/admin/assets/{code-editor-view-BHiySSgi.js → code-editor-view-BnOaGsRA.js} +1 -1
- package/core/built/admin/assets/{comments-svHZXAlu.js → comments-DiZAz2yU.js} +1 -1
- package/core/built/admin/assets/{copy-B8yuX-e4.js → copy-CCj6xx5V.js} +1 -1
- package/core/built/admin/assets/{data-list-C_WXxmo3.js → data-list-By9zN-Ma.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-OXPcC4Z2.js → deleted-feed-item-Dl0oQ0DH.js} +1 -1
- package/core/built/admin/assets/{edit-profile-DgMLvoyu.js → edit-profile-DZhjWF_f.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-DOQCKEXD.js → empty-indicator-B7WXKrac.js} +1 -1
- package/core/built/admin/assets/{en-Z93BzXte.js → en-B8oRL8Ua.js} +1 -1
- package/core/built/admin/assets/{feed-BKXpQU0e.js → feed-DU5QhfRX.js} +1 -1
- package/core/built/admin/assets/{filters-dwDByCkK.js → filters-C-v3cGt0.js} +1 -1
- package/core/built/admin/assets/{gh-chart-CaA6rQiP.js → gh-chart-B98YGgzG.js} +1 -1
- package/core/built/admin/assets/{growth-DKtJYCNb.js → growth-_giTyVF8.js} +1 -1
- package/core/built/admin/assets/{hash-ZzZYv2ek.js → hash-B4UtN3nq.js} +1 -1
- package/core/built/admin/assets/{inbox-C5KDymI8.js → inbox-D336Mbic.js} +1 -1
- package/core/built/admin/assets/{index-VdGL6HfS.js → index-B3CWs1Pb.js} +1 -1
- package/core/built/admin/assets/{index-CM3YmTO5.js → index-Bl3YnEiK.js} +1 -1
- package/core/built/admin/assets/{index-OPvny56_.js → index-BuFp5nYK.js} +1 -1
- package/core/built/admin/assets/{index-BX3p0DcO.js → index-C9PDrFEW.js} +1 -1
- package/core/built/admin/assets/{index-DethZCE1.js → index-CEEPij-w.js} +1 -1
- package/core/built/admin/assets/{index-BNkw6KwF.js → index-CLdEbHsV.js} +1 -1
- package/core/built/admin/assets/{index-CQVI9TPr.js → index-CdIdIOil.js} +1 -1
- package/core/built/admin/assets/{index-B6mBuUxr.js → index-DI4OotZO.js} +1 -1
- package/core/built/admin/assets/{index-BniBHF2r.js → index-DXuLaG0T.js} +1 -1
- package/core/built/admin/assets/{index-6_RXbq08.css → index-DbjfIcZe.css} +1 -1
- package/core/built/admin/assets/{index-X_uC_0DD.js → index-Dq_j8mTf.js} +3 -3
- package/core/built/admin/assets/{index-DOORRiFo.js → index-cWfIWdIX.js} +1 -1
- package/core/built/admin/assets/{index-CF6UHTsD.js → index-iHz8ZTSi.js} +1 -1
- package/core/built/admin/assets/{index-D9gfkxEz.js → index-k2aVq6ms.js} +1 -1
- package/core/built/admin/assets/{index-syvYkr47.js → index-w7Tz4ytz.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/index.css +2 -2
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +21800 -23540
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +177 -177
- package/core/built/admin/assets/{koenig-lexical-D4CBYCN7.js → koenig-lexical-5o67f7C9.js} +155 -155
- package/core/built/admin/assets/{kpi-card-DOIcNxgg.js → kpi-card-XLCPc_4J.js} +1 -1
- package/core/built/admin/assets/{kpis-BrSBq5c9.js → kpis-Czdhg1qV.js} +1 -1
- package/core/built/admin/assets/{links-DkVK8XO7.js → links-CY3nuFg7.js} +1 -1
- package/core/built/admin/assets/{lucide-react-DNj9Mt50.js → lucide-react-B7CWr8XP.js} +1 -1
- package/core/built/admin/assets/{main-layout-A6BaeVIm.js → main-layout-CmX429hf.js} +1 -1
- package/core/built/admin/assets/{message-square-text-DJWDCab0.js → message-square-text-Cqodm1uC.js} +1 -1
- package/core/built/admin/assets/{minus-B7zQY2p1.js → minus-K1Fj4qFh.js} +1 -1
- package/core/built/admin/assets/{modals-DJQDv_48.js → modals-C0x0SG_a.js} +1 -1
- package/core/built/admin/assets/{moderation-DikYZSIC.js → moderation-DqX2eQNM.js} +1 -1
- package/core/built/admin/assets/{newsletter-ok4p5aPZ.js → newsletter-BaZVL4Rg.js} +1 -1
- package/core/built/admin/assets/{newsletters-ClUaZMbc.js → newsletters-DpmHk1Kf.js} +1 -1
- package/core/built/admin/assets/{note-C445n_od.js → note-Bqr3ECo6.js} +1 -1
- package/core/built/admin/assets/{overview-vPttXZEx.js → overview-CGTvSQfN.js} +1 -1
- package/core/built/admin/assets/{pagemenu-CUEgz3GC.js → pagemenu-z-Nc5-Yy.js} +1 -1
- package/core/built/admin/assets/{post-analytics-DPIgO2YG.js → post-analytics-DCAOPWEx.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-DGNsxT8V.js → post-analytics-context-DctS9fHu.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-B1f7HAy_.js → post-analytics-header-C6tJIKtV.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-BIddzWjJ.js → post-share-modal-CtQTpIsC.js} +1 -1
- package/core/built/admin/assets/{posts-DOThg8yh.js → posts-D0erEci0.js} +1 -1
- package/core/built/admin/assets/{referrers-BK-mXdat.js → referrers-D4s1ncIT.js} +1 -1
- package/core/built/admin/assets/{repeat-CQvZJI02.js → repeat-BNamsVQr.js} +1 -1
- package/core/built/admin/assets/{reply-BET0l7FZ.js → reply-DqXFv78k.js} +1 -1
- package/core/built/admin/assets/{select-BH3t_tDB.js → select-CFBw9aAY.js} +1 -1
- package/core/built/admin/assets/{settings-CpkvyD93.js → settings-B_8Oslb0.js} +5 -5
- package/core/built/admin/assets/{settings-OIq7tQiJ.js → settings-BnZOyHrT.js} +1 -1
- package/core/built/admin/assets/{sort-button-DkfQ-8QJ.js → sort-button-K1rs2zWp.js} +1 -1
- package/core/built/admin/assets/{source-icon-DOOAvJR8.js → source-icon-KI6QTdIv.js} +1 -1
- package/core/built/admin/assets/{sprout-gjsBxaCU.js → sprout-C96gimQS.js} +1 -1
- package/core/built/admin/assets/{square-DsGufPa-.js → square-s6ZVKvbY.js} +1 -1
- package/core/built/admin/assets/{stats-Cu49FJzo.js → stats-C8Qt0L-1.js} +1 -1
- package/core/built/admin/assets/{stats-view-DUoDKh7r.js → stats-view-0eaQf_pM.js} +1 -1
- package/core/built/admin/assets/{step-1-QOnWlIzD.js → step-1-Gnp7iGGY.js} +1 -1
- package/core/built/admin/assets/{step-2-CDFj1bR5.js → step-2-DFbY2-K1.js} +1 -1
- package/core/built/admin/assets/{step-3-Cjmt9ecL.js → step-3-CoA_-aRF.js} +1 -1
- package/core/built/admin/assets/{table-PBYP6iVu.js → table-DpY57zP6.js} +1 -1
- package/core/built/admin/assets/{tabs--ia9i-R8.js → tabs-BTEs4Aby.js} +1 -1
- package/core/built/admin/assets/{tags-DwsoamaL.js → tags-CIEzegXe.js} +1 -1
- package/core/built/admin/assets/{tags-DK91bj9-.js → tags-DUcQDnmf.js} +1 -1
- package/core/built/admin/assets/{toggle-group-my6OlgUp.js → toggle-group-qaH0bKBM.js} +1 -1
- package/core/built/admin/assets/{topic-filter-Cdat1Ona.js → topic-filter-BmvO9gja.js} +1 -1
- package/core/built/admin/assets/{trash-C2kuVkXA.js → trash-DIVNO9rU.js} +1 -1
- package/core/built/admin/assets/{url-helpers-BuFo9dQz.js → url-helpers-Cn69VioM.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-DY2E0ltn.js → use-growth-stats-DPN4F7Mt.js} +1 -1
- package/core/built/admin/assets/{use-infinite-virtual-scroll-CS20HV8J.js → use-infinite-virtual-scroll-D5U6oSIq.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-kb9H2Ssw.js → use-simple-pagination-_Ui1WbsL.js} +1 -1
- package/core/built/admin/assets/{user-round-check-Biw6QBQA.js → user-round-check-pBOLjTqi.js} +1 -1
- package/core/built/admin/assets/{wallet-cards-aM5Ct3OB.js → wallet-cards-yxIjXIK2.js} +1 -1
- package/core/built/admin/assets/{web-DiBDLMW8.js → web-CtBMATfv.js} +1 -1
- package/core/built/admin/index-forward.html +5 -5
- package/core/built/admin/index.html +3 -3
- package/core/server/services/member-welcome-emails/constants.js +1 -22
- package/core/server/services/member-welcome-emails/service.js +2 -20
- package/core/server/services/members/members-api/repositories/member-repository.js +7 -12
- package/package.json +13 -13
- package/yarn.lock +72 -89
- package/components/tryghost-i18n-6.13.1.tgz +0 -0
- /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%
|
|
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-
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/ghost/assets/index-
|
|
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.
|
|
41
|
-
<script src="/ghost/assets/chunk.524.
|
|
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%
|
|
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.
|
|
52
|
-
<script src="assets/chunk.524.
|
|
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
|
|
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
|
-
//
|
|
362
|
-
// 1. The free welcome email is active
|
|
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 (
|
|
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 (
|
|
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
|
|
1447
|
+
// 1. The paid welcome email is active
|
|
1453
1448
|
// 2. The member status changed to 'paid'
|
|
1454
|
-
if (updatedMember.get('status') === 'paid' &&
|
|
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.
|
|
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.
|
|
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.
|
|
89
|
+
"@tryghost/kg-card-factory": "5.1.6",
|
|
90
90
|
"@tryghost/kg-clean-basic-html": "4.2.7",
|
|
91
|
-
"@tryghost/kg-converters": "1.1.
|
|
91
|
+
"@tryghost/kg-converters": "1.1.11",
|
|
92
92
|
"@tryghost/kg-default-atoms": "5.1.1",
|
|
93
|
-
"@tryghost/kg-default-cards": "10.2.
|
|
94
|
-
"@tryghost/kg-default-nodes": "2.0.
|
|
95
|
-
"@tryghost/kg-default-transforms": "1.2.
|
|
96
|
-
"@tryghost/kg-html-to-lexical": "1.2.
|
|
97
|
-
"@tryghost/kg-lexical-html-renderer": "1.3.
|
|
98
|
-
"@tryghost/kg-markdown-html-renderer": "7.1.
|
|
99
|
-
"@tryghost/kg-mobiledoc-html-renderer": "7.1.
|
|
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.
|
|
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.
|
|
273
|
+
"@tryghost/i18n": "file:components/tryghost-i18n-6.13.2.tgz"
|
|
274
274
|
},
|
|
275
275
|
"nx": {
|
|
276
276
|
"targets": {
|