1
0
mirror of https://github.com/oceanprotocol/react.git synced 2024-11-22 17:50:15 +01:00

refactor for event subscription

This commit is contained in:
Matthias Kretschmann 2020-10-21 13:37:01 +02:00
parent 1caa9e1b69
commit a9e8c10c58
Signed by: m
GPG Key ID: 606EEEF3C479A91F
2 changed files with 97 additions and 70 deletions

View File

@ -5,6 +5,12 @@ import { PriceOptions } from './PriceOptions'
import { TransactionReceipt } from 'web3-core' import { TransactionReceipt } from 'web3-core'
import { getBestDataTokenPrice, getFirstPool } from 'utils/dtUtils' import { getBestDataTokenPrice, getFirstPool } from 'utils/dtUtils'
import { Decimal } from 'decimal.js' import { Decimal } from 'decimal.js'
import {
getCreatePricingPoolFeedback,
getCreatePricingExchangeFeedback,
getBuyDTFeedback,
getSellDTFeedback
} from './utils'
interface UsePricing { interface UsePricing {
dtSymbol?: string dtSymbol?: string
@ -21,32 +27,6 @@ interface UsePricing {
pricingIsLoading: boolean pricingIsLoading: boolean
} }
function getCreatePricingFeedback(dtSymbol: string): { [key: number]: string } {
return {
1: `Minting ${dtSymbol} ...`,
2: `Approving ${dtSymbol} ...`,
3: 'Approving OCEAN ...',
4: 'Creating ...',
5: 'Pricing created.'
}
}
function getBuyDTFeedback(dtSymbol: string): { [key: number]: string } {
return {
1: '1/3 Approving OCEAN ...',
2: `2/3 Buying ${dtSymbol} ...`,
3: `3/3 ${dtSymbol} bought.`
}
}
function getSellDTFeedback(dtSymbol: string): { [key: number]: string } {
return {
1: '1/3 Approving OCEAN ...',
2: `2/3 Selling ${dtSymbol} ...`,
3: `3/3 ${dtSymbol} sold.`
}
}
function usePricing(ddo: DDO): UsePricing { function usePricing(ddo: DDO): UsePricing {
const { ocean, account, accountId, config } = useOcean() const { ocean, account, accountId, config } = useOcean()
const [pricingIsLoading, setPricingIsLoading] = useState(false) const [pricingIsLoading, setPricingIsLoading] = useState(false)
@ -76,24 +56,28 @@ function usePricing(ddo: DDO): UsePricing {
init() init()
}, [ocean, dataToken, dataTokenInfo]) }, [ocean, dataToken, dataTokenInfo])
function setStepCreatePricing(index: number) { // Helper for setting steps & feedback for all flows
function setStep(index: number, type: 'pool' | 'exchange' | 'buy' | 'sell') {
setPricingStep(index) setPricingStep(index)
if (!dtSymbol) return if (!dtSymbol) return
const messages = getCreatePricingFeedback(dtSymbol)
setPricingStepText(messages[index]) let messages
switch (type) {
case 'pool':
messages = getCreatePricingPoolFeedback(dtSymbol)
break
case 'exchange':
messages = getCreatePricingExchangeFeedback(dtSymbol)
break
case 'buy':
messages = getBuyDTFeedback(dtSymbol)
break
case 'sell':
messages = getSellDTFeedback(dtSymbol)
break
} }
function setStepBuyDT(index: number) {
setPricingStep(index)
if (!dtSymbol) return
const messages = getBuyDTFeedback(dtSymbol)
setPricingStepText(messages[index])
}
function setStepSellDT(index: number) {
setPricingStep(index)
if (!dtSymbol) return
const messages = getSellDTFeedback(dtSymbol)
setPricingStepText(messages[index]) setPricingStepText(messages[index])
} }
@ -111,14 +95,14 @@ function usePricing(ddo: DDO): UsePricing {
try { try {
setPricingIsLoading(true) setPricingIsLoading(true)
setPricingError(undefined) setPricingError(undefined)
setStepBuyDT(1) setStep(1, 'buy')
const bestPrice = await getBestDataTokenPrice(ocean, dataToken) const bestPrice = await getBestDataTokenPrice(ocean, dataToken)
switch (bestPrice?.type) { switch (bestPrice?.type) {
case 'pool': { case 'pool': {
const price = new Decimal(bestPrice.value).times(1.05).toString() const price = new Decimal(bestPrice.value).times(1.05).toString()
const maxPrice = new Decimal(bestPrice.value).times(2).toString() const maxPrice = new Decimal(bestPrice.value).times(2).toString()
setStepBuyDT(2) setStep(2, 'buy')
Logger.log( Logger.log(
'Buying token from pool', 'Buying token from pool',
bestPrice, bestPrice,
@ -132,7 +116,7 @@ function usePricing(ddo: DDO): UsePricing {
price, price,
maxPrice maxPrice
) )
setStepBuyDT(3) setStep(3, 'buy')
Logger.log('DT buy response', buyResponse) Logger.log('DT buy response', buyResponse)
return buyResponse return buyResponse
} }
@ -152,13 +136,13 @@ function usePricing(ddo: DDO): UsePricing {
bestPrice.value.toString(), bestPrice.value.toString(),
account.getId() account.getId()
) )
setStepBuyDT(2) setStep(2, 'buy')
const exchange = await ocean.fixedRateExchange.buyDT( const exchange = await ocean.fixedRateExchange.buyDT(
bestPrice.address, bestPrice.address,
String(dtAmount), String(dtAmount),
account.getId() account.getId()
) )
setStepBuyDT(3) setStep(3, 'buy')
Logger.log('DT exchange buy response', exchange) Logger.log('DT exchange buy response', exchange)
return exchange return exchange
} }
@ -167,7 +151,7 @@ function usePricing(ddo: DDO): UsePricing {
setPricingError(error.message) setPricingError(error.message)
Logger.error(error) Logger.error(error)
} finally { } finally {
setStepBuyDT(0) setStep(0, 'buy')
setPricingStepText(undefined) setPricingStepText(undefined)
setPricingIsLoading(false) setPricingIsLoading(false)
} }
@ -186,11 +170,11 @@ function usePricing(ddo: DDO): UsePricing {
try { try {
setPricingIsLoading(true) setPricingIsLoading(true)
setPricingError(undefined) setPricingError(undefined)
setStepSellDT(1) setStep(1, 'sell')
const pool = await getFirstPool(ocean, dataToken) const pool = await getFirstPool(ocean, dataToken)
if (!pool || pool.price === 0) return if (!pool || pool.price === 0) return
const price = new Decimal(pool.price).times(0.95).toString() const price = new Decimal(pool.price).times(0.95).toString()
setStepSellDT(2) setStep(2, 'sell')
Logger.log('Selling token to pool', pool, account.getId(), price) Logger.log('Selling token to pool', pool, account.getId(), price)
const sellResponse = await ocean.pool.sellDT( const sellResponse = await ocean.pool.sellDT(
account.getId(), account.getId(),
@ -198,14 +182,14 @@ function usePricing(ddo: DDO): UsePricing {
String(dtAmount), String(dtAmount),
price price
) )
setStepSellDT(3) setStep(3, 'sell')
Logger.log('DT sell response', sellResponse) Logger.log('DT sell response', sellResponse)
return sellResponse return sellResponse
} catch (error) { } catch (error) {
setPricingError(error.message) setPricingError(error.message)
Logger.error(error) Logger.error(error)
} finally { } finally {
setStepSellDT(0) setStep(0, 'sell')
setPricingStepText(undefined) setPricingStepText(undefined)
setPricingIsLoading(false) setPricingIsLoading(false)
} }
@ -226,38 +210,39 @@ function usePricing(ddo: DDO): UsePricing {
setPricingIsLoading(true) setPricingIsLoading(true)
setPricingError(undefined) setPricingError(undefined)
setStepCreatePricing(1)
let tx
try { try {
setStep(9, 'pool')
await mint(`${dtAmount}`) await mint(`${dtAmount}`)
setStepCreatePricing(3) if (isPool) {
const response = isPool setStep(1, 'pool')
? // TODO: in ocean.js: ocean.pool.createDTPool should be ocean.pool.create tx = await ocean.pool
// And if it involves mutliple wallet interacts the method itself should emit step events. .create(
await ocean.pool.createDTPool(
accountId, accountId,
dataToken, dataToken,
`${dtAmount}`, `${dtAmount}`,
weightOnDataToken, weightOnDataToken,
swapFee swapFee
) )
: // TODO: in ocean.js: ocean.fixedRateExchange.create should return tx receipt .next((step: number) => setStep(step, 'pool'))
await ocean.fixedRateExchange.create(dataToken, `${price}`, accountId) } else {
setStep(1, 'exchange')
tx = await ocean.fixedRateExchange
.create(dataToken, `${price}`, accountId)
.next((step: number) => setStep(step, 'exchange'))
// TODO: why is approve after the creation? setStep(1, 'exchange')
if (!isPool && config.fixedRateExchangeAddress) { config.fixedRateExchangeAddress &&
setStepCreatePricing(1) (await ocean.datatokens.approve(
await ocean.datatokens.approve(
dataToken, dataToken,
config.fixedRateExchangeAddress, config.fixedRateExchangeAddress,
`${dtAmount}`, `${dtAmount}`,
accountId accountId
) ))
} }
setStepCreatePricing(4)
return response
} catch (error) { } catch (error) {
setPricingError(error.message) setPricingError(error.message)
Logger.error(error) Logger.error(error)
@ -266,6 +251,8 @@ function usePricing(ddo: DDO): UsePricing {
setPricingStepText(undefined) setPricingStepText(undefined)
setPricingIsLoading(false) setPricingIsLoading(false)
} }
return tx
} }
return { return {

View File

@ -0,0 +1,40 @@
export function getCreatePricingPoolFeedback(
dtSymbol: string
): { [key: number]: string } {
return {
99: `Minting ${dtSymbol} ...`,
1: 'Creating pool ...',
2: `Approving ${dtSymbol} ...`,
3: 'Approving OCEAN ...',
4: 'Creating ...',
5: 'Pool created.'
}
}
export function getCreatePricingExchangeFeedback(
dtSymbol: string
): { [key: number]: string } {
return {
99: `Minting ${dtSymbol} ...`,
1: `Approving ${dtSymbol} ...`,
2: 'Approving OCEAN ...',
3: 'Creating ...',
4: 'Fixed exchange created.'
}
}
export function getBuyDTFeedback(dtSymbol: string): { [key: number]: string } {
return {
1: '1/3 Approving OCEAN ...',
2: `2/3 Buying ${dtSymbol} ...`,
3: `3/3 ${dtSymbol} bought.`
}
}
export function getSellDTFeedback(dtSymbol: string): { [key: number]: string } {
return {
1: '1/3 Approving OCEAN ...',
2: `2/3 Selling ${dtSymbol} ...`,
3: `3/3 ${dtSymbol} sold.`
}
}