@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,194 @@
1
+ import { useCallback, useEffect, useState } from 'react'
2
+ import { Button, Checkbox, Picture, Text } from '@anker-in/headless-ui'
3
+ import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
4
+ import Cookies from 'js-cookie'
5
+ import { parse } from 'query-string'
6
+ import { emailValidate } from '../../credits/context/utils'
7
+ import { useMemberPopupContext } from '../context/provider'
8
+ import type { SubscribeModalCopy } from '../type'
9
+ import { ROUNDED_BRANDS } from '../../../constants'
10
+
11
+ type Props = {
12
+ onSuccess?: () => void
13
+ copy: SubscribeModalCopy
14
+ email?: string
15
+ hideForm: boolean
16
+ onHideForm: () => void
17
+ }
18
+
19
+ function getAdCookie() {
20
+ if (typeof window === 'undefined') return { register_source: '' }
21
+ const { search, href } = window.location
22
+ const query = parse(search)
23
+ return {
24
+ fbuy_ref_code: Cookies.get('fbuy_ref_code'),
25
+ ref: Cookies.get('ref_ads'),
26
+ inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),
27
+ register_source: query.redirect ?? Cookies.get('reg_source') ?? href,
28
+ }
29
+ }
30
+
31
+ async function getRecaptchaToken(sitekey: string): Promise<string> {
32
+ if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''
33
+ if (!sitekey) return ''
34
+ try {
35
+ return await window.grecaptcha.execute(sitekey, { action: 'activity' })
36
+ } catch {
37
+ return ''
38
+ }
39
+ }
40
+
41
+ export default function ActivitiesSubscribeModal({
42
+ onSuccess,
43
+ copy,
44
+ email: initialEmail,
45
+ hideForm,
46
+ onHideForm,
47
+ }: Props) {
48
+ const { alpcConfig } = useMemberPopupContext()
49
+ const { locale } = alpcConfig
50
+ const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()
51
+ const rounded = ROUNDED_BRANDS.includes(headlessBrand)
52
+ const [policy, setPolicy] = useState(false)
53
+ const [email, setEmail] = useState(initialEmail ?? '')
54
+ const [errorMessage, setErrorMessage] = useState('')
55
+ const [successMessage, setSuccessMessage] = useState('')
56
+ const [loading, setLoading] = useState(false)
57
+
58
+ useEffect(() => {
59
+ if (initialEmail) setEmail(initialEmail)
60
+ }, [initialEmail])
61
+
62
+ const handleSubmit = useCallback(async () => {
63
+ setErrorMessage('')
64
+ if (!email) return setErrorMessage('Please fill in your email')
65
+ if (!emailValidate(email)) return setErrorMessage('Invalid email address')
66
+ if (!policy) return setErrorMessage('Please agree to the policy')
67
+
68
+ setLoading(true)
69
+ const { register_source } = getAdCookie()
70
+ const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')
71
+ try {
72
+ const response = await fetch('/api/multipass/rainbowbridge/activities', {
73
+ method: 'POST',
74
+ headers: {
75
+ 'Content-Type': 'application/json',
76
+ 'current-language': locale,
77
+ 'X-Recaptcha-Token': recaptchaToken,
78
+ },
79
+ body: JSON.stringify({
80
+ email,
81
+ register_source,
82
+ shopify_domain: storeDomain,
83
+ single_brand_subscribe: copy.single_brand_subscribe ?? true,
84
+ genre: copy.genre ?? copy.dealsType ?? '',
85
+ sub_brand_type: copy.sub_brand_type ?? '',
86
+ }),
87
+ })
88
+ const result = await response.json()
89
+ if (!result.errors) {
90
+ setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
91
+ onSuccess?.()
92
+ setTimeout(() => {
93
+ onHideForm()
94
+ setSuccessMessage('')
95
+ }, 3000)
96
+ } else {
97
+ setErrorMessage(result.errors ?? 'Error occurred')
98
+ }
99
+ } catch {
100
+ setErrorMessage('Network error')
101
+ } finally {
102
+ setLoading(false)
103
+ }
104
+ }, [email, policy, locale, storeDomain, copy, onSuccess, onHideForm])
105
+
106
+ return (
107
+ <div className="flex flex-col gap-[16px] text-center">
108
+ {!hideForm && (
109
+ <>
110
+ <Text className="text-[22px] font-bold" html={copy.title} />
111
+ {copy.desc && <Text className="text-left text-[16px] font-semibold text-[#1f2021]" html={copy.desc} />}
112
+
113
+ <input
114
+ className={cn(
115
+ 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',
116
+ errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',
117
+ rounded ? 'rounded-[4px]' : 'rounded-none'
118
+ )}
119
+ placeholder={copy.placeholder}
120
+ value={email}
121
+ onChange={e => {
122
+ setErrorMessage('')
123
+ setEmail(e.target.value.trim())
124
+ }}
125
+ />
126
+
127
+ <div className="flex w-full items-start gap-[8px]">
128
+ <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="border-[#1d1d1f]" />
129
+ <label
130
+ className="text-left text-[14px] font-semibold text-[#777] [&_a]:underline"
131
+ dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
132
+ />
133
+ </div>
134
+
135
+ <button
136
+ className={cn(
137
+ 'w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60',
138
+ rounded ? 'rounded-[4px]' : 'rounded-none'
139
+ )}
140
+ disabled={loading}
141
+ onClick={handleSubmit}
142
+ >
143
+ {copy.buttonLabel ?? 'Subscribe'}
144
+ </button>
145
+
146
+ {errorMessage && (
147
+ <div className="text-left text-[16px] font-semibold text-[#f84d4f]">
148
+ <Text html={errorMessage} />
149
+ </div>
150
+ )}
151
+ <div className="text-left text-[16px] font-semibold text-[#52c41a]">
152
+ <Text html={successMessage} />
153
+ </div>
154
+ </>
155
+ )}
156
+
157
+ {copy.promo && (
158
+ <div className="flex flex-col text-left">
159
+ <div className="flex flex-col gap-[8px]">
160
+ {copy.promo?.title && (
161
+ <h3 className="text-[20px] font-[700] leading-[1.2] text-[#080a0f]">{copy.promo?.title}</h3>
162
+ )}
163
+ {copy.promo.description && (
164
+ <p className="text-[14px] leading-[1.5] text-[#1e2024]">{copy.promo.description}</p>
165
+ )}
166
+ {copy.promo.learnMoreLabel && copy.promo.learnMoreUrl && (
167
+ <a
168
+ href={copy.promo.learnMoreUrl}
169
+ target="_blank"
170
+ rel="noopener noreferrer"
171
+ className="flex items-center gap-[4px] text-[14px] font-[700] text-[#080a0f] underline"
172
+ >
173
+ {copy.promo.learnMoreLabel}
174
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
175
+ <path
176
+ d="M5.52827 3.52876C5.78862 3.26841 6.21063 3.26841 6.47098 3.52876L10.471 7.52876C10.7313 7.78911 10.7313 8.21112 10.471 8.47147L6.47098 12.4715C6.21063 12.7318 5.78862 12.7318 5.52827 12.4715C5.26792 12.2111 5.26792 11.7891 5.52827 11.5288L9.05692 8.00011L5.52827 4.47147C5.26792 4.21112 5.26792 3.78911 5.52827 3.52876Z"
177
+ fill="#080A0F"
178
+ />
179
+ </svg>
180
+ </a>
181
+ )}
182
+ </div>
183
+ {copy.promo.image?.url && (
184
+ <Picture
185
+ source={copy.promo.image.url}
186
+ alt={copy.promo.image.alt ?? ''}
187
+ className={cn('h-[100px] mt-[8px] w-full object-cover', rounded ? 'rounded-[8px]' : 'rounded-none')}
188
+ />
189
+ )}
190
+ </div>
191
+ )}
192
+ </div>
193
+ )
194
+ }
@@ -0,0 +1,175 @@
1
+ import { useCallback, useEffect, useState } from 'react'
2
+ import { Text, Button } from '@anker-in/headless-ui'
3
+ import { useHeadlessContext, classNames as cn } from '@anker-in/lib'
4
+ import { AlpcErrorCode } from '../../../credits/context/const'
5
+ import { useRedeemCoupon } from './hooks/useRedeemCoupon'
6
+ import useCopy from '../../../credits/context/hooks/useCopy'
7
+ import type { RedeemCouponModalCopy, AlpcConfig } from '../../type'
8
+ import { ROUNDED_BRANDS } from '../../../../constants'
9
+
10
+ type Props = {
11
+ onClose: () => void
12
+ itemTitle: string
13
+ itemCredits: number
14
+ itemImage?: { url: string; alt?: string }
15
+ itemValue?: string
16
+ itemOff?: string
17
+ itemRules?: string[]
18
+ redeemId: number
19
+ userId?: string
20
+ copy: RedeemCouponModalCopy
21
+ pointUnit?: string
22
+ alpcConfig: AlpcConfig
23
+ onError?: (code: number) => void
24
+ }
25
+
26
+ export default function RedeemCouponPanel({
27
+ onClose,
28
+ itemTitle,
29
+ itemCredits,
30
+ itemImage,
31
+ itemValue,
32
+ itemOff,
33
+ itemRules,
34
+ redeemId,
35
+ userId,
36
+ copy,
37
+ pointUnit = 'pts',
38
+ alpcConfig,
39
+ onError,
40
+ }: Props) {
41
+ const [couponCode, setCouponCode] = useState<string>()
42
+ const [errorInfo, setErrorInfo] = useState('')
43
+ const [disabled, setDisabled] = useState(false)
44
+ const { copy: copyText, copied } = useCopy()
45
+ const { brand } = useHeadlessContext()
46
+ const rounded = ROUNDED_BRANDS.includes(brand)
47
+
48
+ const { isMutating: loading, trigger } = useRedeemCoupon(alpcConfig)
49
+
50
+ const handleConfirm = useCallback(async () => {
51
+ setErrorInfo('')
52
+ const { data } = await trigger({ user_id: userId, rule_id: redeemId })
53
+ if (!data) {
54
+ setErrorInfo(copy.commonError)
55
+ return
56
+ }
57
+ if (data.data?.success) {
58
+ setCouponCode(data.data.coupon_code)
59
+ } else {
60
+ let msg = copy.commonError
61
+ if (data.code === AlpcErrorCode.CodeLpcShopifyCouponRuleRedeemLimit) {
62
+ msg = copy.redeemLimitError
63
+ setDisabled(true)
64
+ } else if (data.code === AlpcErrorCode.CodeLpcRuleInventoryNotEnough) {
65
+ msg = copy.inventoryNotEnough
66
+ setDisabled(true)
67
+ } else if (data.code === AlpcErrorCode.CodeLpcNotEnoughCredits) {
68
+ msg = copy.creditsNotEnough
69
+ setDisabled(true)
70
+ } else if (data.code === AlpcErrorCode.CodeCrossSiteError) {
71
+ msg = copy.crossSiteError
72
+ setDisabled(true)
73
+ }
74
+ setErrorInfo(msg)
75
+ onError?.(data.code)
76
+ }
77
+ }, [trigger, userId, redeemId, copy, onError])
78
+
79
+ useEffect(() => {
80
+ setCouponCode(undefined)
81
+ setErrorInfo('')
82
+ setDisabled(false)
83
+ }, [redeemId])
84
+
85
+ const rulesSection = itemRules && itemRules.length > 0 && (
86
+ <div className="w-full text-[16px] font-bold leading-[1.4] text-[#6D6D6F] md:mt-[12px] md:text-[14px]">
87
+ <ul className="ml-4 grid grid-flow-row gap-[4px]">
88
+ {itemRules?.map((text, index) => (
89
+ <li className="list-disc" key={index}>
90
+ <Text html={text} className="font-bold" />
91
+ </li>
92
+ ))}
93
+ </ul>
94
+ </div>
95
+ )
96
+
97
+ return (
98
+ <div className="flex flex-col">
99
+ {itemImage?.url && (
100
+ <div className="relative w-full px-[24px]">
101
+ <div className={cn('relative mx-auto overflow-hidden', rounded ? 'rounded-[8px]' : 'rounded-none')}>
102
+ <img src={itemImage.url} alt={itemImage.alt ?? ''} className="mx-auto h-[140px] w-full object-cover" />
103
+ {itemValue && (
104
+ <div className="absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white">
105
+ {itemValue}
106
+ {itemOff ? ` ${itemOff}` : ''}
107
+ </div>
108
+ )}
109
+ </div>
110
+ </div>
111
+ )}
112
+
113
+ {!couponCode && (
114
+ <div className="flex flex-col gap-[16px] px-[24px] py-[20px]">
115
+ <p className="text-center text-[24px] font-[700] text-[#1d1d1f]">
116
+ {itemCredits} {pointUnit}
117
+ </p>
118
+ {rulesSection}
119
+ </div>
120
+ )}
121
+
122
+ {couponCode && (
123
+ <div className="flex mt-[16px] flex-col gap-[8px] text-center">
124
+ <div className="flex items-center justify-center gap-[10px]">
125
+ <span className="text-[24px] font-[700]">{couponCode}</span>
126
+ <button
127
+ className="cursor-pointer text-[14px] font-[700] underline disabled:pointer-events-none"
128
+ disabled={copied}
129
+ onClick={() => copyText(couponCode)}
130
+ >
131
+ {copied ? 'Copied' : 'Copy'}
132
+ </button>
133
+ </div>
134
+ <Text className="text-[20px] font-[700]" html={copy.successTitle} />
135
+ <Text className="text-[14px] font-[700] text-[#6d6d6f]" html={copy.successDesc} />
136
+ <Button
137
+ className={cn(
138
+ 'w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]',
139
+ rounded ? 'rounded-[4px]' : 'rounded-none'
140
+ )}
141
+ onClick={() => {
142
+ if (copy.successButtonUrl) window.location.href = copy.successButtonUrl
143
+ onClose()
144
+ }}
145
+ >
146
+ {copy.successButton}
147
+ </Button>
148
+ </div>
149
+ )}
150
+
151
+ {!couponCode && (
152
+ <div className="sticky bottom-0 bg-white border-t border-[#e5e5e5] pt-[10px]">
153
+ <div className="flex flex-col gap-[8px] text-center">
154
+ <Text className="block text-[16px] font-[700] leading-[1.3]" html={copy.confirmTitle} />
155
+ <Button
156
+ className={cn(
157
+ 'w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]',
158
+ rounded ? 'rounded-[4px]' : 'rounded-none'
159
+ )}
160
+ disabled={disabled}
161
+ loading={loading}
162
+ onClick={handleConfirm}
163
+ >
164
+ {copy.confirmButton}
165
+ </Button>
166
+ </div>
167
+
168
+ {errorInfo && (
169
+ <Text className="mt-[8px] text-center text-[14px] font-[700] text-[#ff0000]" html={errorInfo} />
170
+ )}
171
+ </div>
172
+ )}
173
+ </div>
174
+ )
175
+ }
@@ -0,0 +1,33 @@
1
+ import { useBuyNow } from '@anker-in/lib'
2
+ import { useRedeemCoupon } from './useRedeemCoupon'
3
+ import type { AlpcConfig } from '../../../type'
4
+ import type { ProductVariant } from '@anker-in/lib'
5
+
6
+ type RedeemAndBuyArg = {
7
+ productVariant: ProductVariant
8
+ quantity?: number
9
+ redeemId: number
10
+ userId?: string
11
+ }
12
+
13
+ export function useRedeemAndBuy(config: AlpcConfig) {
14
+ const { trigger: redeemTrigger } = useRedeemCoupon(config)
15
+ const { trigger: buyNow } = useBuyNow({}, { throwOnError: true })
16
+
17
+ const trigger = async (arg: RedeemAndBuyArg) => {
18
+ const { data } = await redeemTrigger({
19
+ user_id: arg.userId,
20
+ rule_id: arg.redeemId,
21
+ })
22
+ if (data?.data?.coupon_code) {
23
+ await buyNow({
24
+ discountCodes: [data.data.coupon_code],
25
+ lineItems: [{ variant: arg.productVariant, quantity: arg.quantity ?? 1 }],
26
+ })
27
+ } else {
28
+ throw new Error(data?.msg ?? 'Redeem failed')
29
+ }
30
+ }
31
+
32
+ return { trigger }
33
+ }
@@ -0,0 +1,38 @@
1
+ import useSWRMutation from 'swr/mutation'
2
+ import { getAlpcPath } from '../../../../credits/context/utils'
3
+ import { ALPC_COUNTRY_MAP } from '../../../../credits/context/const'
4
+ import type { AlpcConfig } from '../../../type'
5
+
6
+ type RedeemCouponResponse = {
7
+ data: {
8
+ data: { success: boolean; coupon_code: string }
9
+ msg: string
10
+ code: number
11
+ }
12
+ }
13
+
14
+ type RedeemCouponParams = {
15
+ user_id?: string
16
+ rule_id: number
17
+ }
18
+
19
+ export function useRedeemCoupon(config: AlpcConfig) {
20
+ const { brand, locale, appName, apiBaseUrl } = config
21
+
22
+ return useSWRMutation<RedeemCouponResponse, Error, string, RedeemCouponParams>(
23
+ `/v1/credit/redeem/coupon`,
24
+ async (url: string, { arg }) => {
25
+ const response = await fetch(getAlpcPath(locale, apiBaseUrl) + url, {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/json', 'current-language': locale },
28
+ body: JSON.stringify({
29
+ brand,
30
+ country: ALPC_COUNTRY_MAP.get(locale) || locale,
31
+ app_name: appName,
32
+ ...arg,
33
+ }),
34
+ })
35
+ return response.json()
36
+ }
37
+ )
38
+ }
@@ -0,0 +1,55 @@
1
+ import { useCallback, useEffect, useState } from 'react'
2
+ import useSWRMutation from 'swr/mutation'
3
+ import { getAlpcPath, languageTerritory } from '../../../../credits/context/utils'
4
+ import { ALPC_COUNTRY_MAP, AlpcConsumeType } from '../../../../credits/context/const'
5
+ import type { ConsumeCreditRuleResponse } from '../../../../credits/context/response'
6
+ import type { AlpcConfig } from '../../../type'
7
+
8
+ export function useRedeemableList(config: AlpcConfig) {
9
+ const { brand, locale, appName, apiBaseUrl } = config
10
+
11
+ let resolvedLocale = locale
12
+ if (locale === 'pl') resolvedLocale = 'eu'
13
+
14
+ const [redeemableList, setRedeemableList] = useState<ConsumeCreditRuleResponse[]>([])
15
+
16
+ const { isMutating: listLoading, trigger } = useSWRMutation(
17
+ `/v1/credit/consume_credit_rules`,
18
+ async (url: string, { arg }: { arg: Record<string, any> }) => {
19
+ const response = await fetch(getAlpcPath(resolvedLocale, apiBaseUrl) + url, {
20
+ method: 'POST',
21
+ headers: { 'Content-Type': 'application/json', 'current-language': resolvedLocale },
22
+ body: JSON.stringify(arg),
23
+ })
24
+ return response.json()
25
+ }
26
+ )
27
+
28
+ const getRedeemableList = useCallback(
29
+ (consumeType?: AlpcConsumeType) => {
30
+ trigger(
31
+ {
32
+ brand,
33
+ page: 1,
34
+ page_size: 999,
35
+ country: (ALPC_COUNTRY_MAP.get(resolvedLocale) || resolvedLocale)?.toUpperCase(),
36
+ app_name: appName,
37
+ ...(consumeType !== undefined && { consume_type: consumeType }),
38
+ },
39
+ {
40
+ onSuccess({ data }) {
41
+ setRedeemableList(data?.data?.consume_credit_rules ?? [])
42
+ },
43
+ }
44
+ )
45
+ },
46
+ [brand, resolvedLocale, appName, trigger]
47
+ )
48
+
49
+ useEffect(() => {
50
+ if (!brand) return
51
+ getRedeemableList()
52
+ }, [brand, getRedeemableList])
53
+
54
+ return { redeemableList, listLoading, getRedeemableList }
55
+ }