hiCity-nft/src/views/BlindBox/index.tsx

211 lines
5.5 KiB
TypeScript

import React, { useEffect, useState } from 'react'
import styled from 'styled-components'
import { useTranslation } from 'contexts/Localization'
import { useAccount } from 'state/userInfo/hooks'
import UnlockButton from 'components/UnlockButton'
import SwiperCore, { Keyboard, Mousewheel, Pagination } from 'swiper'
import { Swiper, SwiperSlide } from 'swiper/react'
import { Card, Text, Flex, Image, Button } from '@pancakeswap/uikit'
import { UnOpenModel } from 'components/Modal'
import { ListProp } from 'types/blindBox'
import Header from './component/Header'
import Operation from './component/Operation'
import { useGetList } from './hooks'
import 'swiper/swiper.min.css'
import 'swiper/components/pagination/pagination.min.css'
SwiperCore.use([Keyboard, Mousewheel, Pagination])
const MainFlex = styled(Flex)`
width: 100%;
min-height: calc(100vh - 64px);
align-items: center;
background: ${({ theme }) => theme.colors.gradients.bubblegum};
`
const SwiperDiv = styled(Swiper)`
height: 730px;
position: relative;
& > .swiper-wrapper > .swiper-slide > div > div {
background: transparent;
}
& > .swiper-container-horizontal > .swiper-pagination-bullets,
.swiper-pagination-custom,
.swiper-pagination-fraction {
/* position: absolute; */
bottom: 130px;
}
& > .swiper-pagination {
bottom: 130px !important;
${({ theme }) => theme.mediaQueries.xs} {
bottom: 260px !important;
}
${({ theme }) => theme.mediaQueries.lg} {
bottom: 130px !important;
}
& > .swiper-pagination-bullet {
background: #fff;
width: 14px;
height: 9px;
opacity: 1;
border-radius: 3px;
z-index: 999;
}
& > .swiper-pagination-bullet-active {
background: #000;
}
}
`
const BlindBoxFlex = styled(Flex)`
flex-direction: column;
align-items: center;
justify-content: center;
`
const BlindBoxCard = styled.div`
width: 500px;
/* height: 590px; */
background: #ffffff !important;
box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.15);
opacity: 1;
border-radius: 20px;
margin: 0 auto;
position: relative;
${({ theme }) => theme.mediaQueries.xs} {
width: 350px;
}
${({ theme }) => theme.mediaQueries.lg} {
width: 500px;
}
& > .ribbon {
width: 106px;
height: 108px;
overflow: hidden;
position: absolute;
top: -0px;
left: 0px;
z-index: 10;
& > .ribbon1 {
line-height: 14px;
text-align: center;
transform: rotate(-45deg);
position: relative;
padding: 8px 0;
left: -33px;
top: 26px;
width: 150px;
color: white;
box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1);
letter-spacing: 1px;
font-size: 14px;
}
& > .limitQuantity {
background: linear-gradient(180deg, #4ee1b4 0%, #2183f3 100%);
}
& > .limitTime {
background: linear-gradient(180deg, #24bcf2 0%, #7e4ee1 100%);
}
}
`
const UnlockButtonDiv = styled(UnlockButton)`
width: 500px;
height: 45px;
background: linear-gradient(180deg, #7be0fc 0%, #9961f0 100%);
opacity: 1;
border-radius: 23px;
margin-top: 80px;
${({ theme }) => theme.mediaQueries.xs} {
width: 350px;
}
${({ theme }) => theme.mediaQueries.lg} {
width: 500px;
}
`
const BuyButton = styled(Button)`
width: 500px;
height: 45px;
background: linear-gradient(180deg, #7be0fc 0%, #9961f0 100%);
opacity: 1;
border-radius: 23px;
margin-top: 80px;
${({ theme }) => theme.mediaQueries.xs} {
width: 350px;
}
${({ theme }) => theme.mediaQueries.lg} {
width: 500px;
}
`
const BlindBox: React.FC = () => {
const { t } = useTranslation()
const account = useAccount()
const [blindBoxList, setBlindBoxList] = useState<ListProp[]>()
const [buyNum, setBuyNum] = useState(0)
const getList = useGetList()
const getData = async () => {
const { content } = await getList(1, 10)
const arr = []
content.forEach((item) => {
const obj = item
obj.num = 0
obj.priceList = []
Object.keys(obj.price).forEach((childItem) => {
obj.priceList.push({ label: childItem, value: obj.price[childItem] })
})
obj.price = undefined
arr.push(obj)
})
setBlindBoxList(arr)
}
useEffect(() => {
getData()
}, [])
const handleBuy = () => {
console.log(buyNum)
}
return (
<MainFlex>
{/* <UnOpenModel /> */}
<SwiperDiv
loop
pagination={{ clickable: true }}
spaceBetween={16}
freeModeMomentumRatio={0.25}
freeModeMomentumVelocityRatio={0.5}
>
{blindBoxList?.map((item) => {
return (
<SwiperSlide key={item.id}>
<BlindBoxFlex>
<BlindBoxCard>
<div className="ribbon">
{item.type === 'QUANTITATIVE' ? (
<div className="ribbon1 limitQuantity">{t('limit the quantity of')}</div>
) : (
<div className="ribbon1 limitTime">{t('time limit')}</div>
)}
</div>
<Header detail={item} />
<Image src={item.coverResource.url} width={500} height={460} marginTop="-40px" />
<Operation detail={item} getNum={(v) => setBuyNum(v)} />
</BlindBoxCard>
{account ? <BuyButton onClick={handleBuy}>{t('Buy It Now')}</BuyButton> : <UnlockButtonDiv />}
</BlindBoxFlex>
</SwiperSlide>
)
})}
</SwiperDiv>
</MainFlex>
)
}
export default BlindBox