소스 검색

feat(traffic): api support & adjust

GyDi 3 년 전
부모
커밋
0a3c59450b
4개의 변경된 파일65개의 추가작업 그리고 17개의 파일을 삭제
  1. 20 17
      src/components/traffic.tsx
  2. 11 0
      src/services/base.ts
  3. 5 0
      src/services/index.ts
  4. 29 0
      src/services/traffic.ts

+ 20 - 17
src/components/traffic.tsx

@@ -1,29 +1,32 @@
-import axios from "axios";
+import { CancelTokenSource } from "axios";
 import { useEffect, useState } from "react";
+import { Box, Typography } from "@mui/material";
 import { ArrowDownward, ArrowUpward } from "@mui/icons-material";
 import parseTraffic from "../utils/parse-traffic";
-import { Typography } from "@mui/material";
-import { Box } from "@mui/system";
+import services from "../services";
 
 const Traffic = () => {
   const [traffic, setTraffic] = useState({ up: 0, down: 0 });
 
   useEffect(() => {
-    const onTraffic = () => {
-      axios({
-        url: `http://127.0.0.1:9090/traffic`,
-        method: "GET",
-        onDownloadProgress: (progressEvent) => {
-          const data = progressEvent.currentTarget.response || "";
-          const lastData = data.slice(data.trim().lastIndexOf("\n") + 1);
-          try {
-            if (lastData) setTraffic(JSON.parse(lastData));
-          } catch {}
-        },
-      }).catch(() => setTimeout(onTraffic, 500));
-    };
+    let timer: any = null;
+    let source: CancelTokenSource | null = null;
+
+    async function onTraffic() {
+      timer = null;
+      try {
+        source = await services.getTraffic(setTraffic);
+      } catch {
+        timer = setTimeout(onTraffic, 500);
+      }
+    }
 
     onTraffic();
+
+    return () => {
+      if (timer) clearTimeout(timer);
+      source?.cancel();
+    };
   }, []);
 
   const [up, upUnit] = parseTraffic(traffic.up);
@@ -45,7 +48,7 @@ const Traffic = () => {
 
   return (
     <Box width="110px">
-      <Box mb={2} display="flex" alignItems="center" whiteSpace="nowrap">
+      <Box mb={1.5} display="flex" alignItems="center" whiteSpace="nowrap">
         <ArrowUpward
           fontSize="small"
           color={+up > 0 ? "primary" : "disabled"}

+ 11 - 0
src/services/base.ts

@@ -0,0 +1,11 @@
+import axios from "axios";
+
+const axiosIns = axios.create({
+  baseURL: "http://127.0.0.1:9090",
+});
+
+axiosIns.interceptors.response.use((respone) => {
+  return respone.data;
+});
+
+export default axiosIns;

+ 5 - 0
src/services/index.ts

@@ -0,0 +1,5 @@
+import * as traffic from "./traffic";
+
+export default {
+  ...traffic,
+};

+ 29 - 0
src/services/traffic.ts

@@ -0,0 +1,29 @@
+import axios from "axios";
+import axiosIns from "./base";
+
+export interface TrafficData {
+  up: number;
+  down: number;
+}
+
+/// Get the traffic stream
+export async function getTraffic(callback: (data: TrafficData) => void) {
+  const source = axios.CancelToken.source();
+
+  axiosIns.get("/traffic", {
+    cancelToken: source.token,
+    onDownloadProgress: (progressEvent) => {
+      const data = progressEvent.currentTarget.response || "";
+      const lastData = data.slice(data.trim().lastIndexOf("\n") + 1);
+
+      if (!lastData) callback({ up: 0, down: 0 });
+      try {
+        callback(JSON.parse(lastData) as TrafficData);
+      } catch {
+        callback({ up: 0, down: 0 });
+      }
+    },
+  });
+
+  return source;
+}