Commit 10fe7f52 authored by Jack Short's avatar Jack Short Committed by GitHub

feat: purchasing through bag (#4696)

* feat: purchasing assets from bag

* better state management for bag

* fix: comineItemsWithTxRoute.ts

* fixed purchasing assets in review
parent 4deab755
This diff is collapsed.
...@@ -18,8 +18,7 @@ interface BagFooterProps { ...@@ -18,8 +18,7 @@ interface BagFooterProps {
totalEthPrice: BigNumber totalEthPrice: BigNumber
totalUsdPrice: number | undefined totalUsdPrice: number | undefined
bagStatus: BagStatus bagStatus: BagStatus
setBagStatus: (status: BagStatus) => void fetchAssets: () => void
fetchReview: () => void
assetsAreInReview: boolean assetsAreInReview: boolean
} }
...@@ -37,8 +36,7 @@ export const BagFooter = ({ ...@@ -37,8 +36,7 @@ export const BagFooter = ({
totalEthPrice, totalEthPrice,
totalUsdPrice, totalUsdPrice,
bagStatus, bagStatus,
setBagStatus, fetchAssets,
fetchReview,
assetsAreInReview, assetsAreInReview,
}: BagFooterProps) => { }: BagFooterProps) => {
const toggleWalletModal = useToggleWalletModal() const toggleWalletModal = useToggleWalletModal()
...@@ -86,10 +84,8 @@ export const BagFooter = ({ ...@@ -86,10 +84,8 @@ export const BagFooter = ({
onClick={() => { onClick={() => {
if (!isConnected) { if (!isConnected) {
toggleWalletModal() toggleWalletModal()
} else if (bagStatus === BagStatus.ADDING_TO_BAG) { } else {
fetchReview() fetchAssets()
} else if (bagStatus === BagStatus.CONFIRM_REVIEW || bagStatus === BagStatus.WARNING) {
setBagStatus(BagStatus.FETCHING_FINAL_ROUTE)
} }
}} }}
> >
......
...@@ -10,6 +10,8 @@ export * from './useSearchHistory' ...@@ -10,6 +10,8 @@ export * from './useSearchHistory'
export * from './useSelectAsset' export * from './useSelectAsset'
export * from './useSellAsset' export * from './useSellAsset'
export * from './useSellPageState' export * from './useSellPageState'
export * from './useSendTransaction'
export * from './useSweep' export * from './useSweep'
export * from './useTransactionResponse'
export * from './useWalletBalance' export * from './useWalletBalance'
export * from './useWalletCollections' export * from './useWalletCollections'
import create from 'zustand'
import { devtools } from 'zustand/middleware'
import { TxResponse } from '../types'
type TransactionResponseValue = TxResponse | undefined
type TransactionResponseState = {
transactionResponse: TransactionResponseValue
setTransactionResponse: (txResponse: TransactionResponseValue) => void
}
export const useTransactionResponse = create<TransactionResponseState>()(
devtools(
(set) => ({
transactionResponse: undefined,
setTransactionResponse: (txResponse) =>
set(() => ({
transactionResponse: txResponse,
})),
}),
{ name: 'useTransactionResponse' }
)
)
import { BigNumber } from '@ethersproject/bignumber' import { BigNumber } from '@ethersproject/bignumber'
import { BagItem, GenieAsset, Markets, UpdatedGenieAsset } from 'nft/types' import { BagItem, BagItemStatus, GenieAsset, Markets, UpdatedGenieAsset } from 'nft/types'
export const calcPoolPrice = (asset: GenieAsset, position = 0) => { export const calcPoolPrice = (asset: GenieAsset, position = 0) => {
let amountToBuy: BigNumber = BigNumber.from(0) let amountToBuy: BigNumber = BigNumber.from(0)
...@@ -58,6 +58,9 @@ export const recalculateBagUsingPooledAssets = (uncheckedItemsInBag: BagItem[]) ...@@ -58,6 +58,9 @@ export const recalculateBagUsingPooledAssets = (uncheckedItemsInBag: BagItem[])
if ( if (
!uncheckedItemsInBag.some( !uncheckedItemsInBag.some(
(item) => item.asset.marketplace === Markets.NFTX || item.asset.marketplace === Markets.NFT20 (item) => item.asset.marketplace === Markets.NFTX || item.asset.marketplace === Markets.NFT20
) ||
uncheckedItemsInBag.every(
(item) => item.status === BagItemStatus.REVIEWED || item.status === BagItemStatus.REVIEWING_PRICE_CHANGE
) )
) )
return uncheckedItemsInBag return uncheckedItemsInBag
......
import { BuyItem, GenieAsset, PriceInfo, RoutingItem, UpdatedGenieAsset } from '../../types' import { BuyItem, GenieAsset, PriceInfo, RoutingItem, UpdatedGenieAsset } from 'nft/types'
import { formatWeiToDecimal } from 'nft/utils/currency'
const isTheSame = (item: GenieAsset, routeAsset: BuyItem | PriceInfo) => { const isTheSame = (item: GenieAsset, routeAsset: BuyItem | PriceInfo) => {
// if route asset has id, match by id // if route asset has id, match by id
...@@ -13,7 +14,14 @@ const isTheSame = (item: GenieAsset, routeAsset: BuyItem | PriceInfo) => { ...@@ -13,7 +14,14 @@ const isTheSame = (item: GenieAsset, routeAsset: BuyItem | PriceInfo) => {
} }
} }
export const combineBuyItemsWithTxRoute = (items: GenieAsset[], txRoute?: RoutingItem[]): UpdatedGenieAsset[] => { const isPriceDiff = (oldPrice: string, newPrice: string) => {
return formatWeiToDecimal(oldPrice) !== formatWeiToDecimal(newPrice)
}
export const combineBuyItemsWithTxRoute = (
items: UpdatedGenieAsset[],
txRoute?: RoutingItem[]
): UpdatedGenieAsset[] => {
return items.map((item) => { return items.map((item) => {
const route = txRoute && txRoute.find((r) => r.action === 'Buy' && isTheSame(item, r.assetOut)) const route = txRoute && txRoute.find((r) => r.action === 'Buy' && isTheSame(item, r.assetOut))
...@@ -25,8 +33,14 @@ export const combineBuyItemsWithTxRoute = (items: GenieAsset[], txRoute?: Routin ...@@ -25,8 +33,14 @@ export const combineBuyItemsWithTxRoute = (items: GenieAsset[], txRoute?: Routin
} }
} }
const newPriceInfo = item.updatedPriceInfo ? item.updatedPriceInfo : item.priceInfo
// if the price changed // if the price changed
if (route && 'priceInfo' in route.assetOut && item.priceInfo.basePrice !== route.assetOut.priceInfo.basePrice) { if (
route &&
'priceInfo' in route.assetOut &&
isPriceDiff(newPriceInfo.basePrice, route.assetOut.priceInfo.basePrice)
) {
return { return {
...item, ...item,
updatedPriceInfo: route.assetOut.priceInfo, updatedPriceInfo: route.assetOut.priceInfo,
...@@ -35,6 +49,8 @@ export const combineBuyItemsWithTxRoute = (items: GenieAsset[], txRoute?: Routin ...@@ -35,6 +49,8 @@ export const combineBuyItemsWithTxRoute = (items: GenieAsset[], txRoute?: Routin
return { return {
...item, ...item,
priceInfo: newPriceInfo,
updatedPriceInfo: undefined,
orderSource: route && 'orderSource' in route.assetOut ? route.assetOut.orderSource : undefined, orderSource: route && 'orderSource' in route.assetOut ? route.assetOut.orderSource : undefined,
} }
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment