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.
Files changed (191) hide show
  1. package/components/tryghost-i18n-6.19.0.tgz +0 -0
  2. package/components/tryghost-parse-email-address-6.19.0.tgz +0 -0
  3. package/core/built/admin/assets/{PolarAngleAxis-DALH8FDm.js → PolarAngleAxis-CGprvq8M.js} +1 -1
  4. package/core/built/admin/assets/{_baseAssignValue-D_UsvJRN.js → _baseAssignValue-Bwn07Ln5.js} +1 -1
  5. package/core/built/admin/assets/{a-large-small-DVyx4GMu.js → a-large-small-p58xibEK.js} +1 -1
  6. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  7. package/core/built/admin/assets/admin-x-settings/{code-editor-view-DBrulgE8.mjs → code-editor-view-DCKvO1TY.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-DgGwb1L-.mjs → index-BxWVtVnD.mjs} +6 -6
  9. package/core/built/admin/assets/admin-x-settings/{index-Cypgljb3.mjs → index-DyZIONe1.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{index-CsGHbqSU.mjs → index-HfMJcj2U.mjs} +2 -2
  11. package/core/built/admin/assets/admin-x-settings/{modals-rdo7i0D3.mjs → modals-CIiqfKY0.mjs} +7593 -7509
  12. package/core/built/admin/assets/{at-sign-CGNkBrZS.js → at-sign-BZPuAx5m.js} +1 -1
  13. package/core/built/admin/assets/audience-Cy9gLIa9.js +1 -0
  14. package/core/built/admin/assets/{avatar-flipboard-jqr9Aapd.js → avatar-flipboard-CLmWb5Xn.js} +1 -1
  15. package/core/built/admin/assets/{bluesky-sharing-C2749SVt.js → bluesky-sharing-BHt0oiii.js} +1 -1
  16. package/core/built/admin/assets/{chart-BAQCVPCH.js → chart--RFLGIL4.js} +1 -1
  17. package/core/built/admin/assets/{chunk.524.428356d01feabbc7b932.js → chunk.524.5c5c3f3273a86d1d9913.js} +7 -7
  18. package/core/built/admin/assets/{chunk.582.b8b41ba720f49d724992.js → chunk.582.e6c787cdf7e6de7819e0.js} +9 -9
  19. package/core/built/admin/assets/{code-editor-view-YNhJ1w71.js → code-editor-view-BW9y0JXN.js} +1 -1
  20. package/core/built/admin/assets/comments-C_lilDBp.js +1 -0
  21. package/core/built/admin/assets/content-helpers-BOnQQADZ.js +1 -0
  22. package/core/built/admin/assets/{copy-CNsHZEFR.js → copy-Bi7VpgPR.js} +1 -1
  23. package/core/built/admin/assets/{data-list-Dn5MkmyD.js → data-list-Bu3jzs1s.js} +1 -1
  24. package/core/built/admin/assets/{deleted-feed-item-Dmm_clMl.js → deleted-feed-item-B-doIIKc.js} +1 -1
  25. package/core/built/admin/assets/{edit-profile-BLSdtROQ.js → edit-profile-ZBdjFfvL.js} +1 -1
  26. package/core/built/admin/assets/{empty-indicator-C2Z0dddU.js → empty-indicator-C6BBh99D.js} +1 -1
  27. package/core/built/admin/assets/{en-DuTkaMAI.js → en-C7eSFQRw.js} +1 -1
  28. package/core/built/admin/assets/{feed-B4Xp4C2J.js → feed-CAioauwD.js} +1 -1
  29. package/core/built/admin/assets/{filters-gnOx5Z45.js → filters-DEKF0tIB.js} +1 -1
  30. package/core/built/admin/assets/{gh-chart-B2aWYkGg.js → gh-chart-D9KI0_sO.js} +1 -1
  31. package/core/built/admin/assets/{ghost-29f8f3c80e41126ba5e3c52ad5727e8a.js → ghost-6bff5c535ef015b0ed9421ceb6c699a7.js} +220 -211
  32. package/core/built/admin/assets/{growth-BysawIWe.js → growth-C6XGchvT.js} +1 -1
  33. package/core/built/admin/assets/{hash-j3sh-UI3.js → hash-DFhnGHId.js} +1 -1
  34. package/core/built/admin/assets/{inbox-1cUdr8Mm.js → inbox-p-Y5uScT.js} +1 -1
  35. package/core/built/admin/assets/{index-BVoBTlp_.js → index--VlvGKWi.js} +1 -1
  36. package/core/built/admin/assets/{index-DGBK5k9H.js → index-3uU4zg_6.js} +1 -1
  37. package/core/built/admin/assets/index-4ZkTY34B.css +1 -0
  38. package/core/built/admin/assets/{index-BhY_SbGB.js → index-BWnrLoWI.js} +1 -1
  39. package/core/built/admin/assets/{index-I9n711UW.js → index-BzU2odQq.js} +1 -1
  40. package/core/built/admin/assets/{index-mhojl7aD.js → index-CIZ_upe2.js} +1 -1
  41. package/core/built/admin/assets/{index-WjY3mGep.js → index-CS4XqyC-.js} +2 -2
  42. package/core/built/admin/assets/{index-BgrwCpgw.js → index-D17PEsUB.js} +1 -1
  43. package/core/built/admin/assets/{index-B8G0f0hb.js → index-DCTdAEHx.js} +3 -3
  44. package/core/built/admin/assets/{index-DarAAzVH.js → index-FPf-AERu.js} +1 -1
  45. package/core/built/admin/assets/index-JmqyGBro.js +1 -0
  46. package/core/built/admin/assets/{index-DKAlEWM4.js → index-LyfDjTto.js} +1 -1
  47. package/core/built/admin/assets/index-S62-c8TV.js +13 -0
  48. package/core/built/admin/assets/{index-D8CXbJm4.js → index-Wx8_AGZX.js} +1 -1
  49. package/core/built/admin/assets/{index-CkAUXgAi.js → index-jAidr8jI.js} +1 -1
  50. package/core/built/admin/assets/{index-Dz8eTtOq.js → index-lPLmWtv0.js} +1 -1
  51. package/core/built/admin/assets/koenig-lexical/index.css +1 -1
  52. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +1853 -1863
  53. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +94 -94
  54. package/core/built/admin/assets/{koenig-lexical-coiS9dIC.js → koenig-lexical-CWnkYKQt.js} +77 -77
  55. package/core/built/admin/assets/{kpi-card-BEFHo2gr.js → kpi-card-B5UaJgOT.js} +1 -1
  56. package/core/built/admin/assets/{kpis-D-gz-lUk.js → kpis-Cc2RxnvZ.js} +1 -1
  57. package/core/built/admin/assets/{label-BvlHzzcJ.js → label-CW7Kmp9w.js} +1 -1
  58. package/core/built/admin/assets/{links-tdJvBrsT.js → links-wWNc9Uat.js} +1 -1
  59. package/core/built/admin/assets/{list-filter-DPE4Xj2T.js → list-filter-3EF6cVg-.js} +1 -1
  60. package/core/built/admin/assets/{lucide-react-ClQ3Iy7l.js → lucide-react-DtMIZssr.js} +214 -214
  61. package/core/built/admin/assets/{main-layout-DY96wK-_.js → main-layout-BFYhCrLn.js} +1 -1
  62. package/core/built/admin/assets/{message-square-text-Dd1XS5-H.js → message-square-text-BDZtUW-2.js} +1 -1
  63. package/core/built/admin/assets/{minus-CyEc3BE5.js → minus-CSphShdJ.js} +1 -1
  64. package/core/built/admin/assets/modals-CDWP04Iy.js +77 -0
  65. package/core/built/admin/assets/{moderation-B0fdmlig.js → moderation-qcng2_lB.js} +1 -1
  66. package/core/built/admin/assets/{newsletter-Byg3ARa5.js → newsletter-R-IYcV4M.js} +1 -1
  67. package/core/built/admin/assets/{newsletters-DbH39vgA.js → newsletters-BB4e24i1.js} +1 -1
  68. package/core/built/admin/assets/{note-Cwy-rIAF.js → note-B_bpRX66.js} +1 -1
  69. package/core/built/admin/assets/overview-Nh-IoP-v.js +1 -0
  70. package/core/built/admin/assets/{pagemenu-CkzsZrHC.js → pagemenu-Cd45frnF.js} +1 -1
  71. package/core/built/admin/assets/{post-analytics-context-BLkup0Xh.js → post-analytics-context-BST4bzps.js} +1 -1
  72. package/core/built/admin/assets/post-analytics-header-DAZPp6M8.js +1 -0
  73. package/core/built/admin/assets/{post-analytics-aA-nG9Fq.js → post-analytics-jHZOhQ8L.js} +1 -1
  74. package/core/built/admin/assets/{post-share-modal-CkvJtrRw.js → post-share-modal-D1JQfuYx.js} +1 -1
  75. package/core/built/admin/assets/posts/{comments-Bn_vn_sb.mjs → comments-C0ntS6jH.mjs} +678 -692
  76. package/core/built/admin/assets/posts/{dialog-CKPcMrj7.mjs → dialog-CXEmd-rC.mjs} +3 -3
  77. package/core/built/admin/assets/posts/{empty-indicator-kkrhP6K_.mjs → empty-indicator-CY1NEQZt.mjs} +2 -2
  78. package/core/built/admin/assets/posts/{filters-DHsxxy0F.mjs → filters-CWWDQAf0.mjs} +6 -6
  79. package/core/built/admin/assets/posts/{growth-D7ACh-oR.mjs → growth-DUnL-W24.mjs} +20 -19
  80. package/core/built/admin/assets/posts/{heading-BrKVbOxA.mjs → heading-DZWin3nG.mjs} +2 -2
  81. package/core/built/admin/assets/posts/{hooks-BBEMuLiW.mjs → hooks-DQYjPsLg.mjs} +2 -2
  82. package/core/built/admin/assets/posts/{index-C0rRguZx.mjs → index-BiGQFQkQ.mjs} +9 -9
  83. package/core/built/admin/assets/posts/{kpis-1o524OIK.mjs → kpis-DNnkyd0U.mjs} +10 -10
  84. package/core/built/admin/assets/posts/{links-JpeATx1f.mjs → links-D3nSZFlJ.mjs} +4 -4
  85. package/core/built/admin/assets/posts/{loading-indicator-BHAmSf8j.mjs → loading-indicator-CZQmPRvv.mjs} +3 -3
  86. package/core/built/admin/assets/posts/{main-layout-BTItAOQE.mjs → main-layout-D5WnaGr4.mjs} +2 -2
  87. package/core/built/admin/assets/posts/{newsletter-CQdsCEHv.mjs → newsletter-C5eikVBq.mjs} +13 -13
  88. package/core/built/admin/assets/posts/{overview-sYh4JN1D.mjs → overview-C5mCMPJY.mjs} +113 -112
  89. package/core/built/admin/assets/posts/{post-analytics-DtLt2SWx.mjs → post-analytics-Cc2NCQis.mjs} +6 -6
  90. package/core/built/admin/assets/posts/{post-analytics-context-CB1yM9fk.mjs → post-analytics-context-qXWjDzSt.mjs} +44 -41
  91. package/core/built/admin/assets/posts/{post-analytics-header-BYaWuL9W.mjs → post-analytics-header-QGsYyvhA.mjs} +11 -11
  92. package/core/built/admin/assets/posts/{post-share-modal-V0HTOBaf.mjs → post-share-modal-B9Q7FJsH.mjs} +4 -4
  93. package/core/built/admin/assets/posts/posts-C2SKGLoU.mjs +17 -0
  94. package/core/built/admin/assets/posts/posts.js +1 -1
  95. package/core/built/admin/assets/posts/{search-CLjC37AT.mjs → search-C8k0TFkh.mjs} +2 -2
  96. package/core/built/admin/assets/posts/{separator-KNoTIaJx.mjs → separator-CJnnsW1a.mjs} +5 -5
  97. package/core/built/admin/assets/posts/{sheet-DBg_SCDt.mjs → sheet-HDzKgNHc.mjs} +3 -3
  98. package/core/built/admin/assets/posts/{skeleton-DvsoolWu.mjs → skeleton-BlZGKNzB.mjs} +3 -3
  99. package/core/built/admin/assets/posts/{source-icon-OmRaTU2G.mjs → source-icon-DjBIjtaY.mjs} +3 -3
  100. package/core/built/admin/assets/posts/{stats-BC2DzntY.mjs → stats-BRVHejqx.mjs} +4 -4
  101. package/core/built/admin/assets/posts/{table-CxX9OKAj.mjs → table-D7AEpPWL.mjs} +2 -2
  102. package/core/built/admin/assets/posts/{tabs-B1jw7cBi.mjs → tabs-RcpmzDgr.mjs} +10 -10
  103. package/core/built/admin/assets/posts/{tags-BitrLT_j.mjs → tags-8k1xw8R8.mjs} +2 -2
  104. package/core/built/admin/assets/posts/{tags-BBilTo1a.mjs → tags-DNY2rBlf.mjs} +11 -11
  105. package/core/built/admin/assets/posts/{use-infinite-virtual-scroll-DaijA1ao.mjs → use-infinite-virtual-scroll-CMiIpcDA.mjs} +3 -3
  106. package/core/built/admin/assets/posts/{web-CKmyC4Xj.mjs → web-BCl5J6bB.mjs} +15 -15
  107. package/core/built/admin/assets/{posts-DDkuYoN7.js → posts-DFiJPOft.js} +1 -1
  108. package/core/built/admin/assets/{repeat-B-SL0yPM.js → repeat-Smml9n0k.js} +1 -1
  109. package/core/built/admin/assets/{reply-BdCPoUQ9.js → reply-CooY4lmk.js} +1 -1
  110. package/core/built/admin/assets/{select-C7aNW8QS.js → select-WwMsbBbg.js} +1 -1
  111. package/core/built/admin/assets/{settings-D-dhma2e.js → settings-CQEhPDQU.js} +4 -4
  112. package/core/built/admin/assets/{settings-Bzy1GNfD.js → settings-CxWtvcUf.js} +1 -1
  113. package/core/built/admin/assets/{sort-button-Dv8vjh13.js → sort-button-DFr8vezl.js} +1 -1
  114. package/core/built/admin/assets/{source-icon-DTz4isLK.js → source-icon-VpYWpwYb.js} +1 -1
  115. package/core/built/admin/assets/{sprout-BwLQTzMf.js → sprout-DRqlFJSK.js} +1 -1
  116. package/core/built/admin/assets/{square-YF1YE9ex.js → square-CwHQ9sJ2.js} +1 -1
  117. package/core/built/admin/assets/stats/audience-Caf7BjaU.mjs +269 -0
  118. package/core/built/admin/assets/stats/{url-helpers-Drq3xg0l.mjs → content-helpers-MbtAvUJh.mjs} +83 -106
  119. package/core/built/admin/assets/stats/{index-CcCyLMxL.mjs → index-BGqKbF1D.mjs} +8 -8
  120. package/core/built/admin/assets/stats/{index-DXU2rE9t.mjs → index-BTjfXOi6.mjs} +30 -30
  121. package/core/built/admin/assets/stats/{index-K7ASx7EG.mjs → index-ChjIxhHy.mjs} +5 -5
  122. package/core/built/admin/assets/stats/{index-D5mlMG4l.mjs → index-DMkZbbZs.mjs} +14 -14
  123. package/core/built/admin/assets/stats/{index-CUuQaROI.mjs → index-wT0OIw_N.mjs} +355 -335
  124. package/core/built/admin/assets/stats/{sort-button-CELUx6Zp.mjs → sort-button-B8n8fYMi.mjs} +23 -23
  125. package/core/built/admin/assets/stats/{stats-d_u_in4l.mjs → stats-CGH-0JNs.mjs} +120 -119
  126. package/core/built/admin/assets/stats/stats.js +1 -1
  127. package/core/built/admin/assets/stats/{tabs-3wLZsy0v.mjs → tabs-EQCUj3Y9.mjs} +19 -19
  128. package/core/built/admin/assets/stats/{use-growth-stats-28Sr42va.mjs → use-growth-stats--CIfag21.mjs} +3 -3
  129. package/core/built/admin/assets/{stats-C5ad0fgQ.js → stats-lnFiOQZx.js} +1 -1
  130. package/core/built/admin/assets/{stats-view-BvkxPYNX.js → stats-view-BJVawuIv.js} +1 -1
  131. package/core/built/admin/assets/{step-1-D7_s-D99.js → step-1-Bx8MiQVF.js} +1 -1
  132. package/core/built/admin/assets/{step-2-B94Yf7FF.js → step-2-CLLXppER.js} +1 -1
  133. package/core/built/admin/assets/{step-3-DswXYYf4.js → step-3-C5WrQe8u.js} +2 -2
  134. package/core/built/admin/assets/{table-D30IXfUP.js → table-2waWpIF5.js} +1 -1
  135. package/core/built/admin/assets/{tabs-CjNdfW0y.js → tabs-CBD0hW8V.js} +1 -1
  136. package/core/built/admin/assets/{tags-B0ux9_dT.js → tags-Bgw5Hrb5.js} +1 -1
  137. package/core/built/admin/assets/{tags-PGeGAafJ.js → tags-CKrBptuC.js} +1 -1
  138. package/core/built/admin/assets/{tiers-BaXK0JoI.js → tiers-CO-pz1FX.js} +1 -1
  139. package/core/built/admin/assets/{toggle-group-DdY8HF3Y.js → toggle-group-BXAZzvJ9.js} +1 -1
  140. package/core/built/admin/assets/{topic-filter-Boh22uGD.js → topic-filter-U3qUH2P_.js} +1 -1
  141. package/core/built/admin/assets/{trash-D7ZWrnDq.js → trash-CJY1Wro_.js} +1 -1
  142. package/core/built/admin/assets/{use-growth-stats-Bg0nE0WG.js → use-growth-stats-BrLZI7da.js} +1 -1
  143. package/core/built/admin/assets/{use-infinite-virtual-scroll-DoeI5IY-.js → use-infinite-virtual-scroll-CiRn3kpz.js} +2 -2
  144. package/core/built/admin/assets/{use-simple-pagination-BJzBULR3.js → use-simple-pagination-CskJ0MDP.js} +1 -1
  145. package/core/built/admin/assets/{user-round-check-BLc3L-ei.js → user-round-check-zOuzV3OS.js} +1 -1
  146. package/core/built/admin/assets/{wallet-cards-xX4QZik7.js → wallet-cards-ddLuIN-b.js} +1 -1
  147. package/core/built/admin/assets/{web-DQ2qBymm.js → web-CGbkZWn3.js} +1 -1
  148. package/core/built/admin/index.html +6 -5
  149. package/core/frontend/services/theme-engine/i18n/i18n.js +9 -14
  150. package/core/server/api/endpoints/settings-public.js +3 -1
  151. package/core/server/api/endpoints/utils/serializers/input/settings.js +6 -1
  152. package/core/server/data/migrations/versions/6.19/2026-02-10-12-00-00-add-transistor-portal-settings.js +39 -0
  153. package/core/server/data/schema/default-settings/default-settings.json +28 -0
  154. package/core/server/data/schema/schema.js +2 -2
  155. package/core/server/data/seeders/importers/offers-importer.js +2 -2
  156. package/core/server/data/tinybird/endpoints/api_top_pages_router.pipe +28 -0
  157. package/core/server/data/tinybird/endpoints/api_top_pages_v3.pipe +8 -4
  158. package/core/server/data/tinybird/tests/api_top_pages_router.yaml +74 -0
  159. package/core/server/services/comments/comments-service-emails.js +1 -4
  160. package/core/server/services/email-service/email-templates/partials/styles.hbs +43 -0
  161. package/core/server/services/koenig/node-renderers/transistor-renderer.js +23 -17
  162. package/core/server/services/members/members-api/repositories/member-repository.js +30 -6
  163. package/core/server/services/members/members-api/services/next-payment-calculator.js +28 -20
  164. package/core/server/services/members/members-api/services/payments-service.js +1 -1
  165. package/core/server/services/members/members-api/utils/add-calendar-months.js +49 -0
  166. package/core/server/services/offers/application/offer-mapper.js +2 -2
  167. package/core/server/services/offers/domain/models/offer-amount.js +16 -0
  168. package/core/server/services/offers/domain/models/offer-duration.js +3 -4
  169. package/core/server/services/offers/domain/models/offer-type.js +5 -3
  170. package/core/server/services/offers/domain/models/offer.js +8 -1
  171. package/core/server/services/staff/staff-service-emails.js +2 -0
  172. package/core/server/services/stripe/stripe-api.js +19 -0
  173. package/core/shared/config/defaults.json +1 -1
  174. package/core/shared/labs.js +0 -1
  175. package/core/shared/settings-cache/cache-manager.js +8 -0
  176. package/core/shared/settings-cache/public.js +5 -0
  177. package/package.json +5 -5
  178. package/yarn.lock +4 -4
  179. package/components/tryghost-i18n-6.18.2.tgz +0 -0
  180. package/components/tryghost-parse-email-address-6.18.2.tgz +0 -0
  181. package/core/built/admin/assets/audience-CJHVR7kD.js +0 -1
  182. package/core/built/admin/assets/comments-CPd_iCc3.js +0 -1
  183. package/core/built/admin/assets/index-B2yksBz4.js +0 -13
  184. package/core/built/admin/assets/index-Cl_EPbQ2.js +0 -1
  185. package/core/built/admin/assets/index-D_sGUCda.css +0 -1
  186. package/core/built/admin/assets/modals-C06GcVIm.js +0 -77
  187. package/core/built/admin/assets/overview-CVMLGrVt.js +0 -1
  188. package/core/built/admin/assets/post-analytics-header-D9srAPT5.js +0 -1
  189. package/core/built/admin/assets/posts/posts-DeQT3knv.mjs +0 -21
  190. package/core/built/admin/assets/stats/audience-BWqU7WWT.mjs +0 -245
  191. 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 "trial.'
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 "trial".'
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.63"
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",
@@ -27,7 +27,6 @@ const GA_FEATURES = [
27
27
  'explore',
28
28
  'inboxlinks',
29
29
  'commentModeration',
30
- 'commentPermalinks',
31
30
  'featurebaseFeedback',
32
31
  'welcomeEmails'
33
32
  ];
@@ -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.18.2",
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.18.2.tgz",
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.18.2.tgz",
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.18.2.tgz",
275
- "@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-6.18.2.tgz"
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.10":
9138
- version "1.7.10"
9139
- resolved "https://registry.yarnpkg.com/@tryghost/koenig-lexical/-/koenig-lexical-1.7.10.tgz#323a732e4be0e41d05c5bdb6782a883edc5282b3"
9140
- integrity sha512-6tI2kbSzZ669hQ5GxpENB8n2aDLugZDmpR/nO0GriduOZJLLN8AdDDa/S3Y8dpF5/cOGKsOxFRj3oLGRDOi6tw==
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
@@ -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};