@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.
Files changed (156) hide show
  1. package/dist/cjs/components/credits/context/provider.d.ts +2 -2
  2. package/dist/cjs/components/credits/context/provider.js +1 -1
  3. package/dist/cjs/components/credits/context/provider.js.map +3 -3
  4. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +1 -1
  5. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +3 -3
  6. package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
  7. package/dist/cjs/components/credits/creditsBenefits/index.js.map +3 -3
  8. package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
  9. package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
  10. package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
  11. package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
  12. package/dist/cjs/components/credits/creditsInfoCard/index.d.ts +0 -2
  13. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  14. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
  15. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  16. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
  17. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  18. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
  19. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  20. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js.map +2 -2
  21. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  22. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +2 -2
  23. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  24. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  25. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  26. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  27. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  28. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
  29. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  30. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +2 -2
  31. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  32. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  33. package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
  34. package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
  35. package/dist/cjs/components/credits/modal/MyRewardsModal.js +1 -1
  36. package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +2 -2
  37. package/dist/cjs/components/credits/modal/activitiesModal.js +1 -1
  38. package/dist/cjs/components/credits/modal/activitiesModal.js.map +2 -2
  39. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  40. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  41. package/dist/cjs/components/credits/modal/modalContainer.js +1 -1
  42. package/dist/cjs/components/credits/modal/modalContainer.js.map +3 -3
  43. package/dist/cjs/components/credits/modal/subscribeModal.js +1 -1
  44. package/dist/cjs/components/credits/modal/subscribeModal.js.map +3 -3
  45. package/dist/cjs/components/credits/modal/tip.js +1 -1
  46. package/dist/cjs/components/credits/modal/tip.js.map +3 -3
  47. package/dist/cjs/components/credits/type.d.ts +3 -2
  48. package/dist/cjs/components/credits/type.js +1 -1
  49. package/dist/cjs/components/credits/type.js.map +1 -1
  50. package/dist/cjs/components/registration/authCodeActivate/Message.js +1 -1
  51. package/dist/cjs/components/registration/authCodeActivate/Message.js.map +2 -2
  52. package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
  53. package/dist/cjs/components/registration/authCodeActivate/index.js.map +3 -3
  54. package/dist/cjs/components/registration/authCodeActivate/type.d.ts +0 -1
  55. package/dist/cjs/components/registration/authCodeActivate/type.js.map +1 -1
  56. package/dist/cjs/components/registration/context/provider.d.ts +2 -0
  57. package/dist/cjs/components/registration/context/provider.js +1 -1
  58. package/dist/cjs/components/registration/context/provider.js.map +3 -3
  59. package/dist/cjs/components/registration/modalContainer.d.ts +1 -2
  60. package/dist/cjs/components/registration/modalContainer.js +1 -1
  61. package/dist/cjs/components/registration/modalContainer.js.map +3 -3
  62. package/dist/cjs/templates/credits.d.ts +9 -8
  63. package/dist/cjs/templates/credits.js +1 -1
  64. package/dist/cjs/templates/credits.js.map +3 -3
  65. package/dist/esm/components/credits/context/provider.d.ts +2 -2
  66. package/dist/esm/components/credits/context/provider.js +1 -1
  67. package/dist/esm/components/credits/context/provider.js.map +3 -3
  68. package/dist/esm/components/credits/creditsBenefits/benefitItem.js +1 -1
  69. package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +3 -3
  70. package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
  71. package/dist/esm/components/credits/creditsBenefits/index.js.map +3 -3
  72. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  73. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
  74. package/dist/esm/components/credits/creditsFaq/index.js +1 -1
  75. package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
  76. package/dist/esm/components/credits/creditsInfoCard/index.d.ts +0 -2
  77. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  78. package/dist/esm/components/credits/creditsInfoCard/index.js.map +3 -3
  79. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  80. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
  81. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  82. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
  83. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  84. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js.map +3 -3
  85. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  86. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  87. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  88. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  89. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  90. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +3 -3
  91. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  92. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
  93. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  94. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  95. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  96. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  97. package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
  98. package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
  99. package/dist/esm/components/credits/modal/MyRewardsModal.js +1 -1
  100. package/dist/esm/components/credits/modal/MyRewardsModal.js.map +3 -3
  101. package/dist/esm/components/credits/modal/activitiesModal.js +1 -1
  102. package/dist/esm/components/credits/modal/activitiesModal.js.map +3 -3
  103. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  104. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  105. package/dist/esm/components/credits/modal/modalContainer.js +1 -1
  106. package/dist/esm/components/credits/modal/modalContainer.js.map +3 -3
  107. package/dist/esm/components/credits/modal/subscribeModal.js +1 -1
  108. package/dist/esm/components/credits/modal/subscribeModal.js.map +3 -3
  109. package/dist/esm/components/credits/modal/tip.js +1 -1
  110. package/dist/esm/components/credits/modal/tip.js.map +3 -3
  111. package/dist/esm/components/credits/type.d.ts +3 -2
  112. package/dist/esm/components/registration/authCodeActivate/Message.js +1 -1
  113. package/dist/esm/components/registration/authCodeActivate/Message.js.map +2 -2
  114. package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
  115. package/dist/esm/components/registration/authCodeActivate/index.js.map +3 -3
  116. package/dist/esm/components/registration/authCodeActivate/type.d.ts +0 -1
  117. package/dist/esm/components/registration/context/provider.d.ts +2 -0
  118. package/dist/esm/components/registration/context/provider.js +1 -1
  119. package/dist/esm/components/registration/context/provider.js.map +3 -3
  120. package/dist/esm/components/registration/modalContainer.d.ts +1 -2
  121. package/dist/esm/components/registration/modalContainer.js +1 -1
  122. package/dist/esm/components/registration/modalContainer.js.map +3 -3
  123. package/dist/esm/templates/credits.d.ts +9 -8
  124. package/dist/esm/templates/credits.js +1 -1
  125. package/dist/esm/templates/credits.js.map +3 -3
  126. package/package.json +3 -3
  127. package/src/components/credits/context/provider.tsx +1 -4
  128. package/src/components/credits/creditsBenefits/benefitItem.tsx +2 -5
  129. package/src/components/credits/creditsBenefits/index.tsx +1 -4
  130. package/src/components/credits/creditsCash/CreditsCash.tsx +3 -6
  131. package/src/components/credits/creditsFaq/index.tsx +2 -3
  132. package/src/components/credits/creditsInfoCard/index.tsx +10 -12
  133. package/src/components/credits/creditsRedeemList/AddressForm/CountrySelect.tsx +3 -4
  134. package/src/components/credits/creditsRedeemList/AddressForm/StateSelect.tsx +2 -3
  135. package/src/components/credits/creditsRedeemList/AddressForm/index.tsx +2 -3
  136. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +2 -4
  137. package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -3
  138. package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
  139. package/src/components/credits/creditsRedeemList/RedeemProductModal/Success.tsx +2 -3
  140. package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +2 -3
  141. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +5 -3
  142. package/src/components/credits/creditsWaysToGetCredits/useActions.ts +4 -1
  143. package/src/components/credits/modal/MyRewardsModal.tsx +2 -3
  144. package/src/components/credits/modal/activitiesModal.tsx +2 -3
  145. package/src/components/credits/modal/creditsUploadReceiptModal.tsx +2 -3
  146. package/src/components/credits/modal/modalContainer.tsx +2 -3
  147. package/src/components/credits/modal/subscribeModal.tsx +9 -32
  148. package/src/components/credits/modal/tip.tsx +2 -3
  149. package/src/components/credits/type.ts +3 -2
  150. package/src/components/registration/authCodeActivate/Message.tsx +1 -1
  151. package/src/components/registration/authCodeActivate/index.tsx +141 -109
  152. package/src/components/registration/authCodeActivate/type.ts +0 -1
  153. package/src/components/registration/context/provider.tsx +9 -0
  154. package/src/components/registration/modalContainer.tsx +9 -7
  155. package/src/templates/credits.tsx +41 -31
  156. 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, autoSendEmail = false }) => {
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 [resendStatus, setResendStatus] = useState('')
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.active_token) {
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
- email: email,
62
- data: {
63
- redirect_url: `${window?.location?.origin}${window?.location?.pathname}`,
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
- setResendStatus('success')
82
- startAction()
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
- setResendStatus('success')
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
- setResendStatus('')
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
- <div className={cn('p-12 px-5 !pb-12 min-l:px-12')}>
201
- <div>
202
- <Text
203
- className="text-[22px] font-extrabold leading-[120%] text-[#333] min-l:text-[24px] [&_abbr]:text-[#005d8e]"
204
- html={copy?.authCodeTitle}
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
- html={copy?.retrieveText?.replace('%countdownTime%', countDown.toString())}
272
- className="cursor-pointer text-base font-semibold leading-[100%] !text-brand text-[#005d8e] text-[#333] underline"
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
- onClick={handleSendAgain}
277
- className={cn(
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
- <Button
287
- type="submit"
288
- loading={emailValidationLoading}
289
- className="mt-6 flex h-[54px] w-full cursor-pointer items-center justify-center rounded-[40px] px-8 py-[15px] text-center text-base font-bold leading-[100%] text-white min-l:mt-8"
290
- onClick={handleAuthCodeSubmit}
291
- >
292
- {copy.buttonText}
293
- </Button>
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
- <Message status={resendStatus} message={messageText} />
296
- </div>
328
+ </RegistrationModalContainer>
297
329
  )
298
330
  }
@@ -20,5 +20,4 @@ export type AuthCodeActivateCopy = {
20
20
 
21
21
  export type AuthCodeActivateProps = {
22
22
  copy: AuthCodeActivateCopy
23
- autoSendEmail?: boolean
24
23
  }
@@ -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 CreditsModalContainer = ({
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 rounded-[16px] bg-white outline-none transition-all duration-300 md:h-[88.27vh] md:w-full md:rounded-b-none',
53
- animationShow ? '' : animationClassName,
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 = 'banner',
18
- InfoCard = 'infoCard',
19
- Benefits = 'benefits',
20
- WaysToGetCredits = 'waysToGetCredits',
21
- RedeemList = 'redeemList',
22
- SpendCreditsLikeCash = 'spendCreditsLikeCash',
23
- Faqs = '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: any
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(item => {
91
- const componentCopy = pageConfig.components?.[item]
91
+ {pageConfig.order.map(key => {
92
+ const componentCopy = pageConfig.components?.[key]
92
93
  if (!componentCopy) return null
93
94
  return (
94
95
  <>
95
- {(item: ComponentKey) => {
96
- switch (item) {
97
- case 'banner':
98
- return <CreditsBanner copy={componentCopy as CreditsBannerCopy} />
99
- case 'infoCard':
100
- return <CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} />
101
- case 'benefits':
102
- return <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} />
103
- case 'waysToGetCredits':
104
- return <CreditsWaysToGetCredits copy={componentCopy as CreditsWaysToGetCreditsCopy} />
105
- case 'redeemList':
106
- return <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} />
107
- case 'spendCreditsLikeCash':
108
- return <CreditsCash copy={componentCopy as CreditsCashCopy} />
109
- case 'faqs':
110
- return <CreditsFaq copy={componentCopy as CreditsFaqCopy} />
111
- default:
112
- return null
113
- }
114
- }}
115
- <div className="laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16" />
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']