/* eslint-disable max-len */ /* eslint-disable complexity */ import { useEffect, useState } from 'react'; import MetaApi, { EquityBalanceListener, RiskManagement } from 'metaapi.cloud-sdk'; import { PrintLog, // for log Sections, Section, // Layout Form, Field // Form } from '../../shared'; interface IRiskManagementEqulityBalanceProps { accountId?: string token?: string domain?: string } export function RiskManagementEqulityBalance({ accountId: defaultAccountId, token: defaultToken, domain: defaultDomain }: IRiskManagementEqulityBalanceProps) { /* UI control */ const [areResourcesNarrowedDown, setAreResourcesNarrowedDown] = useState(true); const [isConnecting, setIsConnecting] = useState(false); const [isConnected, setIsConnected] = useState(false); /* Logging */ const [resultLog, setResultLog] = useState([]); const [errorLog, setErrorLog] = useState([]); const logErr = (...args: unknown[]) => setErrorLog(logs => { console.log(...args); return [...logs, ...args.map((arg: any) => arg.message || arg)]; }); const log = (...args: unknown[]) => setResultLog(logs => { console.log(...args); return [...logs, ...args]; }); /*! STORE MAIN VARIABLE */ const [accountId, setAccountId] = useState(defaultAccountId || ''); const [token, setToken] = useState(defaultToken || ''); const [domain, setDomain] = useState(defaultDomain || 'agiliumtrade.agiliumtrade.ai'); class ExampleEquityBalanceListener extends EquityBalanceListener { async onEquityOrBalanceUpdated(equityBalanceData: unknown) { log('equity balance update received', equityBalanceData); } async onConnected() { log('on connected event received'); } async onDisconnected() { log('on disconnected event received'); } async onError(error: unknown) { logErr(error); } } const fetchData = async () => { const metaApi = new MetaApi(token, { domain }); const areTokenResourcesNarrowedDown = metaApi.tokenManagementApi.areTokenResourcesNarrowedDown(token); setAreResourcesNarrowedDown(areTokenResourcesNarrowedDown); const riskManagement = new RiskManagement(token, { domain }); const riskManagementApi = riskManagement.riskManagementApi; try { const equityBalanceListener = new ExampleEquityBalanceListener(accountId); const listenerId = await riskManagementApi.addEquityBalanceListener(equityBalanceListener, accountId); log('Streaming equity balance for 1 minute...'); await new Promise(res => setTimeout(res, 1000 * 60)); riskManagementApi.removeEquityBalanceListener(listenerId); log('Listener removed'); } catch (err) { logErr(err); throw err; } }; /* Control */ const reset = () => { setIsConnecting(false); setIsConnected(false); setResultLog([]); setErrorLog([]); setAccountId(defaultAccountId || ''); setToken(defaultToken ||''); setDomain(defaultDomain || ''); }; const triggerToFetchData = () => { if (isConnected || !accountId || !token) {return;} setIsConnecting(true); }; /* Use one for control request and rerender */ useEffect(() => { if (isConnected || !isConnecting) { return; } fetchData() .then(() => setIsConnected(true)) // If success .catch(err => console.log('failed', err)) // If failed .finally(() => setIsConnecting(false)); // Enable an interaction with UI }, [isConnecting]); // if change isConnecting run useEffect return (

Risk management. Equity balance example

Connect to your account

setAccountId(value)} label="Account ID"/> setToken(value)} label="Token"/> setDomain(value)} label="Domain"/>
{!areResourcesNarrowedDown &&

Warning

It seems like you are using a admin API token.

Since the token can be retrieven from the browser or mobile apps by end user this can lead to your application being compromised, unless you understand what are you doing.

Please use Token Management API in your backend application to produce secure tokens which you can then use in web UI or mobile apps.

} {resultLog && resultLog.length > 0 &&

Logs

} {errorLog && errorLog.length > 0 &&

Errors

}
); }