UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

75 lines (74 loc) 3.24 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { getChainByKey } from '@lifi/sdk'; import { createContext, useContext, useId, useMemo } from 'react'; import { setDefaultSettings } from '../../stores'; import { formatInputAmount } from '../../utils'; const initialContext = { elementId: '', integrator: '', }; const WidgetContext = createContext(initialContext); export const useWidgetConfig = () => useContext(WidgetContext); export const WidgetProvider = ({ children, config: { fromChain, fromToken, toChain, toToken, fromAmount, toAddress, integrator, ...config } = {}, }) => { const elementId = useId(); if (!integrator) { throw Error('Required property "integrator" is missing.'); } const value = useMemo(() => { try { const searchParams = Object.fromEntries(new URLSearchParams(window?.location.search)); // Prevent using fromToken/toToken params if chain is not selected ['from', 'to'].forEach((key) => { if (searchParams[`${key}Token`] && !searchParams[`${key}Chain`]) { delete searchParams[`${key}Token`]; } }); const value = { ...config, fromChain: (searchParams.fromChain && isNaN(parseInt(searchParams.fromChain, 10))) || typeof fromChain === 'string' ? getChainByKey((searchParams.fromChain || fromChain)?.toLowerCase())?.id : (searchParams.fromChain && !isNaN(parseInt(searchParams.fromChain, 10))) || typeof fromChain === 'number' ? parseInt(searchParams.fromChain, 10) || fromChain : undefined, toChain: (searchParams.toChain && isNaN(parseInt(searchParams.toChain, 10))) || typeof toChain === 'string' ? getChainByKey((searchParams.toChain || toChain)?.toLowerCase())?.id : (searchParams.toChain && !isNaN(parseInt(searchParams.toChain, 10))) || typeof toChain === 'number' ? parseInt(searchParams.toChain, 10) || toChain : undefined, fromToken: searchParams.fromToken || fromToken, toToken: searchParams.toToken || toToken, fromAmount: typeof searchParams.fromAmount === 'string' && !isNaN(parseFloat(searchParams.fromAmount)) ? formatInputAmount(searchParams.fromAmount) : fromAmount, toAddress: searchParams.toAddress || toAddress, elementId, integrator, }; setDefaultSettings(value); return value; } catch (e) { console.warn(e); return { ...config, elementId, integrator }; } }, [ config, elementId, fromAmount, fromChain, fromToken, integrator, toAddress, toChain, toToken, ]); return (_jsx(WidgetContext.Provider, { value: value, children: children })); };