@fluid-app/portal-sdk 0.1.283 → 0.1.285

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 (240) hide show
  1. package/dist/{OrdersScreen-DuqcgZaP.mjs → OrdersScreen-D48ntVjo.mjs} +21 -21
  2. package/dist/{OrdersScreen-DuqcgZaP.mjs.map → OrdersScreen-D48ntVjo.mjs.map} +1 -1
  3. package/dist/{OrdersScreen-oiGEYIWZ.cjs → OrdersScreen-D49KI1qP.cjs} +21 -21
  4. package/dist/{OrdersScreen-oiGEYIWZ.cjs.map → OrdersScreen-D49KI1qP.cjs.map} +1 -1
  5. package/dist/{OrdersScreen-Dg0zIoUm.mjs → OrdersScreen-DGPo2Jne.mjs} +2 -1
  6. package/dist/{OrdersScreen-04XabnQm.cjs → OrdersScreen-DhcZN9sM.cjs} +1 -1
  7. package/dist/{ShareablesScreen-CPvylNL7.mjs → ShareablesScreen-CBcjUvfL.mjs} +1 -0
  8. package/dist/{ShopScreen-BEKSgvCp.mjs → ShopScreen-BZAx17Hz.mjs} +1 -0
  9. package/dist/{SubscriptionsScreen-ytYw9K4M.cjs → SubscriptionsScreen-BaVQHSBl.cjs} +1 -1
  10. package/dist/{SubscriptionsScreen-TwddR9dd.mjs → SubscriptionsScreen-CWnj0SIk.mjs} +310 -132
  11. package/dist/SubscriptionsScreen-CWnj0SIk.mjs.map +1 -0
  12. package/dist/{SubscriptionsScreen-CG0lUArL.cjs → SubscriptionsScreen-D82JKEST.cjs} +310 -132
  13. package/dist/SubscriptionsScreen-D82JKEST.cjs.map +1 -0
  14. package/dist/de--8bUJ_R-.cjs +70 -0
  15. package/dist/de--8bUJ_R-.cjs.map +1 -0
  16. package/dist/de-Cypc-Hxq.mjs +64 -0
  17. package/dist/de-Cypc-Hxq.mjs.map +1 -0
  18. package/dist/de-D-pTKAfW.mjs +6 -0
  19. package/dist/de-D-pTKAfW.mjs.map +1 -0
  20. package/dist/{de-D-ZrcG6e.cjs → de-DlGTKoNF.cjs} +2 -2
  21. package/dist/de-DlGTKoNF.cjs.map +1 -0
  22. package/dist/el-Bh8hJ3Sb.mjs +64 -0
  23. package/dist/el-Bh8hJ3Sb.mjs.map +1 -0
  24. package/dist/el-DJHdmWRg.mjs +6 -0
  25. package/dist/el-DJHdmWRg.mjs.map +1 -0
  26. package/dist/{el-CEBrRhRH.cjs → el-DmE3Hzmx.cjs} +2 -2
  27. package/dist/el-DmE3Hzmx.cjs.map +1 -0
  28. package/dist/el-htBvJX9u.cjs +70 -0
  29. package/dist/el-htBvJX9u.cjs.map +1 -0
  30. package/dist/es-3riLmQtm.cjs +70 -0
  31. package/dist/es-3riLmQtm.cjs.map +1 -0
  32. package/dist/es-BktZit95.mjs +6 -0
  33. package/dist/es-BktZit95.mjs.map +1 -0
  34. package/dist/{es-CZWNmDYJ.cjs → es-CdUtxnpO.cjs} +2 -2
  35. package/dist/es-CdUtxnpO.cjs.map +1 -0
  36. package/dist/es-Cg8cMOtp.mjs +64 -0
  37. package/dist/es-Cg8cMOtp.mjs.map +1 -0
  38. package/dist/{fr-7s2G-_GU.cjs → fr-BupLb6QX.cjs} +2 -2
  39. package/dist/fr-BupLb6QX.cjs.map +1 -0
  40. package/dist/fr-Cw5sl5qD.mjs +6 -0
  41. package/dist/fr-Cw5sl5qD.mjs.map +1 -0
  42. package/dist/fr-CzLK7jPj.cjs +70 -0
  43. package/dist/fr-CzLK7jPj.cjs.map +1 -0
  44. package/dist/fr-DgWrGvEV.mjs +64 -0
  45. package/dist/fr-DgWrGvEV.mjs.map +1 -0
  46. package/dist/he-BVY6B90O.mjs +64 -0
  47. package/dist/he-BVY6B90O.mjs.map +1 -0
  48. package/dist/he-D3OD_r5i.cjs +70 -0
  49. package/dist/he-D3OD_r5i.cjs.map +1 -0
  50. package/dist/{he-CgT3jo9b.cjs → he-POkv2_Vj.cjs} +2 -2
  51. package/dist/he-POkv2_Vj.cjs.map +1 -0
  52. package/dist/he-ud7jtKmt.mjs +6 -0
  53. package/dist/he-ud7jtKmt.mjs.map +1 -0
  54. package/dist/hu-CmC_BlCz.cjs +70 -0
  55. package/dist/hu-CmC_BlCz.cjs.map +1 -0
  56. package/dist/{hu-kTWeBuco.cjs → hu-DM6iXy8A.cjs} +2 -2
  57. package/dist/hu-DM6iXy8A.cjs.map +1 -0
  58. package/dist/hu-LLo6jGPe.mjs +64 -0
  59. package/dist/hu-LLo6jGPe.mjs.map +1 -0
  60. package/dist/hu-i6hsv2P1.mjs +6 -0
  61. package/dist/hu-i6hsv2P1.mjs.map +1 -0
  62. package/dist/id-BX7tRIJi.mjs +64 -0
  63. package/dist/id-BX7tRIJi.mjs.map +1 -0
  64. package/dist/id-D90fdbw2.cjs +70 -0
  65. package/dist/id-D90fdbw2.cjs.map +1 -0
  66. package/dist/{id-B88SgMIh.cjs → id-DrazPWpH.cjs} +2 -2
  67. package/dist/id-DrazPWpH.cjs.map +1 -0
  68. package/dist/id-DwQYjW0y.mjs +6 -0
  69. package/dist/id-DwQYjW0y.mjs.map +1 -0
  70. package/dist/index.cjs +6 -6
  71. package/dist/index.d.cts.map +1 -1
  72. package/dist/index.d.mts.map +1 -1
  73. package/dist/index.mjs +10 -10
  74. package/dist/it-1rCxwoVR.cjs +70 -0
  75. package/dist/it-1rCxwoVR.cjs.map +1 -0
  76. package/dist/it-CeDTGyHZ.mjs +6 -0
  77. package/dist/it-CeDTGyHZ.mjs.map +1 -0
  78. package/dist/{it-DjALjX2P.cjs → it-DJZTksMf.cjs} +2 -2
  79. package/dist/it-DJZTksMf.cjs.map +1 -0
  80. package/dist/it-v6VAzerN.mjs +64 -0
  81. package/dist/it-v6VAzerN.mjs.map +1 -0
  82. package/dist/ja-BsDZKtuF.mjs +6 -0
  83. package/dist/ja-BsDZKtuF.mjs.map +1 -0
  84. package/dist/ja-Cxo-ieej.cjs +70 -0
  85. package/dist/ja-Cxo-ieej.cjs.map +1 -0
  86. package/dist/ja-DXou4ipe.mjs +64 -0
  87. package/dist/ja-DXou4ipe.mjs.map +1 -0
  88. package/dist/{ja-zdT7PSv9.cjs → ja-EkL2I43a.cjs} +2 -2
  89. package/dist/ja-EkL2I43a.cjs.map +1 -0
  90. package/dist/ko-CAJT7oX_.mjs +6 -0
  91. package/dist/ko-CAJT7oX_.mjs.map +1 -0
  92. package/dist/ko-Dz-Wgxg1.mjs +64 -0
  93. package/dist/ko-Dz-Wgxg1.mjs.map +1 -0
  94. package/dist/ko-FdoLjSpN.cjs +70 -0
  95. package/dist/ko-FdoLjSpN.cjs.map +1 -0
  96. package/dist/{ko-DpqWyy55.cjs → ko-nvUbObdA.cjs} +2 -2
  97. package/dist/ko-nvUbObdA.cjs.map +1 -0
  98. package/dist/nl-BGK_iU4v.mjs +6 -0
  99. package/dist/nl-BGK_iU4v.mjs.map +1 -0
  100. package/dist/nl-CazPw7hj.cjs +70 -0
  101. package/dist/nl-CazPw7hj.cjs.map +1 -0
  102. package/dist/{nl-VUwedju8.cjs → nl-DmYVhUdz.cjs} +2 -2
  103. package/dist/nl-DmYVhUdz.cjs.map +1 -0
  104. package/dist/nl-R5otfCco.mjs +64 -0
  105. package/dist/nl-R5otfCco.mjs.map +1 -0
  106. package/dist/pl-CTrdBIad.cjs +70 -0
  107. package/dist/pl-CTrdBIad.cjs.map +1 -0
  108. package/dist/pl-CXkmBkzj.mjs +6 -0
  109. package/dist/pl-CXkmBkzj.mjs.map +1 -0
  110. package/dist/{pl-gGuHMJDQ.cjs → pl-DcI4V80q.cjs} +2 -2
  111. package/dist/pl-DcI4V80q.cjs.map +1 -0
  112. package/dist/pl-XmX4DXLj.mjs +64 -0
  113. package/dist/pl-XmX4DXLj.mjs.map +1 -0
  114. package/dist/pt-Bu4CWKGe.mjs +6 -0
  115. package/dist/pt-Bu4CWKGe.mjs.map +1 -0
  116. package/dist/{pt-UrXvEgie.cjs → pt-C3OW-rk-.cjs} +2 -2
  117. package/dist/pt-C3OW-rk-.cjs.map +1 -0
  118. package/dist/pt-DVc2SQq9.cjs +70 -0
  119. package/dist/pt-DVc2SQq9.cjs.map +1 -0
  120. package/dist/pt-Dp-Xud8m.mjs +64 -0
  121. package/dist/pt-Dp-Xud8m.mjs.map +1 -0
  122. package/dist/ro-7gqOHwfq.cjs +70 -0
  123. package/dist/ro-7gqOHwfq.cjs.map +1 -0
  124. package/dist/{ro-DR-uJWf0.cjs → ro-CgxOj7vq.cjs} +2 -2
  125. package/dist/ro-CgxOj7vq.cjs.map +1 -0
  126. package/dist/ro-D4VP5JZk.mjs +6 -0
  127. package/dist/ro-D4VP5JZk.mjs.map +1 -0
  128. package/dist/ro-_VHATAwl.mjs +64 -0
  129. package/dist/ro-_VHATAwl.mjs.map +1 -0
  130. package/dist/ru-BmPMRg7Z.mjs +6 -0
  131. package/dist/ru-BmPMRg7Z.mjs.map +1 -0
  132. package/dist/ru-DlkrI3uB.cjs +70 -0
  133. package/dist/ru-DlkrI3uB.cjs.map +1 -0
  134. package/dist/{ru-2x4YSIxv.cjs → ru-DuWWq-BM.cjs} +2 -2
  135. package/dist/ru-DuWWq-BM.cjs.map +1 -0
  136. package/dist/ru-uYfqdjiU.mjs +64 -0
  137. package/dist/ru-uYfqdjiU.mjs.map +1 -0
  138. package/dist/th-BbInWYyP.mjs +6 -0
  139. package/dist/th-BbInWYyP.mjs.map +1 -0
  140. package/dist/th-DRXe_VBC.mjs +64 -0
  141. package/dist/th-DRXe_VBC.mjs.map +1 -0
  142. package/dist/{th-BnzGXywl.cjs → th-_sG5tZjo.cjs} +2 -2
  143. package/dist/th-_sG5tZjo.cjs.map +1 -0
  144. package/dist/th-xte0zzAH.cjs +70 -0
  145. package/dist/th-xte0zzAH.cjs.map +1 -0
  146. package/dist/tl-5CmO-_sk.mjs +6 -0
  147. package/dist/tl-5CmO-_sk.mjs.map +1 -0
  148. package/dist/{tl-FJUCFpOx.cjs → tl-BbpJzTrp.cjs} +2 -2
  149. package/dist/tl-BbpJzTrp.cjs.map +1 -0
  150. package/dist/tl-DhIAeJNn.mjs +64 -0
  151. package/dist/tl-DhIAeJNn.mjs.map +1 -0
  152. package/dist/tl-jFAlU6zm.cjs +70 -0
  153. package/dist/tl-jFAlU6zm.cjs.map +1 -0
  154. package/dist/tr-BjATzo9x.cjs +70 -0
  155. package/dist/tr-BjATzo9x.cjs.map +1 -0
  156. package/dist/{tr-Bh1fMw7B.cjs → tr-Bp9hpupi.cjs} +2 -2
  157. package/dist/tr-Bp9hpupi.cjs.map +1 -0
  158. package/dist/tr-CBAj6vfD.mjs +6 -0
  159. package/dist/tr-CBAj6vfD.mjs.map +1 -0
  160. package/dist/tr-D7wxmwZ0.mjs +64 -0
  161. package/dist/tr-D7wxmwZ0.mjs.map +1 -0
  162. package/dist/{zh_CN-C8oSZUyD.cjs → zh_CN-DDuxhKf9.cjs} +2 -2
  163. package/dist/zh_CN-DDuxhKf9.cjs.map +1 -0
  164. package/dist/zh_CN-DwjNaGj-.mjs +64 -0
  165. package/dist/zh_CN-DwjNaGj-.mjs.map +1 -0
  166. package/dist/zh_CN-uqlHFHuc.mjs +6 -0
  167. package/dist/zh_CN-uqlHFHuc.mjs.map +1 -0
  168. package/dist/zh_CN-xeSo0148.cjs +70 -0
  169. package/dist/zh_CN-xeSo0148.cjs.map +1 -0
  170. package/dist/zh_TW-85s6CrDM.mjs +6 -0
  171. package/dist/zh_TW-85s6CrDM.mjs.map +1 -0
  172. package/dist/zh_TW-BxdfA8tp.mjs +64 -0
  173. package/dist/zh_TW-BxdfA8tp.mjs.map +1 -0
  174. package/dist/{zh_TW-FEhCRNjp.cjs → zh_TW-C24oYhoK.cjs} +2 -2
  175. package/dist/zh_TW-C24oYhoK.cjs.map +1 -0
  176. package/dist/zh_TW-DrFrt0uW.cjs +70 -0
  177. package/dist/zh_TW-DrFrt0uW.cjs.map +1 -0
  178. package/package.json +10 -10
  179. package/dist/SubscriptionsScreen-CG0lUArL.cjs.map +0 -1
  180. package/dist/SubscriptionsScreen-TwddR9dd.mjs.map +0 -1
  181. package/dist/de-BoLDX9-z.mjs +0 -6
  182. package/dist/de-BoLDX9-z.mjs.map +0 -1
  183. package/dist/de-D-ZrcG6e.cjs.map +0 -1
  184. package/dist/el-AYoryWsI.mjs +0 -6
  185. package/dist/el-AYoryWsI.mjs.map +0 -1
  186. package/dist/el-CEBrRhRH.cjs.map +0 -1
  187. package/dist/es-BmdekDd2.mjs +0 -6
  188. package/dist/es-BmdekDd2.mjs.map +0 -1
  189. package/dist/es-CZWNmDYJ.cjs.map +0 -1
  190. package/dist/fr-7s2G-_GU.cjs.map +0 -1
  191. package/dist/fr-CTwq5qZR.mjs +0 -6
  192. package/dist/fr-CTwq5qZR.mjs.map +0 -1
  193. package/dist/he-CgT3jo9b.cjs.map +0 -1
  194. package/dist/he-eAUZFqSa.mjs +0 -6
  195. package/dist/he-eAUZFqSa.mjs.map +0 -1
  196. package/dist/hu-Kz2LOkuT.mjs +0 -6
  197. package/dist/hu-Kz2LOkuT.mjs.map +0 -1
  198. package/dist/hu-kTWeBuco.cjs.map +0 -1
  199. package/dist/id--Ga5qA1z.mjs +0 -6
  200. package/dist/id--Ga5qA1z.mjs.map +0 -1
  201. package/dist/id-B88SgMIh.cjs.map +0 -1
  202. package/dist/it-DjALjX2P.cjs.map +0 -1
  203. package/dist/it-s9Lcckmv.mjs +0 -6
  204. package/dist/it-s9Lcckmv.mjs.map +0 -1
  205. package/dist/ja-Bj6dkHgr.mjs +0 -6
  206. package/dist/ja-Bj6dkHgr.mjs.map +0 -1
  207. package/dist/ja-zdT7PSv9.cjs.map +0 -1
  208. package/dist/ko-DpqWyy55.cjs.map +0 -1
  209. package/dist/ko-_7xrCLgw.mjs +0 -6
  210. package/dist/ko-_7xrCLgw.mjs.map +0 -1
  211. package/dist/nl-D4oOwyd6.mjs +0 -6
  212. package/dist/nl-D4oOwyd6.mjs.map +0 -1
  213. package/dist/nl-VUwedju8.cjs.map +0 -1
  214. package/dist/pl-BjS7zUTh.mjs +0 -6
  215. package/dist/pl-BjS7zUTh.mjs.map +0 -1
  216. package/dist/pl-gGuHMJDQ.cjs.map +0 -1
  217. package/dist/pt-CCutkdhS.mjs +0 -6
  218. package/dist/pt-CCutkdhS.mjs.map +0 -1
  219. package/dist/pt-UrXvEgie.cjs.map +0 -1
  220. package/dist/ro-339Su8M-.mjs +0 -6
  221. package/dist/ro-339Su8M-.mjs.map +0 -1
  222. package/dist/ro-DR-uJWf0.cjs.map +0 -1
  223. package/dist/ru-2x4YSIxv.cjs.map +0 -1
  224. package/dist/ru-3CVbVdxQ.mjs +0 -6
  225. package/dist/ru-3CVbVdxQ.mjs.map +0 -1
  226. package/dist/th-B3njIa0u.mjs +0 -6
  227. package/dist/th-B3njIa0u.mjs.map +0 -1
  228. package/dist/th-BnzGXywl.cjs.map +0 -1
  229. package/dist/tl-FJUCFpOx.cjs.map +0 -1
  230. package/dist/tl-TfjHTmJK.mjs +0 -6
  231. package/dist/tl-TfjHTmJK.mjs.map +0 -1
  232. package/dist/tr-Bh1fMw7B.cjs.map +0 -1
  233. package/dist/tr-CoQAshHU.mjs +0 -6
  234. package/dist/tr-CoQAshHU.mjs.map +0 -1
  235. package/dist/zh_CN-C8oSZUyD.cjs.map +0 -1
  236. package/dist/zh_CN-j6I6xOU4.mjs +0 -6
  237. package/dist/zh_CN-j6I6xOU4.mjs.map +0 -1
  238. package/dist/zh_TW-Dl68sree.mjs +0 -6
  239. package/dist/zh_TW-Dl68sree.mjs.map +0 -1
  240. package/dist/zh_TW-FEhCRNjp.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriptionsScreen-CWnj0SIk.mjs","names":["getInternalDefaultOptions","getDefaultOptions","defaultLocale","portalTenant.subscriptions_list","portalTenant.subscriptions_show","portalTenant.subscriptions_pause","portalTenant.subscriptions_resume","portalTenant.subscriptions_skip","portalTenant.subscriptions_cancel","portalTenant.subscriptions_reactivate","portalTenant.subscriptions_update","t","cn","Calendar","cn","Calendar","cn","SubscriptionDetailScreen","cn","t","cn","SubscriptionDetailScreenContent"],"sources":["../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDefaultOptions.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Setter.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/EraParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/constants.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/utils.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/YearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ExtendedYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/QuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneQuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneMonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISOWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DateParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayOfYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneLocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISODayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMMidnightParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayPeriodParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1to12Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0to23Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0To11Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1To24Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MinuteParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/SecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/FractionOfSecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneWithZParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampSecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampMillisecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.js","../../../subscriptions/core/src/subscriptions-api-context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-infinite-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/hooks/use-update-subscription-info.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../src/adapters/subscriptions-api-adapter.ts","../src/subscriptions/PortalSubscriptionsApiProvider.tsx","../../../subscriptions/core/src/translation-api-context.ts","../../../subscriptions/core/src/translation-dictionary.ts","../../../subscriptions/core/src/translation-adapter.ts","../src/providers/SubscriptionsTranslationBridge.tsx","../src/screens/subscriptions/portal-subscriptions-list-helpers.ts","../src/screens/subscriptions/PortalSubscriptionsList.tsx","../src/screens/SubscriptionsListScreen.tsx","../../../subscriptions/ui/src/components/cancel-subscription-dialog.tsx","../../../subscriptions/ui/src/components/pause-subscription-dialog.tsx","../../../subscriptions/ui/src/lib/parse-iso-date.ts","../../../subscriptions/ui/src/components/resume-subscription-dialog.tsx","../../../subscriptions/ui/src/components/edit-bill-date-dialog.tsx","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/subscription-detail.tsx","../../../subscriptions/ui/src/screens/SubscriptionDetailScreen.tsx","../src/subscriptions/SelectablePaymentMethodDropdown.tsx","../src/subscriptions/PortalSubscriptionPaymentMethodSection.tsx","../src/subscriptions/SelectableAddressDropdown.tsx","../src/subscriptions/PortalSubscriptionShippingAddressSection.tsx","../src/screens/SubscriptionDetailScreen.tsx","../src/screens/SubscriptionsScreen.tsx"],"sourcesContent":["import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISODay} function options.\n */\n\n/**\n * @name getISODay\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * const result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nexport function getISODay(date, options) {\n const day = toDate(date, options?.in).getDay();\n return day === 0 ? 7 : day;\n}\n\n// Fallback for modularized imports:\nexport default getISODay;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name transpose\n * @category Generic Helpers\n * @summary Transpose the date to the given constructor.\n *\n * @description\n * The function transposes the date to the given constructor. It helps you\n * to transpose the date in the system time zone to say `UTCDate` or any other\n * date extension.\n *\n * @typeParam InputDate - The input `Date` type derived from the passed argument.\n * @typeParam ResultDate - The result `Date` type derived from the passed constructor.\n *\n * @param date - The date to use values from\n * @param constructor - The date constructor to use\n *\n * @returns Date transposed to the given constructor\n *\n * @example\n * // Create July 10, 2022 00:00 in locale time zone\n * const date = new Date(2022, 6, 10)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0800 (Singapore Standard Time)'\n *\n * @example\n * // Transpose the date to July 10, 2022 00:00 in UTC\n * transpose(date, UTCDate)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0000 (Coordinated Universal Time)'\n */\nexport function transpose(date, constructor) {\n const date_ = isConstructor(constructor)\n ? new constructor(0)\n : constructFrom(constructor, 0);\n date_.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n date_.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return date_;\n}\n\nfunction isConstructor(constructor) {\n return (\n typeof constructor === \"function\" &&\n constructor.prototype?.constructor === constructor\n );\n}\n\n// Fallback for modularized imports:\nexport default transpose;\n","import { constructFrom } from \"../../constructFrom.js\";\nimport { transpose } from \"../../transpose.js\";\n\nconst TIMEZONE_UNIT_PRIORITY = 10;\n\nexport class Setter {\n subPriority = 0;\n\n validate(_utcDate, _options) {\n return true;\n }\n}\n\nexport class ValueSetter extends Setter {\n constructor(\n value,\n\n validateValue,\n\n setValue,\n\n priority,\n subPriority,\n ) {\n super();\n this.value = value;\n this.validateValue = validateValue;\n this.setValue = setValue;\n this.priority = priority;\n if (subPriority) {\n this.subPriority = subPriority;\n }\n }\n\n validate(date, options) {\n return this.validateValue(date, this.value, options);\n }\n\n set(date, flags, options) {\n return this.setValue(date, flags, this.value, options);\n }\n}\n\nexport class DateTimezoneSetter extends Setter {\n priority = TIMEZONE_UNIT_PRIORITY;\n subPriority = -1;\n\n constructor(context, reference) {\n super();\n this.context = context || ((date) => constructFrom(reference, date));\n }\n\n set(date, flags) {\n if (flags.timestampIsSet) return date;\n return constructFrom(date, transpose(date, this.context));\n }\n}\n","import { ValueSetter } from \"./Setter.js\";\n\nexport class Parser {\n run(dateString, token, match, options) {\n const result = this.parse(dateString, token, match, options);\n if (!result) {\n return null;\n }\n\n return {\n setter: new ValueSetter(\n result.value,\n this.validate,\n this.set,\n this.priority,\n this.subPriority,\n ),\n rest: result.rest,\n };\n }\n\n validate(_utcDate, _value, _options) {\n return true;\n }\n}\n","import { Parser } from \"../Parser.js\";\n\nexport class EraParser extends Parser {\n priority = 140;\n\n parse(dateString, token, match) {\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return (\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n\n // A, B\n case \"GGGGG\":\n return match.era(dateString, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return (\n match.era(dateString, { width: \"wide\" }) ||\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n }\n }\n\n set(date, flags, value) {\n flags.era = value;\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"R\", \"u\", \"t\", \"T\"];\n}\n","export const numericPatterns = {\n month: /^(1[0-2]|0?\\d)/, // 0 to 12\n date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n minute: /^[0-5]?\\d/, // 0 to 59\n second: /^[0-5]?\\d/, // 0 to 59\n\n singleDigit: /^\\d/, // 0 to 9\n twoDigits: /^\\d{1,2}/, // 0 to 99\n threeDigits: /^\\d{1,3}/, // 0 to 999\n fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n anyDigitsSigned: /^-?\\d+/,\n singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n fourDigitsSigned: /^-?\\d{1,4}/, // 0 to 9999, -0 to -9999\n};\n\nexport const timezonePatterns = {\n basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/,\n};\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n millisecondsInSecond,\n} from \"../../constants.js\";\n\nimport { numericPatterns } from \"./constants.js\";\n\nexport function mapValue(parseFnResult, mapFn) {\n if (!parseFnResult) {\n return parseFnResult;\n }\n\n return {\n value: mapFn(parseFnResult.value),\n rest: parseFnResult.rest,\n };\n}\n\nexport function parseNumericPattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n return {\n value: parseInt(matchResult[0], 10),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseTimezonePattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n // Input is 'Z'\n if (matchResult[0] === \"Z\") {\n return {\n value: 0,\n rest: dateString.slice(1),\n };\n }\n\n const sign = matchResult[1] === \"+\" ? 1 : -1;\n const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n return {\n value:\n sign *\n (hours * millisecondsInHour +\n minutes * millisecondsInMinute +\n seconds * millisecondsInSecond),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseAnyDigitsSigned(dateString) {\n return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);\n}\n\nexport function parseNDigits(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigit, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigits, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigits, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigits, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function parseNDigitsSigned(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^-?\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function dayPeriodEnumToHours(dayPeriod) {\n switch (dayPeriod) {\n case \"morning\":\n return 4;\n case \"evening\":\n return 17;\n case \"pm\":\n case \"noon\":\n case \"afternoon\":\n return 12;\n case \"am\":\n case \"midnight\":\n case \"night\":\n default:\n return 0;\n }\n}\n\nexport function normalizeTwoDigitYear(twoDigitYear, currentYear) {\n const isCommonEra = currentYear > 0;\n // Absolute number of the current year:\n // 1 -> 1 AC\n // 0 -> 1 BC\n // -1 -> 2 BC\n const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n let result;\n if (absCurrentYear <= 50) {\n result = twoDigitYear || 100;\n } else {\n const rangeEnd = absCurrentYear + 50;\n const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;\n const isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n }\n\n return isCommonEra ? result : 1 - result;\n}\n\nexport function isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n// | Year | y | yy | yyy | yyyy | yyyyy |\n// |----------|-------|----|-------|-------|-------|\n// | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n// | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n// | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n// | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n// | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\nexport class YearParser extends Parser {\n priority = 130;\n incompatibleTokens = [\"Y\", \"R\", \"u\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"yy\",\n });\n\n switch (token) {\n case \"y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value) {\n const currentYear = date.getFullYear();\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(normalizedTwoDigitYear, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { getWeekYear } from \"../../../getWeekYear.js\";\n\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// Local week-numbering year\nexport class LocalWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"YY\",\n });\n\n switch (token) {\n case \"Y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"Yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value, options) {\n const currentYear = getWeekYear(date, options);\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(\n normalizedTwoDigitYear,\n 0,\n options.firstWeekContainsDate,\n );\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, options.firstWeekContainsDate);\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\n// ISO week-numbering year\nexport class ISOWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"R\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n const firstWeekOfYear = constructFrom(date, 0);\n firstWeekOfYear.setFullYear(value, 0, 4);\n firstWeekOfYear.setHours(0, 0, 0, 0);\n return startOfISOWeek(firstWeekOfYear);\n }\n\n incompatibleTokens = [\n \"G\",\n \"y\",\n \"Y\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\nexport class ExtendedYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"u\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"G\", \"y\", \"Y\", \"R\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class QuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n case \"QQ\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class StandAloneQuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n case \"qq\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MonthParser extends Parser {\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"L\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"M\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"MM\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // J, F, ..., D\n case \"MMMMM\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class StandAloneMonthParser extends Parser {\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"LL\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // J, F, ..., D\n case \"LLLLL\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getWeek } from \"./getWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setWeek} function options.\n */\n\n/**\n * @name setWeek\n * @category Week Helpers\n * @summary Set the local week to the given date.\n *\n * @description\n * Set the local week to the given date, saving the weekday number.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param week - The week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the local week set\n *\n * @example\n * // Set the 1st week to 2 January 2005 with default options:\n * const result = setWeek(new Date(2005, 0, 2), 1)\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // Set the 1st week to 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January:\n * const result = setWeek(new Date(2005, 0, 2), 1, {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Sun Jan 4 2004 00:00:00\n */\nexport function setWeek(date, week, options) {\n const date_ = toDate(date, options?.in);\n const diff = getWeek(date_, options) - week;\n date_.setDate(date_.getDate() - diff * 7);\n return toDate(date_, options?.in);\n}\n\n// Fallback for modularized imports:\nexport default setWeek;\n","import { setWeek } from \"../../../setWeek.js\";\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// Local week of year\nexport class LocalWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"w\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"wo\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value, options) {\n return startOfWeek(setWeek(date, value, options), options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { getISOWeek } from \"./getISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISOWeek} function options.\n */\n\n/**\n * @name setISOWeek\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The `Date` type of the context function.\n *\n * @param date - The date to be changed\n * @param week - The ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the ISO week set\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * const result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nexport function setISOWeek(date, week, options) {\n const _date = toDate(date, options?.in);\n const diff = getISOWeek(_date, options) - week;\n _date.setDate(_date.getDate() - diff * 7);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default setISOWeek;\n","import { setISOWeek } from \"../../../setISOWeek.js\";\nimport { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// ISO week of year\nexport class ISOWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"I\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"Io\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value) {\n return startOfISOWeek(setISOWeek(date, value));\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [\n 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\n// Day of the month\nexport class DateParser extends Parser {\n priority = 90;\n subPriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"d\":\n return parseNumericPattern(numericPatterns.date, dateString);\n case \"do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n const month = date.getMonth();\n if (isLeapYear) {\n return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];\n } else {\n return value >= 1 && value <= DAYS_IN_MONTH[month];\n }\n }\n\n set(date, _flags, value) {\n date.setDate(value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nexport class DayOfYearParser extends Parser {\n priority = 90;\n\n subpriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"D\":\n case \"DD\":\n return parseNumericPattern(numericPatterns.dayOfYear, dateString);\n case \"Do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear) {\n return value >= 1 && value <= 366;\n } else {\n return value >= 1 && value <= 365;\n }\n }\n\n set(date, _flags, value) {\n date.setMonth(0, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"E\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { addDays } from \"./addDays.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setDay} function options.\n */\n\n/**\n * @name setDay\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the week of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the day of the week set\n *\n * @example\n * // Set week day to Sunday, with the default weekStartsOn of Sunday:\n * const result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // Set week day to Sunday, with a weekStartsOn of Monday:\n * const result = setDay(new Date(2014, 8, 1), 0, { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setDay(date, day, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const date_ = toDate(date, options?.in);\n const currentDay = date_.getDay();\n\n const remainder = day % 7;\n const dayIndex = (remainder + 7) % 7;\n\n const delta = 7 - weekStartsOn;\n const diff =\n day < 0 || day > 6\n ? day - ((currentDay + delta) % 7)\n : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7);\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setDay;\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\n// Day of week\nexport class DayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"EEEEE\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"EEEE\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"D\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Local day of week\nexport class LocalDayParser extends Parser {\n priority = 90;\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"e\":\n case \"ee\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"eo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"eee\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"eeeee\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"eeee\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Stand-alone local day of week\nexport class StandAloneLocalDayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"c\":\n case \"cc\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"co\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"ccc\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // T\n case \"ccccc\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return (\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // Tuesday\n case \"cccc\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"e\",\n \"t\",\n \"T\",\n ];\n}\n","import { addDays } from \"./addDays.js\";\nimport { getISODay } from \"./getISODay.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISODay} function options.\n */\n\n/**\n * @name setISODay\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday, etc.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the day of the ISO week set\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * const result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setISODay(date, day, options) {\n const date_ = toDate(date, options?.in);\n const currentDay = getISODay(date_, options);\n const diff = day - currentDay;\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setISODay;\n","import { setISODay } from \"../../../setISODay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// ISO day of week\nexport class ISODayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => {\n if (value === 0) {\n return 7;\n }\n return value;\n };\n\n switch (token) {\n // 2\n case \"i\":\n case \"ii\": // 02\n return parseNDigits(token.length, dateString);\n // 2nd\n case \"io\":\n return match.ordinalNumber(dateString, { unit: \"day\" });\n // Tue\n case \"iii\":\n return mapValue(\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // T\n case \"iiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tu\n case \"iiiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tuesday\n case \"iiii\":\n default:\n return mapValue(\n match.day(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 7;\n }\n\n set(date, _flags, value) {\n date = setISODay(date, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"E\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"a\":\n case \"aa\":\n case \"aaa\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"aaaaa\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"b\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMMidnightParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"b\":\n case \"bb\":\n case \"bbb\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"bbbbb\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\n// in the morning, in the afternoon, in the evening, at night\nexport class DayPeriodParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"BBBBB\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1to12Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"h\":\n return parseNumericPattern(numericPatterns.hour12h, dateString);\n case \"ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 12;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else if (!isPM && value === 12) {\n date.setHours(0, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"H\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0to23Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"H\":\n return parseNumericPattern(numericPatterns.hour23h, dateString);\n case \"Ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 23;\n }\n\n set(date, _flags, value) {\n date.setHours(value, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0To11Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"K\":\n return parseNumericPattern(numericPatterns.hour11h, dateString);\n case \"Ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"h\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1To24Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"k\":\n return parseNumericPattern(numericPatterns.hour24h, dateString);\n case \"ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 24;\n }\n\n set(date, _flags, value) {\n const hours = value <= 24 ? value % 24 : value;\n date.setHours(hours, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"H\", \"K\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MinuteParser extends Parser {\n priority = 60;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"m\":\n return parseNumericPattern(numericPatterns.minute, dateString);\n case \"mo\":\n return match.ordinalNumber(dateString, { unit: \"minute\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setMinutes(value, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class SecondParser extends Parser {\n priority = 50;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"s\":\n return parseNumericPattern(numericPatterns.second, dateString);\n case \"so\":\n return match.ordinalNumber(dateString, { unit: \"second\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setSeconds(value, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\nexport class FractionOfSecondParser extends Parser {\n priority = 30;\n\n parse(dateString, token) {\n const valueCallback = (value) =>\n Math.trunc(value * Math.pow(10, -token.length + 3));\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n\n set(date, _flags, value) {\n date.setMilliseconds(value);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601. +00:00 is `'Z'`)\nexport class ISOTimezoneWithZParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"X\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"XX\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"XXXX\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"XXXXX\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"XXX\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"x\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601)\nexport class ISOTimezoneParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"x\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"xx\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"xxxx\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"xxxxx\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"xxx\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"X\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampSecondsParser extends Parser {\n priority = 40;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value * 1000), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampMillisecondsParser extends Parser {\n priority = 20;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { EraParser } from \"./parsers/EraParser.js\";\nimport { YearParser } from \"./parsers/YearParser.js\";\nimport { LocalWeekYearParser } from \"./parsers/LocalWeekYearParser.js\";\nimport { ISOWeekYearParser } from \"./parsers/ISOWeekYearParser.js\";\nimport { ExtendedYearParser } from \"./parsers/ExtendedYearParser.js\";\nimport { QuarterParser } from \"./parsers/QuarterParser.js\";\nimport { StandAloneQuarterParser } from \"./parsers/StandAloneQuarterParser.js\";\nimport { MonthParser } from \"./parsers/MonthParser.js\";\nimport { StandAloneMonthParser } from \"./parsers/StandAloneMonthParser.js\";\nimport { LocalWeekParser } from \"./parsers/LocalWeekParser.js\";\nimport { ISOWeekParser } from \"./parsers/ISOWeekParser.js\";\nimport { DateParser } from \"./parsers/DateParser.js\";\nimport { DayOfYearParser } from \"./parsers/DayOfYearParser.js\";\nimport { DayParser } from \"./parsers/DayParser.js\";\nimport { LocalDayParser } from \"./parsers/LocalDayParser.js\";\nimport { StandAloneLocalDayParser } from \"./parsers/StandAloneLocalDayParser.js\";\nimport { ISODayParser } from \"./parsers/ISODayParser.js\";\nimport { AMPMParser } from \"./parsers/AMPMParser.js\";\nimport { AMPMMidnightParser } from \"./parsers/AMPMMidnightParser.js\";\nimport { DayPeriodParser } from \"./parsers/DayPeriodParser.js\";\nimport { Hour1to12Parser } from \"./parsers/Hour1to12Parser.js\";\nimport { Hour0to23Parser } from \"./parsers/Hour0to23Parser.js\";\nimport { Hour0To11Parser } from \"./parsers/Hour0To11Parser.js\";\nimport { Hour1To24Parser } from \"./parsers/Hour1To24Parser.js\";\nimport { MinuteParser } from \"./parsers/MinuteParser.js\";\nimport { SecondParser } from \"./parsers/SecondParser.js\";\nimport { FractionOfSecondParser } from \"./parsers/FractionOfSecondParser.js\";\nimport { ISOTimezoneWithZParser } from \"./parsers/ISOTimezoneWithZParser.js\";\nimport { ISOTimezoneParser } from \"./parsers/ISOTimezoneParser.js\";\nimport { TimestampSecondsParser } from \"./parsers/TimestampSecondsParser.js\";\nimport { TimestampMillisecondsParser } from \"./parsers/TimestampMillisecondsParser.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O* | Timezone (GMT) |\n * | p | | P | |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z* | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n */\nexport const parsers = {\n G: new EraParser(),\n y: new YearParser(),\n Y: new LocalWeekYearParser(),\n R: new ISOWeekYearParser(),\n u: new ExtendedYearParser(),\n Q: new QuarterParser(),\n q: new StandAloneQuarterParser(),\n M: new MonthParser(),\n L: new StandAloneMonthParser(),\n w: new LocalWeekParser(),\n I: new ISOWeekParser(),\n d: new DateParser(),\n D: new DayOfYearParser(),\n E: new DayParser(),\n e: new LocalDayParser(),\n c: new StandAloneLocalDayParser(),\n i: new ISODayParser(),\n a: new AMPMParser(),\n b: new AMPMMidnightParser(),\n B: new DayPeriodParser(),\n h: new Hour1to12Parser(),\n H: new Hour0to23Parser(),\n K: new Hour0To11Parser(),\n k: new Hour1To24Parser(),\n m: new MinuteParser(),\n s: new SecondParser(),\n S: new FractionOfSecondParser(),\n X: new ISOTimezoneWithZParser(),\n x: new ISOTimezoneParser(),\n t: new TimestampSecondsParser(),\n T: new TimestampMillisecondsParser(),\n};\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getDefaultOptions } from \"./getDefaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\nimport { DateTimezoneSetter } from \"./parse/_lib/Setter.js\";\nimport { parsers } from \"./parse/_lib/parsers.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { longFormatters, parsers };\n\n/**\n * The {@link parse} function options.\n */\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\n\nconst notWhitespaceRegExp = /\\S/;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\n/**\n * @name parse\n * @category Common Helpers\n * @summary Parse the date.\n *\n * @description\n * Return the date parsed from string using the given format string.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters in the format string wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n *\n * Format of the format string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 5 below the table).\n *\n * Not all tokens are compatible. Combinations that don't make sense or could lead to bugs are prohibited\n * and will throw `RangeError`. For example usage of 24-hour format token with AM/PM token will throw an exception:\n *\n * ```javascript\n * parse('23 AM', 'HH a', new Date())\n * //=> RangeError: The format string mustn't contain `HH` and `a` at the same time\n * ```\n *\n * See the compatibility table: https://docs.google.com/spreadsheets/d/e/2PACX-1vQOPU3xUhplll6dyoMmVUXHKl_8CRDs6_ueLmex3SoqwhuolkuN3O05l4rqx5h1dKX8eb46Ul-CCSrq/pubhtml?gid=0&single=true\n *\n * Accepted format string patterns:\n * | Unit |Prior| Pattern | Result examples | Notes |\n * |---------------------------------|-----|---------|-----------------------------------|-------|\n * | Era | 140 | G..GGG | AD, BC | |\n * | | | GGGG | Anno Domini, Before Christ | 2 |\n * | | | GGGGG | A, B | |\n * | Calendar year | 130 | y | 44, 1, 1900, 2017, 9999 | 4 |\n * | | | yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | yy | 44, 01, 00, 17 | 4 |\n * | | | yyy | 044, 001, 123, 999 | 4 |\n * | | | yyyy | 0044, 0001, 1900, 2017 | 4 |\n * | | | yyyyy | ... | 2,4 |\n * | Local week-numbering year | 130 | Y | 44, 1, 1900, 2017, 9000 | 4 |\n * | | | Yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | YY | 44, 01, 00, 17 | 4,6 |\n * | | | YYY | 044, 001, 123, 999 | 4 |\n * | | | YYYY | 0044, 0001, 1900, 2017 | 4,6 |\n * | | | YYYYY | ... | 2,4 |\n * | ISO week-numbering year | 130 | R | -43, 1, 1900, 2017, 9999, -9999 | 4,5 |\n * | | | RR | -43, 01, 00, 17 | 4,5 |\n * | | | RRR | -043, 001, 123, 999, -999 | 4,5 |\n * | | | RRRR | -0043, 0001, 2017, 9999, -9999 | 4,5 |\n * | | | RRRRR | ... | 2,4,5 |\n * | Extended year | 130 | u | -43, 1, 1900, 2017, 9999, -999 | 4 |\n * | | | uu | -43, 01, 99, -99 | 4 |\n * | | | uuu | -043, 001, 123, 999, -999 | 4 |\n * | | | uuuu | -0043, 0001, 2017, 9999, -9999 | 4 |\n * | | | uuuuu | ... | 2,4 |\n * | Quarter (formatting) | 120 | Q | 1, 2, 3, 4 | |\n * | | | Qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | QQ | 01, 02, 03, 04 | |\n * | | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | 120 | q | 1, 2, 3, 4 | |\n * | | | qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | qq | 01, 02, 03, 04 | |\n * | | | qqq | Q1, Q2, Q3, Q4 | |\n * | | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | | qqqqq | 1, 2, 3, 4 | 3 |\n * | Month (formatting) | 110 | M | 1, 2, ..., 12 | |\n * | | | Mo | 1st, 2nd, ..., 12th | 5 |\n * | | | MM | 01, 02, ..., 12 | |\n * | | | MMM | Jan, Feb, ..., Dec | |\n * | | | MMMM | January, February, ..., December | 2 |\n * | | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | 110 | L | 1, 2, ..., 12 | |\n * | | | Lo | 1st, 2nd, ..., 12th | 5 |\n * | | | LL | 01, 02, ..., 12 | |\n * | | | LLL | Jan, Feb, ..., Dec | |\n * | | | LLLL | January, February, ..., December | 2 |\n * | | | LLLLL | J, F, ..., D | |\n * | Local week of year | 100 | w | 1, 2, ..., 53 | |\n * | | | wo | 1st, 2nd, ..., 53th | 5 |\n * | | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | 100 | I | 1, 2, ..., 53 | 5 |\n * | | | Io | 1st, 2nd, ..., 53th | 5 |\n * | | | II | 01, 02, ..., 53 | 5 |\n * | Day of month | 90 | d | 1, 2, ..., 31 | |\n * | | | do | 1st, 2nd, ..., 31st | 5 |\n * | | | dd | 01, 02, ..., 31 | |\n * | Day of year | 90 | D | 1, 2, ..., 365, 366 | 7 |\n * | | | Do | 1st, 2nd, ..., 365th, 366th | 5 |\n * | | | DD | 01, 02, ..., 365, 366 | 7 |\n * | | | DDD | 001, 002, ..., 365, 366 | |\n * | | | DDDD | ... | 2 |\n * | Day of week (formatting) | 90 | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | | EEEEE | M, T, W, T, F, S, S | |\n * | | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | 90 | i | 1, 2, 3, ..., 7 | 5 |\n * | | | io | 1st, 2nd, ..., 7th | 5 |\n * | | | ii | 01, 02, ..., 07 | 5 |\n * | | | iii | Mon, Tue, Wed, ..., Sun | 5 |\n * | | | iiii | Monday, Tuesday, ..., Sunday | 2,5 |\n * | | | iiiii | M, T, W, T, F, S, S | 5 |\n * | | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 5 |\n * | Local day of week (formatting) | 90 | e | 2, 3, 4, ..., 1 | |\n * | | | eo | 2nd, 3rd, ..., 1st | 5 |\n * | | | ee | 02, 03, ..., 01 | |\n * | | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | | eeeee | M, T, W, T, F, S, S | |\n * | | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | 90 | c | 2, 3, 4, ..., 1 | |\n * | | | co | 2nd, 3rd, ..., 1st | 5 |\n * | | | cc | 02, 03, ..., 01 | |\n * | | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | | ccccc | M, T, W, T, F, S, S | |\n * | | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | 80 | a..aaa | AM, PM | |\n * | | | aaaa | a.m., p.m. | 2 |\n * | | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | 80 | b..bbb | AM, PM, noon, midnight | |\n * | | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | | bbbbb | a, p, n, mi | |\n * | Flexible day period | 80 | B..BBB | at night, in the morning, ... | |\n * | | | BBBB | at night, in the morning, ... | 2 |\n * | | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | 70 | h | 1, 2, ..., 11, 12 | |\n * | | | ho | 1st, 2nd, ..., 11th, 12th | 5 |\n * | | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | 70 | H | 0, 1, 2, ..., 23 | |\n * | | | Ho | 0th, 1st, 2nd, ..., 23rd | 5 |\n * | | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | 70 | K | 1, 2, ..., 11, 0 | |\n * | | | Ko | 1st, 2nd, ..., 11th, 0th | 5 |\n * | | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | 70 | k | 24, 1, 2, ..., 23 | |\n * | | | ko | 24th, 1st, 2nd, ..., 23rd | 5 |\n * | | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | 60 | m | 0, 1, ..., 59 | |\n * | | | mo | 0th, 1st, ..., 59th | 5 |\n * | | | mm | 00, 01, ..., 59 | |\n * | Second | 50 | s | 0, 1, ..., 59 | |\n * | | | so | 0th, 1st, ..., 59th | 5 |\n * | | | ss | 00, 01, ..., 59 | |\n * | Seconds timestamp | 40 | t | 512969520 | |\n * | | | tt | ... | 2 |\n * | Fraction of second | 30 | S | 0, 1, ..., 9 | |\n * | | | SS | 00, 01, ..., 99 | |\n * | | | SSS | 000, 001, ..., 999 | |\n * | | | SSSS | ... | 2 |\n * | Milliseconds timestamp | 20 | T | 512969520900 | |\n * | | | TT | ... | 2 |\n * | Timezone (ISO-8601 w/ Z) | 10 | X | -08, +0530, Z | |\n * | | | XX | -0800, +0530, Z | |\n * | | | XXX | -08:00, +05:30, Z | |\n * | | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | 10 | x | -08, +0530, +00 | |\n * | | | xx | -0800, +0530, +0000 | |\n * | | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Long localized date | NA | P | 05/29/1453 | 5,8 |\n * | | | PP | May 29, 1453 | |\n * | | | PPP | May 29th, 1453 | |\n * | | | PPPP | Sunday, May 29th, 1453 | 2,5,8 |\n * | Long localized time | NA | p | 12:00 AM | 5,8 |\n * | | | pp | 12:00:00 AM | |\n * | Combination of date and time | NA | Pp | 05/29/1453, 12:00 AM | |\n * | | | PPpp | May 29, 1453, 12:00:00 AM | |\n * | | | PPPpp | May 29th, 1453 at ... | |\n * | | | PPPPpp | Sunday, May 29th, 1453 at ... | 2,5,8 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular.\n * In `format` function, they will produce different result:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * `parse` will try to match both formatting and stand-alone units interchangeably.\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table:\n * - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n * as wide as the sequence\n * - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n * These variations are marked with \"2\" in the last column of the table.\n *\n * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 4. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` will try to guess the century of two digit year by proximity with `referenceDate`:\n *\n * `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n *\n * `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n *\n * while `uu` will just assign the year as is:\n *\n * `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n *\n * `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [setISOWeekYear](https://date-fns.org/docs/setISOWeekYear)\n * and [setWeekYear](https://date-fns.org/docs/setWeekYear)).\n *\n * 5. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 7. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based\n * on the given locale.\n *\n * using `en-US` locale: `P` => `MM/dd/yyyy`\n * using `en-US` locale: `p` => `hh:mm a`\n * using `pt-BR` locale: `P` => `dd/MM/yyyy`\n * using `pt-BR` locale: `p` => `HH:mm`\n *\n * Values will be assigned to the date in the descending order of its unit's priority.\n * Units of an equal priority overwrite each other in the order of appearance.\n *\n * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n * the values will be taken from 3rd argument `referenceDate` which works as a context of parsing.\n *\n * `referenceDate` must be passed for correct work of the function.\n * If you're not sure which `referenceDate` to supply, create a new instance of Date:\n * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n * In this case parsing will be done in the context of the current date.\n * If `referenceDate` is `Invalid Date` or a value not convertible to valid `Date`,\n * then `Invalid Date` will be returned.\n *\n * The result may vary by locale.\n *\n * If `formatString` matches with `dateString` but does not provides tokens, `referenceDate` will be returned.\n *\n * If parsing failed, `Invalid Date` will be returned.\n * Invalid Date is a Date, whose time value is NaN.\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dateStr - The string to parse\n * @param formatStr - The string of tokens\n * @param referenceDate - defines values missing from the parsed dateString\n * @param options - An object with options.\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @returns The parsed date\n *\n * @throws `options.locale` must contain `match` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Parse 11 February 2014 from middle-endian format:\n * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date())\n * //=> Tue Feb 11 2014 00:00:00\n *\n * @example\n * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n * import eo from 'date-fns/locale/eo'\n * var result = parse('28-a de februaro', \"do 'de' MMMM\", new Date(2010, 0, 1), {\n * locale: eo\n * })\n * //=> Sun Feb 28 2010 00:00:00\n */\nexport function parse(dateStr, formatStr, referenceDate, options) {\n const invalidDate = () => constructFrom(options?.in || referenceDate, NaN);\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n if (!formatStr)\n return dateStr ? invalidDate() : toDate(referenceDate, options?.in);\n\n const subFnOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n // If timezone isn't specified, it will try to use the context or\n // the reference date and fallback to the system time zone.\n const setters = [new DateTimezoneSetter(options?.in, referenceDate)];\n\n const tokens = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter in longFormatters) {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp);\n\n const usedTokens = [];\n\n for (let token of tokens) {\n if (\n !options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n if (\n !options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n\n const firstCharacter = token[0];\n const parser = parsers[firstCharacter];\n if (parser) {\n const { incompatibleTokens } = parser;\n if (Array.isArray(incompatibleTokens)) {\n const incompatibleToken = usedTokens.find(\n (usedToken) =>\n incompatibleTokens.includes(usedToken.token) ||\n usedToken.token === firstCharacter,\n );\n if (incompatibleToken) {\n throw new RangeError(\n `The format string mustn't contain \\`${incompatibleToken.fullToken}\\` and \\`${token}\\` at the same time`,\n );\n }\n } else if (parser.incompatibleTokens === \"*\" && usedTokens.length > 0) {\n throw new RangeError(\n `The format string mustn't contain \\`${token}\\` and any other token at the same time`,\n );\n }\n\n usedTokens.push({ token: firstCharacter, fullToken: token });\n\n const parseResult = parser.run(\n dateStr,\n token,\n locale.match,\n subFnOptions,\n );\n\n if (!parseResult) {\n return invalidDate();\n }\n\n setters.push(parseResult.setter);\n\n dateStr = parseResult.rest;\n } else {\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n // Replace two single quote characters with one single quote character\n if (token === \"''\") {\n token = \"'\";\n } else if (firstCharacter === \"'\") {\n token = cleanEscapedString(token);\n }\n\n // Cut token from string, or, if string doesn't match the token, return Invalid Date\n if (dateStr.indexOf(token) === 0) {\n dateStr = dateStr.slice(token.length);\n } else {\n return invalidDate();\n }\n }\n }\n\n // Check if the remaining input contains something other than whitespace\n if (dateStr.length > 0 && notWhitespaceRegExp.test(dateStr)) {\n return invalidDate();\n }\n\n const uniquePrioritySetters = setters\n .map((setter) => setter.priority)\n .sort((a, b) => b - a)\n .filter((priority, index, array) => array.indexOf(priority) === index)\n .map((priority) =>\n setters\n .filter((setter) => setter.priority === priority)\n .sort((a, b) => b.subPriority - a.subPriority),\n )\n .map((setterArray) => setterArray[0]);\n\n let date = toDate(referenceDate, options?.in);\n\n if (isNaN(+date)) return invalidDate();\n\n const flags = {};\n for (const setter of uniquePrioritySetters) {\n if (!setter.validate(date, subFnOptions)) {\n return invalidDate();\n }\n\n const result = setter.set(date, flags, subFnOptions);\n // Result is tuple (date, flags)\n if (Array.isArray(result)) {\n date = result[0];\n Object.assign(flags, result[1]);\n // Result is date\n } else {\n date = result;\n }\n }\n\n return date;\n}\n\nfunction cleanEscapedString(input) {\n return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default parse;\n","import { createContext, useContext } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\n\nconst SubscriptionsApiContext = createContext<SubscriptionsApi | null>(null);\n\nexport const SubscriptionsApiProvider = SubscriptionsApiContext.Provider;\n\nexport function useSubscriptionsApi(): SubscriptionsApi {\n const api = useContext(SubscriptionsApiContext);\n if (!api) {\n throw new Error(\n \"useSubscriptionsApi must be used within a SubscriptionsCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\nimport { SubscriptionsApiProvider } from \"./subscriptions-api-context\";\n\nexport interface SubscriptionsCoreProviderProps {\n api: SubscriptionsApi;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n api,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsApiProvider value={api}>{children}</SubscriptionsApiProvider>\n );\n}\n","import type { subscriptions } from \"./types\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => api.fetchCustomerSubscriptions(params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useInfiniteSubscriptions(\n params: Omit<subscriptions.FetchSubscriptionsParams, \"cursor\" | \"page\">,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useInfiniteQuery({\n queryKey: [...subscriptionsKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) =>\n api.fetchCustomerSubscriptions({\n ...params,\n cursor: pageParam,\n limit: params.limit ?? params.perPage,\n }),\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => api.fetchSubscription(token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) => api.pauseSubscription(params.subscriptionToken, params.pauseParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) => api.resumeSubscription(params.subscriptionToken, params.resumeParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) => api.skipSubscription(params.subscriptionToken, params.skipParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId?: number }) =>\n api.cancelSubscription(params.subscriptionToken, params.customerId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n api.reactivateSubscription(\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useUpdateSubscriptionInfo(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >;\n }) => api.updateSubscriptionInfo(params.subscriptionToken, params.body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const datePortion = dateString.split(\"T\")[0] ?? dateString;\n const parts = datePortion.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import type { SubscriptionsApi } from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Maps the BFF meta envelope to the port's expected shape.\n */\nfunction mapMeta(raw: { request_id?: string | null; timestamp?: string }): {\n request_id: string;\n timestamp: string;\n} {\n return {\n request_id: raw.request_id ?? \"\",\n timestamp: raw.timestamp ?? \"\",\n };\n}\n\ntype BffSubscriptionResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_show>\n>;\n\ntype BffListResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_list>\n>;\n\ntype BffSubscription = NonNullable<BffSubscriptionResponse[\"subscription\"]>;\n\n/**\n * Safely parses a price string to a number, returning the fallback if the\n * result is NaN (e.g. non-numeric strings from a malformed BFF response).\n */\nfunction safeParsePrice(\n value: string | null | undefined,\n fallback = 0,\n): number {\n if (!value) return fallback;\n const parsed = parseFloat(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Maps a BFF subscription detail response to the port's SubscriptionDetail.\n *\n * The BFF returns a flat Subscription schema (plan_name, product, etc.) while\n * the port expects richly nested objects (subscription_plan, variant.product).\n * This explicitly maps every field the UI accesses so undefined-property crashes\n * are caught here at the adapter boundary rather than deep in the component tree.\n */\nfunction mapDetailSubscription(\n bff: BffSubscription,\n): subscriptions.SubscriptionDetailSubscription {\n const price = safeParsePrice(bff.total);\n\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n status: bff.status ?? \"\",\n quantity: bff.quantity ?? 1,\n price,\n original_price: safeParsePrice(bff.original_price, price),\n next_bill_date: bff.next_billing_date ?? null,\n last_bill_date: bff.last_billing_date ?? null,\n next_ship_date: null,\n last_ship_date: null,\n disabled: false,\n attempts: 0,\n last_failed_at: null,\n next_retry_at: null,\n skipped_count: 0,\n max_skips: null,\n cancelled_at: null,\n created_at: bff.created_at ?? \"\",\n updated_at: bff.updated_at ?? \"\",\n notes: null,\n subscription_plan: {\n id: bff.plan?.id ?? 0,\n name: bff.plan?.name ?? bff.plan_name ?? \"\",\n billing_interval: bff.plan?.billing_interval ?? 1,\n billing_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n billing_frequency_in_words: bff.plan?.billing_interval_unit\n ? `Every ${bff.plan.billing_interval ?? 1} ${bff.plan.billing_interval_unit}`\n : \"\",\n shipping_interval: 1,\n shipping_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n trial_period: null,\n trial_period_unit: null,\n split_volume: false,\n allow_skipping: bff.plan?.allow_skipping ?? false,\n max_skips: bff.plan?.max_skips ?? null,\n price_adjustment_type: null,\n price_adjustment_amount: null,\n max_quantity: null,\n active: true,\n company_default: null,\n created_at: \"\",\n updated_at: \"\",\n products_count: null,\n subscribers_count: null,\n },\n customer: {\n id: 0,\n account_id: null,\n first_name: null,\n last_name: null,\n full_name: bff.customer_name ?? \"\",\n email: \"\",\n verified_email: null,\n phone: null,\n orders_count: null,\n created_at: \"\",\n display_total_spent: \"0\",\n metadata: {},\n user_company_id: null,\n external_id: null,\n last_order_id: null,\n notes: null,\n active: true,\n total_spent: 0,\n customer_notes: [],\n default_address: null,\n addresses: [],\n active_subscriptions_count: 0,\n inactive_subscriptions_count: 0,\n is_rep: false,\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n sku: null,\n primary_image: bff.product?.image_url ?? null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n price_in_currency: bff.total ?? \"0\",\n options: [],\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n cv: null,\n tax: null,\n sku: null,\n price_in_currency: bff.total ?? \"0\",\n tax_in_currency: \"0\",\n cv_in_currency: \"0\",\n },\n },\n address: bff.address\n ? {\n id: bff.address.id ?? 0,\n name: bff.address.name ?? null,\n address1: bff.address.address1 ?? \"\",\n address2: bff.address.address2 ?? null,\n city: bff.address.city ?? \"\",\n state: bff.address.state ?? \"\",\n subdivision_code: null,\n postal_code: bff.address.postal_code ?? \"\",\n country_code: bff.address.country_code ?? null,\n default: false,\n }\n : {\n id: 0,\n name: null,\n address1: \"\",\n address2: null,\n city: \"\",\n state: \"\",\n subdivision_code: null,\n postal_code: \"\",\n country_code: null,\n default: false,\n },\n payment_method: bff.payment_method\n ? {\n id: bff.payment_method.id ?? 0,\n source: bff.payment_method.source ?? \"\",\n payment_type:\n bff.payment_method.payment_type ?? bff.payment_method.source ?? \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {\n card_type: bff.payment_method.card_type ?? undefined,\n last4: bff.payment_method.last4 ?? undefined,\n },\n }\n : {\n id: 0,\n source: \"\",\n payment_type: \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {},\n },\n currency: {\n id: 0,\n name: bff.currency ?? null,\n code: bff.currency ?? \"USD\",\n rate: null,\n active: true,\n symbol: null,\n },\n country: { id: 0, name: \"\", iso: \"\" },\n company: { id: 0, name: \"\" },\n subscription_skips: [],\n orders: [],\n };\n}\n\nfunction mapSubscriptionDetail(\n response: BffSubscriptionResponse,\n): subscriptions.SubscriptionDetail {\n const bff = response.subscription;\n if (!bff) {\n throw new Error(\n \"BFF returned a successful response but subscription data was missing\",\n );\n }\n return {\n subscription: mapDetailSubscription(bff),\n meta: response.meta ? mapMeta(response.meta) : undefined,\n };\n}\n\n/**\n * Maps a BFF list subscription to the port's SubscriptionListItem.\n *\n * The BFF returns a flat shape with `product` and `quantity` while the port\n * expects nested `variant.product` (from the admin API). This bridges the two\n * so the UI layer sees a consistent shape regardless of which API backs it.\n */\nfunction mapListItem(\n bff: NonNullable<BffListResponse[\"subscriptions\"]>[number],\n): subscriptions.SubscriptionListItem {\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n created_at: bff.created_at ?? \"\",\n customer: {\n id: 0,\n account_id: \"\",\n active: true,\n display_total_spent: \"0\",\n email: \"\",\n first_name: \"\",\n full_name: bff.customer_name ?? \"\",\n is_rep: false,\n last_name: \"\",\n orders_count: 0,\n phone: null,\n total_spent: \"0\",\n user_company_id: null,\n },\n last_bill_date: null,\n next_bill_date: bff.next_billing_date ?? null,\n price: safeParsePrice(bff.total),\n quantity: bff.quantity ?? 1,\n status: bff.status ?? \"\",\n subscription_plan: {\n id: 0,\n active: true,\n billing_interval: 1,\n billing_interval_unit: bff.interval ?? \"\",\n shipping_interval: 1,\n shipping_interval_unit: bff.interval ?? \"\",\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? \"\",\n price_in_currency: bff.total ?? \"0\",\n },\n },\n };\n}\n\nfunction mapSubscriptionList(\n response: BffListResponse,\n): subscriptions.SubscriptionsResponse {\n const raw = response.meta ?? {};\n return {\n subscriptions: (response.subscriptions ?? []).map(mapListItem),\n meta: {\n ...mapMeta(raw),\n pagination: raw.pagination\n ? {\n cursor: raw.pagination.cursor ?? null,\n limit: raw.pagination.limit,\n next_cursor: raw.pagination.next_cursor ?? null,\n prev_cursor: raw.pagination.prev_cursor ?? null,\n }\n : undefined,\n },\n };\n}\n\n/**\n * Creates a SubscriptionsApi-compatible adapter backed by the portal-tenant BFF.\n *\n * Uses async/await with explicit field mapping. The BFF returns simplified\n * subscription types compared to the full admin API; the adapter maps the\n * response envelope and provides runtime defaults for optional fields.\n */\nexport function createPortalSubscriptionsAdapter(\n client: FetchClient,\n): SubscriptionsApi {\n return {\n fetchCustomerSubscriptions: async (\n params: subscriptions.FetchSubscriptionsParams,\n ) => {\n const rawStatus = params.status;\n const status =\n rawStatus === \"active\" || rawStatus === \"inactive\"\n ? rawStatus\n : undefined;\n const response = await portalTenant.subscriptions_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit ?? params.perPage,\n status,\n q: params.search ?? undefined,\n });\n return mapSubscriptionList(response);\n },\n\n fetchSubscription: async (subscriptionToken: string) => {\n const response = await portalTenant.subscriptions_show(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n pauseSubscription: async (\n subscriptionToken: string,\n params: subscriptions.PauseSubscriptionParams,\n ) => {\n const body: {\n next_bill_date?: string;\n number_of_orders?: number;\n } = {};\n if (params.nextBillDate != null)\n body.next_bill_date = params.nextBillDate;\n if (params.numberOfOrders != null)\n body.number_of_orders = params.numberOfOrders;\n const response = await portalTenant.subscriptions_pause(\n client,\n subscriptionToken,\n body,\n );\n return mapSubscriptionDetail(response);\n },\n\n resumeSubscription: async (\n subscriptionToken: string,\n params: subscriptions.ResumeSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_resume(\n client,\n subscriptionToken,\n { next_bill_date: params.nextBillDate },\n );\n return mapSubscriptionDetail(response);\n },\n\n skipSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.SkipSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_skip(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n cancelSubscription: async (\n subscriptionToken: string,\n _customerId?: number,\n ) => {\n const response = await portalTenant.subscriptions_cancel(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n reactivateSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.ReactivateSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_reactivate(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n updateSubscriptionInfo: async (\n subscriptionToken: string,\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >,\n ) => {\n const subscription: {\n payment_method_id?: number;\n quantity?: number;\n address_id?: number;\n next_bill_date?: string;\n } = {};\n if (body.payment_method_id != null) {\n subscription.payment_method_id = body.payment_method_id;\n }\n if (body.quantity != null) {\n subscription.quantity = body.quantity;\n }\n if (body.address_id != null) {\n subscription.address_id = body.address_id;\n }\n if (body.next_bill_date != null) {\n subscription.next_bill_date = body.next_bill_date;\n }\n const response = await portalTenant.subscriptions_update(\n client,\n subscriptionToken,\n { subscription },\n );\n return mapSubscriptionDetail(response);\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalSubscriptionsAdapter } from \"../adapters/subscriptions-api-adapter\";\n\nexport function PortalSubscriptionsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalSubscriptionsAdapter(client), [client]);\n\n return (\n <SubscriptionsCoreProvider api={api}>{children}</SubscriptionsCoreProvider>\n );\n}\n","import { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { SubscriptionsDict } from \"./translation-dictionary\";\n\nconst { Provider, useTranslation } =\n createTranslationContext<SubscriptionsDict>(\"Subscriptions\");\n\nexport const SubscriptionsTranslationProvider = Provider;\nexport const useSubscriptionsTranslation = useTranslation;\n","export const subscriptionsEn = {\n // Breadcrumbs & navigation\n breadcrumb: \"Subscriptions\",\n breadcrumb_detail: \"Subscription #{{token}}\",\n\n // Filter tabs\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n\n // Search\n search_placeholder: \"Search subscriptions...\",\n\n // Table columns\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n\n // Empty / unknown states\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n\n // Pagination (used by subscriptions-list)\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n\n // Subscription detail — upcoming order\n your_upcoming_order: \"Your Upcoming Order\",\n next_order_date: \"Next Order Date\",\n next_bill_amount: \"Next Bill Amount\",\n\n // Product row\n product_image_alt: \"Product image\",\n no_image: \"No image\",\n quantity_label: \"Quantity\",\n quantity_aria: \"Quantity\",\n\n // Pricing summary\n subtotal: \"Subtotal\",\n discount: \"Discount\",\n total_label: \"Total\",\n tax_shipping_note: \"*Tax and shipping calculated at checkout\",\n\n // Order actions\n order_actions: \"Order Actions\",\n skip_next_order: \"Skip Next Order\",\n edit_bill_date: \"Edit Bill Date\",\n pause_subscription: \"Pause Subscription\",\n cancel_subscription: \"Cancel Subscription\",\n cancelled_subscription: \"Cancelled Subscription\",\n resume_subscription: \"Resume Subscription\",\n reactivate_subscription: \"Reactivate Subscription\",\n\n // Short action labels (SubscriptionActions)\n skip_next: \"Skip Next\",\n pause: \"Pause\",\n cancel: \"Cancel\",\n resume: \"Resume\",\n reactivate: \"Reactivate\",\n\n // Subscription details section\n subscription_details: \"Subscription Details\",\n order_frequency: \"Order Frequency\",\n next_payment: \"Next Payment\",\n last_billed: \"Last Billed\",\n\n // Payment & shipping\n payment_and_shipping: \"Payment & Shipping\",\n shipping_address: \"Shipping Address\",\n payment_method: \"Payment Method\",\n card_fallback: \"Card\",\n ending_in: \"ending in {{last4}}\",\n no_payment_method: \"No payment method\",\n no_shipping_address: \"No shipping address available\",\n\n // Order history\n subscription_order_history: \"Subscription Order History\",\n order: \"Order\",\n date: \"Date\",\n amount: \"Amount\",\n not_available: \"N/A\",\n\n // Cancel dialog\n cancel_dialog_title: \"Cancel Subscription\",\n cancel_dialog_description:\n \"Are you sure you want to cancel this subscription? You can reactivate it later.\",\n cancel_dialog_pause_question:\n \"Would you like to pause your subscription instead?\",\n cancel_dialog_pause_button: \"Pause Subscription\",\n cancel_dialog_cancel_button: \"Cancel\",\n cancel_dialog_confirm_button: \"Cancel Subscription\",\n pause_for: \"Pause for\",\n select_duration: \"Select duration\",\n month_singular: \"{{count}} month\",\n month_plural: \"{{count}} months\",\n\n // Pause dialog\n pause_dialog_title: \"Pause subscription\",\n pause_dialog_description: \"Are you sure you want to pause subscription?\",\n pause_dialog_action: \"Pause\",\n pause_indefinitely: \"Pause indefinitely\",\n pause_for_orders: \"Pause for a number of upcoming orders\",\n choose_orders_to_skip: \"Choose how many orders to skip\",\n select: \"Select\",\n pause_dialog_cancel: \"Cancel\",\n pause_indefinite_message_prefix:\n \"If you pause indefinitely no further charges will occur. To restart, simply select\",\n pause_indefinite_message_resume: \"Resume\",\n pause_indefinite_message_suffix: \"from your account.\",\n pause_resume_message_prefix:\n \"You won't be charged until your subscription resumes on\",\n pause_resume_message_suffix: \".\",\n\n // Resume dialog\n resume_dialog_title: \"Resume subscription\",\n resume_dialog_description: \"Choose the date your subscription should resume.\",\n resume_dialog_action: \"Resume\",\n resume_date: \"Resume date\",\n date_placeholder: \"mm/dd/yyyy\",\n resume_dialog_cancel: \"Cancel\",\n resume_charge_message_prefix:\n \"Your subscription will resume and you'll be charged on\",\n resume_charge_message_suffix: \".\",\n\n // Edit bill date dialog\n edit_bill_date_title: \"Edit bill date\",\n edit_bill_date_description: \"Select a new date for your next bill.\",\n edit_bill_date_action: \"Save\",\n next_bill_date_label: \"Next bill date\",\n edit_bill_date_cancel: \"Cancel\",\n bill_date_preview_prefix: \"Your next bill will be on\",\n bill_date_preview_suffix: \".\",\n your_other_subscriptions: \"Your other subscriptions\",\n other_subs_product: \"Product\",\n other_subs_bill_date: \"Bill Date\",\n\n // Toast / mutation messages\n subscription_paused: \"Subscription paused\",\n failed_to_pause: \"Failed to pause subscription\",\n subscription_resumed: \"Subscription resumed\",\n failed_to_resume: \"Failed to resume subscription\",\n next_billing_skipped: \"Next billing skipped\",\n failed_to_skip: \"Failed to skip billing\",\n subscription_cancelled: \"Subscription cancelled\",\n failed_to_cancel: \"Failed to cancel subscription\",\n subscription_reactivated: \"Subscription reactivated\",\n failed_to_reactivate: \"Failed to reactivate subscription\",\n quantity_updated: \"Quantity updated\",\n failed_to_update_quantity: \"Failed to update quantity\",\n bill_date_updated: \"Bill date updated\",\n failed_to_update_bill_date: \"Failed to update bill date\",\n bill_date_error:\n \"Could not update the bill date. Please try a different date.\",\n generic_error: \"Something went wrong. Please try again.\",\n\n // Account error\n account_load_error: \"Unable to load account data. Please try again later.\",\n\n // Detail screen errors (portal)\n subscription_not_found: \"Subscription not found\",\n error_occurred: \"An error occurred\",\n failed_to_load_subscription: \"Failed to load subscription: {{message}}\",\n} as const satisfies Record<string, string>;\n\nexport type SubscriptionsDict = typeof subscriptionsEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport {\n subscriptionsEn,\n type SubscriptionsDict,\n} from \"./translation-dictionary\";\n\nexport const subscriptionsDomain: DomainTranslations<SubscriptionsDict> =\n createDomainTranslations<SubscriptionsDict>({\n fallback: subscriptionsEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n },\n });\n\nexport function createSubscriptionsTranslationAdapter(\n locale: string,\n dict: SubscriptionsDict,\n): TranslationApi<SubscriptionsDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n subscriptionsDomain,\n createSubscriptionsTranslationAdapter,\n} from \"@fluid-app/subscriptions-core/translation-adapter\";\nimport { SubscriptionsTranslationProvider } from \"@fluid-app/subscriptions-core/translation-api-context\";\n\nexport function SubscriptionsTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(subscriptionsDomain, locale);\n const api = useMemo(\n () => createSubscriptionsTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <SubscriptionsTranslationProvider value={api}>\n {children}\n </SubscriptionsTranslationProvider>\n );\n}\n","import type { subscriptions } from \"@fluid-app/subscriptions-core\";\n\nexport type T = (key: string) => string;\n\nexport type FilterKey = \"all\" | \"active\" | \"paused\" | \"cancelled\";\n\nexport type StatusKind =\n | \"active\"\n | \"paused\"\n | \"cancelled\"\n | \"pending\"\n | \"past_due\";\n\nexport interface MappedStatus {\n kind: StatusKind;\n label: string;\n}\n\nconst replaceN = (s: string, n: number) => s.replace(\"{n}\", String(n));\n\n// US `canceled` and UK `cancelled` fold together; `past_due`/`past-due` too.\nconst STATUS_LOOKUP: Record<string, { kind: StatusKind; labelKey: string }> = {\n active: { kind: \"active\", labelKey: \"subs_status_active\" },\n paused: { kind: \"paused\", labelKey: \"subs_status_paused\" },\n cancelled: { kind: \"cancelled\", labelKey: \"subs_status_cancelled\" },\n canceled: { kind: \"cancelled\", labelKey: \"subs_status_cancelled\" },\n past_due: { kind: \"past_due\", labelKey: \"subs_status_past_due\" },\n \"past-due\": { kind: \"past_due\", labelKey: \"subs_status_past_due\" },\n pending: { kind: \"pending\", labelKey: \"subs_status_pending\" },\n};\n\n/**\n * Map a raw subscription `status` string from the BFF onto our internal\n * status vocabulary. Unknown statuses pass through with `kind: \"pending\"`\n * and a capitalized raw label — never synthesize a colored pill that\n * pretends to be real status data.\n */\nexport function mapStatus(status: string, t: T): MappedStatus {\n const entry = STATUS_LOOKUP[(status || \"\").toLowerCase()];\n if (entry) return { kind: entry.kind, label: t(entry.labelKey) };\n return {\n kind: \"pending\",\n label: status ? status.charAt(0).toUpperCase() + status.slice(1) : \"—\",\n };\n}\n\n/**\n * Sort priority — past-due first (urgent), cancelled last. Used to order\n * subscriptions within the active grid before the cancelled section.\n */\nexport const STATUS_PRIORITY: Record<StatusKind, number> = {\n past_due: 0,\n active: 1,\n pending: 2,\n paused: 3,\n cancelled: 4,\n};\n\n/**\n * \"Active\" group = anything still actionable, including paused (can be\n * resumed). The cancelled section is reserved for cancelled subs only —\n * those are truly done and can't be acted on beyond viewing.\n */\nexport function isActiveKind(kind: StatusKind): boolean {\n return (\n kind === \"active\" ||\n kind === \"past_due\" ||\n kind === \"pending\" ||\n kind === \"paused\"\n );\n}\n\nconst identity: T = (k) => k;\n\nexport function filterPredicate(\n filter: FilterKey,\n sub: subscriptions.SubscriptionListItem,\n): boolean {\n if (filter === \"all\") return true;\n // Use a no-op `t` here — we only need the kind for filter classification.\n const kind = mapStatus(sub.status, identity).kind;\n // past_due belongs in Active — it's still actionable (user needs to fix\n // payment) and renders in the active grid by default. Excluding it here\n // would make the most-urgent subs vanish when the Active pill is selected.\n if (filter === \"active\")\n return kind === \"active\" || kind === \"pending\" || kind === \"past_due\";\n if (filter === \"paused\") return kind === \"paused\";\n if (filter === \"cancelled\") return kind === \"cancelled\";\n return true;\n}\n\nexport function countByFilter(\n list: subscriptions.SubscriptionListItem[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n active: list.filter((s) => filterPredicate(\"active\", s)).length,\n paused: list.filter((s) => filterPredicate(\"paused\", s)).length,\n cancelled: list.filter((s) => filterPredicate(\"cancelled\", s)).length,\n };\n}\n\nexport function formatCadence(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const interval = plan.billing_interval;\n const unit = plan.billing_interval_unit;\n if (interval === 1 && unit === \"month\") return t(\"subs_cadence_monthly\");\n if (interval === 1 && unit === \"week\") return t(\"subs_cadence_weekly\");\n if (interval === 1 && unit === \"year\") return t(\"subs_cadence_yearly\");\n if (interval === 3 && unit === \"month\") return t(\"subs_cadence_quarterly\");\n // Generic fallback uses the BFF-provided unit string verbatim — units\n // like \"day\"/\"week\"/\"month\"/\"year\" come from the API and aren't part of\n // the translation dictionary. The wrapping template IS translated.\n const template = t(\n interval > 1 ? \"subs_cadence_every_n_units\" : \"subs_cadence_every_unit\",\n );\n return template\n .replace(\"{n}\", String(interval))\n .replace(\"{unit}\", unit + (interval > 1 ? \"s\" : \"\"));\n}\n\nexport function pricingSuffix(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const unit = plan.billing_interval_unit;\n const interval = plan.billing_interval;\n if (interval === 1) {\n if (unit === \"month\") return t(\"subs_price_per_month\");\n if (unit === \"week\") return t(\"subs_price_per_week\");\n if (unit === \"year\") return t(\"subs_price_per_year\");\n if (unit === \"day\") return t(\"subs_price_per_day\");\n }\n const template = t(\"subs_price_every_n_units\");\n return template\n .replace(\"{n}\", String(interval))\n .replace(\"{unit}\", unit + (interval > 1 ? \"s\" : \"\"));\n}\n\nexport function formatLongDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\n/**\n * Render the subscription bill amount in the BFF-formatted currency string\n * when available (e.g. \"$50.00\", \"€45.00\"). Falls back to the unformatted\n * decimal if the BFF string is missing.\n */\nexport function formatPrice(sub: subscriptions.SubscriptionListItem): string {\n const fromBff = sub.variant?.product?.price_in_currency;\n if (fromBff && fromBff.trim().length > 0) return fromBff;\n return sub.price.toFixed(2);\n}\n\nexport interface CycleProgress {\n /** 0..1 fraction of the cycle that has elapsed. */\n progress: number;\n /** \"Last bill 18 days ago\" — friendly label for the start of the cycle. */\n startLabel: string;\n /** \"Bills in 12 days\" — friendly label for the end of the cycle. */\n endLabel: string;\n}\n\n/**\n * Compute progress through a billing cycle. Returns `null` when either\n * date is missing, unparseable, or `end <= start`. `now` is injectable\n * for tests.\n */\nexport function computeCycleProgress(\n last: string | null,\n next: string | null,\n t: T,\n now: number = Date.now(),\n): CycleProgress | null {\n if (!last || !next) return null;\n const start = new Date(last).getTime();\n const end = new Date(next).getTime();\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n return null;\n }\n const raw = (now - start) / (end - start);\n const progress = Math.max(0, Math.min(1, raw));\n return {\n progress,\n startLabel: friendlyDaysAgo(start, t, now),\n endLabel: friendlyDaysAhead(end, t, now),\n };\n}\n\nexport function friendlyDaysAgo(\n start: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.max(0, Math.round((now - start) / (1000 * 60 * 60 * 24)));\n if (days === 0) return t(\"subs_last_bill_today\");\n if (days === 1) return t(\"subs_last_bill_yesterday\");\n return replaceN(t(\"subs_last_bill_n_days_ago\"), days);\n}\n\nexport function friendlyDaysAhead(\n end: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.round((end - now) / (1000 * 60 * 60 * 24));\n if (days < 0) return replaceN(t(\"subs_bill_overdue_n_days\"), Math.abs(days));\n if (days === 0) return t(\"subs_bills_today\");\n if (days === 1) return t(\"subs_bills_tomorrow\");\n return replaceN(t(\"subs_bills_in_n_days\"), days);\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type subscriptions,\n useInfiniteSubscriptions,\n} from \"@fluid-app/subscriptions-core\";\nimport { ImageOff, Play, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n type CycleProgress as CycleProgressData,\n type FilterKey,\n type T,\n STATUS_PRIORITY,\n computeCycleProgress,\n countByFilter,\n filterPredicate,\n formatCadence,\n formatLongDate,\n formatPrice,\n isActiveKind,\n mapStatus,\n pricingSuffix,\n} from \"./portal-subscriptions-list-helpers\";\n\nexport type { FilterKey } from \"./portal-subscriptions-list-helpers\";\n\nconst identityT: T = (key) => key;\n\ninterface PortalSubscriptionsListProps {\n customerId: number | undefined;\n isLoadingCustomer?: boolean;\n onSubscriptionClick: (token: string) => void;\n onResume?: (sub: subscriptions.SubscriptionListItem) => void;\n /**\n * Translation function. Falls back to returning the key verbatim when\n * absent so the component renders something usable in storybook /\n * tenant-less contexts; production callers should always supply `t`.\n */\n t?: T;\n}\n\nexport function PortalSubscriptionsList({\n customerId,\n isLoadingCustomer,\n onSubscriptionClick,\n onResume,\n t = identityT,\n}: PortalSubscriptionsListProps): JSX.Element {\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteSubscriptions(\n { customerId, limit: 12 },\n { enabled: !!customerId && !isLoadingCustomer },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.subscriptions) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((s) => filterPredicate(filter, s)),\n [list, filter],\n );\n const { activeSubs, inactiveSubs } = useMemo(() => {\n const sorted = filteredList\n .slice()\n .sort(\n (a, b) =>\n STATUS_PRIORITY[mapStatus(a.status, t).kind] -\n STATUS_PRIORITY[mapStatus(b.status, t).kind],\n );\n return {\n activeSubs: sorted.filter((s) =>\n isActiveKind(mapStatus(s.status, t).kind),\n ),\n inactiveSubs: sorted.filter(\n (s) => !isActiveKind(mapStatus(s.status, t).kind),\n ),\n };\n }, [filteredList, t]);\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"subs_breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"relative\">\n <div className=\"max-w-profile-container relative mx-auto px-5 pt-8 pb-20 md:px-8\">\n <h1 className=\"text-profile-hero tracking-profile-hero text-profile-text md:text-profile-hero-lg font-bold\">\n {t(\"subs_title\")}\n </h1>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n t={t}\n />\n )}\n\n {isLoading || isLoadingCustomer ? (\n <div className=\"mt-8 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <SubscriptionCardSkeleton key={i} />\n ))}\n </div>\n ) : isError ? (\n <ErrorState onRetry={() => refetch()} t={t} />\n ) : filteredList.length === 0 ? (\n <EmptyState filtered={filter !== \"all\" && list.length > 0} t={t} />\n ) : (\n <>\n {activeSubs.length > 0 && (\n <div className=\"mt-6 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {activeSubs.map((sub) => (\n <SubscriptionCard\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n onResume={onResume ? () => onResume(sub) : undefined}\n t={t}\n />\n ))}\n </div>\n )}\n\n {inactiveSubs.length > 0 && (\n <div className={activeSubs.length > 0 ? \"mt-10\" : \"mt-6\"}>\n <div className=\"text-profile-xs text-profile-text-muted mb-2 px-1 font-semibold\">\n {t(\"subs_cancelled_section_label\").replace(\n \"{n}\",\n String(inactiveSubs.length),\n )}\n </div>\n <div className=\"space-y-3\">\n {inactiveSubs.map((sub) => (\n <InactiveSubscriptionRow\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n t={t}\n />\n ))}\n </div>\n </div>\n )}\n </>\n )}\n\n {hasNextPage && (\n <div className=\"mt-6 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-profile-border bg-profile-card text-profile-text hover:bg-profile-pill-hover text-profile-xs inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"subs_loading\") : t(\"subs_load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{ key: FilterKey; labelKey: string }> = [\n { key: \"all\", labelKey: \"subs_filter_all\" },\n { key: \"active\", labelKey: \"subs_filter_active\" },\n { key: \"paused\", labelKey: \"subs_filter_paused\" },\n { key: \"cancelled\", labelKey: \"subs_filter_cancelled\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`text-profile-xs inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 font-bold transition-all ${\n isActive\n ? \"bg-profile-dark text-profile-dark-foreground\"\n : \"ring-profile-border bg-profile-card text-profile-text hover:bg-profile-pill-hover ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-profile-micro tabular-nums ${\n isActive\n ? \"text-profile-dark-foreground/70\"\n : \"text-profile-text-muted\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────────\n\nfunction SubscriptionCard({\n sub,\n onClick,\n onResume,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n onResume?: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const isPaused = status.kind === \"paused\";\n const isCancelled = status.kind === \"cancelled\";\n const isPastDue = status.kind === \"past_due\";\n const cadence = formatCadence(sub.subscription_plan, t);\n const nextBillLong = sub.next_bill_date\n ? formatLongDate(sub.next_bill_date)\n : null;\n const lastBillLong = sub.last_bill_date\n ? formatLongDate(sub.last_bill_date)\n : null;\n const daysOverdue =\n isPastDue && sub.next_bill_date\n ? Math.max(\n 0,\n Math.round(\n (Date.now() - new Date(sub.next_bill_date).getTime()) /\n (1000 * 60 * 60 * 24),\n ),\n )\n : 0;\n const cycle = computeCycleProgress(sub.last_bill_date, sub.next_bill_date, t);\n const showCycle = cycle != null && !isPaused && !isCancelled && !isPastDue;\n\n // Card structure: an outer styled wrapper with two children. The first is\n // a real <button> covering the navigate-on-click area (image/title/status,\n // bill summary, cycle progress). The second is the Resume <button>, only\n // present when paused, rendered as a sibling so we never nest interactive\n // elements (which is invalid HTML and breaks Axe + Firefox click handling).\n // Hover lift + focus ring sit on the outer wrapper via :has(:focus-visible)\n // and :hover so the whole card animates as one even though the click areas\n // are separate.\n return (\n <div\n className={`group has-[:focus-visible]:ring-profile-text/30 relative flex flex-col gap-5 rounded-2xl p-5 ring-1 transition-all duration-300 hover:-translate-y-0.5 has-[:focus-visible]:ring-2 ${\n isPastDue\n ? \"bg-profile-card from-profile-danger-wash via-profile-danger-wash-faint shadow-profile-card ring-profile-danger-edge hover:shadow-profile-danger-card-hover hover:ring-profile-danger-edge-strong bg-gradient-to-br to-transparent\"\n : \"bg-profile-card ring-profile-card-edge shadow-profile-card hover:ring-profile-text/10 hover:shadow-profile-card-hover\"\n } ${isPaused || isCancelled ? \"opacity-90\" : \"\"}`}\n >\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex cursor-pointer flex-col gap-5 text-left focus:outline-none\"\n >\n {/* Top: image + title */}\n <div className=\"flex items-start gap-4\">\n <Thumbnail\n product={sub.variant.product}\n muted={isPaused || isCancelled}\n t={t}\n />\n <div className=\"min-w-0 flex-1 pt-1\">\n <div className=\"text-profile-lg text-profile-text truncate font-bold\">\n {sub.variant.product.title || t(\"subs_product_fallback\")}\n </div>\n <div className=\"text-profile-sm-plus text-profile-text-muted mt-0.5\">\n {cadence}\n </div>\n {(isPaused || isCancelled || isPastDue) && (\n <div\n className={`text-profile-xs mt-2 inline-flex items-center gap-1.5 font-semibold ${\n isPastDue\n ? \"text-profile-danger-icon\"\n : \"text-profile-text-faint\"\n }`}\n >\n <span\n className={`size-1.5 rounded-full ${\n isCancelled || isPastDue\n ? \"bg-profile-danger-icon\"\n : \"bg-profile-text-muted\"\n }`}\n />\n {status.label}\n </div>\n )}\n </div>\n </div>\n\n {/* Middle: bill summary in 2-col format (date + amount), wrapped in\n a soft light-gray card for visual containment. For past-due we\n surface \"X days overdue\" using the real next_bill_date. For\n paused we show the last bill. For active we show the next bill. */}\n {isCancelled ? (\n <div className=\"bg-profile-icon-bg text-profile-base text-profile-text-muted rounded-xl px-4 py-3 font-semibold\">\n {status.label}\n </div>\n ) : (\n <div className=\"bg-profile-icon-bg rounded-xl px-4 py-3.5\">\n <div\n className={`text-profile-md font-bold ${isPastDue ? \"text-profile-danger-icon\" : \"text-profile-text\"}`}\n >\n {isPastDue\n ? daysOverdue === 1\n ? t(\"subs_bill_due_1_day_ago\")\n : daysOverdue > 0\n ? t(\"subs_bill_due_n_days_ago\").replace(\n \"{n}\",\n String(daysOverdue),\n )\n : t(\"subs_bill_overdue\")\n : isPaused\n ? t(\"subs_last_bill_label\")\n : t(\"subs_next_bill_label\")}\n </div>\n <div className=\"mt-3 grid grid-cols-2\">\n <div className=\"pr-4\">\n <div className=\"text-profile-xs text-profile-text-muted\">\n {isPaused ? t(\"subs_last_bill_date\") : t(\"subs_bill_date\")}\n </div>\n <div\n className={`text-profile-lg tracking-profile-tight mt-1 font-bold tabular-nums ${isPastDue ? \"text-profile-danger-icon\" : \"text-profile-text\"}`}\n >\n {(isPaused ? lastBillLong : nextBillLong) ?? \"—\"}\n </div>\n </div>\n <div className=\"border-profile-divider border-l pl-4\">\n <div className=\"text-profile-xs text-profile-text-muted\">\n {isPaused\n ? t(\"subs_last_bill_amount\")\n : t(\"subs_bill_amount\")}\n </div>\n <div className=\"text-profile-lg tracking-profile-tight text-profile-text mt-1 font-bold tabular-nums\">\n {formatPrice(sub)}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {pricingSuffix(sub.subscription_plan, t)}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Cycle progress bar — visualizes how far through the bill cycle we\n are. Only shown for active subs that have both last + next bill\n dates from the API (no fabrication). */}\n {showCycle && cycle && <CycleProgress cycle={cycle} />}\n </button>\n\n {/* Resume CTA — sibling to the click button, never nested. Only paused\n subs get a primary CTA; Skip / Pause / Manage live on the detail\n screen. */}\n {isPaused && (\n <button\n type=\"button\"\n onClick={onResume}\n disabled={!onResume}\n className=\"bg-profile-dark text-profile-dark-foreground hover:bg-profile-dark-hover text-profile-xs inline-flex w-full items-center justify-center gap-1.5 rounded-md py-2.5 font-bold transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Play className=\"size-3 fill-current\" strokeWidth={2.25} />\n {t(\"subs_resume_cta\")}\n </button>\n )}\n </div>\n );\n}\n\n// ─── Cycle progress ───────────────────────────────────────────────────────\n\nfunction CycleProgress({ cycle }: { cycle: CycleProgressData }): JSX.Element {\n const pct = Math.round(cycle.progress * 100);\n return (\n <div>\n <div className=\"bg-profile-icon-bg relative h-1.5 overflow-hidden rounded-full\">\n <div\n className=\"bg-profile-text absolute top-0 left-0 h-full rounded-full transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"text-profile-2xs text-profile-text-muted mt-2 flex items-center justify-between font-medium\">\n <span>{cycle.startLabel}</span>\n <span>{cycle.endLabel}</span>\n </div>\n </div>\n );\n}\n\n// ─── Inactive (condensed) row ─────────────────────────────────────────────\n\nfunction InactiveSubscriptionRow({\n sub,\n onClick,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const cadence = formatCadence(sub.subscription_plan, t);\n const detail = `${cadence} · ${status.label}`;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-profile-card ring-profile-card-edge shadow-profile-card hover:ring-profile-text/10 hover:shadow-profile-card-hover focus-visible:ring-profile-text/30 flex w-full cursor-pointer items-center gap-3 rounded-2xl px-4 py-3 text-left ring-1 transition-all duration-300 hover:-translate-y-0.5 focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"relative size-10 shrink-0 opacity-60 saturate-50\">\n {sub.variant.product.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt=\"\"\n className=\"bg-profile-card ring-profile-canvas size-10 rounded-xl object-cover ring-[3px]\"\n />\n ) : (\n <div className=\"bg-profile-icon-bg ring-profile-canvas text-profile-text-muted flex size-10 items-center justify-center rounded-xl ring-[3px]\">\n <ImageOff className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-md text-profile-text truncate font-bold\">\n {sub.variant.product.title || t(\"subs_product_fallback\")}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted truncate\">\n {detail}\n </div>\n </div>\n </button>\n );\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction Thumbnail({\n product,\n muted,\n t,\n}: {\n product: subscriptions.SubscriptionListVariantProduct;\n muted?: boolean;\n t: T;\n}): JSX.Element {\n const wrapperClass = `relative size-24 shrink-0 transition-all ${muted ? \"saturate-50 opacity-60\" : \"\"}`;\n const imgClass =\n \"bg-profile-card ring-profile-canvas size-24 rounded-2xl object-cover ring-[3px] shadow-sm\";\n return (\n <div className={wrapperClass}>\n {product.image_url ? (\n <img src={product.image_url} alt=\"\" className={imgClass} />\n ) : (\n <div className=\"bg-profile-icon-bg ring-profile-canvas text-profile-text-muted flex size-24 items-center justify-center rounded-2xl shadow-sm ring-[3px]\">\n <ImageOff className=\"size-7\" strokeWidth={1.75} />\n </div>\n )}\n <div\n className=\"bg-profile-dark text-profile-dark-foreground ring-profile-canvas absolute -top-1 -right-1 z-40 flex size-6 items-center justify-center rounded-full ring-2\"\n title={t(\"subs_recurring_badge\")}\n >\n <Repeat className=\"size-3\" strokeWidth={2.75} />\n </div>\n </div>\n );\n}\n\n// ─── Empty / loading ───────────────────────────────────────────────────────\n\nfunction SubscriptionCardSkeleton(): JSX.Element {\n return (\n <div className=\"ring-profile-border bg-profile-card flex flex-col gap-5 rounded-2xl p-5 ring-1\">\n <div className=\"flex items-start gap-4\">\n <div className=\"bg-profile-icon-bg size-20 shrink-0 animate-pulse rounded-2xl\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"bg-profile-icon-bg h-5 w-2/3 animate-pulse rounded\" />\n <div className=\"bg-profile-icon-bg h-4 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n <div className=\"bg-profile-icon-bg h-12 animate-pulse rounded\" />\n <div className=\"bg-profile-icon-bg h-6 animate-pulse rounded\" />\n </div>\n );\n}\n\nfunction EmptyState({\n filtered,\n t,\n}: {\n filtered?: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-profile-border bg-profile-card mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl px-6 py-12 text-center ring-1\">\n <div className=\"text-profile-base text-profile-text font-bold\">\n {filtered ? t(\"subs_no_in_view\") : t(\"subs_none_yet\")}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {filtered ? t(\"subs_filtered_hint\") : t(\"subs_empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-profile-border bg-profile-card mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl px-6 py-12 text-center ring-1\">\n <div className=\"bg-profile-icon-bg flex size-12 items-center justify-center rounded-full\">\n <AlertCircle\n className=\"text-profile-text-muted size-5\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n {t(\"subs_load_failed_title\")}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {t(\"subs_load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-profile-dark text-profile-dark-foreground hover:bg-profile-dark-hover text-profile-xs mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold transition-all\"\n >\n {t(\"subs_try_again\")}\n </button>\n </div>\n );\n}\n","import { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalSubscriptionsList } from \"./subscriptions/PortalSubscriptionsList\";\n\ninterface SubscriptionsListScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nconst translations: Record<string, string> = {\n // Page chrome\n subs_breadcrumb: \"Subscriptions\",\n subs_title: \"Your subscriptions\",\n subs_loading: \"Loading...\",\n subs_load_more: \"Load more\",\n subs_product_fallback: \"Product\",\n\n // Filter pills\n subs_filter_all: \"All\",\n subs_filter_active: \"Active\",\n subs_filter_paused: \"Paused\",\n subs_filter_cancelled: \"Cancelled\",\n\n // Status labels\n subs_status_active: \"Active\",\n subs_status_paused: \"Paused\",\n subs_status_cancelled: \"Cancelled\",\n subs_status_past_due: \"Payment issue\",\n subs_status_pending: \"Pending\",\n\n // Cadence (singular cases)\n subs_cadence_monthly: \"Monthly\",\n subs_cadence_weekly: \"Weekly\",\n subs_cadence_yearly: \"Yearly\",\n subs_cadence_quarterly: \"Quarterly\",\n subs_cadence_every_n_units: \"Every {n} {unit}\",\n subs_cadence_every_unit: \"Every {unit}\",\n\n // Pricing suffix\n subs_price_per_month: \"per month\",\n subs_price_per_week: \"per week\",\n subs_price_per_year: \"per year\",\n subs_price_per_day: \"per day\",\n subs_price_every_n_units: \"every {n} {unit}\",\n\n // Bill summary card\n subs_next_bill_label: \"Your next bill\",\n subs_last_bill_label: \"Last bill\",\n subs_bill_overdue: \"Bill overdue\",\n subs_bill_due_1_day_ago: \"Bill was due 1 day ago\",\n subs_bill_due_n_days_ago: \"Bill was due {n} days ago\",\n subs_bill_date: \"Bill date\",\n subs_bill_amount: \"Bill amount\",\n subs_last_bill_date: \"Last bill date\",\n subs_last_bill_amount: \"Last bill amount\",\n\n // Cycle progress\n subs_last_bill_today: \"Last bill today\",\n subs_last_bill_yesterday: \"Last bill yesterday\",\n subs_last_bill_n_days_ago: \"Last bill {n} days ago\",\n subs_bills_today: \"Bills today\",\n subs_bills_tomorrow: \"Bills tomorrow\",\n subs_bills_in_n_days: \"Bills in {n} days\",\n subs_bill_overdue_n_days: \"Bill overdue by {n} days\",\n\n // Sections / actions\n subs_cancelled_section_label: \"Cancelled · {n}\",\n subs_resume_cta: \"Resume subscription\",\n subs_recurring_badge: \"Recurring delivery\",\n\n // Empty / error / retry copy\n subs_no_in_view: \"No subscriptions in this view\",\n subs_none_yet: \"No subscriptions yet\",\n subs_filtered_hint: \"Try a different filter to see your other subscriptions.\",\n subs_empty_hint: \"When you subscribe to a product, it'll show up here.\",\n subs_load_failed_title: \"Couldn't load your subscriptions\",\n subs_load_failed_hint: \"Something went wrong on our end. Please try again.\",\n subs_try_again: \"Try again\",\n};\n\n// Module-level so the reference is stable across renders. Inline arrows would\n// recreate the function each render and bust every `useMemo([..., t])` in\n// `PortalSubscriptionsList` (activeSubs/inactiveSubs sort + partition).\nconst t = (key: string) => translations[key] ?? key;\n\nexport function SubscriptionsListScreen({\n customerId,\n isLoadingCustomer,\n}: SubscriptionsListScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const goToDetail = (token: string) => navigate(`subscriptions/${token}`);\n\n return (\n <PortalSubscriptionsList\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onSubscriptionClick={goToDetail}\n onResume={(sub) => goToDetail(sub.subscription_token)}\n t={t}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n AlertDialog,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@fluid-app/ui-primitives\";\n\nconst PAUSE_MONTH_OPTIONS = [1, 2, 3] as const;\nexport type PauseMonths = (typeof PAUSE_MONTH_OPTIONS)[number];\n\nexport interface CancelSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n onPauseInstead: (months: PauseMonths) => void;\n errorMessage?: string;\n}\n\nexport function CancelSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n onPauseInstead,\n errorMessage,\n}: CancelSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [isPending, setIsPending] = useState(false);\n const [selectedMonths, setSelectedMonths] = useState<PauseMonths | null>(\n null,\n );\n\n useEffect(() => {\n if (!open) setSelectedMonths(null);\n }, [open]);\n\n const handleConfirm = async () => {\n const result = onConfirm();\n if (!(result instanceof Promise)) {\n onOpenChange(false);\n return;\n }\n setIsPending(true);\n try {\n await result;\n onOpenChange(false);\n } catch (error) {\n // Leave the dialog open so the parent can surface errorMessage inline.\n console.error(\"CancelSubscriptionDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n }\n };\n\n const handlePause = () => {\n if (!selectedMonths) return;\n onPauseInstead(selectedMonths);\n };\n\n return (\n <AlertDialog\n open={open}\n onOpenChange={(v) => !isPending && onOpenChange(v)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t(\"cancel_dialog_title\")}</AlertDialogTitle>\n <AlertDialogDescription>\n {t(\"cancel_dialog_description\")}\n </AlertDialogDescription>\n </AlertDialogHeader>\n\n <div className=\"border-border space-y-2 rounded-md border p-3\">\n <p className=\"text-foreground text-sm font-medium\">\n {t(\"cancel_dialog_pause_question\")}\n </p>\n <Label\n htmlFor=\"cancel-pause-months\"\n className=\"text-foreground text-sm font-semibold\"\n >\n {t(\"pause_for\")}\n </Label>\n <Select\n value={selectedMonths ? String(selectedMonths) : undefined}\n onValueChange={(value) =>\n setSelectedMonths(value ? (Number(value) as PauseMonths) : null)\n }\n disabled={isPending}\n >\n <SelectTrigger id=\"cancel-pause-months\" className=\"w-full\">\n <SelectValue placeholder={t(\"select_duration\")} />\n </SelectTrigger>\n <SelectContent>\n {PAUSE_MONTH_OPTIONS.map((months) => (\n <SelectItem key={months} value={String(months)}>\n {months === 1\n ? t(\"month_singular\", { count: String(months) })\n : t(\"month_plural\", { count: String(months) })}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n onClick={handlePause}\n disabled={isPending || !selectedMonths}\n className=\"w-full\"\n >\n {t(\"cancel_dialog_pause_button\")}\n </Button>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <AlertDialogFooter className=\"flex-col gap-2 sm:flex-row sm:justify-end\">\n <AlertDialogCancel disabled={isPending}>\n {t(\"cancel_dialog_cancel_button\")}\n </AlertDialogCancel>\n {/*\n Plain Button rather than AlertDialogAction: Action auto-closes\n the dialog after onClick, which races handleConfirm's async\n path — the dialog would dismiss before the mutation settled,\n the spinner would never show, and an inline errorMessage would\n never be visible. handleConfirm calls onOpenChange itself on\n success and intentionally leaves the dialog open on rejection.\n */}\n <Button\n variant=\"destructive\"\n onClick={handleConfirm}\n disabled={isPending}\n autoFocus\n >\n {isPending ? \"...\" : t(\"cancel_dialog_confirm_button\")}\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { calculateResumeDate } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n} from \"@fluid-app/ui-primitives\";\nimport { format } from \"date-fns\";\n\ntype PauseType = \"indefinite\" | \"order_count\";\n\nexport type PauseSubscriptionSelection =\n | { type: \"indefinite\" }\n | { type: \"order_count\"; numberOfOrders: number };\n\nexport interface PauseSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (selection: PauseSubscriptionSelection) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n billingInterval?: number;\n billingIntervalUnit?: string;\n}\n\nexport function PauseSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n billingInterval = 1,\n billingIntervalUnit = \"month\",\n}: PauseSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [pauseType, setPauseType] = useState<PauseType>(\"indefinite\");\n const [selectedOrderCount, setSelectedOrderCount] = useState<number | null>(\n null,\n );\n\n const orderCountOptions = Array.from({ length: 99 }, (_, i) => i + 1);\n\n const calculatedResumeDate =\n selectedOrderCount && currentNextBillDate\n ? calculateResumeDate(\n billingInterval,\n billingIntervalUnit,\n selectedOrderCount,\n currentNextBillDate,\n )\n : null;\n\n // Reset selections whenever the dialog opens so stale state doesn't\n // leak across invocations.\n useEffect(() => {\n if (!open) return;\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }, [open]);\n\n const handleConfirm = () => {\n if (pauseType === \"indefinite\") {\n onConfirm({ type: \"indefinite\" });\n return;\n }\n if (pauseType === \"order_count\" && selectedOrderCount) {\n onConfirm({\n type: \"order_count\",\n numberOfOrders: selectedOrderCount,\n });\n }\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }\n onOpenChange(next);\n };\n\n const statusMessage = (() => {\n if (pauseType === \"indefinite\") {\n return (\n <>\n {t(\"pause_indefinite_message_prefix\")}{\" \"}\n <strong>{t(\"pause_indefinite_message_resume\")}</strong>{\" \"}\n {t(\"pause_indefinite_message_suffix\")}\n </>\n );\n }\n if (!selectedOrderCount) return null;\n const displayDate = calculatedResumeDate\n ? format(calculatedResumeDate, \"MMMM d, yyyy\")\n : \"a future date\";\n return (\n <>\n {t(\"pause_resume_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">{displayDate}</span>\n {t(\"pause_resume_message_suffix\")}\n </>\n );\n })();\n\n const isActionDisabled = pauseType === \"order_count\" && !selectedOrderCount;\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"pause-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"pause_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"pause-subscription-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"pause_dialog_description\")}\n </p>\n\n <div className=\"space-y-4\">\n {/* Pause Indefinitely */}\n <div className=\"flex items-center space-x-2\">\n <input\n id=\"pause-indefinitely\"\n type=\"radio\"\n checked={pauseType === \"indefinite\"}\n onChange={() => setPauseType(\"indefinite\")}\n className=\"border-border accent-primary h-4 w-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-indefinitely\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_indefinitely\")}\n </Label>\n </div>\n\n {/* Pause for Number of Orders */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <input\n id=\"pause-order-count\"\n type=\"radio\"\n checked={pauseType === \"order_count\"}\n onChange={() => setPauseType(\"order_count\")}\n className=\"border-border accent-primary h-4 w-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-order-count\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_for_orders\")}\n </Label>\n </div>\n\n {pauseType === \"order_count\" && (\n <div className=\"ml-6 space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"choose_orders_to_skip\")}\n </Label>\n <select\n value={selectedOrderCount ?? \"\"}\n onChange={(e) =>\n setSelectedOrderCount(Number(e.target.value))\n }\n className=\"border-input bg-background focus:border-ring focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-hidden\"\n >\n <option value=\"\" disabled>\n {t(\"select\")}\n </option>\n {orderCountOptions.map((count) => (\n <option key={count} value={count}>\n {count}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n {/* Status Message */}\n {statusMessage && (\n <div className=\"text-muted-foreground text-xs\">\n {statusMessage}\n </div>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"pause_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={isActionDisabled || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"pause_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { parse } from \"date-fns\";\n\nconst ISO_DATE = \"yyyy-MM-dd\";\n\n/**\n * Parse an ISO date string as local midnight. Accepts either a bare\n * \"yyyy-MM-dd\" or a full ISO timestamp — both are sliced to the date\n * portion first so the result lands on the intended calendar day\n * regardless of the viewer's timezone.\n */\nexport function parseIsoDate(value: string): Date {\n return parse(value.slice(0, 10), ISO_DATE, new Date());\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { addDays, format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface ResumeSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n /** Seeds the calendar; must be in the future. Defaults to tomorrow. */\n defaultNextBillDate?: string | null;\n}\n\nexport function ResumeSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n defaultNextBillDate,\n}: ResumeSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n // Seed selected date when the dialog opens.\n useEffect(() => {\n if (!open) return;\n if (defaultNextBillDate) {\n const seeded = parseIsoDate(defaultNextBillDate);\n setSelectedDate(seeded < minDate ? minDate : seeded);\n } else {\n setSelectedDate(minDate);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, defaultNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) setSelectedDate(undefined);\n onOpenChange(next);\n };\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"resume-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"resume_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"resume-subscription-dialog-description\"\n className=\"text-muted-foreground text-left text-sm\"\n >\n {t(\"resume_dialog_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"resume_date\")}\n </Label>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n style={{ zIndex: 9999 }}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={selectedDate}\n modifiersStyles={{\n selected: {\n backgroundColor: \"var(--primary)\",\n color: \"var(--primary-foreground)\",\n },\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n {selectedDate && (\n <p className=\"text-muted-foreground text-xs\">\n {t(\"resume_charge_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">\n {format(selectedDate, \"MMMM d, yyyy\")}\n </span>\n {t(\"resume_charge_message_suffix\")}\n </p>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <Button\n className=\"bg-muted text-foreground ring-border hover:bg-muted/80 h-10 min-w-[70px] rounded p-3 ring-1\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"resume_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"bg-primary text-primary-foreground h-10 min-w-[70px] rounded p-3 hover:opacity-90 disabled:opacity-50\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"resume_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport {\n addDays,\n addMonths,\n addWeeks,\n addYears,\n format,\n isAfter,\n} from \"date-fns\";\nimport { CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface OtherSubscriptionForBillDate {\n token: string;\n productTitle: string;\n nextBillDate: string | null;\n billingInterval: number;\n billingIntervalUnit: string;\n}\n\nfunction advanceByInterval(date: Date, interval: number, unit: string): Date {\n const step = Math.max(1, interval);\n switch (unit.toLowerCase()) {\n case \"day\":\n return addDays(date, step);\n case \"week\":\n return addWeeks(date, step);\n case \"year\":\n return addYears(date, step);\n case \"month\":\n default:\n return addMonths(date, step);\n }\n}\n\nconst SUBSCRIPTION_COLORS = [\n \"#3b82f6\",\n \"#f97316\",\n \"#10b981\",\n \"#a855f7\",\n \"#ec4899\",\n \"#eab308\",\n \"#14b8a6\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#84cc16\",\n];\n\n// Cap projection iterations per subscription so a daily-interval row can't\n// run away tens of thousands of times across the 2-year horizon. Sized for\n// a weekly cycle (~104 over two years) — covers the longest realistic\n// non-daily case without truncating dots for the rep.\nconst MAX_PROJECTIONS_PER_SUB = 104;\n\nexport interface EditBillDateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n otherSubscriptions?: OtherSubscriptionForBillDate[];\n onNavigateToSubscription?: (token: string) => void;\n}\n\nexport function EditBillDateDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n otherSubscriptions,\n onNavigateToSubscription,\n}: EditBillDateDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n // Anchor the popover's portal inside the dialog so Safari doesn't\n // swallow clicks on the calendar — Radix renders the popover into\n // document.body by default, but Dialog applies pointer-events: none\n // to the body while open, which kills clicks on a body-portaled\n // popover in Safari/WebKit specifically.\n const [popoverContainer, setPopoverContainer] =\n useState<HTMLDivElement | null>(null);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n const subscriptionsWithColor = useMemo(\n () =>\n (otherSubscriptions ?? []).map((sub, idx) => ({\n ...sub,\n color: SUBSCRIPTION_COLORS[idx % SUBSCRIPTION_COLORS.length] as string,\n })),\n [otherSubscriptions],\n );\n\n const billingColorsByDate = useMemo<Map<string, string[]>>(() => {\n const m = new Map<string, string[]>();\n const horizon = addYears(new Date(), 2);\n for (const sub of subscriptionsWithColor) {\n if (!sub.nextBillDate) continue;\n let d = parseIsoDate(sub.nextBillDate);\n let count = 0;\n while (!isAfter(d, horizon) && count < MAX_PROJECTIONS_PER_SUB) {\n const key = format(d, \"yyyy-MM-dd\");\n const arr = m.get(key) ?? [];\n arr.push(sub.color);\n m.set(key, arr);\n d = advanceByInterval(d, sub.billingInterval, sub.billingIntervalUnit);\n count++;\n }\n }\n return m;\n }, [subscriptionsWithColor]);\n\n // Memoize the components map: react-day-picker uses each entry's identity\n // as the React element type for every day cell, so a fresh object every\n // render unmounts/remounts all visible cells (visible flicker, lost cell\n // state).\n const calendarComponents = useMemo(\n () => ({\n DayContent: ({ date }: { date: Date }) => {\n const key = format(date, \"yyyy-MM-dd\");\n const colors = billingColorsByDate.get(key) ?? [];\n return (\n <div className=\"flex h-full w-full flex-col items-center justify-center\">\n <span className=\"leading-none\">{date.getDate()}</span>\n {colors.length > 0 && (\n <div className=\"mt-0.5 flex items-center justify-center gap-0.5\">\n {colors.map((c, i) => (\n <span\n key={`${key}-${i}`}\n className=\"h-1 w-1 rounded-[1px]\"\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )}\n </div>\n );\n },\n IconLeft: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronLeft>) => (\n <ChevronLeft className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n IconRight: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronRight>) => (\n <ChevronRight className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n }),\n [billingColorsByDate],\n );\n\n useEffect(() => {\n if (!open) return;\n if (currentNextBillDate) {\n const initial = parseIsoDate(currentNextBillDate);\n setSelectedDate(initial < minDate ? minDate : initial);\n } else {\n setSelectedDate(undefined);\n }\n // minDate derives from `new Date()` — intentionally excluded so this\n // only runs on open transitions.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, currentNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setSelectedDate(undefined);\n }\n onOpenChange(next);\n };\n\n const previewDate = selectedDate\n ? format(selectedDate, \"MMMM d, yyyy\")\n : currentNextBillDate\n ? format(parseIsoDate(currentNextBillDate), \"MMMM d, yyyy\")\n : \"a future date\";\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"edit-bill-date-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"edit_bill_date_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"edit-bill-date-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"edit_bill_date_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"next_bill_date_label\")}\n </Label>\n {/* Render the popover into a fixed-positioned overlay nested\n inside the dialog rather than document.body. This sidesteps\n the WebKit/Safari issue where Dialog's body-level\n pointer-events: none silently blocks clicks on a body-\n portaled popover. The fixed overlay is `inset-0` +\n `pointer-events-none` so it doesn't capture stray clicks\n or affect dialog layout — only the popover content\n (which sets its own pointer-events: auto) is interactive. */}\n <PortalContainerProvider container={popoverContainer}>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover pointer-events-auto z-[9999] w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={\n selectedDate ??\n (currentNextBillDate\n ? parseIsoDate(currentNextBillDate)\n : undefined)\n }\n components={calendarComponents}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n </PortalContainerProvider>\n </div>\n <div\n ref={setPopoverContainer}\n className=\"pointer-events-none fixed inset-0 z-[9998]\"\n aria-hidden={true}\n />\n\n {selectedDate && (\n <div className=\"text-muted-foreground text-xs\">\n {t(\"bill_date_preview_prefix\")}{\" \"}\n <span className=\"font-semibold\">{previewDate}</span>\n {t(\"bill_date_preview_suffix\")}\n </div>\n )}\n\n {subscriptionsWithColor.length > 0 && (\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"your_other_subscriptions\")}\n </Label>\n <div className=\"border-border max-h-40 overflow-auto rounded-md border\">\n <table className=\"w-full table-fixed text-sm\">\n <thead className=\"bg-muted text-muted-foreground sticky top-0\">\n <tr>\n <th className=\"w-6 px-2 py-2\" aria-label=\"Color\" />\n <th className=\"px-3 py-2 text-left font-medium\">\n {t(\"other_subs_product\")}\n </th>\n <th className=\"w-28 px-3 py-2 text-left font-medium\">\n {t(\"other_subs_bill_date\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscriptionsWithColor.map((sub) => (\n <tr key={sub.token}>\n <td className=\"px-2 py-2\">\n <span\n aria-hidden\n className=\"inline-block h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: sub.color }}\n />\n </td>\n <td\n className=\"overflow-hidden px-3 py-2\"\n title={sub.productTitle}\n >\n {onNavigateToSubscription ? (\n <button\n type=\"button\"\n onClick={() => {\n onNavigateToSubscription(sub.token);\n handleDismiss(false);\n }}\n className=\"text-primary block w-full truncate text-left hover:underline\"\n >\n {sub.productTitle}\n </button>\n ) : (\n <span className=\"text-foreground block truncate\">\n {sub.productTitle}\n </span>\n )}\n </td>\n <td className=\"text-muted-foreground px-3 py-2 whitespace-nowrap\">\n {sub.nextBillDate\n ? format(\n parseIsoDate(sub.nextBillDate),\n \"MMM d, yyyy\",\n )\n : \"—\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"edit_bill_date_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"edit_bill_date_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import {\n useState,\n useEffect,\n useMemo,\n useRef,\n useCallback,\n type JSX,\n} from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport {\n useSubscription,\n useSubscriptions,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n useUpdateSubscriptionInfo,\n formatSubscriptionFrequency,\n formatDate,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n SkipForward,\n Pause,\n Play,\n XCircle,\n RotateCcw,\n CalendarDays,\n} from \"lucide-react\";\nimport { addMonths, format } from \"date-fns\";\nimport { Skeleton, Button, Input, cn } from \"@fluid-app/ui-primitives\";\nimport {\n CancelSubscriptionDialog,\n type PauseMonths,\n} from \"./cancel-subscription-dialog\";\nimport {\n PauseSubscriptionDialog,\n type PauseSubscriptionSelection,\n} from \"./pause-subscription-dialog\";\nimport { ResumeSubscriptionDialog } from \"./resume-subscription-dialog\";\nimport { EditBillDateDialog } from \"./edit-bill-date-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface PaymentMethodSlotContext {\n paymentMethod: subscriptions.SubscriptionDetailPaymentMethod;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface ShippingAddressSlotContext {\n address: subscriptions.SubscriptionDetailAddress | null;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n /**\n * Called when the Edit Bill Date dialog wants to navigate the host app to\n * another subscription's detail page (clicking a row in the calendar's\n * \"Your other subscriptions\" list).\n */\n onNavigateToSubscription?: (token: string) => void;\n /**\n * Optional render-prop for the Payment Method block. When provided, replaces\n * the read-only display so consumers can wire change/add UX. Default falls\n * back to a read-only summary.\n */\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n /**\n * Optional render-prop for the Shipping Address block. When provided,\n * replaces the read-only display so consumers can wire change/add UX.\n * Default falls back to a read-only summary.\n */\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\n/* ── Quantity input ─────────────────────────────────────────────────\n The displayed value is local string state so the user can backspace\n a single-digit quantity without React snapping it back. We only\n forward valid positive integers to onQuantityChange; on blur we\n restore the last committed quantity if the field was left empty\n or invalid.\n\n Two focus-retention quirks worth keeping in mind:\n - Toggling `disabled` blurs a focused input (especially WebKit).\n Use `readOnly` while the mutation is in flight instead so the\n user keeps their cursor as they tweak the value.\n - We skip the prop-sync useEffect while the field is focused —\n writing `inputValue` again on a server confirmation doesn't change\n anything visible, but the controlled-input value write is enough\n to drop focus on mobile Safari. The post-blur restore on line ~186\n handles the unfocused case. */\n\nfunction QuantityInput({\n inputId,\n quantity,\n isUpdatingQuantity,\n onQuantityChange,\n}: {\n inputId: string;\n quantity: number;\n isUpdatingQuantity: boolean;\n onQuantityChange: (next: number) => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [inputValue, setInputValue] = useState(String(quantity));\n // Captured the moment focus enters the field. Backspacing from \"12\"\n // through \"1\" to \"\" commits an intermediate quantity of 1 to the\n // parent, so on blur we can't trust the live `quantity` prop as the\n // restore target — use the value the user started with.\n const focusEntryQuantityRef = useRef(quantity);\n // Local debounce on commit. Without this, every keystroke fires\n // onQuantityChange, which the parent uses to update pendingQuantity\n // synchronously — so intermediate values (e.g. the \"1\" mid-way through\n // backspacing \"12\" to retype) flash in the order summary before the\n // user is done typing.\n const commitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Keep the latest onQuantityChange in a ref so the debounced timer\n // doesn't fire with a stale closure if the parent re-renders within\n // the 500ms window with a new callback identity.\n const onQuantityChangeRef = useRef(onQuantityChange);\n useEffect(() => {\n onQuantityChangeRef.current = onQuantityChange;\n }, [onQuantityChange]);\n\n useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n },\n [],\n );\n\n useEffect(() => {\n if (\n typeof document !== \"undefined\" &&\n document.activeElement === inputRef.current\n ) {\n return;\n }\n setInputValue(String(quantity));\n }, [quantity]);\n\n const scheduleCommit = (next: number) => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n commitTimerRef.current = setTimeout(() => {\n onQuantityChangeRef.current(next);\n // Move the restore baseline forward — once a value successfully\n // commits, that's what an empty-blur should fall back to, not\n // the value at focus-entry.\n focusEntryQuantityRef.current = next;\n }, 500);\n };\n\n return (\n <Input\n ref={inputRef}\n id={inputId}\n type=\"number\"\n min={1}\n step={1}\n value={inputValue}\n onFocus={() => {\n focusEntryQuantityRef.current = quantity;\n }}\n onChange={(e) => {\n const raw = e.target.value;\n setInputValue(raw);\n if (raw === \"\") {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n return;\n }\n const next = parseInt(raw, 10);\n if (Number.isFinite(next) && next > 0) {\n scheduleCommit(next);\n }\n }}\n onBlur={() => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n const parsed = parseInt(inputValue, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n if (parsed !== quantity) {\n onQuantityChange(parsed);\n }\n focusEntryQuantityRef.current = parsed;\n } else {\n const restore = focusEntryQuantityRef.current;\n setInputValue(String(restore));\n if (restore !== quantity) {\n onQuantityChange(restore);\n }\n }\n }}\n readOnly={isUpdatingQuantity}\n className={cn(\n \"border-border bg-background h-10 w-16 border text-center\",\n isUpdatingQuantity && \"opacity-60\",\n )}\n aria-label=\"Quantity\"\n />\n );\n}\n\nfunction SubscriptionItemsSection({\n subscription,\n displayQuantity,\n displayNextBillDate,\n canEditQuantity = false,\n onQuantityChange,\n isUpdatingQuantity = false,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n displayQuantity?: number;\n displayNextBillDate?: string;\n canEditQuantity?: boolean;\n onQuantityChange?: (next: number) => void;\n isUpdatingQuantity?: boolean;\n}) {\n const { t } = useSubscriptionsTranslation();\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = displayQuantity ?? subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const quantityInputId = `subscription-${subscription.subscription_token}-quantity`;\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\n\n return (\n <section className=\"bg-muted flex w-full flex-col items-center rounded-lg px-8 lg:col-span-4 lg:self-start\">\n <div className=\"flex w-full max-w-lg flex-col\">\n {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n {t(\"your_upcoming_order\")}\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"next_order_date\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {getNextBillDisplay(\n displayNextBillDate\n ? { ...subscription, next_bill_date: displayNextBillDate }\n : subscription,\n )}\n </div>\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"next_bill_amount\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n {(displayNextBillDate ?? subscription.next_bill_date) && (\n <div className=\"text-muted-foreground mt-1 text-xs\">\n {formatDate(\n displayNextBillDate ?? subscription.next_bill_date ?? \"\",\n )}\n </div>\n )}\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center space-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row space-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || t(\"product_image_alt\")}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center\">\n {t(\"no_image\")}\n </div>\n )}\n {quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n {canEditQuantity && onQuantityChange && (\n <div className=\"flex shrink-0 flex-col items-center\">\n <label\n htmlFor={quantityInputId}\n className=\"text-muted-foreground mb-1 text-xs\"\n >\n {t(\"quantity_label\")}\n </label>\n <QuantityInput\n inputId={quantityInputId}\n quantity={quantity}\n isUpdatingQuantity={isUpdatingQuantity}\n onQuantityChange={onQuantityChange}\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"subtotal\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"discount\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"total_label\")}\n </p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n {t(\"tax_shipping_note\")}\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n onEditBillDate,\n displayNextBillDate,\n renderPaymentMethod,\n renderShippingAddress,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n onEditBillDate: () => void;\n displayNextBillDate?: string;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n}) {\n const { t } = useSubscriptionsTranslation();\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"order_actions\")}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next_order\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onEditBillDate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <CalendarDays className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"edit_bill_date\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause_subscription\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled\n ? t(\"cancelled_subscription\")\n : t(\"cancel_subscription\")}\n </span>\n </Button>\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume_subscription\")}</span>\n </Button>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate_subscription\")}</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n {t(\"subscription_details\")}\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"order_frequency\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"next_payment\")}\n </div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n {(displayNextBillDate ?? subscription.next_bill_date) && (\n <div className=\"text-muted-foreground text-xs\">\n {formatDate(\n displayNextBillDate ?? subscription.next_bill_date ?? \"\",\n )}\n </div>\n )}\n </div>\n {subscription.last_bill_date && (\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"last_billed\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground mb-4 text-sm/6 font-semibold\">\n {t(\"payment_and_shipping\")}\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {renderShippingAddress\n ? renderShippingAddress({\n address: subscription.address ?? null,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })\n : subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n {t(\"shipping_address\")}\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod &&\n (renderPaymentMethod ? (\n renderPaymentMethod({\n paymentMethod,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })\n ) : (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"payment_method\")}\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? t(\"card_fallback\")}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ${t(\"ending_in\", { last4: paymentDetails.last4 })}`\n : \"\"}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Order history (own section, full-width below the grid) ────────── */\n\nfunction OrderHistorySection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const { t } = useSubscriptionsTranslation();\n if (subscription.orders.length === 0) return null;\n return (\n <section className=\"mt-6 px-8 pt-6 pb-8\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"subscription_order_history\")}\n </h3>\n <div className=\"border-border overflow-x-auto rounded-md border\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead className=\"bg-muted\">\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-left font-medium\">\n {t(\"order\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"date\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"status\")}\n </th>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-right font-medium\">\n {t(\"amount\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 pl-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pr-3 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : t(\"not_available\")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </section>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n onNavigateToSubscription,\n renderPaymentMethod,\n renderShippingAddress,\n}: SubscriptionDetailProps): JSX.Element | null {\n const { t } = useSubscriptionsTranslation();\n const [showCancelModal, setShowCancelModal] = useState(false);\n const [showPauseModal, setShowPauseModal] = useState(false);\n const [showResumeModal, setShowResumeModal] = useState(false);\n const [showEditBillDateModal, setShowEditBillDateModal] = useState(false);\n const [pendingNextBillDate, setPendingNextBillDate] = useState<string | null>(\n null,\n );\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n // Customer's other active subscriptions, only loaded once the bill-date\n // dialog opens — feeds the calendar's color-coded dots. The portal-tenant\n // BFF list endpoint scopes server-side to the member's own customer\n // record (PortalTenant::SubscriptionBrowser), so we don't pass customerId\n // — and we don't gate on it either, since the detail mapper hardcodes\n // customer.id to 0 today.\n //\n // Capped at 100 — a customer with more than 100 subscriptions will be\n // missing some dots from the calendar. Matches the practical ceiling of\n // every other \"list customer's subscriptions\" surface; if/when we have a\n // real-world customer past that, swap to cursor pagination here.\n const customerSubscriptionsQuery = useSubscriptions(\n { perPage: 100 },\n { enabled: showEditBillDateModal },\n );\n const otherSubscriptionsForBillDate = useMemo(\n () =>\n (customerSubscriptionsQuery.data?.subscriptions ?? [])\n .filter((s) => s.subscription_token !== token)\n .map((s) => ({\n token: s.subscription_token,\n productTitle: s.variant?.product?.title ?? t(\"breadcrumb\"),\n nextBillDate: s.next_bill_date,\n billingInterval: s.subscription_plan?.billing_interval ?? 1,\n billingIntervalUnit:\n s.subscription_plan?.billing_interval_unit ?? \"month\",\n })),\n [customerSubscriptionsQuery.data, token, t],\n );\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_paused\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_pause\"), err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_resumed\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_resume\"), err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(t(\"next_billing_skipped\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_skip\"), err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(t(\"subscription_cancelled\"));\n setShowCancelModal(false);\n },\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_cancel\"), err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_reactivated\")),\n onError: (err: unknown) =>\n onMutationError?.(t(\"failed_to_reactivate\"), err),\n });\n\n const [pendingQuantity, setPendingQuantity] = useState<number | null>(null);\n const quantityDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const quantityMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n // Keep pendingQuantity set so the displayed amounts stay on the\n // new value while the invalidated query refetches. The effect\n // below clears it once the refetched subscription carries the\n // same quantity — avoids a flicker back to the old amounts.\n onSuccess?.(t(\"quantity_updated\"));\n },\n onError: (err: unknown) => {\n setPendingQuantity(null);\n onMutationError?.(t(\"failed_to_update_quantity\"), err);\n },\n });\n\n const editBillDateMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(t(\"bill_date_updated\"));\n setShowEditBillDateModal(false);\n },\n onError: (err: unknown) => {\n setPendingNextBillDate(null);\n onMutationError?.(t(\"failed_to_update_bill_date\"), err);\n },\n });\n\n const serverNextBillDate = data?.subscription.next_bill_date ?? null;\n useEffect(() => {\n if (\n pendingNextBillDate != null &&\n serverNextBillDate != null &&\n serverNextBillDate.startsWith(pendingNextBillDate)\n ) {\n setPendingNextBillDate(null);\n }\n }, [pendingNextBillDate, serverNextBillDate]);\n\n const serverQuantity = data?.subscription.quantity;\n useEffect(() => {\n if (pendingQuantity != null && serverQuantity === pendingQuantity) {\n setPendingQuantity(null);\n }\n }, [pendingQuantity, serverQuantity]);\n\n useEffect(\n () => () => {\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n },\n [],\n );\n\n const quantityMutate = quantityMutation.mutate;\n const handleQuantityChange = useCallback(\n (next: number) => {\n const clamped = Math.max(1, next);\n setPendingQuantity(clamped);\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n quantityDebounceRef.current = setTimeout(() => {\n const current = data?.subscription.quantity;\n if (clamped === current) {\n setPendingQuantity(null);\n return;\n }\n quantityMutate({\n subscriptionToken: token,\n body: { quantity: clamped },\n });\n }, 500);\n },\n [data?.subscription.quantity, quantityMutate, token],\n );\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onNotFoundRef = useRef(onNotFound);\n onNotFoundRef.current = onNotFound;\n\n useEffect(() => {\n if (!isLoading && error) {\n onErrorRef.current?.(error as Error);\n }\n }, [isLoading, error]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFoundRef.current?.();\n }\n }, [isLoading, error, subscription]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending ||\n editBillDateMutation.isPending;\n\n const handlePauseConfirm = (selection: PauseSubscriptionSelection) => {\n const pauseParams: subscriptions.PauseSubscriptionParams = { customerId };\n if (selection.type === \"order_count\") {\n pauseParams.numberOfOrders = selection.numberOfOrders;\n }\n pauseMutation.mutate(\n { subscriptionToken: token, pauseParams },\n { onSuccess: () => setShowPauseModal(false) },\n );\n };\n\n const handleResumeConfirm = (nextBillDate: string) => {\n resumeMutation.mutate(\n {\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n },\n { onSuccess: () => setShowResumeModal(false) },\n );\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n return (\n <>\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection\n subscription={subscription}\n displayQuantity={pendingQuantity ?? undefined}\n displayNextBillDate={pendingNextBillDate ?? undefined}\n canEditQuantity={isActive}\n onQuantityChange={handleQuantityChange}\n isUpdatingQuantity={quantityMutation.isPending}\n />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={() => setShowPauseModal(true)}\n onResume={() => setShowResumeModal(true)}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n onEditBillDate={() => setShowEditBillDateModal(true)}\n displayNextBillDate={pendingNextBillDate ?? undefined}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n />\n </div>\n <OrderHistorySection subscription={subscription} />\n <CancelSubscriptionDialog\n open={showCancelModal}\n onOpenChange={setShowCancelModal}\n onConfirm={handleCancel}\n onPauseInstead={(months: PauseMonths) => {\n setShowCancelModal(false);\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: {\n customerId,\n nextBillDate: format(addMonths(new Date(), months), \"yyyy-MM-dd\"),\n },\n });\n }}\n />\n <EditBillDateDialog\n open={showEditBillDateModal}\n onOpenChange={(next) => {\n if (!next) editBillDateMutation.reset();\n setShowEditBillDateModal(next);\n }}\n onConfirm={(nextBillDate) => {\n setPendingNextBillDate(nextBillDate);\n editBillDateMutation.mutate({\n subscriptionToken: token,\n body: { next_bill_date: nextBillDate },\n });\n }}\n isLoading={editBillDateMutation.isPending}\n errorMessage={\n editBillDateMutation.isError ? t(\"bill_date_error\") : undefined\n }\n currentNextBillDate={subscription.next_bill_date}\n otherSubscriptions={otherSubscriptionsForBillDate}\n onNavigateToSubscription={onNavigateToSubscription}\n />\n <PauseSubscriptionDialog\n open={showPauseModal}\n onOpenChange={(next) => {\n if (!next) pauseMutation.reset();\n setShowPauseModal(next);\n }}\n onConfirm={handlePauseConfirm}\n isLoading={pauseMutation.isPending}\n errorMessage={pauseMutation.isError ? t(\"generic_error\") : undefined}\n currentNextBillDate={subscription.next_bill_date}\n billingInterval={plan.billing_interval}\n billingIntervalUnit={plan.billing_interval_unit}\n />\n <ResumeSubscriptionDialog\n open={showResumeModal}\n onOpenChange={(next) => {\n if (!next) resumeMutation.reset();\n setShowResumeModal(next);\n }}\n onConfirm={handleResumeConfirm}\n isLoading={resumeMutation.isPending}\n errorMessage={resumeMutation.isError ? t(\"generic_error\") : undefined}\n defaultNextBillDate={calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n )}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const { t } = useSubscriptionsTranslation();\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate\")}</span>\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n SubscriptionDetail,\n type PaymentMethodSlotContext,\n type ShippingAddressSlotContext,\n} from \"../components/subscription-detail\";\n\nexport interface SubscriptionDetailScreenProps {\n token: string;\n onNavigateToList: () => void;\n onNavigateToSubscription?: (token: string) => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onNavigateToList,\n onNavigateToSubscription,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n renderPaymentMethod,\n renderShippingAddress,\n}: SubscriptionDetailScreenProps) {\n const { t } = useSubscriptionsTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n {t(\"breadcrumb\")}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb_detail\", { token })}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <SubscriptionDetail\n token={token}\n onNotFound={onNotFound}\n onError={onError}\n onSuccess={onSuccess}\n onMutationError={onMutationError}\n onNavigateToSubscription={onNavigateToSubscription}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n />\n </div>\n </>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"@fluid-app/profile-ui/components/payment-method-card-internals\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\n\ninterface SelectablePaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n selectedPaymentMethodId: number;\n onSelectPaymentMethod: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onMakeDefaultPaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\n/**\n * Selectable variant of profile-ui's PaymentMethodDropdown — same chrome\n * (accordion, collapsed summary, list, add button), with rows that\n * commit a selection through onSelectPaymentMethod when clicked.\n */\nexport function SelectablePaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n selectedPaymentMethodId,\n onSelectPaymentMethod,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n onMakeDefaultPaymentMethod,\n addPaymentMethodLabel = \"+ Add a payment method\",\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectablePaymentMethodDropdownProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n const collapsedExpiry = displayPaymentMethod\n ? getCardExpiry(displayPaymentMethod)\n : null;\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current payment method\n inline. Clicking expands. Mirrors checkout's payment-method-dropdown\n collapse behavior. */}\n {!isOpen && displayPaymentMethod && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-row items-center gap-3 text-left\"\n >\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={displayPaymentMethod.details.logo_url}\n brand={displayPaymentMethod.details.card_type}\n alt={displayPaymentMethod.details.card_type ?? \"Payment Method\"}\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(displayPaymentMethod)}\n </span>\n {collapsedExpiry && (\n <span className=\"text-muted-foreground text-sm\">\n {collapsedExpiry}\n </span>\n )}\n </div>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col space-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"bg-muted flex flex-row items-center space-x-2 rounded-sm p-3\"\n >\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod) => {\n const isSelected = selectedPaymentMethodId === paymentMethod.id;\n const expiry = getCardExpiry(paymentMethod);\n const handleSelect = () => {\n if (isPending) return;\n onSelectPaymentMethod(paymentMethod);\n };\n return (\n <div\n key={paymentMethod.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-row items-center gap-3\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ?? \"Payment Method\"\n }\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </span>\n {expiry && (\n <span className=\"text-muted-foreground text-sm\">\n {expiry}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {paymentMethod.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n Default\n </span>\n )}\n {(onEditPaymentMethod ||\n onDeletePaymentMethod ||\n onMakeDefaultPaymentMethod) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditPaymentMethod\n ? () => onEditPaymentMethod(paymentMethod)\n : undefined\n }\n onDelete={\n onDeletePaymentMethod\n ? () => onDeletePaymentMethod(paymentMethod)\n : undefined\n }\n onMakeDefault={\n !paymentMethod.default && onMakeDefaultPaymentMethod\n ? () => onMakeDefaultPaymentMethod(paymentMethod)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { FluidPayCoreProvider, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport {\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n type EditPaymentMethodFormData,\n type BillingAddressAutocompleteRenderProps,\n} from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { SelectablePaymentMethodDropdown } from \"./SelectablePaymentMethodDropdown\";\nimport {\n subscriptionsKeys,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { PaymentMethodSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport type { UpdatePaymentMethodBody } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\n\nconst t = (key: string): string =>\n ({\n add_credit_card: \"Add Credit Card\",\n edit_card: \"Card Details\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n delete: \"Delete\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n cancel: \"Cancel\",\n close: \"Close\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n select_an_option: \"Select an option\",\n set_as_default_payment_method: \"Set as default payment method\",\n })[key] ??\n key\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n\n// Map the subscription's payment_method shape (which lives on\n// SubscriptionDetail and uses different field names than PayApi) to the\n// fluidPay shape PaymentMethodDropdown consumes.\nfunction subscriptionPaymentMethodToFluidPay(\n raw: subscriptions.SubscriptionDetailPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n const details = raw.details as {\n last4?: string;\n card_type?: string;\n card_brand?: string;\n logo_url?: string;\n exp_month?: number | string;\n exp_year?: number | string;\n } | null;\n return {\n id: raw.id,\n created_at: raw.created_at,\n default: raw.default,\n details: {\n card_type: details?.card_type ?? null,\n card_brand: details?.card_brand ?? details?.card_type ?? null,\n last_four: details?.last4 ?? \"\",\n exp_month:\n details?.exp_month != null ? Number(details.exp_month) : undefined,\n exp_year:\n details?.exp_year != null ? Number(details.exp_year) : undefined,\n logo_url: details?.logo_url,\n },\n billing_address: null,\n payment_type: raw.payment_type,\n source: raw.source,\n updated_at: raw.updated_at,\n };\n}\n\nexport function PortalSubscriptionPaymentMethodSection({\n paymentMethod: currentPaymentMethod,\n subscriptionToken,\n onSuccess,\n onError,\n}: PaymentMethodSlotContext & {\n onSuccess?: (message: string) => void;\n onError?: (message: string, error: unknown) => void;\n}): JSX.Element {\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [isAddDialogOpen, setIsAddDialogOpen] = useState(false);\n const [editingPaymentMethod, setEditingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deletingPaymentMethod, setDeletingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: paymentMethods = [], isLoading: isLoadingMethods } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isAddDialogOpen || editingPaymentMethod !== null,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n const updateSubscription = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(\"Payment method updated\");\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n },\n onError: (err) => onError?.(\"Failed to update payment method\", err),\n });\n\n const addCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(\"Payment method added\");\n },\n onError: (err) => onError?.(\"Failed to add payment method\", err),\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(\"Payment method updated\");\n },\n onError: (err) => onError?.(\"Failed to update payment method\", err),\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(\"Payment method deleted\");\n },\n });\n\n const makeDefaultPaymentMethodMutation = useMutation({\n mutationFn: (pm: fluidPay.CustomerPaymentMethod) => {\n const body: UpdatePaymentMethodBody = {\n payment_method: { default: true },\n };\n if (pm.billing_address) {\n body.payment_method.billing_address = {\n name: pm.billing_address.name,\n street1: pm.billing_address.address1 ?? \"\",\n street2: pm.billing_address.address2 ?? null,\n city: pm.billing_address.city ?? \"\",\n state: pm.billing_address.state ?? \"\",\n zip: pm.billing_address.zip ?? \"\",\n country: pm.billing_address.country_code ?? \"\",\n };\n }\n return payApi.updatePaymentMethod(pm.id, body);\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(\"Default payment method updated\");\n },\n onError: (err) => onError?.(\"Failed to update default payment method\", err),\n });\n\n // Fall back to the subscription's own payment method when the customer's\n // list doesn't contain it yet (initial load) or no longer contains it (card\n // was removed in another session). Without the fallback the collapsed\n // accordion header would render blank.\n const displayed =\n paymentMethods.find((pm) => pm.id === currentPaymentMethod.id) ??\n subscriptionPaymentMethodToFluidPay(currentPaymentMethod);\n\n const handleConfirmDelete = async () => {\n if (!deletingPaymentMethod) return;\n setDeleteError(undefined);\n try {\n await deletePaymentMethodMutation.mutateAsync(deletingPaymentMethod.id);\n setDeletingPaymentMethod(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : \"We were unable to delete this payment method. Please try again.\",\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileTranslationBridge>\n <ProfileUIProvider t={t}>\n <SelectablePaymentMethodDropdown\n title=\"Payment Method\"\n displayPaymentMethod={displayed}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={() => setIsAddDialogOpen(true)}\n addPaymentMethodLabel=\"+ Add Payment Method\"\n showAddButton\n isLoading={isLoadingMethods}\n isPending={\n updateSubscription.isPending ||\n addCardMutation.isPending ||\n updatePaymentMethodMutation.isPending ||\n makeDefaultPaymentMethodMutation.isPending\n }\n selectedPaymentMethodId={currentPaymentMethod.id}\n onSelectPaymentMethod={(pm) => {\n if (pm.id === currentPaymentMethod.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { payment_method_id: pm.id },\n });\n }}\n onEditPaymentMethod={(pm) => setEditingPaymentMethod(pm)}\n onDeletePaymentMethod={(pm) => {\n setDeleteError(undefined);\n setDeletingPaymentMethod(pm);\n }}\n onMakeDefaultPaymentMethod={(pm) =>\n makeDefaultPaymentMethodMutation.mutate(pm)\n }\n />\n\n <CreditCardFormDialog\n isOpen={isAddDialogOpen}\n onClose={() => setIsAddDialogOpen(false)}\n t={t}\n onSubmit={async (data) => {\n try {\n await addCardMutation.mutateAsync(data);\n setIsAddDialogOpen(false);\n } catch {\n // onError surfaces the toast; swallow here so CreditCardFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\n }}\n isSubmitting={addCardMutation.isPending}\n countries={countryOptions}\n jwt=\"\"\n renderAddressAutocomplete={({\n control,\n setValue,\n countryCode,\n }: BillingAddressAutocompleteRenderProps) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"zip\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <EditPaymentMethodDialog\n isOpen={editingPaymentMethod !== null}\n paymentMethod={editingPaymentMethod}\n billingAddress={editingPaymentMethod?.billing_address ?? null}\n onClose={() => setEditingPaymentMethod(null)}\n onSubmit={async (data) => {\n if (!editingPaymentMethod) return;\n try {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId: editingPaymentMethod.id,\n data,\n });\n setEditingPaymentMethod(null);\n } catch {\n // onError surfaces the toast.\n }\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n countries={countryOptions}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n openDialog={deletingPaymentMethod !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingPaymentMethod(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deletePaymentMethodMutation.isPending}\n />\n </ProfileUIProvider>\n </ProfileTranslationBridge>\n </FluidPayCoreProvider>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\n\ninterface SelectableAddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n selectedAddressId: number;\n onSelectAddress: (address: fluidPay.CustomerAddress) => void;\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n onMakeDefaultAddress?: (address: fluidPay.CustomerAddress) => void;\n addAddressLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\nfunction formatLine1(address: fluidPay.CustomerAddress): string {\n return [address.address1, address.address2].filter(Boolean).join(\", \");\n}\n\nfunction formatCityStateZip(address: fluidPay.CustomerAddress): string {\n const cityState = [address.city, address.state].filter(Boolean).join(\", \");\n return [cityState, address.postal_code].filter(Boolean).join(\" \");\n}\n\n/**\n * Selectable variant of profile-ui's AddressDropdown, mirroring\n * SelectablePaymentMethodDropdown. Flat layout (no Card wrapper) so it\n * sits inline next to the payment method dropdown in the subscription\n * detail's Payment & Shipping section.\n */\nexport function SelectableAddressDropdown({\n title,\n displayAddress,\n addressList,\n selectedAddressId,\n onSelectAddress,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n onMakeDefaultAddress,\n addAddressLabel = \"+ Add an Address\",\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectableAddressDropdownProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current address inline.\n Clicking expands. Mirrors checkout's address-dropdown collapse\n behavior. */}\n {!isOpen && displayAddress && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-col text-left\"\n >\n <span className=\"text-foreground text-sm font-medium\">\n {displayAddress.name}\n {displayAddress.name && displayAddress.address1 ? \", \" : \"\"}\n {displayAddress.address1}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(displayAddress)}\n </span>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col space-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div key={`skeleton-${i}`} className=\"bg-muted rounded-sm p-3\">\n <Skeleton className=\"mb-1 h-4 w-32\" />\n <Skeleton className=\"mb-1 h-4 w-48\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n ))}\n </>\n ) : (\n addressList.map((address) => {\n const isSelected = selectedAddressId === address.id;\n const handleSelect = () => {\n if (isPending) return;\n onSelectAddress(address);\n };\n return (\n <div\n key={address.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium\">\n {address.name}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatLine1(address)}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(address)}\n </span>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n Default\n </span>\n )}\n {(onEditAddress ||\n onDeleteAddress ||\n onMakeDefaultAddress) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditAddress\n ? () => onEditAddress(address)\n : undefined\n }\n onDelete={\n onDeleteAddress\n ? () => onDeleteAddress(address)\n : undefined\n }\n onMakeDefault={\n !address.default && onMakeDefaultAddress\n ? () => onMakeDefaultAddress(address)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport { AddressFormDialog, ConfirmActionDialog } from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport {\n subscriptionsKeys,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { ShippingAddressSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport { createFluidPayApiAdapter } from \"../adapters/fluid-pay-api-adapter\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { SelectableAddressDropdown } from \"./SelectableAddressDropdown\";\n\nconst t = (key: string): string =>\n ({\n add_an_address: \"Add an Address\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n select_an_option: \"Select an option\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n })[key] ??\n key\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\n// Fall back when the customer's saved-address list doesn't contain the\n// subscription's current address (initial load before fetch, or address\n// removed in another session). Without this the collapsed accordion\n// header would render blank.\nfunction subscriptionAddressToFluidPay(\n raw: ShippingAddressSlotContext[\"address\"],\n): fluidPay.CustomerAddress | null {\n if (!raw) return null;\n return {\n id: raw.id,\n address1: raw.address1,\n address2: raw.address2,\n city: raw.city,\n country_code: raw.country_code,\n default: raw.default,\n name: raw.name,\n postal_code: raw.postal_code,\n state: raw.state,\n subdivision_code: raw.subdivision_code,\n };\n}\n\nexport function PortalSubscriptionShippingAddressSection({\n address: currentAddress,\n subscriptionToken,\n onSuccess,\n onError,\n}: ShippingAddressSlotContext & {\n onSuccess?: (message: string) => void;\n onError?: (message: string, error: unknown) => void;\n}): JSX.Element {\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [isFormDialogOpen, setIsFormDialogOpen] = useState(false);\n const [editingAddress, setEditingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: addresses = [], isLoading } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isFormDialogOpen,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countriesData?.countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countriesData]);\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n const updateSubscription = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(\"Shipping address updated\");\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n },\n onError: (err) => onError?.(\"Failed to update shipping address\", err),\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(\"Address added\");\n },\n onError: (err) => onError?.(\"Failed to add address\", err),\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(\"Address updated\");\n },\n onError: (err) => onError?.(\"Failed to update address\", err),\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(\"Address deleted\");\n },\n });\n\n const makeDefaultAddressMutation = useMutation({\n mutationFn: (address: fluidPay.CustomerAddress) =>\n payApi.updateAddress(address.id, {\n address: {\n name: address.name ?? null,\n street1: address.address1 ?? \"\",\n street2: address.address2,\n city: address.city ?? \"\",\n state: address.state ?? \"\",\n zip: address.postal_code ?? \"\",\n country: address.country_code ?? \"\",\n default: true,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(\"Default address updated\");\n },\n onError: (err) => onError?.(\"Failed to update default address\", err),\n });\n\n const displayed =\n addresses.find((a) => a.id === currentAddress?.id) ??\n subscriptionAddressToFluidPay(currentAddress);\n\n const handleCloseFormDialog = () => {\n setIsFormDialogOpen(false);\n setEditingAddress(null);\n };\n\n const handleConfirmDelete = async () => {\n if (!deletingAddress) return;\n setDeleteError(undefined);\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileTranslationBridge>\n <ProfileUIProvider t={t}>\n <SelectableAddressDropdown\n title=\"Shipping Address\"\n displayAddress={displayed}\n addressList={addresses}\n selectedAddressId={currentAddress?.id ?? 0}\n onSelectAddress={(addr) => {\n if (addr.id === currentAddress?.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { address_id: addr.id },\n });\n }}\n onAddAddressClick={() => {\n setEditingAddress(null);\n setIsFormDialogOpen(true);\n }}\n onEditAddress={(addr) => {\n setEditingAddress(addr);\n setIsFormDialogOpen(true);\n }}\n onDeleteAddress={(addr) => {\n setDeleteError(undefined);\n setDeletingAddress(addr);\n }}\n onMakeDefaultAddress={(addr) =>\n makeDefaultAddressMutation.mutate(addr)\n }\n addAddressLabel=\"+ Add an address\"\n showAddButton\n isLoading={isLoading}\n isPending={\n updateSubscription.isPending ||\n createAddressMutation.isPending ||\n updateAddressMutation.isPending ||\n makeDefaultAddressMutation.isPending\n }\n />\n\n <AddressFormDialog\n isOpen={isFormDialogOpen}\n onClose={handleCloseFormDialog}\n selectedAddress={editingAddress}\n t={t}\n onSubmit={async (data: fluidPay.CreateAddressBody) => {\n try {\n if (editingAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: editingAddress.id,\n body: data,\n });\n } else {\n await createAddressMutation.mutateAsync(data);\n }\n handleCloseFormDialog();\n } catch {\n // onError surfaces the toast; swallow here so AddressFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n actionText={t(\"delete\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingAddress(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deleteAddressMutation.isPending}\n />\n </ProfileUIProvider>\n </ProfileTranslationBridge>\n </FluidPayCoreProvider>\n );\n}\n","import { useCallback } from \"react\";\nimport { SubscriptionDetailScreen as SubscriptionDetailScreenContent } from \"@fluid-app/subscriptions-ui/screens/SubscriptionDetailScreen\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalSubscriptionPaymentMethodSection } from \"../subscriptions/PortalSubscriptionPaymentMethodSection\";\nimport { PortalSubscriptionShippingAddressSection } from \"../subscriptions/PortalSubscriptionShippingAddressSection\";\n\ninterface SubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onToast,\n}: SubscriptionDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { t } = useSubscriptionsTranslation();\n\n const handleNavigateToList = useCallback(\n () => navigate(\"subscriptions\"),\n [navigate],\n );\n\n const handleNavigateToSubscription = useCallback(\n (nextToken: string) => navigate(`subscriptions/${nextToken}`),\n [navigate],\n );\n\n const handleNotFound = useCallback(() => {\n onToast(t(\"subscription_not_found\"), \"warning\");\n navigate(\"subscriptions\");\n }, [onToast, navigate, t]);\n\n const handleError = useCallback(\n (err: unknown) => {\n const message = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(t(\"failed_to_load_subscription\", { message }), \"error\");\n },\n [onToast, t],\n );\n\n const handleSuccess = useCallback(\n (message: string) => {\n onToast(message, \"success\");\n },\n [onToast],\n );\n\n const handleMutationError = useCallback(\n (message: string, err: unknown) => {\n const detail = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${message}: ${detail}`, \"error\");\n },\n [onToast, t],\n );\n\n return (\n <SubscriptionDetailScreenContent\n token={token}\n onNavigateToList={handleNavigateToList}\n onNavigateToSubscription={handleNavigateToSubscription}\n onNotFound={handleNotFound}\n onError={handleError}\n onSuccess={handleSuccess}\n onMutationError={handleMutationError}\n renderPaymentMethod={(ctx) => (\n <PortalSubscriptionPaymentMethodSection\n {...ctx}\n onSuccess={(msg) => onToast(msg, \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n />\n )}\n renderShippingAddress={(ctx) => (\n <PortalSubscriptionShippingAddressSection\n {...ctx}\n onSuccess={(msg) => onToast(msg, \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n />\n )}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { PortalSubscriptionsApiProvider } from \"../subscriptions/PortalSubscriptionsApiProvider\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { SubscriptionsTranslationBridge } from \"../providers/SubscriptionsTranslationBridge\";\nimport { SubscriptionsListScreen } from \"./SubscriptionsListScreen\";\nimport { SubscriptionDetailScreen } from \"./SubscriptionDetailScreen\";\n\nfunction AccountErrorFallback(): React.JSX.Element {\n const { t } = useSubscriptionsTranslation();\n return (\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n {t(\"account_load_error\")}\n </div>\n );\n}\n\ntype SubscriptionsScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function SubscriptionsScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: SubscriptionsScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"subscriptions\" → list, \"subscriptions/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n const { data: account } = useAccount();\n const customerId = account?.id;\n const isLoadingCustomer = account === undefined;\n const isCustomerError = false;\n\n return (\n <div {...divProps}>\n <SubscriptionsTranslationBridge>\n {isDetailView ? (\n <PortalSubscriptionsApiProvider>\n <SubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n </PortalSubscriptionsApiProvider>\n ) : isCustomerError && !isLoadingCustomer ? (\n <AccountErrorFallback />\n ) : (\n <PortalSubscriptionsApiProvider>\n <SubscriptionsListScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n </PortalSubscriptionsApiProvider>\n )}\n </SubscriptionsTranslationBridge>\n </div>\n );\n}\n\nexport const subscriptionsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"SubscriptionsScreen\",\n displayName: \"Subscriptions Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"mappings":"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"}