* feat: add tauri-plugin-mihomo
* refactor: invock mihomo api by use tauri-plugin-mihomo
* chore: todo
* chore: update
* chore: update
* chore: update
* chore: update
* fix: incorrect delay status and update pretty config
* chore: update
* chore: remove cache
* chore: update
* chore: update
* fix: app freezed when change group proxy
* chore: update
* chore: update
* chore: add rustfmt.toml to tauri-plugin-mihomo
* chore: happy clippy
* refactor: connect mihomo websocket
* chore: update
* chore: update
* fix: parse bigint to number
* chore: update
* Revert "fix: parse bigint to number"
This reverts commit 74c006522e.
* chore: use number instead of bigint
* chore: cleanup
* fix: rule data not refresh when switch profile
* chore: update
* chore: cleanup
* chore: update
* fix: traffic graph data display
* feat: add ipc connection pool
* chore: update
* chore: clippy
* fix: incorrect delay status
* fix: typo
* fix: empty proxies tray menu
* chore: clippy
* chore: import tauri-plugin-mihomo by using git repo
* chore: cleanup
* fix: mihomo api
* fix: incorrect delay status
* chore: update tauri-plugin-mihomo dep
chore: update
85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import { useLocalStorage } from "foxact/use-local-storage";
|
|
import { useEffect, useRef } from "react";
|
|
import { mutate } from "swr";
|
|
import useSWRSubscription from "swr/subscription";
|
|
import { MihomoWebSocket } from "tauri-plugin-mihomo-api";
|
|
|
|
import { TrafficRef } from "@/components/layout/traffic-graph";
|
|
|
|
export const useTrafficData = () => {
|
|
const [date, setDate] = useLocalStorage("mihomo_traffic_date", Date.now());
|
|
const subscriptKey = `getClashTraffic-${date}`;
|
|
|
|
const trafficRef = useRef<TrafficRef>(null);
|
|
const ws = useRef<MihomoWebSocket | null>(null);
|
|
const wsFirstConnection = useRef<boolean>(true);
|
|
const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null);
|
|
|
|
const response = useSWRSubscription<ITrafficItem, any, string | null>(
|
|
subscriptKey,
|
|
(_key, { next }) => {
|
|
const reconnect = async () => {
|
|
await ws.current?.close();
|
|
ws.current = null;
|
|
timeoutRef.current = setTimeout(async () => await connect(), 500);
|
|
};
|
|
|
|
const connect = async () => {
|
|
MihomoWebSocket.connect_traffic()
|
|
.then(async (ws_) => {
|
|
ws.current = ws_;
|
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
|
|
ws_.addListener(async (msg) => {
|
|
if (msg.type === "Text") {
|
|
if (msg.data.startsWith("Websocket error")) {
|
|
next(msg.data, { up: 0, down: 0 });
|
|
await reconnect();
|
|
} else {
|
|
const data = JSON.parse(msg.data) as ITrafficItem;
|
|
trafficRef.current?.appendData(data);
|
|
next(null, data);
|
|
}
|
|
}
|
|
});
|
|
})
|
|
.catch((_) => {
|
|
if (!ws.current) {
|
|
timeoutRef.current = setTimeout(async () => await connect(), 500);
|
|
}
|
|
});
|
|
};
|
|
|
|
if (
|
|
wsFirstConnection.current ||
|
|
(ws.current && !wsFirstConnection.current)
|
|
) {
|
|
wsFirstConnection.current = false;
|
|
if (ws.current) {
|
|
ws.current.close();
|
|
ws.current = null;
|
|
}
|
|
connect();
|
|
}
|
|
|
|
return () => {
|
|
ws.current?.close();
|
|
};
|
|
},
|
|
{
|
|
fallbackData: { up: 0, down: 0 },
|
|
keepPreviousData: true,
|
|
},
|
|
);
|
|
|
|
useEffect(() => {
|
|
mutate(`$sub$${subscriptKey}`);
|
|
}, [date, subscriptKey]);
|
|
|
|
const refreshGetClashTraffic = () => {
|
|
setDate(Date.now());
|
|
};
|
|
|
|
return { response, refreshGetClashTraffic };
|
|
};
|