ghost 6.47.0 → 6.48.0
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/MigratorConfig.js +0 -1
- package/bin/create-migration.js +1 -1
- package/bin/generate-golden-email.js +0 -1
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/core/boot.js +13 -7
- package/core/built/admin/assets/{PolarAngleAxis-CLluELUg.js → PolarAngleAxis-DufzOBEz.js} +1 -1
- package/core/built/admin/assets/{_baseAssignValue-Dz1iqdwD.js → _baseAssignValue-BjUm4QeA.js} +1 -1
- package/core/built/admin/assets/{a-large-small-BA74vHPp.js → a-large-small-D0RF_WS9.js} +1 -1
- package/core/built/admin/assets/{account-migration-B-NqdKuN.js → account-migration-B7n6ezrZ.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-ClmVrAXr.js → account-migration-BJeRnMCl.js} +3 -3
- package/core/built/admin/assets/activitypub/activitypub.js +1 -1
- package/core/built/admin/assets/activitypub/{at-sign-9F3qd4Nn.js → at-sign-BygVOKdj.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-jBHA13Ej.js → avatar-flipboard-CNcjI8lK.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-1irhvVtF.js → bluesky-sharing-mgBNeRfA.js} +4 -4
- package/core/built/admin/assets/activitypub/{copy-DXRvsGiK.js → copy-BMChXIQc.js} +2 -2
- package/core/built/admin/assets/activitypub/{deleted-feed-item-67VQJde4.js → deleted-feed-item-D-spb6V1.js} +2 -2
- package/core/built/admin/assets/activitypub/{edit-profile-BfpbEj98.js → edit-profile-CDQ3V8-c.js} +4 -4
- package/core/built/admin/assets/activitypub/{feed-DUrI7SPC.js → feed-Vqr3WU-V.js} +4 -4
- package/core/built/admin/assets/activitypub/{hash-CMtB10PN.js → hash-D7SSXVOg.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-2xq8SJ7A.js → inbox-BHk5Dw27.js} +2 -2
- package/core/built/admin/assets/activitypub/{index-BT97xLpd.js → index-BejkeH-m.js} +2 -2
- package/core/built/admin/assets/activitypub/{index-DssHQAjK.js → index-BqL23J-m.js} +32 -32
- package/core/built/admin/assets/activitypub/{index-Ba6FXt8y.js → index-CHhvjNuG.js} +6 -6
- package/core/built/admin/assets/activitypub/{index-ERtz4Bvy.js → index-CZsNO9hA.js} +5 -5
- package/core/built/admin/assets/activitypub/{index-sgY7lLrg.js → index-CaIhRYzz.js} +3 -3
- package/core/built/admin/assets/activitypub/{index-D1EWoXrK.js → index-DA2MkQVu.js} +2 -2
- package/core/built/admin/assets/activitypub/{index-sudOvKcY.js → index-DHhFcmfu.js} +21 -21
- package/core/built/admin/assets/activitypub/{index-Ccighz1t.js → index-sh2bDSls.js} +4 -4
- package/core/built/admin/assets/activitypub/{label-KQSsSjmN.js → label-D80yhOIm.js} +2 -2
- package/core/built/admin/assets/activitypub/{moderation-B78if-r0.js → moderation-LJNmKBCi.js} +3 -3
- package/core/built/admin/assets/activitypub/{note-Bfr7ovn7.js → note-CyjKLcQ-.js} +4 -4
- package/core/built/admin/assets/activitypub/{reply-CehesW8Z.js → reply-BiiCFx7G.js} +2 -2
- package/core/built/admin/assets/activitypub/{separator-B_Ly_Qq8.js → separator-CY3PMmtI.js} +2 -2
- package/core/built/admin/assets/activitypub/{settings-D6R97p7v.js → settings-BQy6Gr7R.js} +3 -3
- package/core/built/admin/assets/activitypub/{step-1-Cl1YxgZ1.js → step-1-DCqRwgf3.js} +3 -3
- package/core/built/admin/assets/activitypub/{step-2-DDyR--Qe.js → step-2-DQlhehTO.js} +5 -5
- package/core/built/admin/assets/activitypub/{step-3-Don8gv0n.js → step-3-DAUCAcxW.js} +7 -7
- package/core/built/admin/assets/activitypub/{tabs-DTpfm-wu.js → tabs-B_6UuI7r.js} +3 -3
- package/core/built/admin/assets/activitypub/{topic-filter-Oee10885.js → topic-filter--FT1A_dc.js} +2 -2
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-CGZuiDGx.js → code-editor-view-Bp_sCJR0.js} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-CwEblQZC.js → index-BPXA3pTW.js} +5 -5
- package/core/built/admin/assets/admin-x-settings/{index-rr_UntGE.js → index-BS375mg1.js} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-BpM6W2br.js → index-B_PlQoEG.js} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-BGdS5xw4.js → index-BflhAbu2.js} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-DtWUeJhp.js → index-CftMe8fe.js} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-B65inCwj.js → index-DRB7FH6y.js} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-DSX261S9.js → index-DijZ3oAM.js} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-DF6YEs01.js → index-cV0Lof9H.js} +1526 -1500
- package/core/built/admin/assets/admin-x-settings/{index-CluZYkUC.js → index-qc4x3vZj.js} +3 -3
- package/core/built/admin/assets/admin-x-settings/{modals-Bf4KOU31.js → modals-CkjuEByw.js} +55 -67
- package/core/built/admin/assets/{arrow-right-BxP3aeA5.js → arrow-right-BF77Yx73.js} +1 -1
- package/core/built/admin/assets/{at-sign-Bf0y-jim.js → at-sign-DhJF3n_V.js} +1 -1
- package/core/built/admin/assets/{audience-DHR1WgFK.js → audience-DHPKKayV.js} +1 -1
- package/core/built/admin/assets/{automated-emails-DbJbDLib.js → automated-emails-DInKYTEC.js} +1 -1
- package/core/built/admin/assets/{automations-aLgTzSsZ.js → automations-DJpeZw9T.js} +1 -1
- package/core/built/admin/assets/automations-DpQKN9j0.js +1 -0
- package/core/built/admin/assets/{avatar-flipboard-B0F2LMW5.js → avatar-flipboard-yRdmFC6R.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-DjhtIuyr.js → bluesky-sharing-qSiCERoR.js} +1 -1
- package/core/built/admin/assets/{chart-BGwxlD0z.js → chart-CP2N9ZC-.js} +1 -1
- package/core/built/admin/assets/{chevron-up-C2FeVzre.js → chevron-up-BQ6fOpFR.js} +1 -1
- package/core/built/admin/assets/{chunk.524.31b31f7958dfae110016.js → chunk.524.ad4560630d4d62fbceb5.js} +4 -4
- package/core/built/admin/assets/{chunk.582.a855020953886af6e83b.js → chunk.582.fd4878e4e0af31ef86c0.js} +6 -6
- package/core/built/admin/assets/{chunk.972.258e6b1dab79b2189f1c.js → chunk.98.69968e0f393d82c2949c.js} +4 -4
- package/core/built/admin/assets/{code-editor-view-DzPkm_nJ.js → code-editor-view-CVODiRVJ.js} +1 -1
- package/core/built/admin/assets/{comments-DgItXUWN.js → comments-CP-NxopD.js} +1 -1
- package/core/built/admin/assets/{content-helpers-BNefU_PE.js → content-helpers-Crzkusiq.js} +1 -1
- package/core/built/admin/assets/{copy-DoNNUZlb.js → copy-r1LFsU75.js} +1 -1
- package/core/built/admin/assets/{data-list-CO1cZQRU.js → data-list-CzSc7z-2.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-DC2wSAhv.js → deleted-feed-item-PyEM8FiX.js} +1 -1
- package/core/built/admin/assets/{dropzone-BTODLafn.js → dropzone-DI8A9qO6.js} +1 -1
- package/core/built/admin/assets/{edit-profile-BMMpmWIZ.js → edit-profile-DlJ64lV7.js} +1 -1
- package/core/built/admin/assets/editor-CevNZicQ.js +8 -0
- package/core/built/admin/assets/{empty-indicator-Dza0FQlj.js → empty-indicator-Dxg05yWg.js} +1 -1
- package/core/built/admin/assets/{en-yf9qAqTu.js → en-D93GVp3o.js} +1 -1
- package/core/built/admin/assets/{eye-CAqnnfQF.js → eye-6POPPpTw.js} +1 -1
- package/core/built/admin/assets/{feed-BkNsbWiF.js → feed-P_RMYb5x.js} +1 -1
- package/core/built/admin/assets/{field-Ddb1ZOqM.js → field-DeNjwWrL.js} +1 -1
- package/core/built/admin/assets/{filter-query-core-5Mac92kh.js → filter-query-core-DFs5WSmA.js} +1 -1
- package/core/built/admin/assets/{filters-BCb4bgtg.js → filters-C_BSQgb7.js} +1 -1
- package/core/built/admin/assets/{gh-chart-C6zkIg8k.js → gh-chart-pNHAbeQn.js} +1 -1
- package/core/built/admin/assets/{ghost-5313258fd425ced5db6516acde01ba36.js → ghost-3f5b3569e0beec61266cb74077677fbc.js} +3 -3
- package/core/built/admin/assets/{growth-ezUlN8OE.js → growth-B83tVOYO.js} +1 -1
- package/core/built/admin/assets/{hash-DE2OmChI.js → hash-BCTATV5W.js} +1 -1
- package/core/built/admin/assets/{inbox-OthiHvlV.js → inbox-rE3c5suT.js} +1 -1
- package/core/built/admin/assets/{index-BLyzLfyx.js → index-7EiRc5Ay.js} +1 -1
- package/core/built/admin/assets/{index-CV5v0eFE.js → index-B5bpZGTI.js} +1 -1
- package/core/built/admin/assets/index-BNtzAd7H.css +1 -0
- package/core/built/admin/assets/{index-BC1yWeaJ.js → index-BT33w2Io.js} +1 -1
- package/core/built/admin/assets/{index-DjffQ3VJ.js → index-BbkXWdhb.js} +1 -1
- package/core/built/admin/assets/{index-DH6PA3W6.js → index-BfhSrnrJ.js} +1 -1
- package/core/built/admin/assets/{index-CRvK0Iac.js → index-BmR_OUpb.js} +1 -1
- package/core/built/admin/assets/{index-CNV7fxKZ.js → index-BuhMgn5c.js} +1 -1
- package/core/built/admin/assets/{index-pkixJbdq.js → index-C-075SzJ.js} +34 -34
- package/core/built/admin/assets/{index-DJoByVS8.js → index-CB3hJd9E.js} +1 -1
- package/core/built/admin/assets/{index-D3bb-MEJ.js → index-CCISLIQd.js} +1 -1
- package/core/built/admin/assets/{index-BIEhcKiV.js → index-Cnptpx11.js} +1 -1
- package/core/built/admin/assets/{index-DK1cu59e.js → index-CrBRU81r.js} +1 -1
- package/core/built/admin/assets/{index-B0_p1-R0.js → index-CscUHFJp.js} +1 -1
- package/core/built/admin/assets/{index-Bi5qzf86.js → index-D3ZzfuJt.js} +1 -1
- package/core/built/admin/assets/{index-CKPny_6u.js → index-D4wn-U0V.js} +1 -1
- package/core/built/admin/assets/{index-YzcsD17L.js → index-DNRlkUeu.js} +1 -1
- package/core/built/admin/assets/{index-BoMsDCxD.js → index-D_G6negZ.js} +1 -1
- package/core/built/admin/assets/{index-CwsmINtV.js → index-DfxHSK1s.js} +1 -1
- package/core/built/admin/assets/{index-X91I8PcS.js → index-Dpc3COTl.js} +1 -1
- package/core/built/admin/assets/{index-c1h-EQpd.js → index-UsbnU2jy.js} +1 -1
- package/core/built/admin/assets/{index-oKgNVmwC.js → index-VfrJzh5m.js} +1 -1
- package/core/built/admin/assets/{index-D5MrQBSe.js → index-fbxc8Dpt.js} +1 -1
- package/core/built/admin/assets/{input-group-BOLMrDfJ.js → input-group-BLygwiDK.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-DlzcWUPw.js → koenig-lexical-B9U3sBS5.js} +1 -1
- package/core/built/admin/assets/{kpi-card-BlF7JKRC.js → kpi-card-Bmnvvp4X.js} +1 -1
- package/core/built/admin/assets/{kpi-card-HDshm3lO.js → kpi-card-CGVtzdgJ.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-Dty6zMSP.js → kpi-tabs-DxbvMkIU.js} +1 -1
- package/core/built/admin/assets/{kpis-CFz4r5wW.js → kpis-CQBAGVjP.js} +1 -1
- package/core/built/admin/assets/{label-CVzNcbjb.js → label-DpTwHQi_.js} +1 -1
- package/core/built/admin/assets/{links-D9dHwDlP.js → links-Bdw25FJF.js} +1 -1
- package/core/built/admin/assets/{list-page-shoQED7N.js → list-page-BvTQwP5F.js} +1 -1
- package/core/built/admin/assets/{loader-circle-cad701gH.js → loader-circle-3HJkQKWf.js} +1 -1
- package/core/built/admin/assets/{mail-DG4PKpZy.js → mail-DvrqP73n.js} +1 -1
- package/core/built/admin/assets/{main-layout-BmFla3Se.js → main-layout-BAPpm0bz.js} +1 -1
- package/core/built/admin/assets/{members-d19Z6k1C.js → members-CF4CzJSf.js} +1 -1
- package/core/built/admin/assets/minus-DJIePlnU.js +1 -0
- package/core/built/admin/assets/modals-CVsVi0zu.js +35 -0
- package/core/built/admin/assets/{moderation-BWBLnh4h.js → moderation-BX1KH5QL.js} +1 -1
- package/core/built/admin/assets/{newsletter-DNY4MroI.js → newsletter-BlKeb58e.js} +1 -1
- package/core/built/admin/assets/{newsletters-B10iBPP-.js → newsletters-3In8H0Z5.js} +1 -1
- package/core/built/admin/assets/{note-S0b6wjRR.js → note-ybwJCAxm.js} +1 -1
- package/core/built/admin/assets/{offers-B-9mZqKd.js → offers-Cl0ZNEMr.js} +1 -1
- package/core/built/admin/assets/{onboarding-route-AMFn0X5G.js → onboarding-route-A3ECeMAi.js} +1 -1
- package/core/built/admin/assets/{overview-WKadyZRW.js → overview-DrMrfsk-.js} +1 -1
- package/core/built/admin/assets/{pagemenu-BofQcFaF.js → pagemenu-O7HbsehH.js} +1 -1
- package/core/built/admin/assets/{pencil-LfMcD0vS.js → pencil-CknTbJeE.js} +1 -1
- package/core/built/admin/assets/{pin-CayUjL8e.js → pin-BNs-JdQ3.js} +1 -1
- package/core/built/admin/assets/{post-analytics-DMHvt3Jl.js → post-analytics-Dk1VloZp.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-10cqioP1.js → post-analytics-context-kPL94Ivz.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-DlICE18K.js → post-analytics-header-CpMOozq-.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-Cfwy2UwD.js → post-share-modal-F0dobdhF.js} +1 -1
- package/core/built/admin/assets/posts/{alert-dialog-cQK32v9G.js → alert-dialog-NoPLULhG.js} +5 -5
- package/core/built/admin/assets/posts/{app-utils-DQ2hixop.js → app-utils-BiM9QO4L.js} +3 -3
- package/core/built/admin/assets/posts/{automations-BqkU9-zY.js → automations-BgIAmq9f.js} +3 -3
- package/core/built/admin/assets/posts/{automations-CoilKpVH.js → automations-D_XwO405.js} +30 -30
- package/core/built/admin/assets/posts/{avatar-BejAO6Rj.js → avatar-BYsYOpmq.js} +5 -5
- package/core/built/admin/assets/posts/{badge-BYGRyd2f.js → badge-B54vLono.js} +2 -2
- package/core/built/admin/assets/posts/{button-CG2Dpjqy.js → button-DMLfwOQt.js} +3 -3
- package/core/built/admin/assets/posts/{check-fsC5BvGC.js → check-D6qDi62T.js} +2 -2
- package/core/built/admin/assets/posts/{comments-CsyF5C1S.js → comments-CyYCbvUG.js} +26 -26
- package/core/built/admin/assets/posts/{data-list-JslRF2F5.js → data-list-B0DrMm-x.js} +4 -4
- package/core/built/admin/assets/posts/{dialog-3KY3A8t5.js → dialog-DtEZpY1q.js} +3 -3
- package/core/built/admin/assets/posts/{editor-3HPW_xW4.js → editor-LJHLmUoW.js} +1943 -1943
- package/core/built/admin/assets/posts/{ellipsis-BhK5S70U.js → ellipsis-JeIF0Biz.js} +2 -2
- package/core/built/admin/assets/posts/{empty-indicator-C9DbE9wZ.js → empty-indicator-dktzN32y.js} +2 -2
- package/core/built/admin/assets/posts/{filters-BCBDCnQF.js → filters-D1L-LU_m.js} +10 -10
- package/core/built/admin/assets/posts/{get-site-timezone-83C41MGz.js → get-site-timezone-dsyl8nlB.js} +3 -3
- package/core/built/admin/assets/posts/{growth-COoL1kMe.js → growth-yX8UB_ce.js} +12 -12
- package/core/built/admin/assets/posts/{heading-D3VqNO3z.js → heading-CNte43wH.js} +2 -2
- package/core/built/admin/assets/posts/{hooks-5YpJYWOw.js → hooks-BIgv7QBp.js} +2 -2
- package/core/built/admin/assets/posts/{index-Dqn5WIFh.js → index-2FO6Vy0r.js} +11 -11
- package/core/built/admin/assets/posts/{input-C1qcZBGw.js → input-BycmlCp8.js} +3 -3
- package/core/built/admin/assets/posts/{input-surface-C4vUAdbV.js → input-surface-vY3ACaso.js} +2 -2
- package/core/built/admin/assets/posts/{koenig-lexical-NZjxFY0X.js → koenig-lexical-Cq8SUcZC.js} +2 -2
- package/core/built/admin/assets/posts/{kpis-C2FEXoUT.js → kpis-CAJcU1w0.js} +27 -27
- package/core/built/admin/assets/posts/{label-CmJzmJY7.js → label-BmLTflMF.js} +3 -3
- package/core/built/admin/assets/posts/{links-nzud7t_t.js → links-BVcmMZmF.js} +4 -4
- package/core/built/admin/assets/posts/{list-page-D_rv4TgN.js → list-page-DX2WRn5T.js} +4 -4
- package/core/built/admin/assets/posts/{loading-indicator-DAOD6O2b.js → loading-indicator-C6FD4nS6.js} +3 -3
- package/core/built/admin/assets/posts/{mail-CtH0gTpq.js → mail-BMyoNUVM.js} +2 -2
- package/core/built/admin/assets/posts/{main-layout-VqvCxOXQ.js → main-layout-ClnxdW1Y.js} +2 -2
- package/core/built/admin/assets/posts/{message-circle-D4bCjxKS.js → message-circle-DwfHX-p1.js} +2 -2
- package/core/built/admin/assets/posts/{newsletter-BfwFyv6d.js → newsletter-Bid5_Bim.js} +19 -19
- package/core/built/admin/assets/posts/{overview-DKGum6ro.js → overview-BXti6Wg_.js} +18 -18
- package/core/built/admin/assets/posts/{pencil-Cffx-vm3.js → pencil-ChTk8IpW.js} +2 -2
- package/core/built/admin/assets/posts/{plus-D2ekwsq0.js → plus-DIKls8C6.js} +2 -2
- package/core/built/admin/assets/posts/{popover-DdbdKflP.js → popover-DVZsAT5u.js} +4 -4
- package/core/built/admin/assets/posts/{post-analytics-BleJYoNZ.js → post-analytics-DBL_kS0g.js} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-context-DT3Avn9Q.js → post-analytics-context-Dr5y5nxd.js} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-header-BktlrM_v.js → post-analytics-header-LH2-Jzgp.js} +13 -13
- package/core/built/admin/assets/posts/{post-share-modal-G8v3ZuSg.js → post-share-modal-D4DrfNfJ.js} +6 -6
- package/core/built/admin/assets/posts/{posts-CdWV_nlm.js → posts-ByxhcCrn.js} +2 -2
- package/core/built/admin/assets/posts/posts.js +1 -1
- package/core/built/admin/assets/posts/{search-CXP00fG8.js → search-DZR23LP-.js} +2 -2
- package/core/built/admin/assets/posts/{settings-DEXxDYc2.js → settings-CWyOKKnK.js} +2 -2
- package/core/built/admin/assets/posts/{sheet-CXHmD_eT.js → sheet-CNe7II5c.js} +3 -3
- package/core/built/admin/assets/posts/{site-C6DajagV.js → site-H9RAiQVv.js} +2 -2
- package/core/built/admin/assets/posts/{skeleton-Bihnkn8q.js → skeleton-Cn6x1x_C.js} +3 -3
- package/core/built/admin/assets/posts/{source-icon-C3oQy3UI.js → source-icon-BZOYujd1.js} +4 -4
- package/core/built/admin/assets/posts/{stats-DFicPtCX.js → stats-ugHCg8Oe.js} +4 -4
- package/core/built/admin/assets/posts/{table-DSJmeU5t.js → table-dG3Q5X95.js} +2 -2
- package/core/built/admin/assets/posts/{tabs-oRdVpN8P.js → tabs--EW8uL5B.js} +4 -4
- package/core/built/admin/assets/posts/{tags-6v5Qt_05.js → tags-DVdOfiSf.js} +2 -2
- package/core/built/admin/assets/posts/{tags-Upnkm0CF.js → tags-i0HJqNYU.js} +16 -16
- package/core/built/admin/assets/posts/{tooltip-Ci7pesWi.js → tooltip-ZvsT1Fs9.js} +4 -4
- package/core/built/admin/assets/posts/{trash-2-NCYWjRlg.js → trash-2-BT9fEHUL.js} +2 -2
- package/core/built/admin/assets/posts/{value-CcwzOh2_.js → value-DoFcsWDk.js} +2 -2
- package/core/built/admin/assets/posts/{virtual-list-window-CNahQBXY.js → virtual-list-window-Bt47XODn.js} +3 -3
- package/core/built/admin/assets/posts/{web-C3KrPq0T.js → web-BMTRLT-h.js} +20 -20
- package/core/built/admin/assets/posts/{zap-k30mZEuO.js → zap-DcIfEzKX.js} +2 -2
- package/core/built/admin/assets/{posts-DAfLuxAA.js → posts-DODOCB1E.js} +1 -1
- package/core/built/admin/assets/{power-Drkzg1xX.js → power-BZ7BM82m.js} +1 -1
- package/core/built/admin/assets/{referrers-TYxTJ2On.js → referrers-xwNb6L-8.js} +1 -1
- package/core/built/admin/assets/{repeat-CTM1qAzl.js → repeat-DHMCQMCA.js} +1 -1
- package/core/built/admin/assets/{reply-DXN16g7W.js → reply-DoLURZi2.js} +1 -1
- package/core/built/admin/assets/{rocket-DLixlWs0.js → rocket-BDH89dZr.js} +1 -1
- package/core/built/admin/assets/{select-DbiLEqYb.js → select-oE39QRll.js} +1 -1
- package/core/built/admin/assets/{send-B71C_46D.js → send-QgRN_yRy.js} +1 -1
- package/core/built/admin/assets/{settings-BBMPA3MP.js → settings-CF4NLxuS.js} +4 -4
- package/core/built/admin/assets/{settings-lSFHFrsJ.js → settings-D7e6KLAi.js} +1 -1
- package/core/built/admin/assets/{share-modal-CXrYja6o.js → share-modal-BxIh7i7o.js} +1 -1
- package/core/built/admin/assets/{sort-button-WYo-9Kge.js → sort-button-CEe_40Pi.js} +1 -1
- package/core/built/admin/assets/{source-icon-D6BzjYPP.js → source-icon-CzTNLO6j.js} +1 -1
- package/core/built/admin/assets/{sprout-DVfG_qhy.js → sprout-B2fN41p-.js} +1 -1
- package/core/built/admin/assets/{square-BbUJwQJi.js → square-CJZsjE-3.js} +1 -1
- package/core/built/admin/assets/{stats-CnXALQ4j.js → stats-jTxCK1CB.js} +1 -1
- package/core/built/admin/assets/{stats-view-B-yeMUkl.js → stats-view-B4jz69N8.js} +1 -1
- package/core/built/admin/assets/{step-1-DUl_hlpV.js → step-1-BovjhDNc.js} +1 -1
- package/core/built/admin/assets/{step-2-DjX_A4Ke.js → step-2-ClG40BfX.js} +1 -1
- package/core/built/admin/assets/{step-3-CnDCCA8T.js → step-3-ZMSyEHZI.js} +1 -1
- package/core/built/admin/assets/{table-AagTvMa9.js → table-B8Pj96or.js} +1 -1
- package/core/built/admin/assets/{tabs-IDJWnQD-.js → tabs-BZosOk0o.js} +1 -1
- package/core/built/admin/assets/{tags-CXAcIDw-.js → tags-BpWoYBfB.js} +1 -1
- package/core/built/admin/assets/{tags-C3lykbgu.js → tags-DZukMyuU.js} +1 -1
- package/core/built/admin/assets/{textarea-Cc3nUXep.js → textarea-BtnzsOk7.js} +1 -1
- package/core/built/admin/assets/{thumbs-down-SsjC2lMD.js → thumbs-down-CZTzyz7D.js} +1 -1
- package/core/built/admin/assets/{tiers-J8AeZmRd.js → tiers-Do7zBqAk.js} +1 -1
- package/core/built/admin/assets/{toggle-group-BzD8yimX.js → toggle-group-abk9FYXi.js} +1 -1
- package/core/built/admin/assets/{topic-filter-CA_L6ehz.js → topic-filter-CdMvjkmc.js} +1 -1
- package/core/built/admin/assets/{trash-BKhRqxsX.js → trash-DNXRsBf0.js} +1 -1
- package/core/built/admin/assets/{underline-_HIgX6e1.js → underline-HXWuVCAi.js} +1 -1
- package/core/built/admin/assets/{undo-2-ClkkOS0O.js → undo-2-C2ntNJKC.js} +1 -1
- package/core/built/admin/assets/{upload-DEPHbyvo.js → upload-D52l7HIb.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-BM2qWt0C.js → use-growth-stats-Dgs0UxDT.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-zyklfekn.js → use-simple-pagination-Cj2rVggA.js} +1 -1
- package/core/built/admin/assets/{user-round-check-DoaGU2hC.js → user-round-check-C0GdT99c.js} +1 -1
- package/core/built/admin/assets/{user-round-x-CwEKNuU6.js → user-round-x-CVCvxuUG.js} +1 -1
- package/core/built/admin/assets/{virtual-list-window-C0Cv0gUC.js → virtual-list-window-mdQS2bt_.js} +1 -1
- package/core/built/admin/assets/{wallet-cards-BjdG5glh.js → wallet-cards-CtLF01jQ.js} +1 -1
- package/core/built/admin/assets/{web-BZNnanCT.js → web-DTib8_n8.js} +1 -1
- package/core/built/admin/index.html +6 -6
- package/core/frontend/helpers/ghost_foot.js +12 -2
- package/core/frontend/helpers/prev_post.js +1 -1
- package/core/frontend/helpers/tpl/gift-toast.hbs +130 -0
- package/core/frontend/services/proxy.js +9 -0
- package/core/frontend/services/routing/controllers/entry/canonical-url.js +15 -0
- package/core/frontend/services/routing/controllers/entry/canonical-url.ts +14 -0
- package/core/frontend/services/routing/controllers/entry/gift-links.js +82 -0
- package/core/frontend/services/routing/controllers/entry/gift-links.ts +92 -0
- package/core/frontend/services/routing/controllers/entry/markdown.js +62 -0
- package/core/frontend/services/routing/controllers/entry/markdown.ts +66 -0
- package/core/frontend/services/routing/controllers/entry.js +96 -105
- package/core/frontend/services/routing/controllers/entry.ts +97 -0
- package/core/frontend/services/routing/controllers/index.js +1 -1
- package/core/frontend/web/middleware/frontend-caching.js +9 -0
- package/core/server/adapters/cache/Redis.js +0 -1
- package/core/server/adapters/redirects/RedirectsStoreBase.d.ts +0 -4
- package/core/server/adapters/scheduling/scheduling-default.js +8 -1
- package/core/server/api/endpoints/gift-links.js +23 -16
- package/core/server/api/endpoints/gift-links.ts +25 -17
- package/core/server/api/endpoints/index.js +0 -1
- package/core/server/api/endpoints/previews.js +3 -24
- package/core/server/api/endpoints/utils/serializers/output/gift-links.js +4 -4
- package/core/server/api/endpoints/utils/serializers/output/gift-links.ts +4 -4
- package/core/server/api/endpoints/utils/serializers/output/index.js +0 -1
- package/core/server/api/endpoints/utils/validators/input/automation_email_previews.js +8 -9
- package/core/server/api/endpoints/utils/validators/input/index.js +0 -1
- package/core/server/data/migrations/versions/6.48/2026-06-23-00-00-00-drop-gift-links-revoked-at.js +6 -0
- package/core/server/data/migrations/versions/6.48/2026-06-23-00-00-01-rename-gift-links-revoke-all-permission-to-remove-all.js +37 -0
- package/core/server/data/migrations/versions/6.48/2026-06-24-00-00-00-drop-gift-links-redemption-columns.js +10 -0
- package/core/server/data/schema/fixtures/fixtures.json +2 -2
- package/core/server/data/schema/schema.js +1 -4
- package/core/server/data/seeders/data-generator.js +4 -1
- package/core/server/data/seeders/importers/members-login-events-importer.js +0 -1
- package/core/server/data/seeders/importers/members-newsletters-importer.js +0 -1
- package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +0 -1
- package/core/server/data/seeders/importers/members-status-events-importer.js +0 -1
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +0 -1
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +0 -1
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +0 -1
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +0 -1
- package/core/server/lib/lexical.js +62 -36
- package/core/server/lib/post-revisions.js +0 -2
- package/core/server/lib/post-revisions.ts +0 -3
- package/core/server/models/index.js +0 -3
- package/core/server/services/auth/reset-authentication.js +0 -2
- package/core/server/services/auth/reset-authentication.ts +0 -3
- package/core/server/services/auth/session/index.js +0 -1
- package/core/server/services/automations/automations-api.js +59 -17
- package/core/server/services/automations/automations-api.ts +69 -16
- package/core/server/services/automations/database-automations-repository.js +58 -3
- package/core/server/services/automations/database-automations-repository.ts +70 -3
- package/core/server/services/automations/stale-lock-cutoff.js +7 -0
- package/core/server/services/automations/stale-lock-cutoff.ts +5 -0
- package/core/server/services/email-address/email-address-parser.js.d.ts +0 -1
- package/core/server/services/email-service/batch-sending-service.js +99 -26
- package/core/server/services/email-service/email-service-wrapper.js +7 -2
- package/core/server/services/email-service/email-service.js +146 -4
- package/core/server/services/gift-links/database.js +0 -3
- package/core/server/services/gift-links/database.ts +1 -4
- package/core/server/services/gift-links/index.js +2 -2
- package/core/server/services/gift-links/index.ts +4 -2
- package/core/server/services/gift-links/models.js +0 -2
- package/core/server/services/gift-links/models.ts +0 -2
- package/core/server/services/gift-links/queries.js +2 -2
- package/core/server/services/gift-links/queries.ts +2 -2
- package/core/server/services/gift-links/serializers.js +0 -2
- package/core/server/services/gift-links/serializers.ts +0 -2
- package/core/server/services/gift-links/service.js +54 -35
- package/core/server/services/gift-links/service.ts +70 -35
- package/core/server/services/gifts/gift-reminder-scheduler.js +0 -2
- package/core/server/services/gifts/gift-reminder-scheduler.ts +0 -2
- package/core/server/services/indexnow.js +8 -1
- package/core/server/services/internal-keys/index.js +0 -1
- package/core/server/services/internal-keys/index.ts +0 -2
- package/core/server/services/lib/dynamic-redirect-manager.d.ts +0 -1
- package/core/server/services/lib/in-memory-repository.js +0 -1
- package/core/server/services/lib/in-memory-repository.ts +0 -2
- package/core/server/services/members/api.js +0 -3
- package/core/server/services/members/create-paid-member-shim.js +31 -0
- package/core/server/services/members/create-paid-member-shim.ts +31 -0
- package/core/server/services/members/emails/signin.js +0 -1
- package/core/server/services/members/members-api/members-api.js +0 -2
- package/core/server/services/members/members-api/repositories/member-repository.js +0 -3
- package/core/server/services/members/service.js +4 -0
- package/core/server/services/post-scheduling/index.js +0 -2
- package/core/server/services/post-scheduling/index.ts +0 -2
- package/core/server/services/post-scheduling/post-scheduling.js +0 -5
- package/core/server/services/post-scheduling/post-scheduling.ts +0 -5
- package/core/server/services/recommendations/service/bookshelf-repository.js +0 -1
- package/core/server/services/recommendations/service/bookshelf-repository.ts +0 -4
- package/core/server/services/recommendations/service/incoming-recommendation-service.js +0 -1
- package/core/server/services/recommendations/service/incoming-recommendation-service.ts +0 -1
- package/core/server/services/recommendations/service/recommendation-controller.js +0 -1
- package/core/server/services/recommendations/service/recommendation-controller.ts +0 -1
- package/core/server/services/recommendations/service/recommendation-metadata-service.js +0 -1
- package/core/server/services/recommendations/service/recommendation-metadata-service.ts +0 -1
- package/core/server/services/recommendations/service/recommendation.js +0 -1
- package/core/server/services/recommendations/service/recommendation.ts +0 -1
- package/core/server/services/remote-flags/index.js +0 -1
- package/core/server/services/remote-flags/index.ts +0 -1
- package/core/server/services/slack.js +5 -1
- package/core/server/services/update-check/index.js +0 -1
- package/core/server/services/url/lazy-find-resource.js +0 -1
- package/core/server/services/url/lazy-find-resource.ts +0 -2
- package/core/server/services/url/lazy-url-service.js +0 -1
- package/core/server/services/url/lazy-url-service.ts +0 -2
- package/core/server/services/url/permalink-matcher.js +0 -1
- package/core/server/services/url/permalink-matcher.ts +0 -2
- package/core/server/services/url/router-filter.js +0 -2
- package/core/server/services/url/router-filter.ts +0 -2
- package/core/server/services/url/url-service-facade.js +0 -1
- package/core/server/services/url/url-service-facade.ts +0 -2
- package/core/server/services/verification/verification-webhook-service.js +0 -1
- package/core/server/services/verification/verification-webhook-service.ts +0 -1
- package/core/server/web/api/endpoints/admin/routes.js +7 -7
- package/core/shared/events-ts/post-deleted-event.js +0 -2
- package/core/shared/events-ts/post-deleted-event.ts +0 -2
- package/core/shared/labs.js +0 -1
- package/package.json +8 -16
- package/pnpm-lock.yaml +162 -113
- package/core/built/admin/assets/automations-BthXBzzq.js +0 -1
- package/core/built/admin/assets/editor-91xrI2A3.js +0 -8
- package/core/built/admin/assets/index-BYb09f-7.css +0 -1
- package/core/built/admin/assets/minus-DmrVsJ-z.js +0 -1
- package/core/built/admin/assets/modals-dnqxCS3l.js +0 -35
- package/core/server/models/outbox.js +0 -24
- package/core/server/services/outbox/events/start-outbox-processing-event.js +0 -22
- package/core/server/services/outbox/handlers/member-created.js +0 -85
- package/core/server/services/outbox/index.js +0 -49
- package/core/server/services/outbox/jobs/index.js +0 -30
- package/core/server/services/outbox/jobs/lib/constants.js +0 -17
- package/core/server/services/outbox/jobs/lib/process-entries.js +0 -117
- package/core/server/services/outbox/jobs/lib/process-outbox.js +0 -96
- package/core/server/services/outbox/jobs/outbox-job.js +0 -36
- package/types/ghost-storage-base.d.ts +0 -22
package/core/built/admin/assets/{use-growth-stats-BM2qWt0C.js → use-growth-stats-Dgs0UxDT.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ed as C,dq as F,de as H,dE as s,dd as _,dc as k}from"./index-
|
|
1
|
+
import{ed as C,dq as F,de as H,dE as s,dd as _,dc as k}from"./index-C-075SzJ.js";import{u as v,a as V,h as j}from"./stats-jTxCK1CB.js";import{g as q}from"./currency-fEUUCkj0.js";const G=(r,Y,D,i)=>{if(!r.length)return{totalMembers:0,freeMembers:0,paidMembers:0,mrr:0,percentChanges:{total:"0%",free:"0%",paid:"0%",mrr:"0%"},directions:{total:"same",free:"same",paid:"same",mrr:"same"}};const f=i||r[r.length-1],m=r.length>0?r[r.length-1]:{free:0,paid:0,comped:0,gift:0},P=Y.length>0?Y[Y.length-1]:{mrr:0},c=f.free+f.paid+f.comped+(f.gift??0),g=P.mrr,M={total:"0%",free:"0%",paid:"0%",mrr:"0%"},y={total:"same",free:"same",paid:"same",mrr:"same"};if(r.length>1){const t=r[0],e=t.free+t.paid+t.comped+(t.gift??0);if(e>0){const a=(c-e)/e*100;M.total=_(a/100),y.total=a>0?"up":a<0?"down":"same"}if(t.free>0){const a=(m.free-t.free)/t.free*100;M.free=_(a/100),y.free=a>0?"up":a<0?"down":"same"}const u=t.paid+t.comped+(t.gift??0),d=m.paid+m.comped+(m.gift??0);if(u>0){const a=(d-u)/u*100;M.paid=_(a/100),y.paid=a>0?"up":a<0?"down":"same"}}if(Y.length>1){const t=s(D).format("YYYY-MM-DD"),e=Y.find(a=>s(a.date).isSameOrAfter(t)),u=s(D).isSame(s().startOf("year"),"day")||s(D).year()<s().year();let d=0;if(e&&s(e.date).isSame(t,"day")?d=e.mrr:u?d=0:d=g,d>=0){const a=d===0?g>0?100:0:(g-d)/d*100;M.mrr=_(a/100),y.mrr=a>0?"up":a<0?"down":"same"}}return{totalMembers:c,freeMembers:f.free,paidMembers:f.paid+f.comped+(f.gift??0),mrr:g,percentChanges:M,directions:y}},K=(r,Y)=>{const D=[...r].sort((t,e)=>new Date(t.date).getTime()-new Date(e.date).getTime()),i=[...Y].sort((t,e)=>new Date(t.date).getTime()-new Date(e.date).getTime()),f=D.map(t=>t.date),m=i.map(t=>t.date),P=[...new Set([...f,...m])].sort((t,e)=>new Date(t).getTime()-new Date(e).getTime());let c=null,g=null;const M=new Map(D.map(t=>[t.date,t])),y=new Map(i.map(t=>[t.date,t]));return P.map(t=>{const e=M.get(t);e&&(c=e);const u=y.get(t);u&&(g=u);const d=c?.free??0,a=c?.paid??0,O=c?.comped??0,A=c?.gift??0,L=a+O+A,o=d+L,R=g?.mrr??0,S=c?.paid_subscribed??0,h=c?.paid_canceled??0;return{date:t,value:o,free:d,paid:L,comped:O,gift:A,mrr:R,paid_subscribed:S,paid_canceled:h,formattedValue:k(o),label:"Total members"}})},X=r=>{const{startDate:Y,endDate:D}=C.useMemo(()=>F(r),[r]),i=H(Y),f=r===1?s(i).subtract(1,"day").format("YYYY-MM-DD"):i,{data:m,isLoading:P}=v({searchParams:{date_from:f}}),{data:c,isLoading:g}=V({searchParams:{date_from:f}}),{data:M,isLoading:y}=j(),t=C.useMemo(()=>{let o=[];if(m?.stats?o=m.stats:Array.isArray(m)&&(o=m),r===1&&o.length>=2){const R=o[o.length-2],S=o[o.length-1],h=s(i).format("YYYY-MM-DD"),l=s(i).add(1,"day").format("YYYY-MM-DD"),p={...R,date:h},b={...S,date:l};return[p,b]}return o},[m,r,i]),{mrrData:e,selectedCurrency:u}=C.useMemo(()=>{const o=s(i),R=r===1?s().endOf("day"):s().startOf("day");if(c?.stats&&c?.meta?.totals){const S=c.meta.totals;let h=S[0];if(!h)return{mrrData:[],selectedCurrency:"usd"};for(const n of S)n.mrr>h.mrr&&(h=n);const l=h.currency,p=c.stats.filter(n=>n.currency===l),b=p.filter(n=>s(n.date).isSameOrAfter(o)),x=[...p].sort((n,w)=>new Date(w.date).getTime()-new Date(n.date).getTime()),T=[...b];if(!T.some(n=>s(n.date).isSame(o,"day"))){const n=x.find(w=>s(w.date).isBefore(o));if(n)T.unshift({...n,date:o.format("YYYY-MM-DD")});else if(T.length>0){const w=[...T].sort((B,I)=>new Date(B.date).getTime()-new Date(I.date).getTime())[0];T.unshift({...w,date:o.format("YYYY-MM-DD")})}}const E=r===1?s().startOf("day"):R;if(!T.some(n=>s(n.date).isSame(E,"day"))&&T.length>0){const w=[...T].sort((B,I)=>new Date(I.date).getTime()-new Date(B.date).getTime())[0];T.push({...w,date:E.format("YYYY-MM-DD")})}return{mrrData:T.sort((n,w)=>new Date(n.date).getTime()-new Date(w.date).getTime()),selectedCurrency:l}}return{mrrData:[],selectedCurrency:"usd"}},[c,i,r]),d=C.useMemo(()=>G(t,e,i,m?.meta?.totals),[t,e,i,m?.meta?.totals]),a=C.useMemo(()=>K(t,e),[t,e]),O=C.useMemo(()=>q(u),[u]),A=C.useMemo(()=>P||g||y,[P,g,y]),L=C.useMemo(()=>{if(!M?.stats)return[];const o=M.stats.reduce((l,p)=>{const b=p.date;return l[b]||(l[b]={date:b,signups:0,cancellations:0}),l[b].signups+=p.signups,l[b].cancellations+=p.cancellations,l},{}),R=Object.values(o).sort((l,p)=>new Date(l.date).getTime()-new Date(p.date).getTime()),S=s(i),h=s(D);return R.filter(l=>{const p=s(l.date);return p.isSameOrAfter(S)&&p.isSameOrBefore(h)})},[M,i,D]);return{isLoading:A,memberData:t,mrrData:e,dateFrom:i,endDate:D,totals:d,chartData:a,subscriptionData:L,selectedCurrency:u,currencySymbol:O}};export{X as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d2 as u,d$ as i,cJ as c,J as l,v as h,ed as m}from"./index-
|
|
1
|
+
import{d2 as u,d$ as i,cJ as c,J as l,v as h,ed as m}from"./index-C-075SzJ.js";import{A as N}from"./arrow-right-BF77Yx73.js";const v=u.forwardRef(({className:e,children:t,...n},a)=>i.jsx("div",{ref:a,className:c("flex items-center justify-between gap-4 pb-6 text-sm",e),...n,children:t}));v.displayName="SimplePagination";const w=u.forwardRef(({className:e,currentPage:t,totalPages:n,...a},o)=>i.jsxs("span",{ref:o,className:c("text-muted-foreground",e),...a,children:["Pages ",t," of ",n]}));w.displayName="SimplePaginationPages";const j=u.forwardRef(({className:e,children:t,...n},a)=>i.jsx("div",{ref:a,className:c("flex items-center gap-1.5",e),...n,children:t}));j.displayName="SimplePaginationNavigation";const M=u.forwardRef(({variant:e="outline",...t},n)=>i.jsx(l,{ref:n,size:"sm",variant:e,...t,children:i.jsx(h,{})}));M.displayName="SimplePaginationPreviousButton";const R=u.forwardRef(({variant:e="outline",...t},n)=>i.jsx(l,{ref:n,size:"sm",variant:e,...t,children:i.jsx(N,{})}));R.displayName="SimplePaginationNextButton";function B({data:e,itemsPerPage:t,initialPage:n=1}){const[a,o]=m.useState(n);if(t<=0)throw new Error("itemsPerPage must be a positive number");const p=s=>{const S=Math.max(1,Math.min(r,s));o(S)},r=m.useMemo(()=>e?Math.ceil(e.length/t):1,[e,t]);m.useEffect(()=>{a>r&&o(1)},[a,r]);const g=m.useMemo(()=>{if(!e)return null;const s=(a-1)*t;return e.slice(s,s+t)},[e,a,t]),f=()=>{o(s=>Math.min(r,s+1))},x=()=>{o(s=>Math.max(1,s-1))},d=a<r,P=a>1;return{currentPage:a,setCurrentPage:p,totalPages:r,paginatedData:g,nextPage:f,previousPage:x,hasNextPage:d,hasPreviousPage:P}}export{v as S,j as a,R as b,w as c,M as d,B as u};
|
package/core/built/admin/assets/{user-round-check-DoaGU2hC.js → user-round-check-C0GdT99c.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cR as e}from"./index-
|
|
1
|
+
import{cR as e}from"./index-C-075SzJ.js";const c=[["path",{d:"m2 9 3-3 3 3",key:"1ltn5i"}],["path",{d:"M13 18H7a2 2 0 0 1-2-2V6",key:"1r6tfw"}],["path",{d:"m22 15-3 3-3-3",key:"4rnwn2"}],["path",{d:"M11 6h6a2 2 0 0 1 2 2v10",key:"2f72bc"}]],a=e("repeat-2",c);const t=[["path",{d:"M2 21a8 8 0 0 1 13.292-6",key:"bjp14o"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"m16 19 2 2 4-4",key:"1b14m6"}]],n=e("user-round-check",t);export{a as R,n as U};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cR as e}from"./index-
|
|
1
|
+
import{cR as e}from"./index-C-075SzJ.js";const o=[["path",{d:"M2 21a8 8 0 0 1 11.873-7",key:"74fkxq"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"m17 17 5 5",key:"p7ous7"}],["path",{d:"m22 17-5 5",key:"gqnmv0"}]],r=e("user-round-x",o);export{r as U};
|
package/core/built/admin/assets/{virtual-list-window-C0Cv0gUC.js → virtual-list-window-mdQS2bt_.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d$ as A,J as V,ed as v,ec as B,dt as N,fn as H}from"./index-pkixJbdq.js";const ct=({isLoading:r,onClick:a})=>{const e=!!r;return A.jsx("div",{className:"flex justify-center px-4 py-6",children:A.jsx(V,{disabled:e,variant:"outline",onClick:a,children:e?"Loading more...":"Load more"})})};function K(r,a,e){const s=new Array(r);return new Proxy(s,{get(t,n,i){if(typeof n=="string"){const o=n.charCodeAt(0);if(o>=48&&o<=57){const l=+n;if(Number.isInteger(l)&&l>=0&&l<r){let h=t[l];if(!h){const c=a[l*2];h=t[l]={index:l,key:e(l),start:c,size:a[l*2+1],end:c+a[l*2+1],lane:0}}return h}}if(n==="length")return r}return Reflect.get(t,n,i)}})}function M(r,a,e){let s=e.initialDeps??[],t,n=!0;function i(){const o=r();return(o.length!==s.length||o.some((h,c)=>s[c]!==h))&&(s=o,t=a(...o),e?.onChange&&!(n&&e.skipInitialOnChange)&&e.onChange(t),n=!1),t}return i.updateDeps=o=>{s=o},i}function R(r,a){if(r===void 0)throw new Error("Unexpected undefined");return r}const P=(r,a)=>Math.abs(r-a)<1.01,U=(r,a,e)=>{let s;return function(...t){r.clearTimeout(s),s=r.setTimeout(()=>a.apply(this,t),e)}};let _;const L=()=>{if(_!==void 0)return _;if(typeof navigator>"u")return _=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return _=!0;const r=navigator.maxTouchPoints;return _=navigator.platform==="MacIntel"&&r!==void 0&&r>0},W=r=>{const{offsetWidth:a,offsetHeight:e}=r;return{width:a,height:e}},J=r=>r,$=r=>{const a=Math.max(r.startIndex-r.overscan,0),s=Math.min(r.endIndex+r.overscan,r.count-1)-a+1,t=new Array(s);for(let n=0;n<s;n++)t[n]=a+n;return t},q=(r,a)=>{const e=r.scrollElement;if(!e)return;const s=r.targetWindow;if(!s)return;const t=i=>{const{width:o,height:l}=i;a({width:Math.round(o),height:Math.round(l)})};if(t(W(e)),!s.ResizeObserver)return()=>{};const n=new s.ResizeObserver(i=>{const o=()=>{const l=i[0];if(l?.borderBoxSize){const h=l.borderBoxSize[0];if(h){t({width:h.inlineSize,height:h.blockSize});return}}t(W(e))};r.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(o):o()});return n.observe(e,{box:"border-box"}),()=>{n.unobserve(e)}},O={passive:!0},X=typeof window>"u"?!0:"onscrollend"in window,Y=(r,a,e)=>{const s=r.scrollElement;if(!s)return;const t=r.targetWindow;if(!t)return;const n=r.options.useScrollendEvent&&X;let i=0;const o=n?null:U(t,()=>a(i,!1),r.options.isScrollingResetDelay),l=f=>()=>{i=e(s),o?.(),a(i,f)},h=l(!0),c=l(!1);return s.addEventListener("scroll",h,O),n&&s.addEventListener("scrollend",c,O),()=>{s.removeEventListener("scroll",h),n&&s.removeEventListener("scrollend",c)}},Z=(r,a)=>Y(r,a,e=>{const{horizontal:s,isRtl:t}=r.options;return s?e.scrollLeft*(t&&-1||1):e.scrollTop}),G=(r,a,e)=>{if(a?.borderBoxSize){const s=a.borderBoxSize[0];if(s)return Math.round(s[e.options.horizontal?"inlineSize":"blockSize"])}return r[e.options.horizontal?"offsetWidth":"offsetHeight"]},Q=(r,{adjustments:a=0,behavior:e},s)=>{var t,n;(n=(t=s.scrollElement)==null?void 0:t.scrollTo)==null||n.call(t,{[s.options.horizontal?"left":"top"]:r+a,behavior:e})},tt=Q;class et{constructor(a){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var e,s,t;return((t=(s=(e=this.targetWindow)==null?void 0:e.performance)==null?void 0:s.now)==null?void 0:t.call(s))??Date.now()},this.observer=(()=>{let e=null;const s=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(t=>{t.forEach(n=>{const i=()=>{const o=n.target,l=this.indexFromElement(o);if(!o.isConnected){this.observer.unobserve(o);for(const[h,c]of this.elementsCache)if(c===o){this.elementsCache.delete(h);break}return}this.shouldMeasureDuringScroll(l)&&this.resizeItem(l,this.options.measureElement(o,n,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(i):i()})}));return{disconnect:()=>{var t;(t=s())==null||t.disconnect(),e=null},observe:t=>{var n;return(n=s())==null?void 0:n.observe(t,{box:"border-box"})},unobserve:t=>{var n;return(n=s())==null?void 0:n.unobserve(t)}}})(),this.range=null,this.setOptions=e=>{const s={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:J,rangeExtractor:$,onChange:()=>{},measureElement:G,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate"};for(const t in e){const n=e[t];n!==void 0&&(s[t]=n)}this.options=s},this.notify=e=>{var s,t;(t=(s=this.options).onChange)==null||t.call(s,this,e)},this.maybeNotify=M(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;const s=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==s){if(this.cleanup(),!s){this.maybeNotify();return}if(this.scrollElement=s,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((e=this.scrollElement)==null?void 0:e.window)??null,this.elementsCache.forEach(t=>{this.observer.observe(t)}),this.unsubs.push(this.options.observeElementRect(this,t=>{this.scrollRect=t,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(t,n)=>{this._intendedScrollOffset!==null&&Math.abs(t-this._intendedScrollOffset)<1.5&&(t=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0,this.scrollDirection=n?this.getScrollOffset()<t?"forward":"backward":null,this.scrollOffset=t,this.isScrolling=n,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),"addEventListener"in this.scrollElement){const t=this.scrollElement,n=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},i=()=>{this._iosTouching=!1,!(!L()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};t.addEventListener("touchstart",n,O),t.addEventListener("touchend",i,O),this.unsubs.push(()=>{t.removeEventListener("touchstart",n),t.removeEventListener("touchend",i),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const e=this.getScrollOffset(),s=this.getMaxScrollOffset();if(e<0||e>s)return;const t=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+=t,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,s)=>{const t=new Map,n=new Map;for(let i=s-1;i>=0;i--){const o=e[i];if(t.has(o.lane))continue;const l=n.get(o.lane);if(l==null||o.end>l.end?n.set(o.lane,o):o.end<l.end&&t.set(o.lane,!0),t.size===this.options.lanes)break}return n.size===this.options.lanes?Array.from(n.values()).sort((i,o)=>i.end===o.end?i.index-o.index:i.end-o.end)[0]:void 0},this.getMeasurementOptions=M(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode],(e,s,t,n,i,o,l)=>(this.prevLanes!==void 0&&this.prevLanes!==o&&(this.lanesChangedFlag=!0),this.prevLanes=o,this.pendingMin=null,{count:e,paddingStart:s,scrollMargin:t,getItemKey:n,enabled:i,lanes:o,laneAssignmentMode:l}),{key:!1}),this.getMeasurements=M(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:s,scrollMargin:t,getItemKey:n,enabled:i,lanes:o,laneAssignmentMode:l},h)=>{const c=this.itemSizeCache;if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(const u of this.laneAssignments.keys())u>=e&&this.laneAssignments.delete(u);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(u=>{this.itemSizeCache.set(u.key,u.size)}));const f=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),o===1){const u=this.options.gap,S=e*2;let m=this._flatMeasurements;if(!m||m.length<S){const g=new Float64Array(S);m&&f>0&&g.set(m.subarray(0,f*2)),m=g,this._flatMeasurements=m}let p;if(f===0)p=s+t;else{const g=f-1;p=m[g*2]+m[g*2+1]+u}for(let g=f;g<e;g++){const y=n(g),w=c.get(y),x=typeof w=="number"?w:this.options.estimateSize(g);m[g*2]=p,m[g*2+1]=x,p+=x+u}const b=K(e,m,n);return this.measurementsCache=b,b}const d=this.measurementsCache.slice(0,f),I=new Array(o).fill(void 0);for(let u=0;u<f;u++){const S=d[u];S&&(I[S.lane]=u)}for(let u=f;u<e;u++){const S=n(u),m=this.laneAssignments.get(u);let p,b;const g=l==="estimate"||c.has(S);if(m!==void 0&&this.options.lanes>1){p=m;const E=I[p],T=E!==void 0?d[E]:void 0;b=T?T.end+this.options.gap:s+t}else{const E=this.options.lanes===1?d[u-1]:this.getFurthestMeasurement(d,u);b=E?E.end+this.options.gap:s+t,p=E?E.lane:u%this.options.lanes,this.options.lanes>1&&g&&this.laneAssignments.set(u,p)}const y=c.get(S),w=typeof y=="number"?y:this.options.estimateSize(u),x=b+w;d[u]={index:u,start:b,size:w,end:x,key:S,lane:p},I[p]=u}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=M(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,s,t,n)=>this.range=e.length>0&&s>0?st({measurements:e,outerSize:s,scrollOffset:t,lanes:n,flat:n===1&&this._flatMeasurements!=null?this._flatMeasurements:null}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=M(()=>{let e=null,s=null;const t=this.calculateRange();return t&&(e=t.startIndex,s=t.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,s]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,s]},(e,s,t,n,i)=>n===null||i===null?[]:e({startIndex:n,endIndex:i,overscan:s,count:t}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const s=this.options.indexAttribute,t=e.getAttribute(s);return t?parseInt(t,10):(console.warn(`Missing attribute name '${s}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{var s;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const t=this.scrollState.index??((s=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:s.index);if(t!==void 0&&this.range){const n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),i=Math.max(0,t-n),o=Math.min(this.options.count-1,t+n);return e>=i&&e<=o}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((i,o)=>{i.isConnected||(this.observer.unobserve(i),this.elementsCache.delete(o))});return}const s=this.indexFromElement(e),t=this.options.getItemKey(s),n=this.elementsCache.get(t);n!==e&&(n&&this.observer.unobserve(n),this.observer.observe(e),this.elementsCache.set(t,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(s)&&this.resizeItem(s,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,s)=>{var t;if(e<0||e>=this.options.count)return;let n,i,o;const l=this._flatMeasurements;if(this.options.lanes===1&&l!==null)o=this.options.getItemKey(e),i=l[e*2],n=l[e*2+1];else{const f=this.measurementsCache[e];if(!f)return;o=f.key,i=f.start,n=f.size}const h=this.itemSizeCache.get(o)??n,c=s-h;c!==0&&(((t=this.scrollState)==null?void 0:t.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:o,start:i,size:n,end:i+n,lane:0},c,this):i<this.getScrollOffset()+this.scrollAdjustments&&this.scrollDirection!=="backward")&&(L()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=c:this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=c,behavior:void 0})),(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(o,s),this.itemSizeCacheVersion++,this.notify(!1))},this.getVirtualItems=M(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,s)=>{const t=[];for(let n=0,i=e.length;n<i;n++){const o=e[n],l=s[o];t.push(l)}return t},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{const s=this.getMeasurements();if(s.length===0)return;const t=this._flatMeasurements,n=this.options.lanes===1&&t!=null,i=D(0,s.length-1,n?o=>t[o*2]:o=>R(s[o]).start,e);return R(s[i])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getOffsetForAlignment=(e,s,t=0)=>{if(!this.scrollElement)return 0;const n=this.getSize(),i=this.getScrollOffset();s==="auto"&&(s=e>=i+n?"end":"start"),s==="center"?e+=(t-n)/2:s==="end"&&(e-=n);const o=this.getMaxScrollOffset();return Math.max(Math.min(o,e),0)},this.getOffsetForIndex=(e,s="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));const t=this.getSize(),n=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(s==="auto")if(i.end>=n+t-this.options.scrollPaddingEnd)s="end";else if(i.start<=n+this.options.scrollPaddingStart)s="start";else return[n,s];if(s==="end"&&e===this.options.count-1)return[this.getMaxScrollOffset(),s];const o=s==="end"?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(o,s,i.size),s]},this.scrollToOffset=(e,{align:s="start",behavior:t="auto"}={})=>{const n=this.getOffsetForAlignment(e,s),i=this.now();this.scrollState={index:null,align:s,behavior:t,startedAt:i,lastTargetOffset:n,stableFrames:0},this._scrollToOffset(n,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:s="auto",behavior:t="auto"}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));const n=this.getOffsetForIndex(e,s);if(!n)return;const[i,o]=n,l=this.now();this.scrollState={index:e,align:o,behavior:t,startedAt:l,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:s="auto"}={})=>{const t=this.getScrollOffset()+e,n=this.now();this.scrollState={index:null,align:"start",behavior:s,startedAt:n,lastTargetOffset:t,stableFrames:0},this._scrollToOffset(t,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.getTotalSize=()=>{var e;const s=this.getMeasurements();let t;if(s.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){const n=s.length-1,i=this._flatMeasurements;i!=null?t=i[n*2]+i[n*2+1]:t=((e=s[n])==null?void 0:e.end)??0}else{const n=Array(this.options.lanes).fill(null);let i=s.length-1;for(;i>=0&&n.some(o=>o===null);){const o=s[i];n[o.lane]===null&&(n[o.lane]=o.end),i--}t=Math.max(...n.filter(o=>o!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const e=[];if(this.itemSizeCache.size===0)return e;const s=this.getMeasurements();for(const t of s)t&&this.itemSizeCache.has(t.key)&&e.push({index:t.index,key:t.key,start:t.start,size:t.size,end:t.end,lane:t.lane});return e},this._scrollToOffset=(e,{adjustments:s,behavior:t})=>{this._intendedScrollOffset=e+(s??0),this.options.scrollToFn(e,{behavior:t,adjustments:s},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(a)}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const s=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,t=s?s[0]:this.scrollState.lastTargetOffset,n=1,i=t!==this.scrollState.lastTargetOffset;if(!i&&P(t,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=n){this.getScrollOffset()!==t&&this._scrollToOffset(t,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,i){const o=this.getSize()||600,l=Math.abs(t-this.getScrollOffset()),h=this.scrollState.behavior==="smooth"&&l>o;this.scrollState.lastTargetOffset=t,h||(this.scrollState.behavior="auto"),this._scrollToOffset(t,{adjustments:void 0,behavior:h?"smooth":"auto"})}this.scheduleScrollReconcile()}}const D=(r,a,e,s)=>{for(;r<=a;){const t=(r+a)/2|0,n=e(t);if(n<s)r=t+1;else if(n>s)a=t-1;else return t}return r>0?r-1:0};function st({measurements:r,outerSize:a,scrollOffset:e,lanes:s,flat:t}){const n=r.length-1,i=t?c=>t[c*2]:c=>r[c].start,o=t?c=>t[c*2]+t[c*2+1]:c=>r[c].end;if(r.length<=s)return{startIndex:0,endIndex:n};let l=D(0,n,i,e),h=l;if(s===1)for(;h<n&&o(h)<e+a;)h++;else if(s>1){const c=Array(s).fill(0);for(;h<n&&c.some(d=>d<e+a);){const d=r[h];c[d.lane]=d.end,h++}const f=Array(s).fill(e+a);for(;l>=0&&f.some(d=>d>=e);){const d=r[l];f[d.lane]=d.start,l--}l=Math.max(0,l-l%s),h=Math.min(n,h+(s-1-h%s))}return{startIndex:l,endIndex:h}}const F=typeof document<"u"?v.useLayoutEffect:v.useEffect;function nt({useFlushSync:r=!0,...a}){const e=v.useReducer(n=>n+1,0)[1],s={...a,onChange:(n,i)=>{var o;r&&i?B.flushSync(e):e(),(o=a.onChange)==null||o.call(a,n,i)}},[t]=v.useState(()=>new et(s));return t.setOptions(s),F(()=>t._didMount(),[]),F(()=>t._willUpdate()),t}function it(r){return nt({observeElementRect:q,observeElementOffset:Z,scrollToFn:tt,...r})}function ut({items:r,totalItems:a,parentRef:e,hasNextPage:s,isFetchingNextPage:t,fetchNextPage:n,estimateSize:i=()=>100,overscan:o=5}){const l=it({count:a,getScrollElement:()=>N(e.current),estimateSize:i,overscan:o}),h=l.getVirtualItems(),c=h.length>0?(h.at(0)?.start??0)-l.options.scrollMargin:0,f=h.length>0?l.getTotalSize()-(h.at(-1)?.end??0):0,d=h.map(u=>({virtualItem:u,key:u.key,item:r[u.index],props:{ref:l.measureElement,"data-index":u.index}})),I=d.at(-1)&&!d.at(-1)?.item;return v.useEffect(()=>{s&&I&&!t&&n()},[s,I,t,n]),{visibleItems:d,virtualizer:l,spaceBefore:c,spaceAfter:f}}const j=1e3,C="ghostVirtualListWindow";function ot({totalItems:r,unlockedItemCount:a}){const e=Math.min(r,a);return{visibleItemCount:e,canLoadMore:r>e}}function rt(r){return r+j}function lt(r,a){return`${r}::${a}`}function k(r,a,e=j){const s=r?.[C];if(!s||typeof s!="object")return e;const t=s[a];return typeof t!="number"||!Number.isFinite(t)?e:Math.max(1,Math.floor(t))}function at(r,a,e){if(typeof window>"u")return;const s=r?.[C],t={...r??{},[C]:{...s&&typeof s=="object"?s:{},[a]:e}};window.history.replaceState(t,"")}function z(){if(!(typeof window>"u"))return window.history.state}function dt(r,{resetKey:a}={}){const{key:e,pathname:s,search:t}=H(),i=lt(s,a??t),[o,l]=v.useState(()=>k(z(),i)),h=v.useRef(i);v.useEffect(()=>{if(h.current!==i){h.current=i,l(k(z(),i));return}at(z(),i,o)},[i,e,o]);const{visibleItemCount:c,canLoadMore:f}=ot({totalItems:r,unlockedItemCount:o});return{visibleItemCount:c,canLoadMore:f,loadMore:()=>l(d=>rt(d))}}export{ct as L,dt as a,ut as u};
|
|
1
|
+
import{d$ as A,J as V,ed as v,ec as B,dt as N,fn as H}from"./index-C-075SzJ.js";const ct=({isLoading:r,onClick:a})=>{const e=!!r;return A.jsx("div",{className:"flex justify-center px-4 py-6",children:A.jsx(V,{disabled:e,variant:"outline",onClick:a,children:e?"Loading more...":"Load more"})})};function K(r,a,e){const s=new Array(r);return new Proxy(s,{get(t,n,i){if(typeof n=="string"){const o=n.charCodeAt(0);if(o>=48&&o<=57){const l=+n;if(Number.isInteger(l)&&l>=0&&l<r){let h=t[l];if(!h){const c=a[l*2];h=t[l]={index:l,key:e(l),start:c,size:a[l*2+1],end:c+a[l*2+1],lane:0}}return h}}if(n==="length")return r}return Reflect.get(t,n,i)}})}function M(r,a,e){let s=e.initialDeps??[],t,n=!0;function i(){const o=r();return(o.length!==s.length||o.some((h,c)=>s[c]!==h))&&(s=o,t=a(...o),e?.onChange&&!(n&&e.skipInitialOnChange)&&e.onChange(t),n=!1),t}return i.updateDeps=o=>{s=o},i}function R(r,a){if(r===void 0)throw new Error("Unexpected undefined");return r}const P=(r,a)=>Math.abs(r-a)<1.01,U=(r,a,e)=>{let s;return function(...t){r.clearTimeout(s),s=r.setTimeout(()=>a.apply(this,t),e)}};let _;const L=()=>{if(_!==void 0)return _;if(typeof navigator>"u")return _=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return _=!0;const r=navigator.maxTouchPoints;return _=navigator.platform==="MacIntel"&&r!==void 0&&r>0},W=r=>{const{offsetWidth:a,offsetHeight:e}=r;return{width:a,height:e}},J=r=>r,$=r=>{const a=Math.max(r.startIndex-r.overscan,0),s=Math.min(r.endIndex+r.overscan,r.count-1)-a+1,t=new Array(s);for(let n=0;n<s;n++)t[n]=a+n;return t},q=(r,a)=>{const e=r.scrollElement;if(!e)return;const s=r.targetWindow;if(!s)return;const t=i=>{const{width:o,height:l}=i;a({width:Math.round(o),height:Math.round(l)})};if(t(W(e)),!s.ResizeObserver)return()=>{};const n=new s.ResizeObserver(i=>{const o=()=>{const l=i[0];if(l?.borderBoxSize){const h=l.borderBoxSize[0];if(h){t({width:h.inlineSize,height:h.blockSize});return}}t(W(e))};r.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(o):o()});return n.observe(e,{box:"border-box"}),()=>{n.unobserve(e)}},O={passive:!0},X=typeof window>"u"?!0:"onscrollend"in window,Y=(r,a,e)=>{const s=r.scrollElement;if(!s)return;const t=r.targetWindow;if(!t)return;const n=r.options.useScrollendEvent&&X;let i=0;const o=n?null:U(t,()=>a(i,!1),r.options.isScrollingResetDelay),l=f=>()=>{i=e(s),o?.(),a(i,f)},h=l(!0),c=l(!1);return s.addEventListener("scroll",h,O),n&&s.addEventListener("scrollend",c,O),()=>{s.removeEventListener("scroll",h),n&&s.removeEventListener("scrollend",c)}},Z=(r,a)=>Y(r,a,e=>{const{horizontal:s,isRtl:t}=r.options;return s?e.scrollLeft*(t&&-1||1):e.scrollTop}),G=(r,a,e)=>{if(a?.borderBoxSize){const s=a.borderBoxSize[0];if(s)return Math.round(s[e.options.horizontal?"inlineSize":"blockSize"])}return r[e.options.horizontal?"offsetWidth":"offsetHeight"]},Q=(r,{adjustments:a=0,behavior:e},s)=>{var t,n;(n=(t=s.scrollElement)==null?void 0:t.scrollTo)==null||n.call(t,{[s.options.horizontal?"left":"top"]:r+a,behavior:e})},tt=Q;class et{constructor(a){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var e,s,t;return((t=(s=(e=this.targetWindow)==null?void 0:e.performance)==null?void 0:s.now)==null?void 0:t.call(s))??Date.now()},this.observer=(()=>{let e=null;const s=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(t=>{t.forEach(n=>{const i=()=>{const o=n.target,l=this.indexFromElement(o);if(!o.isConnected){this.observer.unobserve(o);for(const[h,c]of this.elementsCache)if(c===o){this.elementsCache.delete(h);break}return}this.shouldMeasureDuringScroll(l)&&this.resizeItem(l,this.options.measureElement(o,n,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(i):i()})}));return{disconnect:()=>{var t;(t=s())==null||t.disconnect(),e=null},observe:t=>{var n;return(n=s())==null?void 0:n.observe(t,{box:"border-box"})},unobserve:t=>{var n;return(n=s())==null?void 0:n.unobserve(t)}}})(),this.range=null,this.setOptions=e=>{const s={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:J,rangeExtractor:$,onChange:()=>{},measureElement:G,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate"};for(const t in e){const n=e[t];n!==void 0&&(s[t]=n)}this.options=s},this.notify=e=>{var s,t;(t=(s=this.options).onChange)==null||t.call(s,this,e)},this.maybeNotify=M(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;const s=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==s){if(this.cleanup(),!s){this.maybeNotify();return}if(this.scrollElement=s,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((e=this.scrollElement)==null?void 0:e.window)??null,this.elementsCache.forEach(t=>{this.observer.observe(t)}),this.unsubs.push(this.options.observeElementRect(this,t=>{this.scrollRect=t,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(t,n)=>{this._intendedScrollOffset!==null&&Math.abs(t-this._intendedScrollOffset)<1.5&&(t=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0,this.scrollDirection=n?this.getScrollOffset()<t?"forward":"backward":null,this.scrollOffset=t,this.isScrolling=n,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),"addEventListener"in this.scrollElement){const t=this.scrollElement,n=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},i=()=>{this._iosTouching=!1,!(!L()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};t.addEventListener("touchstart",n,O),t.addEventListener("touchend",i,O),this.unsubs.push(()=>{t.removeEventListener("touchstart",n),t.removeEventListener("touchend",i),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const e=this.getScrollOffset(),s=this.getMaxScrollOffset();if(e<0||e>s)return;const t=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+=t,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,s)=>{const t=new Map,n=new Map;for(let i=s-1;i>=0;i--){const o=e[i];if(t.has(o.lane))continue;const l=n.get(o.lane);if(l==null||o.end>l.end?n.set(o.lane,o):o.end<l.end&&t.set(o.lane,!0),t.size===this.options.lanes)break}return n.size===this.options.lanes?Array.from(n.values()).sort((i,o)=>i.end===o.end?i.index-o.index:i.end-o.end)[0]:void 0},this.getMeasurementOptions=M(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode],(e,s,t,n,i,o,l)=>(this.prevLanes!==void 0&&this.prevLanes!==o&&(this.lanesChangedFlag=!0),this.prevLanes=o,this.pendingMin=null,{count:e,paddingStart:s,scrollMargin:t,getItemKey:n,enabled:i,lanes:o,laneAssignmentMode:l}),{key:!1}),this.getMeasurements=M(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:s,scrollMargin:t,getItemKey:n,enabled:i,lanes:o,laneAssignmentMode:l},h)=>{const c=this.itemSizeCache;if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(const u of this.laneAssignments.keys())u>=e&&this.laneAssignments.delete(u);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(u=>{this.itemSizeCache.set(u.key,u.size)}));const f=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),o===1){const u=this.options.gap,S=e*2;let m=this._flatMeasurements;if(!m||m.length<S){const g=new Float64Array(S);m&&f>0&&g.set(m.subarray(0,f*2)),m=g,this._flatMeasurements=m}let p;if(f===0)p=s+t;else{const g=f-1;p=m[g*2]+m[g*2+1]+u}for(let g=f;g<e;g++){const y=n(g),w=c.get(y),x=typeof w=="number"?w:this.options.estimateSize(g);m[g*2]=p,m[g*2+1]=x,p+=x+u}const b=K(e,m,n);return this.measurementsCache=b,b}const d=this.measurementsCache.slice(0,f),I=new Array(o).fill(void 0);for(let u=0;u<f;u++){const S=d[u];S&&(I[S.lane]=u)}for(let u=f;u<e;u++){const S=n(u),m=this.laneAssignments.get(u);let p,b;const g=l==="estimate"||c.has(S);if(m!==void 0&&this.options.lanes>1){p=m;const E=I[p],T=E!==void 0?d[E]:void 0;b=T?T.end+this.options.gap:s+t}else{const E=this.options.lanes===1?d[u-1]:this.getFurthestMeasurement(d,u);b=E?E.end+this.options.gap:s+t,p=E?E.lane:u%this.options.lanes,this.options.lanes>1&&g&&this.laneAssignments.set(u,p)}const y=c.get(S),w=typeof y=="number"?y:this.options.estimateSize(u),x=b+w;d[u]={index:u,start:b,size:w,end:x,key:S,lane:p},I[p]=u}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=M(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,s,t,n)=>this.range=e.length>0&&s>0?st({measurements:e,outerSize:s,scrollOffset:t,lanes:n,flat:n===1&&this._flatMeasurements!=null?this._flatMeasurements:null}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=M(()=>{let e=null,s=null;const t=this.calculateRange();return t&&(e=t.startIndex,s=t.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,s]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,s]},(e,s,t,n,i)=>n===null||i===null?[]:e({startIndex:n,endIndex:i,overscan:s,count:t}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const s=this.options.indexAttribute,t=e.getAttribute(s);return t?parseInt(t,10):(console.warn(`Missing attribute name '${s}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{var s;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const t=this.scrollState.index??((s=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:s.index);if(t!==void 0&&this.range){const n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),i=Math.max(0,t-n),o=Math.min(this.options.count-1,t+n);return e>=i&&e<=o}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((i,o)=>{i.isConnected||(this.observer.unobserve(i),this.elementsCache.delete(o))});return}const s=this.indexFromElement(e),t=this.options.getItemKey(s),n=this.elementsCache.get(t);n!==e&&(n&&this.observer.unobserve(n),this.observer.observe(e),this.elementsCache.set(t,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(s)&&this.resizeItem(s,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,s)=>{var t;if(e<0||e>=this.options.count)return;let n,i,o;const l=this._flatMeasurements;if(this.options.lanes===1&&l!==null)o=this.options.getItemKey(e),i=l[e*2],n=l[e*2+1];else{const f=this.measurementsCache[e];if(!f)return;o=f.key,i=f.start,n=f.size}const h=this.itemSizeCache.get(o)??n,c=s-h;c!==0&&(((t=this.scrollState)==null?void 0:t.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:o,start:i,size:n,end:i+n,lane:0},c,this):i<this.getScrollOffset()+this.scrollAdjustments&&this.scrollDirection!=="backward")&&(L()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=c:this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=c,behavior:void 0})),(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(o,s),this.itemSizeCacheVersion++,this.notify(!1))},this.getVirtualItems=M(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,s)=>{const t=[];for(let n=0,i=e.length;n<i;n++){const o=e[n],l=s[o];t.push(l)}return t},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{const s=this.getMeasurements();if(s.length===0)return;const t=this._flatMeasurements,n=this.options.lanes===1&&t!=null,i=D(0,s.length-1,n?o=>t[o*2]:o=>R(s[o]).start,e);return R(s[i])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getOffsetForAlignment=(e,s,t=0)=>{if(!this.scrollElement)return 0;const n=this.getSize(),i=this.getScrollOffset();s==="auto"&&(s=e>=i+n?"end":"start"),s==="center"?e+=(t-n)/2:s==="end"&&(e-=n);const o=this.getMaxScrollOffset();return Math.max(Math.min(o,e),0)},this.getOffsetForIndex=(e,s="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));const t=this.getSize(),n=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(s==="auto")if(i.end>=n+t-this.options.scrollPaddingEnd)s="end";else if(i.start<=n+this.options.scrollPaddingStart)s="start";else return[n,s];if(s==="end"&&e===this.options.count-1)return[this.getMaxScrollOffset(),s];const o=s==="end"?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(o,s,i.size),s]},this.scrollToOffset=(e,{align:s="start",behavior:t="auto"}={})=>{const n=this.getOffsetForAlignment(e,s),i=this.now();this.scrollState={index:null,align:s,behavior:t,startedAt:i,lastTargetOffset:n,stableFrames:0},this._scrollToOffset(n,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:s="auto",behavior:t="auto"}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));const n=this.getOffsetForIndex(e,s);if(!n)return;const[i,o]=n,l=this.now();this.scrollState={index:e,align:o,behavior:t,startedAt:l,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:s="auto"}={})=>{const t=this.getScrollOffset()+e,n=this.now();this.scrollState={index:null,align:"start",behavior:s,startedAt:n,lastTargetOffset:t,stableFrames:0},this._scrollToOffset(t,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.getTotalSize=()=>{var e;const s=this.getMeasurements();let t;if(s.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){const n=s.length-1,i=this._flatMeasurements;i!=null?t=i[n*2]+i[n*2+1]:t=((e=s[n])==null?void 0:e.end)??0}else{const n=Array(this.options.lanes).fill(null);let i=s.length-1;for(;i>=0&&n.some(o=>o===null);){const o=s[i];n[o.lane]===null&&(n[o.lane]=o.end),i--}t=Math.max(...n.filter(o=>o!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const e=[];if(this.itemSizeCache.size===0)return e;const s=this.getMeasurements();for(const t of s)t&&this.itemSizeCache.has(t.key)&&e.push({index:t.index,key:t.key,start:t.start,size:t.size,end:t.end,lane:t.lane});return e},this._scrollToOffset=(e,{adjustments:s,behavior:t})=>{this._intendedScrollOffset=e+(s??0),this.options.scrollToFn(e,{behavior:t,adjustments:s},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(a)}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const s=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,t=s?s[0]:this.scrollState.lastTargetOffset,n=1,i=t!==this.scrollState.lastTargetOffset;if(!i&&P(t,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=n){this.getScrollOffset()!==t&&this._scrollToOffset(t,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,i){const o=this.getSize()||600,l=Math.abs(t-this.getScrollOffset()),h=this.scrollState.behavior==="smooth"&&l>o;this.scrollState.lastTargetOffset=t,h||(this.scrollState.behavior="auto"),this._scrollToOffset(t,{adjustments:void 0,behavior:h?"smooth":"auto"})}this.scheduleScrollReconcile()}}const D=(r,a,e,s)=>{for(;r<=a;){const t=(r+a)/2|0,n=e(t);if(n<s)r=t+1;else if(n>s)a=t-1;else return t}return r>0?r-1:0};function st({measurements:r,outerSize:a,scrollOffset:e,lanes:s,flat:t}){const n=r.length-1,i=t?c=>t[c*2]:c=>r[c].start,o=t?c=>t[c*2]+t[c*2+1]:c=>r[c].end;if(r.length<=s)return{startIndex:0,endIndex:n};let l=D(0,n,i,e),h=l;if(s===1)for(;h<n&&o(h)<e+a;)h++;else if(s>1){const c=Array(s).fill(0);for(;h<n&&c.some(d=>d<e+a);){const d=r[h];c[d.lane]=d.end,h++}const f=Array(s).fill(e+a);for(;l>=0&&f.some(d=>d>=e);){const d=r[l];f[d.lane]=d.start,l--}l=Math.max(0,l-l%s),h=Math.min(n,h+(s-1-h%s))}return{startIndex:l,endIndex:h}}const F=typeof document<"u"?v.useLayoutEffect:v.useEffect;function nt({useFlushSync:r=!0,...a}){const e=v.useReducer(n=>n+1,0)[1],s={...a,onChange:(n,i)=>{var o;r&&i?B.flushSync(e):e(),(o=a.onChange)==null||o.call(a,n,i)}},[t]=v.useState(()=>new et(s));return t.setOptions(s),F(()=>t._didMount(),[]),F(()=>t._willUpdate()),t}function it(r){return nt({observeElementRect:q,observeElementOffset:Z,scrollToFn:tt,...r})}function ut({items:r,totalItems:a,parentRef:e,hasNextPage:s,isFetchingNextPage:t,fetchNextPage:n,estimateSize:i=()=>100,overscan:o=5}){const l=it({count:a,getScrollElement:()=>N(e.current),estimateSize:i,overscan:o}),h=l.getVirtualItems(),c=h.length>0?(h.at(0)?.start??0)-l.options.scrollMargin:0,f=h.length>0?l.getTotalSize()-(h.at(-1)?.end??0):0,d=h.map(u=>({virtualItem:u,key:u.key,item:r[u.index],props:{ref:l.measureElement,"data-index":u.index}})),I=d.at(-1)&&!d.at(-1)?.item;return v.useEffect(()=>{s&&I&&!t&&n()},[s,I,t,n]),{visibleItems:d,virtualizer:l,spaceBefore:c,spaceAfter:f}}const j=1e3,C="ghostVirtualListWindow";function ot({totalItems:r,unlockedItemCount:a}){const e=Math.min(r,a);return{visibleItemCount:e,canLoadMore:r>e}}function rt(r){return r+j}function lt(r,a){return`${r}::${a}`}function k(r,a,e=j){const s=r?.[C];if(!s||typeof s!="object")return e;const t=s[a];return typeof t!="number"||!Number.isFinite(t)?e:Math.max(1,Math.floor(t))}function at(r,a,e){if(typeof window>"u")return;const s=r?.[C],t={...r??{},[C]:{...s&&typeof s=="object"?s:{},[a]:e}};window.history.replaceState(t,"")}function z(){if(!(typeof window>"u"))return window.history.state}function dt(r,{resetKey:a}={}){const{key:e,pathname:s,search:t}=H(),i=lt(s,a??t),[o,l]=v.useState(()=>k(z(),i)),h=v.useRef(i);v.useEffect(()=>{if(h.current!==i){h.current=i,l(k(z(),i));return}at(z(),i,o)},[i,e,o]);const{visibleItemCount:c,canLoadMore:f}=ot({totalItems:r,unlockedItemCount:o});return{visibleItemCount:c,canLoadMore:f,loadMore:()=>l(d=>rt(d))}}export{ct as L,dt as a,ut as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cR as c}from"./index-
|
|
1
|
+
import{cR as c}from"./index-C-075SzJ.js";const t=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],i=c("activity",t);const a=[["path",{d:"M13.744 17.736a6 6 0 1 1-7.48-7.48",key:"bq4yh3"}],["path",{d:"M15 6h1v4",key:"11y1tn"}],["path",{d:"m6.134 14.768.866-.5 2 3.464",key:"17snzx"}],["circle",{cx:"16",cy:"8",r:"6",key:"14bfc9"}]],s=c("coins",a);const e=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2",key:"4125el"}],["path",{d:"M3 11h3c.8 0 1.6.3 2.1.9l1.1.9c1.6 1.6 4.1 1.6 5.7 0l1.1-.9c.5-.5 1.3-.9 2.1-.9H21",key:"1dpki6"}]],d=c("wallet-cards",e);export{i as A,s as C,d as W};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d$ as t,aC as xe,bM as Se,bQ as je,bV as Ce,J as ne,bR as _e,bT as Ne,bU as ve,bS as Le,aH as ye,dc as Te,dd as Ee,eD as Fe,ed as r,cm as Oe,aw as Z,ch as ke,ci as De,dq as ie,de as G,c5 as Me,fF as Ie,fq as Ae,fx as Pe,dr as we,dt as Ue,E as Ve}from"./index-pkixJbdq.js";import{u as W,c as re,S as le,A as ee,b as $,a as J,U as ce}from"./post-analytics-context-10cqioP1.js";import{S as Re,e as Be,f as ze,a as $e,b as Ke,d as Ge,c as He}from"./select-DbiLEqYb.js";import{C as We,a as Qe}from"./loader-circle-cad701gH.js";import{b as qe,a as Ye,S as Je,g as Xe}from"./kpis-CFz4r5wW.js";import{F as Ze,c as Q,e as ue}from"./en-yf9qAqTu.js";import{C as de,d as et,e as tt,b as st,a as me,c as at,T as ot,j as K,f as te}from"./pagemenu-BofQcFaF.js";import{D as nt,d as it,c as se,b as rt,i as lt,a as ct,e as ut,f as dt,g as mt,h as pt}from"./data-list-CO1cZQRU.js";import{a as ht,P as gt}from"./post-analytics-header-DlICE18K.js";import{h as ft,i as bt}from"./filters-BCb4bgtg.js";import{i as xt,g as St,F as jt,S as Ct,T as _t}from"./gh-chart-C6zkIg8k.js";import{e as Nt}from"./upload-DEPHbyvo.js";import{F as vt}from"./pin-CayUjL8e.js";import{E as Lt}from"./empty-indicator-Dza0FQlj.js";import"./posts-DAfLuxAA.js";import"./chevron-up-C2FeVzre.js";import"./source-icon-D6BzjYPP.js";import"./mail-DG4PKpZy.js";import"./source-utils-B1S3ZHA2.js";import"./arrow-right-BxP3aeA5.js";import"./tabs-IDJWnQD-.js";import"./kpi-tabs-Dty6zMSP.js";import"./post-share-modal-Cfwy2UwD.js";import"./share-modal-CXrYja6o.js";import"./copy-DoNNUZlb.js";import"./get-site-timezone-BDBAcjmq.js";import"./post-helpers-BLitiasQ.js";import"./trash-BKhRqxsX.js";import"./eye-CAqnnfQF.js";import"./a-large-small-BA74vHPp.js";import"./wallet-cards-BjdG5glh.js";import"./undo-2-ClkkOS0O.js";import"./chart-BGwxlD0z.js";import"./_baseAssignValue-Dz1iqdwD.js";import"./index-CNV7fxKZ.js";import"./value-BTdN53H7.js";import"./at-sign-Bf0y-jim.js";import"./underline-_HIgX6e1.js";import"./power-Drkzg1xX.js";import"./hash-DE2OmChI.js";import"./inbox-OthiHvlV.js";import"./minus-DmrVsJ-z.js";import"./pencil-LfMcD0vS.js";import"./square-BbUJwQJi.js";import"./user-round-check-DoaGU2hC.js";import"./repeat-CTM1qAzl.js";import"./reply-DXN16g7W.js";import"./rocket-DLixlWs0.js";import"./send-B71C_46D.js";import"./sprout-DVfG_qhy.js";import"./tags-C3lykbgu.js";import"./thumbs-down-SsjC2lMD.js";import"./user-round-x-CwEKNuU6.js";const ae=()=>{const{range:e,setRange:s}=W();return t.jsxs(Re,{value:`${e}`,onValueChange:a=>{s(Number(a))},children:[t.jsxs(Be,{className:"w-auto",children:[t.jsx(We,{className:"mr-2",size:16,strokeWidth:1.5}),t.jsx(ze,{placeholder:"Select a period"})]}),t.jsx($e,{align:"end",children:t.jsxs(Ke,{children:[t.jsx(Ge,{children:"Period"}),Object.values(re).map(a=>t.jsx(He,{value:`${a.value}`,children:a.name},a.value))]})})]})};Q.registerLocale(ue);const yt=e=>le[e]||Q.getName(e,"en")||"Unknown",Tt=e=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=e.toUpperCase();return s[a]||(e.length>2?e.substring(0,2):e)},oe=({tableHeader:e,data:s,onLocationClick:a})=>t.jsxs(nt,{children:[e&&t.jsxs(it,{children:[t.jsx(se,{children:"Country"}),t.jsx(se,{children:"Visitors"})]}),t.jsx(rt,{children:s.map(n=>{const o=yt(`${n.location}`),i=a&&n.location!=="Unknown",c=n.location?n.location.toLowerCase():"unknown";return t.jsxs(lt,{className:i?"cursor-pointer":"","data-testid":`location-row-${c}`,onClick:i?()=>a(n.location):void 0,children:[t.jsx(ct,{style:{width:`${n.percentage?Math.round(n.percentage*100):0}%`}}),t.jsx(ut,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:t.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:o,children:[t.jsx(Ze,{countryCode:`${Tt(n.location)}`,fallback:t.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:t.jsx(ye.SkullAndBones,{className:"size-3"})})}),t.jsx("div",{className:"truncate font-medium",children:o})]})}),t.jsxs(dt,{children:[t.jsx(mt,{children:Te(Number(n.visits))}),t.jsx(pt,{children:Ee(n.percentage)})]})]},n.location||"unknown")})})]}),Et=({data:e,isLoading:s,onLocationClick:a})=>{const n=e.slice(0,10);return t.jsx(t.Fragment,{children:s?"":t.jsx(t.Fragment,{children:e&&e.length>0&&t.jsxs(de,{className:"group/datalist","data-testid":"locations-card",children:[t.jsxs("div",{className:"flex items-center justify-between p-6",children:[t.jsxs(et,{className:"p-0",children:[t.jsx(tt,{children:"Locations"}),t.jsx(st,{children:"Where are the readers of this post"})]}),t.jsx(xe,{className:"mr-2",children:"Visitors"})]}),t.jsxs(me,{className:"overflow-hidden",children:[t.jsx(Se,{}),t.jsx(oe,{data:n,tableHeader:!1,onLocationClick:a})]}),e.length>10&&t.jsx(at,{children:t.jsxs(je,{children:[t.jsx(Ce,{asChild:!0,children:t.jsxs(ne,{variant:"outline",children:["View all ",t.jsx(ot,{})]})}),t.jsxs(_e,{className:"overflow-y-auto pt-0 sm:max-w-[420px]",children:[t.jsxs(Ne,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[t.jsx(ve,{children:"Top locations"}),t.jsx(Le,{children:"Where are the readers of this post"})]}),t.jsx("div",{className:"group/datalist",children:t.jsx(oe,{data:e,tableHeader:!0,onLocationClick:a})})]})]})})]})})})},pe=e=>!e||e.length===0?ee:$.filter(s=>e.includes(s.value)).reduce((s,a)=>s|a.bit,0)||ee,he=e=>{const s=[];return(e&J.PUBLIC)!==0&&s.push($[0].value),(e&J.FREE)!==0&&s.push($[1].value),(e&J.PAID)!==0&&s.push($[2].value),s.join(",")};Q.registerLocale(ue);const Ft=e=>le[e]||Q.getName(e,"en")||e,Ot=({visits:e})=>t.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:e.toLocaleString()}),kt={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:e=>({value:e||"",label:e||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(e){const s=String(e.location||"");return s!==""&&!ce.includes(s)},transformValue:e=>({value:e,label:Ft(e)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:e=>({value:e,label:e==="mobile-ios"?"iOS":e==="mobile-android"?"Android":e==="desktop"?"Desktop":e==="bot"?"Bot":e})}},Dt=(e,s,a)=>{const n={...a};return e.forEach(o=>{if(o.field===s||o.values.length===0)return;const i=o.values[0];o.field!=="audience"&&(o.field==="source"||o.field==="device"||o.field==="location"||o.field.startsWith("utm_"))&&(n[o.field]=i)}),n},E=(e,s=[],a,n={})=>{const{enabled:o=!0}=n,{statsConfig:i,range:c}=W(),{startDate:x,endDate:h,timezone:p}=ie(c),d=kt[e],m=r.useMemo(()=>{const C=s.find(j=>j.field==="audience");return pe(C?.values)},[s]),S=r.useMemo(()=>{const C={site_uuid:i?.id||"",date_from:G(x),date_to:G(h),timezone:p,member_status:he(m),limit:"50"};return a&&(C.post_uuid=a),Dt(s,e,C)},[i?.id,x,h,p,m,s,e,a]),{data:L,loading:F}=K({endpoint:d?.endpoint||"",statsConfig:i,params:S,enabled:o&&!!d});return{options:r.useMemo(()=>d?(L||[]).filter(j=>d.filterItem?d.filterItem(j):!0).map(j=>{const _=String(j[d.valueKey]??""),P=Number(j.visits)||0,{value:w,label:T}=d.transformValue?d.transformValue(_):{value:_,label:_};return{label:T,value:w,icon:t.jsx(Ot,{visits:P})}}):[],[L,d]),loading:F}};function Mt({filters:e,onChange:s,...a}){const{appSettings:n}=Fe(),{post:o}=W(),i=o?.uuid,[c,x]=r.useState(null),[h,p]=r.useState(!1);r.useEffect(()=>{const f=window.matchMedia("(max-width: 1024px)"),N=M=>{p(M.matches)};return N(f),f.addEventListener("change",N),()=>f.removeEventListener("change",N)},[]);const d=r.useMemo(()=>{const f=[{value:"undefined",label:"Public visitors",icon:t.jsx(Z,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:t.jsx(ke,{className:"text-green"})},{value:"paid",label:"Paid members",icon:t.jsx(De,{className:"text-orange"})}];return n?.paidMembersEnabled?f:f.filter(N=>N.value!=="paid")},[n?.paidMembersEnabled]),m=r.useCallback(f=>{const N=c===f,M=e.some(I=>I.field===f);return N||M},[c,e]),{options:S,loading:L}=E("utm_source",e,i,{enabled:m("utm_source")}),{options:F,loading:A}=E("utm_medium",e,i,{enabled:m("utm_medium")}),{options:C,loading:j}=E("utm_campaign",e,i,{enabled:m("utm_campaign")}),{options:_,loading:P}=E("utm_content",e,i,{enabled:m("utm_content")}),{options:w,loading:T}=E("utm_term",e,i,{enabled:m("utm_term")}),{options:O,loading:B}=E("source",e,i,{enabled:m("source")}),{options:k,loading:V}=E("device",e,i,{enabled:m("device")}),{options:D,loading:z}=E("location",e,i,{enabled:m("location")}),g=r.useMemo(()=>[{value:"is",label:"is"}],[]),q=r.useMemo(()=>{const f=[{key:"utm_source",label:"UTM Source",type:"select",icon:t.jsx(Nt,{className:"size-4"}),placeholder:"Select source",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:S,isLoading:L,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:t.jsx(Ct,{className:"size-4"}),placeholder:"Select medium",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:F,isLoading:A,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:t.jsx(vt,{className:"size-4"}),placeholder:"Select campaign",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:C,isLoading:j,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:t.jsx(_t,{className:"size-4"}),placeholder:"Select content",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:_,isLoading:P,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:t.jsx(Me,{className:"size-4"}),placeholder:"Select term",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:w,isLoading:T,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:t.jsx(Oe,{}),options:d.map(({value:N,label:M,icon:I})=>({value:N,label:M,icon:I})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:t.jsx(Z,{className:"size-4"}),placeholder:"Select source",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:O,isLoading:B,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:t.jsx(xt,{className:"size-4"}),placeholder:"Select device",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:k,isLoading:V,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:t.jsx(St,{className:"size-4"}),placeholder:"Select location",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:D,isLoading:z,searchable:!0,selectedOptionsClassName:"hidden"}]},{group:"UTM parameters",fields:f}]},[S,L,F,A,C,j,_,P,w,T,g,d,O,B,k,V,D,z]),U=e.length>0,Y=r.useCallback(()=>{s&&s([])},[s]);return t.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[t.jsx(ft,{addButtonIcon:t.jsx(Qe,{}),addButtonText:U?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${U&&"[&>button]:border-none"}`,fields:q,filters:e,keyboardShortcut:"f",popoverAlign:h||U?"start":"end",showSearchInput:!1,onActiveFieldChange:x,onChange:s||(()=>{}),...a}),U&&t.jsxs(ne,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:Y,children:[t.jsx(jt,{}),"Clear"]})]})}const H=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],ge="__empty__",fe="%2C";function It(e){const s=new URLSearchParams;return e.forEach(a=>{if(H.includes(a.field)&&a.values.length>0){const n=a.values.map(o=>o===""?ge:String(o).replace(/,/g,fe)).join(",");s.set(a.field,n)}}),s}const X=new Map;function At(e){return X.has(e)||X.set(e,`url-${e}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),X.get(e)}function Pt(e){const s=[],a=new Set(H);return e.forEach((n,o)=>{if(!a.has(o))return;const i=n.split(",").map(c=>c===ge?"":c.replace(new RegExp(fe,"g"),","));if(i.length>0){const c=o==="audience"?"is any of":"is";s.push({id:At(o),field:o,operator:c,values:i})}}),s}function wt(e={}){const[s,a]=Ie(),{onFiltersChange:n}=e,o=r.useRef(!1),i=r.useMemo(()=>Pt(s),[s]);r.useEffect(()=>{!o.current&&n&&n(i)},[i,n]);const c=r.useCallback(h=>{o.current=!0;const p=typeof h=="function"?h(i):h,d=It(p),m=new URLSearchParams(s);H.forEach(S=>{m.delete(S)}),d.forEach((S,L)=>{m.set(L,S)}),a(m,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[i,s,a]),x=r.useCallback(()=>{o.current=!0;const h=new URLSearchParams(s);H.forEach(p=>{h.delete(p)}),a(h,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[s,a]);return{filters:i,setFilters:c,clearFilters:x}}const ws=()=>{const e=Ae(),{postId:s}=Pe(),{statsConfig:a,isLoading:n,range:o,data:i,post:c,isPostLoading:x}=W(),h=r.useRef(null),{filters:p,setFilters:d}=wt(),m=r.useMemo(()=>{const l=p.find(b=>b.field==="audience");return pe(l?.values)},[p]);r.useEffect(()=>{!x&&c?.email_only&&e(`/posts/analytics/${s}`)},[x,c?.email_only,e,s]);const S=r.useMemo(()=>{if(!c?.published_at)return re.ALL_TIME.value;const l=we(c.published_at);return o>l?l:o},[c?.published_at,o]),{startDate:L,endDate:F,timezone:A}=ie(S),C=r.useCallback(()=>{const l=Ue(h.current);l&&l.scrollTo({top:0,behavior:"smooth"})},[]),j=r.useMemo(()=>{const l={};return p.forEach(b=>{const v=b.field,y=b.values;if(v==="audience")return;const u=y&&y.length>0&&y[0]!==null&&y[0]!==void 0,R=v==="source"&&y?.[0]==="";if(u&&(y[0]!==""||R)){const be=String(y[0]);l[v]=be}}),l},[p]),_=r.useCallback((l,b)=>{d(v=>v.find(u=>u.field===l)?v.map(u=>u.field===l?{...u,values:[b]}:u):[...v,bt(l,"is",[b])]),C()},[d,C]),P=r.useCallback(l=>_("location",l),[_]),w=r.useCallback(l=>_("source",l),[_]),T=r.useMemo(()=>{const l={site_uuid:a?.id||"",date_from:G(L),date_to:G(F),timezone:A,member_status:he(m),post_uuid:"",...j};return!x&&c?.uuid?{...l,post_uuid:c.uuid}:l},[x,c,a?.id,L,F,A,m,j]),{data:O,loading:B}=K({endpoint:"api_kpis",statsConfig:a||{id:""},params:T}),{data:k,loading:V}=K({endpoint:"api_top_locations",statsConfig:a||{id:""},params:T}),{data:D,loading:z}=K({endpoint:"api_top_sources",statsConfig:a||{id:""},params:T}),g=r.useMemo(()=>k?.reduce((l,b)=>l+Number(b.visits),0)||0,[k]),q=r.useMemo(()=>D?D.reduce((l,b)=>l+Number(b.visits||0),0):0,[D]),U=i?.url,Y=i?.icon,f=r.useMemo(()=>{const l=k?.map(u=>({location:String(u.location),visits:Number(u.visits),percentage:g>0?Number(u.visits)/g:0,isUnknown:ce.includes(String(u.location))}))||[],b=l.filter(u=>!u.isUnknown),v=l.filter(u=>u.isUnknown),y=v.length>0?[{location:"Unknown",visits:v.reduce((u,R)=>u+R.visits,0),percentage:v.reduce((u,R)=>u+R.percentage,0)}]:[];return[...b,...y]},[k,g]),N=n||x||B||V||z,M=qe(O),I=p.length>0;return t.jsxs(t.Fragment,{children:[t.jsxs(ht,{currentTab:"Web",children:[I&&t.jsx(te,{children:t.jsx(ae,{})}),t.jsxs(te,{className:`${I?"mt-0! [grid-area:subactions] lg:mt-[25px]!":"[grid-area:actions]"}`,children:[t.jsx(Mt,{filters:p,onChange:d}),!I&&t.jsx(ae,{})]})]}),t.jsx(gt,{ref:h,children:N?t.jsx(de,{className:"size-full",variant:"plain",children:t.jsx(me,{className:"size-full items-center justify-center",children:t.jsx(Ve,{})})}):O&&O.length!==0&&M.visits!=="0"?t.jsxs(t.Fragment,{children:[t.jsx(Ye,{data:O,range:S}),t.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[t.jsx(Et,{data:f,isLoading:V,onLocationClick:P}),t.jsx(Je,{data:D,range:S,siteIcon:Y,siteUrl:U,totalVisitors:q,onSourceClick:w})]})]}):t.jsx("div",{className:"grow",children:t.jsx(Lt,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${Xe(o)}`,children:t.jsx(Z,{strokeWidth:1.5})})})})]})};export{ws as default};
|
|
1
|
+
import{d$ as t,aC as xe,bM as Se,bQ as je,bV as Ce,J as ne,bR as _e,bT as Ne,bU as ve,bS as Le,aH as ye,dc as Te,dd as Ee,eD as Fe,ed as r,cm as Oe,aw as Z,ch as ke,ci as De,dq as ie,de as G,c5 as Me,fF as Ie,fq as Ae,fx as Pe,dr as we,dt as Ue,E as Ve}from"./index-C-075SzJ.js";import{u as W,c as re,S as le,A as ee,b as $,a as J,U as ce}from"./post-analytics-context-kPL94Ivz.js";import{S as Re,e as Be,f as ze,a as $e,b as Ke,d as Ge,c as He}from"./select-oE39QRll.js";import{C as We,a as Qe}from"./loader-circle-3HJkQKWf.js";import{b as qe,a as Ye,S as Je,g as Xe}from"./kpis-CQBAGVjP.js";import{F as Ze,c as Q,e as ue}from"./en-D93GVp3o.js";import{C as de,d as et,e as tt,b as st,a as me,c as at,T as ot,j as K,f as te}from"./pagemenu-O7HbsehH.js";import{D as nt,d as it,c as se,b as rt,i as lt,a as ct,e as ut,f as dt,g as mt,h as pt}from"./data-list-CzSc7z-2.js";import{a as ht,P as gt}from"./post-analytics-header-CpMOozq-.js";import{h as ft,i as bt}from"./filters-C_BSQgb7.js";import{i as xt,g as St,F as jt,S as Ct,T as _t}from"./gh-chart-pNHAbeQn.js";import{e as Nt}from"./upload-D52l7HIb.js";import{F as vt}from"./pin-BNs-JdQ3.js";import{E as Lt}from"./empty-indicator-Dxg05yWg.js";import"./posts-DODOCB1E.js";import"./chevron-up-BQ6fOpFR.js";import"./source-icon-CzTNLO6j.js";import"./mail-DvrqP73n.js";import"./source-utils-B1S3ZHA2.js";import"./arrow-right-BF77Yx73.js";import"./tabs-BZosOk0o.js";import"./kpi-tabs-DxbvMkIU.js";import"./post-share-modal-F0dobdhF.js";import"./share-modal-BxIh7i7o.js";import"./copy-r1LFsU75.js";import"./get-site-timezone-BDBAcjmq.js";import"./post-helpers-BLitiasQ.js";import"./trash-DNXRsBf0.js";import"./eye-6POPPpTw.js";import"./a-large-small-D0RF_WS9.js";import"./wallet-cards-CtLF01jQ.js";import"./undo-2-C2ntNJKC.js";import"./chart-CP2N9ZC-.js";import"./_baseAssignValue-BjUm4QeA.js";import"./index-BuhMgn5c.js";import"./value-BTdN53H7.js";import"./at-sign-DhJF3n_V.js";import"./underline-HXWuVCAi.js";import"./power-BZ7BM82m.js";import"./hash-BCTATV5W.js";import"./inbox-rE3c5suT.js";import"./minus-DJIePlnU.js";import"./pencil-CknTbJeE.js";import"./square-CJZsjE-3.js";import"./user-round-check-C0GdT99c.js";import"./repeat-DHMCQMCA.js";import"./reply-DoLURZi2.js";import"./rocket-BDH89dZr.js";import"./send-QgRN_yRy.js";import"./sprout-B2fN41p-.js";import"./tags-DZukMyuU.js";import"./thumbs-down-CZTzyz7D.js";import"./user-round-x-CVCvxuUG.js";const ae=()=>{const{range:e,setRange:s}=W();return t.jsxs(Re,{value:`${e}`,onValueChange:a=>{s(Number(a))},children:[t.jsxs(Be,{className:"w-auto",children:[t.jsx(We,{className:"mr-2",size:16,strokeWidth:1.5}),t.jsx(ze,{placeholder:"Select a period"})]}),t.jsx($e,{align:"end",children:t.jsxs(Ke,{children:[t.jsx(Ge,{children:"Period"}),Object.values(re).map(a=>t.jsx(He,{value:`${a.value}`,children:a.name},a.value))]})})]})};Q.registerLocale(ue);const yt=e=>le[e]||Q.getName(e,"en")||"Unknown",Tt=e=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=e.toUpperCase();return s[a]||(e.length>2?e.substring(0,2):e)},oe=({tableHeader:e,data:s,onLocationClick:a})=>t.jsxs(nt,{children:[e&&t.jsxs(it,{children:[t.jsx(se,{children:"Country"}),t.jsx(se,{children:"Visitors"})]}),t.jsx(rt,{children:s.map(n=>{const o=yt(`${n.location}`),i=a&&n.location!=="Unknown",c=n.location?n.location.toLowerCase():"unknown";return t.jsxs(lt,{className:i?"cursor-pointer":"","data-testid":`location-row-${c}`,onClick:i?()=>a(n.location):void 0,children:[t.jsx(ct,{style:{width:`${n.percentage?Math.round(n.percentage*100):0}%`}}),t.jsx(ut,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:t.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:o,children:[t.jsx(Ze,{countryCode:`${Tt(n.location)}`,fallback:t.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:t.jsx(ye.SkullAndBones,{className:"size-3"})})}),t.jsx("div",{className:"truncate font-medium",children:o})]})}),t.jsxs(dt,{children:[t.jsx(mt,{children:Te(Number(n.visits))}),t.jsx(pt,{children:Ee(n.percentage)})]})]},n.location||"unknown")})})]}),Et=({data:e,isLoading:s,onLocationClick:a})=>{const n=e.slice(0,10);return t.jsx(t.Fragment,{children:s?"":t.jsx(t.Fragment,{children:e&&e.length>0&&t.jsxs(de,{className:"group/datalist","data-testid":"locations-card",children:[t.jsxs("div",{className:"flex items-center justify-between p-6",children:[t.jsxs(et,{className:"p-0",children:[t.jsx(tt,{children:"Locations"}),t.jsx(st,{children:"Where are the readers of this post"})]}),t.jsx(xe,{className:"mr-2",children:"Visitors"})]}),t.jsxs(me,{className:"overflow-hidden",children:[t.jsx(Se,{}),t.jsx(oe,{data:n,tableHeader:!1,onLocationClick:a})]}),e.length>10&&t.jsx(at,{children:t.jsxs(je,{children:[t.jsx(Ce,{asChild:!0,children:t.jsxs(ne,{variant:"outline",children:["View all ",t.jsx(ot,{})]})}),t.jsxs(_e,{className:"overflow-y-auto pt-0 sm:max-w-[420px]",children:[t.jsxs(Ne,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[t.jsx(ve,{children:"Top locations"}),t.jsx(Le,{children:"Where are the readers of this post"})]}),t.jsx("div",{className:"group/datalist",children:t.jsx(oe,{data:e,tableHeader:!0,onLocationClick:a})})]})]})})]})})})},pe=e=>!e||e.length===0?ee:$.filter(s=>e.includes(s.value)).reduce((s,a)=>s|a.bit,0)||ee,he=e=>{const s=[];return(e&J.PUBLIC)!==0&&s.push($[0].value),(e&J.FREE)!==0&&s.push($[1].value),(e&J.PAID)!==0&&s.push($[2].value),s.join(",")};Q.registerLocale(ue);const Ft=e=>le[e]||Q.getName(e,"en")||e,Ot=({visits:e})=>t.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:e.toLocaleString()}),kt={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:e=>({value:e||"",label:e||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(e){const s=String(e.location||"");return s!==""&&!ce.includes(s)},transformValue:e=>({value:e,label:Ft(e)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:e=>({value:e,label:e==="mobile-ios"?"iOS":e==="mobile-android"?"Android":e==="desktop"?"Desktop":e==="bot"?"Bot":e})}},Dt=(e,s,a)=>{const n={...a};return e.forEach(o=>{if(o.field===s||o.values.length===0)return;const i=o.values[0];o.field!=="audience"&&(o.field==="source"||o.field==="device"||o.field==="location"||o.field.startsWith("utm_"))&&(n[o.field]=i)}),n},E=(e,s=[],a,n={})=>{const{enabled:o=!0}=n,{statsConfig:i,range:c}=W(),{startDate:x,endDate:h,timezone:p}=ie(c),d=kt[e],m=r.useMemo(()=>{const C=s.find(j=>j.field==="audience");return pe(C?.values)},[s]),S=r.useMemo(()=>{const C={site_uuid:i?.id||"",date_from:G(x),date_to:G(h),timezone:p,member_status:he(m),limit:"50"};return a&&(C.post_uuid=a),Dt(s,e,C)},[i?.id,x,h,p,m,s,e,a]),{data:L,loading:F}=K({endpoint:d?.endpoint||"",statsConfig:i,params:S,enabled:o&&!!d});return{options:r.useMemo(()=>d?(L||[]).filter(j=>d.filterItem?d.filterItem(j):!0).map(j=>{const _=String(j[d.valueKey]??""),P=Number(j.visits)||0,{value:w,label:T}=d.transformValue?d.transformValue(_):{value:_,label:_};return{label:T,value:w,icon:t.jsx(Ot,{visits:P})}}):[],[L,d]),loading:F}};function Mt({filters:e,onChange:s,...a}){const{appSettings:n}=Fe(),{post:o}=W(),i=o?.uuid,[c,x]=r.useState(null),[h,p]=r.useState(!1);r.useEffect(()=>{const f=window.matchMedia("(max-width: 1024px)"),N=M=>{p(M.matches)};return N(f),f.addEventListener("change",N),()=>f.removeEventListener("change",N)},[]);const d=r.useMemo(()=>{const f=[{value:"undefined",label:"Public visitors",icon:t.jsx(Z,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:t.jsx(ke,{className:"text-green"})},{value:"paid",label:"Paid members",icon:t.jsx(De,{className:"text-orange"})}];return n?.paidMembersEnabled?f:f.filter(N=>N.value!=="paid")},[n?.paidMembersEnabled]),m=r.useCallback(f=>{const N=c===f,M=e.some(I=>I.field===f);return N||M},[c,e]),{options:S,loading:L}=E("utm_source",e,i,{enabled:m("utm_source")}),{options:F,loading:A}=E("utm_medium",e,i,{enabled:m("utm_medium")}),{options:C,loading:j}=E("utm_campaign",e,i,{enabled:m("utm_campaign")}),{options:_,loading:P}=E("utm_content",e,i,{enabled:m("utm_content")}),{options:w,loading:T}=E("utm_term",e,i,{enabled:m("utm_term")}),{options:O,loading:B}=E("source",e,i,{enabled:m("source")}),{options:k,loading:V}=E("device",e,i,{enabled:m("device")}),{options:D,loading:z}=E("location",e,i,{enabled:m("location")}),g=r.useMemo(()=>[{value:"is",label:"is"}],[]),q=r.useMemo(()=>{const f=[{key:"utm_source",label:"UTM Source",type:"select",icon:t.jsx(Nt,{className:"size-4"}),placeholder:"Select source",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:S,isLoading:L,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:t.jsx(Ct,{className:"size-4"}),placeholder:"Select medium",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:F,isLoading:A,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:t.jsx(vt,{className:"size-4"}),placeholder:"Select campaign",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:C,isLoading:j,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:t.jsx(_t,{className:"size-4"}),placeholder:"Select content",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:_,isLoading:P,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:t.jsx(Me,{className:"size-4"}),placeholder:"Select term",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:w,isLoading:T,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:t.jsx(Oe,{}),options:d.map(({value:N,label:M,icon:I})=>({value:N,label:M,icon:I})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:t.jsx(Z,{className:"size-4"}),placeholder:"Select source",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:O,isLoading:B,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:t.jsx(xt,{className:"size-4"}),placeholder:"Select device",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:k,isLoading:V,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:t.jsx(St,{className:"size-4"}),placeholder:"Select location",operators:g,defaultOperator:"is",hideOperatorSelect:!0,options:D,isLoading:z,searchable:!0,selectedOptionsClassName:"hidden"}]},{group:"UTM parameters",fields:f}]},[S,L,F,A,C,j,_,P,w,T,g,d,O,B,k,V,D,z]),U=e.length>0,Y=r.useCallback(()=>{s&&s([])},[s]);return t.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[t.jsx(ft,{addButtonIcon:t.jsx(Qe,{}),addButtonText:U?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${U&&"[&>button]:border-none"}`,fields:q,filters:e,keyboardShortcut:"f",popoverAlign:h||U?"start":"end",showSearchInput:!1,onActiveFieldChange:x,onChange:s||(()=>{}),...a}),U&&t.jsxs(ne,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:Y,children:[t.jsx(jt,{}),"Clear"]})]})}const H=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],ge="__empty__",fe="%2C";function It(e){const s=new URLSearchParams;return e.forEach(a=>{if(H.includes(a.field)&&a.values.length>0){const n=a.values.map(o=>o===""?ge:String(o).replace(/,/g,fe)).join(",");s.set(a.field,n)}}),s}const X=new Map;function At(e){return X.has(e)||X.set(e,`url-${e}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),X.get(e)}function Pt(e){const s=[],a=new Set(H);return e.forEach((n,o)=>{if(!a.has(o))return;const i=n.split(",").map(c=>c===ge?"":c.replace(new RegExp(fe,"g"),","));if(i.length>0){const c=o==="audience"?"is any of":"is";s.push({id:At(o),field:o,operator:c,values:i})}}),s}function wt(e={}){const[s,a]=Ie(),{onFiltersChange:n}=e,o=r.useRef(!1),i=r.useMemo(()=>Pt(s),[s]);r.useEffect(()=>{!o.current&&n&&n(i)},[i,n]);const c=r.useCallback(h=>{o.current=!0;const p=typeof h=="function"?h(i):h,d=It(p),m=new URLSearchParams(s);H.forEach(S=>{m.delete(S)}),d.forEach((S,L)=>{m.set(L,S)}),a(m,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[i,s,a]),x=r.useCallback(()=>{o.current=!0;const h=new URLSearchParams(s);H.forEach(p=>{h.delete(p)}),a(h,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[s,a]);return{filters:i,setFilters:c,clearFilters:x}}const ws=()=>{const e=Ae(),{postId:s}=Pe(),{statsConfig:a,isLoading:n,range:o,data:i,post:c,isPostLoading:x}=W(),h=r.useRef(null),{filters:p,setFilters:d}=wt(),m=r.useMemo(()=>{const l=p.find(b=>b.field==="audience");return pe(l?.values)},[p]);r.useEffect(()=>{!x&&c?.email_only&&e(`/posts/analytics/${s}`)},[x,c?.email_only,e,s]);const S=r.useMemo(()=>{if(!c?.published_at)return re.ALL_TIME.value;const l=we(c.published_at);return o>l?l:o},[c?.published_at,o]),{startDate:L,endDate:F,timezone:A}=ie(S),C=r.useCallback(()=>{const l=Ue(h.current);l&&l.scrollTo({top:0,behavior:"smooth"})},[]),j=r.useMemo(()=>{const l={};return p.forEach(b=>{const v=b.field,y=b.values;if(v==="audience")return;const u=y&&y.length>0&&y[0]!==null&&y[0]!==void 0,R=v==="source"&&y?.[0]==="";if(u&&(y[0]!==""||R)){const be=String(y[0]);l[v]=be}}),l},[p]),_=r.useCallback((l,b)=>{d(v=>v.find(u=>u.field===l)?v.map(u=>u.field===l?{...u,values:[b]}:u):[...v,bt(l,"is",[b])]),C()},[d,C]),P=r.useCallback(l=>_("location",l),[_]),w=r.useCallback(l=>_("source",l),[_]),T=r.useMemo(()=>{const l={site_uuid:a?.id||"",date_from:G(L),date_to:G(F),timezone:A,member_status:he(m),post_uuid:"",...j};return!x&&c?.uuid?{...l,post_uuid:c.uuid}:l},[x,c,a?.id,L,F,A,m,j]),{data:O,loading:B}=K({endpoint:"api_kpis",statsConfig:a||{id:""},params:T}),{data:k,loading:V}=K({endpoint:"api_top_locations",statsConfig:a||{id:""},params:T}),{data:D,loading:z}=K({endpoint:"api_top_sources",statsConfig:a||{id:""},params:T}),g=r.useMemo(()=>k?.reduce((l,b)=>l+Number(b.visits),0)||0,[k]),q=r.useMemo(()=>D?D.reduce((l,b)=>l+Number(b.visits||0),0):0,[D]),U=i?.url,Y=i?.icon,f=r.useMemo(()=>{const l=k?.map(u=>({location:String(u.location),visits:Number(u.visits),percentage:g>0?Number(u.visits)/g:0,isUnknown:ce.includes(String(u.location))}))||[],b=l.filter(u=>!u.isUnknown),v=l.filter(u=>u.isUnknown),y=v.length>0?[{location:"Unknown",visits:v.reduce((u,R)=>u+R.visits,0),percentage:v.reduce((u,R)=>u+R.percentage,0)}]:[];return[...b,...y]},[k,g]),N=n||x||B||V||z,M=qe(O),I=p.length>0;return t.jsxs(t.Fragment,{children:[t.jsxs(ht,{currentTab:"Web",children:[I&&t.jsx(te,{children:t.jsx(ae,{})}),t.jsxs(te,{className:`${I?"mt-0! [grid-area:subactions] lg:mt-[25px]!":"[grid-area:actions]"}`,children:[t.jsx(Mt,{filters:p,onChange:d}),!I&&t.jsx(ae,{})]})]}),t.jsx(gt,{ref:h,children:N?t.jsx(de,{className:"size-full",variant:"plain",children:t.jsx(me,{className:"size-full items-center justify-center",children:t.jsx(Ve,{})})}):O&&O.length!==0&&M.visits!=="0"?t.jsxs(t.Fragment,{children:[t.jsx(Ye,{data:O,range:S}),t.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[t.jsx(Et,{data:f,isLoading:V,onLocationClick:P}),t.jsx(Je,{data:D,range:S,siteIcon:Y,siteUrl:U,totalVisitors:q,onSourceClick:w})]})]}):t.jsx("div",{className:"grow",children:t.jsx(Lt,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${Xe(o)}`,children:t.jsx(Z,{strokeWidth:1.5})})})})]})};export{ws as default};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<link rel="stylesheet" href="./assets/vendor-3bf602dfa6463c3400ffd81697767274.css">
|
|
5
5
|
<link rel="stylesheet" href="./assets/ghost-c287c7a9321fcab0857c0211fc8c9517.css">
|
|
6
|
-
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%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.
|
|
6
|
+
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%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.48%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%2262fed62fc3%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22e130ce92af%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%22dcb7896a99%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%22971b80f4d3%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22f33a69ae6a%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
|
|
7
7
|
|
|
8
8
|
<meta charset="UTF-8" />
|
|
9
9
|
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
|
|
21
21
|
<link rel="shortcut icon" href="./assets/favicon-C_q1KHzv.ico" />
|
|
22
22
|
<link rel="apple-touch-icon" href="./assets/apple-touch-icon-DhO18_4B.png" />
|
|
23
|
-
<script type="module" crossorigin src="./assets/index-
|
|
24
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
23
|
+
<script type="module" crossorigin src="./assets/index-C-075SzJ.js"></script>
|
|
24
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BNtzAd7H.css">
|
|
25
25
|
</head>
|
|
26
26
|
<body class="react-admin">
|
|
27
27
|
<div id="ember-alerts-wormhole"></div>
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
<div id="ember-notifications-wormhole"></div>
|
|
43
43
|
<script src="./assets/vendor-df57a00eefcc111c31b42ed642f78922.js"></script>
|
|
44
44
|
<script src="./assets/chunk.534.117d072702e65df59d49.js"></script>
|
|
45
|
-
<script src="./assets/chunk.
|
|
46
|
-
<script src="./assets/chunk.524.
|
|
47
|
-
<script src="./assets/ghost-
|
|
45
|
+
<script src="./assets/chunk.98.69968e0f393d82c2949c.js"></script>
|
|
46
|
+
<script src="./assets/chunk.524.ad4560630d4d62fbceb5.js"></script>
|
|
47
|
+
<script src="./assets/ghost-3f5b3569e0beec61266cb74077677fbc.js"></script>
|
|
48
48
|
</body>
|
|
49
49
|
</html>
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
// Usage: `{{ghost_foot}}`
|
|
3
3
|
//
|
|
4
4
|
// Outputs scripts and other assets at the bottom of a Ghost theme
|
|
5
|
-
const {settingsCache} = require('../services/proxy');
|
|
6
|
-
const {SafeString} = require('../services/handlebars');
|
|
5
|
+
const {settingsCache, labs} = require('../services/proxy');
|
|
6
|
+
const {SafeString, templates, hbs} = require('../services/handlebars');
|
|
7
7
|
const _ = require('lodash');
|
|
8
8
|
|
|
9
|
+
const createFrame = hbs.handlebars.createFrame;
|
|
10
|
+
|
|
9
11
|
// We use the name ghost_foot to match the helper for consistency:
|
|
10
12
|
module.exports = function ghost_foot(options) { // eslint-disable-line camelcase
|
|
11
13
|
const foot = [];
|
|
@@ -26,5 +28,13 @@ module.exports = function ghost_foot(options) { // eslint-disable-line camelcase
|
|
|
26
28
|
foot.push(tagCodeinjection);
|
|
27
29
|
}
|
|
28
30
|
|
|
31
|
+
// Reader-side gift toast. `_gift` is set by the entry controller only on a
|
|
32
|
+
// verified gift render, so it shows on gift reads and never on canonical
|
|
33
|
+
// URLs. Overridable: a theme can supply its own `partials/gift-toast.hbs`.
|
|
34
|
+
if (labs.isSet('giftLinks') && options.data._gift) {
|
|
35
|
+
const data = createFrame(options.data);
|
|
36
|
+
foot.push(templates.execute('gift-toast', this, {data}));
|
|
37
|
+
}
|
|
38
|
+
|
|
29
39
|
return new SafeString(foot.join(' ').trim());
|
|
30
40
|
};
|
|
@@ -33,7 +33,7 @@ const buildApiOptions = function buildApiOptions(options, post) {
|
|
|
33
33
|
skipPagination: true,
|
|
34
34
|
// This line deliberately uses double quotes because GQL cannot handle either double quotes
|
|
35
35
|
// or escaped singles, see TryGhost/GQL#34
|
|
36
|
-
filter: "slug:-" + slug + "+published_at:" + op + "'" + publishedAt + "'",
|
|
36
|
+
filter: "slug:-" + slug + "+published_at:" + op + "'" + publishedAt + "'",
|
|
37
37
|
context: {member: options.data.member}
|
|
38
38
|
};
|
|
39
39
|
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
.gh-gift-toast {
|
|
3
|
+
--gh-gift-toast-bottom: 32px;
|
|
4
|
+
--gh-gift-toast-accent: {{@site.accent_color}};
|
|
5
|
+
|
|
6
|
+
position: fixed;
|
|
7
|
+
bottom: var(--gh-gift-toast-bottom);
|
|
8
|
+
left: 50%;
|
|
9
|
+
transform: translateX(-50%);
|
|
10
|
+
z-index: 99998;
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: 12px;
|
|
14
|
+
max-width: min(560px, calc(100vw - 32px));
|
|
15
|
+
padding: 16px;
|
|
16
|
+
background: #ffffff;
|
|
17
|
+
color: #15171a;
|
|
18
|
+
border-radius: 16px;
|
|
19
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 8px 24px rgba(0, 0, 0, 0.08);
|
|
20
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
21
|
+
font-size: 13px;
|
|
22
|
+
line-height: 1.4;
|
|
23
|
+
transition: opacity 200ms ease, transform 200ms ease;
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.gh-gift-toast-icon {
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: center;
|
|
32
|
+
width: 36px;
|
|
33
|
+
height: 36px;
|
|
34
|
+
border-radius: 50%;
|
|
35
|
+
/* Neutral tint fallback for browsers without color-mix() support */
|
|
36
|
+
background: rgba(0, 0, 0, 0.05);
|
|
37
|
+
background: color-mix(in srgb, var(--gh-gift-toast-accent) 15%, transparent);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.gh-gift-toast-icon svg {
|
|
41
|
+
width: 18px;
|
|
42
|
+
height: 18px;
|
|
43
|
+
color: var(--gh-gift-toast-accent);
|
|
44
|
+
fill: var(--gh-gift-toast-accent);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.gh-gift-toast-text {
|
|
48
|
+
flex: 1;
|
|
49
|
+
min-width: 0;
|
|
50
|
+
color: #15171a;
|
|
51
|
+
font-weight: 400;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.gh-gift-toast-close {
|
|
55
|
+
flex-shrink: 0;
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
width: 24px;
|
|
60
|
+
height: 24px;
|
|
61
|
+
padding: 0;
|
|
62
|
+
border: none;
|
|
63
|
+
border-radius: 50%;
|
|
64
|
+
background: #f4f5f6;
|
|
65
|
+
color: #5b6573;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
transition: background 120ms ease, color 120ms ease;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.gh-gift-toast-close:hover {
|
|
71
|
+
background: #e8eaed;
|
|
72
|
+
color: #15171a;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.gh-gift-toast-close svg {
|
|
76
|
+
width: 12px;
|
|
77
|
+
height: 12px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.gh-gift-toast.is-dismissed {
|
|
81
|
+
opacity: 0;
|
|
82
|
+
transform: translate(-50%, 16px);
|
|
83
|
+
pointer-events: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@media (max-width: 600px) {
|
|
87
|
+
.gh-gift-toast {
|
|
88
|
+
width: calc(100vw - 32px);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@media (prefers-reduced-motion: reduce) {
|
|
93
|
+
.gh-gift-toast {
|
|
94
|
+
transition: none;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
<aside id="gh-gift-toast" class="gh-gift-toast" role="status" aria-live="polite">
|
|
99
|
+
<div class="gh-gift-toast-icon" aria-hidden="true">
|
|
100
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
101
|
+
<path d="M12 21.488H4v-10.75a.75.75 0 0 0-1.5 0v10.75c0 .914.586 1.5 1.5 1.5h8a.75.75 0 0 0 0-1.5z"/>
|
|
102
|
+
<path d="M12.25 21.488h8v-10.75a.75.75 0 0 1 1.5 0v10.75c0 .914-.586 1.5-1.5 1.5h-8a.75.75 0 0 1 0-1.5z"/>
|
|
103
|
+
<path d="M2.682 6.238h18.636c1.004 0 1.682.546 1.682 1.5v2.25c0 .954-.678 1.5-1.682 1.5H2.682c-1.004 0-1.682-.546-1.682-1.5v-2.25c0-.954.678-1.5 1.682-1.5zm0 1.5c-.239 0-.182-.046-.182 0v2.25c0 .046-.057 0 .182 0h18.636c.239 0 .182.046.182 0v-2.25c0-.046.057 0-.182 0H2.682z"/>
|
|
104
|
+
<path d="M12.75 22.238V6.988a.75.75 0 0 0-1.5 0v15.25a.75.75 0 0 0 1.5 0z"/>
|
|
105
|
+
<path d="M3.5 17.25h17a.75.75 0 0 0 0-1.5h-17a.75.75 0 0 0 0 1.5zM7.271 5.457a12.506 12.506 0 0 0 4.51 2.255.75.75 0 0 0 .92-.918 12.473 12.473 0 0 0-2.256-4.511C8.947.777 7.705.657 6.671 1.683c-1.033 1.027-.908 2.273.533 3.714l.067.06zm.458-2.709c.397-.395.702-.366 1.596.528.587.755 1.079 1.6 1.456 2.516a11.002 11.002 0 0 1-2.549-1.487c-.865-.872-.89-1.173-.503-1.557z"/>
|
|
106
|
+
<path d="m16.796 5.397-.067.06a12.5 12.5 0 0 1-4.512 2.255.75.75 0 0 1-.918-.918 12.502 12.502 0 0 1 2.315-4.579c1.44-1.438 2.681-1.558 3.715-.531 1.033 1.026.908 2.272-.533 3.713zm-.525-2.649c-.397-.395-.702-.366-1.537.46a11.024 11.024 0 0 0-1.515 2.584 11.038 11.038 0 0 0 2.549-1.487c.865-.872.89-1.173.503-1.557z"/>
|
|
107
|
+
</svg>
|
|
108
|
+
</div>
|
|
109
|
+
<span class="gh-gift-toast-text">{{t "You've been gifted access to this post."}}</span>
|
|
110
|
+
<button type="button" class="gh-gift-toast-close" aria-label="{{t "Dismiss"}}">
|
|
111
|
+
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
|
|
112
|
+
<path d="M3 3 L13 13 M13 3 L3 13"/>
|
|
113
|
+
</svg>
|
|
114
|
+
</button>
|
|
115
|
+
</aside>
|
|
116
|
+
<script>
|
|
117
|
+
(function(){
|
|
118
|
+
var toast = document.getElementById('gh-gift-toast');
|
|
119
|
+
if (!toast) return;
|
|
120
|
+
|
|
121
|
+
var closeBtn = toast.querySelector('.gh-gift-toast-close');
|
|
122
|
+
if (closeBtn) {
|
|
123
|
+
closeBtn.addEventListener('click', function(){
|
|
124
|
+
toast.classList.add('is-dismissed');
|
|
125
|
+
// Defer removal so the fade/slide-out transition runs to completion.
|
|
126
|
+
setTimeout(function(){ if (toast.parentNode) toast.parentNode.removeChild(toast); }, 260);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
})();
|
|
130
|
+
</script>
|
|
@@ -70,6 +70,15 @@ module.exports = {
|
|
|
70
70
|
|
|
71
71
|
// Labs utils for enabling/disabling helpers
|
|
72
72
|
labs: require('../../shared/labs'),
|
|
73
|
+
// Gift links service — reached through this seam so the entry controller
|
|
74
|
+
// doesn't require a server module directly.
|
|
75
|
+
giftLinks: require('../../server/services/gift-links'),
|
|
76
|
+
// Paid-member shim for gift-link reads (shared with previews). Lazy getter so
|
|
77
|
+
// the members service resolves at call time, avoiding boot-time require-order
|
|
78
|
+
// coupling.
|
|
79
|
+
get createPaidMemberShim() {
|
|
80
|
+
return require('../../server/services/members').createPaidMemberShim;
|
|
81
|
+
},
|
|
73
82
|
// URGH... Yuk (unhelpful comment :D)
|
|
74
83
|
urlService: require('../../server/services/url'),
|
|
75
84
|
urlUtils: require('../../shared/url-utils')
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = buildCanonicalUrl;
|
|
4
|
+
const node_url_1 = require("node:url");
|
|
5
|
+
/**
|
|
6
|
+
* Build the entry's canonical URL (its own pathname) carrying over the current
|
|
7
|
+
* request's query string. Shared by the permalink and markdown-url redirects.
|
|
8
|
+
*/
|
|
9
|
+
function buildCanonicalUrl(req, entry) {
|
|
10
|
+
return (0, node_url_1.format)({
|
|
11
|
+
pathname: (0, node_url_1.parse)(entry.url).pathname,
|
|
12
|
+
search: (0, node_url_1.parse)(req.originalUrl).search
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {format, parse} from 'node:url';
|
|
2
|
+
import type {Request} from 'express';
|
|
3
|
+
import type {Entry} from '../entry';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Build the entry's canonical URL (its own pathname) carrying over the current
|
|
7
|
+
* request's query string. Shared by the permalink and markdown-url redirects.
|
|
8
|
+
*/
|
|
9
|
+
export default function buildCanonicalUrl(req: Request, entry: Entry): string {
|
|
10
|
+
return format({
|
|
11
|
+
pathname: parse(entry.url).pathname,
|
|
12
|
+
search: parse(req.originalUrl).search
|
|
13
|
+
});
|
|
14
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isGiftRequest = isGiftRequest;
|
|
4
|
+
exports.serveGiftRequest = serveGiftRequest;
|
|
5
|
+
const node_url_1 = require("node:url");
|
|
6
|
+
const dataService = require('../../../data');
|
|
7
|
+
const renderer = require('../../../rendering');
|
|
8
|
+
const proxy = require('../../../proxy');
|
|
9
|
+
const hbs = require('../../../theme-engine/engine');
|
|
10
|
+
/**
|
|
11
|
+
* Build this request's URL with `?gift` removed, preserving path, subdirectory
|
|
12
|
+
* and other query params. Rebuilt from req.query (qs-parsed) so bracket forms
|
|
13
|
+
* like `?gift[]=x` are dropped too — otherwise the stripped redirect would loop.
|
|
14
|
+
*/
|
|
15
|
+
function strippedGiftUrl(req) {
|
|
16
|
+
const query = { ...req.query };
|
|
17
|
+
delete query.gift;
|
|
18
|
+
return (0, node_url_1.format)({ pathname: (0, node_url_1.parse)(req.originalUrl).pathname, query });
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Flag the render as a gift view so `ghost_foot` injects the toast. Stores the
|
|
22
|
+
* token (not just a boolean) for a later analytics pass-through. Internal flag,
|
|
23
|
+
* not a public theme API.
|
|
24
|
+
*/
|
|
25
|
+
function setGiftTemplateFlag(res, token) {
|
|
26
|
+
const localTemplateOptions = hbs.getLocalTemplateOptions(res.locals);
|
|
27
|
+
hbs.updateLocalTemplateOptions(res.locals, {
|
|
28
|
+
...localTemplateOptions,
|
|
29
|
+
data: {
|
|
30
|
+
...localTemplateOptions.data,
|
|
31
|
+
_gift: token
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether this request is an attempt to use a gift link: the feature is enabled
|
|
37
|
+
* and a `?gift` param is present (in any form).
|
|
38
|
+
*/
|
|
39
|
+
function isGiftRequest(req) {
|
|
40
|
+
return proxy.labs.isSet('giftLinks') && req.query.gift !== undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The gift token from the request, or null. A non-string form (e.g. `?gift[]=x`)
|
|
44
|
+
* isn't a token.
|
|
45
|
+
*/
|
|
46
|
+
function giftToken(req) {
|
|
47
|
+
return typeof req.query.gift === 'string' ? req.query.gift : null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Re-read the entry as a paid-member shim (the grant `/p/` previews use) to
|
|
51
|
+
* reveal gated content, then render it. The shim is passed as the read context
|
|
52
|
+
* only, so it never leaks into res.locals/@member.
|
|
53
|
+
*/
|
|
54
|
+
async function renderUnlocked(req, res, token) {
|
|
55
|
+
const giftLookup = await dataService.entryLookup(req.path, res.routerOptions, {
|
|
56
|
+
...res.locals,
|
|
57
|
+
member: await proxy.createPaidMemberShim()
|
|
58
|
+
});
|
|
59
|
+
// Don't index the unlocked variant; keep the token out of the Referer on
|
|
60
|
+
// sub-resource requests.
|
|
61
|
+
res.set('X-Robots-Tag', 'noindex');
|
|
62
|
+
res.set('Referrer-Policy', 'no-referrer');
|
|
63
|
+
setGiftTemplateFlag(res, token);
|
|
64
|
+
return renderer.renderEntry(req, res)(giftLookup.entry);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* CASE: gift-link reader access. A gift link is the post's real URL plus
|
|
68
|
+
* `?gift=TOKEN`; the token is verified against the entry living at this URL, so
|
|
69
|
+
* a token for one post can never unlock another. A valid token unlocks the
|
|
70
|
+
* entry; anything else strips `?gift` and 301s to the clean URL.
|
|
71
|
+
*/
|
|
72
|
+
async function serveGiftRequest(req, res, entry) {
|
|
73
|
+
const token = giftToken(req);
|
|
74
|
+
if (token && await proxy.giftLinks.service.isValidTokenForPost(token, entry.id)) {
|
|
75
|
+
return renderUnlocked(req, res, token);
|
|
76
|
+
}
|
|
77
|
+
// Invalid token, or one for a different post: strip it and 301 to the clean
|
|
78
|
+
// URL (the page still renders, paywalled). res.redirect, not
|
|
79
|
+
// urlUtils.redirect301, so the no-store set for ?gift requests survives and
|
|
80
|
+
// the token-bearing redirect isn't cached.
|
|
81
|
+
return res.redirect(301, strippedGiftUrl(req));
|
|
82
|
+
}
|