@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.
- 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/creditsCash/RedeemableItem.js +1 -1
- package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/type.d.ts +0 -2
- package/dist/cjs/components/credits/creditsCash/type.js +1 -1
- package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
- 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 +4 -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/creditsCash/RedeemableItem.js +1 -1
- package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/type.d.ts +0 -2
- 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 +4 -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 +4 -7
- package/src/components/credits/creditsCash/RedeemableItem.tsx +5 -4
- package/src/components/credits/creditsCash/type.ts +0 -2
- 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 +4 -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
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
95
|
+
if (onSuccess) {
|
|
96
|
+
onSuccess()
|
|
97
|
+
}
|
|
97
98
|
setTimeout(() => {
|
|
98
99
|
setSuccessMessage('')
|
|
99
|
-
},
|
|
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
|
-
<
|
|
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 =
|
|
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
|
-
|
|
67
|
-
|
|
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-
|
|
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
|
|
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}
|