packages/widget/src/hooks/useBridgeSelectionData.ts
import { useState, useEffect } from 'react'
import { BridgeSelections } from 'types'
import { CHAINS_ARRAY } from '@/constants/chains'
import { findTokenByRouteSymbol } from '@/utils/findTokenByRouteSymbol'
export const useBridgeSelectionData = (): BridgeSelections => {
const [originChain, setOriginChain] = useState('')
const [originToken, setOriginToken] = useState('')
const [destinationChain, setDestinationChain] = useState('')
const [destinationToken, setDestinationToken] = useState('')
useEffect(() => {
let originChainSelect = null
let destinationChainSelect = null
let originTokenSelect = null
let destinationTokenSelect = null
const getChainValues = () => {
if (
originChainSelect &&
destinationChainSelect &&
originTokenSelect &&
destinationTokenSelect
) {
const originChainName = originChainSelect.textContent?.trim() || ''
const destinationChainName =
destinationChainSelect.textContent?.trim() || ''
const originTokenSymbol = originTokenSelect.textContent?.trim() || ''
const destinationTokenSymbol =
destinationTokenSelect.textContent?.trim() || ''
setOriginChain(originChainName === 'Network' ? null : originChainName)
setOriginToken(originTokenSymbol === 'Token' ? null : originTokenSymbol)
setDestinationChain(
destinationChainName === 'Network' ? null : destinationChainName
)
setDestinationToken(
destinationTokenSymbol === 'Token' ? null : destinationTokenSymbol
)
}
}
const checkElements = () => {
originChainSelect = document.getElementById('origin-chain-select')
destinationChainSelect = document.getElementById(
'destination-chain-select'
)
originTokenSelect = document.getElementById('origin-token-select')
destinationTokenSelect = document.getElementById(
'destination-token-select'
)
if (
originChainSelect &&
destinationChainSelect &&
originTokenSelect &&
destinationTokenSelect
) {
// Get initial values when elements are available
getChainValues()
const observer = new MutationObserver(getChainValues)
const config = { childList: true, characterData: true, subtree: true }
observer.observe(originChainSelect, config)
observer.observe(destinationChainSelect, config)
observer.observe(originTokenSelect, config)
observer.observe(destinationTokenSelect, config)
return () => {
observer.disconnect()
}
} else {
// If elements are not available, check again after a short delay
const timerId = setTimeout(checkElements, 100)
return () => clearTimeout(timerId)
}
}
checkElements()
}, [])
const originChainId = CHAINS_ARRAY.find(
(chain) => chain.name === originChain
)?.id
const destinationChainId = CHAINS_ARRAY.find(
(chain) => chain.name === destinationChain
)?.id
const originTokenAddress =
findTokenByRouteSymbol(originToken)?.addresses[originChainId] ?? null
const destinationTokenAddress =
findTokenByRouteSymbol(destinationToken)?.addresses[destinationChainId] ??
null
return {
originChain: {
id: originChainId,
name: originChain,
},
destinationChain: {
id: destinationChainId,
name: destinationChain,
},
originToken: {
symbol: originToken,
address: originTokenAddress,
},
destinationToken: {
symbol: destinationToken,
address: destinationTokenAddress,
},
}
}