@anker-in/campaign-ui 0.5.0-beta.8 → 0.5.0

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 (158) hide show
  1. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  2. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  3. package/dist/cjs/components/credits/context/hooks/useShippingCountries.d.ts +8 -0
  4. package/dist/cjs/components/credits/context/hooks/useShippingCountries.js +2 -0
  5. package/dist/cjs/components/credits/context/hooks/useShippingCountries.js.map +7 -0
  6. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  7. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  8. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/index.js +1 -1
  9. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/index.js.map +3 -3
  10. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +1 -1
  11. package/dist/cjs/components/memberPopup/MemberPopup.js +1 -1
  12. package/dist/cjs/components/memberPopup/MemberPopup.js.map +3 -3
  13. package/dist/cjs/components/memberPopup/context/provider.d.ts +3 -3
  14. package/dist/cjs/components/memberPopup/context/provider.js +1 -1
  15. package/dist/cjs/components/memberPopup/context/provider.js.map +3 -3
  16. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +1 -4
  17. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js +1 -1
  18. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +3 -3
  19. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +8 -7
  20. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  21. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  22. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  23. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  24. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  25. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  26. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  27. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  28. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  29. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  30. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  31. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  32. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  33. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  34. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  35. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +1 -1
  36. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  37. package/dist/cjs/components/memberPopup/panels/Referral/index.js +1 -1
  38. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +3 -3
  39. package/dist/cjs/components/memberPopup/type.d.ts +19 -2
  40. package/dist/cjs/components/memberPopup/type.js +1 -1
  41. package/dist/cjs/components/memberPopup/type.js.map +1 -1
  42. package/dist/cjs/templates/Credits.js +1 -1
  43. package/dist/cjs/templates/Credits.js.map +3 -3
  44. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  45. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  46. package/dist/esm/components/credits/context/hooks/useShippingCountries.d.ts +8 -0
  47. package/dist/esm/components/credits/context/hooks/useShippingCountries.js +2 -0
  48. package/dist/esm/components/credits/context/hooks/useShippingCountries.js.map +7 -0
  49. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  50. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  51. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/index.js +1 -1
  52. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/index.js.map +3 -3
  53. package/dist/esm/components/memberPopup/MemberPopup.d.ts +1 -1
  54. package/dist/esm/components/memberPopup/MemberPopup.js +1 -1
  55. package/dist/esm/components/memberPopup/MemberPopup.js.map +3 -3
  56. package/dist/esm/components/memberPopup/context/provider.d.ts +3 -3
  57. package/dist/esm/components/memberPopup/context/provider.js +1 -1
  58. package/dist/esm/components/memberPopup/context/provider.js.map +3 -3
  59. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +1 -4
  60. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js +1 -1
  61. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +3 -3
  62. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +8 -7
  63. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  64. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  65. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  66. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  67. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  68. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  69. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  70. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  71. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  72. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  73. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  74. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  75. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  76. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  77. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  78. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +1 -1
  79. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  80. package/dist/esm/components/memberPopup/panels/Referral/index.js +1 -1
  81. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +3 -3
  82. package/dist/esm/components/memberPopup/type.d.ts +19 -2
  83. package/dist/esm/components/memberPopup/type.js +1 -1
  84. package/dist/esm/components/memberPopup/type.js.map +1 -1
  85. package/dist/esm/templates/Credits.js +1 -1
  86. package/dist/esm/templates/Credits.js.map +3 -3
  87. package/package.json +2 -1
  88. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +7 -5
  89. package/src/components/credits/context/hooks/useShippingCountries.ts +60 -0
  90. package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -2
  91. package/src/components/credits/creditsRedeemList/RedeemProductModal/index.tsx +2 -2
  92. package/src/components/memberPopup/MemberPopup.tsx +166 -178
  93. package/src/components/memberPopup/context/provider.tsx +24 -4
  94. package/src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx +66 -73
  95. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +38 -55
  96. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +210 -105
  97. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +32 -16
  98. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +60 -35
  99. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +32 -22
  100. package/src/components/memberPopup/panels/EarnCredits/index.tsx +56 -49
  101. package/src/components/memberPopup/panels/Referral/index.tsx +40 -22
  102. package/src/components/memberPopup/type.ts +20 -3
  103. package/src/templates/Credits.tsx +25 -0
  104. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  105. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  106. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  107. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  108. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  109. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  110. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +0 -7
  111. package/dist/cjs/components/memberPopup/panels/Activity/index.js +0 -2
  112. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +0 -7
  113. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  114. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  115. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  116. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +0 -11
  117. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +0 -2
  118. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +0 -7
  119. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  120. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  121. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  122. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  123. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  124. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  125. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  126. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  127. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  128. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  129. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  130. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  131. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  132. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  133. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  134. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +0 -7
  135. package/dist/esm/components/memberPopup/panels/Activity/index.js +0 -2
  136. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +0 -7
  137. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  138. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  139. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  140. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +0 -11
  141. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +0 -2
  142. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +0 -7
  143. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  144. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  145. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  146. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  147. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  148. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  149. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  150. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  151. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  152. package/dist/index.d.mts +0 -1775
  153. package/dist/index.d.ts +0 -1775
  154. package/dist/index.js +0 -18542
  155. package/dist/index.js.map +0 -1
  156. package/dist/index.mjs +0 -18514
  157. package/dist/index.mjs.map +0 -1
  158. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +0 -191
@@ -1,8 +1,8 @@
1
1
  'use client'
2
2
 
3
- import { lazy, Suspense, useState, useCallback, useMemo } from 'react'
3
+ import { lazy, Suspense, useState, useCallback, useEffect } from 'react'
4
4
  import { Picture } from '@anker-in/headless-ui'
5
- import { type HeadlessConfig, useHeadlessContext, classNames as cn } from '@anker-in/lib'
5
+ import { gaTrack, type HeadlessConfig, useHeadlessContext, classNames as cn } from '@anker-in/lib'
6
6
  import {
7
7
  MemberPopupActionType,
8
8
  MemberPopupPageScope,
@@ -20,11 +20,11 @@ import { ROUNDED_BRANDS } from '../../constants'
20
20
  const EarnCredits = lazy(() => import('./panels/EarnCredits'))
21
21
  const ConsumeCredits = lazy(() => import('./panels/ConsumeCredits'))
22
22
  const Referral = lazy(() => import('./panels/Referral'))
23
- const CompleteProfile = lazy(() => import('./panels/EarnCredits/CompleteProfilePanel'))
24
- const ActivitiesSubscribe = lazy(() => import('./panels/ActivitiesSubscribePanel'))
25
- const SubscribeEmail = lazy(() => import('./panels/EarnCredits/SubscribeEmailPanel'))
26
- const Activate = lazy(() => import('./panels/EarnCredits/ActivatePanel'))
27
- const RedeemCoupon = lazy(() => import('./panels/ConsumeCredits/RedeemCouponPanel'))
23
+ const CompleteProfilePanel = lazy(() => import('./panels/EarnCredits/CompleteProfilePanel'))
24
+ const ActivitiesSubscribePanel = lazy(() => import('./panels/ActivitiesSubscribePanel'))
25
+ const SubscribeEmailPanel = lazy(() => import('./panels/EarnCredits/SubscribeEmailPanel'))
26
+ const ActivatePanel = lazy(() => import('./panels/EarnCredits/ActivatePanel'))
27
+ const RedeemCouponPanel = lazy(() => import('./panels/ConsumeCredits/RedeemCouponPanel'))
28
28
 
29
29
  type MemberPopupProps = MemberPopupContextValue & {
30
30
  headlessConfig: HeadlessConfig
@@ -33,11 +33,33 @@ type MemberPopupProps = MemberPopupContextValue & {
33
33
  }
34
34
 
35
35
  export function MemberPopup({ copy, bottomOffset = '24px', ...providerProps }: MemberPopupProps) {
36
- return (
36
+ const [isVisible, setIsVisible] = useState(false)
37
+
38
+ useEffect(() => {
39
+ const config = copy.pageConfig
40
+ if (!config) {
41
+ setIsVisible(true)
42
+ return
43
+ }
44
+ const pathname = window.location.pathname
45
+ const matches = config.pages.some(page => pathname === page || pathname.startsWith(page + '/'))
46
+ switch (config.scope) {
47
+ case MemberPopupPageScope.Include:
48
+ setIsVisible(matches)
49
+ break
50
+ case MemberPopupPageScope.Exclude:
51
+ setIsVisible(!matches)
52
+ break
53
+ default:
54
+ setIsVisible(true)
55
+ }
56
+ }, [copy.pageConfig])
57
+
58
+ return isVisible ? (
37
59
  <MemberPopupProvider {...providerProps} earnCreditsCopy={copy.earnCredits}>
38
60
  <MemberPopupContent copy={copy} bottomOffset={bottomOffset} />
39
61
  </MemberPopupProvider>
40
- )
62
+ ) : null
41
63
  }
42
64
 
43
65
  type MemberPopupContentProps = {
@@ -47,35 +69,14 @@ type MemberPopupContentProps = {
47
69
 
48
70
  function MemberPopupContent({ copy, bottomOffset }: MemberPopupContentProps) {
49
71
  const { profile, openSignInPopup, openSignUpPopup } = useMemberPopupContext()
50
- const { brand, storeDomain } = useHeadlessContext()
72
+ const { brand } = useHeadlessContext()
51
73
  const rounded = ROUNDED_BRANDS.includes(brand)
52
74
  const isLogin = !!profile
53
75
  const [isOpen, setIsOpen] = useState(false)
54
76
  const [viewStack, setViewStack] = useState<ViewPayload[]>([])
55
- const [isSubscribeSuccess, setIsSubscribeSuccess] = useState(false)
56
- const [isActivateSuccess, setIsActivateSuccess] = useState(false)
57
- const [isProfileCompleteSuccess, setIsProfileCompleteSuccess] = useState(false)
58
- const [isSubscribeFormHidden, setIsSubscribeFormHidden] = useState(false)
59
77
 
60
78
  const currentView = viewStack[viewStack.length - 1] ?? null
61
79
 
62
- const isVisible = useMemo(() => {
63
- const config = copy.pageConfig
64
- if (!config) return true
65
- const pathname = typeof window !== 'undefined' ? window.location.pathname : ''
66
- const matches = config.pages.some(page => pathname === page || pathname.startsWith(page + '/'))
67
- switch (config.scope) {
68
- case MemberPopupPageScope.Include:
69
- return matches
70
- case MemberPopupPageScope.Exclude:
71
- return !matches
72
- default:
73
- return true
74
- }
75
- }, [copy.pageConfig])
76
-
77
- if (!isVisible) return null
78
-
79
80
  const pushView = useCallback((view: ViewPayload) => {
80
81
  setViewStack(prev => [...prev, view])
81
82
  }, [])
@@ -84,21 +85,39 @@ function MemberPopupContent({ copy, bottomOffset }: MemberPopupContentProps) {
84
85
  setViewStack(prev => prev.slice(0, -1))
85
86
  }, [])
86
87
 
88
+ const MEMBER_POPUP_INFO = 'Member Floating Window'
89
+
90
+ function trackLpButton(position: string, buttonName: string) {
91
+ gaTrack({
92
+ event: 'ga4Event',
93
+ event_name: 'lp_button',
94
+ event_parameters: {
95
+ position,
96
+ button_name: buttonName,
97
+ info: MEMBER_POPUP_INFO,
98
+ },
99
+ })
100
+ }
101
+
87
102
  function handleAction(type: MemberPopupActionType, url?: string) {
88
103
  switch (type) {
89
104
  case MemberPopupActionType.ExternalLink:
90
105
  if (url) window.open(url, '_blank', 'noopener,noreferrer')
91
106
  break
92
107
  case MemberPopupActionType.OpenEarnCredits:
108
+ trackLpButton('home', 'earn_credits')
93
109
  pushView({ type: MemberPopupPanelType.EarnCredits })
94
110
  break
95
111
  case MemberPopupActionType.OpenConsumeCredits:
112
+ trackLpButton('home', 'consume_credits')
96
113
  pushView({ type: MemberPopupPanelType.ConsumeCredits })
97
114
  break
98
115
  case MemberPopupActionType.OpenReferral:
116
+ trackLpButton('home', 'referral')
99
117
  pushView({ type: MemberPopupPanelType.Referral })
100
118
  break
101
119
  case MemberPopupActionType.OpenSubscribe:
120
+ trackLpButton('home', 'subscribe')
102
121
  pushView({ type: MemberPopupPanelType.Subscribe })
103
122
  break
104
123
  }
@@ -107,176 +126,145 @@ function MemberPopupContent({ copy, bottomOffset }: MemberPopupContentProps) {
107
126
  function handleClose() {
108
127
  setIsOpen(false)
109
128
  setViewStack([])
110
- setIsSubscribeFormHidden(false)
111
129
  }
112
130
 
113
131
  return (
114
132
  <ViewStackContext.Provider value={{ pushView, popView }}>
115
133
  {isOpen && <div className="fixed inset-0 z-[998]" onClick={handleClose} />}
116
134
  <div
117
- className="fixed right-0 z-[999] flex flex-row items-end pr-[16px] md:flex-col md:items-end md:right-0 md:w-screen md:pr-0 md:pl-0"
135
+ className="fixed right-0 z-[999] flex flex-row items-end pr-[20px] md:flex-col md:items-end md:right-0 md:w-screen md:pr-0 md:pl-0"
118
136
  style={{ bottom: bottomOffset }}
119
137
  >
120
138
  {isOpen && (
121
- <div
122
- className={cn(
123
- 'relative mr-[8px] flex w-[420px] max-w-[calc(100vw-32px)] min-h-[500px] flex-col overflow-hidden bg-white shadow-[0_8px_32px_rgba(0,0,0,0.16)] md:mr-0 md:mb-[8px] md:mx-[16px] md:w-[calc(100vw-32px)] md:max-w-[400px]',
124
- rounded ? 'rounded-[12px]' : 'rounded-none'
125
- )}
126
- style={{ maxHeight: 'min(80vh, 606px)' }}
127
- onClick={e => e.stopPropagation()}
128
- >
129
- <div className="absolute right-[-8px] top-[24px] size-0 border-y-8 border-l-8 border-y-transparent border-l-white md:bottom-[-8px] md:left-auto md:right-[29px] md:top-auto md:border-x-8 md:border-b-transparent md:border-t-white" />
130
- <div className="flex items-center justify-end pl-[10px] pr-[16px] pb-[8px] pt-[16px]">
131
- {currentView !== null && (
139
+ <div className="relative mr-[12px] md:mr-[12px] md:mb-[12px]" onClick={e => e.stopPropagation()}>
140
+ <div className="absolute right-[-7px] bottom-[24px] size-0 border-y-8 border-l-8 border-r-0 border-y-transparent border-l-white md:bottom-[-8px] md:right-[25px] md:top-auto md:border-y-0 md:border-l-8 md:border-r-8 md:border-t-8 md:border-l-transparent md:border-r-transparent md:border-t-white" />
141
+ <div
142
+ className={cn(
143
+ 'flex w-[420px] max-w-[calc(100vw-32px)] min-h-[500px] flex-col overflow-hidden bg-white shadow-[0_8px_32px_rgba(0,0,0,0.16)] md:w-[calc(100vw-32px)] md:max-w-[400px]',
144
+ rounded ? 'rounded-[12px]' : 'rounded-none'
145
+ )}
146
+ style={{ maxHeight: 'min(80vh, 606px)' }}
147
+ >
148
+ <div className="flex items-center justify-end pl-[10px] pr-[16px] pb-[8px] pt-[16px]">
149
+ {currentView !== null && (
150
+ <button
151
+ className="mr-auto flex size-[24px] cursor-pointer items-center justify-center"
152
+ onClick={popView}
153
+ aria-label="Back"
154
+ >
155
+ <IconSwitch />
156
+ </button>
157
+ )}
132
158
  <button
133
- className="mr-auto flex size-[24px] cursor-pointer items-center justify-center"
134
- onClick={popView}
135
- aria-label="Back"
159
+ className="flex size-[24px] cursor-pointer items-center justify-center"
160
+ onClick={() => {
161
+ trackLpButton('floating_button', 'close')
162
+ handleClose()
163
+ }}
164
+ aria-label="Close"
136
165
  >
137
- <IconSwitch />
166
+ <IconClose />
138
167
  </button>
139
- )}
140
- <button
141
- className="flex size-[24px] cursor-pointer items-center justify-center"
142
- onClick={handleClose}
143
- aria-label="Close"
144
- >
145
- <IconClose />
146
- </button>
147
- </div>
148
-
149
- <div className="flex flex-1 flex-col gap-[12px] overflow-y-auto p-[16px]">
150
- {currentView === null && (
151
- <>
152
- {(copy.title || copy.subtitle) && (
153
- <div className="flex flex-col gap-[4px]">
154
- {copy.title && (
155
- <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>
156
- )}
157
- {copy.subtitle && (
158
- <p className="text-[16px] font-[700] leading-snug text-[#4a4c56]">{copy.subtitle}</p>
159
- )}
160
- </div>
161
- )}
162
- {copy.list.map((item, i) => (
163
- <HomeCard key={i} item={item} onAction={handleAction} rounded={rounded} />
164
- ))}
165
- </>
166
- )}
168
+ </div>
167
169
 
168
- {currentView !== null && (
169
- <Suspense
170
- fallback={
171
- <div className="flex items-center justify-center py-[32px]">
172
- <div className="size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent" />
173
- </div>
174
- }
175
- >
176
- {currentView.type === MemberPopupPanelType.EarnCredits && copy.earnCredits && (
177
- <EarnCredits
178
- copy={copy.earnCredits}
179
- onClose={popView}
180
- isSubscribeSuccess={isSubscribeSuccess}
181
- isActivateSuccess={isActivateSuccess}
182
- isProfileCompleteSuccess={isProfileCompleteSuccess}
183
- onSubscribeSuccess={() => setIsSubscribeSuccess(true)}
184
- onActivateSuccess={() => setIsActivateSuccess(true)}
185
- onProfileCompleteSuccess={() => setIsProfileCompleteSuccess(true)}
186
- />
187
- )}
188
- {currentView.type === MemberPopupPanelType.ConsumeCredits && copy.consumeCredits && (
189
- <ConsumeCredits copy={copy.consumeCredits} onClose={popView} />
190
- )}
191
- {currentView.type === MemberPopupPanelType.Referral && copy.referral && (
192
- <Referral copy={copy.referral} onClose={popView} />
193
- )}
194
- {currentView.type === MemberPopupPanelType.CompleteProfile && copy.earnCredits && (
195
- <CompleteProfile
196
- copy={copy.earnCredits.completeProfile}
197
- shopifyStoreDomain={storeDomain}
198
- onClose={popView}
199
- onSuccess={currentView.props?.onSuccess}
200
- />
201
- )}
202
- {currentView.type === MemberPopupPanelType.Subscribe && copy.activitiesSubscribe && (
203
- <ActivitiesSubscribe
204
- copy={copy.activitiesSubscribe}
205
- email={profile?.email}
206
- onSuccess={currentView.props?.onSuccess}
207
- hideForm={isSubscribeFormHidden}
208
- onHideForm={() => setIsSubscribeFormHidden(true)}
209
- />
210
- )}
211
- {currentView.type === MemberPopupPanelType.SubscribeEmail && copy.earnCredits && (
212
- <SubscribeEmail
213
- copy={copy.earnCredits.subscribe}
214
- email={profile?.email}
215
- onClose={popView}
216
- onSuccess={currentView.props?.onSuccess}
217
- />
218
- )}
219
- {currentView.type === MemberPopupPanelType.Activate && copy.earnCredits && (
220
- <Activate
221
- copy={copy.earnCredits.authCodeActivate}
222
- onClose={popView}
223
- onSuccess={currentView.props?.onSuccess}
224
- />
225
- )}
226
- {currentView.type === MemberPopupPanelType.RedeemCoupon &&
227
- currentView.props &&
228
- copy.consumeCredits && (
229
- <RedeemCoupon
230
- itemTitle={currentView.props.itemTitle}
231
- itemCredits={currentView.props.itemCredits}
232
- itemImage={currentView.props.itemImage}
233
- itemValue={currentView.props.itemValue}
234
- itemOff={currentView.props.itemOff}
235
- itemRules={currentView.props.itemRules}
236
- redeemId={currentView.props.redeemId}
237
- userId={currentView.props.userId}
238
- alpcConfig={currentView.props.alpcConfig}
239
- copy={copy.consumeCredits.redeemModal}
240
- pointUnit={copy.consumeCredits.pointUnit}
241
- onClose={popView}
242
- />
170
+ <div className="flex flex-1 flex-col gap-[12px] overflow-y-auto p-[16px]">
171
+ {currentView === null && (
172
+ <>
173
+ {(copy.title || copy.subtitle) && (
174
+ <div className="flex flex-col gap-[4px]">
175
+ {copy.title && (
176
+ <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>
177
+ )}
178
+ {copy.subtitle && (
179
+ <p className="text-[16px] font-[700] leading-snug text-[#4a4c56]">{copy.subtitle}</p>
180
+ )}
181
+ </div>
243
182
  )}
244
- </Suspense>
245
- )}
246
- </div>
183
+ {copy.list.map((item, i) => (
184
+ <HomeCard key={i} item={item} onAction={handleAction} rounded={rounded} />
185
+ ))}
186
+ </>
187
+ )}
247
188
 
248
- {copy.footer && !isLogin && (
249
- <div className="border-t border-[#dadce0] p-[16px]">
250
- <div className="flex items-center justify-between gap-[16px]">
251
- <div className="flex items-center gap-[4px]">
252
- <span className="text-[14px] font-[700] text-[#080a0f]">{copy.footer.loginHint}</span>
253
- <button
254
- className="cursor-pointer text-[14px] font-[700] text-[#080a0f] underline"
255
- onClick={openSignInPopup}
256
- >
257
- {copy.footer.loginLabel}
258
- </button>
259
- </div>
260
- <div className="flex shrink-0 items-center gap-[8px]">
261
- <button
262
- className={cn(
263
- 'cursor-pointer border-[1.6px] border-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-[#080a0f]',
264
- rounded ? 'rounded-[4px]' : 'rounded-none'
189
+ {currentView !== null && (
190
+ <Suspense
191
+ fallback={
192
+ <div className="flex items-center justify-center py-[32px]">
193
+ <div className="size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent" />
194
+ </div>
195
+ }
196
+ >
197
+ {currentView.type === MemberPopupPanelType.EarnCredits && copy.earnCredits && (
198
+ <EarnCredits copy={copy.earnCredits} />
199
+ )}
200
+ {currentView.type === MemberPopupPanelType.ConsumeCredits && copy.consumeCredits && (
201
+ <ConsumeCredits copy={copy.consumeCredits} />
202
+ )}
203
+ {currentView.type === MemberPopupPanelType.Referral && copy.referral && (
204
+ <Referral copy={copy.referral} onClose={popView} />
205
+ )}
206
+ {currentView.type === MemberPopupPanelType.CompleteProfile && copy.earnCredits && (
207
+ <CompleteProfilePanel copy={copy.earnCredits.completeProfile} onClose={popView} />
208
+ )}
209
+ {currentView.type === MemberPopupPanelType.Subscribe && copy.activitiesSubscribe && (
210
+ <ActivitiesSubscribePanel copy={copy.activitiesSubscribe} email={profile?.email} />
211
+ )}
212
+ {currentView.type === MemberPopupPanelType.SubscribeEmail && copy.earnCredits && (
213
+ <SubscribeEmailPanel copy={copy.earnCredits.subscribe} email={profile?.email} onClose={popView} />
214
+ )}
215
+ {currentView.type === MemberPopupPanelType.Activate && copy.earnCredits && (
216
+ <ActivatePanel copy={copy.earnCredits.authCodeActivate} onClose={popView} />
217
+ )}
218
+ {currentView.type === MemberPopupPanelType.RedeemCoupon &&
219
+ currentView.props &&
220
+ copy.consumeCredits && (
221
+ <RedeemCouponPanel
222
+ item={currentView.props as any}
223
+ copy={copy.consumeCredits}
224
+ onClose={popView}
225
+ />
265
226
  )}
266
- onClick={openSignUpPopup}
267
- >
268
- {copy.footer.joinLabel}
269
- </button>
227
+ </Suspense>
228
+ )}
229
+ </div>
230
+
231
+ {copy.footer && !isLogin && (
232
+ <div className="border-t border-[#dadce0] p-[16px]">
233
+ <div className="flex items-center justify-between gap-[16px]">
234
+ <div className="inline gap-[4px]">
235
+ <span className="text-[14px] font-[700] text-[#080a0f]">{copy.footer.loginHint}</span>
236
+ <button
237
+ className="cursor-pointer ml-[4px] text-[14px] font-bold text-[#080a0f] underline"
238
+ onClick={openSignInPopup}
239
+ >
240
+ {copy.footer.loginLabel}
241
+ </button>
242
+ </div>
243
+ <div className="flex shrink-0 items-center gap-[8px]">
244
+ <button
245
+ className={cn(
246
+ 'cursor-pointer border-[1.6px] border-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-[#080a0f]',
247
+ rounded ? 'rounded-[4px]' : 'rounded-none'
248
+ )}
249
+ onClick={openSignUpPopup}
250
+ >
251
+ {copy.footer.joinLabel}
252
+ </button>
253
+ </div>
270
254
  </div>
271
255
  </div>
272
- </div>
273
- )}
256
+ )}
257
+ </div>
274
258
  </div>
275
259
  )}
276
260
 
277
261
  <button
278
262
  className="flex cursor-pointer items-center justify-center rounded-full bg-white shadow-lg md:ml-auto md:mr-[16px]"
279
- onClick={() => setIsOpen(prev => !prev)}
263
+ onClick={() => {
264
+ const next = !isOpen
265
+ trackLpButton('floating_button', next ? 'open' : 'close')
266
+ setIsOpen(next)
267
+ }}
280
268
  aria-label={copy.triggerImg.alt ?? 'Open member popup'}
281
269
  >
282
270
  <Picture source={copy.triggerImg.url} alt={copy.triggerImg.alt ?? ''} className="size-[58px]" />
@@ -1,9 +1,9 @@
1
- import { createContext, PropsWithChildren, useContext } from 'react'
1
+ import { createContext, PropsWithChildren, useContext, useState } from 'react'
2
2
  import { HeadlessProvider, type HeadlessConfig } from '@anker-in/lib'
3
3
  import { RegistrationProvider } from '../../registration'
4
- import type { EarnCreditsCopy, MemberPopupContextValue } from '../type'
4
+ import type { EarnCreditsCopy, MemberPopupContextValue, MemberPopupInternalContextValue } from '../type'
5
5
 
6
- export const MemberPopupContext = createContext<MemberPopupContextValue>({
6
+ export const MemberPopupContext = createContext<MemberPopupInternalContextValue>({
7
7
  profile: null,
8
8
  isLoadingProfile: false,
9
9
  creditInfo: undefined,
@@ -16,6 +16,12 @@ export const MemberPopupContext = createContext<MemberPopupContextValue>({
16
16
  locale: '',
17
17
  appName: '',
18
18
  },
19
+ isSubscribeSuccess: false,
20
+ setIsSubscribeSuccess: () => {},
21
+ isActivateSuccess: false,
22
+ setIsActivateSuccess: () => {},
23
+ isProfileCompleteSuccess: false,
24
+ setIsProfileCompleteSuccess: () => {},
19
25
  })
20
26
 
21
27
  type MemberPopupProviderProps = MemberPopupContextValue & {
@@ -29,13 +35,27 @@ export function MemberPopupProvider({
29
35
  earnCreditsCopy,
30
36
  ...contextValue
31
37
  }: PropsWithChildren<MemberPopupProviderProps>) {
38
+ const [isSubscribeSuccess, setIsSubscribeSuccess] = useState(false)
39
+ const [isActivateSuccess, setIsActivateSuccess] = useState(false)
40
+ const [isProfileCompleteSuccess, setIsProfileCompleteSuccess] = useState(false)
41
+
32
42
  return (
33
43
  <HeadlessProvider headlessConfig={headlessConfig}>
34
44
  <RegistrationProvider
35
45
  email={contextValue.profile?.email}
36
46
  copy={{ authCodeActivate: earnCreditsCopy?.authCodeActivate }}
37
47
  >
38
- <MemberPopupContext.Provider value={contextValue}>
48
+ <MemberPopupContext.Provider
49
+ value={{
50
+ ...contextValue,
51
+ isSubscribeSuccess,
52
+ setIsSubscribeSuccess,
53
+ isActivateSuccess,
54
+ setIsActivateSuccess,
55
+ isProfileCompleteSuccess,
56
+ setIsProfileCompleteSuccess,
57
+ }}
58
+ >
39
59
  {children}
40
60
  </MemberPopupContext.Provider>
41
61
  </RegistrationProvider>