@anker-in/campaign-ui 0.4.8 → 0.5.0-beta.10

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 (233) hide show
  1. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  2. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  3. package/dist/cjs/components/credits/context/hooks/useCountries.js +1 -1
  4. package/dist/cjs/components/credits/context/hooks/useCountries.js.map +3 -3
  5. package/dist/cjs/components/index.d.ts +1 -0
  6. package/dist/cjs/components/index.js +1 -1
  7. package/dist/cjs/components/index.js.map +2 -2
  8. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +9 -0
  9. package/dist/cjs/components/memberPopup/MemberPopup.js +2 -0
  10. package/dist/cjs/components/memberPopup/MemberPopup.js.map +7 -0
  11. package/dist/cjs/components/memberPopup/context/provider.d.ts +11 -0
  12. package/dist/cjs/components/memberPopup/context/provider.js +2 -0
  13. package/dist/cjs/components/memberPopup/context/provider.js.map +7 -0
  14. package/dist/cjs/components/memberPopup/context/viewStack.d.ts +12 -0
  15. package/dist/cjs/components/memberPopup/context/viewStack.js +2 -0
  16. package/dist/cjs/components/memberPopup/context/viewStack.js.map +7 -0
  17. package/dist/cjs/components/memberPopup/icons.d.ts +27 -0
  18. package/dist/cjs/components/memberPopup/icons.js +2 -0
  19. package/dist/cjs/components/memberPopup/icons.js.map +7 -0
  20. package/dist/cjs/components/memberPopup/index.d.ts +4 -0
  21. package/dist/cjs/components/memberPopup/index.js +2 -0
  22. package/dist/cjs/components/memberPopup/index.js.map +7 -0
  23. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +10 -0
  24. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
  25. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
  26. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +10 -0
  27. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +2 -0
  28. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +7 -0
  29. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +7 -0
  30. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +2 -0
  31. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +7 -0
  32. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +7 -0
  33. package/dist/cjs/components/memberPopup/panels/Activity/index.js +2 -0
  34. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +7 -0
  35. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +19 -0
  36. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +2 -0
  37. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +7 -0
  38. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +21 -0
  39. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +2 -0
  40. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +7 -0
  41. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +12 -0
  42. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +2 -0
  43. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +7 -0
  44. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +17 -0
  45. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +2 -0
  46. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +7 -0
  47. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +8 -0
  48. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +2 -0
  49. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +7 -0
  50. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +7 -0
  51. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +2 -0
  52. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +7 -0
  53. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +8 -0
  54. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +2 -0
  55. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +7 -0
  56. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +11 -0
  57. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +2 -0
  58. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +7 -0
  59. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +10 -0
  60. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +2 -0
  61. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +7 -0
  62. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +9 -0
  63. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +2 -0
  64. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +7 -0
  65. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +9 -0
  66. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +2 -0
  67. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +7 -0
  68. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +10 -0
  69. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +2 -0
  70. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +7 -0
  71. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +9 -0
  72. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +2 -0
  73. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +7 -0
  74. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +18 -0
  75. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +2 -0
  76. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +7 -0
  77. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +9 -0
  78. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +2 -0
  79. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +7 -0
  80. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +17 -0
  81. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +2 -0
  82. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +7 -0
  83. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +13 -0
  84. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +2 -0
  85. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +7 -0
  86. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +13 -0
  87. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +2 -0
  88. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +7 -0
  89. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +12 -0
  90. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +2 -0
  91. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +7 -0
  92. package/dist/cjs/components/memberPopup/panels/Referral/index.d.ts +7 -0
  93. package/dist/cjs/components/memberPopup/panels/Referral/index.js +2 -0
  94. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +7 -0
  95. package/dist/cjs/components/memberPopup/type.d.ts +231 -0
  96. package/dist/cjs/components/memberPopup/type.js +2 -0
  97. package/dist/cjs/components/memberPopup/type.js.map +7 -0
  98. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  99. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  100. package/dist/esm/components/credits/context/hooks/useCountries.js +1 -1
  101. package/dist/esm/components/credits/context/hooks/useCountries.js.map +3 -3
  102. package/dist/esm/components/index.d.ts +1 -0
  103. package/dist/esm/components/index.js +1 -1
  104. package/dist/esm/components/index.js.map +2 -2
  105. package/dist/esm/components/memberPopup/MemberPopup.d.ts +9 -0
  106. package/dist/esm/components/memberPopup/MemberPopup.js +2 -0
  107. package/dist/esm/components/memberPopup/MemberPopup.js.map +7 -0
  108. package/dist/esm/components/memberPopup/context/provider.d.ts +11 -0
  109. package/dist/esm/components/memberPopup/context/provider.js +2 -0
  110. package/dist/esm/components/memberPopup/context/provider.js.map +7 -0
  111. package/dist/esm/components/memberPopup/context/viewStack.d.ts +12 -0
  112. package/dist/esm/components/memberPopup/context/viewStack.js +2 -0
  113. package/dist/esm/components/memberPopup/context/viewStack.js.map +7 -0
  114. package/dist/esm/components/memberPopup/icons.d.ts +27 -0
  115. package/dist/esm/components/memberPopup/icons.js +2 -0
  116. package/dist/esm/components/memberPopup/icons.js.map +7 -0
  117. package/dist/esm/components/memberPopup/index.d.ts +4 -0
  118. package/dist/esm/components/memberPopup/index.js +2 -0
  119. package/dist/esm/components/memberPopup/index.js.map +7 -0
  120. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +10 -0
  121. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
  122. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
  123. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +10 -0
  124. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +2 -0
  125. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +7 -0
  126. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +7 -0
  127. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +2 -0
  128. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +7 -0
  129. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +7 -0
  130. package/dist/esm/components/memberPopup/panels/Activity/index.js +2 -0
  131. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +7 -0
  132. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +19 -0
  133. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +2 -0
  134. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +7 -0
  135. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +21 -0
  136. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +2 -0
  137. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +7 -0
  138. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +12 -0
  139. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +2 -0
  140. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +7 -0
  141. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +17 -0
  142. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +2 -0
  143. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +7 -0
  144. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +8 -0
  145. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +2 -0
  146. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +7 -0
  147. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +7 -0
  148. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +2 -0
  149. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +7 -0
  150. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +8 -0
  151. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +2 -0
  152. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +7 -0
  153. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +11 -0
  154. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +2 -0
  155. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +7 -0
  156. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +10 -0
  157. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +2 -0
  158. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +7 -0
  159. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +9 -0
  160. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +2 -0
  161. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +7 -0
  162. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +9 -0
  163. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +2 -0
  164. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +7 -0
  165. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +10 -0
  166. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +2 -0
  167. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +7 -0
  168. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +9 -0
  169. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +2 -0
  170. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +7 -0
  171. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +18 -0
  172. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +2 -0
  173. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +7 -0
  174. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +9 -0
  175. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +2 -0
  176. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +7 -0
  177. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +17 -0
  178. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +2 -0
  179. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +7 -0
  180. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +13 -0
  181. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +2 -0
  182. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +7 -0
  183. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +13 -0
  184. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +2 -0
  185. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +7 -0
  186. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +12 -0
  187. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +2 -0
  188. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +7 -0
  189. package/dist/esm/components/memberPopup/panels/Referral/index.d.ts +7 -0
  190. package/dist/esm/components/memberPopup/panels/Referral/index.js +2 -0
  191. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +7 -0
  192. package/dist/esm/components/memberPopup/type.d.ts +231 -0
  193. package/dist/esm/components/memberPopup/type.js +2 -0
  194. package/dist/esm/components/memberPopup/type.js.map +7 -0
  195. package/dist/index.d.mts +1775 -0
  196. package/dist/index.d.ts +1775 -0
  197. package/dist/index.js +18542 -0
  198. package/dist/index.js.map +1 -0
  199. package/dist/index.mjs +18514 -0
  200. package/dist/index.mjs.map +1 -0
  201. package/package.json +1 -1
  202. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +5 -7
  203. package/src/components/credits/context/hooks/useCountries.ts +4 -15
  204. package/src/components/index.ts +2 -0
  205. package/src/components/memberPopup/MemberPopup.tsx +330 -0
  206. package/src/components/memberPopup/context/provider.tsx +52 -0
  207. package/src/components/memberPopup/context/viewStack.tsx +23 -0
  208. package/src/components/memberPopup/icons.tsx +147 -0
  209. package/src/components/memberPopup/index.ts +24 -0
  210. package/src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx +194 -0
  211. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +175 -0
  212. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.ts +33 -0
  213. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.ts +38 -0
  214. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.ts +55 -0
  215. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +291 -0
  216. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +323 -0
  217. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +191 -0
  218. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +184 -0
  219. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +130 -0
  220. package/src/components/memberPopup/panels/EarnCredits/hooks/useActivities.ts +64 -0
  221. package/src/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.ts +32 -0
  222. package/src/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.ts +50 -0
  223. package/src/components/memberPopup/panels/EarnCredits/index.tsx +245 -0
  224. package/src/components/memberPopup/panels/Referral/hooks/useReferralOverview.ts +41 -0
  225. package/src/components/memberPopup/panels/Referral/index.tsx +108 -0
  226. package/src/components/memberPopup/type.ts +242 -0
  227. package/tailwind.config.ts +4 -0
  228. package/dist/cjs/stories/CartCard.stories.d.ts +0 -33
  229. package/dist/cjs/stories/CartCard.stories.js +0 -21
  230. package/dist/cjs/stories/CartCard.stories.js.map +0 -7
  231. package/dist/esm/stories/CartCard.stories.d.ts +0 -33
  232. package/dist/esm/stories/CartCard.stories.js +0 -21
  233. package/dist/esm/stories/CartCard.stories.js.map +0 -7
@@ -0,0 +1,291 @@
1
+ import { useMemo, useState } from 'react'
2
+ import { Picture, Button } from '@anker-in/headless-ui'
3
+ import { classNames as cn, useProductsByHandles, useHeadlessContext } from '@anker-in/lib'
4
+ import { useMemberPopupContext } from '../../context/provider'
5
+ import { useViewStack } from '../../context/viewStack'
6
+ import { useRedeemableList } from './hooks/useRedeemableList'
7
+ import { useRedeemAndBuy } from './hooks/useRedeemAndBuy'
8
+ import {
9
+ ConsumeCreditsItemType,
10
+ MemberPopupPanelType,
11
+ type ConsumeCreditsopy,
12
+ type ConsumeCreditsItem,
13
+ } from '../../type'
14
+ import { numberFormat } from '../../../credits/context/utils'
15
+ import type { ConsumeCreditRuleResponse } from '../../../credits/context/response'
16
+ import { ROUNDED_BRANDS } from '../../../../constants'
17
+
18
+ type EnrichedItem = ConsumeCreditsItem & {
19
+ alpcData: ConsumeCreditRuleResponse
20
+ insufficient: boolean
21
+ soldOut: boolean
22
+ product?: any
23
+ variant?: any
24
+ }
25
+
26
+ type Props = {
27
+ copy: ConsumeCreditsopy
28
+ onClose: () => void
29
+ }
30
+
31
+ function ConsumeCredits({ copy, onClose }: Props) {
32
+ const { profile, creditInfo, openSignUpPopup, alpcConfig } = useMemberPopupContext()
33
+ const { pushView } = useViewStack()
34
+ const { brand } = useHeadlessContext()
35
+ const rounded = ROUNDED_BRANDS.includes(brand)
36
+
37
+ const [redeemAndBuyError, setRedeemAndBuyError] = useState('')
38
+ const [loadingId, setLoadingId] = useState<string | number | null>(null)
39
+ const [isActivateSuccess, setIsActivateSuccess] = useState(false)
40
+
41
+ const isLogin = !!profile
42
+ const { redeemableList, listLoading } = useRedeemableList(alpcConfig)
43
+ const { trigger: redeemAndBuy } = useRedeemAndBuy(alpcConfig)
44
+
45
+ const handles = copy.list.map(item => item.product?.handle).filter(Boolean) as string[]
46
+ const { data: products } = useProductsByHandles({ handles })
47
+
48
+ const list = useMemo(() => {
49
+ return copy.list
50
+ .map(item => {
51
+ const alpcData = redeemableList.find(r => String(r.id) === String(item.redeemId))
52
+ if (!alpcData) return null
53
+
54
+ const availableCredit = Number(creditInfo?.available_credit ?? 0)
55
+ const insufficient = isLogin && !!profile?.activated && alpcData.consume_credits > availableCredit
56
+ const soldOut = alpcData.is_limited && (!alpcData.remaining_inventory || alpcData.remaining_inventory <= 0)
57
+
58
+ let product
59
+ let variant
60
+ if (
61
+ (item.type === ConsumeCreditsItemType.RedeemAndBuy || item.type === ConsumeCreditsItemType.Product) &&
62
+ item.product
63
+ ) {
64
+ product = products?.find((p: any) => p.handle === item.product!.handle)
65
+ variant = product?.variants?.find((v: any) => v.sku === item.product!.sku) ?? product?.variants?.[0]
66
+ if (item.type === ConsumeCreditsItemType.RedeemAndBuy && (!product || !variant)) return null
67
+ }
68
+
69
+ return { ...item, alpcData, insufficient, soldOut, product, variant }
70
+ })
71
+ .filter(Boolean) as EnrichedItem[]
72
+ }, [copy.list, redeemableList, creditInfo, profile, isLogin, products])
73
+
74
+ function getButtonLabel(item: (typeof list)[number]) {
75
+ if (!isLogin) return copy.unlockRewards
76
+ if (item.soldOut) return copy.soldOut
77
+ return copy.btnRedeem
78
+ }
79
+
80
+ function isDisabled(item: (typeof list)[number]) {
81
+ if (item.type === ConsumeCreditsItemType.GiftCard || item.type === ConsumeCreditsItemType.Product) {
82
+ return item.insufficient
83
+ }
84
+ return item.soldOut || item.insufficient
85
+ }
86
+
87
+ async function handleRedeem(item: (typeof list)[number]) {
88
+ if (!isLogin) {
89
+ openSignUpPopup()
90
+ return
91
+ }
92
+ if (!profile?.activated && !isActivateSuccess) {
93
+ pushView({
94
+ type: MemberPopupPanelType.Activate,
95
+ props: { onSuccess: () => setIsActivateSuccess(true) },
96
+ })
97
+ return
98
+ }
99
+ if (item.type === ConsumeCreditsItemType.GiftCard || item.type === ConsumeCreditsItemType.Product) {
100
+ if (copy.creditsPage?.url) {
101
+ window.open(copy.creditsPage.url, '_blank', 'noopener,noreferrer')
102
+ }
103
+ return
104
+ }
105
+ if (item.type === ConsumeCreditsItemType.Coupon) {
106
+ pushView({
107
+ type: MemberPopupPanelType.RedeemCoupon,
108
+ props: {
109
+ itemTitle: item.title,
110
+ itemCredits: item.alpcData.consume_credits,
111
+ itemImage: copy.imageMapping?.[item.type]
112
+ ? { url: copy.imageMapping[item.type]!.url, alt: item.image?.alt }
113
+ : item.image,
114
+ itemValue: item.value,
115
+ itemOff: copy.off,
116
+ itemRules: item.rules,
117
+ redeemId: Number(item.redeemId),
118
+ userId: profile?.user_id,
119
+ alpcConfig,
120
+ },
121
+ })
122
+ } else {
123
+ setRedeemAndBuyError('')
124
+ setLoadingId(item.redeemId)
125
+ try {
126
+ await redeemAndBuy({
127
+ productVariant: item.variant,
128
+ redeemId: Number(item.redeemId),
129
+ userId: profile?.user_id,
130
+ })
131
+ } catch (e: any) {
132
+ setRedeemAndBuyError(e?.message ?? copy.redeemModal.commonError)
133
+ } finally {
134
+ setLoadingId(null)
135
+ }
136
+ }
137
+ }
138
+
139
+ return (
140
+ <>
141
+ <div className="flex flex-1 flex-col gap-[12px]">
142
+ <div className="flex flex-col gap-[8px]">
143
+ {copy.title && <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>}
144
+ {copy.subtitle && <p className="text-[16px] font-[700] leading-snug text-[#4a4c56]">{copy.subtitle}</p>}
145
+ </div>
146
+
147
+ {isLogin && (
148
+ <div
149
+ className={cn(
150
+ 'flex items-center gap-[12px] bg-[#f5f6f7] p-[16px]',
151
+ rounded ? 'rounded-[8px]' : 'rounded-none'
152
+ )}
153
+ >
154
+ <div className="flex flex-1 flex-col gap-[4px]">
155
+ <div className="text-[14px] font-[700] text-[#1e2024]">{copy.balanceLabel ?? 'AnkerCredits Balance'}</div>
156
+ <div className="flex items-end gap-[4px]">
157
+ <span className="text-[24px] font-[700] leading-[1.2] text-[#1e2024]">
158
+ {numberFormat(creditInfo?.available_credit || 0)}
159
+ </span>
160
+ <span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
161
+ {copy.creditUnit ?? copy.pointUnit ?? 'ankercredits'}
162
+ </span>
163
+ </div>
164
+ </div>
165
+ <div className="h-full w-px bg-[#dadce0]" />
166
+ <div className="flex flex-1 flex-col gap-[4px]">
167
+ <div className="text-[14px] font-[700] text-[#1e2024]">{copy.comingSoonLabel ?? 'Coming Soon'}</div>
168
+ <div className="flex items-end gap-[4px]">
169
+ <span className="text-[24px] font-[700] leading-[1.2] text-[#1e2024]">
170
+ {numberFormat(creditInfo?.pending_credit || 0)}
171
+ </span>
172
+ <span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
173
+ {copy.creditUnit ?? copy.pointUnit ?? 'ankercredits'}
174
+ </span>
175
+ <span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
176
+ {copy.creditUnit ?? 'ankercredits'}
177
+ </span>
178
+ </div>
179
+ </div>
180
+ <div className="h-full w-px bg-[#dadce0]" />
181
+ <div className="flex flex-1 flex-col gap-[4px]">
182
+ <div className="text-[14px] font-[700] text-[#1e2024]">{copy.comingSoonLabel ?? 'Coming Soon'}</div>
183
+ <div className="flex items-end gap-[4px]">
184
+ <span className="text-[24px] font-[700] leading-[1.2] text-[#1e2024]">
185
+ {numberFormat(creditInfo?.pending_credit ?? 0)}
186
+ </span>
187
+ <span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
188
+ {copy.creditUnit ?? 'ankercredits'}
189
+ </span>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ )}
194
+ {redeemAndBuyError && <div className="text-[14px] font-[700] text-[#f84d4f]">{redeemAndBuyError}</div>}
195
+
196
+ {listLoading ? (
197
+ <div className="flex flex-1 items-center justify-center py-[32px]">
198
+ <div className="size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent" />
199
+ </div>
200
+ ) : (
201
+ <div className="flex flex-col">
202
+ {list.map((item, idx) => {
203
+ const hasProduct = !!item.product
204
+ return (
205
+ <div key={idx} className="relative py-[16px]">
206
+ {idx > 0 && <div className="absolute inset-x-0 top-0 h-px bg-[#dadce0]" />}
207
+ <div className="flex items-center gap-[12px]">
208
+ {(() => {
209
+ const mappedImgUrl = copy.imageMapping?.[item.type]?.url
210
+ const imgUrl = hasProduct
211
+ ? (item.variant?.image?.url ?? item.product?.images?.[0]?.url ?? item.image?.url)
212
+ : (mappedImgUrl ?? item.image?.url)
213
+ const imgAlt = hasProduct
214
+ ? (item.variant?.image?.altText ?? item.product?.images?.[0]?.alt ?? item.image?.alt ?? '')
215
+ : (item.image?.alt ?? '')
216
+ if (!imgUrl) return null
217
+ return (
218
+ <div
219
+ className={cn(
220
+ 'relative size-[64px] shrink-0 overflow-hidden',
221
+ rounded ? 'rounded-[4px]' : 'rounded-none'
222
+ )}
223
+ >
224
+ <Picture
225
+ source={imgUrl}
226
+ alt={imgAlt}
227
+ className="flex size-full items-center justify-center"
228
+ imgClassName={hasProduct ? 'object-cover' : 'h-full w-auto object-contain'}
229
+ />
230
+ {!hasProduct && item.value && (
231
+ <div className="absolute bottom-[16px] left-[4px] text-[12px] font-[800] leading-none text-white">
232
+ {item.value} {copy.off}
233
+ </div>
234
+ )}
235
+ </div>
236
+ )
237
+ })()}
238
+ <div className="min-w-0 flex-1">
239
+ <div className="text-[16px] font-[700] text-[#1e2024] line-clamp-2">
240
+ {hasProduct && item.product?.title ? item.product.title : item.title}
241
+ </div>
242
+ <div className="mt-[4px] text-[14px] text-[#666]">
243
+ {hasProduct && item.price != null
244
+ ? `${numberFormat(item.alpcData.consume_credits)} ${copy.pointUnit ?? ''} + $${Number(item.price).toFixed(2)}`
245
+ : `${numberFormat(item.alpcData.consume_credits)} ${copy.pointUnit ?? ''}`}
246
+ </div>
247
+ </div>
248
+ <div className="relative group">
249
+ <Button
250
+ className={cn(
251
+ 'bg-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white',
252
+ rounded ? 'rounded-[4px]' : 'rounded-none'
253
+ )}
254
+ disabled={isDisabled(item)}
255
+ loading={loadingId === item.redeemId}
256
+ onClick={() => handleRedeem(item)}
257
+ >
258
+ {getButtonLabel(item)}
259
+ </Button>
260
+ {item.insufficient && (
261
+ <div className="pointer-events-none absolute right-0 top-full z-[100] mt-[10px] hidden w-[200px] group-hover:block">
262
+ <div className="relative bg-[#6D6D6F] p-[16px] text-[14px] font-[700] text-white shadow">
263
+ <p className="text-pretty tracking-[-0.02em] text-[14px]">{copy.insufficientCredits}</p>
264
+ <div className="absolute -top-[8px] right-[20px] size-[16px] origin-top-left rotate-45 rounded-[2px] bg-[#6D6D6F]" />
265
+ </div>
266
+ </div>
267
+ )}
268
+ </div>
269
+ </div>
270
+ </div>
271
+ )
272
+ })}
273
+ </div>
274
+ )}
275
+
276
+ {copy.creditsPage?.url && (
277
+ <a
278
+ href={copy.creditsPage.url}
279
+ target="_blank"
280
+ rel="noopener noreferrer"
281
+ className="mt-auto self-start text-[14px] font-[700] text-[#080a0f] underline"
282
+ >
283
+ {copy.creditsPage.label ?? 'Go to Credits Page'}
284
+ </a>
285
+ )}
286
+ </div>
287
+ </>
288
+ )
289
+ }
290
+
291
+ export default ConsumeCredits
@@ -0,0 +1,323 @@
1
+ import { useState, useCallback, useRef, useEffect } from 'react'
2
+ import { Button, Text } from '@anker-in/headless-ui'
3
+ import {
4
+ useSendEmailValidation,
5
+ gaTrack,
6
+ classNames as cn,
7
+ useHeadlessContext,
8
+ useEmailValidation,
9
+ useCountDown,
10
+ } from '@anker-in/lib'
11
+ import { Message } from '../../../registration/authCodeActivate/Message'
12
+ import type { AuthCodeActivateCopy } from '../../type'
13
+ import { useRegistration } from '../../../registration'
14
+ import { ROUNDED_BRANDS } from '../../../../constants'
15
+
16
+ type Props = {
17
+ copy: AuthCodeActivateCopy
18
+ onClose: () => void
19
+ onSuccess?: () => void
20
+ }
21
+
22
+ export default function ActivatePanel({ copy, onClose, onSuccess }: Props) {
23
+ const { locale, brand } = useHeadlessContext()
24
+ const { email } = useRegistration()
25
+ const rounded = ROUNDED_BRANDS.includes(brand)
26
+
27
+ const {
28
+ isMutating: isSendingEmail,
29
+ trigger: triggerSendValidationEmail,
30
+ data: sendEmailData,
31
+ } = useSendEmailValidation()
32
+
33
+ const { isMutating: emailValidationLoading, trigger: triggerEmailValidation } = useEmailValidation()
34
+
35
+ const [messageText, setMessageText] = useState('')
36
+ const [messageStatus, setMessageStatus] = useState('')
37
+ const { startCountDown: isStartCountDown, startAction: startCountDown, countDown } = useCountDown(60)
38
+
39
+ const [error, setError] = useState('')
40
+ const [focusIndex, setFocusIndex] = useState(0)
41
+ const [codeArray, setCodeArray] = useState(new Array(6).fill(''))
42
+
43
+ const inputRefs = useRef<HTMLInputElement[]>([])
44
+ const code = codeArray.join('')
45
+
46
+ useEffect(() => {
47
+ if (inputRefs.current[focusIndex]) {
48
+ inputRefs.current[focusIndex].focus()
49
+ }
50
+ }, [focusIndex])
51
+
52
+ useEffect(() => {
53
+ if (email) {
54
+ triggerSendValidationEmail(
55
+ {
56
+ email: email,
57
+ data: {
58
+ redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,
59
+ },
60
+ },
61
+ {
62
+ onSuccess: () => {
63
+ setMessageStatus('success')
64
+ setMessageText(copy?.sendEmailSuccessMessage || '')
65
+ startCountDown()
66
+ setTimeout(() => {
67
+ setMessageStatus('')
68
+ setMessageText('')
69
+ }, 5000)
70
+ },
71
+ }
72
+ )
73
+ }
74
+ }, [email])
75
+
76
+ const handleSendAgain = useCallback(async () => {
77
+ if (!email) return
78
+ await triggerSendValidationEmail(
79
+ {
80
+ email: email,
81
+ data: {
82
+ redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,
83
+ },
84
+ },
85
+ {
86
+ onSuccess: () => {
87
+ setMessageStatus('success')
88
+ setMessageText(copy?.sendEmailSuccessMessage || '')
89
+ startCountDown()
90
+ setTimeout(() => {
91
+ setMessageStatus('')
92
+ setMessageText('')
93
+ }, 5000)
94
+ },
95
+ }
96
+ )
97
+ gaTrack({
98
+ event: 'ga4Event',
99
+ event_name: 'lp_button',
100
+ event_parameters: {
101
+ page_group: 'reg_sub_pop',
102
+ position: 'auth_code',
103
+ button_name: 'sent_again',
104
+ },
105
+ })
106
+ }, [email, triggerSendValidationEmail])
107
+
108
+ const handleInputCodeChange = (event: React.ChangeEvent<HTMLInputElement>, index: number) => {
109
+ const { value } = event.target
110
+
111
+ setError('')
112
+
113
+ if (Number.isNaN(Number(value))) {
114
+ return
115
+ }
116
+
117
+ if (value.length > 1) {
118
+ if (index < codeArray.length - 1) {
119
+ if (!codeArray[index + 1]) {
120
+ setFocusIndex(index + 1)
121
+ setCodeArray(old => {
122
+ const newCode = [...old]
123
+ newCode[index] = value[0]
124
+ if (value.length > 1) {
125
+ newCode[index + 1] = value[1]
126
+ }
127
+ return newCode
128
+ })
129
+ }
130
+ }
131
+ return
132
+ }
133
+ const newCode = [...codeArray]
134
+ newCode[index] = value
135
+ setCodeArray(newCode)
136
+ if (value) {
137
+ if (index < codeArray.length - 1 && !codeArray[index + 1]) {
138
+ setFocusIndex(index + 1)
139
+ }
140
+ } else if (index > 0) {
141
+ setFocusIndex(index - 1)
142
+ }
143
+ }
144
+
145
+ const handleAuthCodeSubmit = useCallback(async () => {
146
+ if (!code?.length) {
147
+ setError(copy?.codeEmptyError || '')
148
+ return
149
+ }
150
+
151
+ if (code.length < 6) {
152
+ setError(copy?.incorrectCodeError || '')
153
+ return
154
+ }
155
+
156
+ const token = sendEmailData?.data?.data?.active_token ?? sendEmailData?.data?.active_token
157
+ if (token) {
158
+ await triggerEmailValidation(
159
+ {
160
+ token: token,
161
+ code: code,
162
+ },
163
+ {
164
+ onSuccess: data => {
165
+ if (data.status >= 200 && data.status < 300) {
166
+ setMessageStatus('success')
167
+ setMessageText(copy?.authSuccessMessage || '')
168
+ onSuccess?.()
169
+ setTimeout(() => {
170
+ onClose()
171
+ }, 3000)
172
+ } else {
173
+ const errorCode = data?.data?.error_code ?? data?.error_code
174
+ if (errorCode === '104') {
175
+ onSuccess?.()
176
+ setTimeout(() => {
177
+ onClose()
178
+ }, 3000)
179
+ } else if (errorCode === '142') {
180
+ setError(copy?.incorrectCodeError || 'Invalid verification code.')
181
+ } else if (errorCode === '154') {
182
+ setError(copy?.expiredCodeMessage || '')
183
+ } else {
184
+ setError(copy?.sendEmailErrorMessage || '')
185
+ }
186
+ }
187
+ },
188
+ }
189
+ )
190
+ }
191
+
192
+ let timer = setTimeout(() => {
193
+ setMessageStatus('')
194
+ setMessageText('')
195
+ clearTimeout(timer)
196
+ }, 5000)
197
+
198
+ gaTrack({
199
+ event: 'ga4Event',
200
+ event_name: 'lp_button',
201
+ event_parameters: {
202
+ page_group: 'reg_sub_pop',
203
+ position: 'auth_code',
204
+ button_name: 'check_and_active',
205
+ },
206
+ })
207
+ }, [
208
+ code,
209
+ copy?.codeEmptyError,
210
+ copy?.authSuccessMessage,
211
+ copy?.incorrectCodeError,
212
+ copy?.expiredCodeMessage,
213
+ copy?.sendEmailErrorMessage,
214
+ locale,
215
+ sendEmailData,
216
+ triggerEmailValidation,
217
+ onClose,
218
+ onSuccess,
219
+ ])
220
+
221
+ return (
222
+ <div className="relative">
223
+ <div>
224
+ <Text
225
+ className="text-[22px] font-extrabold leading-[120%] text-[#333] min-l:text-[24px] [&_abbr]:text-[#005d8e]"
226
+ html={copy?.authCodeTitle}
227
+ />
228
+ <Text
229
+ as="p"
230
+ className="mt-3 text-[14px] font-semibold leading-[140%] text-[rgba(51,51,51,0.75)] min-l:text-base [&_abbr]:text-[#333]"
231
+ html={copy?.authCodeDesc?.replace('%email%', email || '')}
232
+ />
233
+ </div>
234
+ <div className="mt-6">
235
+ <Text
236
+ className="mt-4 text-[14px] !font-bold font-semibold leading-[140%] text-[#333] min-l:mt-6"
237
+ html={copy?.enterActiveCodeText}
238
+ />
239
+ <div className="my-3 grid grid-cols-6 gap-2">
240
+ {codeArray.map((item, index) => (
241
+ <div key={index} className="col-span-1 aspect-1 text-[#555]">
242
+ <input
243
+ ref={inputRef => {
244
+ if (inputRef) {
245
+ inputRefs.current[index] = inputRef
246
+ }
247
+ }}
248
+ key={index}
249
+ type="tel"
250
+ className={cn(
251
+ 'flex size-full items-center justify-center border border-[#333333]/20 bg-[#EEEEEE] text-center text-[24px] font-medium focus:border-[#333]/50 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [&:focus-visible]:outline-none',
252
+ rounded && 'rounded-[12px]'
253
+ )}
254
+ value={item}
255
+ autoComplete="false"
256
+ autoCorrect="false"
257
+ spellCheck="false"
258
+ autoCapitalize="false"
259
+ onChange={event => handleInputCodeChange(event, index)}
260
+ onFocus={() => {
261
+ setFocusIndex(index)
262
+ }}
263
+ onPaste={event => {
264
+ const paste = event.clipboardData.getData('text')
265
+ if (!Number.isNaN(Number(paste))) {
266
+ const pastedCode = paste.split('').slice(0, 6)
267
+ setCodeArray(pastedCode.concat(Array(6 - pastedCode.length).fill('')))
268
+ if (pastedCode.length <= codeArray.length) {
269
+ setFocusIndex(pastedCode.length - 1)
270
+ }
271
+ }
272
+ }}
273
+ onKeyDown={event => {
274
+ const { value } = event.target as HTMLInputElement
275
+ if (event.key === 'Backspace' && !value && index > 0) {
276
+ setFocusIndex(index - 1)
277
+ }
278
+ }}
279
+ />
280
+ </div>
281
+ ))}
282
+ </div>
283
+
284
+ {error && <Text className="mb-3 text-[14px] font-semibold leading-[120%] text-[#f84d4f]" html={error} />}
285
+ {copy?.authCodeContent && (
286
+ <ul
287
+ className='flex flex-col gap-1 [&_li]:flex [&_li]:gap-2 [&_li]:text-[14px] [&_li]:font-semibold [&_li]:leading-[120%] [&_li]:text-[rgba(51,51,51,0.55)] [&_li]:before:content-["•"]'
288
+ dangerouslySetInnerHTML={{ __html: copy?.authCodeContent }}
289
+ />
290
+ )}
291
+ </div>
292
+ <div className="mt-4 min-l:mt-6">
293
+ <Text className="text-base font-semibold leading-[100%] text-[#333]" html={copy?.authCodeReceiveText} />{' '}
294
+ {isStartCountDown ? (
295
+ <Text
296
+ html={copy?.retrieveText?.replace('%countdownTime%', countDown.toString())}
297
+ className="cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline"
298
+ />
299
+ ) : (
300
+ <Text
301
+ onClick={handleSendAgain}
302
+ className={cn(
303
+ 'cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline',
304
+ {
305
+ 'pointer-events-none': isStartCountDown || isSendingEmail,
306
+ }
307
+ )}
308
+ html={copy?.sendAgainText}
309
+ />
310
+ )}
311
+ <Button
312
+ type="submit"
313
+ loading={emailValidationLoading}
314
+ className="mt-6 flex h-[54px] w-full cursor-pointer items-center justify-center px-8 py-[15px] text-center text-base font-bold leading-[100%] text-white min-l:mt-8"
315
+ onClick={handleAuthCodeSubmit}
316
+ >
317
+ {copy.buttonText}
318
+ </Button>
319
+ </div>
320
+ <Message status={messageStatus} message={messageText} />
321
+ </div>
322
+ )
323
+ }