import React, { useCallback, useContext, useEffect, useState } from 'react'; import { ClientContext } from '../../contexts/clientProvider'; import { InfinityMintScriptArguments } from 'infinitymint/dist/app/interfaces'; import Loading from '../bootstrap/Loading'; import { load } from '../../main'; import { Alert, Button, Card, Col, Container, Row } from 'react-bootstrap'; import { log } from '../../utils/helpers'; export default function Execute({ script, args = [], }: { script: string; args?: InfinityMintScriptArguments[]; }) { const [loading, setLoading] = useState(false); const [connected, setConnected] = useState(false); const client = useContext(ClientContext); const [socket, setSocket] = useState(null); const [running, setRunning] = useState(false); const createWebsocket = useCallback(async () => { if (!client.loaded || !script) return; try { setLoading(true); let newSocket = new WebSocket( client.controller.config?.api?.webSocket || 'ws://localhost:8080' ); newSocket.onmessage = (event) => { console.log(event.data); let consoleHandle = document.getElementById('console'); let data = JSON.parse(event.data); data.forEach((item) => { consoleHandle.innerHTML += item + '
'; }); //scroll to bottom consoleHandle.scrollTop = consoleHandle.scrollHeight; }; newSocket.onopen = () => { setConnected(true); setSocket(newSocket); log('Connected to InfinityMint WebSocket'); }; } catch (error) { console.error(error); setConnected(false); } finally { setLoading(false); } }, [client, script]); const runScript = useCallback(async () => { if (!socket) return; try { let consoleHandle = document.getElementById('console'); consoleHandle.innerHTML = 'Running Script: ' + script + '...
'; let newArgs = {}; args.forEach((arg) => { newArgs[arg.name] = arg; if (arg.type === 'boolean') newArgs[arg.name].value = arg.value === 'true' || arg.value === true; if (arg.type === 'number') newArgs[arg.name].value = parseInt(arg.value); }); setTimeout(() => { consoleHandle.innerHTML = ''; let data = { command: script, args: newArgs, }; socket.send(JSON.stringify(data)); }, 1000); } catch (error) {} }, [socket, script, args]); useEffect(() => { let main = async () => { await createWebsocket(); }; main(); }, [createWebsocket]); useEffect(() => { return () => { if (socket) socket.close(); }; }, [socket]); return ( {!client.loaded || loading ? ( <> ) : ( <> {!connected ? ( Error connecting to InfinityMint

Please check if InfinityMint is running and try again.

) : ( <> Executing Script{' '} {script}
Click{' '} Run {' '} to start the execution...

Arguments [{args?.length || 0}] {args && args.length !== 0 ? args.map((arg) => ( <>
{arg.name} {'=>'}{' '} {arg.value === undefined ? 'undefined' : arg.value.toString()} )) : ' => no arguments'}
{!running ? (
) : null}
)} )}
); }