use-filter-proxy.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { useMemo } from "react";
  2. import delayManager from "@/services/delay";
  3. const regex1 = /delay([=<>])(\d+|timeout|error)/i;
  4. const regex2 = /type=(.*)/i;
  5. /**
  6. * filter the proxy
  7. * according to the regular conditions
  8. */
  9. export default function useFilterProxy(
  10. proxies: ApiType.ProxyItem[],
  11. groupName: string,
  12. filterText: string
  13. ) {
  14. return useMemo(() => {
  15. if (!proxies) return [];
  16. if (!filterText) return proxies;
  17. const res1 = regex1.exec(filterText);
  18. if (res1) {
  19. const symbol = res1[1];
  20. const symbol2 = res1[2].toLowerCase();
  21. const value =
  22. symbol2 === "error" ? 1e5 : symbol2 === "timeout" ? 3000 : +symbol2;
  23. return proxies.filter((p) => {
  24. const delay = delayManager.getDelay(p.name, groupName);
  25. if (delay < 0) return false;
  26. if (symbol === "=" && symbol2 === "error") return delay >= 1e5;
  27. if (symbol === "=" && symbol2 === "timeout")
  28. return delay < 1e5 && delay >= 3000;
  29. if (symbol === "=") return delay == value;
  30. if (symbol === "<") return delay <= value;
  31. if (symbol === ">") return delay >= value;
  32. return false;
  33. });
  34. }
  35. const res2 = regex2.exec(filterText);
  36. if (res2) {
  37. const type = res2[1].toLowerCase();
  38. return proxies.filter((p) => p.type.toLowerCase().includes(type));
  39. }
  40. return proxies.filter((p) => p.name.includes(filterText.trim()));
  41. }, [proxies, groupName, filterText]);
  42. }