ghost 6.18.2 → 6.19.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/components/tryghost-i18n-6.19.0.tgz +0 -0
- package/components/tryghost-parse-email-address-6.19.0.tgz +0 -0
- package/core/built/admin/assets/{PolarAngleAxis-DALH8FDm.js → PolarAngleAxis-CGprvq8M.js} +1 -1
- package/core/built/admin/assets/{_baseAssignValue-D_UsvJRN.js → _baseAssignValue-Bwn07Ln5.js} +1 -1
- package/core/built/admin/assets/{a-large-small-DVyx4GMu.js → a-large-small-p58xibEK.js} +1 -1
- 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-DBrulgE8.mjs → code-editor-view-DCKvO1TY.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-DgGwb1L-.mjs → index-BxWVtVnD.mjs} +6 -6
- package/core/built/admin/assets/admin-x-settings/{index-Cypgljb3.mjs → index-DyZIONe1.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-CsGHbqSU.mjs → index-HfMJcj2U.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{modals-rdo7i0D3.mjs → modals-CIiqfKY0.mjs} +7593 -7509
- package/core/built/admin/assets/{at-sign-CGNkBrZS.js → at-sign-BZPuAx5m.js} +1 -1
- package/core/built/admin/assets/audience-Cy9gLIa9.js +1 -0
- package/core/built/admin/assets/{avatar-flipboard-jqr9Aapd.js → avatar-flipboard-CLmWb5Xn.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-C2749SVt.js → bluesky-sharing-BHt0oiii.js} +1 -1
- package/core/built/admin/assets/{chart-BAQCVPCH.js → chart--RFLGIL4.js} +1 -1
- package/core/built/admin/assets/{chunk.524.428356d01feabbc7b932.js → chunk.524.5c5c3f3273a86d1d9913.js} +7 -7
- package/core/built/admin/assets/{chunk.582.b8b41ba720f49d724992.js → chunk.582.e6c787cdf7e6de7819e0.js} +9 -9
- package/core/built/admin/assets/{code-editor-view-YNhJ1w71.js → code-editor-view-BW9y0JXN.js} +1 -1
- package/core/built/admin/assets/comments-C_lilDBp.js +1 -0
- package/core/built/admin/assets/content-helpers-BOnQQADZ.js +1 -0
- package/core/built/admin/assets/{copy-CNsHZEFR.js → copy-Bi7VpgPR.js} +1 -1
- package/core/built/admin/assets/{data-list-Dn5MkmyD.js → data-list-Bu3jzs1s.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-Dmm_clMl.js → deleted-feed-item-B-doIIKc.js} +1 -1
- package/core/built/admin/assets/{edit-profile-BLSdtROQ.js → edit-profile-ZBdjFfvL.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-C2Z0dddU.js → empty-indicator-C6BBh99D.js} +1 -1
- package/core/built/admin/assets/{en-DuTkaMAI.js → en-C7eSFQRw.js} +1 -1
- package/core/built/admin/assets/{feed-B4Xp4C2J.js → feed-CAioauwD.js} +1 -1
- package/core/built/admin/assets/{filters-gnOx5Z45.js → filters-DEKF0tIB.js} +1 -1
- package/core/built/admin/assets/{gh-chart-B2aWYkGg.js → gh-chart-D9KI0_sO.js} +1 -1
- package/core/built/admin/assets/{ghost-29f8f3c80e41126ba5e3c52ad5727e8a.js → ghost-6bff5c535ef015b0ed9421ceb6c699a7.js} +220 -211
- package/core/built/admin/assets/{growth-BysawIWe.js → growth-C6XGchvT.js} +1 -1
- package/core/built/admin/assets/{hash-j3sh-UI3.js → hash-DFhnGHId.js} +1 -1
- package/core/built/admin/assets/{inbox-1cUdr8Mm.js → inbox-p-Y5uScT.js} +1 -1
- package/core/built/admin/assets/{index-BVoBTlp_.js → index--VlvGKWi.js} +1 -1
- package/core/built/admin/assets/{index-DGBK5k9H.js → index-3uU4zg_6.js} +1 -1
- package/core/built/admin/assets/index-4ZkTY34B.css +1 -0
- package/core/built/admin/assets/{index-BhY_SbGB.js → index-BWnrLoWI.js} +1 -1
- package/core/built/admin/assets/{index-I9n711UW.js → index-BzU2odQq.js} +1 -1
- package/core/built/admin/assets/{index-mhojl7aD.js → index-CIZ_upe2.js} +1 -1
- package/core/built/admin/assets/{index-WjY3mGep.js → index-CS4XqyC-.js} +2 -2
- package/core/built/admin/assets/{index-BgrwCpgw.js → index-D17PEsUB.js} +1 -1
- package/core/built/admin/assets/{index-B8G0f0hb.js → index-DCTdAEHx.js} +3 -3
- package/core/built/admin/assets/{index-DarAAzVH.js → index-FPf-AERu.js} +1 -1
- package/core/built/admin/assets/index-JmqyGBro.js +1 -0
- package/core/built/admin/assets/{index-DKAlEWM4.js → index-LyfDjTto.js} +1 -1
- package/core/built/admin/assets/index-S62-c8TV.js +13 -0
- package/core/built/admin/assets/{index-D8CXbJm4.js → index-Wx8_AGZX.js} +1 -1
- package/core/built/admin/assets/{index-CkAUXgAi.js → index-jAidr8jI.js} +1 -1
- package/core/built/admin/assets/{index-Dz8eTtOq.js → index-lPLmWtv0.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/index.css +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +1853 -1863
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +94 -94
- package/core/built/admin/assets/{koenig-lexical-coiS9dIC.js → koenig-lexical-CWnkYKQt.js} +77 -77
- package/core/built/admin/assets/{kpi-card-BEFHo2gr.js → kpi-card-B5UaJgOT.js} +1 -1
- package/core/built/admin/assets/{kpis-D-gz-lUk.js → kpis-Cc2RxnvZ.js} +1 -1
- package/core/built/admin/assets/{label-BvlHzzcJ.js → label-CW7Kmp9w.js} +1 -1
- package/core/built/admin/assets/{links-tdJvBrsT.js → links-wWNc9Uat.js} +1 -1
- package/core/built/admin/assets/{list-filter-DPE4Xj2T.js → list-filter-3EF6cVg-.js} +1 -1
- package/core/built/admin/assets/{lucide-react-ClQ3Iy7l.js → lucide-react-DtMIZssr.js} +214 -214
- package/core/built/admin/assets/{main-layout-DY96wK-_.js → main-layout-BFYhCrLn.js} +1 -1
- package/core/built/admin/assets/{message-square-text-Dd1XS5-H.js → message-square-text-BDZtUW-2.js} +1 -1
- package/core/built/admin/assets/{minus-CyEc3BE5.js → minus-CSphShdJ.js} +1 -1
- package/core/built/admin/assets/modals-CDWP04Iy.js +77 -0
- package/core/built/admin/assets/{moderation-B0fdmlig.js → moderation-qcng2_lB.js} +1 -1
- package/core/built/admin/assets/{newsletter-Byg3ARa5.js → newsletter-R-IYcV4M.js} +1 -1
- package/core/built/admin/assets/{newsletters-DbH39vgA.js → newsletters-BB4e24i1.js} +1 -1
- package/core/built/admin/assets/{note-Cwy-rIAF.js → note-B_bpRX66.js} +1 -1
- package/core/built/admin/assets/overview-Nh-IoP-v.js +1 -0
- package/core/built/admin/assets/{pagemenu-CkzsZrHC.js → pagemenu-Cd45frnF.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-BLkup0Xh.js → post-analytics-context-BST4bzps.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-DAZPp6M8.js +1 -0
- package/core/built/admin/assets/{post-analytics-aA-nG9Fq.js → post-analytics-jHZOhQ8L.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-CkvJtrRw.js → post-share-modal-D1JQfuYx.js} +1 -1
- package/core/built/admin/assets/posts/{comments-Bn_vn_sb.mjs → comments-C0ntS6jH.mjs} +678 -692
- package/core/built/admin/assets/posts/{dialog-CKPcMrj7.mjs → dialog-CXEmd-rC.mjs} +3 -3
- package/core/built/admin/assets/posts/{empty-indicator-kkrhP6K_.mjs → empty-indicator-CY1NEQZt.mjs} +2 -2
- package/core/built/admin/assets/posts/{filters-DHsxxy0F.mjs → filters-CWWDQAf0.mjs} +6 -6
- package/core/built/admin/assets/posts/{growth-D7ACh-oR.mjs → growth-DUnL-W24.mjs} +20 -19
- package/core/built/admin/assets/posts/{heading-BrKVbOxA.mjs → heading-DZWin3nG.mjs} +2 -2
- package/core/built/admin/assets/posts/{hooks-BBEMuLiW.mjs → hooks-DQYjPsLg.mjs} +2 -2
- package/core/built/admin/assets/posts/{index-C0rRguZx.mjs → index-BiGQFQkQ.mjs} +9 -9
- package/core/built/admin/assets/posts/{kpis-1o524OIK.mjs → kpis-DNnkyd0U.mjs} +10 -10
- package/core/built/admin/assets/posts/{links-JpeATx1f.mjs → links-D3nSZFlJ.mjs} +4 -4
- package/core/built/admin/assets/posts/{loading-indicator-BHAmSf8j.mjs → loading-indicator-CZQmPRvv.mjs} +3 -3
- package/core/built/admin/assets/posts/{main-layout-BTItAOQE.mjs → main-layout-D5WnaGr4.mjs} +2 -2
- package/core/built/admin/assets/posts/{newsletter-CQdsCEHv.mjs → newsletter-C5eikVBq.mjs} +13 -13
- package/core/built/admin/assets/posts/{overview-sYh4JN1D.mjs → overview-C5mCMPJY.mjs} +113 -112
- package/core/built/admin/assets/posts/{post-analytics-DtLt2SWx.mjs → post-analytics-Cc2NCQis.mjs} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-context-CB1yM9fk.mjs → post-analytics-context-qXWjDzSt.mjs} +44 -41
- package/core/built/admin/assets/posts/{post-analytics-header-BYaWuL9W.mjs → post-analytics-header-QGsYyvhA.mjs} +11 -11
- package/core/built/admin/assets/posts/{post-share-modal-V0HTOBaf.mjs → post-share-modal-B9Q7FJsH.mjs} +4 -4
- package/core/built/admin/assets/posts/posts-C2SKGLoU.mjs +17 -0
- package/core/built/admin/assets/posts/posts.js +1 -1
- package/core/built/admin/assets/posts/{search-CLjC37AT.mjs → search-C8k0TFkh.mjs} +2 -2
- package/core/built/admin/assets/posts/{separator-KNoTIaJx.mjs → separator-CJnnsW1a.mjs} +5 -5
- package/core/built/admin/assets/posts/{sheet-DBg_SCDt.mjs → sheet-HDzKgNHc.mjs} +3 -3
- package/core/built/admin/assets/posts/{skeleton-DvsoolWu.mjs → skeleton-BlZGKNzB.mjs} +3 -3
- package/core/built/admin/assets/posts/{source-icon-OmRaTU2G.mjs → source-icon-DjBIjtaY.mjs} +3 -3
- package/core/built/admin/assets/posts/{stats-BC2DzntY.mjs → stats-BRVHejqx.mjs} +4 -4
- package/core/built/admin/assets/posts/{table-CxX9OKAj.mjs → table-D7AEpPWL.mjs} +2 -2
- package/core/built/admin/assets/posts/{tabs-B1jw7cBi.mjs → tabs-RcpmzDgr.mjs} +10 -10
- package/core/built/admin/assets/posts/{tags-BitrLT_j.mjs → tags-8k1xw8R8.mjs} +2 -2
- package/core/built/admin/assets/posts/{tags-BBilTo1a.mjs → tags-DNY2rBlf.mjs} +11 -11
- package/core/built/admin/assets/posts/{use-infinite-virtual-scroll-DaijA1ao.mjs → use-infinite-virtual-scroll-CMiIpcDA.mjs} +3 -3
- package/core/built/admin/assets/posts/{web-CKmyC4Xj.mjs → web-BCl5J6bB.mjs} +15 -15
- package/core/built/admin/assets/{posts-DDkuYoN7.js → posts-DFiJPOft.js} +1 -1
- package/core/built/admin/assets/{repeat-B-SL0yPM.js → repeat-Smml9n0k.js} +1 -1
- package/core/built/admin/assets/{reply-BdCPoUQ9.js → reply-CooY4lmk.js} +1 -1
- package/core/built/admin/assets/{select-C7aNW8QS.js → select-WwMsbBbg.js} +1 -1
- package/core/built/admin/assets/{settings-D-dhma2e.js → settings-CQEhPDQU.js} +4 -4
- package/core/built/admin/assets/{settings-Bzy1GNfD.js → settings-CxWtvcUf.js} +1 -1
- package/core/built/admin/assets/{sort-button-Dv8vjh13.js → sort-button-DFr8vezl.js} +1 -1
- package/core/built/admin/assets/{source-icon-DTz4isLK.js → source-icon-VpYWpwYb.js} +1 -1
- package/core/built/admin/assets/{sprout-BwLQTzMf.js → sprout-DRqlFJSK.js} +1 -1
- package/core/built/admin/assets/{square-YF1YE9ex.js → square-CwHQ9sJ2.js} +1 -1
- package/core/built/admin/assets/stats/audience-Caf7BjaU.mjs +269 -0
- package/core/built/admin/assets/stats/{url-helpers-Drq3xg0l.mjs → content-helpers-MbtAvUJh.mjs} +83 -106
- package/core/built/admin/assets/stats/{index-CcCyLMxL.mjs → index-BGqKbF1D.mjs} +8 -8
- package/core/built/admin/assets/stats/{index-DXU2rE9t.mjs → index-BTjfXOi6.mjs} +30 -30
- package/core/built/admin/assets/stats/{index-K7ASx7EG.mjs → index-ChjIxhHy.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-D5mlMG4l.mjs → index-DMkZbbZs.mjs} +14 -14
- package/core/built/admin/assets/stats/{index-CUuQaROI.mjs → index-wT0OIw_N.mjs} +355 -335
- package/core/built/admin/assets/stats/{sort-button-CELUx6Zp.mjs → sort-button-B8n8fYMi.mjs} +23 -23
- package/core/built/admin/assets/stats/{stats-d_u_in4l.mjs → stats-CGH-0JNs.mjs} +120 -119
- package/core/built/admin/assets/stats/stats.js +1 -1
- package/core/built/admin/assets/stats/{tabs-3wLZsy0v.mjs → tabs-EQCUj3Y9.mjs} +19 -19
- package/core/built/admin/assets/stats/{use-growth-stats-28Sr42va.mjs → use-growth-stats--CIfag21.mjs} +3 -3
- package/core/built/admin/assets/{stats-C5ad0fgQ.js → stats-lnFiOQZx.js} +1 -1
- package/core/built/admin/assets/{stats-view-BvkxPYNX.js → stats-view-BJVawuIv.js} +1 -1
- package/core/built/admin/assets/{step-1-D7_s-D99.js → step-1-Bx8MiQVF.js} +1 -1
- package/core/built/admin/assets/{step-2-B94Yf7FF.js → step-2-CLLXppER.js} +1 -1
- package/core/built/admin/assets/{step-3-DswXYYf4.js → step-3-C5WrQe8u.js} +2 -2
- package/core/built/admin/assets/{table-D30IXfUP.js → table-2waWpIF5.js} +1 -1
- package/core/built/admin/assets/{tabs-CjNdfW0y.js → tabs-CBD0hW8V.js} +1 -1
- package/core/built/admin/assets/{tags-B0ux9_dT.js → tags-Bgw5Hrb5.js} +1 -1
- package/core/built/admin/assets/{tags-PGeGAafJ.js → tags-CKrBptuC.js} +1 -1
- package/core/built/admin/assets/{tiers-BaXK0JoI.js → tiers-CO-pz1FX.js} +1 -1
- package/core/built/admin/assets/{toggle-group-DdY8HF3Y.js → toggle-group-BXAZzvJ9.js} +1 -1
- package/core/built/admin/assets/{topic-filter-Boh22uGD.js → topic-filter-U3qUH2P_.js} +1 -1
- package/core/built/admin/assets/{trash-D7ZWrnDq.js → trash-CJY1Wro_.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-Bg0nE0WG.js → use-growth-stats-BrLZI7da.js} +1 -1
- package/core/built/admin/assets/{use-infinite-virtual-scroll-DoeI5IY-.js → use-infinite-virtual-scroll-CiRn3kpz.js} +2 -2
- package/core/built/admin/assets/{use-simple-pagination-BJzBULR3.js → use-simple-pagination-CskJ0MDP.js} +1 -1
- package/core/built/admin/assets/{user-round-check-BLc3L-ei.js → user-round-check-zOuzV3OS.js} +1 -1
- package/core/built/admin/assets/{wallet-cards-xX4QZik7.js → wallet-cards-ddLuIN-b.js} +1 -1
- package/core/built/admin/assets/{web-DQ2qBymm.js → web-CGbkZWn3.js} +1 -1
- package/core/built/admin/index.html +6 -5
- package/core/frontend/services/theme-engine/i18n/i18n.js +9 -14
- package/core/server/api/endpoints/settings-public.js +3 -1
- package/core/server/api/endpoints/utils/serializers/input/settings.js +6 -1
- package/core/server/data/migrations/versions/6.19/2026-02-10-12-00-00-add-transistor-portal-settings.js +39 -0
- package/core/server/data/schema/default-settings/default-settings.json +28 -0
- package/core/server/data/schema/schema.js +2 -2
- package/core/server/data/seeders/importers/offers-importer.js +2 -2
- package/core/server/data/tinybird/endpoints/api_top_pages_router.pipe +28 -0
- package/core/server/data/tinybird/endpoints/api_top_pages_v3.pipe +8 -4
- package/core/server/data/tinybird/tests/api_top_pages_router.yaml +74 -0
- package/core/server/services/comments/comments-service-emails.js +1 -4
- package/core/server/services/email-service/email-templates/partials/styles.hbs +43 -0
- package/core/server/services/koenig/node-renderers/transistor-renderer.js +23 -17
- package/core/server/services/members/members-api/repositories/member-repository.js +30 -6
- package/core/server/services/members/members-api/services/next-payment-calculator.js +28 -20
- package/core/server/services/members/members-api/services/payments-service.js +1 -1
- package/core/server/services/members/members-api/utils/add-calendar-months.js +49 -0
- package/core/server/services/offers/application/offer-mapper.js +2 -2
- package/core/server/services/offers/domain/models/offer-amount.js +16 -0
- package/core/server/services/offers/domain/models/offer-duration.js +3 -4
- package/core/server/services/offers/domain/models/offer-type.js +5 -3
- package/core/server/services/offers/domain/models/offer.js +8 -1
- package/core/server/services/staff/staff-service-emails.js +2 -0
- package/core/server/services/stripe/stripe-api.js +19 -0
- package/core/shared/config/defaults.json +1 -1
- package/core/shared/labs.js +0 -1
- package/core/shared/settings-cache/cache-manager.js +8 -0
- package/core/shared/settings-cache/public.js +5 -0
- package/package.json +5 -5
- package/yarn.lock +4 -4
- package/components/tryghost-i18n-6.18.2.tgz +0 -0
- package/components/tryghost-parse-email-address-6.18.2.tgz +0 -0
- package/core/built/admin/assets/audience-CJHVR7kD.js +0 -1
- package/core/built/admin/assets/comments-CPd_iCc3.js +0 -1
- package/core/built/admin/assets/index-B2yksBz4.js +0 -13
- package/core/built/admin/assets/index-Cl_EPbQ2.js +0 -1
- package/core/built/admin/assets/index-D_sGUCda.css +0 -1
- package/core/built/admin/assets/modals-C06GcVIm.js +0 -77
- package/core/built/admin/assets/overview-CVMLGrVt.js +0 -1
- package/core/built/admin/assets/post-analytics-header-D9srAPT5.js +0 -1
- package/core/built/admin/assets/posts/posts-DeQT3knv.mjs +0 -21
- package/core/built/admin/assets/stats/audience-BWqU7WWT.mjs +0 -245
- package/core/built/admin/assets/url-helpers-mt6MBIi0.js +0 -1
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* @prop {string} display_title
|
|
12
12
|
* @prop {string} display_description
|
|
13
13
|
*
|
|
14
|
-
* @prop {'percent'|'fixed'|'trial'} type
|
|
14
|
+
* @prop {'percent'|'fixed'|'trial'|'free_months'} type
|
|
15
15
|
*
|
|
16
16
|
* @prop {'month'|'year'} cadence
|
|
17
17
|
* @prop {number} amount
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* @prop {boolean} currency_restriction
|
|
20
20
|
* @prop {string} currency
|
|
21
21
|
*
|
|
22
|
-
* @prop {'once'|'repeating'|'forever'|'trial'} duration
|
|
22
|
+
* @prop {'once'|'repeating'|'forever'|'trial'|'free_months'} duration
|
|
23
23
|
* @prop {null|number} duration_in_months
|
|
24
24
|
*
|
|
25
25
|
* @prop {'active'|'archived'} status
|
|
@@ -76,7 +76,23 @@ class OfferTrialAmount extends OfferAmount {
|
|
|
76
76
|
static InvalidOfferAmount = InvalidOfferAmount;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
class OfferFreeMonthsAmount extends OfferAmount {
|
|
80
|
+
/** @param {unknown} amount */
|
|
81
|
+
static create(amount) {
|
|
82
|
+
if (typeof amount !== 'number' || !Number.isInteger(amount) || amount < 1) {
|
|
83
|
+
throw new InvalidOfferAmount({
|
|
84
|
+
message: 'Offer `amount` must be an integer greater than 0.'
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return new OfferFreeMonthsAmount(amount);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static InvalidOfferAmount = InvalidOfferAmount;
|
|
92
|
+
}
|
|
93
|
+
|
|
79
94
|
module.exports = OfferAmount;
|
|
80
95
|
module.exports.OfferPercentageAmount = OfferPercentageAmount;
|
|
81
96
|
module.exports.OfferFixedAmount = OfferFixedAmount;
|
|
82
97
|
module.exports.OfferTrialAmount = OfferTrialAmount;
|
|
98
|
+
module.exports.OfferFreeMonthsAmount = OfferFreeMonthsAmount;
|
|
@@ -3,7 +3,7 @@ const InvalidOfferDuration = require('../errors').InvalidOfferDuration;
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @typedef {object} BasicDuration
|
|
6
|
-
* @prop {'once'|'forever'|'trial'} type
|
|
6
|
+
* @prop {'once'|'forever'|'trial'|'free_months'} type
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -26,9 +26,9 @@ class OfferDuration extends ValueObject {
|
|
|
26
26
|
message: 'Offer `duration` must be a string.'
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
if (type !== 'once' && type !== 'repeating' && type !== 'forever' && type !== 'trial') {
|
|
29
|
+
if (type !== 'once' && type !== 'repeating' && type !== 'forever' && type !== 'trial' && type !== 'free_months') {
|
|
30
30
|
throw new InvalidOfferDuration({
|
|
31
|
-
message: 'Offer `duration` must be one of "once", "repeating", "forever" or "
|
|
31
|
+
message: 'Offer `duration` must be one of "once", "repeating", "forever", "trial" or "free_months".'
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
if (type !== 'repeating') {
|
|
@@ -56,4 +56,3 @@ class OfferDuration extends ValueObject {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
module.exports = OfferDuration;
|
|
59
|
-
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const ValueObject = require('./shared/value-object');
|
|
2
2
|
const InvalidOfferType = require('../errors').InvalidOfferType;
|
|
3
3
|
|
|
4
|
-
/** @extends ValueObject<'fixed'|'percent'|'trial'> */
|
|
4
|
+
/** @extends ValueObject<'fixed'|'percent'|'trial'|'free_months'> */
|
|
5
5
|
class OfferType extends ValueObject {
|
|
6
6
|
/** @param {unknown} type */
|
|
7
7
|
static create(type) {
|
|
@@ -10,9 +10,9 @@ class OfferType extends ValueObject {
|
|
|
10
10
|
message: 'Offer `type` must be a string.'
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
if (type !== 'percent' && type !== 'fixed' && type !== 'trial') {
|
|
13
|
+
if (type !== 'percent' && type !== 'fixed' && type !== 'trial' && type !== 'free_months') {
|
|
14
14
|
throw new InvalidOfferType({
|
|
15
|
-
message: 'Offer `type` must be one of "percent", "fixed" or "
|
|
15
|
+
message: 'Offer `type` must be one of "percent", "fixed", "trial" or "free_months".'
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -26,6 +26,8 @@ class OfferType extends ValueObject {
|
|
|
26
26
|
static Fixed = new OfferType('fixed');
|
|
27
27
|
|
|
28
28
|
static Trial = new OfferType('trial');
|
|
29
|
+
|
|
30
|
+
static FreeMonths = new OfferType('free_months');
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
module.exports = OfferType;
|
|
@@ -322,19 +322,26 @@ class Offer {
|
|
|
322
322
|
});
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
//CASE: For offer type trial, the duration can only be `trial`
|
|
326
325
|
if (type.value === 'trial' && duration.value.type !== 'trial') {
|
|
327
326
|
throw new errors.InvalidOfferDuration({
|
|
328
327
|
message: 'Offer `duration` must be "trial" for offer type "trial".'
|
|
329
328
|
});
|
|
330
329
|
}
|
|
331
330
|
|
|
331
|
+
if (type.value === 'free_months' && duration.value.type !== 'free_months') {
|
|
332
|
+
throw new errors.InvalidOfferDuration({
|
|
333
|
+
message: 'Offer `duration` must be "free_months" for offer type "free_months".'
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
|
|
332
337
|
let currency = null;
|
|
333
338
|
let amount;
|
|
334
339
|
if (type.equals(OfferType.Percentage)) {
|
|
335
340
|
amount = OfferAmount.OfferPercentageAmount.create(data.amount);
|
|
336
341
|
} else if (type.equals(OfferType.Trial)) {
|
|
337
342
|
amount = OfferAmount.OfferTrialAmount.create(data.amount);
|
|
343
|
+
} else if (type.equals(OfferType.FreeMonths)) {
|
|
344
|
+
amount = OfferAmount.OfferFreeMonthsAmount.create(data.amount);
|
|
338
345
|
} else if (type.equals(OfferType.Fixed)) {
|
|
339
346
|
amount = OfferAmount.OfferFixedAmount.create(data.amount);
|
|
340
347
|
currency = OfferCurrency.create(data.currency);
|
|
@@ -408,6 +408,8 @@ class StaffServiceEmails {
|
|
|
408
408
|
offAmount = `${this.getFormattedAmount({currency: offer.currency, amount})} off`;
|
|
409
409
|
} else if (offer.type === 'trial') {
|
|
410
410
|
offAmount = `${offer.amount} days free`;
|
|
411
|
+
} else if (offer.type === 'free_months') {
|
|
412
|
+
offAmount = `${offer.amount === 1 ? '1 month' : `${offer.amount} months`} free`;
|
|
411
413
|
}
|
|
412
414
|
|
|
413
415
|
return {
|
|
@@ -859,6 +859,25 @@ module.exports = class StripeAPI {
|
|
|
859
859
|
return subscription;
|
|
860
860
|
}
|
|
861
861
|
|
|
862
|
+
/**
|
|
863
|
+
* Update the trial end for a Stripe Subscription by ID.
|
|
864
|
+
*
|
|
865
|
+
* @param {string} id - The ID of the subscription to update
|
|
866
|
+
* @param {number} trialEnd - Unix timestamp in seconds
|
|
867
|
+
* @param {object} [options={}]
|
|
868
|
+
* @param {('always_invoice'|'create_prorations'|'none')} [options.prorationBehavior='none']
|
|
869
|
+
*
|
|
870
|
+
* @returns {Promise<ISubscription>}
|
|
871
|
+
*/
|
|
872
|
+
async updateSubscriptionTrialEnd(id, trialEnd, options = {}) {
|
|
873
|
+
await this._rateLimitBucket.throttle();
|
|
874
|
+
const subscription = await this._stripe.subscriptions.update(id, {
|
|
875
|
+
trial_end: trialEnd,
|
|
876
|
+
proration_behavior: options.prorationBehavior || 'none'
|
|
877
|
+
});
|
|
878
|
+
return subscription;
|
|
879
|
+
}
|
|
880
|
+
|
|
862
881
|
/**
|
|
863
882
|
* Update the price of the Stripe SubscriptionItem by Subscription ID,
|
|
864
883
|
* SubscriptionItem ID, and Price ID.
|
|
@@ -240,7 +240,7 @@
|
|
|
240
240
|
},
|
|
241
241
|
"portal": {
|
|
242
242
|
"url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
|
|
243
|
-
"version": "2.
|
|
243
|
+
"version": "2.64"
|
|
244
244
|
},
|
|
245
245
|
"sodoSearch": {
|
|
246
246
|
"url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
|
package/core/shared/labs.js
CHANGED
|
@@ -234,6 +234,14 @@ class CacheManager {
|
|
|
234
234
|
settings[newKey] = this._doGet(this.publicSettings[newKey]) ?? null;
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
+
// Compute transistor_portal_enabled: only true if main integration AND portal setting are both enabled
|
|
238
|
+
// - this is done server-side because we shouldn't expose the transistor integration setting
|
|
239
|
+
if ('transistor_portal_enabled' in settings) {
|
|
240
|
+
const transistorEnabled = this._doGet('transistor');
|
|
241
|
+
const portalEnabled = settings.transistor_portal_enabled;
|
|
242
|
+
settings.transistor_portal_enabled = Boolean(transistorEnabled) && Boolean(portalEnabled);
|
|
243
|
+
}
|
|
244
|
+
|
|
237
245
|
return settings;
|
|
238
246
|
}
|
|
239
247
|
|
|
@@ -50,5 +50,10 @@ module.exports = {
|
|
|
50
50
|
support_email_address: 'support_email_address',
|
|
51
51
|
editor_default_email_recipients: 'editor_default_email_recipients',
|
|
52
52
|
labs: 'labs',
|
|
53
|
+
transistor_portal_enabled: 'transistor_portal_enabled',
|
|
54
|
+
transistor_portal_heading: 'transistor_portal_heading',
|
|
55
|
+
transistor_portal_description: 'transistor_portal_description',
|
|
56
|
+
transistor_portal_button_text: 'transistor_portal_button_text',
|
|
57
|
+
transistor_portal_url_template: 'transistor_portal_url_template',
|
|
53
58
|
site_uuid: 'site_uuid'
|
|
54
59
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghost",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.19.0",
|
|
4
4
|
"description": "The professional publishing platform",
|
|
5
5
|
"author": "Ghost Foundation",
|
|
6
6
|
"homepage": "https://ghost.org",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"@tryghost/helpers": "1.1.97",
|
|
84
84
|
"@tryghost/html-to-plaintext": "1.0.4",
|
|
85
85
|
"@tryghost/http-cache-utils": "0.1.20",
|
|
86
|
-
"@tryghost/i18n": "file:components/tryghost-i18n-6.
|
|
86
|
+
"@tryghost/i18n": "file:components/tryghost-i18n-6.19.0.tgz",
|
|
87
87
|
"@tryghost/image-transform": "1.4.6",
|
|
88
88
|
"@tryghost/job-manager": "1.0.3",
|
|
89
89
|
"@tryghost/kg-card-factory": "5.1.7",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"@tryghost/mw-vhost": "1.0.1",
|
|
106
106
|
"@tryghost/nodemailer": "0.3.48",
|
|
107
107
|
"@tryghost/nql": "0.12.8",
|
|
108
|
-
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.
|
|
108
|
+
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.19.0.tgz",
|
|
109
109
|
"@tryghost/pretty-cli": "1.2.47",
|
|
110
110
|
"@tryghost/prometheus-metrics": "1.0.2",
|
|
111
111
|
"@tryghost/promise": "0.3.15",
|
|
@@ -271,8 +271,8 @@
|
|
|
271
271
|
"jackspeak": "2.3.6",
|
|
272
272
|
"moment": "2.24.0",
|
|
273
273
|
"moment-timezone": "0.5.45",
|
|
274
|
-
"@tryghost/i18n": "file:components/tryghost-i18n-6.
|
|
275
|
-
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.
|
|
274
|
+
"@tryghost/i18n": "file:components/tryghost-i18n-6.19.0.tgz",
|
|
275
|
+
"@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.19.0.tgz"
|
|
276
276
|
},
|
|
277
277
|
"nx": {
|
|
278
278
|
"targets": {
|
package/yarn.lock
CHANGED
|
@@ -9134,10 +9134,10 @@
|
|
|
9134
9134
|
dependencies:
|
|
9135
9135
|
semver "^7.7.0"
|
|
9136
9136
|
|
|
9137
|
-
"@tryghost/koenig-lexical@1.7.
|
|
9138
|
-
version "1.7.
|
|
9139
|
-
resolved "https://registry.yarnpkg.com/@tryghost/koenig-lexical/-/koenig-lexical-1.7.
|
|
9140
|
-
integrity sha512-
|
|
9137
|
+
"@tryghost/koenig-lexical@1.7.12":
|
|
9138
|
+
version "1.7.12"
|
|
9139
|
+
resolved "https://registry.yarnpkg.com/@tryghost/koenig-lexical/-/koenig-lexical-1.7.12.tgz#d546b1149b268bd0e52d3eb7e7198ad50da64a10"
|
|
9140
|
+
integrity sha512-8JJxtrVFqmyfsr2igg38O1s2zKDrpDtM8GW6eW8pmYIX66qedqsZOFv4cg/rYevZeO1wNejxr4+cME4y97gnXA==
|
|
9141
9141
|
|
|
9142
9142
|
"@tryghost/limit-service@1.4.1":
|
|
9143
9143
|
version "1.4.1"
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as s,e as n,aX as o,aY as t,aZ as a}from"./index-B8G0f0hb.js";const d=()=>s.jsx("div",{className:"admin-x-container-error",children:s.jsxs("div",{className:"admin-x-error",children:[s.jsx("h1",{children:"Loading interrupted"}),s.jsx("p",{children:"They say life is a series of trials and tribulations. This moment right here? It's a tribulation. Our app was supposed to load, and yet here we are. Loadless. Click back to the dashboard to try again."}),s.jsx("a",{className:"cursor-pointer",onClick:()=>window.location.reload(),children:"← Back to the dashboard"})]})});class u extends n.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}render(){return this.state.hasError?s.jsx(d,{error:this.state.error}):this.props.children}}const c=e=>!e||e.length===0?o:t.filter(r=>e.includes(r.value)).reduce((r,i)=>r|i.bit,0)||o,h=e=>{const r=[];return(e&a.PUBLIC)!==0&&r.push(t[0].value),(e&a.FREE)!==0&&r.push(t[1].value),(e&a.PAID)!==0&&r.push(t[2].value),r.join(",")};export{c as a,h as g};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as h,j as e,y as k,$ as Ce,cV as te,cW as we,bK as H,cz as ke,cX as ye,X as _e,cY as Se,B as b,be as Pe,ak as Le,ad as ae,ae as B,b_ as D,b$ as $,c0 as F,c1 as E,cy as T,cK as Te,D as O,t as U,v as V,w as q,a9 as Me,aa as A,cZ as Re,c_ as Ie,bH as ze,ap as De,bN as $e,bI as Fe,bJ as L,x as X,c$ as Ee,f as M,bq as re,bG as R,aj as He,z as Q,by as Be,bA as Oe,bB as Ue,bC as Ve,aR as qe,d0 as ne,ck as Ae,aI as Qe}from"./index-B8G0f0hb.js";import{F as We,c as Ke}from"./filters-gnOx5Z45.js";import{u as Ge,g as Ye}from"./posts-DDkuYoN7.js";import{M as Xe,b as W,a as Je,F as Ze,d as es,C as ss,e as ie,D as K,E as le,f as oe}from"./message-square-text-Dd1XS5-H.js";import{H as J,g as ts,u as as}from"./use-infinite-virtual-scroll-DoeI5IY-.js";import{M as rs}from"./main-layout-DY96wK-_.js";import{C as ce,a as ns}from"./index-Dz8eTtOq.js";import{L as is}from"./label-BvlHzzcJ.js";import{R as ls}from"./reply-BdCPoUQ9.js";import{E as de}from"./empty-indicator-C2Z0dddU.js";const me=h.forwardRef(({className:s,...t},a)=>e.jsx(ce,{ref:a,className:k("grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",s),...t,children:e.jsx(ns,{className:k("grid place-content-center text-current"),children:e.jsx(Ce,{className:"size-4"})})}));me.displayName=ce.displayName;const os=({children:s,className:t,...a})=>e.jsx("section",{className:k("flex gap-6 flex-col p-4 lg:p-8 size-full grow",t),...a,children:s});function Z({knownItems:s,useSearch:t,useGetById:a,filters:r,filterFieldName:n,searchFieldName:l,toOption:c}){const[i,o]=h.useState(""),{data:d,isLoading:m}=t(i),x=h.useMemo(()=>{const w=r.find(j=>j.field===n);return w?.values[0]?String(w.values[0]):""},[r,n]),f=h.useMemo(()=>!x||s.some(j=>j.id===x)?!1:!(d?.[l]??[]).some(j=>j.id===x),[x,s,d,l]),{data:v,isLoading:N}=a(x||"",{enabled:f,defaultErrorHandler:!1}),p=m||N,C=h.useCallback(w=>c(w),[c]);return{options:h.useMemo(()=>{const w=d?.[l]??[],j={};for(const g of s)j[g.id]=C(g);for(const g of w)j[g.id]=C(g);const S=v?.[l]?.[0];return S?.id&&(j[S.id]=C(S)),x&&!(x in j)&&(j[x]={value:x,label:`ID: ${x}`}),Object.values(j)},[s,d,l,v,x,C]),isLoading:p,searchValue:i,onSearchChange:o}}function cs(s){const[t]=te(s,200);return we({searchParams:{...t&&{search:t},limit:"100",order:"created_at DESC"}})}function ds(s){const[t]=te(s,200),a=t?`title:~'${t.replace(/'/g,"\\'")}'`:"";return Ge({searchParams:{...a&&{filter:a},limit:"100",fields:"id,title",order:"published_at DESC"}})}const ms=({knownPosts:s,knownMembers:t,filters:a,onFiltersChange:r})=>{const n=Z({knownItems:s,useSearch:ds,useGetById:Ye,searchFieldName:"posts",filters:a,filterFieldName:"post",toOption:d=>({value:d.id,label:d.title||"(Untitled)"})}),l=Z({knownItems:t,useSearch:cs,useGetById:Se,searchFieldName:"members",filters:a,filterFieldName:"author",toOption:d=>({value:d.id,label:d.name||"Unknown name",detail:d.email??"(Unknown email)"})}),c=h.useMemo(()=>[{key:"author",label:"Author",type:"select",icon:e.jsx(H,{className:"size-4"}),options:l.options,isLoading:l.options.length===0&&l.isLoading,onSearchChange:l.onSearchChange,searchValue:l.searchValue,searchable:!0,className:"w-80",popoverContentClassName:"w-80",operators:[{value:"is",label:"is"},{value:"is_not",label:"is not"}]},{key:"post",label:"Post",type:"select",icon:e.jsx(ke,{className:"size-4"}),options:n.options,isLoading:n.options.length===0&&n.isLoading,onSearchChange:n.onSearchChange,searchValue:n.searchValue,searchable:!0,className:"w-full max-w-80",popoverContentClassName:"w-full max-w-[calc(100vw-32px)] max-w-80",operators:[{value:"is",label:"is"},{value:"is_not",label:"is not"}]},{key:"body",label:"Text",type:"text",icon:e.jsx(Xe,{className:"size-4"}),placeholder:"Search comment text...",operators:[{value:"contains",label:"contains"},{value:"not_contains",label:"does not contain"}],defaultOperator:"contains",className:"w-full max-w-48",popoverContentClassName:"w-full max-w-48"},{key:"status",label:"Status",type:"select",icon:e.jsx(ye,{className:"size-4"}),options:[{value:"published",label:"Published"},{value:"hidden",label:"Hidden"}],operators:[{value:"is",label:"is"}],searchable:!1,hideOperatorSelect:!0},{key:"reported",label:"Reported",type:"select",icon:e.jsx(W,{className:"size-4"}),options:[{value:"true",label:"Yes"},{value:"false",label:"No"}],operators:[{value:"is",label:"is"}],searchable:!1,hideOperatorSelect:!0},{key:"created_at",label:"Date",type:"date",className:"w-full max-w-32",icon:e.jsx(Je,{className:"size-4"}),operators:[{value:"is",label:"is"},{value:"before",label:"before"},{value:"after",label:"after"}]}],[n,l]),i=a.length>0,o=k("flex flex-row",!i&&"[grid-area:actions] pt-5 justify-start sm:justify-end sm:pt-0",i&&"col-start-1 col-end-4 row-start-3 pt-5");return e.jsx("div",{className:o,children:e.jsx(We,{addButtonIcon:i?e.jsx(Ze,{}):e.jsx(es,{}),addButtonText:i?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${i?"[&>button]:border-none":"w-auto"}`,clearButtonClassName:"font-normal text-muted-foreground",clearButtonIcon:e.jsx(_e,{}),clearButtonText:"Clear",fields:c,filters:a,keyboardShortcut:"f",popoverAlign:i?"start":"end",showClearButton:i,showSearchInput:!1,onChange:r})})},us=({children:s})=>e.jsxs(J,{className:"relative !pb-6 md:sticky",variant:"inline-nav",children:[e.jsx(J.Title,{children:"Comments"}),s]}),hs=({children:s})=>e.jsx(rs,{children:e.jsx("div",{className:"grid w-full grow",children:e.jsx("div",{className:"flex h-full flex-col","data-testid":"comments-page",children:s})})});function xs({onClick:s,expanded:t}){return e.jsxs(b,{className:"shrink-0 gap-0.5 self-start p-0 text-base hover:bg-transparent",variant:"ghost",onClick:s,children:[t?"Show less":"Show more",t?e.jsx(ss,{}):e.jsx(Pe,{})]})}function ue({item:s}){const t=h.useRef(null),[a,r]=h.useState(!1),[n,l]=h.useState(!1);return h.useEffect(()=>{if(n)return;const c=()=>{t.current&&r(t.current.scrollHeight>t.current.clientHeight)};return c(),window.addEventListener("resize",c),()=>window.removeEventListener("resize",c)},[s.html,n]),e.jsx("div",{className:"mt-1 flex flex-col gap-2",children:e.jsxs("div",{className:`flex max-w-full flex-col items-start ${s.status==="hidden"&&"opacity-50"}`,children:[e.jsx("div",{dangerouslySetInnerHTML:{__html:s.html||""},ref:t,className:k("prose flex-1 text-base max-w-[80ch] balance leading-[1.5em] [&_*]:leading-[1.5em] [&_*]:text-base [&_*]:font-normal [&_blockquote]:border-l-[3px] [&_blockquote]:border-foreground [&_blockquote]:p-0 [&_blockquote]:pl-3 [&_blockquote_p]:mt-0 [&_a]:underline",n?"-mb-1 [&_p]:mb-[0.85em]":"line-clamp-2 [&_p]:m-0 [&_blockquote+p]:mt-1 mb-1")}),a&&e.jsx(xs,{expanded:n,onClick:()=>l(!n)})]})})}const I="CommentsResponseType",ps=Le({dataType:I,path:"/comments/",defaultNextPageParams:(s,t)=>{var a,r;return(a=s.meta)!=null&&a.pagination.next?{...t,page:(((r=s.meta)==null?void 0:r.pagination.next)||1).toString()}:void 0},returnData:s=>{const{pages:t}=s,a=t.flatMap(n=>n.comments),r=t[t.length-1].meta;return{comments:a,meta:r,isEnd:r?r.pagination.pages===r.pagination.page:!0}}}),he=s=>ps({...s,searchParams:{limit:"100",order:"created_at desc",include:"member,post,parent",...s?.searchParams}}),xe=ae({method:"PUT",path:({id:s})=>`/comments/${s}/`,body:({id:s})=>({comments:[{id:s,status:"hidden"}]}),invalidateQueries:{dataType:I}}),pe=ae({method:"PUT",path:({id:s})=>`/comments/${s}/`,body:({id:s})=>({comments:[{id:s,status:"published"}]}),invalidateQueries:{dataType:I}}),fs=B({dataType:I,path:s=>`/comments/${s}/`,defaultSearchParams:{include:"member,post,count.replies,count.direct_replies,count.likes,count.reports,parent,in_reply_to"}}),js=B({dataType:"CommentReportsResponseType",path:s=>`/comments/${s}/reports/`}),gs=(s,t)=>js(s,{...t}),bs=B({dataType:"CommentLikesResponseType",path:s=>`/comments/${s}/likes/`,defaultSearchParams:{include:"member",limit:"100",order:"created_at desc"}}),vs=(s,t)=>bs(s,{...t}),Ns=(s,t)=>he({...t,searchParams:{filter:`(parent_id:${s}+in_reply_to_id:null),in_reply_to_id:${s}`,order:"created_at asc",include:"member,post,count.direct_replies,count.likes,count.reports,parent,in_reply_to",limit:"100"}});function P({avatarImage:s,memberId:t,isHidden:a,className:r}){return e.jsxs("div",{className:k("relative flex size-6 min-w-6 items-center justify-center overflow-hidden rounded-full bg-accent md:size-8 md:min-w-8",a&&"opacity-50",r),children:[t&&s&&e.jsx("div",{className:"absolute inset-0",children:e.jsx("img",{alt:"Member avatar",src:s})}),e.jsx("div",{children:e.jsx(H,{className:"!size-3 text-muted-foreground md:!size-4",size:12})})]})}function Cs(s){const t=new Date(s);return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric"}).format(t).replace(/(\d+),(\s+\d{4})/,"$1$2")}function fe({memberName:s,memberId:t,createdAt:a,isHidden:r,canComment:n,onAuthorClick:l,postTitle:c,onPostClick:i,className:o}){return e.jsxs("div",{className:k("flex items-baseline gap-4",o),children:[e.jsxs("div",{className:k("mb-1 flex min-w-0 items-center gap-x-1 text-sm",r&&"opacity-50"),children:[e.jsx("div",{className:"whitespace-nowrap",children:t&&l?e.jsx(b,{className:"flex h-auto items-center gap-1.5 truncate p-0 font-semibold text-primary hover:opacity-70",variant:"link",onClick:l,children:s||"Unknown"}):e.jsx("span",{className:"block truncate font-semibold",children:s||"Unknown"})}),n===!1&&e.jsx(D,{children:e.jsxs($,{children:[e.jsx(F,{asChild:!0,children:e.jsx("span",{"data-testid":"commenting-disabled-indicator",children:e.jsx(ie,{className:"size-3.5 text-muted-foreground"})})}),e.jsx(E,{children:"Comments disabled"})]})}),e.jsx(K,{className:"shrink-0 text-muted-foreground/50",size:16}),e.jsx("div",{className:"shrink-0 whitespace-nowrap",children:a&&e.jsx(D,{children:e.jsxs($,{children:[e.jsx(F,{asChild:!0,children:e.jsx("span",{className:"cursor-default text-sm text-muted-foreground",children:T(a)})}),e.jsx(E,{children:Cs(a)})]})})}),c&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 text-muted-foreground",children:"on"}),e.jsx("div",{className:"min-w-0 truncate",children:i?e.jsx(b,{className:"block h-auto w-full cursor-pointer truncate p-0 text-left font-medium text-gray-800 hover:opacity-70 dark:text-gray-400",variant:"link",onClick:i,children:c}):e.jsx("span",{className:"font-medium text-gray-800 dark:text-gray-400",children:c})})]})]}),r&&e.jsx(Te,{variant:"secondary",children:"Hidden"})]})}function ws({open:s,memberName:t,onOpenChange:a,onConfirm:r}){const[n,l]=h.useState(!1),c=o=>{o||l(!1),a(o)},i=()=>{r(n),l(!1)};return e.jsx(O,{open:s,onOpenChange:c,children:e.jsxs(U,{className:"gap-5",children:[e.jsxs(V,{children:[e.jsx(q,{children:"Disable comments"}),e.jsxs(Me,{children:[t||"This member"," won't be able to comment in the future. You can re-enable commenting anytime."]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(me,{checked:n,id:"hide-comments",onCheckedChange:o=>l(o===!0)}),e.jsx(is,{htmlFor:"hide-comments",children:"Hide all previous comments"})]}),e.jsxs(A,{children:[e.jsx(b,{variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsx(b,{onClick:i,children:"Disable comments"})]})]})})}function je({comment:s,commentPermalinksEnabled:t}){const{mutate:a}=Re(),{mutate:r}=Ie(),[n,l]=h.useState(!1),{id:c,post:i,member:o}=s,d=i?.url,m=o?.id,x=o?.can_comment,f=N=>{m&&(a({id:m,reason:`Disabled from comment ${c}`,hideComments:N}),l(!1))},v=()=>{m&&r({id:m})};return e.jsxs(e.Fragment,{children:[e.jsxs(ze,{children:[e.jsx(De,{asChild:!0,children:e.jsx(b,{className:"relative z-10 text-gray-800 hover:bg-secondary [&_svg]:size-4",size:"sm",variant:"ghost",children:e.jsx($e,{})})}),e.jsxs(Fe,{align:"start",children:[d&&(t?e.jsx(L,{asChild:!0,children:e.jsxs("a",{href:`${d}#ghost-comments-${c}`,rel:"noopener noreferrer",target:"_blank",children:[e.jsx(X,{className:"size-4"}),"View on post"]})}):e.jsx(L,{asChild:!0,children:e.jsxs("a",{href:d,rel:"noopener noreferrer",target:"_blank",children:[e.jsx(X,{className:"size-4"}),"View post"]})})),m&&e.jsx(L,{asChild:!0,children:e.jsxs("a",{href:`#/members/${m}`,children:[e.jsx(H,{className:"size-4"}),"View member"]})}),m&&(x!==!1?e.jsxs(L,{onClick:()=>l(!0),children:[e.jsx(ie,{className:"size-4"}),"Disable commenting"]}):e.jsxs(L,{onClick:v,children:[e.jsx(Ee,{className:"size-4"}),"Enable commenting"]}))]})]}),e.jsx(ws,{memberName:o?.name,open:n,onConfirm:f,onOpenChange:l})]})}function ks({comment:s,open:t,onOpenChange:a}){const{data:r,isLoading:n}=vs(s.id,{enabled:t}),l=r?.comment_likes??[],c=s.count?.likes??0,i=c-l.length;return e.jsx(O,{open:t,onOpenChange:a,children:e.jsxs(U,{"aria-describedby":void 0,children:[e.jsx(V,{children:e.jsxs(q,{children:[c," ",c===1?"like":"likes"]})}),e.jsx("div",{className:"overflow-hidden rounded-md border p-3",children:e.jsxs("div",{className:"flex min-w-0 items-start gap-3",children:[e.jsx(P,{avatarImage:s.member?.avatar_image,className:"shrink-0",memberId:s.member?.id}),e.jsxs("div",{className:"flex min-w-0 flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-1 text-sm",children:[e.jsx("span",{className:"shrink-0 font-semibold",children:s.member?.name||"Unknown"}),e.jsx(K,{className:"shrink-0 text-muted-foreground/50",size:16}),e.jsx("span",{className:"shrink-0 text-muted-foreground",children:s.created_at&&T(s.created_at)}),e.jsx("span",{className:"shrink-0 text-muted-foreground",children:"on"}),e.jsx("span",{className:"min-w-0 truncate font-medium text-gray-800 dark:text-gray-400",children:s.post?.title||"Unknown post"})]}),e.jsx("div",{dangerouslySetInnerHTML:{__html:s.html||""},className:"prose mt-2 line-clamp-2 text-sm [&_*]:text-sm [&_*]:leading-[1.5em] [&_p]:m-0"})]})]})}),e.jsx("div",{className:"-mx-1 max-h-64 overflow-y-auto px-1",children:n?e.jsx("div",{className:"flex justify-center py-4",children:e.jsx(M,{size:"md"})}):e.jsxs("div",{className:"flex flex-col gap-3 pb-1",children:[l.map(o=>e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"relative shrink-0",children:[e.jsx(P,{avatarImage:o.member?.avatar_image,memberId:o.member?.id}),e.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full bg-pink-500 text-white",children:e.jsx(re,{className:"size-2.5",fill:"currentColor"})})]}),e.jsx("span",{className:"font-medium",children:o.member?.name||"Deleted member"})]}),e.jsx("span",{className:"shrink-0 text-sm text-muted-foreground",children:T(o.created_at)})]},o.id)),i>0&&e.jsxs("div",{className:"pt-1 text-center text-sm text-muted-foreground",children:["and ",i," more"]})]})}),e.jsx(A,{children:e.jsx(b,{onClick:()=>a(!1),children:"OK"})})]})})}function ys({comment:s,open:t,onOpenChange:a}){const{data:r,isLoading:n}=gs(s.id,{enabled:t}),l=r?.comment_reports??[],c=s.count?.reports??l.length;return e.jsx(O,{open:t,onOpenChange:a,children:e.jsxs(U,{"aria-describedby":void 0,children:[e.jsx(V,{children:e.jsxs(q,{children:[c," ",c===1?"report":"reports"]})}),e.jsx("div",{className:"overflow-hidden rounded-md border p-3",children:e.jsxs("div",{className:"flex min-w-0 items-start gap-3",children:[e.jsx(P,{avatarImage:s.member?.avatar_image,className:"shrink-0",memberId:s.member?.id}),e.jsxs("div",{className:"flex min-w-0 flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-1 text-sm",children:[e.jsx("span",{className:"shrink-0 font-semibold",children:s.member?.name||"Unknown"}),e.jsx(K,{className:"shrink-0 text-muted-foreground/50",size:16}),e.jsx("span",{className:"shrink-0 text-muted-foreground",children:s.created_at&&T(s.created_at)}),e.jsx("span",{className:"shrink-0 text-muted-foreground",children:"on"}),e.jsx("span",{className:"min-w-0 truncate font-medium text-gray-800 dark:text-gray-400",children:s.post?.title||"Unknown post"})]}),e.jsx("div",{dangerouslySetInnerHTML:{__html:s.html||""},className:"prose mt-2 line-clamp-2 text-sm [&_*]:text-sm [&_*]:leading-[1.5em] [&_p]:m-0"})]})]})}),e.jsx("div",{className:"-mx-1 max-h-64 overflow-y-auto px-1",children:n?e.jsx("div",{className:"flex justify-center py-4",children:e.jsx(M,{size:"md"})}):e.jsx("div",{className:"flex flex-col gap-3 pb-1",children:l.map(i=>e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"relative shrink-0",children:[e.jsx(P,{avatarImage:i.member?.avatar_image,memberId:i.member?.id}),e.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full bg-red text-white",children:e.jsx(W,{className:"size-2.5",fill:"currentColor"})})]}),e.jsx("span",{className:"font-medium",children:i.member?.name||"Deleted member"})]}),e.jsx("span",{className:"shrink-0 text-sm text-muted-foreground",children:T(i.created_at)})]},i.id))})}),e.jsx(A,{children:e.jsx(b,{onClick:()=>a(!1),children:"OK"})})]})})}function z({icon:s,count:t,label:a,to:r,onClick:n,className:l,testId:c}){const i=k("flex items-center gap-1 text-xs text-gray-800",l),o=e.jsxs(e.Fragment,{children:[s,e.jsx("span",{children:He(t)})]}),d=r||n;return e.jsx(D,{children:e.jsxs($,{children:[e.jsx(F,{asChild:!0,children:r?e.jsx(Q,{className:k(i,"cursor-pointer hover:opacity-70"),"data-testid":c,to:r,onClick:m=>{m.stopPropagation()},children:o}):n?e.jsx("button",{className:k(i,"cursor-pointer hover:opacity-70"),"data-testid":c,type:"button",onClick:m=>{m.stopPropagation(),n()},children:o}):e.jsx("div",{className:i,"data-testid":c,children:o})}),e.jsx(E,{children:d?`View ${a.toLowerCase()}`:a})]})})}function G(s,t){if(!t)return;const a=new URLSearchParams(s);return a.set("thread",`is:${t}`),`?${a.toString()}`}function ge({comment:s,className:t}){const[a]=R(),[r,n]=h.useState(!1),[l,c]=h.useState(!1),i=G(a,s.id),o=s.count?.direct_replies??s.count?.replies??s.replies?.length??0,d=s.count?.likes??0,m=s.count?.reports??0,x=o>0,f=d>0,v=m>0;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:k("flex items-center gap-6",t),children:[e.jsx(z,{count:o,icon:e.jsx(ls,{size:16,strokeWidth:1.5}),label:"Replies",testId:"replies-metric",to:x?i:void 0}),e.jsx(z,{count:d,icon:e.jsx(re,{size:16,strokeWidth:1.5}),label:"Likes",onClick:f?()=>n(!0):void 0}),e.jsx(z,{className:v?"font-semibold text-red":void 0,count:m,icon:e.jsx(W,{size:16,strokeWidth:1.5}),label:"Reports",onClick:v?()=>c(!0):void 0})]}),e.jsx(ks,{comment:s,open:r,onOpenChange:n}),e.jsx(ys,{comment:s,open:l,onOpenChange:c})]})}function _s({hasReplies:s}){return s?e.jsx("div",{className:"mb-2 h-full w-px grow rounded bg-gradient-to-b from-muted-foreground/20 from-70% to-transparent","data-testid":"replies-line"}):null}function be({comment:s,isReply:t=!1,isSelectedComment:a=!1,selectedCommentId:r,commentPermalinksEnabled:n}){const[l]=R(),{mutate:c}=xe(),{mutate:i}=pe(),o=(s.replies?.length??0)>0||(s.count?.direct_replies??s.count?.replies??0)>0,d=!o||t?"mb-7":"mb-0";return e.jsxs("div",{className:`flex w-full flex-row ${d}`,children:[e.jsxs("div",{className:"mr-2 flex shrink-0 flex-col items-center justify-start md:mr-3",children:[e.jsx(P,{avatarImage:s.member?.avatar_image,className:"mb-3 shrink-0 md:mb-4",isHidden:s.status==="hidden",memberId:s.member?.id}),e.jsx(_s,{hasReplies:o&&!t})]}),e.jsx("div",{className:"grow",children:e.jsxs("div",{className:"w-full","data-testid":`comment-thread-row-${s.id}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col",children:[e.jsx(fe,{canComment:s.member?.can_comment,createdAt:s.created_at,isHidden:s.status==="hidden",memberId:s.member?.id,memberName:s.member?.name}),s.in_reply_to_snippet&&a&&e.jsxs("div",{className:`mb-1 line-clamp-1 text-sm ${s.status==="hidden"&&"opacity-50"}`,children:[e.jsx("span",{className:"text-muted-foreground",children:"Replied to:"})," ",e.jsx(Q,{className:"text-sm font-normal text-muted-foreground hover:text-foreground","data-testid":"replied-to-link",to:G(l,s.in_reply_to_id||s.parent_id)||"",onClick:m=>{m.stopPropagation()},children:s.in_reply_to_snippet})]}),e.jsx(ue,{item:s}),e.jsxs("div",{className:"mt-4 flex flex-row flex-wrap items-center gap-3",children:[s.status==="published"&&e.jsxs(b,{className:"text-gray-800",size:"sm",variant:"outline",onClick:()=>c({id:s.id}),children:[e.jsx(le,{}),e.jsx("span",{className:"max-md:hidden",children:"Hide"})]}),s.status==="hidden"&&e.jsxs(b,{className:"text-gray-800",size:"sm",variant:"outline",onClick:()=>i({id:s.id}),children:[e.jsx(oe,{}),e.jsx("span",{className:"max-md:hidden",children:"Show"})]}),e.jsx(ge,{comment:s}),e.jsx(je,{comment:s,commentPermalinksEnabled:n})]})]}),o&&s.replies&&e.jsx("div",{className:"-ml-2 mb-4 mt-7 pl-2 md:-ml-3 md:mb-0 md:mt-8 md:pl-3",children:s.replies.map(m=>e.jsx(be,{comment:m,commentPermalinksEnabled:n,isReply:!0,selectedCommentId:r},m.id))})]})})]})}const Ss=({selectedComment:s,replies:t,selectedCommentId:a,commentPermalinksEnabled:r,fetchNextPage:n,hasNextPage:l,isFetchingNextPage:c})=>{const i={...s,replies:t};return e.jsxs("div",{className:"flex flex-col","data-testid":"comment-thread-list",children:[e.jsx(be,{comment:i,commentPermalinksEnabled:r,isSelectedComment:!0,selectedCommentId:a}),l&&e.jsx("div",{className:"flex justify-center pb-4",children:e.jsx(b,{disabled:c,variant:"outline",onClick:()=>n(),children:c?e.jsxs(e.Fragment,{children:[e.jsx(M,{size:"sm"}),"Loading..."]}):"Load more replies"})})]})},Ps=({commentId:s,open:t,onOpenChange:a,commentPermalinksEnabled:r})=>{const{data:n,isLoading:l,isError:c,fetchNextPage:i,hasNextPage:o,isFetchingNextPage:d}=Ns(s??"",{enabled:t&&!!s}),{data:m,isLoading:x,isError:f}=fs(s??"",{enabled:t&&!!s}),v=l||x,N=f||c&&!m,p=m?.comments?.[0],C=n?.comments||[];return e.jsx(Be,{open:t,onOpenChange:a,children:e.jsxs(Oe,{className:"overflow-y-auto px-6 pt-0 sm:max-w-[600px]",children:[e.jsx(Ue,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:e.jsx(Ve,{className:"text-md",children:"Thread"})}),p?.post&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h3",{className:"line-clamp-1 text-xl font-semibold text-foreground",children:p.post.title}),p.post.excerpt&&e.jsx("p",{className:"mt-1 line-clamp-2 text-sm text-muted-foreground",children:p.post.excerpt})]}),p.post.feature_image&&e.jsx("img",{alt:p.post.title||"Post feature image",className:"hidden aspect-video h-18 shrink-0 rounded object-cover lg:block",src:p.post.feature_image})]}),e.jsx(qe,{className:"-mx-6 my-6 w-auto"})]}),e.jsx("div",{children:v?e.jsx("div",{className:"flex h-full items-center justify-center py-8",children:e.jsx(M,{size:"lg"})}):N||!p?e.jsx("div",{className:"flex h-full items-center justify-center py-8",children:e.jsx(de,{actions:e.jsx(b,{variant:"outline",onClick:()=>a(!1),children:"Back to comments"}),description:"This thread may have been deleted or doesn't exist.",title:"Thread not found",children:e.jsx(ne,{})})}):e.jsx(Ss,{commentPermalinksEnabled:r,fetchNextPage:i,hasNextPage:o,isFetchingNextPage:d,replies:C,selectedComment:p,selectedCommentId:s??""})})]})})},ee=new Map;function Ls({parentRef:s,enabled:t=!0,isLoading:a=!1}){const r=Ae(),[n,l]=h.useState(null),c=h.useRef(null);h.useEffect(()=>{if(!t||!s.current)return;const i=ts(s.current);l(i)},[t,s]),h.useEffect(()=>{if(!t||!n)return;const i=r.pathname+r.search,o=()=>{const d=n.scrollTop;ee.set(i,d)};return n.addEventListener("scroll",o),()=>n.removeEventListener("scroll",o)},[t,r.pathname,r.search,n]),h.useEffect(()=>{const i=r.pathname+r.search,o=ee.get(i);if(!(!t||!n||a)){if(o!==void 0&&c.current!==i){let d=0;const m=3,x=()=>{if(d+=1,!n)return;const v=n.scrollTop,N=n.scrollHeight,p=n.clientHeight,C=N-p;if(o>C&&d<m){setTimeout(x,100);return}if(Math.abs(o-v)>5){const _=Math.min(o,C);n.scrollTop=_}},f=setTimeout(x,150);return()=>clearTimeout(f)}c.current=i}},[t,r.pathname,r.search,n,a])}const se=({height:s})=>e.jsx("div",{"aria-hidden":"true",className:"flex",children:e.jsx("div",{className:"flex",style:{height:s}})}),Ts=h.forwardRef(function(t,a){return e.jsx("div",{ref:a,...t,"aria-hidden":"true",className:"relative flex flex-col",children:e.jsx("div",{className:"relative z-10 h-24 animate-pulse",children:e.jsx("div",{className:"h-full rounded-md bg-muted","data-testid":"loading-placeholder"})})})});function Ms({items:s,totalItems:t,hasNextPage:a,isFetchingNextPage:r,fetchNextPage:n,onAddFilter:l,isLoading:c,commentPermalinksEnabled:i}){const o=h.useRef(null),[d,m]=R(),[x,f]=h.useState(!1),[v,N]=h.useState(null),{mutate:p}=xe(),{mutate:C}=pe(),_=g=>{if(f(g),!g){const y=new URLSearchParams(d);y.delete("thread"),m(y,{replace:!0})}};h.useEffect(()=>{const g=d.get("thread");if(g){const y=g.match(/^is:(.+)$/);if(y&&y[1]){const u=y[1];N(u),f(!0)}else f(!1),N(null)}else f(!1),N(null)},[d]),Ls({parentRef:o,isLoading:c});const{visibleItems:w,spaceBefore:j,spaceAfter:S}=as({items:s,totalItems:t,hasNextPage:a,isFetchingNextPage:r,fetchNextPage:n,parentRef:o});return e.jsxs("div",{ref:o,className:"overflow-hidden",children:[e.jsx("div",{className:"flex flex-col","data-testid":"comments-list",children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx(se,{height:j}),w.map(({key:g,virtualItem:y,item:u,props:Y})=>y.index>s.length-1?e.jsx(Ts,{...Y},g):e.jsxs("div",{...Y,className:"grid w-full grid-cols-1 items-start justify-between gap-4 border-b p-3 hover:bg-muted/50 md:p-5 lg:grid-cols-[minmax(0,1fr)_144px]","data-testid":"comment-list-row",onClick:()=>{x&&_(!1)},children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(P,{avatarImage:u.member?.avatar_image,isHidden:u.status==="hidden",memberId:u.member?.id}),e.jsxs("div",{className:"flex min-w-0 flex-col",children:[e.jsx(fe,{canComment:u.member?.can_comment,createdAt:u.created_at,isHidden:u.status==="hidden",memberId:u.member?.id,memberName:u.member?.name,postTitle:u.post?.title,onAuthorClick:u.member?.id?()=>l("author",u.member.id):void 0,onPostClick:u.post?.id?()=>l("post",u.post.id):void 0}),u.in_reply_to_snippet&&e.jsxs("div",{className:`mb-1 line-clamp-1 max-w-3xl text-sm ${u.status==="hidden"&&"opacity-50"}`,children:[e.jsx("span",{className:"text-muted-foreground",children:"Replied to:"})," ",e.jsx(Q,{className:"text-sm font-normal text-muted-foreground hover:text-foreground","data-testid":"replied-to-link",to:G(d,u.in_reply_to_id||u.parent_id)||"",onClick:Ne=>{Ne.stopPropagation()},children:u.in_reply_to_snippet})]}),e.jsx(ue,{item:u}),e.jsxs("div",{className:"mt-4 flex flex-row flex-nowrap items-center gap-3",children:[u.status==="published"&&e.jsxs(b,{className:"text-foreground",size:"sm",variant:"outline",onClick:()=>p({id:u.id}),children:[e.jsx(le,{}),"Hide"]}),u.status==="hidden"&&e.jsxs(b,{className:"text-foreground",size:"sm",variant:"outline",onClick:()=>C({id:u.id}),children:[e.jsx(oe,{}),"Show"]}),e.jsx(ge,{className:"ml-2",comment:u}),e.jsx(je,{comment:u,commentPermalinksEnabled:i})]})]})]}),e.jsx("div",{children:u.post?.feature_image?e.jsx("img",{alt:u.post.title||"Post feature image",className:`hidden aspect-video w-36 rounded object-cover lg:block ${u.status==="hidden"&&"opacity-50"}`,src:u.post.feature_image}):null})]},g)),e.jsx(se,{height:S})]})}),e.jsx(Ps,{commentId:v,commentPermalinksEnabled:i,open:x,onOpenChange:_})]})}const ve=["id","status","created_at","body","post","author","reported"];function Rs(s){const t=[];for(const a of s)if(a.values[0])switch(a.field){case"id":t.push(`id:'${a.values[0]}'`);break;case"status":t.push(`status:${a.values[0]}`);break;case"created_at":if(a.operator==="before"&&a.values[0])t.push(`created_at:<'${a.values[0]}'`);else if(a.operator==="after"&&a.values[0])t.push(`created_at:>'${a.values[0]}'`);else if(a.operator==="is"&&a.values[0]){const l=String(a.values[0]),c=new Date(l+"T00:00:00").toISOString(),i=new Date(l+"T23:59:59.999").toISOString();t.push(`created_at:>='${c}'+created_at:<='${i}'`)}break;case"body":const n=a.values[0].replace(/'/g,"\\'");a.operator==="contains"?t.push(`html:~'${n}'`):a.operator==="not_contains"&&t.push(`html:-~'${n}'`);break;case"post":a.operator==="is_not"?t.push(`post_id:-${a.values[0]}`):t.push(`post_id:${a.values[0]}`);break;case"author":a.operator==="is_not"?t.push(`member_id:-${a.values[0]}`):t.push(`member_id:${a.values[0]}`);break;case"reported":a.values[0]==="true"?t.push("count.reports:>0"):a.values[0]==="false"&&t.push("count.reports:0");break}return t.length?t.join("+"):void 0}function Is(s){if(!s)return null;const t=s.indexOf(":");return t<=0?null:{operator:s.substring(0,t),value:s.substring(t+1)}}function zs(s){const t=[];for(const[a,r]of s.entries()){if(!ve.includes(a)||!r)continue;const n=Is(r);n&&t.push({id:a,field:a,operator:n.operator,values:[n.value]})}return t}function Ds(s){const t=new URLSearchParams;for(const a of s)if(ve.includes(a.field)&&a.values[0]!==void 0){const r=`${a.operator}:${String(a.values[0])}`;t.set(a.field,r)}return t}function $s(){const[s,t]=R(),a=h.useMemo(()=>zs(s),[s]),r=h.useCallback((i,o={})=>{const d=typeof i=="function"?i(a):i,m=Ds(d),x=o.replace??!0;t(m,{replace:x})},[a,t]),n=h.useCallback(({replace:i=!0}={})=>{t(new URLSearchParams,{replace:i})},[t]),l=h.useMemo(()=>Rs(a),[a]),c=h.useMemo(()=>a.length===1&&a[0].field==="id",[a]);return{filters:a,nql:l,setFilters:r,clearFilters:n,isSingleIdFilter:c}}function Fs({comments:s}){return h.useMemo(()=>{const t=new Map,a=new Map;for(const r of s)r.post?.id&&r.post?.title&&t.set(r.post.id,{id:r.post.id,title:r.post.title}),r.member?.id&&a.set(r.member.id,{id:r.member.id,name:r.member.name,email:r.member.email});return{knownPosts:Array.from(t.values()),knownMembers:Array.from(a.values())}},[s])}const Gs=()=>{const{filters:s,nql:t,setFilters:a,clearFilters:r,isSingleIdFilter:n}=$s(),{data:l}=Qe(),c=l?.config?.labs?.commentPermalinks===!0,i=h.useCallback((w,j,S="is")=>{a(g=>[...g.filter(u=>u.field!==w),Ke(w,S,[j])],{replace:!1})},[a]),{data:o,isError:d,isFetching:m,isFetchingNextPage:x,isRefetching:f,fetchNextPage:v,hasNextPage:N}=he({searchParams:t?{filter:t}:{},keepPreviousData:!0}),{knownPosts:p,knownMembers:C}=Fs({comments:o?.comments??[]}),_=m&&!x&&!f;return e.jsxs(hs,{children:[e.jsx(us,{children:!n&&e.jsx(ms,{filters:s,knownMembers:C,knownPosts:p,onFiltersChange:a})}),e.jsx(os,{children:_?e.jsx("div",{className:"flex h-full items-center justify-center",children:e.jsx(M,{size:"lg"})}):d?e.jsxs("div",{className:"mb-16 flex h-full flex-col items-center justify-center",children:[e.jsx("h2",{className:"mb-2 text-xl font-medium",children:"Error loading comments"}),e.jsx("p",{className:"mb-4 text-muted-foreground",children:"Please reload the page to try again"}),e.jsx(b,{onClick:()=>window.location.reload(),children:"Reload page"})]}):o?.comments.length?e.jsxs(e.Fragment,{children:[e.jsx(Ms,{commentPermalinksEnabled:c,fetchNextPage:v,hasNextPage:N,isFetchingNextPage:x,isLoading:m&&!x,items:o?.comments??[],totalItems:o?.meta?.pagination?.total??0,onAddFilter:i}),n&&e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(b,{variant:"outline",onClick:()=>r({replace:!1}),children:"Show all comments"})})]}):e.jsx("div",{className:"flex h-full items-center justify-center",children:e.jsx(de,{title:"No comments yet",children:e.jsx(ne,{})})})})]})};export{Gs as default};
|