complete store refactor; moved form inputs into store; refactored components out of TimedOrderEntry
This commit is contained in:
@@ -3,90 +3,123 @@ import { defineStore } from 'pinia'
|
||||
import {knownTokens} from "@/knownTokens.js";
|
||||
import {computed, ref} from "vue";
|
||||
|
||||
let rawProvider = null
|
||||
let rawProviderChainId = null
|
||||
|
||||
export function setProvider( provider, chainId ) {
|
||||
rawProvider = provider
|
||||
rawProviderChainId = chainId
|
||||
}
|
||||
export const useStore = defineStore('app', ()=> {
|
||||
const _chainId = ref(null)
|
||||
const _chainInfo = ref({})
|
||||
const tokenA = ref(null)
|
||||
const tokenB = ref(null)
|
||||
|
||||
export const useStore = defineStore('app', {
|
||||
state: () => ({
|
||||
chainId: null,
|
||||
chainInfo: {},
|
||||
vaultInitCodeHash: null,
|
||||
account: null,
|
||||
vaults: [],
|
||||
transactionSenders: [], // a list of function(signer) that send transactions
|
||||
errors: [
|
||||
// todo re-enable danger warning
|
||||
// {title: 'DANGER!', text: 'This is early development (alpha) software. There could be severe bugs that lose all your money. Thank you for testing a SMALL amount!', closeable: true}
|
||||
],
|
||||
extraTokens: {},
|
||||
poolPrices: {},
|
||||
vaultBalances: {}, // indexed by vault addr then by token addr. value is an int
|
||||
orders: {}, // indexed by vault, value is another dictionary with orderIndex as key and order status values
|
||||
function getTokenList() {
|
||||
const chains = _chainId.value in _chainInfo.value && _chainInfo.value[_chainId.value].tokens !== undefined ?
|
||||
_chainInfo.value[_chainId.value].tokens : []
|
||||
let known = knownTokens[_chainId.value]
|
||||
known = known ? Object.values(known) : []
|
||||
let extras = extraTokens[_chainId.value]
|
||||
extras = extras ? Object.values(extras) : []
|
||||
return [...chains, ...known, ...extras]; // put chains first so the Mockcoin pool is automatically selected
|
||||
}
|
||||
function getTokens() {
|
||||
const result = {}
|
||||
const all = getTokenList();
|
||||
for (const token of all)
|
||||
result[token.address] = token
|
||||
return result
|
||||
}
|
||||
function setDefaultTokens() {
|
||||
const tokens = getTokenList()
|
||||
if( tokens.length > 0 )
|
||||
tokenA.value = tokens[0]
|
||||
if( tokens.length > 1 )
|
||||
tokenB.value = tokens[1]
|
||||
}
|
||||
const chainId = computed({
|
||||
get() {return _chainId},
|
||||
set(v) {_chainId.value=v; setDefaultTokens()}
|
||||
})
|
||||
const chainInfo = computed({
|
||||
get() {return _chainInfo},
|
||||
set(v) {_chainInfo.value=v; setDefaultTokens()}
|
||||
})
|
||||
const chain = computed(() => !_chainId.value ? null : (_chainInfo.value[_chainId.value] || null))
|
||||
// making the provider directly reactive causes exceptions (calling private method...) when calling provider
|
||||
// functions, so we use a separate ref to signal changes
|
||||
let _provider = null
|
||||
const _providerTouch = ref(false)
|
||||
const provider = computed({
|
||||
get() {_providerTouch.value; return _provider},
|
||||
set(v) {_provider=v; _providerTouch.value = !_providerTouch.value}
|
||||
})
|
||||
const vaultInitCodeHash = ref(null)
|
||||
const account = ref(null)
|
||||
const vaults = ref([])
|
||||
const transactionSenders = ref([]) // a list of function(signer) that send transactions
|
||||
const errors = ref([])
|
||||
const extraTokens = ref({})
|
||||
const poolPrices = ref({})
|
||||
const vaultBalances = ref({}) // indexed by vault addr then by token addr. value is an int
|
||||
const orders = ref({}) // indexed by vault value is another dictionary with orderIndex as key and order status values
|
||||
|
||||
// Order Input Forms
|
||||
tokenA: null,
|
||||
tokenB: null,
|
||||
routes: [],
|
||||
routesPending: false,
|
||||
inverted: false,
|
||||
}),
|
||||
getters: {
|
||||
vault: (s)=>s.vaults.length===0 ? null : s.vaults[0],
|
||||
provider: (s)=>s.chainId===rawProviderChainId ? rawProvider : null,
|
||||
chain: (s)=> !s.chainInfo ? null : (s.chainInfo[s.chainId] || null),
|
||||
tokens: (s)=>{
|
||||
const chains = s.chainId in s.chainInfo && s.chainInfo[s.chainId].tokens !== undefined ? s.chainInfo[s.chainId].tokens : []
|
||||
let known = knownTokens[s.chainId]
|
||||
known = known ? Object.values(known) : []
|
||||
let extras = s.extraTokens[s.chainId]
|
||||
extras = extras ? Object.values(extras) : []
|
||||
const result = {}
|
||||
const all = [...chains, ...known, ...extras]; // put chains first so the Mockcoin pool is automatically selected
|
||||
for( const token of all)
|
||||
result[token.address] = token
|
||||
return result
|
||||
},
|
||||
factory: (s)=>!s.chain?null:s.chain.factory,
|
||||
helper: (s)=>!s.chain?null:s.chain.helper,
|
||||
mockenv: (s)=>!s.chain?null:s.chain.mockenv,
|
||||
mockCoins: (s)=>!s.chain?[]:!s.chain.mockCoins?[]:s.chain.mockCoins,
|
||||
route: (s)=>s.routes.length===0 ? null : s.routes[0],
|
||||
pairSymbol: (s)=>s.base?.symbol+'\\'+s.quote?.symbol,
|
||||
base: (s)=>{
|
||||
const token = s.inverted ? s.tokenB : s.tokenA
|
||||
return !token?{}:token
|
||||
},
|
||||
quote: (s)=> {
|
||||
const token = s.inverted ? s.tokenA : s.tokenB
|
||||
return !token ? {} : token
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
removeTransactionSender(sender) {
|
||||
this.transactionSenders = this.transactionSenders.filter((v) => v !== sender)
|
||||
},
|
||||
error(title, text, closeable=true) {
|
||||
this.errors.push({title, text, closeable})
|
||||
},
|
||||
closeError(title, text) {
|
||||
const result = []
|
||||
this.errors.forEach((i)=>{if(i.title!==title && i.text!==text) result.push(i)})
|
||||
this.errors = result
|
||||
},
|
||||
addToken(chainId, info) {
|
||||
this.$patch((s) => {
|
||||
let extras = s.extraTokens[chainId]
|
||||
if (extras === undefined) {
|
||||
extras = {}
|
||||
s.extraTokens[chainId] = extras
|
||||
}
|
||||
extras[info.address] = info
|
||||
})
|
||||
},
|
||||
},
|
||||
// Order Input Forms
|
||||
// const tokenA = ref(null) // defined at top
|
||||
// const tokenB = ref(null)
|
||||
const buy = ref(false)
|
||||
const inverted = ref(false)
|
||||
const amount = ref(100) // todo
|
||||
const amountIsTokenA = ref(false) // todo
|
||||
const amountIsTotal = ref(true)
|
||||
const limitPrice = ref(null)
|
||||
const routes = ref([])
|
||||
const routesPending = ref(false)
|
||||
|
||||
const validOrder = computed(() => amount.value > 0 && routes.value.length > 0)
|
||||
const vault = computed(() => vaults.value.length === 0 ? null : vaults.value[0])
|
||||
const tokens = computed(getTokens)
|
||||
const factory = computed(() => !chain.value ? null : chain.value.factory)
|
||||
const helper = computed(() => !chain.value ? null : chain.value.helper)
|
||||
const mockenv = computed(() => !chain.value ? null : chain.value.mockenv)
|
||||
const mockCoins = computed(() => !chain.value ? [] : !chain.value.mockCoins ? [] : chain.value.mockCoins)
|
||||
const route = computed(() => routes.value.length === 0 ? null : routes.value[0])
|
||||
const base = computed(() => {
|
||||
const token = inverted.value ? tokenB.value : tokenA.value
|
||||
return !token ? {} : token
|
||||
})
|
||||
const quote = computed(() => {
|
||||
const token = inverted.value ? tokenA.value : tokenB.value
|
||||
return !token ? {} : token
|
||||
})
|
||||
const pairSymbol = computed(() => base.value?.symbol + '\\' + quote.value?.symbol)
|
||||
const limitIsMinimum = computed(() => !(buy.value ^ inverted.value))
|
||||
const amountToken = computed(() => amountIsTokenA.value ? tokenA.value : tokenB.value)
|
||||
const amountIsInput = computed(() => amountIsTokenA.value !== buy.value)
|
||||
|
||||
function removeTransactionSender(sender) {
|
||||
this.transactionSenders = this.transactionSenders.filter((v) => v !== sender)
|
||||
}
|
||||
function error(title, text, closeable=true) {
|
||||
this.errors.push({title, text, closeable})
|
||||
}
|
||||
function closeError(title, text) {
|
||||
const result = []
|
||||
this.errors.forEach((i)=>{if(i.title!==title && i.text!==text) result.push(i)})
|
||||
this.errors = result
|
||||
}
|
||||
function addToken(chainId, info) {
|
||||
this.$patch(() => {
|
||||
let extras = extraTokens[chainId]
|
||||
if (extras === undefined) {
|
||||
extras = {}
|
||||
extraTokens[chainId] = extras
|
||||
}
|
||||
extras[info.address] = info
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
chainId, chainInfo, chain, provider, vaultInitCodeHash, account, vaults, transactionSenders, errors, extraTokens,
|
||||
poolPrices, vaultBalances, orders, tokenA, tokenB, routes, routesPending, inverted, amount, amountIsTokenA,
|
||||
amountIsTotal, limitPrice, validOrder, vault, tokens, factory, helper, mockenv, mockCoins, route,
|
||||
pairSymbol, base, quote, limitIsMinimum, amountToken, amountIsInput, removeTransactionSender, error, closeError,
|
||||
addToken,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user