From 5ea1b479d80456f222bd90f14dd0b851b11af8f1 Mon Sep 17 00:00:00 2001 From: yyy9608 Date: Thu, 4 Jan 2024 18:04:12 +0800 Subject: [PATCH] commit --- src/api/index.ts | 36 +++++++++- src/assets/buy-success.png | Bin 0 -> 49407 bytes src/assets/iconfont/iconfont.css | 10 ++- src/assets/iconfont/iconfont.js | 2 +- src/assets/iconfont/iconfont.json | 7 ++ src/assets/iconfont/iconfont.ttf | Bin 4812 -> 5000 bytes src/assets/iconfont/iconfont.woff | Bin 3248 -> 3368 bytes src/assets/iconfont/iconfont.woff2 | Bin 2628 -> 2724 bytes src/components/Modal.tsx | 24 ++++--- src/components/ProductInfo.tsx | 63 +++++++++++++---- src/hooks/useLike.ts | 41 +++++++++++ src/pages/detail/BuyNft.tsx | 95 ++++++++++++++++++++++++++ src/pages/detail/NFTProperties.tsx | 35 ++++++++++ src/pages/detail/OnShelvesNFT.tsx | 18 +++++ src/pages/detail/index.tsx | 106 +++++++++++++++++++++++++---- src/pages/home/index.tsx | 93 +++++++++++++++++-------- src/pages/product/index.tsx | 63 ++++++++++++++--- src/pages/share/index.tsx | 35 ++++------ src/router/layout/index.tsx | 23 +++++-- src/router/layout/ui.tsx | 41 +++++++---- src/store/index.ts | 42 ++++++++++-- src/styles/components.scss | 9 ++- src/styles/detail.scss | 8 +++ src/styles/global.scss | 11 ++- src/styles/home.scss | 47 +++++++++++++ src/styles/product.scss | 2 +- src/styles/theme.scss | 3 + src/types/store.d.ts | 1 + src/utils/index.ts | 3 +- 29 files changed, 687 insertions(+), 131 deletions(-) create mode 100644 src/assets/buy-success.png create mode 100644 src/hooks/useLike.ts create mode 100644 src/pages/detail/BuyNft.tsx create mode 100644 src/pages/detail/NFTProperties.tsx create mode 100644 src/pages/detail/OnShelvesNFT.tsx diff --git a/src/api/index.ts b/src/api/index.ts index c5118dd..45ee268 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -38,9 +38,9 @@ export const coin_list = () => request({ url: "/v1/tokenList" }); /** * @description market list - * @param {type} 1.拍賣 2.售賣 + * @param {type} 1.拍賣 2.售賣 3.搶購 4.推薦 */ -export const market_list = (type: 1 | 2) => +export const market_list = (type: number) => request({ url: "/v1/market", data: { type } }); /** @@ -96,3 +96,35 @@ export const my_invite = (query: { page: number; page_size: number }) => */ export const bind_rmd = (address: string) => request({ url: "/v1/binding", data: { address } }); + +/** + * @description 設置喜歡 + * @param id NFT ID + * @param status 1.喜歡 2.取消喜歡 + */ +export const set_like = (id: number, status: number) => + request({ url: "/v1/like", data: { id, status } }); + +/** + * @description NFT Search + * @param name + */ +export const search_nft = (name: string) => + request({ url: "/v1/search", data: { name } }); + +/** + * @description NFT Detail + * @param id + * @param type + */ +export const nft_detail = (query: object) => + request({ url: "/v1/getNft", data: query }); + +/** + * @description Buy NFT + * @param {number} id + * @param {number} type + * @param {string} amount 拍賣時傳入 + */ +export const buy_nft = (query: object) => + request({ url: "/v1/buy", data: query }); diff --git a/src/assets/buy-success.png b/src/assets/buy-success.png new file mode 100644 index 0000000000000000000000000000000000000000..915a643cb0b637df8e08ece2790b3c4798cc2429 GIT binary patch literal 49407 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 literal 0 HcmV?d00001 diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css index 8986fe5..37beba6 100644 --- a/src/assets/iconfont/iconfont.css +++ b/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4379626 */ - src: url('iconfont.woff2?t=1704271682012') format('woff2'), - url('iconfont.woff?t=1704271682012') format('woff'), - url('iconfont.ttf?t=1704271682012') format('truetype'); + src: url('iconfont.woff2?t=1704333891284') format('woff2'), + url('iconfont.woff?t=1704333891284') format('woff'), + url('iconfont.ttf?t=1704333891284') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-daohangshoucangyishoucang:before { + content: "\e625"; +} + .icon-close:before { content: "\e6a7"; } diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js index 76b33cd..237d377 100644 --- a/src/assets/iconfont/iconfont.js +++ b/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4379626='',function(l){var t=(t=document.getElementsByTagName("script"))[t.length-1],c=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var o,i,e,a,s,n=function(t,c){c.parentNode.insertBefore(t,c)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}o=function(){var t,c=document.createElement("div");c.innerHTML=l._iconfont_svg_string_4379626,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(t=document.body).firstChild?n(c,t.firstChild):t.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),o()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(e=o,a=l.document,s=!1,d(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,h())})}function h(){s||(s=!0,e())}function d(){try{a.documentElement.doScroll("left")}catch(t){return void setTimeout(d,50)}h()}}(window); \ No newline at end of file +window._iconfont_svg_string_4379626='',function(l){var t=(t=document.getElementsByTagName("script"))[t.length-1],c=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var o,i,e,a,s,n=function(t,c){c.parentNode.insertBefore(t,c)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}o=function(){var t,c=document.createElement("div");c.innerHTML=l._iconfont_svg_string_4379626,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(t=document.body).firstChild?n(c,t.firstChild):t.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),o()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(e=o,a=l.document,s=!1,d(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,h())})}function h(){s||(s=!0,e())}function d(){try{a.documentElement.doScroll("left")}catch(t){return void setTimeout(d,50)}h()}}(window); \ No newline at end of file diff --git a/src/assets/iconfont/iconfont.json b/src/assets/iconfont/iconfont.json index 7d0e83c..d2aa0f3 100644 --- a/src/assets/iconfont/iconfont.json +++ b/src/assets/iconfont/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "1079642", + "name": "导航_收藏_已收藏", + "font_class": "daohangshoucangyishoucang", + "unicode": "e625", + "unicode_decimal": 58917 + }, { "icon_id": "257406", "name": "close", diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf index ec6839b8aeeff9c04470fb24dbbc914993091ea6..6d357ae4ef2994064a9abf56ec90e69846ac5d04 100644 GIT binary patch delta 845 zcmaKpUr1A77{;IPoU=1^$DGsrm(4l1DVS!7e~M`{Sl&cJf?)`Ca=Ho5Ov&F82tD#+XQoE^RGd-?7A-gDmbzR&Y*CwQlIwI#a^ zhWBL!CUywi| znOPk9Qz)?CPv#eAQ&EZ}s6c!yT>MiCapx)xLzN^Z4 z#k}art%}T=GJJBs*bMjuwRk$gy^P)Wq2Vpd1Mu;rNnMu9IvLEZE8Y?&#z8VLVkrqQ zLjMiGiE_5qSZ%<;5gzDNR!VJ^sK61p;bJR&qgfSM&ZT>a(aAs^XTx4SoF zLoe9le_%mZ$k*G@AMz0!Iz|4Sjpezx&SMkbg;zwxvJ%TGca^7VwR&28sD9AA+N`#! zeRND)P71r~C$*nf4H0tcj80M9^rO|aHC8lc0;Wu3VjJkm-#~j^%o|_;+MyV27NV7XHE0q(D>-| sm8;QksQH=Sv1^E`+b%uFTBx%fgNb#s#Y(#+v0cg*wTA9^vc4FCWD delta 662 zcmaKqO-PhM7{~uJ?}uNzt-cVfONgvniWm}vglwpE*$6y!&$rdwU{_aNXuY&_5IuA- zM?41}^dczU#6uC4hrW=Y%N~kgT*5;Hbqe49?>lsLh9C1hGtWHF{~2bb_ub{yp4taM zJOwb3FZt#9`ce%MiZL$(Vuiaq`N*M$qUquq8A` z4QvjLH-@lHju~vDjx#YV(=sQ^@>u?~?piBW-R`%??X~b%VgI%BDJDF%;bjEW7jN$$ DbNP;F diff --git a/src/assets/iconfont/iconfont.woff b/src/assets/iconfont/iconfont.woff index a270a93a2635b71d4898951b514cb2cdc5e01a6c..2fbcfcdb140d1ac4d756769209d00296d6396c1f 100644 GIT binary patch delta 2880 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 eao=D*$FuThAg1~5en6VUaWeo-{TTANz delta 2627 zcmV-J3cU5C6~q)6cTYw#00961000U^01E&B000uq000T~kr*C-ND7olks<*$0we=S z3nl;rAO(bH2Z44QJP;!T!Nvg~P_IMw7Y95UufY%&ES+tdYK_NIkFulBMQx0)aAF)h z;28fu1RvAHk)f3E^p2tbatW6ZRr`DucwpmkzV&atp@!7&)E&Y z#s+YJ0t*!@lK*DMPoNqvC@xc-E$?6q7q4S}TBC9nh^JO7l_{oKw}cJ-?!DkAYsH)` z%4nob7<00Jx^q5;rvZafuq0ab5xTE=i*XuhuJ}LCV{;8KeAKjJKdn6$#Z$lno(h5i z?+k*14+Nor=Ye3s*MgA1w}Q!K2?`mFbjgKH^_nnb-?Y+ObRH5m!%bt5h@OLBF<;`b~;vY5Gn zOsi&yCH=PRF(xY3U>gW0DcVQqah61?!DLf!$5~LM_jl;d3!6^3O^D+gKz_))DasnMu$ets?y?mf{7}NqW1X=`1+WA z$oe!oCxs605K9&4Scw!>LXei_gu^sg!w3VG%svT0f<^#iXkgg1!&=vckkul$MS*&x zk+~-PE&~94w-c;pY4ZWt3ZvUK^sZW#M5~2=Bt&}4P%|{rZh4&9j9zG^FU?Eyl3r5zRwAfWtS(LtnmBva!-Nh3jS$v{z@R{5LQQ=L0E9|Y zuLpqeA%z2n+stQhD@IuRK=?*ErGTn`sI17Xu95^6S%*_u+gc@tX3=dnV0Z!uaed5W z?4s0aSs~h`P|eA>rIo#j_i3XM0BkWMNW)-g`T@2XL6(?I#P#c5IOSFdUsy+McG;um zEZX|7+RUadHi))ODR-y0?%uU`SNn9JQVHCW-7I(Xw!xb!;KIPI^p1dgb(fx9#Xb-o ze$eM2AoUA(`RJcM1N@0+`gIC_SH-1^l}-xeKp`PFY``JH(U%j9zR*+ahv7aTJKvr2=`vs!P2?;F^(Col}l$s`o5Hcu( zdXu}z^cmf}S*S21H7F=GM7VK*V8G=!ZaauMDQ!tfZEAunYOS_&KMKEvY4AH3_3~+7 zWz@kr$i2vU7n$>t>MTVW=bXd%m~$%e>!8=&@fMAtbi4&_FPqYH(RGg`_1b$Ro1CM53^)2zeUD{rIW4)WXaNQCPSrJWC$$*AVJp-!!AK#%mwn zP}TzuPL>6vh)|JOl)Tda5^s^eJOE8ULAn@tea32v0t*6W%?gkO7F`Yy1bAst;FXk- z5lD8!+|cZz>CoqYnUOiSf8}WTZEbvQPBXVSP9}>h=H3Gc23)+i?GCC>*^-h;woyT2 zp)lJObrpD>vV}hescfn@p}=#7$%(EfT@%R{^X_->rn2Xy?Qt3&r^EdCZDf<-q8l+6 zsE)v}EH$~KBY7r4mYI43h41Xyi^5vtrJ-}s8oDLvSqUzGZrQ$sG`h&+zj^cfUD>XH zTVnP(<1IgO&2cV|Q(KsEEK4OSDmivf%&Fzgb-Z?Dyx*SK7xx`KPO>(qM+-AT|ywi&YU)OvcgmsXAU8t { return ( backgroundColosed && setVisible(false)} >
-
+
{title}
-
+
{ !hiddenCloseIcon && ( - setVisible(false)} /> + setVisible(false)} /> ) }
{children}
-
buttonClick()}>{buttonText}
+ { + !showConfirmButton && ( +
buttonClick && buttonClick()}>{buttonText}
+ ) + } { showCancelButton &&
showCancelButtonClick && showCancelButtonClick()}>{showCancelButtonText || '關閉'}
diff --git a/src/components/ProductInfo.tsx b/src/components/ProductInfo.tsx index e5126d8..53d6cdc 100644 --- a/src/components/ProductInfo.tsx +++ b/src/components/ProductInfo.tsx @@ -1,39 +1,72 @@ +import { observer } from 'mobx-react' +import { useState } from 'react' +import useLike from '~/hooks/useLike' +import store from '~/store' import '~/styles/components.scss' +import { MarketNFTData } from '~/types/store' +import { toThousands } from '~/utils' +import { copy } from '~/utils/copy' +import Modal from './Modal' + +interface ProductInfoProps { + data: MarketNFTData +} + +const ProductInfo = (props: ProductInfoProps) => { + + const { data } = props + const { likeNft } = store.state + const { setLike, isLike } = useLike() + const [visible, setVisible] = useState(false) + + const share = () => { + const pathname = `${process.env.REACT_APP_SHARE_LINK}detail?id=${data.id}&type=${data.type}` + copy(pathname) + setVisible(true) + } -const ProductInfo = () => { return (
- +
-
- - - -
-
生肖唐彩-龙
-
USDT 21,100.15
+ {data.type !== 0 &&
+ setLike(data.id)} /> + +
} +
{data.name}
+
{data.symbol} {toThousands(data.price)}
铸造者
- -
Filefast
+ +
{data.cast_name}
售卖者
- -
Filefast
+ +
{data.sell_name}
- + +
+ 已複製鏈接 +
+
) } -export default ProductInfo \ No newline at end of file +export default observer(ProductInfo) \ No newline at end of file diff --git a/src/hooks/useLike.ts b/src/hooks/useLike.ts new file mode 100644 index 0000000..76f0ecc --- /dev/null +++ b/src/hooks/useLike.ts @@ -0,0 +1,41 @@ +import { useRef } from "react"; +import { set_like } from "~/api"; +import store from "~/store"; +import { MarketNFTData } from "~/types/store"; + +const useLike = () => { + const throttle = useRef(false) + /** + * @description 設置喜歡的NFT + * @param id nftid + * 1.喜歡 2.取消喜歡 + */ + const setLike = async (id: number) => { + if (!store.state.token) return store.setVisibleUnLogin(true); + if(throttle.current)return + throttle.current = true + let item = store.state.likeNft.find((v) => v.id === id); + let status = item ? 2 : 1; + let res: any = await set_like(id, status); + throttle.current = false + if (res && res.code === 0) { + store.getMyNft("likeNft", 2); + } + }; + + /** + * 判斷喜歡的NFt + */ + const isLike = (id: number, likeNft: MarketNFTData[]) => { + const item = likeNft.find((v) => v.id === id); + if (item) return true; + return false; + }; + + return { + setLike, + isLike, + }; +}; + +export default useLike; diff --git a/src/pages/detail/BuyNft.tsx b/src/pages/detail/BuyNft.tsx new file mode 100644 index 0000000..a698553 --- /dev/null +++ b/src/pages/detail/BuyNft.tsx @@ -0,0 +1,95 @@ +import '~/styles/detail.scss' +import { Button, Toast } from 'react-vant' +import { MarketNFTData } from '~/types/store' +import Modal from '~/components/Modal' +import { useState } from 'react' +import { observer } from 'mobx-react' +import store from '~/store' +import { toThousands } from '~/utils' +import { buy_nft } from '~/api' + +interface BuyNftProps { + data: MarketNFTData +} + +const BuyNft = (props: BuyNftProps) => { + + const { data } = props + const { userInfo, token } = store.state + const [buyVisible, setBuyVisible] = useState(false) + const [successVisible, setSuccessVisible] = useState(false) + + const openBuyModal = () => { + if (!token) return store.setVisibleUnLogin(true) + let symbol = data.symbol + if (symbol === 'USDT' && Number(userInfo.balance_Usdt) < Number(data.price)) { + Toast.fail('餘額不足') + return + } + if (symbol === 'FIL' && Number(userInfo.balance_fil) < Number(data.price)) { + Toast.fail('餘額不足') + return + } + setBuyVisible(true) + } + + const buyNft = async () => { + setBuyVisible(false) + const params = { + id: data.id, + type: data.type + } + const res: any = await buy_nft(params) + if (res && res.code === 0) { + setSuccessVisible(true) + store.getMyNft("myNft", 1) + store.getMarketNft("issueNft") + store.getMarketNft("sellNft") + } + } + + return ( +
+ + {/* Buy Modal */} + 確定購買
} + buttonClick={buyNft} + > +
+
您將以 {toThousands(data.price)} {data.symbol}
+
購買一張 "{data.name}" NFT
+
+ + {/* success */} + +
+
+ +
+
恭喜購買成功
+
{data.name}
+
+
+
+ ) +} + +export default observer(BuyNft) \ No newline at end of file diff --git a/src/pages/detail/NFTProperties.tsx b/src/pages/detail/NFTProperties.tsx new file mode 100644 index 0000000..0a505e7 --- /dev/null +++ b/src/pages/detail/NFTProperties.tsx @@ -0,0 +1,35 @@ +import { MarketNFTData } from "~/types/store" +import { getTime } from "~/utils" + +interface NFTPropertiesProps { + data: MarketNFTData +} + +const NFTProperties = (props: NFTPropertiesProps) => { + + const { data } = props + + return ( +
+
NFT屬性:
+
+
鑄造日期:{getTime(data.time * 1000, 'day')}
+
NFT名稱:{data.name}
+
+
+
NFT編號:{data.number}
+
NFT發行數:{data.total_stock}
+
+
+
NFT功能:{data.function}
+
歸屬平臺:{data.platform}
+
+
+
獎勵分配:{data.award}
+
分配天數:{data.day}
+
+
+ ) +} + +export default NFTProperties \ No newline at end of file diff --git a/src/pages/detail/OnShelvesNFT.tsx b/src/pages/detail/OnShelvesNFT.tsx new file mode 100644 index 0000000..9fcf5e3 --- /dev/null +++ b/src/pages/detail/OnShelvesNFT.tsx @@ -0,0 +1,18 @@ +import { MarketNFTData } from "~/types/store" + +interface OnShelvesNFTProps { + data: MarketNFTData +} + +const OnShelvesNFT = (props: OnShelvesNFTProps) => { + + const { data } = props + + return ( +
+ 售賣 拍賣 +
+ ) +} + +export default OnShelvesNFT \ No newline at end of file diff --git a/src/pages/detail/index.tsx b/src/pages/detail/index.tsx index bb57c0d..8b4d706 100644 --- a/src/pages/detail/index.tsx +++ b/src/pages/detail/index.tsx @@ -1,22 +1,104 @@ -import { Button } from "react-vant" +import { useEffect, useMemo, useState } from "react" +import { Button, Empty, Loading } from "react-vant" +import { nft_detail } from "~/api" +import BackBar from "~/components/BackBar" import ProductInfo from "~/components/ProductInfo" +import { useRouter } from "~/hooks/useRouter" import '~/styles/detail.scss' +import { MarketNFTData } from "~/types/store" +import BuyNft from "./BuyNft" +import NFTProperties from "./NFTProperties" +import OnShelvesNFT from "./OnShelvesNFT" const Detail = () => { + + const { location } = useRouter() + const query = useMemo(() => { + let obj = {} as { [key: string]: number } + if (location.state) { + obj.id = Number(location.state.id) + obj.type = Number(location.state.type) + } + if (location.search) { + let val = location.search.substring(1).split('&') + val.forEach(item => { + let value = item.split('=') + obj[value[0]] = Number(value[1]) + }) + } + return obj + }, [location]) + + const [product, setProduct] = useState({} as MarketNFTData) + const [loading, setLoading] = useState(false) + console.log(product); + + const titles = useMemo(() => ({ + "0": "上架", + "1": "拍賣", + "2": "售賣", + "3": "發行" + } as any), []) + + useEffect(() => { + const getData = async () => { + setLoading(true) + const res: any = await nft_detail(query) + setLoading(false) + res && res.code === 0 && setProduct(res.data) + } + + Object.keys(query).length === 2 && getData() + }, []) + + if (Object.keys(query).length < 2) return ( +
+ +
+ +
+
+ ) + + if (loading) return ( +
+
+ +
數據獲取中...
+
+
+ ) + return (
- -
- + +
+
+ {/* type 0.表示上架NFT 2.購買NFT 3.搶購 */} + { + product.type === 0 && ( +
+ +
+ ) + } + + { + product.type === 0 && ( + + ) + } + + { + product.type === 2 && ( + + ) + }
) } diff --git a/src/pages/home/index.tsx b/src/pages/home/index.tsx index 22961c8..d20692b 100644 --- a/src/pages/home/index.tsx +++ b/src/pages/home/index.tsx @@ -1,44 +1,81 @@ import '~/styles/home.scss' import ProductItem from '~/components/ProductItem' import { useRouter } from '~/hooks/useRouter' -import { Button } from 'react-vant' -import { useEffect, useState } from 'react' -import { market_list } from '~/api' -import { MarketNFTData } from '~/types/store' +import { Button, Swiper, SwiperInstance } from 'react-vant' +import { useEffect, useRef } from 'react' import { splitAddress } from '~/utils' import { observer } from 'mobx-react' +import store from '~/store' +import useLike from '~/hooks/useLike' const Home = () => { const { push } = useRouter() - const [marketData, setMarketData] = useState([] as MarketNFTData[]) - const [auctionData, setAuctionData] = useState([] as MarketNFTData[]) - + const { sellNft, auctionNft, likeNft } = store.state + const like = useLike() + const swiperRef = useRef(null) useEffect(() => { - const getMarketData = async () => { - const res: any = await market_list(2) - res && res.code === 0 && res.data && setMarketData(res.data) - } - const getAuctionData = async () => { - const res: any = await market_list(1) - res && res.code === 0 && res.data && setAuctionData(res.data) - } - getMarketData() - getAuctionData() + store.getMarketNft("sellNft") + store.getMarketNft("auctionNft") + store.getMarketNft("issueNft") }, []) return (
-
拍卖趋势
+
發行搶購
+
+
+ { + swiperRef.current && swiperRef.current.swipePrev() + }}> +
+
+ + +
+
+ +
+
回購型NFT
+
生肖唐彩-猴
+
+
+
USDT 10000
+
+ +
+
+
+
+
即將發售
+
54:42:15
+
+
Filefaasdasdasdfdsfsdf
+
+
+
+ +
+
+
+
+
+
+ { + swiperRef.current && swiperRef.current.swipeNext() + }}> +
+
+
拍卖趋势
{ - auctionData.map((item, index) => ( + auctionNft.map((item, index) => (
- push('/detail', { id: item.id })} /> + push('/detail', { id: item.id, type: item.type })} />
@@ -64,7 +101,9 @@ const Home = () => { - + like.setLike(item.id)} />
@@ -72,12 +111,12 @@ const Home = () => { )) }
-
售卖市场
-
+
售卖市场
+
{ - marketData.map((item, index) => ( -
push('/detail', { id: item.id })}> + sellNft.map((item, index) => ( +
push('/detail', { id: item.id, type: item.type })}>
)) @@ -89,4 +128,4 @@ const Home = () => { ) } -export default Home \ No newline at end of file +export default observer(Home) \ No newline at end of file diff --git a/src/pages/product/index.tsx b/src/pages/product/index.tsx index 757cadd..252ad21 100644 --- a/src/pages/product/index.tsx +++ b/src/pages/product/index.tsx @@ -1,25 +1,72 @@ -import { Divider } from 'react-vant' +import { debounce } from 'lodash' +import { observer } from 'mobx-react' +import { useEffect, useState } from 'react' +import { Divider, Loading } from 'react-vant' +import { search_nft } from '~/api' +import { useRouter } from '~/hooks/useRouter' +import store from '~/store' import '~/styles/product.scss' import { MarketNFTData } from '~/types/store' import ProductItem from '../../components/ProductItem' const Product = () => { + const { rmdNft } = store.state + const { push } = useRouter() + const [nftList, setNftList] = useState([] as MarketNFTData[]) + const [loading, setLoading] = useState(false) + + const onChange = (e: any) => { + searchNft(e.target.value) + } + + const searchNft = debounce(async (value: string) => { + if (!value) return setNftList([]) + setLoading(true) + const res: any = await search_nft(value) + setLoading(false) + if (res && res.code === 0 && res.data) { + setNftList(res.data) + } + }, 700) + + useEffect(() => { + store.getMarketNft("rmdNft") + }, []) return ( -
+
- + + { + loading && ( +
+ +
+ ) + } +
+
{nftList.length}個結果
+
+
+ { + nftList.map((item, index) => ( +
push("/detail", { id: item.id, type: item.type })}> + +
+ )) + } +
-
0个结构
-
推荐
{ - Array.from({ length: 6 }).map((_, index) => ( - + rmdNft.map((item, index) => ( +
push("/detail", { id: item.id, type: item.type })}> + +
)) }
@@ -28,4 +75,4 @@ const Product = () => { ) } -export default Product \ No newline at end of file +export default observer(Product) \ No newline at end of file diff --git a/src/pages/share/index.tsx b/src/pages/share/index.tsx index 77bd4d2..aa4dd26 100644 --- a/src/pages/share/index.tsx +++ b/src/pages/share/index.tsx @@ -1,16 +1,17 @@ import '~/styles/share.scss' import { Popup, Tabs, Toast } from 'react-vant' import ProductItem from '~/components/ProductItem' -import { MarketNFTData } from '~/types/store' import store from '~/store' import { observer } from 'mobx-react' import { toFixed2 } from '~/utils' -import { useEffect, useMemo, useRef, useState } from 'react' -import { open_page, personal_nft, reset_name, upload_image } from '~/api' +import { useMemo, useRef, useState } from 'react' +import { open_page, reset_name, upload_image } from '~/api' +import { useRouter } from '~/hooks/useRouter' const Share = () => { - const { userInfo, token } = store.state + const { userInfo, token, likeNft, myNft } = store.state + const { push } = useRouter() const [visible, setVisible] = useState(false) const inputRef = useRef(null) const nameRef = useRef(null) @@ -18,10 +19,6 @@ const Share = () => { const prevent = useRef(false) //阻止重複點擊 const fileRef = useRef(null as any) const [tempUrl, setTempUrl] = useState(null as any) - const [nftList, setNftList] = useState([ - [], //我的 - [],//我喜歡的 - ] as MarketNFTData[][]) const tabs = useMemo(() => ['我的NFT', '我喜歡的NFT'], []) const avatarmenuClick = (event: any) => { @@ -90,18 +87,6 @@ const Share = () => { inputRef.current!.value = '' } - useEffect(() => { - const getData = async () => { - const res: any = await personal_nft(1) - if (res && res.code === 0) { - nftList[0] = res.data - setNftList([...nftList]) - } - } - - token && getData() - }, [token]) - return (
@@ -180,12 +165,18 @@ const Share = () => { key={index} title={
{item} - {nftList[index].length} + { + index === 0 ? myNft.length : likeNft.length + }
} titleClass='fz-wb-550' >
- {nftList[index].map((item, index) => )} + {(index === 0 ? myNft : likeNft).map((item, index) => ( +
push('/detail', { id: item.id, type: item.type })}> + +
+ ))}
)) diff --git a/src/router/layout/index.tsx b/src/router/layout/index.tsx index 2a08142..1d81137 100644 --- a/src/router/layout/index.tsx +++ b/src/router/layout/index.tsx @@ -41,10 +41,20 @@ const LayoutRouter = () => { } useEffect(() => { - token && store.getUserInfo() - token && store.getCoinList() - !token && store.resetCoinList() - !token && store.resetUserInfo() + if (token) { + store.getUserInfo() + store.getCoinList() + store.getMyNft('myNft', 1) + store.getMyNft('likeNft', 2) + } + + if (!token) { + store.resetCoinList() + store.resetUserInfo() + store.resetNft("likeNft") + store.resetNft("myNft") + } + // token && messageWs.connect(token) // !token && messageWs.disconnect() }, [token]) @@ -55,7 +65,6 @@ const LayoutRouter = () => { let isRouter = routes.find(v => v.path === location.pathname) const address = location.pathname.substring(1, location.pathname.length) - if (user.is_bound) return if (isRouter) return if (Object.keys(user).length <= 0) { @@ -79,7 +88,7 @@ const LayoutRouter = () => { return } // 已有推荐人 - if (user.is_bound) { + if (user.is_bound && ethers.utils.isAddress(address)) { setVisibleAlreadyBind(true) } } @@ -120,7 +129,7 @@ const LayoutRouter = () => { onClick={() => { push('/', null, true) setVisibleAlreadyBind(false) - push('/share') + push('/team') }} visible={visibleAlreadyBind} setVisible={setVisibleAlreadyBind} diff --git a/src/router/layout/ui.tsx b/src/router/layout/ui.tsx index 0f1204b..3230fac 100644 --- a/src/router/layout/ui.tsx +++ b/src/router/layout/ui.tsx @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import { useRef } from "react"; import { Toast } from "react-vant"; +import { useRouter } from "~/hooks/useRouter"; import Modal from "../../components/Modal"; interface UIProps { visible: boolean, @@ -88,22 +89,32 @@ export const BindRmd = ({ visible, setVisible, address, onClick }: UIProps) => ( ) -export const BindSuccess = ({ visible, setVisible, address }: UIProps) => ( - -
-
綁定成功
-
{address}
-
-
-) +export const BindSuccess = ({ visible, setVisible, address }: UIProps) => { + const { push } = useRouter() + return ( + { + push('/', null, true) + setVisible() + push('/team') + }} + buttonText="查看綁定" + hiddenCloseIcon + showCancelButton + showCancelButtonText="關閉" + showCancelButtonClick={setVisible} + > +
+
綁定成功
+
{address}
+
+
+ ) +} export const AlreadyBind = ({ visible, setVisible, onClick }: UIProps) => ( { * @param value * @returns */ -const getTime = (value: number) => { +const getTime = (value: number, type?: string) => { let date = new Date(value); let yy: number | string = date.getFullYear(); let mm: number | string = date.getMonth() + 1; @@ -76,6 +76,7 @@ const getTime = (value: number) => { xs = xs >= 10 ? xs : "0" + xs; ff = ff >= 10 ? ff : "0" + ff; ss = ss >= 10 ? ss : "0" + ss; + if(type === 'day') return `${yy}-${mm}-${dd}` return `${yy}-${mm}-${dd} ${xs}:${ff}`; };