const { apiKey, component, sql } = props; const BASE_URL = "https://api-v2.flipsidecrypto.xyz/json-rpc"; State.init({ data: [], hasError: false, isLoading: false, isRunning: false, queryId: "", }); if (!apiKey) { return <div>Empty apiKey!</div>; } const getQueryResult = (queryId) => { let body = { jsonrpc: "2.0", method: "getQueryRunResults", params: [ { queryRunId: queryId, format: "csv", page: { number: 1, size: 1, }, }, ], id: 1, }; asyncFetch(BASE_URL, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey }, body: JSON.stringify(body), }).then((res) => { // somehow has error if (!res.ok) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } // error returned from flipside if (!res.body.result) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } let { columnNames, rows } = res.body.result; let ret = []; rows.forEach((row, index) => { let dat = {}; row.forEach((value, datIndex) => { dat[columnNames[datIndex]] = value; }); ret.push(dat); }); State.update({ isLoading: false, isRunning: false, data: ret, }); }); }; const getQueryStatus = (queryId) => { let body = { jsonrpc: "2.0", method: "getQueryRun", params: [ { queryRunId: queryId, }, ], id: 1, }; asyncFetch(BASE_URL, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey }, body: JSON.stringify(body), }).then((res) => { // somehow has error if (!res.ok) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } // error returned from flipside if (!res.body.result) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } // get query result again if it's still running if (res.body.result.queryRun.state == "QUERY_STATE_RUNNING") { setTimeout(() => { getQueryStatus(queryId); }, 1000); return; } // get query result again if it's streaming results if (res.body.result.queryRun.state == "QUERY_STATE_STREAMING_RESULTS") { setTimeout(() => { getQueryStatus(queryId); }, 1000); return; } if (res.body.result.queryRun.state != "QUERY_STATE_SUCCESS") { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } console.log("getting query results"); // get and update data getQueryResult(queryId); }); }; const runQuery = (sql) => { if (state.isRunning) { return; } let body = { jsonrpc: "2.0", method: "createQueryRun", params: [ { resultTTLHours: 1, maxAgeMinutes: 0, sql, dataSource: "snowflake-default", dataProvider: "flipside", }, ], id: 1, }; State.update({ isRunning: true, isLoading: true }); asyncFetch(BASE_URL, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey }, body: JSON.stringify(body), }).then((res) => { // somehow has error if (!res.ok) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } // error returned from flipside if (!res.body.result) { State.update({ isLoading: false, isRunning: false, hasError: true, }); return; } State.update({ queryId: res.body.result.queryRun.id, }); getQueryStatus(res.body.result.queryRun.id); }); }; const cancelQuery = async () => {}; let { data, hasError, isLoading, isRunning, queryId } = state; return component({ data, hasError, isLoading, isRunning, runQuery, cancelQuery, });