@anker-in/campaign-ui 0.5.0-beta.2 → 0.5.0-beta.3

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 (222) 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/useSubscribed.js.map +2 -2
  4. package/dist/cjs/components/index.d.ts +2 -3
  5. package/dist/cjs/components/index.js +1 -1
  6. package/dist/cjs/components/index.js.map +2 -2
  7. package/dist/cjs/stories/CartCard.stories.d.ts +33 -0
  8. package/dist/cjs/stories/CartCard.stories.js +21 -0
  9. package/dist/cjs/stories/CartCard.stories.js.map +7 -0
  10. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  11. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  12. package/dist/esm/components/credits/context/hooks/useSubscribed.js.map +2 -2
  13. package/dist/esm/components/index.d.ts +2 -3
  14. package/dist/esm/components/index.js +1 -1
  15. package/dist/esm/components/index.js.map +2 -2
  16. package/dist/esm/stories/CartCard.stories.d.ts +33 -0
  17. package/dist/esm/stories/CartCard.stories.js +21 -0
  18. package/dist/esm/stories/CartCard.stories.js.map +7 -0
  19. package/package.json +2 -1
  20. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +7 -5
  21. package/src/components/credits/context/hooks/useSubscribed.ts +1 -0
  22. package/src/components/index.ts +2 -4
  23. package/src/stories/CartCard.stories.tsx +459 -0
  24. package/tailwind.config.ts +0 -4
  25. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +0 -9
  26. package/dist/cjs/components/memberPopup/MemberPopup.js +0 -2
  27. package/dist/cjs/components/memberPopup/MemberPopup.js.map +0 -7
  28. package/dist/cjs/components/memberPopup/context/provider.d.ts +0 -11
  29. package/dist/cjs/components/memberPopup/context/provider.js +0 -2
  30. package/dist/cjs/components/memberPopup/context/provider.js.map +0 -7
  31. package/dist/cjs/components/memberPopup/context/viewStack.d.ts +0 -12
  32. package/dist/cjs/components/memberPopup/context/viewStack.js +0 -2
  33. package/dist/cjs/components/memberPopup/context/viewStack.js.map +0 -7
  34. package/dist/cjs/components/memberPopup/icons.d.ts +0 -27
  35. package/dist/cjs/components/memberPopup/icons.js +0 -2
  36. package/dist/cjs/components/memberPopup/icons.js.map +0 -7
  37. package/dist/cjs/components/memberPopup/index.d.ts +0 -4
  38. package/dist/cjs/components/memberPopup/index.js +0 -2
  39. package/dist/cjs/components/memberPopup/index.js.map +0 -7
  40. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  41. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  42. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  43. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  44. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  45. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  46. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +0 -7
  47. package/dist/cjs/components/memberPopup/panels/Activity/index.js +0 -2
  48. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +0 -7
  49. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  50. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  51. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  52. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +0 -20
  53. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +0 -2
  54. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +0 -7
  55. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +0 -12
  56. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +0 -2
  57. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +0 -7
  58. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +0 -17
  59. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +0 -2
  60. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +0 -7
  61. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +0 -8
  62. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +0 -2
  63. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +0 -7
  64. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +0 -7
  65. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +0 -2
  66. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +0 -7
  67. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +0 -8
  68. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +0 -2
  69. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +0 -7
  70. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +0 -10
  71. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +0 -2
  72. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +0 -7
  73. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +0 -9
  74. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +0 -2
  75. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +0 -7
  76. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +0 -9
  77. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +0 -2
  78. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +0 -7
  79. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  80. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  81. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  82. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  83. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  84. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  85. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +0 -18
  86. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +0 -2
  87. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +0 -7
  88. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +0 -9
  89. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +0 -2
  90. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +0 -7
  91. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +0 -17
  92. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +0 -2
  93. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +0 -7
  94. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +0 -13
  95. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +0 -2
  96. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +0 -7
  97. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  98. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  99. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  100. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +0 -12
  101. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +0 -2
  102. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +0 -7
  103. package/dist/cjs/components/memberPopup/panels/Referral/index.d.ts +0 -7
  104. package/dist/cjs/components/memberPopup/panels/Referral/index.js +0 -2
  105. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +0 -7
  106. package/dist/cjs/components/memberPopup/type.d.ts +0 -216
  107. package/dist/cjs/components/memberPopup/type.js +0 -2
  108. package/dist/cjs/components/memberPopup/type.js.map +0 -7
  109. package/dist/esm/components/memberPopup/MemberPopup.d.ts +0 -9
  110. package/dist/esm/components/memberPopup/MemberPopup.js +0 -2
  111. package/dist/esm/components/memberPopup/MemberPopup.js.map +0 -7
  112. package/dist/esm/components/memberPopup/context/provider.d.ts +0 -11
  113. package/dist/esm/components/memberPopup/context/provider.js +0 -2
  114. package/dist/esm/components/memberPopup/context/provider.js.map +0 -7
  115. package/dist/esm/components/memberPopup/context/viewStack.d.ts +0 -12
  116. package/dist/esm/components/memberPopup/context/viewStack.js +0 -2
  117. package/dist/esm/components/memberPopup/context/viewStack.js.map +0 -7
  118. package/dist/esm/components/memberPopup/icons.d.ts +0 -27
  119. package/dist/esm/components/memberPopup/icons.js +0 -2
  120. package/dist/esm/components/memberPopup/icons.js.map +0 -7
  121. package/dist/esm/components/memberPopup/index.d.ts +0 -4
  122. package/dist/esm/components/memberPopup/index.js +0 -2
  123. package/dist/esm/components/memberPopup/index.js.map +0 -7
  124. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  125. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  126. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  127. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  128. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  129. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  130. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +0 -7
  131. package/dist/esm/components/memberPopup/panels/Activity/index.js +0 -2
  132. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +0 -7
  133. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  134. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  135. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  136. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +0 -20
  137. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +0 -2
  138. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +0 -7
  139. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +0 -12
  140. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +0 -2
  141. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +0 -7
  142. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +0 -17
  143. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +0 -2
  144. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +0 -7
  145. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +0 -8
  146. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +0 -2
  147. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +0 -7
  148. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +0 -7
  149. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +0 -2
  150. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +0 -7
  151. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +0 -8
  152. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +0 -2
  153. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +0 -7
  154. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +0 -10
  155. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +0 -2
  156. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +0 -7
  157. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +0 -9
  158. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +0 -2
  159. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +0 -7
  160. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +0 -9
  161. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +0 -2
  162. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +0 -7
  163. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  164. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  165. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  166. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  167. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  168. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  169. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +0 -18
  170. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +0 -2
  171. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +0 -7
  172. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +0 -9
  173. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +0 -2
  174. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +0 -7
  175. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +0 -17
  176. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +0 -2
  177. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +0 -7
  178. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +0 -13
  179. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +0 -2
  180. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +0 -7
  181. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  182. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  183. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  184. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +0 -12
  185. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +0 -2
  186. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +0 -7
  187. package/dist/esm/components/memberPopup/panels/Referral/index.d.ts +0 -7
  188. package/dist/esm/components/memberPopup/panels/Referral/index.js +0 -2
  189. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +0 -7
  190. package/dist/esm/components/memberPopup/type.d.ts +0 -216
  191. package/dist/esm/components/memberPopup/type.js +0 -2
  192. package/dist/esm/components/memberPopup/type.js.map +0 -7
  193. package/dist/index.d.mts +0 -1775
  194. package/dist/index.d.ts +0 -1775
  195. package/dist/index.js +0 -18542
  196. package/dist/index.js.map +0 -1
  197. package/dist/index.mjs +0 -18514
  198. package/dist/index.mjs.map +0 -1
  199. package/src/components/memberPopup/MemberPopup.tsx +0 -325
  200. package/src/components/memberPopup/context/provider.tsx +0 -52
  201. package/src/components/memberPopup/context/viewStack.tsx +0 -23
  202. package/src/components/memberPopup/icons.tsx +0 -147
  203. package/src/components/memberPopup/index.ts +0 -24
  204. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.tsx +0 -150
  205. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +0 -142
  206. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.ts +0 -33
  207. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.ts +0 -38
  208. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.ts +0 -55
  209. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +0 -220
  210. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +0 -323
  211. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +0 -186
  212. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +0 -179
  213. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +0 -130
  214. package/src/components/memberPopup/panels/EarnCredits/SubscribeModal.tsx +0 -144
  215. package/src/components/memberPopup/panels/EarnCredits/SubscribePanel.tsx +0 -147
  216. package/src/components/memberPopup/panels/EarnCredits/hooks/useActivities.ts +0 -64
  217. package/src/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.ts +0 -32
  218. package/src/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.ts +0 -50
  219. package/src/components/memberPopup/panels/EarnCredits/index.tsx +0 -215
  220. package/src/components/memberPopup/panels/Referral/hooks/useReferralOverview.ts +0 -41
  221. package/src/components/memberPopup/panels/Referral/index.tsx +0 -108
  222. package/src/components/memberPopup/type.ts +0 -230
@@ -1,130 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react'
2
- import { Checkbox, 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
- copy: SubscribeModalCopy
13
- email?: string
14
- onClose: () => void
15
- onSuccess?: () => void
16
- }
17
-
18
- function getAdCookie() {
19
- if (typeof window === 'undefined') return { register_source: '' }
20
- const { search, href } = window.location
21
- const query = parse(search)
22
- return {
23
- fbuy_ref_code: Cookies.get('fbuy_ref_code'),
24
- ref: Cookies.get('ref_ads'),
25
- inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),
26
- register_source: query.redirect ?? Cookies.get('reg_source') ?? href,
27
- }
28
- }
29
-
30
- export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose, onSuccess }: Props) {
31
- const { alpcConfig } = useMemberPopupContext()
32
- const { brand, locale } = alpcConfig
33
- const { brand: headlessBrand } = useHeadlessContext()
34
- const rounded = ROUNDED_BRANDS.includes(headlessBrand)
35
- const [policy, setPolicy] = useState(false)
36
- const [email, setEmail] = useState(initialEmail ?? '')
37
- const [errorMessage, setErrorMessage] = useState('')
38
- const [successMessage, setSuccessMessage] = useState('')
39
- const [loading, setLoading] = useState(false)
40
-
41
- useEffect(() => {
42
- if (initialEmail) setEmail(initialEmail)
43
- }, [initialEmail])
44
-
45
- const handleSubmit = useCallback(async () => {
46
- setErrorMessage('')
47
- if (!email) return setErrorMessage('Please fill in your email')
48
- if (!emailValidate(email)) return setErrorMessage('Invalid email address')
49
- if (!policy) return setErrorMessage('Please agree to the policy')
50
-
51
- setLoading(true)
52
- const { register_source } = getAdCookie()
53
- try {
54
- const response = await fetch('/api/multipass/subscribe/subscribe_emails', {
55
- method: 'POST',
56
- headers: { 'Content-Type': 'application/json', 'current-language': locale },
57
- body: JSON.stringify({
58
- email,
59
- register_source,
60
- brand,
61
- deals_type: copy.dealsType ?? 'vip_subscribe',
62
- }),
63
- })
64
- const result = await response.json()
65
- if (!result.errors) {
66
- setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
67
- onSuccess?.()
68
- setTimeout(() => {
69
- setSuccessMessage('')
70
- onClose()
71
- }, 3000)
72
- } else {
73
- setErrorMessage(result.errors ?? 'Error occurred')
74
- }
75
- } catch {
76
- setErrorMessage('Network error')
77
- } finally {
78
- setLoading(false)
79
- }
80
- }, [email, policy, locale, brand, copy, onClose, onSuccess])
81
-
82
- return (
83
- <div className="flex flex-col gap-[12px]">
84
- <div className="flex flex-col gap-[8px]">
85
- {copy.title && (
86
- <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>
87
- )}
88
- {copy.desc && (
89
- <Text className="text-[16px] text-[#1e2024]" html={copy.desc} />
90
- )}
91
- </div>
92
-
93
- <div className="flex flex-col gap-[16px]">
94
- <input
95
- className={cn(
96
- 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',
97
- errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',
98
- rounded ? 'rounded-[4px]' : 'rounded-none'
99
- )}
100
- placeholder={copy.placeholder}
101
- value={email}
102
- onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}
103
- />
104
-
105
- <div className="flex w-full items-start gap-[8px]">
106
- <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="mt-[2px] border-[#1d1d1f]" />
107
- <label
108
- className="cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline"
109
- onClick={() => setPolicy(v => !v)}
110
- dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
111
- />
112
- </div>
113
-
114
- {(errorMessage || successMessage) && (
115
- <div className={cn('text-[14px] font-[700]', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>
116
- <Text html={successMessage || errorMessage} />
117
- </div>
118
- )}
119
-
120
- <button
121
- className={cn('w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60', rounded ? 'rounded-[4px]' : 'rounded-none')}
122
- disabled={loading}
123
- onClick={handleSubmit}
124
- >
125
- {copy.buttonLabel ?? 'Subscribe'}
126
- </button>
127
- </div>
128
- </div>
129
- )
130
- }
@@ -1,144 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react'
2
- import { Button, Checkbox, 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 { CreditsModalContainer } from '../../../credits/modal/ModalContainer'
7
- import { emailValidate } from '../../../credits/context/utils'
8
- import { useMemberPopupContext } from '../../context/provider'
9
- import type { SubscribeModalCopy } from '../../type'
10
- import { ROUNDED_BRANDS } from '../../../../constants'
11
-
12
- type Props = {
13
- isOpen: boolean
14
- onClose: () => void
15
- onSuccess?: () => void
16
- copy: SubscribeModalCopy
17
- email?: string
18
- }
19
-
20
- function getAdCookie() {
21
- if (typeof window === 'undefined') return { register_source: '' }
22
- const { search, href } = window.location
23
- const query = parse(search)
24
- return {
25
- fbuy_ref_code: Cookies.get('fbuy_ref_code'),
26
- ref: Cookies.get('ref_ads'),
27
- inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),
28
- register_source: query.redirect ?? Cookies.get('reg_source') ?? href,
29
- }
30
- }
31
-
32
- async function getRecaptchaToken(sitekey: string): Promise<string> {
33
- if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''
34
- if (!sitekey) return ''
35
- try {
36
- return await window.grecaptcha.execute(sitekey, { action: 'activity' })
37
- } catch {
38
- return ''
39
- }
40
- }
41
-
42
- export function EarnCreditsSubscribeModal({ isOpen, onClose, onSuccess, copy, email: initialEmail }: Props) {
43
- const { alpcConfig } = useMemberPopupContext()
44
- const { locale } = alpcConfig
45
- const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()
46
- const rounded = ROUNDED_BRANDS.includes(headlessBrand)
47
- const [policy, setPolicy] = useState(false)
48
- const [email, setEmail] = useState(initialEmail ?? '')
49
- const [errorMessage, setErrorMessage] = useState('')
50
- const [successMessage, setSuccessMessage] = useState('')
51
- const [loading, setLoading] = useState(false)
52
-
53
- useEffect(() => {
54
- if (initialEmail) setEmail(initialEmail)
55
- }, [initialEmail])
56
-
57
- const handleSubmit = useCallback(async () => {
58
- setErrorMessage('')
59
- if (!email) return setErrorMessage('Please fill in your email')
60
- if (!emailValidate(email)) return setErrorMessage('Invalid email address')
61
- if (!policy) return setErrorMessage('Please agree to the policy')
62
-
63
- setLoading(true)
64
- const { register_source } = getAdCookie()
65
- const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')
66
- try {
67
- const response = await fetch('/api/multipass/rainbowbridge/activities', {
68
- method: 'POST',
69
- headers: {
70
- 'Content-Type': 'application/json',
71
- 'current-language': locale,
72
- 'X-Recaptcha-Token': recaptchaToken,
73
- },
74
- body: JSON.stringify({
75
- email,
76
- register_source,
77
- shopify_domain: storeDomain,
78
- single_brand_subscribe: copy.single_brand_subscribe ?? true,
79
- genre: copy.genre ?? copy.dealsType ?? '',
80
- sub_brand_type: copy.sub_brand_type ?? '',
81
- }),
82
- })
83
- const result = await response.json()
84
- if (!result.errors) {
85
- setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
86
- onSuccess?.()
87
- setTimeout(() => {
88
- setSuccessMessage('')
89
- onClose()
90
- }, 3000)
91
- } else {
92
- setErrorMessage(result.errors ?? 'Error occurred')
93
- }
94
- } catch {
95
- setErrorMessage('Network error')
96
- } finally {
97
- setLoading(false)
98
- }
99
- }, [email, policy, locale, storeDomain, copy, onSuccess, onClose])
100
-
101
- return (
102
- <CreditsModalContainer
103
- isOpen={isOpen}
104
- onClose={onClose}
105
- className="w-[540px] md:h-auto"
106
- scrollClassName="mb-[40px] md:mb-[24px]"
107
- useAnimation
108
- animationClassName="md:translate-y-[100vh]"
109
- >
110
- <div className="flex flex-col gap-[16px] text-center">
111
- <Text className="text-[22px] font-bold" html={copy.title} />
112
- {copy.desc && (
113
- <Text className="text-left text-[16px] font-semibold text-[#1f2021]" html={copy.desc} />
114
- )}
115
- <div className={cn('flex h-[52px] w-full overflow-hidden md:flex-col md:h-auto md:gap-[16px]', rounded ? 'rounded-[2px]' : 'rounded-none')}>
116
- <input
117
- className={cn('h-full flex-1 border border-[#d8d8d8] px-[14px] text-[16px] outline-none placeholder:text-[#999] md:h-[52px]', rounded ? 'rounded-l-[2px] md:rounded-[2px]' : 'rounded-none')}
118
- placeholder={copy.placeholder}
119
- value={email}
120
- onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}
121
- />
122
- <Button
123
- variant="primary"
124
- loading={loading}
125
- className={cn('!h-full !min-w-0 !px-[24px] md:!h-[46px]', rounded ? '!rounded-l-none !rounded-r-[2px] md:!rounded-[2px]' : '!rounded-none')}
126
- onClick={handleSubmit}
127
- >
128
- {copy.buttonLabel ?? 'Subscribe'}
129
- </Button>
130
- </div>
131
- <div className="flex w-full items-start gap-[8px]">
132
- <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="border-[#1d1d1f]" />
133
- <label
134
- className="text-left text-[14px] font-semibold text-[#777] [&_a]:underline"
135
- dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
136
- />
137
- </div>
138
- <div className={cn('text-left text-[16px] font-semibold', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>
139
- <Text html={successMessage || errorMessage || ''} />
140
- </div>
141
- </div>
142
- </CreditsModalContainer>
143
- )
144
- }
@@ -1,147 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react'
2
- import { Checkbox, 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
- copy: SubscribeModalCopy
13
- email?: string
14
- onClose: () => void
15
- onSuccess?: () => void
16
- }
17
-
18
- function getAdCookie() {
19
- if (typeof window === 'undefined') return { register_source: '' }
20
- const { search, href } = window.location
21
- const query = parse(search)
22
- return {
23
- fbuy_ref_code: Cookies.get('fbuy_ref_code'),
24
- ref: Cookies.get('ref_ads'),
25
- inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),
26
- register_source: query.redirect ?? Cookies.get('reg_source') ?? href,
27
- }
28
- }
29
-
30
- async function getRecaptchaToken(sitekey: string): Promise<string> {
31
- if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''
32
- if (!sitekey) return ''
33
- try {
34
- return await window.grecaptcha.execute(sitekey, { action: 'activity' })
35
- } catch {
36
- return ''
37
- }
38
- }
39
-
40
- export default function SubscribePanel({ copy, email: initialEmail, onClose, onSuccess }: Props) {
41
- const { alpcConfig } = useMemberPopupContext()
42
- const { locale } = alpcConfig
43
- const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()
44
- const rounded = ROUNDED_BRANDS.includes(headlessBrand)
45
- const [policy, setPolicy] = useState(false)
46
- const [email, setEmail] = useState(initialEmail ?? '')
47
- const [errorMessage, setErrorMessage] = useState('')
48
- const [successMessage, setSuccessMessage] = useState('')
49
- const [loading, setLoading] = useState(false)
50
-
51
- useEffect(() => {
52
- if (initialEmail) setEmail(initialEmail)
53
- }, [initialEmail])
54
-
55
- const handleSubmit = useCallback(async () => {
56
- setErrorMessage('')
57
- if (!email) return setErrorMessage('Please fill in your email')
58
- if (!emailValidate(email)) return setErrorMessage('Invalid email address')
59
- if (!policy) return setErrorMessage('Please agree to the policy')
60
-
61
- setLoading(true)
62
- const { register_source } = getAdCookie()
63
- const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')
64
- try {
65
- const response = await fetch('/api/multipass/rainbowbridge/activities', {
66
- method: 'POST',
67
- headers: {
68
- 'Content-Type': 'application/json',
69
- 'current-language': locale,
70
- 'X-Recaptcha-Token': recaptchaToken,
71
- },
72
- body: JSON.stringify({
73
- email,
74
- register_source,
75
- shopify_domain: storeDomain,
76
- single_brand_subscribe: copy.single_brand_subscribe ?? true,
77
- genre: copy.genre ?? copy.dealsType ?? '',
78
- sub_brand_type: copy.sub_brand_type ?? '',
79
- }),
80
- })
81
- const result = await response.json()
82
- if (!result.errors) {
83
- setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
84
- onSuccess?.()
85
- setTimeout(() => {
86
- setSuccessMessage('')
87
- onClose()
88
- }, 3000)
89
- } else {
90
- setErrorMessage(result.errors ?? 'Error occurred')
91
- }
92
- } catch {
93
- setErrorMessage('Network error')
94
- } finally {
95
- setLoading(false)
96
- }
97
- }, [email, policy, locale, storeDomain, copy, onClose, onSuccess])
98
-
99
- return (
100
- <div className="flex flex-col gap-[12px]">
101
- <div className="flex flex-col gap-[8px]">
102
- {copy.title && (
103
- <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>
104
- )}
105
- {copy.desc && (
106
- <Text className="text-[16px] text-[#1e2024]" html={copy.desc} />
107
- )}
108
- </div>
109
-
110
- <div className="flex flex-col gap-[16px]">
111
- <input
112
- className={cn(
113
- 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',
114
- errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',
115
- rounded ? 'rounded-[4px]' : 'rounded-none'
116
- )}
117
- placeholder={copy.placeholder}
118
- value={email}
119
- onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}
120
- />
121
-
122
- <div className="flex w-full items-start gap-[8px]">
123
- <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="mt-[2px] border-[#1d1d1f]" />
124
- <label
125
- className="cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline"
126
- onClick={() => setPolicy(v => !v)}
127
- dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
128
- />
129
- </div>
130
-
131
- {(errorMessage || successMessage) && (
132
- <div className={cn('text-[14px] font-[700]', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>
133
- <Text html={successMessage || errorMessage} />
134
- </div>
135
- )}
136
-
137
- <button
138
- className={cn('w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60', rounded ? 'rounded-[4px]' : 'rounded-none')}
139
- disabled={loading}
140
- onClick={handleSubmit}
141
- >
142
- {copy.buttonLabel ?? 'Subscribe'}
143
- </button>
144
- </div>
145
- </div>
146
- )
147
- }
@@ -1,64 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react'
2
- import useSWRMutation from 'swr/mutation'
3
- import { getAlpcPath } from '../../../../credits/context/utils'
4
- import type { CreditLogResponse } from '../../../../credits/context/response'
5
-
6
- type UseActivitiesConfig = {
7
- userId: string | undefined
8
- brand: string
9
- apiBaseUrl?: string
10
- locale?: string
11
- }
12
-
13
- type Params = {
14
- page: number
15
- pageSize: number
16
- }
17
-
18
- function useActivities(
19
- { userId, brand, apiBaseUrl, locale = '' }: UseActivitiesConfig,
20
- { page, pageSize }: Params
21
- ) {
22
- const [activities, setActivities] = useState<CreditLogResponse[]>([])
23
- const [total, setTotal] = useState(0)
24
- const [currentPage, setCurrentPage] = useState(0)
25
-
26
- const { isMutating: isLoading, trigger } = useSWRMutation(
27
- `/v1/credit/log`,
28
- async (url: string, { arg }: { arg: Record<string, any> }) => {
29
- const response = await fetch(getAlpcPath(locale, apiBaseUrl) + url, {
30
- method: 'POST',
31
- headers: { 'Content-Type': 'application/json', 'current-language': locale },
32
- body: JSON.stringify(arg),
33
- })
34
- return response.json()
35
- }
36
- )
37
-
38
- const fetchActivities = useCallback(async () => {
39
- await trigger(
40
- { page, page_size: pageSize, user_id: userId, brand },
41
- {
42
- onSuccess(data) {
43
- setCurrentPage(page)
44
- setTotal(data?.data?.total ?? 0)
45
- setActivities(prev => prev.concat(data?.data?.creditLogs ?? []))
46
- },
47
- }
48
- )
49
- }, [page, pageSize, userId, brand, trigger])
50
-
51
- useEffect(() => {
52
- if (!userId || !brand || isLoading || page === currentPage) return
53
- fetchActivities()
54
- }, [fetchActivities, userId, brand, page, currentPage, isLoading])
55
-
56
- return {
57
- activities,
58
- isLoading,
59
- total,
60
- canNext: total > activities.length && !isLoading,
61
- }
62
- }
63
-
64
- export default useActivities
@@ -1,32 +0,0 @@
1
- import { useMemo } from 'react'
2
- import { useSubscriptions } from '@anker-in/lib'
3
- import { TaskSubType } from '../../../../credits/context/const'
4
- import useActivities from './useActivities'
5
-
6
- type UseSubscribedConfig = {
7
- userId: string | undefined
8
- brand: string
9
- email: string | undefined
10
- locale?: string
11
- apiBaseUrl?: string
12
- }
13
-
14
- export function useSubscribed({ userId, brand, email, locale = '', apiBaseUrl }: UseSubscribedConfig) {
15
- const { activities } = useActivities(
16
- { userId, brand, apiBaseUrl, locale },
17
- { page: 1, pageSize: 50 }
18
- )
19
- const { data: subscription } = useSubscriptions({ email })
20
- const subscriptionData = subscription?.data || subscription
21
-
22
- return useMemo(() => {
23
- if (!subscriptionData?.preference) {
24
- return false
25
- }
26
- const subscribedByPreference = subscriptionData.preference.some(
27
- (item: any) => item.brand === brand && item.subscribe
28
- )
29
- if (subscribedByPreference) return true
30
- return activities?.some(item => item.task_sub_type === TaskSubType.Subscription)
31
- }, [subscriptionData?.preference, activities, brand])
32
- }
@@ -1,50 +0,0 @@
1
- import { useCallback, useState } from 'react'
2
-
3
- type UseUpdateProfileConfig = {
4
- locale?: string
5
- appName?: string
6
- }
7
-
8
- type ProfileData = {
9
- first_name?: string
10
- last_name?: string
11
- phone_number?: string
12
- country?: string
13
- dob?: string
14
- }
15
-
16
- export function useUpdateProfile({ locale = '', appName = '' }: UseUpdateProfileConfig = {}) {
17
- const [isLoading, setIsLoading] = useState(false)
18
- const [error, setError] = useState<string | null>(null)
19
-
20
- const updateProfile = useCallback(
21
- async (data: ProfileData): Promise<boolean> => {
22
- setIsLoading(true)
23
- setError(null)
24
- try {
25
- const response = await fetch('/api/multipass/account/users/update_profile', {
26
- method: 'PUT',
27
- headers: {
28
- 'Content-Type': 'application/json',
29
- 'current-language': locale,
30
- },
31
- body: JSON.stringify({ app: appName, ...data }),
32
- })
33
- const result = await response.json()
34
- if (response.ok && !result.error) {
35
- return true
36
- }
37
- setError(result?.error?.message || result?.error || 'Update failed')
38
- return false
39
- } catch (e: any) {
40
- setError(e?.message ?? 'Unknown error')
41
- return false
42
- } finally {
43
- setIsLoading(false)
44
- }
45
- },
46
- [locale, appName]
47
- )
48
-
49
- return { updateProfile, isLoading, error }
50
- }