@anker-in/campaign-ui 0.4.7 → 0.5.0-beta.1

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 (213) hide show
  1. package/dist/cjs/components/index.d.ts +1 -0
  2. package/dist/cjs/components/index.js +1 -1
  3. package/dist/cjs/components/index.js.map +2 -2
  4. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +9 -0
  5. package/dist/cjs/components/memberPopup/MemberPopup.js +2 -0
  6. package/dist/cjs/components/memberPopup/MemberPopup.js.map +7 -0
  7. package/dist/cjs/components/memberPopup/context/provider.d.ts +11 -0
  8. package/dist/cjs/components/memberPopup/context/provider.js +2 -0
  9. package/dist/cjs/components/memberPopup/context/provider.js.map +7 -0
  10. package/dist/cjs/components/memberPopup/context/viewStack.d.ts +12 -0
  11. package/dist/cjs/components/memberPopup/context/viewStack.js +2 -0
  12. package/dist/cjs/components/memberPopup/context/viewStack.js.map +7 -0
  13. package/dist/cjs/components/memberPopup/icons.d.ts +27 -0
  14. package/dist/cjs/components/memberPopup/icons.js +2 -0
  15. package/dist/cjs/components/memberPopup/icons.js.map +7 -0
  16. package/dist/cjs/components/memberPopup/index.d.ts +4 -0
  17. package/dist/cjs/components/memberPopup/index.js +2 -0
  18. package/dist/cjs/components/memberPopup/index.js.map +7 -0
  19. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +10 -0
  20. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +2 -0
  21. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +7 -0
  22. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +7 -0
  23. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +2 -0
  24. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +7 -0
  25. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +7 -0
  26. package/dist/cjs/components/memberPopup/panels/Activity/index.js +2 -0
  27. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +7 -0
  28. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +19 -0
  29. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +2 -0
  30. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +7 -0
  31. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +20 -0
  32. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +2 -0
  33. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +7 -0
  34. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +12 -0
  35. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +2 -0
  36. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +7 -0
  37. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +17 -0
  38. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +2 -0
  39. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +7 -0
  40. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +8 -0
  41. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +2 -0
  42. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +7 -0
  43. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +7 -0
  44. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +2 -0
  45. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +7 -0
  46. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +8 -0
  47. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +2 -0
  48. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +7 -0
  49. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +10 -0
  50. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +2 -0
  51. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +7 -0
  52. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +9 -0
  53. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +2 -0
  54. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +7 -0
  55. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +9 -0
  56. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +2 -0
  57. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +7 -0
  58. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +10 -0
  59. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +2 -0
  60. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +7 -0
  61. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +9 -0
  62. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +2 -0
  63. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +7 -0
  64. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +18 -0
  65. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +2 -0
  66. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +7 -0
  67. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +9 -0
  68. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +2 -0
  69. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +7 -0
  70. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +17 -0
  71. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +2 -0
  72. package/dist/cjs/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +7 -0
  73. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +13 -0
  74. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +2 -0
  75. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +7 -0
  76. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +13 -0
  77. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +2 -0
  78. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +7 -0
  79. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +12 -0
  80. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +2 -0
  81. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +7 -0
  82. package/dist/cjs/components/memberPopup/panels/Referral/index.d.ts +7 -0
  83. package/dist/cjs/components/memberPopup/panels/Referral/index.js +2 -0
  84. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +7 -0
  85. package/dist/cjs/components/memberPopup/type.d.ts +201 -0
  86. package/dist/cjs/components/memberPopup/type.js +2 -0
  87. package/dist/cjs/components/memberPopup/type.js.map +7 -0
  88. package/dist/esm/components/index.d.ts +1 -0
  89. package/dist/esm/components/index.js +1 -1
  90. package/dist/esm/components/index.js.map +2 -2
  91. package/dist/esm/components/memberPopup/MemberPopup.d.ts +9 -0
  92. package/dist/esm/components/memberPopup/MemberPopup.js +2 -0
  93. package/dist/esm/components/memberPopup/MemberPopup.js.map +7 -0
  94. package/dist/esm/components/memberPopup/context/provider.d.ts +11 -0
  95. package/dist/esm/components/memberPopup/context/provider.js +2 -0
  96. package/dist/esm/components/memberPopup/context/provider.js.map +7 -0
  97. package/dist/esm/components/memberPopup/context/viewStack.d.ts +12 -0
  98. package/dist/esm/components/memberPopup/context/viewStack.js +2 -0
  99. package/dist/esm/components/memberPopup/context/viewStack.js.map +7 -0
  100. package/dist/esm/components/memberPopup/icons.d.ts +27 -0
  101. package/dist/esm/components/memberPopup/icons.js +2 -0
  102. package/dist/esm/components/memberPopup/icons.js.map +7 -0
  103. package/dist/esm/components/memberPopup/index.d.ts +4 -0
  104. package/dist/esm/components/memberPopup/index.js +2 -0
  105. package/dist/esm/components/memberPopup/index.js.map +7 -0
  106. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +10 -0
  107. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +2 -0
  108. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +7 -0
  109. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +7 -0
  110. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +2 -0
  111. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +7 -0
  112. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +7 -0
  113. package/dist/esm/components/memberPopup/panels/Activity/index.js +2 -0
  114. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +7 -0
  115. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +19 -0
  116. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +2 -0
  117. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +7 -0
  118. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +20 -0
  119. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +2 -0
  120. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +7 -0
  121. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.d.ts +12 -0
  122. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js +2 -0
  123. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.js.map +7 -0
  124. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.d.ts +17 -0
  125. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js +2 -0
  126. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.js.map +7 -0
  127. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.d.ts +8 -0
  128. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js +2 -0
  129. package/dist/esm/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.js.map +7 -0
  130. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +7 -0
  131. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +2 -0
  132. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +7 -0
  133. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +8 -0
  134. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +2 -0
  135. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +7 -0
  136. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.d.ts +10 -0
  137. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +2 -0
  138. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +7 -0
  139. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +9 -0
  140. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +2 -0
  141. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +7 -0
  142. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +9 -0
  143. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +2 -0
  144. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +7 -0
  145. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +10 -0
  146. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +2 -0
  147. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +7 -0
  148. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +9 -0
  149. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +2 -0
  150. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +7 -0
  151. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.d.ts +18 -0
  152. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js +2 -0
  153. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useActivities.js.map +7 -0
  154. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.d.ts +9 -0
  155. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js +2 -0
  156. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.js.map +7 -0
  157. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.d.ts +17 -0
  158. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js +2 -0
  159. package/dist/esm/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.js.map +7 -0
  160. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +13 -0
  161. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +2 -0
  162. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +7 -0
  163. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +13 -0
  164. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +2 -0
  165. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +7 -0
  166. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.d.ts +12 -0
  167. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js +2 -0
  168. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralOverview.js.map +7 -0
  169. package/dist/esm/components/memberPopup/panels/Referral/index.d.ts +7 -0
  170. package/dist/esm/components/memberPopup/panels/Referral/index.js +2 -0
  171. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +7 -0
  172. package/dist/esm/components/memberPopup/type.d.ts +201 -0
  173. package/dist/esm/components/memberPopup/type.js +2 -0
  174. package/dist/esm/components/memberPopup/type.js.map +7 -0
  175. package/dist/index.d.mts +1775 -0
  176. package/dist/index.d.ts +1775 -0
  177. package/dist/index.js +18542 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/index.mjs +18514 -0
  180. package/dist/index.mjs.map +1 -0
  181. package/package.json +1 -1
  182. package/src/components/index.ts +2 -0
  183. package/src/components/memberPopup/MemberPopup.tsx +283 -0
  184. package/src/components/memberPopup/context/provider.tsx +52 -0
  185. package/src/components/memberPopup/context/viewStack.tsx +23 -0
  186. package/src/components/memberPopup/icons.tsx +147 -0
  187. package/src/components/memberPopup/index.ts +24 -0
  188. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.tsx +150 -0
  189. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +142 -0
  190. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemAndBuy.ts +33 -0
  191. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemCoupon.ts +38 -0
  192. package/src/components/memberPopup/panels/ConsumeCredits/hooks/useRedeemableList.ts +55 -0
  193. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +220 -0
  194. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +323 -0
  195. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +186 -0
  196. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +179 -0
  197. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +130 -0
  198. package/src/components/memberPopup/panels/EarnCredits/SubscribeModal.tsx +144 -0
  199. package/src/components/memberPopup/panels/EarnCredits/SubscribePanel.tsx +147 -0
  200. package/src/components/memberPopup/panels/EarnCredits/hooks/useActivities.ts +64 -0
  201. package/src/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.ts +32 -0
  202. package/src/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.ts +50 -0
  203. package/src/components/memberPopup/panels/EarnCredits/index.tsx +215 -0
  204. package/src/components/memberPopup/panels/Referral/hooks/useReferralOverview.ts +41 -0
  205. package/src/components/memberPopup/panels/Referral/index.tsx +108 -0
  206. package/src/components/memberPopup/type.ts +213 -0
  207. package/tailwind.config.ts +4 -0
  208. package/dist/cjs/stories/CartCard.stories.d.ts +0 -33
  209. package/dist/cjs/stories/CartCard.stories.js +0 -21
  210. package/dist/cjs/stories/CartCard.stories.js.map +0 -7
  211. package/dist/esm/stories/CartCard.stories.d.ts +0 -33
  212. package/dist/esm/stories/CartCard.stories.js +0 -21
  213. package/dist/esm/stories/CartCard.stories.js.map +0 -7
@@ -0,0 +1,2 @@
1
+ import{jsx as n,jsxs as b}from"react/jsx-runtime";import{useState as f,useCallback as A,useRef as O,useEffect as D}from"react";import{Button as U,Text as r}from"@anker-in/headless-ui";import{useSendEmailValidation as q,gaTrack as I,classNames as R,useHeadlessContext as G,useEmailValidation as J,useCountDown as Q}from"@anker-in/lib";import{Message as W}from"../../../registration/authCodeActivate/Message";import{useRegistration as X}from"../../../registration";import{ROUNDED_BRANDS as Y}from"../../../../constants";function Z({copy:e,onClose:x,onSuccess:h}){const{locale:H,brand:L}=G(),{email:i}=X(),V=Y.includes(L),{isMutating:y,trigger:v,data:C}=q(),{isMutating:B,trigger:T}=J(),[P,l]=f(""),[$,c]=f(""),{startCountDown:S,startAction:M,countDown:j}=Q(60),[k,u]=f(""),[_,m]=f(0),[o,E]=f(new Array(6).fill("")),N=O([]),p=o.join("");D(()=>{N.current[_]&&N.current[_].focus()},[_]),D(()=>{i&&v({email:i,data:{redirect_url:`${window?.location?.origin}${window?.location?.pathname}`}},{onSuccess:()=>{c("success"),l(e?.sendEmailSuccessMessage||""),M(),setTimeout(()=>{c(""),l("")},5e3)}})},[i]);const z=A(async()=>{i&&(await v({email:i,data:{redirect_url:`${window?.location?.origin}${window?.location?.pathname}`}},{onSuccess:()=>{c("success"),l(e?.sendEmailSuccessMessage||""),M(),setTimeout(()=>{c(""),l("")},5e3)}}),I({event:"ga4Event",event_name:"lp_button",event_parameters:{page_group:"reg_sub_pop",position:"auth_code",button_name:"sent_again"}}))},[i,v]),F=(d,a)=>{const{value:t}=d.target;if(u(""),Number.isNaN(Number(t)))return;if(t.length>1){a<o.length-1&&(o[a+1]||(m(a+1),E(g=>{const w=[...g];return w[a]=t[0],t.length>1&&(w[a+1]=t[1]),w})));return}const s=[...o];s[a]=t,E(s),t?a<o.length-1&&!o[a+1]&&m(a+1):a>0&&m(a-1)},K=A(async()=>{if(!p?.length){u(e?.codeEmptyError||"");return}if(p.length<6){u(e?.incorrectCodeError||"");return}const d=C?.data?.data?.active_token??C?.data?.active_token;d&&await T({token:d,code:p},{onSuccess:t=>{if(t.status>=200&&t.status<300)c("success"),l(e?.authSuccessMessage||""),h?.(),setTimeout(()=>{x()},3e3);else{const s=t?.data?.error_code??t?.error_code;s==="104"?(h?.(),setTimeout(()=>{x()},3e3)):u(s==="142"?e?.incorrectCodeError||"Invalid verification code.":s==="154"?e?.expiredCodeMessage||"":e?.sendEmailErrorMessage||"")}}});let a=setTimeout(()=>{c(""),l(""),clearTimeout(a)},5e3);I({event:"ga4Event",event_name:"lp_button",event_parameters:{page_group:"reg_sub_pop",position:"auth_code",button_name:"check_and_active"}})},[p,e?.codeEmptyError,e?.authSuccessMessage,e?.incorrectCodeError,e?.expiredCodeMessage,e?.sendEmailErrorMessage,H,C,T,x,h]);return b("div",{className:"relative",children:[b("div",{children:[n(r,{className:"text-[22px] font-extrabold leading-[120%] text-[#333] min-l:text-[24px] [&_abbr]:text-[#005d8e]",html:e?.authCodeTitle}),n(r,{as:"p",className:"mt-3 text-[14px] font-semibold leading-[140%] text-[rgba(51,51,51,0.75)] min-l:text-base [&_abbr]:text-[#333]",html:e?.authCodeDesc?.replace("%email%",i||"")})]}),b("div",{className:"mt-6",children:[n(r,{className:"mt-4 text-[14px] !font-bold font-semibold leading-[140%] text-[#333] min-l:mt-6",html:e?.enterActiveCodeText}),n("div",{className:"my-3 grid grid-cols-6 gap-2",children:o.map((d,a)=>n("div",{className:"col-span-1 aspect-1 text-[#555]",children:n("input",{ref:t=>{t&&(N.current[a]=t)},type:"tel",className:R("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",V&&"rounded-[12px]"),value:d,autoComplete:"false",autoCorrect:"false",spellCheck:"false",autoCapitalize:"false",onChange:t=>F(t,a),onFocus:()=>{m(a)},onPaste:t=>{const s=t.clipboardData.getData("text");if(!Number.isNaN(Number(s))){const g=s.split("").slice(0,6);E(g.concat(Array(6-g.length).fill(""))),g.length<=o.length&&m(g.length-1)}},onKeyDown:t=>{const{value:s}=t.target;t.key==="Backspace"&&!s&&a>0&&m(a-1)}},a)},a))}),k&&n(r,{className:"mb-3 text-[14px] font-semibold leading-[120%] text-[#f84d4f]",html:k}),e?.authCodeContent&&n("ul",{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-["\u2022"]',dangerouslySetInnerHTML:{__html:e?.authCodeContent}})]}),b("div",{className:"mt-4 min-l:mt-6",children:[n(r,{className:"text-base font-semibold leading-[100%] text-[#333]",html:e?.authCodeReceiveText})," ",S?n(r,{html:e?.retrieveText?.replace("%countdownTime%",j.toString()),className:"cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline"}):n(r,{onClick:z,className:R("cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline",{"pointer-events-none":S||y}),html:e?.sendAgainText}),n(U,{type:"submit",loading:B,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",onClick:K,children:e.buttonText})]}),n(W,{status:$,message:P})]})}export{Z as default};
2
+ //# sourceMappingURL=ActivatePanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx"],
4
+ "sourcesContent": ["import { useState, useCallback, useRef, useEffect } from 'react'\nimport { Button, Text } from '@anker-in/headless-ui'\nimport {\n useSendEmailValidation,\n gaTrack,\n classNames as cn,\n useHeadlessContext,\n useEmailValidation,\n useCountDown,\n} from '@anker-in/lib'\nimport { Message } from '../../../registration/authCodeActivate/Message'\nimport type { AuthCodeActivateCopy } from '../../type'\nimport { useRegistration } from '../../../registration'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n copy: AuthCodeActivateCopy\n onClose: () => void\n onSuccess?: () => void\n}\n\nexport default function ActivatePanel({ copy, onClose, onSuccess }: Props) {\n const { locale, brand } = useHeadlessContext()\n const { email } = useRegistration()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const {\n isMutating: isSendingEmail,\n trigger: triggerSendValidationEmail,\n data: sendEmailData,\n } = useSendEmailValidation()\n\n const { isMutating: emailValidationLoading, trigger: triggerEmailValidation } = useEmailValidation()\n\n const [messageText, setMessageText] = useState('')\n const [messageStatus, setMessageStatus] = useState('')\n const { startCountDown: isStartCountDown, startAction: startCountDown, countDown } = useCountDown(60)\n\n const [error, setError] = useState('')\n const [focusIndex, setFocusIndex] = useState(0)\n const [codeArray, setCodeArray] = useState(new Array(6).fill(''))\n\n const inputRefs = useRef<HTMLInputElement[]>([])\n const code = codeArray.join('')\n\n useEffect(() => {\n if (inputRefs.current[focusIndex]) {\n inputRefs.current[focusIndex].focus()\n }\n }, [focusIndex])\n\n useEffect(() => {\n if (email) {\n triggerSendValidationEmail(\n {\n email: email,\n data: {\n redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,\n },\n },\n {\n onSuccess: () => {\n setMessageStatus('success')\n setMessageText(copy?.sendEmailSuccessMessage || '')\n startCountDown()\n setTimeout(() => {\n setMessageStatus('')\n setMessageText('')\n }, 5000)\n },\n }\n )\n }\n }, [email])\n\n const handleSendAgain = useCallback(async () => {\n if (!email) return\n await triggerSendValidationEmail(\n {\n email: email,\n data: {\n redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,\n },\n },\n {\n onSuccess: () => {\n setMessageStatus('success')\n setMessageText(copy?.sendEmailSuccessMessage || '')\n startCountDown()\n setTimeout(() => {\n setMessageStatus('')\n setMessageText('')\n }, 5000)\n },\n }\n )\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n page_group: 'reg_sub_pop',\n position: 'auth_code',\n button_name: 'sent_again',\n },\n })\n }, [email, triggerSendValidationEmail])\n\n const handleInputCodeChange = (event: React.ChangeEvent<HTMLInputElement>, index: number) => {\n const { value } = event.target\n\n setError('')\n\n if (Number.isNaN(Number(value))) {\n return\n }\n\n if (value.length > 1) {\n if (index < codeArray.length - 1) {\n if (!codeArray[index + 1]) {\n setFocusIndex(index + 1)\n setCodeArray(old => {\n const newCode = [...old]\n newCode[index] = value[0]\n if (value.length > 1) {\n newCode[index + 1] = value[1]\n }\n return newCode\n })\n }\n }\n return\n }\n const newCode = [...codeArray]\n newCode[index] = value\n setCodeArray(newCode)\n if (value) {\n if (index < codeArray.length - 1 && !codeArray[index + 1]) {\n setFocusIndex(index + 1)\n }\n } else if (index > 0) {\n setFocusIndex(index - 1)\n }\n }\n\n const handleAuthCodeSubmit = useCallback(async () => {\n if (!code?.length) {\n setError(copy?.codeEmptyError || '')\n return\n }\n\n if (code.length < 6) {\n setError(copy?.incorrectCodeError || '')\n return\n }\n\n const token = sendEmailData?.data?.data?.active_token ?? sendEmailData?.data?.active_token\n if (token) {\n await triggerEmailValidation(\n {\n token: token,\n code: code,\n },\n {\n onSuccess: data => {\n if (data.status >= 200 && data.status < 300) {\n setMessageStatus('success')\n setMessageText(copy?.authSuccessMessage || '')\n onSuccess?.()\n setTimeout(() => {\n onClose()\n }, 3000)\n } else {\n const errorCode = data?.data?.error_code ?? data?.error_code\n if (errorCode === '104') {\n onSuccess?.()\n setTimeout(() => {\n onClose()\n }, 3000)\n } else if (errorCode === '142') {\n setError(copy?.incorrectCodeError || 'Invalid verification code.')\n } else if (errorCode === '154') {\n setError(copy?.expiredCodeMessage || '')\n } else {\n setError(copy?.sendEmailErrorMessage || '')\n }\n }\n },\n }\n )\n }\n\n let timer = setTimeout(() => {\n setMessageStatus('')\n setMessageText('')\n clearTimeout(timer)\n }, 5000)\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n page_group: 'reg_sub_pop',\n position: 'auth_code',\n button_name: 'check_and_active',\n },\n })\n }, [\n code,\n copy?.codeEmptyError,\n copy?.authSuccessMessage,\n copy?.incorrectCodeError,\n copy?.expiredCodeMessage,\n copy?.sendEmailErrorMessage,\n locale,\n sendEmailData,\n triggerEmailValidation,\n onClose,\n onSuccess,\n ])\n\n return (\n <div className=\"relative\">\n <div>\n <Text\n className=\"text-[22px] font-extrabold leading-[120%] text-[#333] min-l:text-[24px] [&_abbr]:text-[#005d8e]\"\n html={copy?.authCodeTitle}\n />\n <Text\n as=\"p\"\n className=\"mt-3 text-[14px] font-semibold leading-[140%] text-[rgba(51,51,51,0.75)] min-l:text-base [&_abbr]:text-[#333]\"\n html={copy?.authCodeDesc?.replace('%email%', email || '')}\n />\n </div>\n <div className=\"mt-6\">\n <Text\n className=\"mt-4 text-[14px] !font-bold font-semibold leading-[140%] text-[#333] min-l:mt-6\"\n html={copy?.enterActiveCodeText}\n />\n <div className=\"my-3 grid grid-cols-6 gap-2\">\n {codeArray.map((item, index) => (\n <div key={index} className=\"col-span-1 aspect-1 text-[#555]\">\n <input\n ref={inputRef => {\n if (inputRef) {\n inputRefs.current[index] = inputRef\n }\n }}\n key={index}\n type=\"tel\"\n className={cn(\n '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',\n rounded && 'rounded-[12px]'\n )}\n value={item}\n autoComplete=\"false\"\n autoCorrect=\"false\"\n spellCheck=\"false\"\n autoCapitalize=\"false\"\n onChange={event => handleInputCodeChange(event, index)}\n onFocus={() => {\n setFocusIndex(index)\n }}\n onPaste={event => {\n const paste = event.clipboardData.getData('text')\n if (!Number.isNaN(Number(paste))) {\n const pastedCode = paste.split('').slice(0, 6)\n setCodeArray(pastedCode.concat(Array(6 - pastedCode.length).fill('')))\n if (pastedCode.length <= codeArray.length) {\n setFocusIndex(pastedCode.length - 1)\n }\n }\n }}\n onKeyDown={event => {\n const { value } = event.target as HTMLInputElement\n if (event.key === 'Backspace' && !value && index > 0) {\n setFocusIndex(index - 1)\n }\n }}\n />\n </div>\n ))}\n </div>\n\n {error && <Text className=\"mb-3 text-[14px] font-semibold leading-[120%] text-[#f84d4f]\" html={error} />}\n {copy?.authCodeContent && (\n <ul\n 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-[\"\u2022\"]'\n dangerouslySetInnerHTML={{ __html: copy?.authCodeContent }}\n />\n )}\n </div>\n <div className=\"mt-4 min-l:mt-6\">\n <Text className=\"text-base font-semibold leading-[100%] text-[#333]\" html={copy?.authCodeReceiveText} />{' '}\n {isStartCountDown ? (\n <Text\n html={copy?.retrieveText?.replace('%countdownTime%', countDown.toString())}\n className=\"cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline\"\n />\n ) : (\n <Text\n onClick={handleSendAgain}\n className={cn(\n 'cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline',\n {\n 'pointer-events-none': isStartCountDown || isSendingEmail,\n }\n )}\n html={copy?.sendAgainText}\n />\n )}\n <Button\n type=\"submit\"\n loading={emailValidationLoading}\n 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\"\n onClick={handleAuthCodeSubmit}\n >\n {copy.buttonText}\n </Button>\n </div>\n <Message status={messageStatus} message={messageText} />\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useState", "useCallback", "useRef", "useEffect", "Button", "Text", "useSendEmailValidation", "gaTrack", "cn", "useHeadlessContext", "useEmailValidation", "useCountDown", "Message", "useRegistration", "ROUNDED_BRANDS", "ActivatePanel", "copy", "onClose", "onSuccess", "locale", "brand", "email", "rounded", "isSendingEmail", "triggerSendValidationEmail", "sendEmailData", "emailValidationLoading", "triggerEmailValidation", "messageText", "setMessageText", "messageStatus", "setMessageStatus", "isStartCountDown", "startCountDown", "countDown", "error", "setError", "focusIndex", "setFocusIndex", "codeArray", "setCodeArray", "inputRefs", "code", "handleSendAgain", "handleInputCodeChange", "event", "index", "value", "old", "newCode", "handleAuthCodeSubmit", "token", "data", "errorCode", "timer", "item", "inputRef", "paste", "pastedCode"]
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { CompleteProfileCopy } from '../../type';
2
+ type Props = {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onSuccess?: () => void;
6
+ copy: CompleteProfileCopy;
7
+ shopifyStoreDomain?: string;
8
+ };
9
+ export declare function CompleteProfileModal({ isOpen, onClose, onSuccess, copy, shopifyStoreDomain }: Props): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as e,jsxs as l}from"react/jsx-runtime";import{useCallback as B,useEffect as O,useState as s}from"react";import{Button as M,Text as c}from"@anker-in/headless-ui";import{classNames as q}from"@anker-in/lib";import{CreditsModalContainer as A}from"../../../credits/modal/ModalContainer";import{useUpdateProfile as I}from"./hooks/useUpdateProfile";import T from"../../../credits/context/hooks/useCountries";import{useMemberPopupContext as U}from"../../context/provider";function W({isOpen:D,onClose:i,onSuccess:N,copy:a,shopifyStoreDomain:L=""}){const{profile:o,fetchCreditInfo:v,alpcConfig:h}=U(),{locale:S}=h,[r,C]=s(""),[d,g]=s(""),[n,k]=s(""),[m,P]=s(""),[p,w]=s(""),[x,f]=s(""),[u,b]=s(""),{updateProfile:y,isLoading:_}=I({locale:S,appName:h.appName}),{countries:z}=T({shopifyStoreDomain:L});O(()=>{o&&(C(o.first_name??""),g(o.last_name??""),k(o.phone_number??""),P(o.dob??""),w(o.country?.id??""))},[o]);const E=B(()=>{let t=!1;return r.trim()?f(""):(f(a.required),t=!0),d.trim()?b(""):(b(a.required),t=!0),t},[r,d,a.required]),F=B(async()=>{if(E())return;await y({first_name:r.trim(),last_name:d.trim(),phone_number:n,country:p,dob:m})&&(v(o?.user_id),N?.(),i())},[E,y,r,d,n,p,m,v,o,N,i]);return e(A,{isOpen:D,onClose:i,title:a.title,titleClassName:"!h-auto !border-b-0 !pb-0",className:"w-[540px] md:h-auto",useAnimation:!0,animationClassName:"md:translate-y-[100vh]",children:l("div",{className:"flex flex-col gap-[20px]",children:[a.subtitle&&e(c,{className:"text-[14px] text-[#1d1d1f]",html:a.subtitle}),l("div",{children:[e("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:a.email}),e("input",{className:"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] bg-[#f5f5f5] px-[12px] text-[14px] text-[#999]",value:o?.email??"",disabled:!0})]}),l("div",{children:[l("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:[a.firstName," ",e("span",{className:"text-[#f84d4f]",children:"*"})]}),e("input",{className:q("mt-[8px] h-[46px] w-full rounded-[4px] border px-[12px] text-[14px] outline-none",x?"border-[#f84d4f]":"border-[#d8d8d8]"),value:r,onChange:t=>{C(t.target.value),f("")}}),x&&e(c,{className:"mt-[4px] text-[12px] text-[#f84d4f]",html:x})]}),l("div",{children:[l("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:[a.lastName," ",e("span",{className:"text-[#f84d4f]",children:"*"})]}),e("input",{className:q("mt-[8px] h-[46px] w-full rounded-[4px] border px-[12px] text-[14px] outline-none",u?"border-[#f84d4f]":"border-[#d8d8d8]"),value:d,onChange:t=>{g(t.target.value),b("")}}),u&&e(c,{className:"mt-[4px] text-[12px] text-[#f84d4f]",html:u})]}),l("div",{children:[e("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:a.birthday}),e("input",{className:"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none",type:"date",value:m,onChange:t=>P(t.target.value)})]}),l("div",{children:[e("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:a.phone}),e("input",{className:"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none",value:n,onChange:t=>k(t.target.value)})]}),l("div",{children:[e("label",{className:"block text-[14px] font-semibold text-[#1d1d1f]",children:a.country}),l("select",{className:"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none",value:p,onChange:t=>w(t.target.value),children:[e("option",{value:""}),z.map(t=>e("option",{value:t.id,children:t.name},t.id))]})]}),l("div",{className:"flex gap-[12px]",children:[e(M,{variant:"secondary",size:"lg",className:"flex-1",onClick:i,disabled:_,children:a.cancel}),e(M,{variant:"primary",size:"lg",className:"flex-1",loading:_,onClick:F,children:a.save})]})]})})}export{W as CompleteProfileModal};
2
+ //# sourceMappingURL=CompleteProfileModal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Button, Text } from '@anker-in/headless-ui'\nimport { classNames as cn } from '@anker-in/lib'\nimport { CreditsModalContainer } from '../../../credits/modal/ModalContainer'\nimport type { CompleteProfileCopy } from '../../type'\nimport { useUpdateProfile } from './hooks/useUpdateProfile'\nimport useCountries from '../../../credits/context/hooks/useCountries'\nimport { useMemberPopupContext } from '../../context/provider'\n\ntype Props = {\n isOpen: boolean\n onClose: () => void\n onSuccess?: () => void\n copy: CompleteProfileCopy\n shopifyStoreDomain?: string\n}\n\nexport function CompleteProfileModal({ isOpen, onClose, onSuccess, copy, shopifyStoreDomain = '' }: Props) {\n const { profile, fetchCreditInfo, alpcConfig } = useMemberPopupContext()\n const { locale } = alpcConfig\n\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [phone, setPhone] = useState('')\n const [birthDay, setBirthDay] = useState('')\n const [country, setCountry] = useState('')\n const [firstNameError, setFirstNameError] = useState('')\n const [lastNameError, setLastNameError] = useState('')\n\n const { updateProfile, isLoading } = useUpdateProfile({ locale, appName: alpcConfig.appName })\n const { countries } = useCountries({ shopifyStoreDomain })\n\n useEffect(() => {\n if (profile) {\n setFirstName(profile.first_name ?? '')\n setLastName(profile.last_name ?? '')\n setPhone(profile.phone_number ?? '')\n setBirthDay(profile.dob ?? '')\n setCountry(profile.country?.id ?? '')\n }\n }, [profile])\n\n const validate = useCallback(() => {\n let hasError = false\n if (!firstName.trim()) {\n setFirstNameError(copy.required)\n hasError = true\n } else {\n setFirstNameError('')\n }\n if (!lastName.trim()) {\n setLastNameError(copy.required)\n hasError = true\n } else {\n setLastNameError('')\n }\n return hasError\n }, [firstName, lastName, copy.required])\n\n const handleSubmit = useCallback(async () => {\n if (validate()) return\n const success = await updateProfile({\n first_name: firstName.trim(),\n last_name: lastName.trim(),\n phone_number: phone,\n country,\n dob: birthDay,\n })\n if (success) {\n fetchCreditInfo(profile?.user_id)\n onSuccess?.()\n onClose()\n }\n }, [validate, updateProfile, firstName, lastName, phone, country, birthDay, fetchCreditInfo, profile, onSuccess, onClose])\n\n return (\n <CreditsModalContainer\n isOpen={isOpen}\n onClose={onClose}\n title={copy.title}\n titleClassName=\"!h-auto !border-b-0 !pb-0\"\n className=\"w-[540px] md:h-auto\"\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n >\n <div className=\"flex flex-col gap-[20px]\">\n {copy.subtitle && (\n <Text className=\"text-[14px] text-[#1d1d1f]\" html={copy.subtitle} />\n )}\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">{copy.email}</label>\n <input\n className=\"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] bg-[#f5f5f5] px-[12px] text-[14px] text-[#999]\"\n value={profile?.email ?? ''}\n disabled\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">\n {copy.firstName} <span className=\"text-[#f84d4f]\">*</span>\n </label>\n <input\n className={cn(\n 'mt-[8px] h-[46px] w-full rounded-[4px] border px-[12px] text-[14px] outline-none',\n firstNameError ? 'border-[#f84d4f]' : 'border-[#d8d8d8]'\n )}\n value={firstName}\n onChange={e => { setFirstName(e.target.value); setFirstNameError('') }}\n />\n {firstNameError && <Text className=\"mt-[4px] text-[12px] text-[#f84d4f]\" html={firstNameError} />}\n </div>\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">\n {copy.lastName} <span className=\"text-[#f84d4f]\">*</span>\n </label>\n <input\n className={cn(\n 'mt-[8px] h-[46px] w-full rounded-[4px] border px-[12px] text-[14px] outline-none',\n lastNameError ? 'border-[#f84d4f]' : 'border-[#d8d8d8]'\n )}\n value={lastName}\n onChange={e => { setLastName(e.target.value); setLastNameError('') }}\n />\n {lastNameError && <Text className=\"mt-[4px] text-[12px] text-[#f84d4f]\" html={lastNameError} />}\n </div>\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">{copy.birthday}</label>\n <input\n className=\"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none\"\n type=\"date\"\n value={birthDay}\n onChange={e => setBirthDay(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">{copy.phone}</label>\n <input\n className=\"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none\"\n value={phone}\n onChange={e => setPhone(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-semibold text-[#1d1d1f]\">{copy.country}</label>\n <select\n className=\"mt-[8px] h-[46px] w-full rounded-[4px] border border-[#d8d8d8] px-[12px] text-[14px] outline-none\"\n value={country}\n onChange={e => setCountry(e.target.value)}\n >\n <option value=\"\" />\n {countries.map((c: { id: string; name: string }) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n\n <div className=\"flex gap-[12px]\">\n <Button\n variant=\"secondary\"\n size=\"lg\"\n className=\"flex-1\"\n onClick={onClose}\n disabled={isLoading}\n >\n {copy.cancel}\n </Button>\n <Button\n variant=\"primary\"\n size=\"lg\"\n className=\"flex-1\"\n loading={isLoading}\n onClick={handleSubmit}\n >\n {copy.save}\n </Button>\n </div>\n </div>\n </CreditsModalContainer>\n )\n}\n"],
5
+ "mappings": "AAuFU,cAAAA,EAGF,QAAAC,MAHE,oBAvFV,OAAS,eAAAC,EAAa,aAAAC,EAAW,YAAAC,MAAgB,QACjD,OAAS,UAAAC,EAAQ,QAAAC,MAAY,wBAC7B,OAAS,cAAcC,MAAU,gBACjC,OAAS,yBAAAC,MAA6B,wCAEtC,OAAS,oBAAAC,MAAwB,2BACjC,OAAOC,MAAkB,8CACzB,OAAS,yBAAAC,MAA6B,yBAU/B,SAASC,EAAqB,CAAE,OAAAC,EAAQ,QAAAC,EAAS,UAAAC,EAAW,KAAAC,EAAM,mBAAAC,EAAqB,EAAG,EAAU,CACzG,KAAM,CAAE,QAAAC,EAAS,gBAAAC,EAAiB,WAAAC,CAAW,EAAIT,EAAsB,EACjE,CAAE,OAAAU,CAAO,EAAID,EAEb,CAACE,EAAWC,CAAY,EAAInB,EAAS,EAAE,EACvC,CAACoB,EAAUC,CAAW,EAAIrB,EAAS,EAAE,EACrC,CAACsB,EAAOC,CAAQ,EAAIvB,EAAS,EAAE,EAC/B,CAACwB,EAAUC,CAAW,EAAIzB,EAAS,EAAE,EACrC,CAAC0B,EAASC,CAAU,EAAI3B,EAAS,EAAE,EACnC,CAAC4B,EAAgBC,CAAiB,EAAI7B,EAAS,EAAE,EACjD,CAAC8B,EAAeC,CAAgB,EAAI/B,EAAS,EAAE,EAE/C,CAAE,cAAAgC,EAAe,UAAAC,CAAU,EAAI5B,EAAiB,CAAE,OAAAY,EAAQ,QAASD,EAAW,OAAQ,CAAC,EACvF,CAAE,UAAAkB,CAAU,EAAI5B,EAAa,CAAE,mBAAAO,CAAmB,CAAC,EAEzDd,EAAU,IAAM,CACVe,IACFK,EAAaL,EAAQ,YAAc,EAAE,EACrCO,EAAYP,EAAQ,WAAa,EAAE,EACnCS,EAAST,EAAQ,cAAgB,EAAE,EACnCW,EAAYX,EAAQ,KAAO,EAAE,EAC7Ba,EAAWb,EAAQ,SAAS,IAAM,EAAE,EAExC,EAAG,CAACA,CAAO,CAAC,EAEZ,MAAMqB,EAAWrC,EAAY,IAAM,CACjC,IAAIsC,EAAW,GACf,OAAKlB,EAAU,KAAK,EAIlBW,EAAkB,EAAE,GAHpBA,EAAkBjB,EAAK,QAAQ,EAC/BwB,EAAW,IAIRhB,EAAS,KAAK,EAIjBW,EAAiB,EAAE,GAHnBA,EAAiBnB,EAAK,QAAQ,EAC9BwB,EAAW,IAINA,CACT,EAAG,CAAClB,EAAWE,EAAUR,EAAK,QAAQ,CAAC,EAEjCyB,EAAevC,EAAY,SAAY,CAC3C,GAAIqC,EAAS,EAAG,OACA,MAAMH,EAAc,CAClC,WAAYd,EAAU,KAAK,EAC3B,UAAWE,EAAS,KAAK,EACzB,aAAcE,EACd,QAAAI,EACA,IAAKF,CACP,CAAC,IAECT,EAAgBD,GAAS,OAAO,EAChCH,IAAY,EACZD,EAAQ,EAEZ,EAAG,CAACyB,EAAUH,EAAed,EAAWE,EAAUE,EAAOI,EAASF,EAAUT,EAAiBD,EAASH,EAAWD,CAAO,CAAC,EAEzH,OACEd,EAACQ,EAAA,CACC,OAAQK,EACR,QAASC,EACT,MAAOE,EAAK,MACZ,eAAe,4BACf,UAAU,sBACV,aAAY,GACZ,mBAAmB,yBAEnB,SAAAf,EAAC,OAAI,UAAU,2BACZ,UAAAe,EAAK,UACJhB,EAACM,EAAA,CAAK,UAAU,6BAA6B,KAAMU,EAAK,SAAU,EAGpEf,EAAC,OACC,UAAAD,EAAC,SAAM,UAAU,iDAAkD,SAAAgB,EAAK,MAAM,EAC9EhB,EAAC,SACC,UAAU,gHACV,MAAOkB,GAAS,OAAS,GACzB,SAAQ,GACV,GACF,EAEAjB,EAAC,OACC,UAAAA,EAAC,SAAM,UAAU,iDACd,UAAAe,EAAK,UAAU,IAAChB,EAAC,QAAK,UAAU,iBAAiB,aAAC,GACrD,EACAA,EAAC,SACC,UAAWO,EACT,mFACAyB,EAAiB,mBAAqB,kBACxC,EACA,MAAOV,EACP,SAAUoB,GAAK,CAAEnB,EAAamB,EAAE,OAAO,KAAK,EAAGT,EAAkB,EAAE,CAAE,EACvE,EACCD,GAAkBhC,EAACM,EAAA,CAAK,UAAU,sCAAsC,KAAM0B,EAAgB,GACjG,EAEA/B,EAAC,OACC,UAAAA,EAAC,SAAM,UAAU,iDACd,UAAAe,EAAK,SAAS,IAAChB,EAAC,QAAK,UAAU,iBAAiB,aAAC,GACpD,EACAA,EAAC,SACC,UAAWO,EACT,mFACA2B,EAAgB,mBAAqB,kBACvC,EACA,MAAOV,EACP,SAAUkB,GAAK,CAAEjB,EAAYiB,EAAE,OAAO,KAAK,EAAGP,EAAiB,EAAE,CAAE,EACrE,EACCD,GAAiBlC,EAACM,EAAA,CAAK,UAAU,sCAAsC,KAAM4B,EAAe,GAC/F,EAEAjC,EAAC,OACC,UAAAD,EAAC,SAAM,UAAU,iDAAkD,SAAAgB,EAAK,SAAS,EACjFhB,EAAC,SACC,UAAU,oGACV,KAAK,OACL,MAAO4B,EACP,SAAUc,GAAKb,EAAYa,EAAE,OAAO,KAAK,EAC3C,GACF,EAEAzC,EAAC,OACC,UAAAD,EAAC,SAAM,UAAU,iDAAkD,SAAAgB,EAAK,MAAM,EAC9EhB,EAAC,SACC,UAAU,oGACV,MAAO0B,EACP,SAAUgB,GAAKf,EAASe,EAAE,OAAO,KAAK,EACxC,GACF,EAEAzC,EAAC,OACC,UAAAD,EAAC,SAAM,UAAU,iDAAkD,SAAAgB,EAAK,QAAQ,EAChFf,EAAC,UACC,UAAU,oGACV,MAAO6B,EACP,SAAUY,GAAKX,EAAWW,EAAE,OAAO,KAAK,EAExC,UAAA1C,EAAC,UAAO,MAAM,GAAG,EAChBsC,EAAU,IAAKK,GACd3C,EAAC,UAAkB,MAAO2C,EAAE,GAAK,SAAAA,EAAE,MAAtBA,EAAE,EAAyB,CACzC,GACH,GACF,EAEA1C,EAAC,OAAI,UAAU,kBACb,UAAAD,EAACK,EAAA,CACC,QAAQ,YACR,KAAK,KACL,UAAU,SACV,QAASS,EACT,SAAUuB,EAET,SAAArB,EAAK,OACR,EACAhB,EAACK,EAAA,CACC,QAAQ,UACR,KAAK,KACL,UAAU,SACV,QAASgC,EACT,QAASI,EAER,SAAAzB,EAAK,KACR,GACF,GACF,EACF,CAEJ",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Text", "cn", "CreditsModalContainer", "useUpdateProfile", "useCountries", "useMemberPopupContext", "CompleteProfileModal", "isOpen", "onClose", "onSuccess", "copy", "shopifyStoreDomain", "profile", "fetchCreditInfo", "alpcConfig", "locale", "firstName", "setFirstName", "lastName", "setLastName", "phone", "setPhone", "birthDay", "setBirthDay", "country", "setCountry", "firstNameError", "setFirstNameError", "lastNameError", "setLastNameError", "updateProfile", "isLoading", "countries", "validate", "hasError", "handleSubmit", "e", "c"]
7
+ }
@@ -0,0 +1,9 @@
1
+ import type { CompleteProfileCopy } from '../../type';
2
+ type Props = {
3
+ copy: CompleteProfileCopy;
4
+ shopifyStoreDomain?: string;
5
+ onClose: () => void;
6
+ onSuccess?: () => void;
7
+ };
8
+ export default function CompleteProfilePanel({ copy, shopifyStoreDomain, onClose, onSuccess }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as o}from"react/jsx-runtime";import{useCallback as S,useEffect as A,useState as r}from"react";import{Button as q,Text as v}from"@anker-in/headless-ui";import{classNames as s,useHeadlessContext as H}from"@anker-in/lib";import{useUpdateProfile as I}from"./hooks/useUpdateProfile";import M from"../../../credits/context/hooks/useCountries";import{useMemberPopupContext as O}from"../../context/provider";import{ROUNDED_BRANDS as T}from"../../../../constants";function G({copy:a,shopifyStoreDomain:L="",onClose:p,onSuccess:h}){const{profile:l,fetchCreditInfo:g,alpcConfig:C}=O(),{locale:z}=C,{brand:F}=H(),n=T.includes(F),[d,k]=r(""),[i,P]=r(""),[x,_]=r(""),[m,w]=r(""),[u,y]=r(""),[f,c]=r(""),[b,N]=r(""),{updateProfile:E,isLoading:D}=I({locale:z,appName:C.appName}),{countries:R}=M({shopifyStoreDomain:L});A(()=>{l&&(k(l.first_name??""),P(l.last_name??""),_(l.phone_number??""),w(l.dob??""),y(l.country?.id??""))},[l]);const B=S(()=>{let e=!1;return d.trim()?c(""):(c(a.required),e=!0),i.trim()?N(""):(N(a.required),e=!0),e},[d,i,a.required]),U=S(async()=>{if(B())return;await E({first_name:d.trim(),last_name:i.trim(),phone_number:x,country:u,dob:m})&&(g(l?.user_id),h?.(),p())},[B,E,d,i,x,u,m,g,l,h,p]);return o("div",{className:"flex flex-col gap-[20px]",children:[a.subtitle&&t(v,{className:"text-[14px] text-[#1d1d1f]",html:a.subtitle}),o("div",{children:[t("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:a.email}),t("input",{className:s("mt-[8px] h-[46px] w-full border border-[#d8d8d8] bg-[#f5f5f5] px-[12px] text-[14px] text-[#999]",n?"rounded-[4px]":"rounded-none"),value:l?.email??"",disabled:!0})]}),o("div",{children:[o("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:[a.firstName," ",t("span",{className:"text-[#f84d4f]",children:"*"})]}),t("input",{className:s("mt-[8px] h-[46px] w-full border px-[12px] text-[14px] outline-none",f?"border-[#f84d4f]":"border-[#d8d8d8]",n?"rounded-[4px]":"rounded-none"),value:d,onChange:e=>{k(e.target.value),c("")}}),f&&t(v,{className:"mt-[4px] text-[12px] text-[#f84d4f]",html:f})]}),o("div",{children:[o("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:[a.lastName," ",t("span",{className:"text-[#f84d4f]",children:"*"})]}),t("input",{className:s("mt-[8px] h-[46px] w-full border px-[12px] text-[14px] outline-none",b?"border-[#f84d4f]":"border-[#d8d8d8]",n?"rounded-[4px]":"rounded-none"),value:i,onChange:e=>{P(e.target.value),N("")}}),b&&t(v,{className:"mt-[4px] text-[12px] text-[#f84d4f]",html:b})]}),o("div",{children:[t("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:a.birthday}),t("input",{className:s("mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none",n?"rounded-[4px]":"rounded-none"),type:"date",value:m,onChange:e=>w(e.target.value)})]}),o("div",{children:[t("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:a.phone}),t("input",{className:s("mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none",n?"rounded-[4px]":"rounded-none"),value:x,onChange:e=>_(e.target.value)})]}),o("div",{children:[t("label",{className:"block text-[14px] font-[700] text-[#1d1d1f]",children:a.country}),o("select",{className:s("mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none",n?"rounded-[4px]":"rounded-none"),value:u,onChange:e=>y(e.target.value),children:[t("option",{value:""}),R.map(e=>t("option",{value:e.id,children:e.name},e.id))]})]}),o("div",{className:"flex gap-[12px]",children:[t(q,{variant:"secondary",size:"lg",className:"flex-1",onClick:p,disabled:D,children:a.cancel}),t(q,{variant:"primary",size:"lg",className:"flex-1",loading:D,onClick:U,children:a.save})]})]})}export{G as default};
2
+ //# sourceMappingURL=CompleteProfilePanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Button, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport type { CompleteProfileCopy } from '../../type'\nimport { useUpdateProfile } from './hooks/useUpdateProfile'\nimport useCountries from '../../../credits/context/hooks/useCountries'\nimport { useMemberPopupContext } from '../../context/provider'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n copy: CompleteProfileCopy\n shopifyStoreDomain?: string\n onClose: () => void\n onSuccess?: () => void\n}\n\nexport default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', onClose, onSuccess }: Props) {\n const { profile, fetchCreditInfo, alpcConfig } = useMemberPopupContext()\n const { locale } = alpcConfig\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [phone, setPhone] = useState('')\n const [birthDay, setBirthDay] = useState('')\n const [country, setCountry] = useState('')\n const [firstNameError, setFirstNameError] = useState('')\n const [lastNameError, setLastNameError] = useState('')\n\n const { updateProfile, isLoading } = useUpdateProfile({ locale, appName: alpcConfig.appName })\n const { countries } = useCountries({ shopifyStoreDomain })\n\n useEffect(() => {\n if (profile) {\n setFirstName(profile.first_name ?? '')\n setLastName(profile.last_name ?? '')\n setPhone(profile.phone_number ?? '')\n setBirthDay(profile.dob ?? '')\n setCountry(profile.country?.id ?? '')\n }\n }, [profile])\n\n const validate = useCallback(() => {\n let hasError = false\n if (!firstName.trim()) {\n setFirstNameError(copy.required)\n hasError = true\n } else {\n setFirstNameError('')\n }\n if (!lastName.trim()) {\n setLastNameError(copy.required)\n hasError = true\n } else {\n setLastNameError('')\n }\n return hasError\n }, [firstName, lastName, copy.required])\n\n const handleSubmit = useCallback(async () => {\n if (validate()) return\n const success = await updateProfile({\n first_name: firstName.trim(),\n last_name: lastName.trim(),\n phone_number: phone,\n country,\n dob: birthDay,\n })\n if (success) {\n fetchCreditInfo(profile?.user_id)\n onSuccess?.()\n onClose()\n }\n }, [validate, updateProfile, firstName, lastName, phone, country, birthDay, fetchCreditInfo, profile, onSuccess, onClose])\n\n return (\n <div className=\"flex flex-col gap-[20px]\">\n {copy.subtitle && (\n <Text className=\"text-[14px] text-[#1d1d1f]\" html={copy.subtitle} />\n )}\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">{copy.email}</label>\n <input\n className={cn('mt-[8px] h-[46px] w-full border border-[#d8d8d8] bg-[#f5f5f5] px-[12px] text-[14px] text-[#999]', rounded ? 'rounded-[4px]' : 'rounded-none')}\n value={profile?.email ?? ''}\n disabled\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">\n {copy.firstName} <span className=\"text-[#f84d4f]\">*</span>\n </label>\n <input\n className={cn(\n 'mt-[8px] h-[46px] w-full border px-[12px] text-[14px] outline-none',\n firstNameError ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n value={firstName}\n onChange={e => { setFirstName(e.target.value); setFirstNameError('') }}\n />\n {firstNameError && <Text className=\"mt-[4px] text-[12px] text-[#f84d4f]\" html={firstNameError} />}\n </div>\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">\n {copy.lastName} <span className=\"text-[#f84d4f]\">*</span>\n </label>\n <input\n className={cn(\n 'mt-[8px] h-[46px] w-full border px-[12px] text-[14px] outline-none',\n lastNameError ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n value={lastName}\n onChange={e => { setLastName(e.target.value); setLastNameError('') }}\n />\n {lastNameError && <Text className=\"mt-[4px] text-[12px] text-[#f84d4f]\" html={lastNameError} />}\n </div>\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">{copy.birthday}</label>\n <input\n className={cn('mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none', rounded ? 'rounded-[4px]' : 'rounded-none')}\n type=\"date\"\n value={birthDay}\n onChange={e => setBirthDay(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">{copy.phone}</label>\n <input\n className={cn('mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none', rounded ? 'rounded-[4px]' : 'rounded-none')}\n value={phone}\n onChange={e => setPhone(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"block text-[14px] font-[700] text-[#1d1d1f]\">{copy.country}</label>\n <select\n className={cn('mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none', rounded ? 'rounded-[4px]' : 'rounded-none')}\n value={country}\n onChange={e => setCountry(e.target.value)}\n >\n <option value=\"\" />\n {countries.map((c: { id: string; name: string }) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n\n <div className=\"flex gap-[12px]\">\n <Button\n variant=\"secondary\"\n size=\"lg\"\n className=\"flex-1\"\n onClick={onClose}\n disabled={isLoading}\n >\n {copy.cancel}\n </Button>\n <Button\n variant=\"primary\"\n size=\"lg\"\n className=\"flex-1\"\n loading={isLoading}\n onClick={handleSubmit}\n >\n {copy.save}\n </Button>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Text", "cn", "useHeadlessContext", "useUpdateProfile", "useCountries", "useMemberPopupContext", "ROUNDED_BRANDS", "CompleteProfilePanel", "copy", "shopifyStoreDomain", "onClose", "onSuccess", "profile", "fetchCreditInfo", "alpcConfig", "locale", "brand", "rounded", "firstName", "setFirstName", "lastName", "setLastName", "phone", "setPhone", "birthDay", "setBirthDay", "country", "setCountry", "firstNameError", "setFirstNameError", "lastNameError", "setLastNameError", "updateProfile", "isLoading", "countries", "validate", "hasError", "handleSubmit", "c"]
7
+ }
@@ -0,0 +1,9 @@
1
+ import type { SubscribeModalCopy } from '../../type';
2
+ type Props = {
3
+ copy: SubscribeModalCopy;
4
+ email?: string;
5
+ onClose: () => void;
6
+ onSuccess?: () => void;
7
+ };
8
+ export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose, onSuccess }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as d}from"react/jsx-runtime";import{useCallback as P,useEffect as T,useState as i}from"react";import{Checkbox as D,Text as C}from"@anker-in/headless-ui";import{classNames as p,useHeadlessContext as E}from"@anker-in/lib";import c from"js-cookie";import{parse as L}from"query-string";import{emailValidate as O}from"../../../credits/context/utils";import{useMemberPopupContext as A}from"../../context/provider";import{ROUNDED_BRANDS as B}from"../../../../constants";function H(){if(typeof window>"u")return{register_source:""};const{search:e,href:o}=window.location,a=L(e);return{fbuy_ref_code:c.get("fbuy_ref_code"),ref:c.get("ref_ads"),inviter_code:a.ic??a.inviter_code??c.get("inviter_code"),register_source:a.redirect??c.get("reg_source")??o}}function I({copy:e,email:o,onClose:a,onSuccess:m}){const{alpcConfig:S}=A(),{brand:x,locale:b}=S,{brand:w}=E(),g=B.includes(w),[u,h]=i(!1),[l,v]=i(o??""),[n,s]=i(""),[f,_]=i(""),[k,y]=i(!1);T(()=>{o&&v(o)},[o]);const M=P(async()=>{if(s(""),!l)return s("Please fill in your email");if(!O(l))return s("Invalid email address");if(!u)return s("Please agree to the policy");y(!0);const{register_source:r}=H();try{const N=await(await fetch("/api/multipass/subscribe/subscribe_emails",{method:"POST",headers:{"Content-Type":"application/json","current-language":b},body:JSON.stringify({email:l,register_source:r,brand:x,deals_type:e.dealsType??"vip_subscribe"})})).json();N.errors?s(N.errors??"Error occurred"):(_(e.successTips??"Subscribed successfully!"),m?.(),setTimeout(()=>{_(""),a()},3e3))}catch{s("Network error")}finally{y(!1)}},[l,u,b,x,e,a,m]);return d("div",{className:"flex flex-col gap-[12px]",children:[d("div",{className:"flex flex-col gap-[8px]",children:[e.title&&t("h2",{className:"text-[24px] font-[700] leading-[1.2] text-[#080a0f]",children:e.title}),e.desc&&t(C,{className:"text-[16px] text-[#1e2024]",html:e.desc})]}),d("div",{className:"flex flex-col gap-[16px]",children:[t("input",{className:p("h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]",n?"border-[#f84d4f]":"border-[#d8d8d8]",g?"rounded-[4px]":"rounded-none"),placeholder:e.placeholder,value:l,onChange:r=>{s(""),v(r.target.value.trim())}}),d("div",{className:"flex w-full items-start gap-[8px]",children:[t(D,{checked:u,onCheckedChange:()=>h(r=>!r),className:"mt-[2px] border-[#1d1d1f]"}),t("label",{className:"cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline",onClick:()=>h(r=>!r),dangerouslySetInnerHTML:{__html:e.policy??""}})]}),(n||f)&&t("div",{className:p("text-[14px] font-[700]",n&&"text-[#f84d4f]",f&&"text-[#52c41a]"),children:t(C,{html:f||n})}),t("button",{className:p("w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60",g?"rounded-[4px]":"rounded-none"),disabled:k,onClick:M,children:e.buttonLabel??"Subscribe"})]})]})}export{I as default};
2
+ //# sourceMappingURL=SubscribeEmailPanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Checkbox, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport Cookies from 'js-cookie'\nimport { parse } from 'query-string'\nimport { emailValidate } from '../../../credits/context/utils'\nimport { useMemberPopupContext } from '../../context/provider'\nimport type { SubscribeModalCopy } from '../../type'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n copy: SubscribeModalCopy\n email?: string\n onClose: () => void\n onSuccess?: () => void\n}\n\nfunction getAdCookie() {\n if (typeof window === 'undefined') return { register_source: '' }\n const { search, href } = window.location\n const query = parse(search)\n return {\n fbuy_ref_code: Cookies.get('fbuy_ref_code'),\n ref: Cookies.get('ref_ads'),\n inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),\n register_source: query.redirect ?? Cookies.get('reg_source') ?? href,\n }\n}\n\nexport default function SubscribeEmailPanel({ copy, email: initialEmail, onClose, onSuccess }: Props) {\n const { alpcConfig } = useMemberPopupContext()\n const { brand, locale } = alpcConfig\n const { brand: headlessBrand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(headlessBrand)\n const [policy, setPolicy] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [errorMessage, setErrorMessage] = useState('')\n const [successMessage, setSuccessMessage] = useState('')\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (initialEmail) setEmail(initialEmail)\n }, [initialEmail])\n\n const handleSubmit = useCallback(async () => {\n setErrorMessage('')\n if (!email) return setErrorMessage('Please fill in your email')\n if (!emailValidate(email)) return setErrorMessage('Invalid email address')\n if (!policy) return setErrorMessage('Please agree to the policy')\n\n setLoading(true)\n const { register_source } = getAdCookie()\n try {\n const response = await fetch('/api/multipass/subscribe/subscribe_emails', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'current-language': locale },\n body: JSON.stringify({\n email,\n register_source,\n brand,\n deals_type: copy.dealsType ?? 'vip_subscribe',\n }),\n })\n const result = await response.json()\n if (!result.errors) {\n setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')\n onSuccess?.()\n setTimeout(() => {\n setSuccessMessage('')\n onClose()\n }, 3000)\n } else {\n setErrorMessage(result.errors ?? 'Error occurred')\n }\n } catch {\n setErrorMessage('Network error')\n } finally {\n setLoading(false)\n }\n }, [email, policy, locale, brand, copy, onClose, onSuccess])\n\n return (\n <div className=\"flex flex-col gap-[12px]\">\n <div className=\"flex flex-col gap-[8px]\">\n {copy.title && (\n <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>\n )}\n {copy.desc && (\n <Text className=\"text-[16px] text-[#1e2024]\" html={copy.desc} />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[16px]\">\n <input\n className={cn(\n 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',\n errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n placeholder={copy.placeholder}\n value={email}\n onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}\n />\n\n <div className=\"flex w-full items-start gap-[8px]\">\n <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className=\"mt-[2px] border-[#1d1d1f]\" />\n <label\n className=\"cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline\"\n onClick={() => setPolicy(v => !v)}\n dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}\n />\n </div>\n\n {(errorMessage || successMessage) && (\n <div className={cn('text-[14px] font-[700]', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>\n <Text html={successMessage || errorMessage} />\n </div>\n )}\n\n <button\n className={cn('w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60', rounded ? 'rounded-[4px]' : 'rounded-none')}\n disabled={loading}\n onClick={handleSubmit}\n >\n {copy.buttonLabel ?? 'Subscribe'}\n </button>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Checkbox", "Text", "cn", "useHeadlessContext", "Cookies", "parse", "emailValidate", "useMemberPopupContext", "ROUNDED_BRANDS", "getAdCookie", "search", "href", "query", "SubscribeEmailPanel", "copy", "initialEmail", "onClose", "onSuccess", "alpcConfig", "brand", "locale", "headlessBrand", "rounded", "policy", "setPolicy", "email", "setEmail", "errorMessage", "setErrorMessage", "successMessage", "setSuccessMessage", "loading", "setLoading", "handleSubmit", "register_source", "result", "e", "v"]
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { SubscribeModalCopy } from '../../type';
2
+ type Props = {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onSuccess?: () => void;
6
+ copy: SubscribeModalCopy;
7
+ email?: string;
8
+ };
9
+ export declare function EarnCreditsSubscribeModal({ isOpen, onClose, onSuccess, copy, email: initialEmail }: Props): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as x}from"react/jsx-runtime";import{useCallback as B,useEffect as D,useState as d}from"react";import{Button as R,Checkbox as A,Text as f}from"@anker-in/headless-ui";import{classNames as c,useHeadlessContext as E}from"@anker-in/lib";import u from"js-cookie";import{parse as L}from"query-string";import{CreditsModalContainer as H}from"../../../credits/modal/ModalContainer";import{emailValidate as I}from"../../../credits/context/utils";import{useMemberPopupContext as j}from"../../context/provider";import{ROUNDED_BRANDS as q}from"../../../../constants";function J(){if(typeof window>"u")return{register_source:""};const{search:o,href:n}=window.location,s=L(o);return{fbuy_ref_code:u.get("fbuy_ref_code"),ref:u.get("ref_ads"),inviter_code:s.ic??s.inviter_code??u.get("inviter_code"),register_source:s.redirect??u.get("reg_source")??n}}async function U(o){if(typeof window>"u"||!window?.grecaptcha?.execute||!o)return"";try{return await window.grecaptcha.execute(o,{action:"activity"})}catch{return""}}function $({isOpen:o,onClose:n,onSuccess:s,copy:e,email:l}){const{alpcConfig:N}=j(),{locale:b}=N,{brand:S,storeDomain:g,recaptchaSitekey:k}=E(),m=q.includes(S),[p,M]=d(!1),[a,h]=d(l??""),[_,r]=d(""),[y,v]=d(""),[T,w]=d(!1);D(()=>{l&&h(l)},[l]);const P=B(async()=>{if(r(""),!a)return r("Please fill in your email");if(!I(a))return r("Invalid email address");if(!p)return r("Please agree to the policy");w(!0);const{register_source:i}=J(),O=await U(k||"");try{const C=await(await fetch("/api/multipass/rainbowbridge/activities",{method:"POST",headers:{"Content-Type":"application/json","current-language":b,"X-Recaptcha-Token":O},body:JSON.stringify({email:a,register_source:i,shopify_domain:g,single_brand_subscribe:e.single_brand_subscribe??!0,genre:e.genre??e.dealsType??"",sub_brand_type:e.sub_brand_type??""})})).json();C.errors?r(C.errors??"Error occurred"):(v(e.successTips??"Subscribed successfully!"),s?.(),setTimeout(()=>{v(""),n()},3e3))}catch{r("Network error")}finally{w(!1)}},[a,p,b,g,e,s,n]);return t(H,{isOpen:o,onClose:n,className:"w-[540px] md:h-auto",scrollClassName:"mb-[40px] md:mb-[24px]",useAnimation:!0,animationClassName:"md:translate-y-[100vh]",children:x("div",{className:"flex flex-col gap-[16px] text-center",children:[t(f,{className:"text-[22px] font-bold",html:e.title}),e.desc&&t(f,{className:"text-left text-[16px] font-semibold text-[#1f2021]",html:e.desc}),x("div",{className:c("flex h-[52px] w-full overflow-hidden md:flex-col md:h-auto md:gap-[16px]",m?"rounded-[2px]":"rounded-none"),children:[t("input",{className:c("h-full flex-1 border border-[#d8d8d8] px-[14px] text-[16px] outline-none placeholder:text-[#999] md:h-[52px]",m?"rounded-l-[2px] md:rounded-[2px]":"rounded-none"),placeholder:e.placeholder,value:a,onChange:i=>{r(""),h(i.target.value.trim())}}),t(R,{variant:"primary",loading:T,className:c("!h-full !min-w-0 !px-[24px] md:!h-[46px]",m?"!rounded-l-none !rounded-r-[2px] md:!rounded-[2px]":"!rounded-none"),onClick:P,children:e.buttonLabel??"Subscribe"})]}),x("div",{className:"flex w-full items-start gap-[8px]",children:[t(A,{checked:p,onCheckedChange:()=>M(i=>!i),className:"border-[#1d1d1f]"}),t("label",{className:"text-left text-[14px] font-semibold text-[#777] [&_a]:underline",dangerouslySetInnerHTML:{__html:e.policy??""}})]}),t("div",{className:c("text-left text-[16px] font-semibold",_&&"text-[#f84d4f]",y&&"text-[#52c41a]"),children:t(f,{html:y||_||""})})]})})}export{$ as EarnCreditsSubscribeModal};
2
+ //# sourceMappingURL=SubscribeModal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/SubscribeModal.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Button, Checkbox, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport Cookies from 'js-cookie'\nimport { parse } from 'query-string'\nimport { CreditsModalContainer } from '../../../credits/modal/ModalContainer'\nimport { emailValidate } from '../../../credits/context/utils'\nimport { useMemberPopupContext } from '../../context/provider'\nimport type { SubscribeModalCopy } from '../../type'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n isOpen: boolean\n onClose: () => void\n onSuccess?: () => void\n copy: SubscribeModalCopy\n email?: string\n}\n\nfunction getAdCookie() {\n if (typeof window === 'undefined') return { register_source: '' }\n const { search, href } = window.location\n const query = parse(search)\n return {\n fbuy_ref_code: Cookies.get('fbuy_ref_code'),\n ref: Cookies.get('ref_ads'),\n inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),\n register_source: query.redirect ?? Cookies.get('reg_source') ?? href,\n }\n}\n\nasync function getRecaptchaToken(sitekey: string): Promise<string> {\n if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''\n if (!sitekey) return ''\n try {\n return await window.grecaptcha.execute(sitekey, { action: 'activity' })\n } catch {\n return ''\n }\n}\n\nexport function EarnCreditsSubscribeModal({ isOpen, onClose, onSuccess, copy, email: initialEmail }: Props) {\n const { alpcConfig } = useMemberPopupContext()\n const { locale } = alpcConfig\n const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(headlessBrand)\n const [policy, setPolicy] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [errorMessage, setErrorMessage] = useState('')\n const [successMessage, setSuccessMessage] = useState('')\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (initialEmail) setEmail(initialEmail)\n }, [initialEmail])\n\n const handleSubmit = useCallback(async () => {\n setErrorMessage('')\n if (!email) return setErrorMessage('Please fill in your email')\n if (!emailValidate(email)) return setErrorMessage('Invalid email address')\n if (!policy) return setErrorMessage('Please agree to the policy')\n\n setLoading(true)\n const { register_source } = getAdCookie()\n const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')\n try {\n const response = await fetch('/api/multipass/rainbowbridge/activities', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'current-language': locale,\n 'X-Recaptcha-Token': recaptchaToken,\n },\n body: JSON.stringify({\n email,\n register_source,\n shopify_domain: storeDomain,\n single_brand_subscribe: copy.single_brand_subscribe ?? true,\n genre: copy.genre ?? copy.dealsType ?? '',\n sub_brand_type: copy.sub_brand_type ?? '',\n }),\n })\n const result = await response.json()\n if (!result.errors) {\n setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')\n onSuccess?.()\n setTimeout(() => {\n setSuccessMessage('')\n onClose()\n }, 3000)\n } else {\n setErrorMessage(result.errors ?? 'Error occurred')\n }\n } catch {\n setErrorMessage('Network error')\n } finally {\n setLoading(false)\n }\n }, [email, policy, locale, storeDomain, copy, onSuccess, onClose])\n\n return (\n <CreditsModalContainer\n isOpen={isOpen}\n onClose={onClose}\n className=\"w-[540px] md:h-auto\"\n scrollClassName=\"mb-[40px] md:mb-[24px]\"\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n >\n <div className=\"flex flex-col gap-[16px] text-center\">\n <Text className=\"text-[22px] font-bold\" html={copy.title} />\n {copy.desc && (\n <Text className=\"text-left text-[16px] font-semibold text-[#1f2021]\" html={copy.desc} />\n )}\n <div className={cn('flex h-[52px] w-full overflow-hidden md:flex-col md:h-auto md:gap-[16px]', rounded ? 'rounded-[2px]' : 'rounded-none')}>\n <input\n 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')}\n placeholder={copy.placeholder}\n value={email}\n onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}\n />\n <Button\n variant=\"primary\"\n loading={loading}\n className={cn('!h-full !min-w-0 !px-[24px] md:!h-[46px]', rounded ? '!rounded-l-none !rounded-r-[2px] md:!rounded-[2px]' : '!rounded-none')}\n onClick={handleSubmit}\n >\n {copy.buttonLabel ?? 'Subscribe'}\n </Button>\n </div>\n <div className=\"flex w-full items-start gap-[8px]\">\n <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className=\"border-[#1d1d1f]\" />\n <label\n className=\"text-left text-[14px] font-semibold text-[#777] [&_a]:underline\"\n dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}\n />\n </div>\n <div className={cn('text-left text-[16px] font-semibold', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>\n <Text html={successMessage || errorMessage || ''} />\n </div>\n </div>\n </CreditsModalContainer>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Checkbox", "Text", "cn", "useHeadlessContext", "Cookies", "parse", "CreditsModalContainer", "emailValidate", "useMemberPopupContext", "ROUNDED_BRANDS", "getAdCookie", "search", "href", "query", "getRecaptchaToken", "sitekey", "EarnCreditsSubscribeModal", "isOpen", "onClose", "onSuccess", "copy", "initialEmail", "alpcConfig", "locale", "headlessBrand", "storeDomain", "recaptchaSitekey", "rounded", "policy", "setPolicy", "email", "setEmail", "errorMessage", "setErrorMessage", "successMessage", "setSuccessMessage", "loading", "setLoading", "handleSubmit", "register_source", "recaptchaToken", "result", "e", "v"]
7
+ }
@@ -0,0 +1,9 @@
1
+ import type { SubscribeModalCopy } from '../../type';
2
+ type Props = {
3
+ copy: SubscribeModalCopy;
4
+ email?: string;
5
+ onClose: () => void;
6
+ onSuccess?: () => void;
7
+ };
8
+ export default function SubscribePanel({ copy, email: initialEmail, onClose, onSuccess }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as d}from"react/jsx-runtime";import{useCallback as D,useEffect as R,useState as i}from"react";import{Checkbox as L,Text as N}from"@anker-in/headless-ui";import{classNames as p,useHeadlessContext as O}from"@anker-in/lib";import l from"js-cookie";import{parse as A}from"query-string";import{emailValidate as B}from"../../../credits/context/utils";import{useMemberPopupContext as E}from"../../context/provider";import{ROUNDED_BRANDS as H}from"../../../../constants";function I(){if(typeof window>"u")return{register_source:""};const{search:e,href:o}=window.location,a=A(e);return{fbuy_ref_code:l.get("fbuy_ref_code"),ref:l.get("ref_ads"),inviter_code:a.ic??a.inviter_code??l.get("inviter_code"),register_source:a.redirect??l.get("reg_source")??o}}async function j(e){if(typeof window>"u"||!window?.grecaptcha?.execute||!e)return"";try{return await window.grecaptcha.execute(e,{action:"activity"})}catch{return""}}function q({copy:e,email:o,onClose:a,onSuccess:m}){const{alpcConfig:C}=E(),{locale:x}=C,{brand:S,storeDomain:b,recaptchaSitekey:k}=O(),g=H.includes(S),[u,h]=i(!1),[n,_]=i(o??""),[c,r]=i(""),[f,y]=i(""),[T,v]=i(!1);R(()=>{o&&_(o)},[o]);const P=D(async()=>{if(r(""),!n)return r("Please fill in your email");if(!B(n))return r("Invalid email address");if(!u)return r("Please agree to the policy");v(!0);const{register_source:s}=I(),M=await j(k||"");try{const w=await(await fetch("/api/multipass/rainbowbridge/activities",{method:"POST",headers:{"Content-Type":"application/json","current-language":x,"X-Recaptcha-Token":M},body:JSON.stringify({email:n,register_source:s,shopify_domain:b,single_brand_subscribe:e.single_brand_subscribe??!0,genre:e.genre??e.dealsType??"",sub_brand_type:e.sub_brand_type??""})})).json();w.errors?r(w.errors??"Error occurred"):(y(e.successTips??"Subscribed successfully!"),m?.(),setTimeout(()=>{y(""),a()},3e3))}catch{r("Network error")}finally{v(!1)}},[n,u,x,b,e,a,m]);return d("div",{className:"flex flex-col gap-[12px]",children:[d("div",{className:"flex flex-col gap-[8px]",children:[e.title&&t("h2",{className:"text-[24px] font-[700] leading-[1.2] text-[#080a0f]",children:e.title}),e.desc&&t(N,{className:"text-[16px] text-[#1e2024]",html:e.desc})]}),d("div",{className:"flex flex-col gap-[16px]",children:[t("input",{className:p("h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]",c?"border-[#f84d4f]":"border-[#d8d8d8]",g?"rounded-[4px]":"rounded-none"),placeholder:e.placeholder,value:n,onChange:s=>{r(""),_(s.target.value.trim())}}),d("div",{className:"flex w-full items-start gap-[8px]",children:[t(L,{checked:u,onCheckedChange:()=>h(s=>!s),className:"mt-[2px] border-[#1d1d1f]"}),t("label",{className:"cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline",onClick:()=>h(s=>!s),dangerouslySetInnerHTML:{__html:e.policy??""}})]}),(c||f)&&t("div",{className:p("text-[14px] font-[700]",c&&"text-[#f84d4f]",f&&"text-[#52c41a]"),children:t(N,{html:f||c})}),t("button",{className:p("w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60",g?"rounded-[4px]":"rounded-none"),disabled:T,onClick:P,children:e.buttonLabel??"Subscribe"})]})]})}export{q as default};
2
+ //# sourceMappingURL=SubscribePanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/SubscribePanel.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Checkbox, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport Cookies from 'js-cookie'\nimport { parse } from 'query-string'\nimport { emailValidate } from '../../../credits/context/utils'\nimport { useMemberPopupContext } from '../../context/provider'\nimport type { SubscribeModalCopy } from '../../type'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n copy: SubscribeModalCopy\n email?: string\n onClose: () => void\n onSuccess?: () => void\n}\n\nfunction getAdCookie() {\n if (typeof window === 'undefined') return { register_source: '' }\n const { search, href } = window.location\n const query = parse(search)\n return {\n fbuy_ref_code: Cookies.get('fbuy_ref_code'),\n ref: Cookies.get('ref_ads'),\n inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),\n register_source: query.redirect ?? Cookies.get('reg_source') ?? href,\n }\n}\n\nasync function getRecaptchaToken(sitekey: string): Promise<string> {\n if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''\n if (!sitekey) return ''\n try {\n return await window.grecaptcha.execute(sitekey, { action: 'activity' })\n } catch {\n return ''\n }\n}\n\nexport default function SubscribePanel({ copy, email: initialEmail, onClose, onSuccess }: Props) {\n const { alpcConfig } = useMemberPopupContext()\n const { locale } = alpcConfig\n const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(headlessBrand)\n const [policy, setPolicy] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [errorMessage, setErrorMessage] = useState('')\n const [successMessage, setSuccessMessage] = useState('')\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (initialEmail) setEmail(initialEmail)\n }, [initialEmail])\n\n const handleSubmit = useCallback(async () => {\n setErrorMessage('')\n if (!email) return setErrorMessage('Please fill in your email')\n if (!emailValidate(email)) return setErrorMessage('Invalid email address')\n if (!policy) return setErrorMessage('Please agree to the policy')\n\n setLoading(true)\n const { register_source } = getAdCookie()\n const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')\n try {\n const response = await fetch('/api/multipass/rainbowbridge/activities', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'current-language': locale,\n 'X-Recaptcha-Token': recaptchaToken,\n },\n body: JSON.stringify({\n email,\n register_source,\n shopify_domain: storeDomain,\n single_brand_subscribe: copy.single_brand_subscribe ?? true,\n genre: copy.genre ?? copy.dealsType ?? '',\n sub_brand_type: copy.sub_brand_type ?? '',\n }),\n })\n const result = await response.json()\n if (!result.errors) {\n setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')\n onSuccess?.()\n setTimeout(() => {\n setSuccessMessage('')\n onClose()\n }, 3000)\n } else {\n setErrorMessage(result.errors ?? 'Error occurred')\n }\n } catch {\n setErrorMessage('Network error')\n } finally {\n setLoading(false)\n }\n }, [email, policy, locale, storeDomain, copy, onClose, onSuccess])\n\n return (\n <div className=\"flex flex-col gap-[12px]\">\n <div className=\"flex flex-col gap-[8px]\">\n {copy.title && (\n <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>\n )}\n {copy.desc && (\n <Text className=\"text-[16px] text-[#1e2024]\" html={copy.desc} />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[16px]\">\n <input\n className={cn(\n 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',\n errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n placeholder={copy.placeholder}\n value={email}\n onChange={e => { setErrorMessage(''); setEmail(e.target.value.trim()) }}\n />\n\n <div className=\"flex w-full items-start gap-[8px]\">\n <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className=\"mt-[2px] border-[#1d1d1f]\" />\n <label\n className=\"cursor-pointer text-left text-[14px] text-[#1e2024] [&_a]:underline\"\n onClick={() => setPolicy(v => !v)}\n dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}\n />\n </div>\n\n {(errorMessage || successMessage) && (\n <div className={cn('text-[14px] font-[700]', errorMessage && 'text-[#f84d4f]', successMessage && 'text-[#52c41a]')}>\n <Text html={successMessage || errorMessage} />\n </div>\n )}\n\n <button\n className={cn('w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60', rounded ? 'rounded-[4px]' : 'rounded-none')}\n disabled={loading}\n onClick={handleSubmit}\n >\n {copy.buttonLabel ?? 'Subscribe'}\n </button>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Checkbox", "Text", "cn", "useHeadlessContext", "Cookies", "parse", "emailValidate", "useMemberPopupContext", "ROUNDED_BRANDS", "getAdCookie", "search", "href", "query", "getRecaptchaToken", "sitekey", "SubscribePanel", "copy", "initialEmail", "onClose", "onSuccess", "alpcConfig", "locale", "headlessBrand", "storeDomain", "recaptchaSitekey", "rounded", "policy", "setPolicy", "email", "setEmail", "errorMessage", "setErrorMessage", "successMessage", "setSuccessMessage", "loading", "setLoading", "handleSubmit", "register_source", "recaptchaToken", "result", "e", "v"]
7
+ }
@@ -0,0 +1,18 @@
1
+ import type { CreditLogResponse } from '../../../../credits/context/response';
2
+ type UseActivitiesConfig = {
3
+ userId: string | undefined;
4
+ brand: string;
5
+ apiBaseUrl?: string;
6
+ locale?: string;
7
+ };
8
+ type Params = {
9
+ page: number;
10
+ pageSize: number;
11
+ };
12
+ declare function useActivities({ userId, brand, apiBaseUrl, locale }: UseActivitiesConfig, { page, pageSize }: Params): {
13
+ activities: CreditLogResponse[];
14
+ isLoading: boolean;
15
+ total: number;
16
+ canNext: boolean;
17
+ };
18
+ export default useActivities;
@@ -0,0 +1,2 @@
1
+ import{useCallback as C,useEffect as h,useState as o}from"react";import A from"swr/mutation";import{getAlpcPath as P}from"../../../../credits/context/utils";function S({userId:e,brand:i,apiBaseUrl:l,locale:a=""},{page:t,pageSize:c}){const[g,d]=o([]),[u,y]=o(0),[p,v]=o(0),{isMutating:s,trigger:f}=A("/v1/credit/log",async(n,{arg:r})=>(await fetch(P(a,l)+n,{method:"POST",headers:{"Content-Type":"application/json","current-language":a},body:JSON.stringify(r)})).json()),m=C(async()=>{await f({page:t,page_size:c,user_id:e,brand:i},{onSuccess(n){v(t),y(n?.data?.total??0),d(r=>r.concat(n?.data?.creditLogs??[]))}})},[t,c,e,i,f]);return h(()=>{!e||!i||s||t===p||m()},[m,e,i,t,p,s]),{activities:g,isLoading:s,total:u,canNext:u>g.length&&!s}}var U=S;export{U as default};
2
+ //# sourceMappingURL=useActivities.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/components/memberPopup/panels/EarnCredits/hooks/useActivities.ts"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport useSWRMutation from 'swr/mutation'\nimport { getAlpcPath } from '../../../../credits/context/utils'\nimport type { CreditLogResponse } from '../../../../credits/context/response'\n\ntype UseActivitiesConfig = {\n userId: string | undefined\n brand: string\n apiBaseUrl?: string\n locale?: string\n}\n\ntype Params = {\n page: number\n pageSize: number\n}\n\nfunction useActivities(\n { userId, brand, apiBaseUrl, locale = '' }: UseActivitiesConfig,\n { page, pageSize }: Params\n) {\n const [activities, setActivities] = useState<CreditLogResponse[]>([])\n const [total, setTotal] = useState(0)\n const [currentPage, setCurrentPage] = useState(0)\n\n const { isMutating: isLoading, trigger } = useSWRMutation(\n `/v1/credit/log`,\n async (url: string, { arg }: { arg: Record<string, any> }) => {\n const response = await fetch(getAlpcPath(locale, apiBaseUrl) + url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'current-language': locale },\n body: JSON.stringify(arg),\n })\n return response.json()\n }\n )\n\n const fetchActivities = useCallback(async () => {\n await trigger(\n { page, page_size: pageSize, user_id: userId, brand },\n {\n onSuccess(data) {\n setCurrentPage(page)\n setTotal(data?.data?.total ?? 0)\n setActivities(prev => prev.concat(data?.data?.creditLogs ?? []))\n },\n }\n )\n }, [page, pageSize, userId, brand, trigger])\n\n useEffect(() => {\n if (!userId || !brand || isLoading || page === currentPage) return\n fetchActivities()\n }, [fetchActivities, userId, brand, page, currentPage, isLoading])\n\n return {\n activities,\n isLoading,\n total,\n canNext: total > activities.length && !isLoading,\n }\n}\n\nexport default useActivities\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,EAAa,aAAAC,EAAW,YAAAC,MAAgB,QACjD,OAAOC,MAAoB,eAC3B,OAAS,eAAAC,MAAmB,oCAe5B,SAASC,EACP,CAAE,OAAAC,EAAQ,MAAAC,EAAO,WAAAC,EAAY,OAAAC,EAAS,EAAG,EACzC,CAAE,KAAAC,EAAM,SAAAC,CAAS,EACjB,CACA,KAAM,CAACC,EAAYC,CAAa,EAAIX,EAA8B,CAAC,CAAC,EAC9D,CAACY,EAAOC,CAAQ,EAAIb,EAAS,CAAC,EAC9B,CAACc,EAAaC,CAAc,EAAIf,EAAS,CAAC,EAE1C,CAAE,WAAYgB,EAAW,QAAAC,CAAQ,EAAIhB,EACzC,iBACA,MAAOiB,EAAa,CAAE,IAAAC,CAAI,KACP,MAAM,MAAMjB,EAAYK,EAAQD,CAAU,EAAIY,EAAK,CAClE,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,mBAAoBX,CAAO,EAC1E,KAAM,KAAK,UAAUY,CAAG,CAC1B,CAAC,GACe,KAAK,CAEzB,EAEMC,EAAkBtB,EAAY,SAAY,CAC9C,MAAMmB,EACJ,CAAE,KAAAT,EAAM,UAAWC,EAAU,QAASL,EAAQ,MAAAC,CAAM,EACpD,CACE,UAAUgB,EAAM,CACdN,EAAeP,CAAI,EACnBK,EAASQ,GAAM,MAAM,OAAS,CAAC,EAC/BV,EAAcW,GAAQA,EAAK,OAAOD,GAAM,MAAM,YAAc,CAAC,CAAC,CAAC,CACjE,CACF,CACF,CACF,EAAG,CAACb,EAAMC,EAAUL,EAAQC,EAAOY,CAAO,CAAC,EAE3C,OAAAlB,EAAU,IAAM,CACV,CAACK,GAAU,CAACC,GAASW,GAAaR,IAASM,GAC/CM,EAAgB,CAClB,EAAG,CAACA,EAAiBhB,EAAQC,EAAOG,EAAMM,EAAaE,CAAS,CAAC,EAE1D,CACL,WAAAN,EACA,UAAAM,EACA,MAAAJ,EACA,QAASA,EAAQF,EAAW,QAAU,CAACM,CACzC,CACF,CAEA,IAAOO,EAAQpB",
6
+ "names": ["useCallback", "useEffect", "useState", "useSWRMutation", "getAlpcPath", "useActivities", "userId", "brand", "apiBaseUrl", "locale", "page", "pageSize", "activities", "setActivities", "total", "setTotal", "currentPage", "setCurrentPage", "isLoading", "trigger", "url", "arg", "fetchActivities", "data", "prev", "useActivities_default"]
7
+ }
@@ -0,0 +1,9 @@
1
+ type UseSubscribedConfig = {
2
+ userId: string | undefined;
3
+ brand: string;
4
+ email: string | undefined;
5
+ locale?: string;
6
+ apiBaseUrl?: string;
7
+ };
8
+ export declare function useSubscribed({ userId, brand, email, locale, apiBaseUrl }: UseSubscribedConfig): boolean;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import{useMemo as b}from"react";import{useSubscriptions as p}from"@anker-in/lib";import{TaskSubType as a}from"../../../../credits/context/const";import f from"./useActivities";function l({userId:n,brand:r,email:u,locale:o="",apiBaseUrl:c}){const{activities:i}=f({userId:n,brand:r,apiBaseUrl:c,locale:o},{page:1,pageSize:50}),{data:t}=p({email:u}),s=t?.data||t;return b(()=>s?.preference?s.preference.some(e=>e.brand===r&&e.subscribe)?!0:i?.some(e=>e.task_sub_type===a.Subscription):!1,[s?.preference,i,r])}export{l as useSubscribed};
2
+ //# sourceMappingURL=useSubscribed.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/components/memberPopup/panels/EarnCredits/hooks/useSubscribed.ts"],
4
+ "sourcesContent": ["import { useMemo } from 'react'\nimport { useSubscriptions } from '@anker-in/lib'\nimport { TaskSubType } from '../../../../credits/context/const'\nimport useActivities from './useActivities'\n\ntype UseSubscribedConfig = {\n userId: string | undefined\n brand: string\n email: string | undefined\n locale?: string\n apiBaseUrl?: string\n}\n\nexport function useSubscribed({ userId, brand, email, locale = '', apiBaseUrl }: UseSubscribedConfig) {\n const { activities } = useActivities(\n { userId, brand, apiBaseUrl, locale },\n { page: 1, pageSize: 50 }\n )\n const { data: subscription } = useSubscriptions({ email })\n const subscriptionData = subscription?.data || subscription\n\n return useMemo(() => {\n if (!subscriptionData?.preference) {\n return false\n }\n const subscribedByPreference = subscriptionData.preference.some(\n (item: any) => item.brand === brand && item.subscribe\n )\n if (subscribedByPreference) return true\n return activities?.some(item => item.task_sub_type === TaskSubType.Subscription)\n }, [subscriptionData?.preference, activities, brand])\n}\n"],
5
+ "mappings": "AAAA,OAAS,WAAAA,MAAe,QACxB,OAAS,oBAAAC,MAAwB,gBACjC,OAAS,eAAAC,MAAmB,oCAC5B,OAAOC,MAAmB,kBAUnB,SAASC,EAAc,CAAE,OAAAC,EAAQ,MAAAC,EAAO,MAAAC,EAAO,OAAAC,EAAS,GAAI,WAAAC,CAAW,EAAwB,CACpG,KAAM,CAAE,WAAAC,CAAW,EAAIP,EACrB,CAAE,OAAAE,EAAQ,MAAAC,EAAO,WAAAG,EAAY,OAAAD,CAAO,EACpC,CAAE,KAAM,EAAG,SAAU,EAAG,CAC1B,EACM,CAAE,KAAMG,CAAa,EAAIV,EAAiB,CAAE,MAAAM,CAAM,CAAC,EACnDK,EAAmBD,GAAc,MAAQA,EAE/C,OAAOX,EAAQ,IACRY,GAAkB,WAGQA,EAAiB,WAAW,KACxDC,GAAcA,EAAK,QAAUP,GAASO,EAAK,SAC9C,EACmC,GAC5BH,GAAY,KAAKG,GAAQA,EAAK,gBAAkBX,EAAY,YAAY,EANtE,GAOR,CAACU,GAAkB,WAAYF,EAAYJ,CAAK,CAAC,CACtD",
6
+ "names": ["useMemo", "useSubscriptions", "TaskSubType", "useActivities", "useSubscribed", "userId", "brand", "email", "locale", "apiBaseUrl", "activities", "subscription", "subscriptionData", "item"]
7
+ }
@@ -0,0 +1,17 @@
1
+ type UseUpdateProfileConfig = {
2
+ locale?: string;
3
+ appName?: string;
4
+ };
5
+ type ProfileData = {
6
+ first_name?: string;
7
+ last_name?: string;
8
+ phone_number?: string;
9
+ country?: string;
10
+ dob?: string;
11
+ };
12
+ export declare function useUpdateProfile({ locale, appName }?: UseUpdateProfileConfig): {
13
+ updateProfile: (data: ProfileData) => Promise<boolean>;
14
+ isLoading: boolean;
15
+ error: string | null;
16
+ };
17
+ export {};
@@ -0,0 +1,2 @@
1
+ import{useCallback as f,useState as o}from"react";function c({locale:n="",appName:s=""}={}){const[i,a]=o(!1),[l,r]=o(null);return{updateProfile:f(async u=>{a(!0),r(null);try{const e=await fetch("/api/multipass/account/users/update_profile",{method:"PUT",headers:{"Content-Type":"application/json","current-language":n},body:JSON.stringify({app:s,...u})}),t=await e.json();return e.ok&&!t.error?!0:(r(t?.error?.message||t?.error||"Update failed"),!1)}catch(e){return r(e?.message??"Unknown error"),!1}finally{a(!1)}},[n,s]),isLoading:i,error:l}}export{c as useUpdateProfile};
2
+ //# sourceMappingURL=useUpdateProfile.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/components/memberPopup/panels/EarnCredits/hooks/useUpdateProfile.ts"],
4
+ "sourcesContent": ["import { useCallback, useState } from 'react'\n\ntype UseUpdateProfileConfig = {\n locale?: string\n appName?: string\n}\n\ntype ProfileData = {\n first_name?: string\n last_name?: string\n phone_number?: string\n country?: string\n dob?: string\n}\n\nexport function useUpdateProfile({ locale = '', appName = '' }: UseUpdateProfileConfig = {}) {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const updateProfile = useCallback(\n async (data: ProfileData): Promise<boolean> => {\n setIsLoading(true)\n setError(null)\n try {\n const response = await fetch('/api/multipass/account/users/update_profile', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'current-language': locale,\n },\n body: JSON.stringify({ app: appName, ...data }),\n })\n const result = await response.json()\n if (response.ok && !result.error) {\n return true\n }\n setError(result?.error?.message || result?.error || 'Update failed')\n return false\n } catch (e: any) {\n setError(e?.message ?? 'Unknown error')\n return false\n } finally {\n setIsLoading(false)\n }\n },\n [locale, appName]\n )\n\n return { updateProfile, isLoading, error }\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,EAAa,YAAAC,MAAgB,QAe/B,SAASC,EAAiB,CAAE,OAAAC,EAAS,GAAI,QAAAC,EAAU,EAAG,EAA4B,CAAC,EAAG,CAC3F,KAAM,CAACC,EAAWC,CAAY,EAAIL,EAAS,EAAK,EAC1C,CAACM,EAAOC,CAAQ,EAAIP,EAAwB,IAAI,EA+BtD,MAAO,CAAE,cA7BaD,EACpB,MAAOS,GAAwC,CAC7CH,EAAa,EAAI,EACjBE,EAAS,IAAI,EACb,GAAI,CACF,MAAME,EAAW,MAAM,MAAM,8CAA+C,CAC1E,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,mBAAoBP,CACtB,EACA,KAAM,KAAK,UAAU,CAAE,IAAKC,EAAS,GAAGK,CAAK,CAAC,CAChD,CAAC,EACKE,EAAS,MAAMD,EAAS,KAAK,EACnC,OAAIA,EAAS,IAAM,CAACC,EAAO,MAClB,IAETH,EAASG,GAAQ,OAAO,SAAWA,GAAQ,OAAS,eAAe,EAC5D,GACT,OAAS,EAAQ,CACf,OAAAH,EAAS,GAAG,SAAW,eAAe,EAC/B,EACT,QAAE,CACAF,EAAa,EAAK,CACpB,CACF,EACA,CAACH,EAAQC,CAAO,CAClB,EAEwB,UAAAC,EAAW,MAAAE,CAAM,CAC3C",
6
+ "names": ["useCallback", "useState", "useUpdateProfile", "locale", "appName", "isLoading", "setIsLoading", "error", "setError", "data", "response", "result"]
7
+ }
@@ -0,0 +1,13 @@
1
+ import { type EarnCreditsCopy } from '../../type';
2
+ type Props = {
3
+ copy: EarnCreditsCopy;
4
+ onClose: () => void;
5
+ isSubscribeSuccess?: boolean;
6
+ isActivateSuccess?: boolean;
7
+ isProfileCompleteSuccess?: boolean;
8
+ onSubscribeSuccess?: () => void;
9
+ onActivateSuccess?: () => void;
10
+ onProfileCompleteSuccess?: () => void;
11
+ };
12
+ declare function EarnCredits({ copy, onClose, isSubscribeSuccess, isActivateSuccess, isProfileCompleteSuccess, onSubscribeSuccess, onActivateSuccess, onProfileCompleteSuccess, }: Props): import("react/jsx-runtime").JSX.Element;
13
+ export default EarnCredits;
@@ -0,0 +1,2 @@
1
+ import{jsx as e,jsxs as n}from"react/jsx-runtime";import{useMemo as b}from"react";import{classNames as c,useHeadlessContext as I}from"@anker-in/lib";import{useMemberPopupContext as B}from"../../context/provider";import{useViewStack as U}from"../../context/viewStack";import{useSubscribed as D}from"./hooks/useSubscribed";import{EarnCreditsTaskType as i,MemberPopupPanelType as v}from"../../type";import{IconBag as M,IconLock as R,IconSubscription as y,IconOrders as F}from"../../icons";import{numberFormat as S}from"../../../credits/context/utils";import{ROUNDED_BRANDS as O}from"../../../../constants";function V({id:t,className:a}){switch(t){case i.Activate:return e(R,{className:a});case i.Subscribe:return e(y,{className:a});case i.Shop:return e(M,{className:a});case i.CompleteProfile:return e(F,{className:a})}}function z({copy:t,onClose:a,isSubscribeSuccess:g=!1,isActivateSuccess:N=!1,isProfileCompleteSuccess:f=!1,onSubscribeSuccess:L,onActivateSuccess:w,onProfileCompleteSuccess:P}){const{profile:o,openSignUpPopup:d,alpcConfig:x,creditInfo:u}=B(),{pushView:p}=U(),{locale:E}=x,{brand:T}=I(),m=O.includes(T),l=!!o,h=D({userId:o?.user_id,brand:x.brand,email:o?.email,locale:E,apiBaseUrl:x.apiBaseUrl}),C=b(()=>f||!!(o?.first_name||o?.last_name)&&!!o?.phone_number&&!!o?.dob,[o,f]),k=b(()=>({[i.Activate]:{finished:!!o?.activated||N,onClick:l?()=>p({type:v.Activate,props:{onSuccess:w}}):d},[i.CompleteProfile]:{finished:C,onClick:l?()=>p({type:v.CompleteProfile,props:{onSuccess:P}}):d},[i.Subscribe]:{finished:h||g,onClick:l?()=>p({type:v.SubscribeEmail,props:{onSuccess:L}}):d},[i.Shop]:{finished:!1,link:t.goShopLink,onClick:l?void 0:d}}),[o,l,N,f,C,h,g,d,p,t.goShopLink]),_=b(()=>t.list.map(s=>{const r=k[s.id];if(!r)return null;const A=r.finished?t.completed:l?H(s.id,t):t.joinNow;return{...s,...r,buttonLabel:A}}).filter(Boolean),[t,k,l]);return n("div",{className:"flex flex-col gap-[16px]",children:[n("div",{className:"flex flex-col gap-[16px]",children:[e("div",{className:"flex flex-col gap-[8px]",children:t.title&&e("h2",{className:"text-[24px] font-[700] leading-[1.2] text-[#080a0f]",children:t.title})}),l&&u&&n("div",{className:c("flex items-center gap-[12px] bg-[#f5f6f7] p-[16px]",m?"rounded-[8px]":"rounded-none"),children:[n("div",{className:"flex flex-1 flex-col gap-[4px]",children:[e("div",{className:"text-[14px] font-[700] text-[#1e2024]",children:t.balanceLabel??"AnkerCredits Balance"}),n("div",{className:"flex items-end gap-[4px]",children:[e("span",{className:"text-[24px] font-[700] leading-[1.2] text-[#1e2024]",children:S(u.available_credit)}),e("span",{className:"text-[14px] font-[700] leading-[1.4] text-[#1e2024]",children:t.creditUnit??"ankercredits"})]})]}),e("div",{className:"h-full w-px bg-[#dadce0]"}),n("div",{className:"flex flex-1 flex-col gap-[4px]",children:[e("div",{className:"text-[14px] font-[700] text-[#1e2024]",children:t.comingSoonLabel??"Coming Soon"}),n("div",{className:"flex items-end gap-[4px]",children:[e("span",{className:"text-[24px] font-[700] leading-[1.2] text-[#1e2024]",children:S(u.pending_credit??0)}),e("span",{className:"text-[14px] font-[700] leading-[1.4] text-[#1e2024]",children:t.creditUnit??"ankercredits"})]})]})]})]}),n("div",{className:"flex flex-col gap-[16px]",children:[t.subtitle&&e("p",{className:"text-[16px] font-[700] text-[#1e2024]",children:t.subtitle}),e("div",{className:"flex flex-col",children:_.map((s,r)=>n("div",{className:"relative py-[16px]",children:[r>0&&e("div",{className:"absolute left-0 right-0 top-0 h-px bg-[#dadce0]"}),n("div",{className:c("flex items-center gap-[12px]",s.finished&&"opacity-60"),children:[e(V,{id:s.id,className:"size-[24px] shrink-0"}),n("div",{className:"flex-1",children:[e("div",{className:"text-[16px] font-[700] text-[#1e2024]",children:s.title}),s.description&&e("div",{className:"mt-[4px] text-[14px] font-[700] text-[#4a4c56]",children:s.description})]}),!s.finished&&s.link?e("a",{href:s.link,target:"_blank",rel:"noopener noreferrer",className:c("cursor-pointer bg-[#080a0f] min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white",m?"rounded-[4px]":"rounded-none"),children:s.buttonLabel}):e("button",{className:c("cursor-pointer min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white",s.finished?"bg-[#767880]":"bg-[#080a0f]",m?"rounded-[4px]":"rounded-none"),disabled:s.finished,onClick:s.finished?void 0:s.onClick,children:s.buttonLabel})]})]},r))})]})]})}function H(t,a){switch(t){case i.Activate:return a.activate;case i.CompleteProfile:return a.completeProfileLabel;case i.Subscribe:return a.subscribeLabel;case i.Shop:return a.shopNow}}var Z=z;export{Z as default};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/memberPopup/panels/EarnCredits/index.tsx"],
4
+ "sourcesContent": ["import { useMemo } from 'react'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport { useMemberPopupContext } from '../../context/provider'\nimport { useViewStack } from '../../context/viewStack'\nimport { useSubscribed } from './hooks/useSubscribed'\nimport { EarnCreditsTaskType, MemberPopupPanelType, type EarnCreditsCopy } from '../../type'\nimport { IconBag, IconLock, IconSubscription, IconOrders } from '../../icons'\nimport { numberFormat } from '../../../credits/context/utils'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\nfunction TaskIcon({ id, className }: { id: EarnCreditsTaskType; className?: string }) {\n switch (id) {\n case EarnCreditsTaskType.Activate:\n return <IconLock className={className} />\n case EarnCreditsTaskType.Subscribe:\n return <IconSubscription className={className} />\n case EarnCreditsTaskType.Shop:\n return <IconBag className={className} />\n case EarnCreditsTaskType.CompleteProfile:\n return <IconOrders className={className} />\n }\n}\n\ntype Props = {\n copy: EarnCreditsCopy\n onClose: () => void\n isSubscribeSuccess?: boolean\n isActivateSuccess?: boolean\n isProfileCompleteSuccess?: boolean\n onSubscribeSuccess?: () => void\n onActivateSuccess?: () => void\n onProfileCompleteSuccess?: () => void\n}\n\nfunction EarnCredits({\n copy,\n onClose,\n isSubscribeSuccess = false,\n isActivateSuccess = false,\n isProfileCompleteSuccess = false,\n onSubscribeSuccess,\n onActivateSuccess,\n onProfileCompleteSuccess,\n}: Props) {\n const { profile, openSignUpPopup, alpcConfig, creditInfo } = useMemberPopupContext()\n const { pushView } = useViewStack()\n const { locale } = alpcConfig\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const isLogin = !!profile\n\n const isSubscribed = useSubscribed({\n userId: profile?.user_id,\n brand: alpcConfig.brand,\n email: profile?.email,\n locale,\n apiBaseUrl: alpcConfig.apiBaseUrl,\n })\n\n const profileCompleted = useMemo(() => {\n return isProfileCompleteSuccess || (!!(profile?.first_name || profile?.last_name) && !!profile?.phone_number && !!profile?.dob)\n }, [profile, isProfileCompleteSuccess])\n\n const taskStates: Record<EarnCreditsTaskType, { finished: boolean; onClick?: () => void; link?: string }> = useMemo(() => ({\n [EarnCreditsTaskType.Activate]: {\n finished: !!profile?.activated || isActivateSuccess,\n onClick: isLogin\n ? () => pushView({\n type: MemberPopupPanelType.Activate,\n props: { onSuccess: onActivateSuccess },\n })\n : openSignUpPopup,\n },\n [EarnCreditsTaskType.CompleteProfile]: {\n finished: profileCompleted,\n onClick: isLogin\n ? () => pushView({\n type: MemberPopupPanelType.CompleteProfile,\n props: { onSuccess: onProfileCompleteSuccess },\n })\n : openSignUpPopup,\n },\n [EarnCreditsTaskType.Subscribe]: {\n finished: isSubscribed || isSubscribeSuccess,\n onClick: isLogin\n ? () => pushView({\n type: MemberPopupPanelType.SubscribeEmail,\n props: { onSuccess: onSubscribeSuccess },\n })\n : openSignUpPopup,\n },\n [EarnCreditsTaskType.Shop]: {\n finished: false,\n link: copy.goShopLink,\n onClick: isLogin ? undefined : openSignUpPopup,\n },\n }), [profile, isLogin, isActivateSuccess, isProfileCompleteSuccess, profileCompleted, isSubscribed, isSubscribeSuccess, openSignUpPopup, pushView, copy.goShopLink])\n\n const list = useMemo(() => {\n return copy.list.map(item => {\n const state = taskStates[item.id]\n if (!state) return null\n const buttonLabel = state.finished\n ? copy.completed\n : isLogin\n ? getNotFinishedLabel(item.id, copy)\n : copy.joinNow\n return { ...item, ...state, buttonLabel }\n }).filter(Boolean) as (typeof copy.list[number] & {\n finished: boolean\n onClick?: () => void\n link?: string\n buttonLabel: string\n })[]\n }, [copy, taskStates, isLogin])\n\n return (\n <div className=\"flex flex-col gap-[16px]\">\n <div className=\"flex flex-col gap-[16px]\">\n <div className=\"flex flex-col gap-[8px]\">\n {copy.title && <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>}\n </div>\n\n {isLogin && creditInfo && (\n <div className={cn('flex items-center gap-[12px] bg-[#f5f6f7] p-[16px]', rounded ? 'rounded-[8px]' : 'rounded-none')}>\n <div className=\"flex flex-1 flex-col gap-[4px]\">\n <div className=\"text-[14px] font-[700] text-[#1e2024]\">\n {copy.balanceLabel ?? 'AnkerCredits Balance'}\n </div>\n <div className=\"flex items-end gap-[4px]\">\n <span className=\"text-[24px] font-[700] leading-[1.2] text-[#1e2024]\">\n {numberFormat(creditInfo.available_credit)}\n </span>\n <span className=\"text-[14px] font-[700] leading-[1.4] text-[#1e2024]\">\n {copy.creditUnit ?? 'ankercredits'}\n </span>\n </div>\n </div>\n <div className=\"h-full w-px bg-[#dadce0]\" />\n <div className=\"flex flex-1 flex-col gap-[4px]\">\n <div className=\"text-[14px] font-[700] text-[#1e2024]\">\n {copy.comingSoonLabel ?? 'Coming Soon'}\n </div>\n <div className=\"flex items-end gap-[4px]\">\n <span className=\"text-[24px] font-[700] leading-[1.2] text-[#1e2024]\">\n {numberFormat(creditInfo.pending_credit ?? 0)}\n </span>\n <span className=\"text-[14px] font-[700] leading-[1.4] text-[#1e2024]\">\n {copy.creditUnit ?? 'ankercredits'}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col gap-[16px]\">\n {copy.subtitle && (\n <p className=\"text-[16px] font-[700] text-[#1e2024]\">{copy.subtitle}</p>\n )}\n\n <div className=\"flex flex-col\">\n {list.map((item, idx) => (\n <div key={idx} className=\"relative py-[16px]\">\n {idx > 0 && <div className=\"absolute left-0 right-0 top-0 h-px bg-[#dadce0]\" />}\n <div className={cn('flex items-center gap-[12px]', item.finished && 'opacity-60')}>\n <TaskIcon id={item.id} className=\"size-[24px] shrink-0\" />\n <div className=\"flex-1\">\n <div className=\"text-[16px] font-[700] text-[#1e2024]\">{item.title}</div>\n {item.description && (\n <div className=\"mt-[4px] text-[14px] font-[700] text-[#4a4c56]\">{item.description}</div>\n )}\n </div>\n {!item.finished && item.link ? (\n <a\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn('cursor-pointer bg-[#080a0f] min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white', rounded ? 'rounded-[4px]' : 'rounded-none')}\n >\n {item.buttonLabel}\n </a>\n ) : (\n <button\n className={cn(\n 'cursor-pointer min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white',\n item.finished ? 'bg-[#767880]' : 'bg-[#080a0f]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n disabled={item.finished}\n onClick={!item.finished ? item.onClick : undefined}\n >\n {item.buttonLabel}\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nfunction getNotFinishedLabel(id: EarnCreditsTaskType, copy: EarnCreditsCopy): string {\n switch (id) {\n case EarnCreditsTaskType.Activate: return copy.activate\n case EarnCreditsTaskType.CompleteProfile: return copy.completeProfileLabel\n case EarnCreditsTaskType.Subscribe: return copy.subscribeLabel\n case EarnCreditsTaskType.Shop: return copy.shopNow\n }\n}\n\nexport default EarnCredits\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useMemo", "cn", "useHeadlessContext", "useMemberPopupContext", "useViewStack", "useSubscribed", "EarnCreditsTaskType", "MemberPopupPanelType", "IconBag", "IconLock", "IconSubscription", "IconOrders", "numberFormat", "ROUNDED_BRANDS", "TaskIcon", "id", "className", "EarnCredits", "copy", "onClose", "isSubscribeSuccess", "isActivateSuccess", "isProfileCompleteSuccess", "onSubscribeSuccess", "onActivateSuccess", "onProfileCompleteSuccess", "profile", "openSignUpPopup", "alpcConfig", "creditInfo", "pushView", "locale", "brand", "rounded", "isLogin", "isSubscribed", "profileCompleted", "taskStates", "list", "item", "state", "buttonLabel", "getNotFinishedLabel", "idx", "EarnCredits_default"]
7
+ }
@@ -0,0 +1,13 @@
1
+ type ReferralDashboardResponse = {
2
+ data: {
3
+ cash_available: number;
4
+ cash_pending: number;
5
+ };
6
+ code: number;
7
+ msg: string;
8
+ };
9
+ export declare function useReferralDashboard({ enabled, locale }: {
10
+ enabled: boolean;
11
+ locale?: string;
12
+ }): import("swr/mutation").SWRMutationResponse<ReferralDashboardResponse, Error, string | null, never>;
13
+ export {};
@@ -0,0 +1,2 @@
1
+ import a from"swr/mutation";function t({enabled:e,locale:r=""}){return a(e?"/api/multipass/mktsrv/v1/referral/dashboard/info":null,async n=>(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","current-language":r},body:JSON.stringify({channel:"web"})})).json())}export{t as useReferralDashboard};
2
+ //# sourceMappingURL=useReferralDashboard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/components/memberPopup/panels/Referral/hooks/useReferralDashboard.ts"],
4
+ "sourcesContent": ["import useSWRMutation from 'swr/mutation'\n\ntype ReferralDashboardResponse = {\n data: {\n cash_available: number\n cash_pending: number\n }\n code: number\n msg: string\n}\n\nexport function useReferralDashboard({ enabled, locale = '' }: { enabled: boolean; locale?: string }) {\n return useSWRMutation<ReferralDashboardResponse, Error, string | null>(\n enabled ? '/api/multipass/mktsrv/v1/referral/dashboard/info' : null,\n async (url: string) => {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'current-language': locale,\n },\n body: JSON.stringify({ channel: 'web' }),\n })\n return response.json()\n }\n )\n}\n"],
5
+ "mappings": "AAAA,OAAOA,MAAoB,eAWpB,SAASC,EAAqB,CAAE,QAAAC,EAAS,OAAAC,EAAS,EAAG,EAA0C,CACpG,OAAOH,EACLE,EAAU,mDAAqD,KAC/D,MAAOE,IACY,MAAM,MAAMA,EAAK,CAChC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,mBAAoBD,CACtB,EACA,KAAM,KAAK,UAAU,CAAE,QAAS,KAAM,CAAC,CACzC,CAAC,GACe,KAAK,CAEzB,CACF",
6
+ "names": ["useSWRMutation", "useReferralDashboard", "enabled", "locale", "url"]
7
+ }
@@ -0,0 +1,12 @@
1
+ export type ReferralRewardOverviewResponse = {
2
+ data: {
3
+ data: {
4
+ available: number;
5
+ pending: number;
6
+ };
7
+ };
8
+ };
9
+ export declare function useReferralOverview(): {
10
+ isLoading: boolean;
11
+ data?: ReferralRewardOverviewResponse;
12
+ };
@@ -0,0 +1,2 @@
1
+ import l from"swr";import{useMemberPopupContext as p}from"../../../context/provider";function v(){const{profile:r,alpcConfig:a}=p(),o=!!r?"/api/multipass/mktsrv/v1/referral/reward/overview/cash":null,s=async i=>{const e=await fetch(i,{method:"GET",headers:{"Content-Type":"application/json","current-language":a.locale}});if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.json()},{data:n,isLoading:t}=l(o,s,{revalidateOnFocus:!1});return{isLoading:t,data:n}}export{v as useReferralOverview};
2
+ //# sourceMappingURL=useReferralOverview.js.map