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

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