From f0f45e007df8b6cf0ec757ae0ced6c9680b0d512 Mon Sep 17 00:00:00 2001
From: GyDi <segydi@foxmail.com>
Date: Tue, 25 Jan 2022 02:08:10 +0800
Subject: [PATCH] feat: global proxies use virtual list

---
 src/pages/proxies.tsx | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx
index c5deb2e..767b360 100644
--- a/src/pages/proxies.tsx
+++ b/src/pages/proxies.tsx
@@ -1,5 +1,6 @@
 import useSWR, { useSWRConfig } from "swr";
 import { useEffect, useMemo, useRef, useState } from "react";
+import { Virtuoso } from "react-virtuoso";
 import { Button, ButtonGroup, List, Paper } from "@mui/material";
 import { getClashConfig, updateConfigs, updateProxy } from "../services/api";
 import { patchClashConfig } from "../services/cmds";
@@ -74,8 +75,15 @@ const ProxyPage = () => {
     setCurProxy(name);
   };
 
+  // difference style
+  const pageStyle = asGroup ? {} : { height: "100%" };
+  const paperStyle: any = asGroup
+    ? { mb: 0.5 }
+    : { py: 1, height: "100%", boxSizing: "border-box" };
+
   return (
     <BasePage
+      contentStyle={pageStyle}
       title={asGroup ? "Proxy Groups" : "Proxies"}
       header={
         <ButtonGroup size="small">
@@ -92,7 +100,7 @@ const ProxyPage = () => {
         </ButtonGroup>
       }
     >
-      <Paper sx={{ borderRadius: 1, boxShadow: 2, mb: 1 }}>
+      <Paper sx={{ borderRadius: 1, boxShadow: 2, ...paperStyle }}>
         {asGroup ? (
           <List>
             {groups.map((group) => (
@@ -100,18 +108,19 @@ const ProxyPage = () => {
             ))}
           </List>
         ) : (
-          // todo: virtual list
-          <List>
-            {filterProxies.map((proxy) => (
+          // virtual list
+          <Virtuoso
+            style={{ height: "100%" }}
+            totalCount={filterProxies.length}
+            itemContent={(index) => (
               <ProxyItem
-                key={proxy.name}
-                proxy={proxy}
-                selected={proxy.name === curProxy}
+                proxy={filterProxies[index]}
+                selected={filterProxies[index].name === curProxy}
                 onClick={onChangeProxy}
                 sx={{ py: 0, px: 2 }}
               />
-            ))}
-          </List>
+            )}
+          />
         )}
       </Paper>
     </BasePage>
-- 
GitLab