@anker-in/campaign-ui 0.2.0-beta.1 → 0.2.0-beta.11

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 (166) 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/creditsCash/RedeemableItem.js +1 -1
  11. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  12. package/dist/cjs/components/credits/creditsCash/type.d.ts +0 -2
  13. package/dist/cjs/components/credits/creditsCash/type.js +1 -1
  14. package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
  15. package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
  16. package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
  17. package/dist/cjs/components/credits/creditsInfoCard/index.d.ts +0 -2
  18. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  19. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
  20. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  21. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
  22. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  23. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
  24. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  25. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js.map +2 -2
  26. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  27. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +2 -2
  28. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  29. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  30. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  31. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  32. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  33. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
  34. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  35. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +2 -2
  36. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  37. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  38. package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
  39. package/dist/cjs/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
  40. package/dist/cjs/components/credits/modal/MyRewardsModal.js +1 -1
  41. package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +2 -2
  42. package/dist/cjs/components/credits/modal/activitiesModal.js +1 -1
  43. package/dist/cjs/components/credits/modal/activitiesModal.js.map +2 -2
  44. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  45. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  46. package/dist/cjs/components/credits/modal/modalContainer.js +1 -1
  47. package/dist/cjs/components/credits/modal/modalContainer.js.map +3 -3
  48. package/dist/cjs/components/credits/modal/subscribeModal.js +1 -1
  49. package/dist/cjs/components/credits/modal/subscribeModal.js.map +3 -3
  50. package/dist/cjs/components/credits/modal/tip.js +1 -1
  51. package/dist/cjs/components/credits/modal/tip.js.map +3 -3
  52. package/dist/cjs/components/credits/type.d.ts +4 -2
  53. package/dist/cjs/components/credits/type.js +1 -1
  54. package/dist/cjs/components/credits/type.js.map +1 -1
  55. package/dist/cjs/components/registration/authCodeActivate/Message.js +1 -1
  56. package/dist/cjs/components/registration/authCodeActivate/Message.js.map +2 -2
  57. package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
  58. package/dist/cjs/components/registration/authCodeActivate/index.js.map +3 -3
  59. package/dist/cjs/components/registration/authCodeActivate/type.d.ts +0 -1
  60. package/dist/cjs/components/registration/authCodeActivate/type.js.map +1 -1
  61. package/dist/cjs/components/registration/context/provider.d.ts +2 -0
  62. package/dist/cjs/components/registration/context/provider.js +1 -1
  63. package/dist/cjs/components/registration/context/provider.js.map +3 -3
  64. package/dist/cjs/components/registration/modalContainer.d.ts +1 -2
  65. package/dist/cjs/components/registration/modalContainer.js +1 -1
  66. package/dist/cjs/components/registration/modalContainer.js.map +3 -3
  67. package/dist/cjs/templates/credits.d.ts +9 -8
  68. package/dist/cjs/templates/credits.js +1 -1
  69. package/dist/cjs/templates/credits.js.map +3 -3
  70. package/dist/esm/components/credits/context/provider.d.ts +2 -2
  71. package/dist/esm/components/credits/context/provider.js +1 -1
  72. package/dist/esm/components/credits/context/provider.js.map +3 -3
  73. package/dist/esm/components/credits/creditsBenefits/benefitItem.js +1 -1
  74. package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +3 -3
  75. package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
  76. package/dist/esm/components/credits/creditsBenefits/index.js.map +3 -3
  77. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  78. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
  79. package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
  80. package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  81. package/dist/esm/components/credits/creditsCash/type.d.ts +0 -2
  82. package/dist/esm/components/credits/creditsFaq/index.js +1 -1
  83. package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
  84. package/dist/esm/components/credits/creditsInfoCard/index.d.ts +0 -2
  85. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  86. package/dist/esm/components/credits/creditsInfoCard/index.js.map +3 -3
  87. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  88. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
  89. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  90. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
  91. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  92. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js.map +3 -3
  93. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  94. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  95. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  96. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  97. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  98. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +3 -3
  99. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  100. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
  101. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  102. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  103. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  104. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  105. package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js +1 -1
  106. package/dist/esm/components/credits/creditsWaysToGetCredits/useActions.js.map +2 -2
  107. package/dist/esm/components/credits/modal/MyRewardsModal.js +1 -1
  108. package/dist/esm/components/credits/modal/MyRewardsModal.js.map +3 -3
  109. package/dist/esm/components/credits/modal/activitiesModal.js +1 -1
  110. package/dist/esm/components/credits/modal/activitiesModal.js.map +3 -3
  111. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  112. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  113. package/dist/esm/components/credits/modal/modalContainer.js +1 -1
  114. package/dist/esm/components/credits/modal/modalContainer.js.map +3 -3
  115. package/dist/esm/components/credits/modal/subscribeModal.js +1 -1
  116. package/dist/esm/components/credits/modal/subscribeModal.js.map +3 -3
  117. package/dist/esm/components/credits/modal/tip.js +1 -1
  118. package/dist/esm/components/credits/modal/tip.js.map +3 -3
  119. package/dist/esm/components/credits/type.d.ts +4 -2
  120. package/dist/esm/components/registration/authCodeActivate/Message.js +1 -1
  121. package/dist/esm/components/registration/authCodeActivate/Message.js.map +2 -2
  122. package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
  123. package/dist/esm/components/registration/authCodeActivate/index.js.map +3 -3
  124. package/dist/esm/components/registration/authCodeActivate/type.d.ts +0 -1
  125. package/dist/esm/components/registration/context/provider.d.ts +2 -0
  126. package/dist/esm/components/registration/context/provider.js +1 -1
  127. package/dist/esm/components/registration/context/provider.js.map +3 -3
  128. package/dist/esm/components/registration/modalContainer.d.ts +1 -2
  129. package/dist/esm/components/registration/modalContainer.js +1 -1
  130. package/dist/esm/components/registration/modalContainer.js.map +3 -3
  131. package/dist/esm/templates/credits.d.ts +9 -8
  132. package/dist/esm/templates/credits.js +1 -1
  133. package/dist/esm/templates/credits.js.map +3 -3
  134. package/package.json +3 -3
  135. package/src/components/credits/context/provider.tsx +1 -4
  136. package/src/components/credits/creditsBenefits/benefitItem.tsx +2 -5
  137. package/src/components/credits/creditsBenefits/index.tsx +1 -4
  138. package/src/components/credits/creditsCash/CreditsCash.tsx +4 -7
  139. package/src/components/credits/creditsCash/RedeemableItem.tsx +5 -4
  140. package/src/components/credits/creditsCash/type.ts +0 -2
  141. package/src/components/credits/creditsFaq/index.tsx +2 -3
  142. package/src/components/credits/creditsInfoCard/index.tsx +10 -12
  143. package/src/components/credits/creditsRedeemList/AddressForm/CountrySelect.tsx +3 -4
  144. package/src/components/credits/creditsRedeemList/AddressForm/StateSelect.tsx +2 -3
  145. package/src/components/credits/creditsRedeemList/AddressForm/index.tsx +2 -3
  146. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +2 -4
  147. package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -3
  148. package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
  149. package/src/components/credits/creditsRedeemList/RedeemProductModal/Success.tsx +2 -3
  150. package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +2 -3
  151. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +5 -3
  152. package/src/components/credits/creditsWaysToGetCredits/useActions.ts +4 -1
  153. package/src/components/credits/modal/MyRewardsModal.tsx +2 -3
  154. package/src/components/credits/modal/activitiesModal.tsx +2 -3
  155. package/src/components/credits/modal/creditsUploadReceiptModal.tsx +2 -3
  156. package/src/components/credits/modal/modalContainer.tsx +2 -3
  157. package/src/components/credits/modal/subscribeModal.tsx +9 -32
  158. package/src/components/credits/modal/tip.tsx +2 -3
  159. package/src/components/credits/type.ts +4 -2
  160. package/src/components/registration/authCodeActivate/Message.tsx +1 -1
  161. package/src/components/registration/authCodeActivate/index.tsx +141 -109
  162. package/src/components/registration/authCodeActivate/type.ts +0 -1
  163. package/src/components/registration/context/provider.tsx +9 -0
  164. package/src/components/registration/modalContainer.tsx +9 -7
  165. package/src/templates/credits.tsx +41 -31
  166. package/src/components/credits/const.ts +0 -1
@@ -4,12 +4,11 @@ import { CreditType, DTC_TASK_TYPE, TaskSubType, TaskType } from '../context/con
4
4
  import useActivities from '../context/hooks/useActivities'
5
5
  import type { Task } from '../context/response'
6
6
  import { CreditsModalContainer, type ModalContainerProps } from './modalContainer'
7
- import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
7
+ import { classNames as cn, useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'
8
8
  import { Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'
9
9
  import LoadingDots from './loadingDots'
10
10
  import { Picture, Text } from '@anker-in/headless-ui'
11
11
  import dayjs from 'dayjs'
12
- import { roundedBrands } from '../const'
13
12
 
14
13
  export interface MyActivitiesMetafields {
15
14
  title: string
@@ -46,7 +45,7 @@ function ActivitiesModal({ data, ...props }: ActivitiesModalProps) {
46
45
  const [page, setPage] = useState(1)
47
46
  const { taskIdToTypeMapping } = useCreditsContext()
48
47
  const { brand } = useHeadlessContext()
49
- const rounded = roundedBrands.includes(brand)
48
+ const rounded = ROUNDED_BRANDS.includes(brand)
50
49
 
51
50
  const myActivitiesOptions = useMemo(() => {
52
51
  return {
@@ -2,8 +2,7 @@ import { Button, Heading, Text } from '@anker-in/headless-ui'
2
2
  import { useCallback, useState } from 'react'
3
3
  import { CreditsModalContainer } from './modalContainer'
4
4
  import { useUploadReceipt } from '../context/hooks/useUploadReceipt'
5
- import { useHeadlessContext } from '@anker-in/lib'
6
- import { roundedBrands } from '../const'
5
+ import { useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'
7
6
  import classNames from 'classnames'
8
7
 
9
8
  export type ReceiptCopy = {
@@ -47,7 +46,7 @@ export function CreditsUploadReceiptModal({
47
46
  })
48
47
 
49
48
  const { brand } = useHeadlessContext()
50
- const rounded = roundedBrands.includes(brand)
49
+ const rounded = ROUNDED_BRANDS.includes(brand)
51
50
 
52
51
  const handleSubmit = useCallback(() => {
53
52
  trigger(
@@ -1,7 +1,6 @@
1
- import { classNames as cn, useHeadlessContext } 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
- import { roundedBrands } from '../const'
5
4
 
6
5
  export type ModalContainerProps = {
7
6
  overlayClassName?: string
@@ -43,7 +42,7 @@ export const CreditsModalContainer = ({
43
42
  }, [isOpen, useAnimation])
44
43
 
45
44
  const { brand } = useHeadlessContext()
46
- const rounded = roundedBrands.includes(brand)
45
+ const rounded = ROUNDED_BRANDS.includes(brand)
47
46
 
48
47
  return (
49
48
  <ReactModal
@@ -1,14 +1,13 @@
1
1
  import { useCallback, useEffect, useState } from 'react'
2
2
  import { useRouter } from 'next/router'
3
- import { Button, Picture, Text } from '@anker-in/headless-ui'
4
- import { classNames, fetcher, gaTrack, useHeadlessContext } from '@anker-in/lib'
3
+ import { Button, Checkbox, Picture, Text } from '@anker-in/headless-ui'
4
+ import { classNames, fetcher, gaTrack, useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'
5
5
  import Cookies from 'js-cookie'
6
6
  import { parse } from 'query-string'
7
7
  import sha256 from 'crypto-js/sha256'
8
8
  import { useCreditsContext } from '../context/provider'
9
9
  import { emailValidate } from '../context/utils'
10
10
  import { CreditsModalContainer, type ModalContainerProps } from './modalContainer'
11
- import { roundedBrands } from '../const'
12
11
 
13
12
  export type CreditsSubscribeModalCopy = {
14
13
  title: string
@@ -44,7 +43,7 @@ const getAdCookie = () => {
44
43
 
45
44
  export function CreditsSubscribeModal({ copy, onSuccess, ...props }: CreditsSubscribeModalProps) {
46
45
  const { brand } = useHeadlessContext()
47
- const rounded = roundedBrands.includes(brand)
46
+ const rounded = ROUNDED_BRANDS.includes(brand)
48
47
  const { locale } = useRouter()
49
48
  const [policy, setPolicy] = useState(false)
50
49
  const [email, setEmail] = useState('')
@@ -93,10 +92,12 @@ export function CreditsSubscribeModal({ copy, onSuccess, ...props }: CreditsSubs
93
92
 
94
93
  if (!result.errors) {
95
94
  setSuccessMessage(copy.successTips || 'Subscribed successfully!')
96
- onSuccess && onSuccess()
95
+ if (onSuccess) {
96
+ onSuccess()
97
+ }
97
98
  setTimeout(() => {
98
99
  setSuccessMessage('')
99
- }, 2000)
100
+ }, 3000)
100
101
  gaTrack({
101
102
  subscribe_hashed_email: email ? sha256(email) : '',
102
103
  })
@@ -177,33 +178,9 @@ export function CreditsSubscribeModal({ copy, onSuccess, ...props }: CreditsSubs
177
178
  </Button>
178
179
  </div>
179
180
  <div className="flex w-full">
180
- <div
181
- className="group relative mr-6 cursor-pointer"
182
- onClick={() => setPolicy(!policy)}
183
- onKeyDown={e => {
184
- if (e.key === 'Enter' || e.key === ' ') {
185
- e.preventDefault()
186
- setPolicy(!policy)
187
- }
188
- }}
189
- role="button"
190
- tabIndex={0}
191
- >
192
- <input
193
- type="checkbox"
194
- readOnly
195
- checked={policy}
196
- className="peer absolute left-0 top-0 h-4 w-4 cursor-pointer opacity-0"
197
- />
198
- <label
199
- className={classNames(
200
- 'absolute left-[30px] top-0 h-5 cursor-pointer leading-5 before:absolute before:left-[-30px] before:top-0 before:h-4 before:w-4 before:rounded-[2px] before:border before:border-[#aaa] before:content-[""] after:absolute after:left-[-25px] after:top-[1px] after:h-[10px] after:w-[6px] after:rotate-45 after:border-0 after:content-[""] group-hover:before:border-[#17bbef] peer-checked:before:border-[#17bbef] peer-checked:before:bg-[#17bbef] peer-checked:after:border-b-2 peer-checked:after:border-r-2 peer-checked:after:border-white peer-checked:after:bg-[#17bbef]',
201
- !rounded && 'rounded-none'
202
- )}
203
- />
204
- </div>
181
+ <Checkbox checked={policy} onCheckedChange={() => setPolicy(!policy)} required className="border-[#1d1d1f]" />
205
182
  <label
206
- className="text-left text-[14px] font-semibold text-[#777] [&_a]:underline"
183
+ className="text-left ml-2 text-[14px] font-semibold text-[#777] [&_a]:underline"
207
184
  dangerouslySetInnerHTML={{
208
185
  __html: copy?.policy || '',
209
186
  }}
@@ -1,13 +1,12 @@
1
- import { useHeadlessContext } from '@anker-in/lib'
1
+ import { useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'
2
2
  import classNames from 'classnames'
3
3
  import { useState } from 'react'
4
- import { roundedBrands } from '../const'
5
4
 
6
5
  function Tip({ info, index }: { info: string; index: number }) {
7
6
  const [show, setShow] = useState(false)
8
7
 
9
8
  const { brand } = useHeadlessContext()
10
- const rounded = roundedBrands.includes(brand)
9
+ const rounded = ROUNDED_BRANDS.includes(brand)
11
10
 
12
11
  return (
13
12
  <div
@@ -52,6 +52,7 @@ export interface ShippingZone {
52
52
 
53
53
  export type CreditsPageCommon = {
54
54
  pointUnit?: string
55
+ infoIcon?: string
55
56
  ruleLabel?: string
56
57
  soldOut?: string
57
58
  copied?: string
@@ -63,8 +64,9 @@ export type CreditsPageCommon = {
63
64
  url: string
64
65
  }
65
66
  }
66
- activities?: MyActivitiesMetafields
67
- rewards?: MyRewardsMetafields
67
+ activitiesModal?: MyActivitiesMetafields
68
+ rewardsModal?: MyRewardsMetafields
69
+ insufficientCredits?: string
68
70
  validatorInfo?: {
69
71
  addressInfo: {
70
72
  name: string
@@ -1,7 +1,7 @@
1
1
  export const Message = ({ status, message }: { status: string; message: string }) => {
2
2
  return (
3
3
  status && (
4
- <div className="absolute left-5 right-5 top-10 flex items-center gap-2 rounded-sm bg-white px-4 py-3 shadow-lg min-md:left-12 min-md:right-12">
4
+ <div className="absolute left-5 right-5 top-2 flex items-center gap-2 rounded-sm bg-white px-4 py-3 shadow-lg min-md:left-12 min-md:right-12">
5
5
  <div className="flex-shrink-0">
6
6
  {status === 'success' && (
7
7
  <span className="inline-block h-5 w-5">
@@ -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}