@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.
- package/dist/cjs/components/credits/context/hooks/useCountries.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useCountries.js.map +3 -3
- package/dist/cjs/components/memberPopup/MemberPopup.d.ts +1 -1
- package/dist/cjs/components/memberPopup/MemberPopup.js +1 -1
- package/dist/cjs/components/memberPopup/MemberPopup.js.map +3 -3
- package/dist/cjs/components/memberPopup/context/provider.d.ts +3 -3
- package/dist/cjs/components/memberPopup/context/provider.js +1 -1
- package/dist/cjs/components/memberPopup/context/provider.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +7 -0
- package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
- package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +9 -7
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
- package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
- package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +1 -1
- package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +2 -2
- package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
- package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
- package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
- package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +1 -1
- package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
- package/dist/cjs/components/memberPopup/panels/Referral/index.js +1 -1
- package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +3 -3
- package/dist/cjs/components/memberPopup/type.d.ts +29 -3
- package/dist/cjs/components/memberPopup/type.js +1 -1
- package/dist/cjs/components/memberPopup/type.js.map +2 -2
- package/dist/cjs/templates/Credits.js +1 -1
- package/dist/cjs/templates/Credits.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useCountries.js +1 -1
- package/dist/esm/components/credits/context/hooks/useCountries.js.map +3 -3
- package/dist/esm/components/memberPopup/MemberPopup.d.ts +1 -1
- package/dist/esm/components/memberPopup/MemberPopup.js +1 -1
- package/dist/esm/components/memberPopup/MemberPopup.js.map +3 -3
- package/dist/esm/components/memberPopup/context/provider.d.ts +3 -3
- package/dist/esm/components/memberPopup/context/provider.js +1 -1
- package/dist/esm/components/memberPopup/context/provider.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +7 -0
- package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
- package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +9 -7
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
- package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
- package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +1 -1
- package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +2 -2
- package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
- package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
- package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
- package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +1 -1
- package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
- package/dist/esm/components/memberPopup/panels/Referral/index.js +1 -1
- package/dist/esm/components/memberPopup/panels/Referral/index.js.map +3 -3
- package/dist/esm/components/memberPopup/type.d.ts +29 -3
- package/dist/esm/components/memberPopup/type.js +1 -1
- package/dist/esm/components/memberPopup/type.js.map +2 -2
- package/dist/esm/templates/Credits.js +1 -1
- package/dist/esm/templates/Credits.js.map +3 -3
- package/package.json +1 -1
- package/src/components/credits/context/hooks/useCountries.ts +4 -15
- package/src/components/memberPopup/MemberPopup.tsx +170 -177
- package/src/components/memberPopup/context/provider.tsx +24 -4
- package/src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx +194 -0
- package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +93 -60
- package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +200 -87
- package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +30 -15
- package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +6 -1
- package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +65 -35
- package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +15 -6
- package/src/components/memberPopup/panels/EarnCredits/index.tsx +131 -86
- package/src/components/memberPopup/panels/Referral/index.tsx +35 -16
- package/src/components/memberPopup/type.ts +26 -3
- package/src/templates/Credits.tsx +25 -0
- package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
- package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
- package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
- package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
- package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +0 -7
- package/dist/cjs/components/memberPopup/panels/Activity/index.js +0 -2
- package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
- package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
- package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
- package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
- package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
- package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
- package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
- package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
- package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
- package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +0 -7
- package/dist/esm/components/memberPopup/panels/Activity/index.js +0 -2
- package/dist/esm/components/memberPopup/panels/Activity/index.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
- package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
- package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
- package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
- package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
- package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
- package/dist/index.d.mts +0 -1775
- package/dist/index.d.ts +0 -1775
- package/dist/index.js +0 -18542
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -18514
- package/dist/index.mjs.map +0 -1
- package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.tsx +0 -150
- package/src/components/memberPopup/panels/EarnCredits/SubscribeModal.tsx +0 -144
- package/src/components/memberPopup/panels/EarnCredits/SubscribePanel.tsx +0 -147
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react'
|
|
2
2
|
import { Button, Text } from '@anker-in/headless-ui'
|
|
3
|
-
import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
3
|
+
import { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
4
4
|
import type { CompleteProfileCopy } from '../../type'
|
|
5
5
|
import { useUpdateProfile } from './hooks/useUpdateProfile'
|
|
6
6
|
import useCountries from '../../../credits/context/hooks/useCountries'
|
|
@@ -9,15 +9,13 @@ import { ROUNDED_BRANDS } from '../../../../constants'
|
|
|
9
9
|
|
|
10
10
|
type Props = {
|
|
11
11
|
copy: CompleteProfileCopy
|
|
12
|
-
shopifyStoreDomain?: string
|
|
13
12
|
onClose: () => void
|
|
14
|
-
onSuccess?: () => void
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
export default function CompleteProfilePanel({ copy,
|
|
18
|
-
const { profile, fetchCreditInfo, alpcConfig } = useMemberPopupContext()
|
|
15
|
+
export default function CompleteProfilePanel({ copy, onClose }: Props) {
|
|
16
|
+
const { profile, fetchCreditInfo, alpcConfig, setIsProfileCompleteSuccess } = useMemberPopupContext()
|
|
19
17
|
const { locale } = alpcConfig
|
|
20
|
-
const { brand } = useHeadlessContext()
|
|
18
|
+
const { brand, storeDomain } = useHeadlessContext()
|
|
21
19
|
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
22
20
|
|
|
23
21
|
const [firstName, setFirstName] = useState('')
|
|
@@ -29,7 +27,7 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
29
27
|
const [lastNameError, setLastNameError] = useState('')
|
|
30
28
|
|
|
31
29
|
const { updateProfile, isLoading } = useUpdateProfile({ locale, appName: alpcConfig.appName })
|
|
32
|
-
const { countries } = useCountries({ shopifyStoreDomain })
|
|
30
|
+
const { countries } = useCountries({ shopifyStoreDomain: storeDomain })
|
|
33
31
|
|
|
34
32
|
useEffect(() => {
|
|
35
33
|
if (profile) {
|
|
@@ -41,6 +39,12 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
41
39
|
}
|
|
42
40
|
}, [profile])
|
|
43
41
|
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (countries.length > 0 && !country) {
|
|
44
|
+
setCountry(countries[0].id)
|
|
45
|
+
}
|
|
46
|
+
}, [countries])
|
|
47
|
+
|
|
44
48
|
const validate = useCallback(() => {
|
|
45
49
|
let hasError = false
|
|
46
50
|
if (!firstName.trim()) {
|
|
@@ -69,21 +73,43 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
69
73
|
})
|
|
70
74
|
if (success) {
|
|
71
75
|
fetchCreditInfo(profile?.user_id)
|
|
72
|
-
|
|
76
|
+
setIsProfileCompleteSuccess(true)
|
|
77
|
+
gaTrack({
|
|
78
|
+
event: 'ga4Event',
|
|
79
|
+
event_name: 'lp_button',
|
|
80
|
+
event_parameters: {
|
|
81
|
+
position: 'earn_credits',
|
|
82
|
+
button_name: 'complete_profile_success',
|
|
83
|
+
info: 'Member Floating Window',
|
|
84
|
+
},
|
|
85
|
+
})
|
|
73
86
|
onClose()
|
|
74
87
|
}
|
|
75
|
-
}, [
|
|
88
|
+
}, [
|
|
89
|
+
validate,
|
|
90
|
+
updateProfile,
|
|
91
|
+
firstName,
|
|
92
|
+
lastName,
|
|
93
|
+
phone,
|
|
94
|
+
country,
|
|
95
|
+
birthDay,
|
|
96
|
+
fetchCreditInfo,
|
|
97
|
+
profile,
|
|
98
|
+
setIsProfileCompleteSuccess,
|
|
99
|
+
onClose,
|
|
100
|
+
])
|
|
76
101
|
|
|
77
102
|
return (
|
|
78
|
-
<div className="flex flex-col gap-[
|
|
79
|
-
{copy.subtitle &&
|
|
80
|
-
<Text className="text-[14px] text-[#1d1d1f]" html={copy.subtitle} />
|
|
81
|
-
)}
|
|
103
|
+
<div className="flex flex-col gap-[16px]">
|
|
104
|
+
{copy.subtitle && <Text className="text-[14px] text-[#1d1d1f]" html={copy.subtitle} />}
|
|
82
105
|
|
|
83
106
|
<div>
|
|
84
107
|
<label className="block text-[14px] font-[700] text-[#1d1d1f]">{copy.email}</label>
|
|
85
108
|
<input
|
|
86
|
-
className={cn(
|
|
109
|
+
className={cn(
|
|
110
|
+
'mt-[8px] h-[46px] w-full border border-[#d8d8d8] bg-[#f5f5f5] px-[12px] text-[14px] text-[#999]',
|
|
111
|
+
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
112
|
+
)}
|
|
87
113
|
value={profile?.email ?? ''}
|
|
88
114
|
disabled
|
|
89
115
|
/>
|
|
@@ -100,7 +126,10 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
100
126
|
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
101
127
|
)}
|
|
102
128
|
value={firstName}
|
|
103
|
-
onChange={e => {
|
|
129
|
+
onChange={e => {
|
|
130
|
+
setFirstName(e.target.value)
|
|
131
|
+
setFirstNameError('')
|
|
132
|
+
}}
|
|
104
133
|
/>
|
|
105
134
|
{firstNameError && <Text className="mt-[4px] text-[12px] text-[#f84d4f]" html={firstNameError} />}
|
|
106
135
|
</div>
|
|
@@ -116,7 +145,10 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
116
145
|
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
117
146
|
)}
|
|
118
147
|
value={lastName}
|
|
119
|
-
onChange={e => {
|
|
148
|
+
onChange={e => {
|
|
149
|
+
setLastName(e.target.value)
|
|
150
|
+
setLastNameError('')
|
|
151
|
+
}}
|
|
120
152
|
/>
|
|
121
153
|
{lastNameError && <Text className="mt-[4px] text-[12px] text-[#f84d4f]" html={lastNameError} />}
|
|
122
154
|
</div>
|
|
@@ -124,7 +156,10 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
124
156
|
<div>
|
|
125
157
|
<label className="block text-[14px] font-[700] text-[#1d1d1f]">{copy.birthday}</label>
|
|
126
158
|
<input
|
|
127
|
-
className={cn(
|
|
159
|
+
className={cn(
|
|
160
|
+
'mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none',
|
|
161
|
+
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
162
|
+
)}
|
|
128
163
|
type="date"
|
|
129
164
|
value={birthDay}
|
|
130
165
|
onChange={e => setBirthDay(e.target.value)}
|
|
@@ -134,7 +169,10 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
134
169
|
<div>
|
|
135
170
|
<label className="block text-[14px] font-[700] text-[#1d1d1f]">{copy.phone}</label>
|
|
136
171
|
<input
|
|
137
|
-
className={cn(
|
|
172
|
+
className={cn(
|
|
173
|
+
'mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none',
|
|
174
|
+
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
175
|
+
)}
|
|
138
176
|
value={phone}
|
|
139
177
|
onChange={e => setPhone(e.target.value)}
|
|
140
178
|
/>
|
|
@@ -143,34 +181,26 @@ export default function CompleteProfilePanel({ copy, shopifyStoreDomain = '', on
|
|
|
143
181
|
<div>
|
|
144
182
|
<label className="block text-[14px] font-[700] text-[#1d1d1f]">{copy.country}</label>
|
|
145
183
|
<select
|
|
146
|
-
className={cn(
|
|
184
|
+
className={cn(
|
|
185
|
+
'mt-[8px] h-[46px] w-full border border-[#d8d8d8] px-[12px] text-[14px] outline-none',
|
|
186
|
+
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
187
|
+
)}
|
|
147
188
|
value={country}
|
|
148
189
|
onChange={e => setCountry(e.target.value)}
|
|
149
190
|
>
|
|
150
|
-
<option value="" />
|
|
151
191
|
{countries.map((c: { id: string; name: string }) => (
|
|
152
|
-
<option key={c.id} value={c.id}>
|
|
192
|
+
<option key={c.id} value={c.id}>
|
|
193
|
+
{c.name}
|
|
194
|
+
</option>
|
|
153
195
|
))}
|
|
154
196
|
</select>
|
|
155
197
|
</div>
|
|
156
198
|
|
|
157
199
|
<div className="flex gap-[12px]">
|
|
158
|
-
<Button
|
|
159
|
-
variant="secondary"
|
|
160
|
-
size="lg"
|
|
161
|
-
className="flex-1"
|
|
162
|
-
onClick={onClose}
|
|
163
|
-
disabled={isLoading}
|
|
164
|
-
>
|
|
200
|
+
<Button variant="secondary" size="lg" className="flex-1" onClick={onClose} disabled={isLoading}>
|
|
165
201
|
{copy.cancel}
|
|
166
202
|
</Button>
|
|
167
|
-
<Button
|
|
168
|
-
variant="primary"
|
|
169
|
-
size="lg"
|
|
170
|
-
className="flex-1"
|
|
171
|
-
loading={isLoading}
|
|
172
|
-
onClick={handleSubmit}
|
|
173
|
-
>
|
|
203
|
+
<Button variant="primary" size="lg" className="flex-1" loading={isLoading} onClick={handleSubmit}>
|
|
174
204
|
{copy.save}
|
|
175
205
|
</Button>
|
|
176
206
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react'
|
|
2
2
|
import { Checkbox, Text } from '@anker-in/headless-ui'
|
|
3
|
-
import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
3
|
+
import { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
4
4
|
import Cookies from 'js-cookie'
|
|
5
5
|
import { parse } from 'query-string'
|
|
6
6
|
import { emailValidate } from '../../../credits/context/utils'
|
|
@@ -12,7 +12,6 @@ type Props = {
|
|
|
12
12
|
copy: SubscribeModalCopy
|
|
13
13
|
email?: string
|
|
14
14
|
onClose: () => void
|
|
15
|
-
onSuccess?: () => void
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
function getAdCookie() {
|
|
@@ -27,8 +26,8 @@ function getAdCookie() {
|
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose
|
|
31
|
-
const { alpcConfig } = useMemberPopupContext()
|
|
29
|
+
export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose }: Props) {
|
|
30
|
+
const { alpcConfig, setIsSubscribeSuccess, fetchCreditInfo, profile } = useMemberPopupContext()
|
|
32
31
|
const { brand, locale } = alpcConfig
|
|
33
32
|
const { brand: headlessBrand } = useHeadlessContext()
|
|
34
33
|
const rounded = ROUNDED_BRANDS.includes(headlessBrand)
|
|
@@ -64,7 +63,17 @@ export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose
|
|
|
64
63
|
const result = await response.json()
|
|
65
64
|
if (!result.errors) {
|
|
66
65
|
setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
|
|
67
|
-
|
|
66
|
+
setIsSubscribeSuccess(true)
|
|
67
|
+
if (profile?.user_id) fetchCreditInfo(profile.user_id)
|
|
68
|
+
gaTrack({
|
|
69
|
+
event: 'ga4Event',
|
|
70
|
+
event_name: 'subscribe',
|
|
71
|
+
event_parameters: {
|
|
72
|
+
page_group: copy.dealsType ?? '',
|
|
73
|
+
position: 'sticky',
|
|
74
|
+
info: '',
|
|
75
|
+
},
|
|
76
|
+
})
|
|
68
77
|
setTimeout(() => {
|
|
69
78
|
setSuccessMessage('')
|
|
70
79
|
onClose()
|
|
@@ -77,7 +86,7 @@ export default function SubscribeEmailPanel({ copy, email: initialEmail, onClose
|
|
|
77
86
|
} finally {
|
|
78
87
|
setLoading(false)
|
|
79
88
|
}
|
|
80
|
-
}, [email, policy, locale, brand, copy, onClose,
|
|
89
|
+
}, [email, policy, locale, brand, copy, onClose, setIsSubscribeSuccess])
|
|
81
90
|
|
|
82
91
|
return (
|
|
83
92
|
<div className="flex flex-col gap-[12px]">
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useMemo } from 'react'
|
|
2
|
-
import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
2
|
+
import { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
3
3
|
import { useMemberPopupContext } from '../../context/provider'
|
|
4
4
|
import { useViewStack } from '../../context/viewStack'
|
|
5
5
|
import { useSubscribed } from './hooks/useSubscribed'
|
|
@@ -23,91 +23,128 @@ function TaskIcon({ id, className }: { id: EarnCreditsTaskType; className?: stri
|
|
|
23
23
|
|
|
24
24
|
type Props = {
|
|
25
25
|
copy: EarnCreditsCopy
|
|
26
|
-
onClose: () => void
|
|
27
|
-
isSubscribeSuccess?: boolean
|
|
28
|
-
isActivateSuccess?: boolean
|
|
29
|
-
isProfileCompleteSuccess?: boolean
|
|
30
|
-
onSubscribeSuccess?: () => void
|
|
31
|
-
onActivateSuccess?: () => void
|
|
32
|
-
onProfileCompleteSuccess?: () => void
|
|
33
26
|
}
|
|
34
27
|
|
|
35
|
-
function EarnCredits({
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
const { profile, openSignUpPopup, alpcConfig, creditInfo } = useMemberPopupContext()
|
|
28
|
+
function EarnCredits({ copy }: Props) {
|
|
29
|
+
const {
|
|
30
|
+
profile,
|
|
31
|
+
openSignUpPopup,
|
|
32
|
+
alpcConfig,
|
|
33
|
+
creditInfo,
|
|
34
|
+
isSubscribeSuccess,
|
|
35
|
+
isActivateSuccess,
|
|
36
|
+
isProfileCompleteSuccess,
|
|
37
|
+
} = useMemberPopupContext()
|
|
46
38
|
const { pushView } = useViewStack()
|
|
47
39
|
const { locale } = alpcConfig
|
|
48
40
|
const { brand } = useHeadlessContext()
|
|
49
41
|
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
50
42
|
|
|
43
|
+
console.log('creditInfo', creditInfo)
|
|
44
|
+
|
|
51
45
|
const isLogin = !!profile
|
|
52
46
|
|
|
53
47
|
const isSubscribed = useSubscribed({
|
|
54
48
|
userId: profile?.user_id,
|
|
55
|
-
brand:
|
|
49
|
+
brand: brand,
|
|
56
50
|
email: profile?.email,
|
|
57
51
|
locale,
|
|
58
52
|
apiBaseUrl: alpcConfig.apiBaseUrl,
|
|
59
53
|
})
|
|
60
54
|
|
|
61
55
|
const profileCompleted = useMemo(() => {
|
|
62
|
-
return
|
|
56
|
+
return (
|
|
57
|
+
isProfileCompleteSuccess ||
|
|
58
|
+
(!!(profile?.first_name || profile?.last_name) && !!profile?.phone_number && !!profile?.dob)
|
|
59
|
+
)
|
|
63
60
|
}, [profile, isProfileCompleteSuccess])
|
|
64
61
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
62
|
+
function trackTaskButton(taskId: EarnCreditsTaskType) {
|
|
63
|
+
const taskButtonNameMap: Record<EarnCreditsTaskType, string> = {
|
|
64
|
+
[EarnCreditsTaskType.Activate]: 'activate',
|
|
65
|
+
[EarnCreditsTaskType.CompleteProfile]: 'complete_profile',
|
|
66
|
+
[EarnCreditsTaskType.Subscribe]: 'subscribe',
|
|
67
|
+
[EarnCreditsTaskType.Shop]: 'shop',
|
|
68
|
+
}
|
|
69
|
+
gaTrack({
|
|
70
|
+
event: 'ga4Event',
|
|
71
|
+
event_name: 'lp_button',
|
|
72
|
+
event_parameters: {
|
|
73
|
+
position: 'earn_credits',
|
|
74
|
+
button_name: taskButtonNameMap[taskId],
|
|
75
|
+
info: 'Member Floating Window',
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const taskStates: Record<EarnCreditsTaskType, { finished: boolean; onClick?: () => void; link?: string }> = useMemo(
|
|
81
|
+
() => ({
|
|
82
|
+
[EarnCreditsTaskType.Activate]: {
|
|
83
|
+
finished: !!profile?.activated || isActivateSuccess,
|
|
84
|
+
onClick: isLogin
|
|
85
|
+
? () => {
|
|
86
|
+
trackTaskButton(EarnCreditsTaskType.Activate)
|
|
87
|
+
pushView({
|
|
88
|
+
type: MemberPopupPanelType.Activate,
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
: openSignUpPopup,
|
|
92
|
+
},
|
|
93
|
+
[EarnCreditsTaskType.CompleteProfile]: {
|
|
94
|
+
finished: profileCompleted,
|
|
95
|
+
onClick: isLogin
|
|
96
|
+
? () => {
|
|
97
|
+
trackTaskButton(EarnCreditsTaskType.CompleteProfile)
|
|
98
|
+
pushView({
|
|
99
|
+
type: MemberPopupPanelType.CompleteProfile,
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
: openSignUpPopup,
|
|
103
|
+
},
|
|
104
|
+
[EarnCreditsTaskType.Subscribe]: {
|
|
105
|
+
finished: isSubscribed || isSubscribeSuccess,
|
|
106
|
+
onClick: isLogin
|
|
107
|
+
? () => {
|
|
108
|
+
trackTaskButton(EarnCreditsTaskType.Subscribe)
|
|
109
|
+
pushView({
|
|
110
|
+
type: MemberPopupPanelType.SubscribeEmail,
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
: openSignUpPopup,
|
|
114
|
+
},
|
|
115
|
+
[EarnCreditsTaskType.Shop]: {
|
|
116
|
+
finished: false,
|
|
117
|
+
link: copy.goShopLink,
|
|
118
|
+
onClick: isLogin ? () => trackTaskButton(EarnCreditsTaskType.Shop) : openSignUpPopup,
|
|
119
|
+
},
|
|
120
|
+
}),
|
|
121
|
+
[
|
|
122
|
+
profile,
|
|
123
|
+
isLogin,
|
|
124
|
+
isActivateSuccess,
|
|
125
|
+
isProfileCompleteSuccess,
|
|
126
|
+
profileCompleted,
|
|
127
|
+
isSubscribed,
|
|
128
|
+
isSubscribeSuccess,
|
|
129
|
+
openSignUpPopup,
|
|
130
|
+
pushView,
|
|
131
|
+
copy.goShopLink,
|
|
132
|
+
]
|
|
133
|
+
)
|
|
99
134
|
|
|
100
135
|
const list = useMemo(() => {
|
|
101
|
-
return copy.list
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
136
|
+
return copy.list
|
|
137
|
+
.map(item => {
|
|
138
|
+
const state = taskStates[item.id]
|
|
139
|
+
if (!state) return null
|
|
140
|
+
const buttonLabel = state.finished
|
|
141
|
+
? copy.completed
|
|
142
|
+
: isLogin
|
|
143
|
+
? getNotFinishedLabel(item.id, copy)
|
|
144
|
+
: copy.joinNow
|
|
145
|
+
return { ...item, ...state, buttonLabel }
|
|
146
|
+
})
|
|
147
|
+
.filter(Boolean) as ((typeof copy.list)[number] & {
|
|
111
148
|
finished: boolean
|
|
112
149
|
onClick?: () => void
|
|
113
150
|
link?: string
|
|
@@ -122,15 +159,18 @@ function EarnCredits({
|
|
|
122
159
|
{copy.title && <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>}
|
|
123
160
|
</div>
|
|
124
161
|
|
|
125
|
-
{isLogin &&
|
|
126
|
-
<div
|
|
162
|
+
{isLogin && (
|
|
163
|
+
<div
|
|
164
|
+
className={cn(
|
|
165
|
+
'flex items-center gap-[12px] bg-[#f5f6f7] p-[16px]',
|
|
166
|
+
rounded ? 'rounded-[8px]' : 'rounded-none'
|
|
167
|
+
)}
|
|
168
|
+
>
|
|
127
169
|
<div className="flex flex-1 flex-col gap-[4px]">
|
|
128
|
-
<div className="text-[14px] font-[700] text-[#1e2024]">
|
|
129
|
-
{copy.balanceLabel ?? 'AnkerCredits Balance'}
|
|
130
|
-
</div>
|
|
170
|
+
<div className="text-[14px] font-[700] text-[#1e2024]">{copy.balanceLabel ?? 'AnkerCredits Balance'}</div>
|
|
131
171
|
<div className="flex items-end gap-[4px]">
|
|
132
172
|
<span className="text-[24px] font-[700] leading-[1.2] text-[#1e2024]">
|
|
133
|
-
{numberFormat(creditInfo
|
|
173
|
+
{numberFormat(creditInfo?.available_credit ?? 0)}
|
|
134
174
|
</span>
|
|
135
175
|
<span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
|
|
136
176
|
{copy.creditUnit ?? 'ankercredits'}
|
|
@@ -139,12 +179,10 @@ function EarnCredits({
|
|
|
139
179
|
</div>
|
|
140
180
|
<div className="h-full w-px bg-[#dadce0]" />
|
|
141
181
|
<div className="flex flex-1 flex-col gap-[4px]">
|
|
142
|
-
<div className="text-[14px] font-[700] text-[#1e2024]">
|
|
143
|
-
{copy.comingSoonLabel ?? 'Coming Soon'}
|
|
144
|
-
</div>
|
|
182
|
+
<div className="text-[14px] font-[700] text-[#1e2024]">{copy.comingSoonLabel ?? 'Coming Soon'}</div>
|
|
145
183
|
<div className="flex items-end gap-[4px]">
|
|
146
184
|
<span className="text-[24px] font-[700] leading-[1.2] text-[#1e2024]">
|
|
147
|
-
{numberFormat(creditInfo
|
|
185
|
+
{numberFormat(creditInfo?.pending_credit ?? 0)}
|
|
148
186
|
</span>
|
|
149
187
|
<span className="text-[14px] font-[700] leading-[1.4] text-[#1e2024]">
|
|
150
188
|
{copy.creditUnit ?? 'ankercredits'}
|
|
@@ -156,15 +194,13 @@ function EarnCredits({
|
|
|
156
194
|
</div>
|
|
157
195
|
|
|
158
196
|
<div className="flex flex-col gap-[16px]">
|
|
159
|
-
{copy.subtitle &&
|
|
160
|
-
<p className="text-[16px] font-[700] text-[#1e2024]">{copy.subtitle}</p>
|
|
161
|
-
)}
|
|
197
|
+
{copy.subtitle && <p className="text-[16px] font-[700] text-[#1e2024]">{copy.subtitle}</p>}
|
|
162
198
|
|
|
163
199
|
<div className="flex flex-col">
|
|
164
200
|
{list.map((item, idx) => (
|
|
165
201
|
<div key={idx} className="relative py-[16px]">
|
|
166
202
|
{idx > 0 && <div className="absolute left-0 right-0 top-0 h-px bg-[#dadce0]" />}
|
|
167
|
-
<div className={cn('flex items-center gap-[12px]'
|
|
203
|
+
<div className={cn('flex items-center gap-[12px]')}>
|
|
168
204
|
<TaskIcon id={item.id} className="size-[24px] shrink-0" />
|
|
169
205
|
<div className="flex-1">
|
|
170
206
|
<div className="text-[16px] font-[700] text-[#1e2024]">{item.title}</div>
|
|
@@ -172,12 +208,16 @@ function EarnCredits({
|
|
|
172
208
|
<div className="mt-[4px] text-[14px] font-[700] text-[#4a4c56]">{item.description}</div>
|
|
173
209
|
)}
|
|
174
210
|
</div>
|
|
175
|
-
{!item.finished && item.link ? (
|
|
211
|
+
{!item.finished && item.link && isLogin ? (
|
|
176
212
|
<a
|
|
177
213
|
href={item.link}
|
|
178
214
|
target="_blank"
|
|
179
215
|
rel="noopener noreferrer"
|
|
180
|
-
className={cn(
|
|
216
|
+
className={cn(
|
|
217
|
+
'cursor-pointer bg-[#080a0f] min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white',
|
|
218
|
+
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
219
|
+
)}
|
|
220
|
+
onClick={() => trackTaskButton(item.id)}
|
|
181
221
|
>
|
|
182
222
|
{item.buttonLabel}
|
|
183
223
|
</a>
|
|
@@ -186,7 +226,8 @@ function EarnCredits({
|
|
|
186
226
|
className={cn(
|
|
187
227
|
'cursor-pointer min-w-[118px] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white',
|
|
188
228
|
item.finished ? 'bg-[#767880]' : 'bg-[#080a0f]',
|
|
189
|
-
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
229
|
+
rounded ? 'rounded-[4px]' : 'rounded-none',
|
|
230
|
+
item.finished && 'opacity-60'
|
|
190
231
|
)}
|
|
191
232
|
disabled={item.finished}
|
|
192
233
|
onClick={!item.finished ? item.onClick : undefined}
|
|
@@ -205,10 +246,14 @@ function EarnCredits({
|
|
|
205
246
|
|
|
206
247
|
function getNotFinishedLabel(id: EarnCreditsTaskType, copy: EarnCreditsCopy): string {
|
|
207
248
|
switch (id) {
|
|
208
|
-
case EarnCreditsTaskType.Activate:
|
|
209
|
-
|
|
210
|
-
case EarnCreditsTaskType.
|
|
211
|
-
|
|
249
|
+
case EarnCreditsTaskType.Activate:
|
|
250
|
+
return copy.activate
|
|
251
|
+
case EarnCreditsTaskType.CompleteProfile:
|
|
252
|
+
return copy.completeProfileLabel
|
|
253
|
+
case EarnCreditsTaskType.Subscribe:
|
|
254
|
+
return copy.subscribeLabel
|
|
255
|
+
case EarnCreditsTaskType.Shop:
|
|
256
|
+
return copy.shopNow
|
|
212
257
|
}
|
|
213
258
|
}
|
|
214
259
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Picture } from '@anker-in/headless-ui'
|
|
2
|
-
import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
2
|
+
import { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'
|
|
3
3
|
import { useMemberPopupContext } from '../../context/provider'
|
|
4
4
|
import { useReferralOverview } from './hooks/useReferralOverview'
|
|
5
5
|
import { formatPrice } from '../../../credits/context/utils'
|
|
@@ -13,7 +13,7 @@ type Props = {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
function Referral({ copy, onClose }: Props) {
|
|
16
|
-
const { profile, alpcConfig } = useMemberPopupContext()
|
|
16
|
+
const { profile, alpcConfig, pageHandle } = useMemberPopupContext()
|
|
17
17
|
const isLogin = !!profile
|
|
18
18
|
const { brand, currencyCode = 'USD' as string } = useHeadlessContext()
|
|
19
19
|
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
@@ -23,19 +23,37 @@ function Referral({ copy, onClose }: Props) {
|
|
|
23
23
|
const cashAvailable = data?.data?.data?.available ?? 0
|
|
24
24
|
const cashPending = data?.data?.data?.pending ?? 0
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
function buildRefUrl(url: string) {
|
|
27
|
+
try {
|
|
28
|
+
if (!pageHandle) return url
|
|
29
|
+
const target = new URL(url, window.location.href)
|
|
30
|
+
target.searchParams.set('ref', `${pageHandle}_referral`)
|
|
31
|
+
return target.toString()
|
|
32
|
+
} catch {
|
|
33
|
+
return url
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function trackReferralCta() {
|
|
38
|
+
gaTrack({
|
|
39
|
+
event: 'ga4Event',
|
|
40
|
+
event_name: 'lp_button',
|
|
41
|
+
event_parameters: {
|
|
42
|
+
position: 'referral',
|
|
43
|
+
button_name: 'referral_cta',
|
|
44
|
+
info: 'Member Floating Window',
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
}
|
|
30
48
|
|
|
31
49
|
return (
|
|
32
|
-
<div className="flex flex-col
|
|
50
|
+
<div className="flex flex-col">
|
|
33
51
|
{copy.title && <h2 className="text-[24px] font-[700] leading-[1.2] text-[#080a0f]">{copy.title}</h2>}
|
|
34
52
|
|
|
35
53
|
{isLogin && (
|
|
36
54
|
<div
|
|
37
55
|
className={cn(
|
|
38
|
-
'flex items-center gap-[12px] bg-[#f5f6f7] p-[16px]',
|
|
56
|
+
'flex items-center mt-[16px] gap-[12px] bg-[#f5f6f7] p-[16px]',
|
|
39
57
|
rounded ? 'rounded-[8px]' : 'rounded-none'
|
|
40
58
|
)}
|
|
41
59
|
>
|
|
@@ -56,14 +74,14 @@ function Referral({ copy, onClose }: Props) {
|
|
|
56
74
|
)}
|
|
57
75
|
|
|
58
76
|
{(copy.howToTitle || copy.howToDescription) && (
|
|
59
|
-
<div className="flex flex-col gap-[8px]">
|
|
60
|
-
{copy.howToTitle &&
|
|
61
|
-
|
|
77
|
+
<div className="flex mt-[32px] flex-col gap-[8px]">
|
|
78
|
+
{copy.howToTitle && <h3 className="text-[20px] font-bold leading-[1.2] text-[#080a0f]">{copy.howToTitle}</h3>}
|
|
79
|
+
{copy.howToDescription && (
|
|
80
|
+
<p className="text-[14px] font-bold leading-[1.4] text-[#080A0F]">{copy.howToDescription}</p>
|
|
62
81
|
)}
|
|
63
|
-
{copy.howToDescription && <p className="text-[14px] leading-[1.5] text-[#1e2024]">{copy.howToDescription}</p>}
|
|
64
82
|
{copy.learnMoreLabel && copy.learnMoreUrl && (
|
|
65
83
|
<a
|
|
66
|
-
href={copy.learnMoreUrl}
|
|
84
|
+
href={buildRefUrl(copy.learnMoreUrl)}
|
|
67
85
|
target="_blank"
|
|
68
86
|
rel="noopener noreferrer"
|
|
69
87
|
className="flex items-center gap-[4px] text-[14px] font-[700] text-[#080a0f] underline"
|
|
@@ -84,19 +102,20 @@ function Referral({ copy, onClose }: Props) {
|
|
|
84
102
|
<Picture
|
|
85
103
|
source={copy.image.url}
|
|
86
104
|
alt={copy.image.alt ?? ''}
|
|
87
|
-
className={cn('
|
|
105
|
+
className={cn('mt-[8px] w-full', rounded ? 'rounded-[8px]' : 'rounded-none')}
|
|
88
106
|
/>
|
|
89
107
|
)}
|
|
90
108
|
|
|
91
109
|
{copy.ctaButton && (
|
|
92
110
|
<a
|
|
93
|
-
href={copy.ctaUrl
|
|
111
|
+
href={copy.ctaUrl ? buildRefUrl(copy.ctaUrl) : '#'}
|
|
94
112
|
target="_blank"
|
|
95
113
|
rel="noopener noreferrer"
|
|
96
114
|
className={cn(
|
|
97
|
-
'block w-full cursor-pointer bg-[#080a0f] py-[14px] text-center text-[14px] font-[700] text-white',
|
|
115
|
+
'block w-full mt-[16px] cursor-pointer bg-[#080a0f] py-[14px] text-center text-[14px] font-[700] text-white',
|
|
98
116
|
rounded ? 'rounded-[4px]' : 'rounded-none'
|
|
99
117
|
)}
|
|
118
|
+
onClick={trackReferralCta}
|
|
100
119
|
>
|
|
101
120
|
{copy.ctaButton}
|
|
102
121
|
</a>
|