paw-gui/src/App.tsx
2025-04-21 19:32:32 +08:00

223 lines
6.9 KiB
TypeScript

import dayjs from "dayjs";
import { useStartupCheck } from "@/hooks/useStartupCheck";
import { usePreventDefault } from "@/hooks/usePreventDefaultEventListener";
import { useGlobalShortcut } from "@/hooks/useGlobalShortcut";
import { useRecreateTheCircuit } from "@/hooks/useRecreateTheCircuit";
import { useCoreConfig } from "@/hooks/useCoreConfig";
import { useDispatch, useSelector } from "react-redux";
import {
setMaliciousNodeList,
setNodeDownList,
setWeb3List,
setWeb3List2,
} from "@/store/web3Slice";
import type { AppDispatch } from "@/store";
import eventBus, { eventTypes } from "@/utils/eventBus";
import { WebSocketClient } from "@/utils/webSocketClient";
import { blockChainApi } from "@/api/block";
import { getRandomCountryKey } from "@/data";
import Titlebar from "@/components/Titlebar";
import Layout from "@/layout";
import Tray from "@/components/Tray";
import { api } from "./utils/api";
function App() {
// 执行启动自检
useStartupCheck();
// 阻止默认事件
usePreventDefault();
// 注册全局快捷方式
useGlobalShortcut();
// 当核心启动时重新创建电路
useRecreateTheCircuit();
// 读取配置,若文件不存在则持久化到本地 `%APPDATA%/com.paw.paw-gui`
const { loadCoreConfig } = useCoreConfig();
loadCoreConfig();
const dispatch = useDispatch<AppDispatch>();
// const { } = useSelector(
// (state: RootState) => state.web3Reducer
// );
let eventsWs: WebSocketClient | null = null;
const openWsTraffic = async () => {
if (eventsWs) return;
eventsWs = new WebSocketClient("ws://10.66.66.234:8080/events", {});
console.log(eventsWs, "openWsTraffic Start");
// 执行 WebSocket 操作
await eventsWs?.connect();
eventsWs?.addListener((msg: any) => {
try {
const msgData = msg ? JSON.parse(msg.data) : {};
if (msgData.code === 0) {
// console.log(msgData, "msgDatamsgData");
switch (msgData.event) {
case eventTypes.NODE_UP:
console.log("节点上线");
break;
case eventTypes.NODE_DOWN:
// 添加下线节点到store 里面
if (msgData.data.name) {
// 获取一个随机的国家code
const countryCode = getRandomCountryKey();
dispatch(
setNodeDownList({
name: msgData.data.name,
code: countryCode,
})
);
}
console.log("节点下线");
break;
case eventTypes.MALICIOUS_NODE:
// 添加恶意节点到store 里面
if (msgData.data.name) {
// 获取一个随机的国家code
const countryCode = getRandomCountryKey();
dispatch(
setMaliciousNodeList({
name: msgData.data.name,
code: countryCode,
})
);
}
console.log("检测到恶意节点");
break;
case eventTypes.NODE_INIT_COMPLATE:
console.log("节点预配置完成");
break;
case eventTypes.NODE_REMOVE:
console.log("节点清除");
break;
case eventTypes.NODE_ADD:
console.log("添加节点");
break;
case eventTypes.NODE_INIT:
console.log("节点预配置");
break;
default:
break;
}
}
} catch (error) {
console.log(error, "error");
}
});
console.log(eventsWs, "openWsTraffic End");
};
const createdSoketEventBus = async () => {
eventBus.on(eventTypes.NODE_INIT_COMPLATE, (data: any) => {
console.log("节点预配置完成", data);
eventsWs?.sendMessage(data);
});
eventBus.on(eventTypes.NODE_REMOVE, (data: any) => {
console.log("节点清除");
const timestamp = dayjs().unix();
const params = {
code: 0,
event: eventTypes.NODE_REMOVE,
data: {
name: data,
},
timestamp,
};
console.log(JSON.stringify(params), "节点清除 params");
eventsWs?.sendMessage(JSON.stringify(params));
});
};
const closeWsTraffic = async () => {
if (eventsWs) {
await eventsWs.disconnect();
eventsWs = null;
}
};
const removeSoketEventBus = () => {
eventBus.off(eventTypes.NODE_INIT_COMPLATE);
eventBus.off(eventTypes.NODE_REMOVE);
};
const timer = useRef<NodeJS.Timeout | null>(null);
const initWebsocketsAndEventBus = async () => {
await openWsTraffic();
await createdSoketEventBus();
timer.current = setInterval(() => {
blockChainApi.getLatestBlock().then((res) => {
blockChainApi
.getTxsByBlock(res.data.block.last_commit.height)
.then((res) => {
const height = res.data.block.last_commit.height;
const timer = res.data.block.header.time;
const txs = res.data.txs;
const balance = res.data.txs.reduce((acc: any, item: any) => {
const blance =
item.auth_info.fee.gas_limit *
Number(blockChainApi.blockConfig.minimum_gas_price);
return acc + blance;
}, 0)
const item = {
height: height,
txs: txs,
timerstamp: dayjs(timer).format("HH:mm:ss"),
balance,
// 保留三位小数
balanceToFixed: Number(balance).toFixed(3),
};
// const timerstamp = dayjs().unix();
dispatch(setWeb3List(item));
console.log(item, "getTxsByBlock");
});
});
}, 5000);
};
useEffect(() => {
dispatch(setWeb3List2([
{
id: "6",
name: "Cardano Wallet",
payType: "ADA",
status: "active",
createdAt: 1737436420,
upDatedAt: 5,
balance: "65",
address:
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f",
privateKey:
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
publicKey:
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f",
numberTransactions: "35",
transactions: 1,
txs: [],
height: 0,
timerstamp: dayjs().format("HH:mm:ss"),
balanceToFixed: 0,
},
]))
setTimeout(() => {
initWebsocketsAndEventBus();
}, 1000);
return () => {
if (timer.current) {
clearInterval(timer.current);
}
closeWsTraffic();
removeSoketEventBus();
};
}, []);
return (
<main>
<Titlebar />
<Layout />
<Tray />
</main>
);
}
export default App;