You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.7 KiB
156 lines
5.7 KiB
import { useMemo, useRef, useState } from "react"
|
|
import { Button, Radio, Toast } from "react-vant"
|
|
import { MarketNFTData } from "~/types/store"
|
|
import '~/styles/detail.scss'
|
|
import Modal from "~/components/Modal"
|
|
import { toThousands } from "~/utils"
|
|
import { shelves_nft } from "~/api"
|
|
import store from "~/store"
|
|
import { useRouter } from "~/hooks/useRouter"
|
|
|
|
interface OnShelvesNFTProps {
|
|
data: MarketNFTData
|
|
}
|
|
|
|
const OnShelvesNFT = (props: OnShelvesNFTProps) => {
|
|
|
|
const { data } = props
|
|
const { push } = useRouter()
|
|
const [defaultValue, setDefaultValue] = useState("") //1.拍賣 2.售賣
|
|
const symbols = useMemo(() => ['FIL', 'USDT'], [])
|
|
const markups = useMemo(() => [1, 5, 10], []) // 拍賣加價
|
|
const auctionTimes = useMemo(() => [24, 48, 72], []) // 拍賣時間
|
|
const [currentMarkeup, setCurrentMarkeup] = useState(5) //當前拍賣加價
|
|
const [currentSymbol, setCurrentSymbol] = useState('') //當前代筆
|
|
const [currentAuctionTime, setCurrentAuctionTime] = useState(24) //當前拍賣時間
|
|
const [visible, setVisible] = useState(false)//拍賣
|
|
const [sellVisible, setSellVisible] = useState(false)//售賣
|
|
|
|
const amountRef = useRef<HTMLInputElement>(null)
|
|
|
|
const openModal = () => {
|
|
if (!store.state.token) return store.setVisibleUnLogin(true)
|
|
if (!defaultValue) return Toast.fail('請選擇拍賣或售賣')
|
|
if (!currentSymbol) return Toast.fail('請選擇代筆')
|
|
if (!amountRef.current!.value) return Toast.fail('請輸入上架金額');
|
|
if (defaultValue === "1") return setVisible(true)
|
|
setSellVisible(true)
|
|
}
|
|
|
|
// 確認拍賣
|
|
const confirmAuction = async () => {
|
|
setVisible(false)
|
|
const params = {
|
|
id: data.id,
|
|
amount: amountRef.current?.value,
|
|
symbol: currentSymbol,
|
|
mark: currentMarkeup,
|
|
time: currentAuctionTime,
|
|
type: Number(defaultValue)
|
|
}
|
|
const res: any = await shelves_nft(params)
|
|
if (res && res.code === 0) {
|
|
Toast.success('上架成功')
|
|
store.getMarketNft("auctionNft")
|
|
store.getMyNft("myNft");
|
|
store.getUserInfo()
|
|
push(-1)
|
|
}
|
|
}
|
|
|
|
// 確認售賣
|
|
const confirmSell = async () => {
|
|
setSellVisible(false)
|
|
const params = {
|
|
id: data.id,
|
|
amount: amountRef.current?.value,
|
|
symbol: currentSymbol,
|
|
type: Number(defaultValue)
|
|
}
|
|
const res: any = await shelves_nft(params)
|
|
if (res && res.code === 0) {
|
|
Toast.success('上架成功')
|
|
store.getMarketNft("sellNft")
|
|
store.getMyNft("myNft");
|
|
store.getUserInfo()
|
|
push(-1)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className="mt-2 on-shelves-nft">
|
|
<Radio.Group defaultValue={defaultValue} onChange={setDefaultValue} direction="horizontal" checkedColor="#0FC6D4">
|
|
<Radio name="1">拍賣</Radio>
|
|
<Radio name="2" className="ml-2">售賣</Radio>
|
|
</Radio.Group>
|
|
<div className="mt-2 row-items">
|
|
{
|
|
symbols.map(item => (
|
|
<div key={item} className={`row-center tag ${item}-bg mr-2 ${currentSymbol === item && 'tag-active'}`} onClick={() => {
|
|
setCurrentSymbol(item)
|
|
}}>
|
|
<img src={require(`~/assets/${item}.png`)} alt="" />
|
|
<div>{item}</div>
|
|
</div>
|
|
))
|
|
}
|
|
</div>
|
|
<div className="mt-2">
|
|
<input placeholder="請輸入上架金額" className="input" ref={amountRef} />
|
|
</div>
|
|
<div className="mtb-2">
|
|
<Button className="on-button" onClick={openModal}>上架</Button>
|
|
</div>
|
|
{/* 拍賣 */}
|
|
<Modal
|
|
width="90%"
|
|
title={data.name}
|
|
visible={visible}
|
|
setVisible={setVisible}
|
|
showConfirmButton
|
|
>
|
|
<div className="mt-2">
|
|
<div className="tac fz-wb-550">起拍價 "<span className={`${currentSymbol}-text`}>{toThousands(amountRef.current?.value || '0')}</span>" {currentSymbol}</div>
|
|
<div className="tac mt-5px fz-wb-550">每次加價 <span className={`${currentSymbol}-text`}>{currentMarkeup}%</span></div>
|
|
<div className="row-center mt-1">
|
|
{
|
|
markups.map((item, index) => (
|
|
<div key={item} className={`row-center ${index === 1 && 'mlr-3'} fz-14 auction-tag ${currentSymbol}-bg`} onClick={() => setCurrentMarkeup(item)}>+{item}%</div>
|
|
))
|
|
}
|
|
</div>
|
|
<div className="tac mt-3 fz-wb-550">拍賣時間 "<span className={`${currentSymbol}-text`}>{currentAuctionTime}</span>" 小時</div>
|
|
<div className="row-center mt-2">
|
|
{
|
|
auctionTimes.map((item, index) => (
|
|
<div key={item} className={`row-center ${index === 1 && 'mlr-3'} fz-14 auction-tag ${currentSymbol}-bg`} onClick={() => setCurrentAuctionTime(item)}>{item}</div>
|
|
))
|
|
}
|
|
</div>
|
|
<div className="row-center mt-3">
|
|
<Button onClick={confirmAuction} className={`markeup-button ${currentSymbol}-bg`}>確定拍賣</Button>
|
|
</div>
|
|
</div>
|
|
</Modal>
|
|
{/* 售賣 */}
|
|
<Modal
|
|
width="90%"
|
|
title={data.name}
|
|
visible={sellVisible}
|
|
setVisible={setSellVisible}
|
|
showConfirmButton
|
|
>
|
|
<div className="mt-2">
|
|
<div className="tac fz-wb-550">售價 "<span className={`${currentSymbol}-text`}>{toThousands(amountRef.current?.value || '0')}</span>" {currentSymbol}</div>
|
|
|
|
|
|
<div className="row-center mt-3">
|
|
<Button onClick={confirmSell} className={`markeup-button ${currentSymbol}-bg`}>確定售賣</Button>
|
|
</div>
|
|
</div>
|
|
</Modal>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default OnShelvesNFT
|