@anker-in/campaign-ui 0.2.0-beta.1 → 0.2.0-beta.10
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/provider.d.ts +2 -2
- package/dist/cjs/components/credits/context/provider.js +1 -1
- package/dist/cjs/components/credits/context/provider.js.map +3 -3
- package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +1 -1
- package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
- package/dist/cjs/components/credits/creditsBenefits/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
- package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsInfoCard/index.d.ts +0 -2
- package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +2 -2
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
- package/dist/cjs/components/credits/modal/MyRewardsModal.js +1 -1
- package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +2 -2
- package/dist/cjs/components/credits/modal/activitiesModal.js +1 -1
- package/dist/cjs/components/credits/modal/activitiesModal.js.map +2 -2
- package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js +1 -1
- package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/modalContainer.js +1 -1
- package/dist/cjs/components/credits/modal/modalContainer.js.map +3 -3
- package/dist/cjs/components/credits/modal/subscribeModal.js +1 -1
- package/dist/cjs/components/credits/modal/subscribeModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/tip.js +1 -1
- package/dist/cjs/components/credits/modal/tip.js.map +3 -3
- package/dist/cjs/components/credits/type.d.ts +3 -2
- package/dist/cjs/components/credits/type.js +1 -1
- package/dist/cjs/components/credits/type.js.map +1 -1
- package/dist/cjs/components/registration/authCodeActivate/Message.js +1 -1
- package/dist/cjs/components/registration/authCodeActivate/Message.js.map +2 -2
- package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
- package/dist/cjs/components/registration/authCodeActivate/index.js.map +3 -3
- package/dist/cjs/components/registration/authCodeActivate/type.d.ts +0 -1
- package/dist/cjs/components/registration/authCodeActivate/type.js.map +1 -1
- package/dist/cjs/components/registration/context/provider.d.ts +2 -0
- package/dist/cjs/components/registration/context/provider.js +1 -1
- package/dist/cjs/components/registration/context/provider.js.map +3 -3
- package/dist/cjs/components/registration/modalContainer.d.ts +1 -2
- package/dist/cjs/components/registration/modalContainer.js +1 -1
- package/dist/cjs/components/registration/modalContainer.js.map +3 -3
- package/dist/cjs/templates/credits.d.ts +9 -8
- package/dist/cjs/templates/credits.js +1 -1
- package/dist/cjs/templates/credits.js.map +3 -3
- package/dist/esm/components/credits/context/provider.d.ts +2 -2
- package/dist/esm/components/credits/context/provider.js +1 -1
- package/dist/esm/components/credits/context/provider.js.map +3 -3
- package/dist/esm/components/credits/creditsBenefits/benefitItem.js +1 -1
- package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +3 -3
- package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
- package/dist/esm/components/credits/creditsBenefits/index.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/esm/components/credits/creditsFaq/index.js +1 -1
- package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/esm/components/credits/creditsInfoCard/index.d.ts +0 -2
- package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/esm/components/credits/creditsInfoCard/index.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
- package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
- package/dist/esm/components/credits/modal/MyRewardsModal.js +1 -1
- package/dist/esm/components/credits/modal/MyRewardsModal.js.map +3 -3
- package/dist/esm/components/credits/modal/activitiesModal.js +1 -1
- package/dist/esm/components/credits/modal/activitiesModal.js.map +3 -3
- package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js +1 -1
- package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
- package/dist/esm/components/credits/modal/modalContainer.js +1 -1
- package/dist/esm/components/credits/modal/modalContainer.js.map +3 -3
- package/dist/esm/components/credits/modal/subscribeModal.js +1 -1
- package/dist/esm/components/credits/modal/subscribeModal.js.map +3 -3
- package/dist/esm/components/credits/modal/tip.js +1 -1
- package/dist/esm/components/credits/modal/tip.js.map +3 -3
- package/dist/esm/components/credits/type.d.ts +3 -2
- package/dist/esm/components/registration/authCodeActivate/Message.js +1 -1
- package/dist/esm/components/registration/authCodeActivate/Message.js.map +2 -2
- package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
- package/dist/esm/components/registration/authCodeActivate/index.js.map +3 -3
- package/dist/esm/components/registration/authCodeActivate/type.d.ts +0 -1
- package/dist/esm/components/registration/context/provider.d.ts +2 -0
- package/dist/esm/components/registration/context/provider.js +1 -1
- package/dist/esm/components/registration/context/provider.js.map +3 -3
- package/dist/esm/components/registration/modalContainer.d.ts +1 -2
- package/dist/esm/components/registration/modalContainer.js +1 -1
- package/dist/esm/components/registration/modalContainer.js.map +3 -3
- package/dist/esm/templates/credits.d.ts +9 -8
- package/dist/esm/templates/credits.js +1 -1
- package/dist/esm/templates/credits.js.map +3 -3
- package/package.json +3 -3
- package/src/components/credits/context/provider.tsx +1 -4
- package/src/components/credits/creditsBenefits/benefitItem.tsx +2 -5
- package/src/components/credits/creditsBenefits/index.tsx +1 -4
- package/src/components/credits/creditsCash/CreditsCash.tsx +3 -6
- package/src/components/credits/creditsFaq/index.tsx +2 -3
- package/src/components/credits/creditsInfoCard/index.tsx +10 -12
- package/src/components/credits/creditsRedeemList/AddressForm/CountrySelect.tsx +3 -4
- package/src/components/credits/creditsRedeemList/AddressForm/StateSelect.tsx +2 -3
- package/src/components/credits/creditsRedeemList/AddressForm/index.tsx +2 -3
- package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +2 -4
- package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -3
- package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
- package/src/components/credits/creditsRedeemList/RedeemProductModal/Success.tsx +2 -3
- package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +2 -3
- package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +5 -3
- package/src/components/credits/creditsWaysToGetCredits/useActions.ts +4 -1
- package/src/components/credits/modal/MyRewardsModal.tsx +2 -3
- package/src/components/credits/modal/activitiesModal.tsx +2 -3
- package/src/components/credits/modal/creditsUploadReceiptModal.tsx +2 -3
- package/src/components/credits/modal/modalContainer.tsx +2 -3
- package/src/components/credits/modal/subscribeModal.tsx +9 -32
- package/src/components/credits/modal/tip.tsx +2 -3
- package/src/components/credits/type.ts +3 -2
- package/src/components/registration/authCodeActivate/Message.tsx +1 -1
- package/src/components/registration/authCodeActivate/index.tsx +141 -109
- package/src/components/registration/authCodeActivate/type.ts +0 -1
- package/src/components/registration/context/provider.tsx +9 -0
- package/src/components/registration/modalContainer.tsx +9 -7
- package/src/templates/credits.tsx +41 -31
- package/src/components/credits/const.ts +0 -1
|
@@ -6,17 +6,20 @@ import {
|
|
|
6
6
|
useHeadlessContext,
|
|
7
7
|
useEmailValidation,
|
|
8
8
|
useCountDown,
|
|
9
|
+
ROUNDED_BRANDS,
|
|
9
10
|
} from '@anker-in/lib'
|
|
10
11
|
import React, { useCallback, useEffect, useRef, useState } from 'react'
|
|
11
12
|
import { Message } from './Message'
|
|
12
13
|
import { AuthCodeActivateProps } from './type'
|
|
13
14
|
import { useRegistration } from '../context'
|
|
15
|
+
import { RegistrationModalContainer } from '../modalContainer'
|
|
14
16
|
|
|
15
|
-
export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy
|
|
16
|
-
const { locale } = useHeadlessContext()
|
|
17
|
+
export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy }) => {
|
|
18
|
+
const { locale, brand } = useHeadlessContext()
|
|
17
19
|
const { email, authCodeActivate } = useRegistration()
|
|
20
|
+
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
18
21
|
|
|
19
|
-
const { activeToken, setActiveToken, setIsSendingActivateEmail, setIsActivateSuccess, onAuthSuccess } =
|
|
22
|
+
const { activeToken, setActiveToken, setIsSendingActivateEmail, setIsActivateSuccess, onAuthSuccess, autoSendEmail } =
|
|
20
23
|
authCodeActivate
|
|
21
24
|
|
|
22
25
|
const { isMutating: emailValidationLoading, trigger: triggerEmailValidation } = useEmailValidation()
|
|
@@ -28,8 +31,8 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
28
31
|
} = useSendEmailValidation()
|
|
29
32
|
|
|
30
33
|
const [messageText, setMessageText] = useState('')
|
|
31
|
-
const [
|
|
32
|
-
const { startCountDown, startAction, countDown } = useCountDown(60)
|
|
34
|
+
const [messageStatus, setMessageStatus] = useState('')
|
|
35
|
+
const { startCountDown: isStartCountDown, startAction: startCountDown, countDown } = useCountDown(60)
|
|
33
36
|
|
|
34
37
|
const [error, setError] = useState('')
|
|
35
38
|
const [focusIndex, setFocusIndex] = useState(0)
|
|
@@ -45,10 +48,10 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
45
48
|
}, [focusIndex])
|
|
46
49
|
|
|
47
50
|
useEffect(() => {
|
|
48
|
-
if (sendEmailData
|
|
49
|
-
setActiveToken(sendEmailData.active_token)
|
|
51
|
+
if (sendEmailData?.data?.data?.active_token) {
|
|
52
|
+
setActiveToken(sendEmailData.data.data.active_token)
|
|
50
53
|
}
|
|
51
|
-
}, [sendEmailData])
|
|
54
|
+
}, [sendEmailData?.data?.data?.active_token])
|
|
52
55
|
|
|
53
56
|
useEffect(() => {
|
|
54
57
|
setIsSendingActivateEmail(isSendingEmail)
|
|
@@ -57,12 +60,25 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
57
60
|
// 自动发送邮箱验证码
|
|
58
61
|
useEffect(() => {
|
|
59
62
|
if (autoSendEmail && email) {
|
|
60
|
-
triggerSendValidationEmail(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
triggerSendValidationEmail(
|
|
64
|
+
{
|
|
65
|
+
email: email,
|
|
66
|
+
data: {
|
|
67
|
+
redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,
|
|
68
|
+
},
|
|
64
69
|
},
|
|
65
|
-
|
|
70
|
+
{
|
|
71
|
+
onSuccess: () => {
|
|
72
|
+
setMessageStatus('success')
|
|
73
|
+
setMessageText(copy?.sendEmailSuccessMessage || '')
|
|
74
|
+
startCountDown()
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
setMessageStatus('')
|
|
77
|
+
setMessageText('')
|
|
78
|
+
}, 5000)
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
)
|
|
66
82
|
}
|
|
67
83
|
}, [autoSendEmail, email, triggerSendValidationEmail])
|
|
68
84
|
|
|
@@ -78,8 +94,13 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
78
94
|
},
|
|
79
95
|
{
|
|
80
96
|
onSuccess: () => {
|
|
81
|
-
|
|
82
|
-
|
|
97
|
+
setMessageStatus('success')
|
|
98
|
+
setMessageText(copy?.sendEmailSuccessMessage || '')
|
|
99
|
+
startCountDown()
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
setMessageStatus('')
|
|
102
|
+
setMessageText('')
|
|
103
|
+
}, 5000)
|
|
83
104
|
},
|
|
84
105
|
}
|
|
85
106
|
)
|
|
@@ -150,10 +171,16 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
150
171
|
},
|
|
151
172
|
{
|
|
152
173
|
onSuccess: () => {
|
|
153
|
-
|
|
174
|
+
setMessageStatus('success')
|
|
154
175
|
setMessageText(copy?.authSuccessMessage || '')
|
|
155
176
|
setIsActivateSuccess(true)
|
|
156
|
-
onAuthSuccess
|
|
177
|
+
if (onAuthSuccess) {
|
|
178
|
+
onAuthSuccess()
|
|
179
|
+
} else {
|
|
180
|
+
setTimeout(() => {
|
|
181
|
+
authCodeActivate.close()
|
|
182
|
+
}, 3000)
|
|
183
|
+
}
|
|
157
184
|
},
|
|
158
185
|
onError: (err: any) => {
|
|
159
186
|
if (err?.errorCode === '104') {
|
|
@@ -171,7 +198,7 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
171
198
|
|
|
172
199
|
// 设置定时器清除状态信息
|
|
173
200
|
let timer = setTimeout(() => {
|
|
174
|
-
|
|
201
|
+
setMessageStatus('')
|
|
175
202
|
setMessageText('')
|
|
176
203
|
clearTimeout(timer)
|
|
177
204
|
}, 5000)
|
|
@@ -197,102 +224,107 @@ export const AuthCodeActivate: React.FC<AuthCodeActivateProps> = ({ copy, autoSe
|
|
|
197
224
|
])
|
|
198
225
|
|
|
199
226
|
return (
|
|
200
|
-
<
|
|
201
|
-
<div>
|
|
202
|
-
<
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
<Text
|
|
207
|
-
as="p"
|
|
208
|
-
className="mt-3 text-[14px] font-semibold leading-[140%] text-[rgba(51,51,51,0.75)] min-l:text-base [&_abbr]:text-[#333]"
|
|
209
|
-
html={copy?.authCodeDesc?.replace('%email%', email || '')}
|
|
210
|
-
/>
|
|
211
|
-
</div>
|
|
212
|
-
<div className="mt-6">
|
|
213
|
-
<Text
|
|
214
|
-
className="mt-4 text-[14px] !font-bold font-semibold leading-[140%] text-[#333] min-l:mt-6"
|
|
215
|
-
html={copy?.enterActiveCodeText}
|
|
216
|
-
/>
|
|
217
|
-
<div className="my-3 flex justify-between">
|
|
218
|
-
{codeArray.map((item, index) => (
|
|
219
|
-
<div key={index} className="col-span-1 aspect-1 text-[#555]">
|
|
220
|
-
<input
|
|
221
|
-
ref={inputRef => {
|
|
222
|
-
if (inputRef) {
|
|
223
|
-
inputRefs.current[index] = inputRef
|
|
224
|
-
}
|
|
225
|
-
}}
|
|
226
|
-
key={index}
|
|
227
|
-
type="tel"
|
|
228
|
-
className="flex size-full items-center justify-center rounded-[12px] border border-[#333333]/20 bg-[#EEEEEE] text-center text-[24px] font-medium focus:border-[#333]/50 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [&:focus-visible]:outline-none"
|
|
229
|
-
value={item}
|
|
230
|
-
autoComplete="false"
|
|
231
|
-
autoCorrect="false"
|
|
232
|
-
spellCheck="false"
|
|
233
|
-
autoCapitalize="false"
|
|
234
|
-
onChange={event => handleInputCodeChange(event, index)}
|
|
235
|
-
onFocus={() => {
|
|
236
|
-
setFocusIndex(index)
|
|
237
|
-
}}
|
|
238
|
-
onPaste={event => {
|
|
239
|
-
const paste = event.clipboardData.getData('text')
|
|
240
|
-
if (!Number.isNaN(Number(paste))) {
|
|
241
|
-
const pastedCode = paste.split('').slice(0, 6)
|
|
242
|
-
setCodeArray(pastedCode.concat(Array(6 - pastedCode.length).fill('')))
|
|
243
|
-
if (pastedCode.length <= codeArray.length) {
|
|
244
|
-
setFocusIndex(pastedCode.length - 1)
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}}
|
|
248
|
-
onKeyDown={event => {
|
|
249
|
-
const { value } = event.target as HTMLInputElement
|
|
250
|
-
if (event.key === 'Backspace' && !value && index > 0) {
|
|
251
|
-
setFocusIndex(index - 1)
|
|
252
|
-
}
|
|
253
|
-
}}
|
|
254
|
-
/>
|
|
255
|
-
</div>
|
|
256
|
-
))}
|
|
257
|
-
</div>
|
|
258
|
-
|
|
259
|
-
{error && <Text className="mb-3 text-[14px] font-semibold leading-[120%] text-[#f84d4f]" html={error} />}
|
|
260
|
-
{copy?.authCodeContent && (
|
|
261
|
-
<ul
|
|
262
|
-
className='flex flex-col gap-1 [&_li]:flex [&_li]:gap-2 [&_li]:text-[14px] [&_li]:font-semibold [&_li]:leading-[120%] [&_li]:text-[rgba(51,51,51,0.55)] [&_li]:before:content-["•"]'
|
|
263
|
-
dangerouslySetInnerHTML={{ __html: copy?.authCodeContent }}
|
|
227
|
+
<RegistrationModalContainer isOpen={authCodeActivate.isOpen} onClose={authCodeActivate.close}>
|
|
228
|
+
<div className="relative">
|
|
229
|
+
<div>
|
|
230
|
+
<Text
|
|
231
|
+
className="text-[22px] font-extrabold leading-[120%] text-[#333] min-l:text-[24px] [&_abbr]:text-[#005d8e]"
|
|
232
|
+
html={copy?.authCodeTitle}
|
|
264
233
|
/>
|
|
265
|
-
)}
|
|
266
|
-
</div>
|
|
267
|
-
<div className="mt-4 min-l:mt-6">
|
|
268
|
-
<Text className="text-base font-semibold leading-[100%] text-[#333]" html={copy?.authCodeReceiveText} />{' '}
|
|
269
|
-
{startCountDown ? (
|
|
270
234
|
<Text
|
|
271
|
-
|
|
272
|
-
className="
|
|
235
|
+
as="p"
|
|
236
|
+
className="mt-3 text-[14px] font-semibold leading-[140%] text-[rgba(51,51,51,0.75)] min-l:text-base [&_abbr]:text-[#333]"
|
|
237
|
+
html={copy?.authCodeDesc?.replace('%email%', email || '')}
|
|
273
238
|
/>
|
|
274
|
-
|
|
239
|
+
</div>
|
|
240
|
+
<div className="mt-6">
|
|
275
241
|
<Text
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
'cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline',
|
|
279
|
-
{
|
|
280
|
-
'pointer-events-none': startCountDown || isSendingEmail,
|
|
281
|
-
}
|
|
282
|
-
)}
|
|
283
|
-
html={copy?.sendAgainText}
|
|
242
|
+
className="mt-4 text-[14px] !font-bold font-semibold leading-[140%] text-[#333] min-l:mt-6"
|
|
243
|
+
html={copy?.enterActiveCodeText}
|
|
284
244
|
/>
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
245
|
+
<div className="my-3 grid grid-cols-6 gap-2">
|
|
246
|
+
{codeArray.map((item, index) => (
|
|
247
|
+
<div key={index} className="col-span-1 aspect-1 text-[#555]">
|
|
248
|
+
<input
|
|
249
|
+
ref={inputRef => {
|
|
250
|
+
if (inputRef) {
|
|
251
|
+
inputRefs.current[index] = inputRef
|
|
252
|
+
}
|
|
253
|
+
}}
|
|
254
|
+
key={index}
|
|
255
|
+
type="tel"
|
|
256
|
+
className={cn(
|
|
257
|
+
'flex size-full items-center justify-center border border-[#333333]/20 bg-[#EEEEEE] text-center text-[24px] font-medium focus:border-[#333]/50 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [&:focus-visible]:outline-none',
|
|
258
|
+
rounded && 'rounded-[12px]'
|
|
259
|
+
)}
|
|
260
|
+
value={item}
|
|
261
|
+
autoComplete="false"
|
|
262
|
+
autoCorrect="false"
|
|
263
|
+
spellCheck="false"
|
|
264
|
+
autoCapitalize="false"
|
|
265
|
+
onChange={event => handleInputCodeChange(event, index)}
|
|
266
|
+
onFocus={() => {
|
|
267
|
+
setFocusIndex(index)
|
|
268
|
+
}}
|
|
269
|
+
onPaste={event => {
|
|
270
|
+
const paste = event.clipboardData.getData('text')
|
|
271
|
+
if (!Number.isNaN(Number(paste))) {
|
|
272
|
+
const pastedCode = paste.split('').slice(0, 6)
|
|
273
|
+
setCodeArray(pastedCode.concat(Array(6 - pastedCode.length).fill('')))
|
|
274
|
+
if (pastedCode.length <= codeArray.length) {
|
|
275
|
+
setFocusIndex(pastedCode.length - 1)
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}}
|
|
279
|
+
onKeyDown={event => {
|
|
280
|
+
const { value } = event.target as HTMLInputElement
|
|
281
|
+
if (event.key === 'Backspace' && !value && index > 0) {
|
|
282
|
+
setFocusIndex(index - 1)
|
|
283
|
+
}
|
|
284
|
+
}}
|
|
285
|
+
/>
|
|
286
|
+
</div>
|
|
287
|
+
))}
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
{error && <Text className="mb-3 text-[14px] font-semibold leading-[120%] text-[#f84d4f]" html={error} />}
|
|
291
|
+
{copy?.authCodeContent && (
|
|
292
|
+
<ul
|
|
293
|
+
className='flex flex-col gap-1 [&_li]:flex [&_li]:gap-2 [&_li]:text-[14px] [&_li]:font-semibold [&_li]:leading-[120%] [&_li]:text-[rgba(51,51,51,0.55)] [&_li]:before:content-["•"]'
|
|
294
|
+
dangerouslySetInnerHTML={{ __html: copy?.authCodeContent }}
|
|
295
|
+
/>
|
|
296
|
+
)}
|
|
297
|
+
</div>
|
|
298
|
+
<div className="mt-4 min-l:mt-6">
|
|
299
|
+
<Text className="text-base font-semibold leading-[100%] text-[#333]" html={copy?.authCodeReceiveText} />{' '}
|
|
300
|
+
{isStartCountDown ? (
|
|
301
|
+
<Text
|
|
302
|
+
html={copy?.retrieveText?.replace('%countdownTime%', countDown.toString())}
|
|
303
|
+
className="cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline"
|
|
304
|
+
/>
|
|
305
|
+
) : (
|
|
306
|
+
<Text
|
|
307
|
+
onClick={handleSendAgain}
|
|
308
|
+
className={cn(
|
|
309
|
+
'cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline',
|
|
310
|
+
{
|
|
311
|
+
'pointer-events-none': isStartCountDown || isSendingEmail,
|
|
312
|
+
}
|
|
313
|
+
)}
|
|
314
|
+
html={copy?.sendAgainText}
|
|
315
|
+
/>
|
|
316
|
+
)}
|
|
317
|
+
<Button
|
|
318
|
+
type="submit"
|
|
319
|
+
loading={emailValidationLoading}
|
|
320
|
+
className="mt-6 flex h-[54px] w-full cursor-pointer items-center justify-center px-8 py-[15px] text-center text-base font-bold leading-[100%] text-white min-l:mt-8"
|
|
321
|
+
onClick={handleAuthCodeSubmit}
|
|
322
|
+
>
|
|
323
|
+
{copy.buttonText}
|
|
324
|
+
</Button>
|
|
325
|
+
</div>
|
|
326
|
+
<Message status={messageStatus} message={messageText} />
|
|
294
327
|
</div>
|
|
295
|
-
|
|
296
|
-
</div>
|
|
328
|
+
</RegistrationModalContainer>
|
|
297
329
|
)
|
|
298
330
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createContext, Dispatch, PropsWithChildren, SetStateAction, useContext, useState } from 'react'
|
|
2
|
+
import { AuthCodeActivate } from '../authCodeActivate'
|
|
2
3
|
|
|
3
4
|
interface RegistrationContextType {
|
|
4
5
|
email?: string
|
|
@@ -15,6 +16,8 @@ interface RegistrationContextType {
|
|
|
15
16
|
setActiveToken: Dispatch<SetStateAction<string | undefined>>
|
|
16
17
|
setIsActivateSuccess: Dispatch<SetStateAction<boolean>>
|
|
17
18
|
setOnAuthSuccess: Dispatch<SetStateAction<(() => void) | undefined>>
|
|
19
|
+
autoSendEmail: boolean
|
|
20
|
+
setAutoSendEmail: Dispatch<SetStateAction<boolean>>
|
|
18
21
|
}
|
|
19
22
|
}
|
|
20
23
|
|
|
@@ -33,6 +36,8 @@ export const RegistrationContext = createContext<RegistrationContextType>({
|
|
|
33
36
|
setIsActivateSuccess: () => {},
|
|
34
37
|
setOnAuthSuccess: () => {},
|
|
35
38
|
onAuthSuccess: undefined,
|
|
39
|
+
autoSendEmail: false,
|
|
40
|
+
setAutoSendEmail: () => {},
|
|
36
41
|
},
|
|
37
42
|
})
|
|
38
43
|
|
|
@@ -50,6 +55,7 @@ export const RegistrationProvider = ({ children, email, copy }: PropsWithChildre
|
|
|
50
55
|
const [isActivateSuccess, setIsActivateSuccess] = useState(false)
|
|
51
56
|
const [activeToken, setActiveToken] = useState<string>()
|
|
52
57
|
const [isSendingActivateEmail, setIsSendingActivateEmail] = useState(false)
|
|
58
|
+
const [autoSendEmail, setAutoSendEmail] = useState(false)
|
|
53
59
|
|
|
54
60
|
return (
|
|
55
61
|
<RegistrationContext.Provider
|
|
@@ -68,10 +74,13 @@ export const RegistrationProvider = ({ children, email, copy }: PropsWithChildre
|
|
|
68
74
|
isSendingActivateEmail,
|
|
69
75
|
setIsSendingActivateEmail,
|
|
70
76
|
setActiveToken,
|
|
77
|
+
autoSendEmail,
|
|
78
|
+
setAutoSendEmail,
|
|
71
79
|
},
|
|
72
80
|
}}
|
|
73
81
|
>
|
|
74
82
|
{children}
|
|
83
|
+
{copy?.authCodeActivate && <AuthCodeActivate copy={copy.authCodeActivate} />}
|
|
75
84
|
</RegistrationContext.Provider>
|
|
76
85
|
)
|
|
77
86
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { classNames as cn } from '@anker-in/lib'
|
|
1
|
+
import { classNames as cn, useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'
|
|
2
2
|
import { useEffect, useState, type UIEvent } from 'react'
|
|
3
3
|
import ReactModal from 'react-modal'
|
|
4
4
|
|
|
@@ -9,14 +9,13 @@ export type ModalContainerProps = {
|
|
|
9
9
|
title?: string
|
|
10
10
|
titleClassName?: string
|
|
11
11
|
useAnimation?: boolean // 使用动画展示
|
|
12
|
-
animationClassName?: string // 动画展示控制的classname
|
|
13
12
|
isOpen: boolean
|
|
14
13
|
children?: any
|
|
15
14
|
onClose: () => void
|
|
16
15
|
onScrollEnd?: (event: UIEvent<HTMLDivElement>) => void
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
export const
|
|
18
|
+
export const RegistrationModalContainer = ({
|
|
20
19
|
isOpen,
|
|
21
20
|
title,
|
|
22
21
|
className = '',
|
|
@@ -25,11 +24,12 @@ export const CreditsModalContainer = ({
|
|
|
25
24
|
onClose,
|
|
26
25
|
onScrollEnd,
|
|
27
26
|
children,
|
|
28
|
-
useAnimation,
|
|
29
|
-
animationClassName,
|
|
27
|
+
useAnimation = true,
|
|
30
28
|
titleClassName = '',
|
|
31
29
|
...props
|
|
32
30
|
}: ModalContainerProps): React.ReactElement => {
|
|
31
|
+
const { brand } = useHeadlessContext()
|
|
32
|
+
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
33
33
|
const [animationShow, setAnimationShow] = useState(false)
|
|
34
34
|
|
|
35
35
|
useEffect(() => {
|
|
@@ -49,8 +49,10 @@ export const CreditsModalContainer = ({
|
|
|
49
49
|
overlayClassName
|
|
50
50
|
)}
|
|
51
51
|
className={cn(
|
|
52
|
-
'min-md:max-h-[calc(100vh-96px)] relative flex min-h-[200px] flex-col overflow-hidden
|
|
53
|
-
|
|
52
|
+
'min-md:max-h-[calc(100vh-96px)] w-[540px] relative flex min-h-[200px] flex-col overflow-hidden bg-white outline-none transition-all duration-300 md:h-auto md:w-full',
|
|
53
|
+
rounded && 'rounded-[16px] md:rounded-b-none',
|
|
54
|
+
useAnimation && 'md:translate-y-[100vh]',
|
|
55
|
+
animationShow && 'md:translate-y-0',
|
|
54
56
|
className
|
|
55
57
|
)}
|
|
56
58
|
onRequestClose={onClose}
|
|
@@ -12,21 +12,22 @@ import { CreditsWaysToGetCredits, CreditsWaysToGetCreditsCopy } from '../compone
|
|
|
12
12
|
import { CreditsRedeemList, CreditsRedeemListCopy } from '../components/credits/creditsRedeemList'
|
|
13
13
|
import { CreditsCash, CreditsCashCopy } from '../components/credits/creditsCash'
|
|
14
14
|
import { CreditsFaq, CreditsFaqCopy } from '../components/credits/creditsFaq'
|
|
15
|
+
import { AuthCodeActivateCopy } from 'src/components/registration/authCodeActivate/type'
|
|
15
16
|
|
|
16
17
|
export enum ComponentKey {
|
|
17
|
-
Banner = '
|
|
18
|
-
InfoCard = '
|
|
19
|
-
Benefits = '
|
|
20
|
-
WaysToGetCredits = '
|
|
21
|
-
RedeemList = '
|
|
22
|
-
SpendCreditsLikeCash = '
|
|
23
|
-
Faqs = '
|
|
18
|
+
Banner = 'creditsBanner',
|
|
19
|
+
InfoCard = 'creditsInfoCard',
|
|
20
|
+
Benefits = 'creditsBenefits',
|
|
21
|
+
WaysToGetCredits = 'creditsWaysToGetCredits',
|
|
22
|
+
RedeemList = 'creditsRedeemList',
|
|
23
|
+
SpendCreditsLikeCash = 'creditsCash',
|
|
24
|
+
Faqs = 'creditsFaq',
|
|
24
25
|
}
|
|
25
26
|
export type CreditsTemplateProps = {
|
|
26
27
|
headlessConfig: HeadlessConfig
|
|
27
28
|
siteConfig: {
|
|
28
29
|
registrationsSettings: {
|
|
29
|
-
authCodeActivate:
|
|
30
|
+
authCodeActivate: AuthCodeActivateCopy
|
|
30
31
|
}
|
|
31
32
|
taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>
|
|
32
33
|
}
|
|
@@ -87,32 +88,41 @@ export const CreditsTemplate = ({
|
|
|
87
88
|
pageCommon={pageConfig.common}
|
|
88
89
|
>
|
|
89
90
|
<div className={classNames('bg-[#f5f5f7] leading-[1.2]')}>
|
|
90
|
-
{pageConfig.order.map(
|
|
91
|
-
const componentCopy = pageConfig.components?.[
|
|
91
|
+
{pageConfig.order.map(key => {
|
|
92
|
+
const componentCopy = pageConfig.components?.[key]
|
|
92
93
|
if (!componentCopy) return null
|
|
93
94
|
return (
|
|
94
95
|
<>
|
|
95
|
-
{
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
96
|
+
{key === ComponentKey.Banner && <CreditsBanner copy={componentCopy as CreditsBannerCopy} />}
|
|
97
|
+
{key === ComponentKey.InfoCard && userContext?.profile && (
|
|
98
|
+
<CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} />
|
|
99
|
+
)}
|
|
100
|
+
{key === ComponentKey.Benefits && <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} />}
|
|
101
|
+
{key === ComponentKey.WaysToGetCredits && (
|
|
102
|
+
<CreditsWaysToGetCredits
|
|
103
|
+
copy={componentCopy as CreditsWaysToGetCreditsCopy}
|
|
104
|
+
classNames={
|
|
105
|
+
headlessConfig.brand === 'anker'
|
|
106
|
+
? {
|
|
107
|
+
subtitle: 'text-white',
|
|
108
|
+
equalCreditsText:
|
|
109
|
+
'bg-gradient-to-r from-[#3AD1FF] to-[#008CD6] bg-clip-text text-transparent',
|
|
110
|
+
}
|
|
111
|
+
: {
|
|
112
|
+
subtitle: 'text-[#D1D1D1]',
|
|
113
|
+
equalCreditsText: 'text-[#F6EAD0]',
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/>
|
|
117
|
+
)}
|
|
118
|
+
{key === ComponentKey.RedeemList && (
|
|
119
|
+
<CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} />
|
|
120
|
+
)}
|
|
121
|
+
{key === ComponentKey.SpendCreditsLikeCash && <CreditsCash copy={componentCopy as CreditsCashCopy} />}
|
|
122
|
+
{key === ComponentKey.Faqs && <CreditsFaq copy={componentCopy as CreditsFaqCopy} />}
|
|
123
|
+
{key !== ComponentKey.Banner && (
|
|
124
|
+
<div className="laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16" />
|
|
125
|
+
)}
|
|
116
126
|
</>
|
|
117
127
|
)
|
|
118
128
|
})}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const roundedBrands = ['eufy', 'soundcore']
|