/* eslint-disable max-len */ /* eslint-disable complexity */ import { useEffect, useState } from 'react'; import MetaApi, { CopyFactory } from 'metaapi.cloud-sdk'; import { PrintLog, // for log Sections, Section, // Layout Form, Field // Form } from '../../shared'; interface ICopyFactoryTelegramProps { providerAccountId?: string botToken?: string chatId?: string domain?: string token?: string } export function CopyfactoryTelegram({ providerAccountId: defaultProviderAccountId, botToken: defaultBotToken, chatId: defaultChatId, domain: defaultDomain, token: defaultToken }: ICopyFactoryTelegramProps) { /* 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]; }); const [botToken, setBotToken] = useState(defaultBotToken || ''); const [chatId, setChatId] = useState(defaultChatId || ''); const [domain, setDomain] = useState(defaultDomain || ''); const [token, setToken] = useState(defaultToken || ''); /* Your provider MetaApi account id provider account must have PROVIDER value in copyFactoryRoles */ const [providerAccountId, setProviderAccountId] = useState(defaultProviderAccountId || ''); /* Control */ const reset = () => { setIsConnecting(false); setIsConnected(false); setResultLog([]); setErrorLog([]); setProviderAccountId(defaultProviderAccountId || ''); setBotToken(defaultBotToken || ''); setChatId(defaultChatId || ''); setDomain(defaultDomain || ''); setToken(defaultToken ||''); }; const triggerToMakeRequest = () => { if (isConnected || !token) { return; } setIsConnecting(true); }; useEffect(() => { const makeRequest = async () => { const copyFactory = new CopyFactory(token, { domain }); const metaApi = new MetaApi(token, { domain }); const areTokenResourcesNarrowedDown = metaApi.tokenManagementApi.areTokenResourcesNarrowedDown(token); setAreResourcesNarrowedDown(areTokenResourcesNarrowedDown); const configurationApi = copyFactory.configurationApi; const tradingApi = copyFactory.tradingApi; try { log('Get provider account'); const providerMetaapiAccount = await metaApi.metatraderAccountApi.getAccount(providerAccountId); if( !providerMetaapiAccount.copyFactoryRoles || !providerMetaapiAccount.copyFactoryRoles.includes('PROVIDER') ) { throw new Error( 'Please specify PROVIDER copyFactoryRoles value in your MetaApi account in ' + 'order to use it in CopyFactory API' ); } log('Provider account received'); const strategies = await configurationApi.getStrategiesWithInfiniteScrollPagination(); const strategy = strategies.find((s) => s.accountId === providerMetaapiAccount.id); const strategyId = !strategy ? (await configurationApi.generateStrategyId()).id : strategy._id; /* Create a strategy being copied */ log('Creating strategy'); await configurationApi.updateStrategy(strategyId, { name: 'Test strategy', description: 'Some useful description about your strategy', accountId: providerMetaapiAccount.id, telegram: { publishing: { token: botToken, chatId: chatId, template: '${description}' } } }); log('Strategy created'); /* Send external signal */ log('Sending external signal'); const strategySignalClient = await tradingApi.getStrategySignalClient(strategyId); const signalId = strategySignalClient.generateSignalId(); await strategySignalClient.updateExternalSignal(signalId, { symbol: 'EURUSD', type: 'POSITION_TYPE_BUY', time: new Date(), volume: 0.01 }); log('External signal sent'); log('Wait 5 seconds'); await new Promise(res => setTimeout(res, 5000)); log('5 seconds passed'); /* Remove external signal */ log('Removing external signal'); await strategySignalClient.removeExternalSignal(signalId, { time: new Date() }); log('External signal removed'); } catch (err){ logErr(err); throw err; } }; const connect = async () => { try { await makeRequest(); log('Wait 5 seconds'); await new Promise(res => setTimeout(res, 5000)); log('5 seconds passed'); } catch (err) { console.log('failed', err); } finally { setIsConnecting(false); } }; if (isConnecting && !isConnected) { connect() .then(() => setIsConnected(true)) .catch(() => setIsConnected(false)) .finally(() => setIsConnecting(false)); } }, [isConnecting, isConnected]); return (

CopyFactory. Telegram

Connect to your account

{!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

}
); }