diff --git a/UPDATELOG.md b/UPDATELOG.md index 7daa12538..3cf51c555 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -4,6 +4,7 @@ - 重构并简化服务模式启动检测流程,消除重复检测 - 重构并简化窗口创建流程 +- 优化前端资源占用 ### 🐞 修复问题 diff --git a/eslint.config.ts b/eslint.config.ts index 46ac9f4e5..95b601db2 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,6 +1,11 @@ import js from "@eslint/js"; +import configPrettier from "eslint-config-prettier"; +import pluginImport from "eslint-plugin-import"; +import pluginPrettier from "eslint-plugin-prettier"; import pluginReact from "eslint-plugin-react"; import pluginReactHooks from "eslint-plugin-react-hooks"; +import pluginReactRefresh from "eslint-plugin-react-refresh"; +import pluginUnusedImports from "eslint-plugin-unused-imports"; import { defineConfig } from "eslint/config"; import globals from "globals"; import tseslint from "typescript-eslint"; @@ -8,17 +13,89 @@ import tseslint from "typescript-eslint"; export default defineConfig([ { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], + plugins: { js, + react: pluginReact, "react-hooks": pluginReactHooks, + import: pluginImport, + "react-refresh": pluginReactRefresh, + "unused-imports": pluginUnusedImports, + prettier: pluginPrettier, }, - extends: ["js/recommended", tseslint.configs.recommended], - languageOptions: { globals: globals.browser }, + + extends: [ + "js/recommended", + tseslint.configs.recommended, + pluginReact.configs.flat.recommended, + pluginReact.configs.flat["jsx-runtime"], + configPrettier, + ], + + languageOptions: { + globals: globals.browser, + }, + + settings: { + react: { + version: "detect", + }, + }, + rules: { + // React "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "error", + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + + // TypeScript "@typescript-eslint/no-explicit-any": "off", + + // unused-imports 代替 no-unused-vars + "@typescript-eslint/no-unused-vars": "off", + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": [ + "warn", + { + vars: "all", + varsIgnorePattern: "^_+$", + args: "after-used", + argsIgnorePattern: "^_+$", + }, + ], + + // Import + "import/no-unresolved": "error", + "import/order": [ + "warn", + { + groups: [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + ], + "newlines-between": "always", + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + }, + ], + + // 其他常见 + "prefer-const": "warn", + "no-case-declarations": "error", + "no-fallthrough": "error", + "no-empty": ["warn", { allowEmptyCatch: true }], + + // Prettier 格式化问题 + "prettier/prettier": "warn", }, }, - pluginReact.configs.flat["jsx-runtime"], ]); diff --git a/package.json b/package.json index 5a5210d8b..c300a62d0 100644 --- a/package.json +++ b/package.json @@ -87,8 +87,13 @@ "commander": "^14.0.1", "cross-env": "^10.0.0", "eslint": "^9.35.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "eslint-plugin-unused-imports": "^4.2.0", "glob": "^11.0.3", "globals": "^16.4.0", "https-proxy-agent": "^7.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5534b76de..67072a528 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,12 +177,27 @@ importers: eslint: specifier: ^9.35.0 version: 9.35.0(jiti@2.5.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-prettier: + specifier: ^5.5.4 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 version: 5.2.0(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-unused-imports: + specifier: ^4.2.0 + version: 4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -1357,6 +1372,10 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -1472,6 +1491,9 @@ packages: cpu: [x64] os: [win32] + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1668,6 +1690,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -1842,6 +1867,10 @@ packages: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} @@ -2074,6 +2103,14 @@ packages: dayjs@1.11.18: resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -2208,18 +2245,86 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-react-hooks@5.2.0: resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + peerDependencies: + eslint: '>=8.40' + eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-unused-imports@4.2.0: + resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2284,6 +2389,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2691,6 +2799,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2882,6 +2994,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -2978,6 +3093,10 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -3060,6 +3179,10 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -3384,6 +3507,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3413,6 +3540,10 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + systemjs@6.15.1: resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} @@ -3449,6 +3580,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4953,6 +5087,8 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true + '@pkgr/core@0.2.9': {} + '@popperjs/core@2.11.8': {} '@rolldown/pluginutils@1.0.0-beta.34': {} @@ -5025,6 +5161,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@rtsao/scc@1.1.0': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -5213,6 +5351,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.17.16 @@ -5442,6 +5582,16 @@ snapshots: es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 @@ -5696,6 +5846,10 @@ snapshots: dayjs@1.11.18: {} + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -5923,10 +6077,74 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)): + dependencies: + eslint: 9.35.0(jiti@2.5.1) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.35.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.35.0(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)))(eslint@9.35.0(jiti@2.5.1))(prettier@3.6.2): + dependencies: + eslint: 9.35.0(jiti@2.5.1) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.35.0(jiti@2.5.1)) + eslint-plugin-react-hooks@5.2.0(eslint@9.35.0(jiti@2.5.1)): dependencies: eslint: 9.35.0(jiti@2.5.1) + eslint-plugin-react-refresh@0.4.20(eslint@9.35.0(jiti@2.5.1)): + dependencies: + eslint: 9.35.0(jiti@2.5.1) + eslint-plugin-react@7.37.5(eslint@9.35.0(jiti@2.5.1)): dependencies: array-includes: 3.1.9 @@ -5949,6 +6167,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)): + dependencies: + eslint: 9.35.0(jiti@2.5.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -6042,6 +6266,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6450,6 +6676,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@1.0.2: + dependencies: + minimist: 1.2.8 + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -6772,6 +7002,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.0.2: @@ -6872,6 +7104,12 @@ snapshots: es-abstract: 1.24.0 es-object-atoms: 1.1.1 + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + object.values@1.2.1: dependencies: call-bind: 1.0.8 @@ -6960,6 +7198,10 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier@3.6.2: {} prop-types@15.8.1: @@ -7363,6 +7605,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} style-to-js@1.1.16: @@ -7389,6 +7633,10 @@ snapshots: react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + systemjs@6.15.1: {} tar@7.4.3: @@ -7429,6 +7677,13 @@ snapshots: dependencies: typescript: 5.9.2 + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} tunnel@0.0.6: {} diff --git a/src/App.tsx b/src/App.tsx index 2ef77bb41..c1fe73a7d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ -import { AppDataProvider } from "./providers/app-data-provider"; import Layout from "./pages/_layout"; +import { AppDataProvider } from "./providers/app-data-provider"; function App() { return ( diff --git a/src/components/base/NoticeManager.tsx b/src/components/base/NoticeManager.tsx index 223447a5b..f2ae5ef21 100644 --- a/src/components/base/NoticeManager.tsx +++ b/src/components/base/NoticeManager.tsx @@ -1,6 +1,7 @@ -import React, { useSyncExternalStore } from "react"; -import { Snackbar, Alert, IconButton, Box } from "@mui/material"; import { CloseRounded } from "@mui/icons-material"; +import { Snackbar, Alert, IconButton, Box } from "@mui/material"; +import React, { useSyncExternalStore } from "react"; + import { subscribeNotices, hideNotice, diff --git a/src/components/base/base-dialog.tsx b/src/components/base/base-dialog.tsx index 56d90eaa4..219b5108a 100644 --- a/src/components/base/base-dialog.tsx +++ b/src/components/base/base-dialog.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from "react"; +import { LoadingButton } from "@mui/lab"; import { Button, Dialog, @@ -8,7 +8,7 @@ import { type SxProps, type Theme, } from "@mui/material"; -import { LoadingButton } from "@mui/lab"; +import { ReactNode } from "react"; interface Props { title: ReactNode; diff --git a/src/components/base/base-empty.tsx b/src/components/base/base-empty.tsx index 665c12c5c..dcf04bbb9 100644 --- a/src/components/base/base-empty.tsx +++ b/src/components/base/base-empty.tsx @@ -1,5 +1,5 @@ -import { alpha, Box, Typography } from "@mui/material"; import { InboxRounded } from "@mui/icons-material"; +import { alpha, Box, Typography } from "@mui/material"; import { useTranslation } from "react-i18next"; interface Props { diff --git a/src/components/base/base-fieldset.tsx b/src/components/base/base-fieldset.tsx index 131f6758b..8374897d3 100644 --- a/src/components/base/base-fieldset.tsx +++ b/src/components/base/base-fieldset.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { Box, styled } from "@mui/material"; +import React from "react"; type Props = { label: string; diff --git a/src/components/base/base-loading-overlay.tsx b/src/components/base/base-loading-overlay.tsx index faba8f5f7..98727dcb1 100644 --- a/src/components/base/base-loading-overlay.tsx +++ b/src/components/base/base-loading-overlay.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { Box, CircularProgress } from "@mui/material"; +import React from "react"; interface BaseLoadingOverlayProps { isLoading: boolean; diff --git a/src/components/base/base-page.tsx b/src/components/base/base-page.tsx index b1f92e2c6..a93ad2ca6 100644 --- a/src/components/base/base-page.tsx +++ b/src/components/base/base-page.tsx @@ -1,7 +1,8 @@ -import React, { ReactNode } from "react"; import { Typography } from "@mui/material"; -import { BaseErrorBoundary } from "./base-error-boundary"; import { useTheme } from "@mui/material/styles"; +import React, { ReactNode } from "react"; + +import { BaseErrorBoundary } from "./base-error-boundary"; interface Props { title?: React.ReactNode; // the page title diff --git a/src/components/base/base-search-box.tsx b/src/components/base/base-search-box.tsx index c41aaf2b6..84f0a83bb 100644 --- a/src/components/base/base-search-box.tsx +++ b/src/components/base/base-search-box.tsx @@ -1,10 +1,11 @@ import { Box, SvgIcon, TextField, styled } from "@mui/material"; import Tooltip from "@mui/material/Tooltip"; import { ChangeEvent, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; + import matchCaseIcon from "@/assets/image/component/match_case.svg?react"; import matchWholeWordIcon from "@/assets/image/component/match_whole_word.svg?react"; import useRegularExpressionIcon from "@/assets/image/component/use_regular_expression.svg?react"; -import { useTranslation } from "react-i18next"; export type SearchState = { text: string; diff --git a/src/components/base/base-tooltip-icon.tsx b/src/components/base/base-tooltip-icon.tsx index e7028955f..330490233 100644 --- a/src/components/base/base-tooltip-icon.tsx +++ b/src/components/base/base-tooltip-icon.tsx @@ -1,10 +1,10 @@ +import { InfoRounded } from "@mui/icons-material"; import { Tooltip, IconButton, IconButtonProps, SvgIconProps, } from "@mui/material"; -import { InfoRounded } from "@mui/icons-material"; interface Props extends IconButtonProps { title?: string; diff --git a/src/components/common/traffic-error-boundary.tsx b/src/components/common/traffic-error-boundary.tsx index eb5f77205..ce7a3f61c 100644 --- a/src/components/common/traffic-error-boundary.tsx +++ b/src/components/common/traffic-error-boundary.tsx @@ -1,10 +1,10 @@ -import React, { Component, ErrorInfo, ReactNode } from "react"; -import { Box, Typography, Button, Alert, Collapse } from "@mui/material"; import { ErrorOutlineRounded, RefreshRounded, BugReportRounded, } from "@mui/icons-material"; +import { Box, Typography, Button, Alert, Collapse } from "@mui/material"; +import React, { Component, ErrorInfo, ReactNode } from "react"; import { useTranslation } from "react-i18next"; interface Props { diff --git a/src/components/connection/connection-detail.tsx b/src/components/connection/connection-detail.tsx index 4059e9cae..9eb0f5636 100644 --- a/src/components/connection/connection-detail.tsx +++ b/src/components/connection/connection-detail.tsx @@ -1,10 +1,11 @@ -import dayjs from "dayjs"; -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; import { Box, Button, Snackbar, useTheme } from "@mui/material"; +import { useLockFn } from "ahooks"; +import dayjs from "dayjs"; +import { t } from "i18next"; +import { forwardRef, useImperativeHandle, useState } from "react"; + import { deleteConnection } from "@/services/cmds"; import parseTraffic from "@/utils/parse-traffic"; -import { t } from "i18next"; export interface ConnectionDetailRef { open: (detail: IConnectionsItem) => void; diff --git a/src/components/connection/connection-item.tsx b/src/components/connection/connection-item.tsx index 692f3bb4d..77d2c7e94 100644 --- a/src/components/connection/connection-item.tsx +++ b/src/components/connection/connection-item.tsx @@ -1,5 +1,4 @@ -import dayjs from "dayjs"; -import { useLockFn } from "ahooks"; +import { CloseRounded } from "@mui/icons-material"; import { styled, ListItem, @@ -8,7 +7,9 @@ import { Box, alpha, } from "@mui/material"; -import { CloseRounded } from "@mui/icons-material"; +import { useLockFn } from "ahooks"; +import dayjs from "dayjs"; + import { deleteConnection } from "@/services/cmds"; import parseTraffic from "@/utils/parse-traffic"; diff --git a/src/components/connection/connection-table.tsx b/src/components/connection/connection-table.tsx index cd35a0b46..97f65f089 100644 --- a/src/components/connection/connection-table.tsx +++ b/src/components/connection/connection-table.tsx @@ -1,10 +1,11 @@ -import dayjs from "dayjs"; -import { useMemo, useState } from "react"; import { DataGrid, GridColDef, GridColumnResizeParams } from "@mui/x-data-grid"; -import { truncateStr } from "@/utils/truncate-str"; -import parseTraffic from "@/utils/parse-traffic"; -import { t } from "i18next"; +import dayjs from "dayjs"; import { useLocalStorage } from "foxact/use-local-storage"; +import { t } from "i18next"; +import { useMemo, useState } from "react"; + +import parseTraffic from "@/utils/parse-traffic"; +import { truncateStr } from "@/utils/truncate-str"; interface Props { connections: IConnectionsItem[]; diff --git a/src/components/home/clash-info-card.tsx b/src/components/home/clash-info-card.tsx index dcdd22a8e..4da836444 100644 --- a/src/components/home/clash-info-card.tsx +++ b/src/components/home/clash-info-card.tsx @@ -1,9 +1,11 @@ -import { useTranslation } from "react-i18next"; -import { Typography, Stack, Divider } from "@mui/material"; import { DeveloperBoardOutlined } from "@mui/icons-material"; -import { useClash } from "@/hooks/use-clash"; -import { EnhancedCard } from "./enhanced-card"; +import { Typography, Stack, Divider } from "@mui/material"; import { useMemo } from "react"; +import { useTranslation } from "react-i18next"; + +import { EnhancedCard } from "./enhanced-card"; + +import { useClash } from "@/hooks/use-clash"; import { useAppData } from "@/providers/app-data-provider"; // 将毫秒转换为时:分:秒格式的函数 diff --git a/src/components/home/clash-mode-card.tsx b/src/components/home/clash-mode-card.tsx index 35740fd5f..ac3a81366 100644 --- a/src/components/home/clash-mode-card.tsx +++ b/src/components/home/clash-mode-card.tsx @@ -1,16 +1,17 @@ -import { useTranslation } from "react-i18next"; -import { Box, Typography, Paper, Stack } from "@mui/material"; -import { useLockFn } from "ahooks"; -import { closeAllConnections } from "@/services/cmds"; -import { patchClashMode } from "@/services/cmds"; -import { useVerge } from "@/hooks/use-verge"; import { LanguageRounded, MultipleStopRounded, DirectionsRounded, } from "@mui/icons-material"; +import { Box, Typography, Paper, Stack } from "@mui/material"; +import { useLockFn } from "ahooks"; import { useMemo } from "react"; +import { useTranslation } from "react-i18next"; + +import { useVerge } from "@/hooks/use-verge"; import { useAppData } from "@/providers/app-data-provider"; +import { closeAllConnections } from "@/services/cmds"; +import { patchClashMode } from "@/services/cmds"; export const ClashModeCard = () => { const { t } = useTranslation(); diff --git a/src/components/home/current-proxy-card.tsx b/src/components/home/current-proxy-card.tsx index 845642546..855b52570 100644 --- a/src/components/home/current-proxy-card.tsx +++ b/src/components/home/current-proxy-card.tsx @@ -1,4 +1,15 @@ -import { useTranslation } from "react-i18next"; +import { + SignalWifi4Bar as SignalStrong, + SignalWifi3Bar as SignalGood, + SignalWifi2Bar as SignalMedium, + SignalWifi1Bar as SignalWeak, + SignalWifi0Bar as SignalNone, + WifiOff as SignalError, + ChevronRight, + SortRounded, + AccessTimeRounded, + SortByAlphaRounded, +} from "@mui/icons-material"; import { Box, Typography, @@ -15,23 +26,13 @@ import { IconButton, } from "@mui/material"; import { useEffect, useState, useMemo, useCallback } from "react"; -import { - SignalWifi4Bar as SignalStrong, - SignalWifi3Bar as SignalGood, - SignalWifi2Bar as SignalMedium, - SignalWifi1Bar as SignalWeak, - SignalWifi0Bar as SignalNone, - WifiOff as SignalError, - ChevronRight, - SortRounded, - AccessTimeRounded, - SortByAlphaRounded, -} from "@mui/icons-material"; +import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; + import { EnhancedCard } from "@/components/home/enhanced-card"; -import delayManager from "@/services/delay"; -import { useAppData } from "@/providers/app-data-provider"; import { useProxySelection } from "@/hooks/use-proxy-selection"; +import { useAppData } from "@/providers/app-data-provider"; +import delayManager from "@/services/delay"; // 本地存储的键名 const STORAGE_KEY_GROUP = "clash-verge-selected-proxy-group"; diff --git a/src/components/home/enhanced-canvas-traffic-graph.tsx b/src/components/home/enhanced-canvas-traffic-graph.tsx index a009e28d8..2f8a47196 100644 --- a/src/components/home/enhanced-canvas-traffic-graph.tsx +++ b/src/components/home/enhanced-canvas-traffic-graph.tsx @@ -1,3 +1,4 @@ +import { Box, useTheme } from "@mui/material"; import { forwardRef, useImperativeHandle, @@ -8,13 +9,13 @@ import { useRef, memo, } from "react"; -import { Box, useTheme } from "@mui/material"; import { useTranslation } from "react-i18next"; -import parseTraffic from "@/utils/parse-traffic"; + import { useTrafficGraphDataEnhanced, type ITrafficDataPoint, } from "@/hooks/use-traffic-monitor"; +import parseTraffic from "@/utils/parse-traffic"; // 流量数据项接口 interface ITrafficItem { diff --git a/src/components/home/enhanced-traffic-stats.tsx b/src/components/home/enhanced-traffic-stats.tsx index 24232cee2..7f1b2745e 100644 --- a/src/components/home/enhanced-traffic-stats.tsx +++ b/src/components/home/enhanced-traffic-stats.tsx @@ -1,14 +1,3 @@ -import { useRef, useCallback, memo, useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { - Typography, - Paper, - alpha, - useTheme, - PaletteColor, - Grid, - Box, -} from "@mui/material"; import { ArrowUpwardRounded, ArrowDownwardRounded, @@ -17,19 +6,32 @@ import { CloudUploadRounded, CloudDownloadRounded, } from "@mui/icons-material"; +import { + Typography, + Paper, + alpha, + useTheme, + PaletteColor, + Grid, + Box, +} from "@mui/material"; +import { useRef, useCallback, memo, useMemo } from "react"; +import { ReactNode } from "react"; +import { useTranslation } from "react-i18next"; +import useSWR from "swr"; + import { EnhancedCanvasTrafficGraph, type EnhancedCanvasTrafficGraphRef, } from "./enhanced-canvas-traffic-graph"; -import { useVisibility } from "@/hooks/use-visibility"; -import { useVerge } from "@/hooks/use-verge"; -import parseTraffic from "@/utils/parse-traffic"; -import { isDebugEnabled, gc } from "@/services/cmds"; -import { ReactNode } from "react"; -import { useAppData } from "@/providers/app-data-provider"; -import { useTrafficDataEnhanced } from "@/hooks/use-traffic-monitor"; + import { TrafficErrorBoundary } from "@/components/common/traffic-error-boundary"; -import useSWR from "swr"; +import { useTrafficDataEnhanced } from "@/hooks/use-traffic-monitor"; +import { useVerge } from "@/hooks/use-verge"; +import { useVisibility } from "@/hooks/use-visibility"; +import { useAppData } from "@/providers/app-data-provider"; +import { isDebugEnabled, gc } from "@/services/cmds"; +import parseTraffic from "@/utils/parse-traffic"; interface StatCardProps { icon: ReactNode; diff --git a/src/components/home/home-profile-card.tsx b/src/components/home/home-profile-card.tsx index 321ee82aa..b2d17ac58 100644 --- a/src/components/home/home-profile-card.tsx +++ b/src/components/home/home-profile-card.tsx @@ -1,4 +1,12 @@ -import { useTranslation } from "react-i18next"; +import { + CloudUploadOutlined, + StorageOutlined, + UpdateOutlined, + DnsOutlined, + SpeedOutlined, + EventOutlined, + LaunchOutlined, +} from "@mui/icons-material"; import { Box, Typography, @@ -10,24 +18,18 @@ import { Link, keyframes, } from "@mui/material"; -import { useNavigate } from "react-router-dom"; -import { - CloudUploadOutlined, - StorageOutlined, - UpdateOutlined, - DnsOutlined, - SpeedOutlined, - EventOutlined, - LaunchOutlined, -} from "@mui/icons-material"; -import dayjs from "dayjs"; -import parseTraffic from "@/utils/parse-traffic"; -import { useMemo, useCallback, useState } from "react"; -import { openWebUrl, updateProfile } from "@/services/cmds"; import { useLockFn } from "ahooks"; -import { showNotice } from "@/services/noticeService"; +import dayjs from "dayjs"; +import { useMemo, useCallback, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; + import { EnhancedCard } from "./enhanced-card"; + import { useAppData } from "@/providers/app-data-provider"; +import { openWebUrl, updateProfile } from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; +import parseTraffic from "@/utils/parse-traffic"; // 定义旋转动画 const round = keyframes` diff --git a/src/components/home/ip-info-card.tsx b/src/components/home/ip-info-card.tsx index 4c5231376..852f01191 100644 --- a/src/components/home/ip-info-card.tsx +++ b/src/components/home/ip-info-card.tsx @@ -1,14 +1,16 @@ -import { useTranslation } from "react-i18next"; -import { Box, Typography, Button, Skeleton, IconButton } from "@mui/material"; import { LocationOnOutlined, RefreshOutlined, VisibilityOutlined, VisibilityOffOutlined, } from "@mui/icons-material"; -import { EnhancedCard } from "./enhanced-card"; -import { getIpInfo } from "@/services/api"; +import { Box, Typography, Button, Skeleton, IconButton } from "@mui/material"; import { useState, useEffect, useCallback, memo } from "react"; +import { useTranslation } from "react-i18next"; + +import { EnhancedCard } from "./enhanced-card"; + +import { getIpInfo } from "@/services/api"; // 定义刷新时间(秒) const IP_REFRESH_SECONDS = 300; diff --git a/src/components/home/proxy-tun-card.tsx b/src/components/home/proxy-tun-card.tsx index 3a6795b95..6f4c5d868 100644 --- a/src/components/home/proxy-tun-card.tsx +++ b/src/components/home/proxy-tun-card.tsx @@ -1,4 +1,9 @@ -import { useTranslation } from "react-i18next"; +import { + ComputerRounded, + TroubleshootRounded, + HelpOutlineRounded, + SvgIconComponent, +} from "@mui/icons-material"; import { Box, Typography, @@ -10,16 +15,12 @@ import { Fade, } from "@mui/material"; import { useState, useMemo, memo, FC } from "react"; +import { useTranslation } from "react-i18next"; + import ProxyControlSwitches from "@/components/shared/ProxyControlSwitches"; -import { - ComputerRounded, - TroubleshootRounded, - HelpOutlineRounded, - SvgIconComponent, -} from "@mui/icons-material"; -import { useVerge } from "@/hooks/use-verge"; -import { useSystemState } from "@/hooks/use-system-state"; import { useSystemProxyState } from "@/hooks/use-system-proxy-state"; +import { useSystemState } from "@/hooks/use-system-state"; +import { useVerge } from "@/hooks/use-verge"; import { showNotice } from "@/services/noticeService"; const LOCAL_STORAGE_TAB_KEY = "clash-verge-proxy-active-tab"; diff --git a/src/components/home/system-info-card.tsx b/src/components/home/system-info-card.tsx index 58bee02c4..30b0879a6 100644 --- a/src/components/home/system-info-card.tsx +++ b/src/components/home/system-info-card.tsx @@ -1,12 +1,3 @@ -import { useTranslation } from "react-i18next"; -import { - Typography, - Stack, - Divider, - Chip, - IconButton, - Tooltip, -} from "@mui/material"; import { InfoOutlined, SettingsOutlined, @@ -15,18 +6,29 @@ import { DnsOutlined, ExtensionOutlined, } from "@mui/icons-material"; -import { useVerge } from "@/hooks/use-verge"; -import { EnhancedCard } from "./enhanced-card"; -import useSWR from "swr"; -import { getSystemInfo } from "@/services/cmds"; -import { useNavigate } from "react-router-dom"; +import { + Typography, + Stack, + Divider, + Chip, + IconButton, + Tooltip, +} from "@mui/material"; import { version as appVersion } from "@root/package.json"; -import { useCallback, useEffect, useMemo, useState } from "react"; import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { useLockFn } from "ahooks"; -import { showNotice } from "@/services/noticeService"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; +import useSWR from "swr"; + +import { EnhancedCard } from "./enhanced-card"; + import { useSystemState } from "@/hooks/use-system-state"; +import { useVerge } from "@/hooks/use-verge"; import { useServiceInstaller } from "@/hooks/useServiceInstaller"; +import { getSystemInfo } from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; export const SystemInfoCard = () => { const { t } = useTranslation(); diff --git a/src/components/home/test-card.tsx b/src/components/home/test-card.tsx index 49b5d1145..1b26d9509 100644 --- a/src/components/home/test-card.tsx +++ b/src/components/home/test-card.tsx @@ -1,6 +1,3 @@ -import { useEffect, useRef, useMemo, useCallback } from "react"; -import { useVerge } from "@/hooks/use-verge"; -import { Box, IconButton, Tooltip, alpha, styled, Grid } from "@mui/material"; import { DndContext, closestCenter, @@ -10,13 +7,13 @@ import { DragEndEvent, } from "@dnd-kit/core"; import { SortableContext } from "@dnd-kit/sortable"; - -import { useTranslation } from "react-i18next"; -import { TestViewer, TestViewerRef } from "@/components/test/test-viewer"; -import { TestItem } from "@/components/test/test-item"; +import { Add, NetworkCheck } from "@mui/icons-material"; +import { Box, IconButton, Tooltip, alpha, styled, Grid } from "@mui/material"; import { emit } from "@tauri-apps/api/event"; import { nanoid } from "nanoid"; -import { Add, NetworkCheck } from "@mui/icons-material"; +import { useEffect, useRef, useMemo, useCallback } from "react"; +import { useTranslation } from "react-i18next"; + import { EnhancedCard } from "./enhanced-card"; // test icons @@ -24,6 +21,9 @@ import apple from "@/assets/image/test/apple.svg?raw"; import github from "@/assets/image/test/github.svg?raw"; import google from "@/assets/image/test/google.svg?raw"; import youtube from "@/assets/image/test/youtube.svg?raw"; +import { TestItem } from "@/components/test/test-item"; +import { TestViewer, TestViewerRef } from "@/components/test/test-viewer"; +import { useVerge } from "@/hooks/use-verge"; // 自定义滚动条样式 const ScrollBox = styled(Box)(({ theme }) => ({ diff --git a/src/components/layout/layout-item.tsx b/src/components/layout/layout-item.tsx index 35e686a2b..15d4fb93f 100644 --- a/src/components/layout/layout-item.tsx +++ b/src/components/layout/layout-item.tsx @@ -6,6 +6,7 @@ import { ListItemIcon, } from "@mui/material"; import { useMatch, useResolvedPath, useNavigate } from "react-router-dom"; + import { useVerge } from "@/hooks/use-verge"; interface Props { to: string; diff --git a/src/components/layout/layout-traffic.tsx b/src/components/layout/layout-traffic.tsx index 232c0d8ae..0c8f92a93 100644 --- a/src/components/layout/layout-traffic.tsx +++ b/src/components/layout/layout-traffic.tsx @@ -1,21 +1,23 @@ -import { useEffect, useRef } from "react"; -import { Box, Typography } from "@mui/material"; import { ArrowDownwardRounded, ArrowUpwardRounded, MemoryRounded, } from "@mui/icons-material"; -import { useClashInfo } from "@/hooks/use-clash"; -import { useVerge } from "@/hooks/use-verge"; -import { TrafficGraph, type TrafficRef } from "./traffic-graph"; -import { useVisibility } from "@/hooks/use-visibility"; -import parseTraffic from "@/utils/parse-traffic"; +import { Box, Typography } from "@mui/material"; +import { useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; -import { isDebugEnabled, gc, startTrafficService } from "@/services/cmds"; -import { useTrafficDataEnhanced } from "@/hooks/use-traffic-monitor"; -import { LightweightTrafficErrorBoundary } from "@/components/common/traffic-error-boundary"; import useSWR from "swr"; +import { TrafficGraph, type TrafficRef } from "./traffic-graph"; + +import { LightweightTrafficErrorBoundary } from "@/components/common/traffic-error-boundary"; +import { useClashInfo } from "@/hooks/use-clash"; +import { useTrafficDataEnhanced } from "@/hooks/use-traffic-monitor"; +import { useVerge } from "@/hooks/use-verge"; +import { useVisibility } from "@/hooks/use-visibility"; +import { isDebugEnabled, gc, startTrafficService } from "@/services/cmds"; +import parseTraffic from "@/utils/parse-traffic"; + // setup the traffic export const LayoutTraffic = () => { const { data: isDebug } = useSWR( diff --git a/src/components/layout/scroll-top-button.tsx b/src/components/layout/scroll-top-button.tsx index 8813541e1..66fe80c17 100644 --- a/src/components/layout/scroll-top-button.tsx +++ b/src/components/layout/scroll-top-button.tsx @@ -1,5 +1,5 @@ -import { IconButton, Fade, SxProps, Theme } from "@mui/material"; import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; +import { IconButton, Fade, SxProps, Theme } from "@mui/material"; interface Props { onClick: () => void; diff --git a/src/components/layout/traffic-graph.tsx b/src/components/layout/traffic-graph.tsx index 660d6298a..9fd6e2a70 100644 --- a/src/components/layout/traffic-graph.tsx +++ b/src/components/layout/traffic-graph.tsx @@ -1,5 +1,5 @@ -import { forwardRef, useEffect, useImperativeHandle, useRef } from "react"; import { useTheme } from "@mui/material"; +import { forwardRef, useEffect, useImperativeHandle, useRef } from "react"; const maxPoint = 30; diff --git a/src/components/layout/update-button.tsx b/src/components/layout/update-button.tsx index 74e9e7366..6de2e5531 100644 --- a/src/components/layout/update-button.tsx +++ b/src/components/layout/update-button.tsx @@ -1,9 +1,11 @@ -import useSWR from "swr"; -import { useRef } from "react"; import { Button } from "@mui/material"; import { check } from "@tauri-apps/plugin-updater"; -import { UpdateViewer } from "../setting/mods/update-viewer"; +import { useRef } from "react"; +import useSWR from "swr"; + import { DialogRef } from "../base"; +import { UpdateViewer } from "../setting/mods/update-viewer"; + import { useVerge } from "@/hooks/use-verge"; interface Props { diff --git a/src/components/layout/use-custom-theme.ts b/src/components/layout/use-custom-theme.ts index 1deba5b79..1bc05b26a 100644 --- a/src/components/layout/use-custom-theme.ts +++ b/src/components/layout/use-custom-theme.ts @@ -1,6 +1,3 @@ -import { useVerge } from "@/hooks/use-verge"; -import { defaultDarkTheme, defaultTheme } from "@/pages/_theme"; -import { useSetThemeMode, useThemeMode } from "@/services/states"; import { alpha, createTheme, Theme as MuiTheme, Shadows } from "@mui/material"; import { arSD as arXDataGrid, @@ -17,6 +14,10 @@ import { Theme as TauriOsTheme } from "@tauri-apps/api/window"; import { useEffect, useMemo } from "react"; import { useTranslation } from "react-i18next"; +import { useVerge } from "@/hooks/use-verge"; +import { defaultDarkTheme, defaultTheme } from "@/pages/_theme"; +import { useSetThemeMode, useThemeMode } from "@/services/states"; + const languagePackMap: Record = { zh: { ...zhXDataGrid }, fa: { ...faXDataGrid }, diff --git a/src/components/log/log-item.tsx b/src/components/log/log-item.tsx index 235514730..3b7a8dee5 100644 --- a/src/components/log/log-item.tsx +++ b/src/components/log/log-item.tsx @@ -1,4 +1,5 @@ import { styled, Box } from "@mui/material"; + import { SearchState } from "@/components/base/base-search-box"; const Item = styled(Box)(({ theme: { palette, typography } }) => ({ diff --git a/src/components/profile/confirm-viewer.tsx b/src/components/profile/confirm-viewer.tsx index 7610abea1..d99eb4262 100644 --- a/src/components/profile/confirm-viewer.tsx +++ b/src/components/profile/confirm-viewer.tsx @@ -1,5 +1,3 @@ -import { useEffect } from "react"; -import { useTranslation } from "react-i18next"; import { Button, Dialog, @@ -7,6 +5,8 @@ import { DialogContent, DialogTitle, } from "@mui/material"; +import { useEffect } from "react"; +import { useTranslation } from "react-i18next"; interface Props { open: boolean; diff --git a/src/components/profile/editor-viewer.tsx b/src/components/profile/editor-viewer.tsx index 7a0e1dd32..a095919fd 100644 --- a/src/components/profile/editor-viewer.tsx +++ b/src/components/profile/editor-viewer.tsx @@ -1,6 +1,8 @@ -import { ReactNode, useEffect, useRef, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; +import { + FormatPaintRounded, + OpenInFullRounded, + CloseFullscreenRounded, +} from "@mui/icons-material"; import { Button, ButtonGroup, @@ -10,25 +12,23 @@ import { DialogTitle, IconButton, } from "@mui/material"; -import { - FormatPaintRounded, - OpenInFullRounded, - CloseFullscreenRounded, -} from "@mui/icons-material"; -import { useThemeMode } from "@/services/states"; -import { nanoid } from "nanoid"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; -import { showNotice } from "@/services/noticeService"; -import getSystem from "@/utils/get-system"; -import debounce from "@/utils/debounce"; - -import * as monaco from "monaco-editor"; -import MonacoEditor from "react-monaco-editor"; -import { configureMonacoYaml } from "monaco-yaml"; +import { useLockFn } from "ahooks"; import { type JSONSchema7 } from "json-schema"; -import metaSchema from "meta-json-schema/schemas/meta-json-schema.json"; import mergeSchema from "meta-json-schema/schemas/clash-verge-merge-json-schema.json"; +import metaSchema from "meta-json-schema/schemas/meta-json-schema.json"; +import * as monaco from "monaco-editor"; +import { configureMonacoYaml } from "monaco-yaml"; +import { nanoid } from "nanoid"; +import { ReactNode, useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import MonacoEditor from "react-monaco-editor"; import pac from "types-pac/pac.d.ts?raw"; + +import { showNotice } from "@/services/noticeService"; +import { useThemeMode } from "@/services/states"; +import debounce from "@/utils/debounce"; +import getSystem from "@/utils/get-system"; const appWindow = getCurrentWebviewWindow(); type Language = "yaml" | "javascript" | "css"; diff --git a/src/components/profile/file-input.tsx b/src/components/profile/file-input.tsx index 326dfca77..5d8511b76 100644 --- a/src/components/profile/file-input.tsx +++ b/src/components/profile/file-input.tsx @@ -1,7 +1,7 @@ -import { useRef, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { Box, Button, Typography } from "@mui/material"; +import { useLockFn } from "ahooks"; +import { useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; interface Props { onChange: (file: File, value: string) => void; diff --git a/src/components/profile/group-item.tsx b/src/components/profile/group-item.tsx index 04f7e3386..e8e0f63ba 100644 --- a/src/components/profile/group-item.tsx +++ b/src/components/profile/group-item.tsx @@ -1,3 +1,6 @@ +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; import { Box, IconButton, @@ -6,12 +9,10 @@ import { alpha, styled, } from "@mui/material"; -import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; -import { useSortable } from "@dnd-kit/sortable"; -import { CSS } from "@dnd-kit/utilities"; -import { downloadIconCache } from "@/services/cmds"; import { convertFileSrc } from "@tauri-apps/api/core"; import { useEffect, useState } from "react"; + +import { downloadIconCache } from "@/services/cmds"; interface Props { type: "prepend" | "original" | "delete" | "append"; group: IProxyGroupConfig; diff --git a/src/components/profile/groups-editor-viewer.tsx b/src/components/profile/groups-editor-viewer.tsx index b8d3671bb..ae3df3d26 100644 --- a/src/components/profile/groups-editor-viewer.tsx +++ b/src/components/profile/groups-editor-viewer.tsx @@ -1,7 +1,3 @@ -import { useEffect, useMemo, useState } from "react"; -import { useLockFn } from "ahooks"; -import yaml from "js-yaml"; -import { useTranslation } from "react-i18next"; import { DndContext, closestCenter, @@ -15,6 +11,10 @@ import { SortableContext, sortableKeyboardCoordinates, } from "@dnd-kit/sortable"; +import { + VerticalAlignTopRounded, + VerticalAlignBottomRounded, +} from "@mui/icons-material"; import { Autocomplete, Box, @@ -30,28 +30,30 @@ import { TextField, styled, } from "@mui/material"; +import { useLockFn } from "ahooks"; import { - VerticalAlignTopRounded, - VerticalAlignBottomRounded, -} from "@mui/icons-material"; + requestIdleCallback, + cancelIdleCallback, +} from "foxact/request-idle-callback"; +import yaml from "js-yaml"; +import { useEffect, useMemo, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import MonacoEditor from "react-monaco-editor"; +import { Virtuoso } from "react-virtuoso"; + +import { BaseSearchBox } from "../base/base-search-box"; + +import { Switch } from "@/components/base"; import { GroupItem } from "@/components/profile/group-item"; import { getNetworkInterfaces, readProfileFile, saveProfileFile, } from "@/services/cmds"; -import { Switch } from "@/components/base"; -import getSystem from "@/utils/get-system"; -import { BaseSearchBox } from "../base/base-search-box"; -import { Virtuoso } from "react-virtuoso"; -import MonacoEditor from "react-monaco-editor"; -import { useThemeMode } from "@/services/states"; -import { Controller, useForm } from "react-hook-form"; import { showNotice } from "@/services/noticeService"; -import { - requestIdleCallback, - cancelIdleCallback, -} from "foxact/request-idle-callback"; +import { useThemeMode } from "@/services/states"; +import getSystem from "@/utils/get-system"; interface Props { proxiesUid: string; diff --git a/src/components/profile/log-viewer.tsx b/src/components/profile/log-viewer.tsx index f36f2b4c5..adcbd78ea 100644 --- a/src/components/profile/log-viewer.tsx +++ b/src/components/profile/log-viewer.tsx @@ -1,5 +1,3 @@ -import { Fragment } from "react"; -import { useTranslation } from "react-i18next"; import { Button, Chip, @@ -10,6 +8,9 @@ import { Divider, Typography, } from "@mui/material"; +import { Fragment } from "react"; +import { useTranslation } from "react-i18next"; + import { BaseEmpty } from "@/components/base"; interface Props { diff --git a/src/components/profile/profile-item.tsx b/src/components/profile/profile-item.tsx index 4b3e28349..aa592cae2 100644 --- a/src/components/profile/profile-item.tsx +++ b/src/components/profile/profile-item.tsx @@ -1,10 +1,6 @@ -import dayjs from "dayjs"; -import { mutate } from "swr"; -import { useEffect, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; +import { RefreshRounded, DragIndicatorRounded } from "@mui/icons-material"; import { Box, Typography, @@ -15,8 +11,20 @@ import { Menu, CircularProgress, } from "@mui/material"; -import { RefreshRounded, DragIndicatorRounded } from "@mui/icons-material"; -import { useLoadingCache, useSetLoadingCache } from "@/services/states"; +import { open } from "@tauri-apps/plugin-shell"; +import { useLockFn } from "ahooks"; +import dayjs from "dayjs"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { mutate } from "swr"; + +import { ProfileBox } from "./profile-box"; +import { ProxiesEditorViewer } from "./proxies-editor-viewer"; + +import { ConfirmViewer } from "@/components/profile/confirm-viewer"; +import { EditorViewer } from "@/components/profile/editor-viewer"; +import { GroupsEditorViewer } from "@/components/profile/groups-editor-viewer"; +import { RulesEditorViewer } from "@/components/profile/rules-editor-viewer"; import { viewProfile, readProfileFile, @@ -25,14 +33,8 @@ import { getNextUpdateTime, } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; -import { GroupsEditorViewer } from "@/components/profile/groups-editor-viewer"; -import { RulesEditorViewer } from "@/components/profile/rules-editor-viewer"; -import { EditorViewer } from "@/components/profile/editor-viewer"; -import { ProfileBox } from "./profile-box"; +import { useLoadingCache, useSetLoadingCache } from "@/services/states"; import parseTraffic from "@/utils/parse-traffic"; -import { ConfirmViewer } from "@/components/profile/confirm-viewer"; -import { open } from "@tauri-apps/plugin-shell"; -import { ProxiesEditorViewer } from "./proxies-editor-viewer"; const round = keyframes` from { transform: rotate(0deg); } to { transform: rotate(360deg); } diff --git a/src/components/profile/profile-more.tsx b/src/components/profile/profile-more.tsx index e08759656..629c4fb62 100644 --- a/src/components/profile/profile-more.tsx +++ b/src/components/profile/profile-more.tsx @@ -1,6 +1,4 @@ -import { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { useLockFn } from "ahooks"; +import { FeaturedPlayListRounded } from "@mui/icons-material"; import { Box, Badge, @@ -10,11 +8,15 @@ import { Menu, IconButton, } from "@mui/material"; -import { FeaturedPlayListRounded } from "@mui/icons-material"; -import { viewProfile, readProfileFile, saveProfileFile } from "@/services/cmds"; -import { EditorViewer } from "@/components/profile/editor-viewer"; -import { ProfileBox } from "./profile-box"; +import { useLockFn } from "ahooks"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; + import { LogViewer } from "./log-viewer"; +import { ProfileBox } from "./profile-box"; + +import { EditorViewer } from "@/components/profile/editor-viewer"; +import { viewProfile, readProfileFile, saveProfileFile } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; interface Props { diff --git a/src/components/profile/profile-viewer.tsx b/src/components/profile/profile-viewer.tsx index 2d704139c..b51f15896 100644 --- a/src/components/profile/profile-viewer.tsx +++ b/src/components/profile/profile-viewer.tsx @@ -1,13 +1,3 @@ -import { - forwardRef, - useEffect, - useImperativeHandle, - useRef, - useState, -} from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; -import { useForm, Controller } from "react-hook-form"; import { Box, FormControl, @@ -18,11 +8,23 @@ import { styled, TextField, } from "@mui/material"; -import { createProfile, patchProfile } from "@/services/cmds"; -import { BaseDialog, Switch } from "@/components/base"; import { version } from "@root/package.json"; +import { useLockFn } from "ahooks"; +import { + forwardRef, + useEffect, + useImperativeHandle, + useRef, + useState, +} from "react"; +import { useForm, Controller } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + import { FileInput } from "./file-input"; + +import { BaseDialog, Switch } from "@/components/base"; import { useProfiles } from "@/hooks/use-profiles"; +import { createProfile, patchProfile } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; interface Props { diff --git a/src/components/profile/proxies-editor-viewer.tsx b/src/components/profile/proxies-editor-viewer.tsx index ef55a52e9..8ddf7cefb 100644 --- a/src/components/profile/proxies-editor-viewer.tsx +++ b/src/components/profile/proxies-editor-viewer.tsx @@ -1,7 +1,3 @@ -import { useEffect, useMemo, useState } from "react"; -import { useLockFn } from "ahooks"; -import yaml from "js-yaml"; -import { useTranslation } from "react-i18next"; import { DndContext, closestCenter, @@ -15,6 +11,10 @@ import { SortableContext, sortableKeyboardCoordinates, } from "@dnd-kit/sortable"; +import { + VerticalAlignTopRounded, + VerticalAlignBottomRounded, +} from "@mui/icons-material"; import { Box, Button, @@ -27,19 +27,21 @@ import { TextField, styled, } from "@mui/material"; -import { - VerticalAlignTopRounded, - VerticalAlignBottomRounded, -} from "@mui/icons-material"; +import { useLockFn } from "ahooks"; +import yaml from "js-yaml"; +import { useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import MonacoEditor from "react-monaco-editor"; +import { Virtuoso } from "react-virtuoso"; + +import { BaseSearchBox } from "../base/base-search-box"; + import { ProxyItem } from "@/components/profile/proxy-item"; import { readProfileFile, saveProfileFile } from "@/services/cmds"; -import getSystem from "@/utils/get-system"; -import { BaseSearchBox } from "../base/base-search-box"; -import { Virtuoso } from "react-virtuoso"; -import MonacoEditor from "react-monaco-editor"; -import { useThemeMode } from "@/services/states"; -import parseUri from "@/utils/uri-parser"; import { showNotice } from "@/services/noticeService"; +import { useThemeMode } from "@/services/states"; +import getSystem from "@/utils/get-system"; +import parseUri from "@/utils/uri-parser"; interface Props { profileUid: string; diff --git a/src/components/profile/proxy-item.tsx b/src/components/profile/proxy-item.tsx index a8afcad4e..7efb878f0 100644 --- a/src/components/profile/proxy-item.tsx +++ b/src/components/profile/proxy-item.tsx @@ -1,3 +1,6 @@ +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; import { Box, IconButton, @@ -6,9 +9,6 @@ import { alpha, styled, } from "@mui/material"; -import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; -import { useSortable } from "@dnd-kit/sortable"; -import { CSS } from "@dnd-kit/utilities"; interface Props { type: "prepend" | "original" | "delete" | "append"; diff --git a/src/components/profile/rule-item.tsx b/src/components/profile/rule-item.tsx index 59bb34a05..38f05833f 100644 --- a/src/components/profile/rule-item.tsx +++ b/src/components/profile/rule-item.tsx @@ -1,3 +1,6 @@ +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; import { Box, IconButton, @@ -6,9 +9,6 @@ import { alpha, styled, } from "@mui/material"; -import { DeleteForeverRounded, UndoRounded } from "@mui/icons-material"; -import { useSortable } from "@dnd-kit/sortable"; -import { CSS } from "@dnd-kit/utilities"; interface Props { type: "prepend" | "original" | "delete" | "append"; ruleRaw: string; diff --git a/src/components/profile/rules-editor-viewer.tsx b/src/components/profile/rules-editor-viewer.tsx index 0e950b42f..ffa2ffa0c 100644 --- a/src/components/profile/rules-editor-viewer.tsx +++ b/src/components/profile/rules-editor-viewer.tsx @@ -1,7 +1,3 @@ -import { useEffect, useMemo, useState } from "react"; -import { useLockFn } from "ahooks"; -import yaml from "js-yaml"; -import { useTranslation } from "react-i18next"; import { DndContext, closestCenter, @@ -15,6 +11,10 @@ import { SortableContext, sortableKeyboardCoordinates, } from "@dnd-kit/sortable"; +import { + VerticalAlignTopRounded, + VerticalAlignBottomRounded, +} from "@mui/icons-material"; import { Autocomplete, Box, @@ -29,19 +29,21 @@ import { TextField, styled, } from "@mui/material"; -import { - VerticalAlignTopRounded, - VerticalAlignBottomRounded, -} from "@mui/icons-material"; -import { readProfileFile, saveProfileFile } from "@/services/cmds"; -import { Switch } from "@/components/base"; -import getSystem from "@/utils/get-system"; -import { RuleItem } from "@/components/profile/rule-item"; -import { BaseSearchBox } from "../base/base-search-box"; -import { Virtuoso } from "react-virtuoso"; +import { useLockFn } from "ahooks"; +import yaml from "js-yaml"; +import { useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; import MonacoEditor from "react-monaco-editor"; -import { useThemeMode } from "@/services/states"; +import { Virtuoso } from "react-virtuoso"; + +import { BaseSearchBox } from "../base/base-search-box"; + +import { Switch } from "@/components/base"; +import { RuleItem } from "@/components/profile/rule-item"; +import { readProfileFile, saveProfileFile } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; +import { useThemeMode } from "@/services/states"; +import getSystem from "@/utils/get-system"; interface Props { groupsUid: string; diff --git a/src/components/proxy/provider-button.tsx b/src/components/proxy/provider-button.tsx index c15a6a085..4b292109f 100644 --- a/src/components/proxy/provider-button.tsx +++ b/src/components/proxy/provider-button.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { StorageOutlined, RefreshRounded } from "@mui/icons-material"; import { Button, Box, @@ -16,13 +16,14 @@ import { alpha, styled, } from "@mui/material"; -import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; -import { proxyProviderUpdate } from "@/services/cmds"; -import { useAppData } from "@/providers/app-data-provider"; -import { showNotice } from "@/services/noticeService"; -import { StorageOutlined, RefreshRounded } from "@mui/icons-material"; import dayjs from "dayjs"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { useAppData } from "@/providers/app-data-provider"; +import { proxyProviderUpdate } from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; import parseTraffic from "@/utils/parse-traffic"; // 定义代理提供者类型 diff --git a/src/components/proxy/proxy-chain.tsx b/src/components/proxy/proxy-chain.tsx index bd30fd1fd..aca70363d 100644 --- a/src/components/proxy/proxy-chain.tsx +++ b/src/components/proxy/proxy-chain.tsx @@ -1,23 +1,3 @@ -import { useState, useCallback, useEffect, useRef } from "react"; -import { - Box, - Paper, - Typography, - IconButton, - Chip, - Alert, - useTheme, - Button, -} from "@mui/material"; -import { useTranslation } from "react-i18next"; -import { useAppData } from "@/providers/app-data-provider"; -import { - updateProxyChainConfigInRuntime, - updateProxyAndSync, - getProxies, - closeAllConnections, -} from "@/services/cmds"; -import useSWR from "swr"; import { DndContext, closestCenter, @@ -38,11 +18,30 @@ import { CSS } from "@dnd-kit/utilities"; import { Delete as DeleteIcon, DragIndicator, - ClearAll, - Save, Link, LinkOff, } from "@mui/icons-material"; +import { + Box, + Paper, + Typography, + IconButton, + Chip, + Alert, + useTheme, + Button, +} from "@mui/material"; +import { useState, useCallback, useEffect, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import useSWR from "swr"; + +import { useAppData } from "@/providers/app-data-provider"; +import { + updateProxyChainConfigInRuntime, + updateProxyAndSync, + getProxies, + closeAllConnections, +} from "@/services/cmds"; interface ProxyChainItem { id: string; diff --git a/src/components/proxy/proxy-groups.tsx b/src/components/proxy/proxy-groups.tsx index ce521c170..f0e409539 100644 --- a/src/components/proxy/proxy-groups.tsx +++ b/src/components/proxy/proxy-groups.tsx @@ -1,19 +1,20 @@ -import { useRef, useState, useEffect, useCallback, useMemo } from "react"; +import { Box, Snackbar, Alert } from "@mui/material"; import { useLockFn } from "ahooks"; -import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"; -import { providerHealthCheck, getGroupProxyDelays } from "@/services/cmds"; -import { useVerge } from "@/hooks/use-verge"; -import { useProxySelection } from "@/hooks/use-proxy-selection"; -import { BaseEmpty } from "../base"; -import { useRenderList } from "./use-render-list"; -import { ProxyRender } from "./proxy-render"; -import delayManager from "@/services/delay"; +import { useRef, useState, useEffect, useCallback } from "react"; import { useTranslation } from "react-i18next"; +import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"; + +import { BaseEmpty } from "../base"; import { ScrollTopButton } from "../layout/scroll-top-button"; -import { Box, styled, Snackbar, Alert } from "@mui/material"; -import { memo } from "react"; -import { createPortal } from "react-dom"; + import { ProxyChain } from "./proxy-chain"; +import { ProxyRender } from "./proxy-render"; +import { useRenderList } from "./use-render-list"; + +import { useProxySelection } from "@/hooks/use-proxy-selection"; +import { useVerge } from "@/hooks/use-verge"; +import { providerHealthCheck, getGroupProxyDelays } from "@/services/cmds"; +import delayManager from "@/services/delay"; interface Props { mode: string; diff --git a/src/components/proxy/proxy-head.tsx b/src/components/proxy/proxy-head.tsx index 205f729d3..aeb95c0c2 100644 --- a/src/components/proxy/proxy-head.tsx +++ b/src/components/proxy/proxy-head.tsx @@ -1,6 +1,3 @@ -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Box, IconButton, TextField, SxProps } from "@mui/material"; import { AccessTimeRounded, MyLocationRounded, @@ -14,9 +11,14 @@ import { SortByAlphaRounded, SortRounded, } from "@mui/icons-material"; -import { useVerge } from "@/hooks/use-verge"; -import type { HeadState } from "./use-head-state"; +import { Box, IconButton, TextField, SxProps } from "@mui/material"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + import type { ProxySortType } from "./use-filter-sort"; +import type { HeadState } from "./use-head-state"; + +import { useVerge } from "@/hooks/use-verge"; import delayManager from "@/services/delay"; interface Props { diff --git a/src/components/proxy/proxy-item-mini.tsx b/src/components/proxy/proxy-item-mini.tsx index 0168e5877..aa6e9a6bf 100644 --- a/src/components/proxy/proxy-item-mini.tsx +++ b/src/components/proxy/proxy-item-mini.tsx @@ -1,12 +1,13 @@ -import { useEffect, useState } from "react"; -import { useLockFn } from "ahooks"; import { CheckCircleOutlineRounded } from "@mui/icons-material"; import { alpha, Box, ListItemButton, styled, Typography } from "@mui/material"; -import { BaseLoading } from "@/components/base"; -import delayManager from "@/services/delay"; -import { useVerge } from "@/hooks/use-verge"; +import { useLockFn } from "ahooks"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; +import { BaseLoading } from "@/components/base"; +import { useVerge } from "@/hooks/use-verge"; +import delayManager from "@/services/delay"; + interface Props { group: IProxyGroupItem; proxy: IProxyItem; diff --git a/src/components/proxy/proxy-item.tsx b/src/components/proxy/proxy-item.tsx index 12bf50ab0..dff589a9f 100644 --- a/src/components/proxy/proxy-item.tsx +++ b/src/components/proxy/proxy-item.tsx @@ -1,5 +1,3 @@ -import { useEffect, useState } from "react"; -import { useLockFn } from "ahooks"; import { CheckCircleOutlineRounded } from "@mui/icons-material"; import { alpha, @@ -12,9 +10,12 @@ import { SxProps, Theme, } from "@mui/material"; +import { useLockFn } from "ahooks"; +import { useEffect, useState } from "react"; + import { BaseLoading } from "@/components/base"; -import delayManager from "@/services/delay"; import { useVerge } from "@/hooks/use-verge"; +import delayManager from "@/services/delay"; interface Props { group: IProxyGroupItem; diff --git a/src/components/proxy/proxy-render.tsx b/src/components/proxy/proxy-render.tsx index 6d7c04bf9..00b0c20e1 100644 --- a/src/components/proxy/proxy-render.tsx +++ b/src/components/proxy/proxy-render.tsx @@ -1,3 +1,8 @@ +import { + ExpandLessRounded, + ExpandMoreRounded, + InboxRounded, +} from "@mui/icons-material"; import { alpha, Box, @@ -8,22 +13,19 @@ import { Chip, Tooltip, } from "@mui/material"; -import { - ExpandLessRounded, - ExpandMoreRounded, - InboxRounded, -} from "@mui/icons-material"; -import { HeadState } from "./use-head-state"; +import { convertFileSrc } from "@tauri-apps/api/core"; +import { useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; + import { ProxyHead } from "./proxy-head"; import { ProxyItem } from "./proxy-item"; import { ProxyItemMini } from "./proxy-item-mini"; +import { HeadState } from "./use-head-state"; import type { IRenderItem } from "./use-render-list"; + import { useVerge } from "@/hooks/use-verge"; -import { useThemeMode } from "@/services/states"; -import { useEffect, useMemo, useState } from "react"; -import { convertFileSrc } from "@tauri-apps/api/core"; import { downloadIconCache } from "@/services/cmds"; -import { useTranslation } from "react-i18next"; +import { useThemeMode } from "@/services/states"; interface RenderProps { item: IRenderItem; diff --git a/src/components/proxy/use-filter-sort.ts b/src/components/proxy/use-filter-sort.ts index ca7c6527c..10880da95 100644 --- a/src/components/proxy/use-filter-sort.ts +++ b/src/components/proxy/use-filter-sort.ts @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from "react"; + import delayManager from "@/services/delay"; // default | delay | alphabet diff --git a/src/components/proxy/use-head-state.ts b/src/components/proxy/use-head-state.ts index d6c311355..4a43d26e6 100644 --- a/src/components/proxy/use-head-state.ts +++ b/src/components/proxy/use-head-state.ts @@ -1,5 +1,7 @@ import { useCallback, useEffect, useState } from "react"; + import { ProxySortType } from "./use-filter-sort"; + import { useProfiles } from "@/hooks/use-profiles"; export interface HeadState { diff --git a/src/components/proxy/use-render-list.ts b/src/components/proxy/use-render-list.ts index 6db752c10..f4a00eba7 100644 --- a/src/components/proxy/use-render-list.ts +++ b/src/components/proxy/use-render-list.ts @@ -1,14 +1,16 @@ import { useEffect, useMemo } from "react"; -import { useVerge } from "@/hooks/use-verge"; +import useSWR from "swr"; + import { filterSort } from "./use-filter-sort"; -import { useWindowWidth } from "./use-window-width"; import { useHeadStateNew, DEFAULT_STATE, type HeadState, } from "./use-head-state"; +import { useWindowWidth } from "./use-window-width"; + +import { useVerge } from "@/hooks/use-verge"; import { useAppData } from "@/providers/app-data-provider"; -import useSWR from "swr"; import { getRuntimeConfig } from "@/services/cmds"; import delayManager from "@/services/delay"; diff --git a/src/components/rule/provider-button.tsx b/src/components/rule/provider-button.tsx index 478478793..622b143a7 100644 --- a/src/components/rule/provider-button.tsx +++ b/src/components/rule/provider-button.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { StorageOutlined, RefreshRounded } from "@mui/icons-material"; import { Button, Box, @@ -15,12 +15,13 @@ import { alpha, styled, } from "@mui/material"; -import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; -import { ruleProviderUpdate } from "@/services/cmds"; -import { StorageOutlined, RefreshRounded } from "@mui/icons-material"; -import { useAppData } from "@/providers/app-data-provider"; import dayjs from "dayjs"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { useAppData } from "@/providers/app-data-provider"; +import { ruleProviderUpdate } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; // 定义规则提供者类型 diff --git a/src/components/setting/mods/backup-config-viewer.tsx b/src/components/setting/mods/backup-config-viewer.tsx index cddf40aab..6821e50d8 100644 --- a/src/components/setting/mods/backup-config-viewer.tsx +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -1,9 +1,5 @@ -import { useState, useRef, memo, useEffect } from "react"; -import { useTranslation } from "react-i18next"; -import { useForm } from "react-hook-form"; -import { useVerge } from "@/hooks/use-verge"; -import { isValidUrl } from "@/utils/helper"; -import { useLockFn } from "ahooks"; +import Visibility from "@mui/icons-material/Visibility"; +import VisibilityOff from "@mui/icons-material/VisibilityOff"; import { TextField, Button, @@ -12,10 +8,15 @@ import { IconButton, InputAdornment, } from "@mui/material"; -import Visibility from "@mui/icons-material/Visibility"; -import VisibilityOff from "@mui/icons-material/VisibilityOff"; +import { useLockFn } from "ahooks"; +import { useState, useRef, memo, useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + +import { useVerge } from "@/hooks/use-verge"; import { saveWebdavConfig, createWebdavBackup } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; +import { isValidUrl } from "@/utils/helper"; interface BackupConfigViewerProps { onBackupSuccess: () => Promise; diff --git a/src/components/setting/mods/backup-table-viewer.tsx b/src/components/setting/mods/backup-table-viewer.tsx index 595496d02..e68da158c 100644 --- a/src/components/setting/mods/backup-table-viewer.tsx +++ b/src/components/setting/mods/backup-table-viewer.tsx @@ -1,4 +1,5 @@ -import { SVGProps, memo } from "react"; +import DeleteIcon from "@mui/icons-material/Delete"; +import RestoreIcon from "@mui/icons-material/Restore"; import { Box, Paper, @@ -14,15 +15,15 @@ import { } from "@mui/material"; import { Typography } from "@mui/material"; import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { Dayjs } from "dayjs"; +import { SVGProps, memo } from "react"; +import { useTranslation } from "react-i18next"; + import { deleteWebdavBackup, restoreWebDavBackup, restartApp, } from "@/services/cmds"; -import DeleteIcon from "@mui/icons-material/Delete"; -import RestoreIcon from "@mui/icons-material/Restore"; import { showNotice } from "@/services/noticeService"; export type BackupFile = IWebDavFile & { diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 9802d2e8d..43fc587f7 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -1,3 +1,6 @@ +import { Box, Paper, Divider } from "@mui/material"; +import dayjs from "dayjs"; +import customParseFormat from "dayjs/plugin/customParseFormat"; import { forwardRef, useImperativeHandle, @@ -6,17 +9,16 @@ import { useMemo, } from "react"; import { useTranslation } from "react-i18next"; -import { BaseDialog, DialogRef } from "@/components/base"; -import { BaseLoadingOverlay } from "@/components/base"; -import dayjs from "dayjs"; -import customParseFormat from "dayjs/plugin/customParseFormat"; + +import { BackupConfigViewer } from "./backup-config-viewer"; import { BackupTableViewer, BackupFile, DEFAULT_ROWS_PER_PAGE, } from "./backup-table-viewer"; -import { BackupConfigViewer } from "./backup-config-viewer"; -import { Box, Paper, Divider } from "@mui/material"; + +import { BaseDialog, DialogRef } from "@/components/base"; +import { BaseLoadingOverlay } from "@/components/base"; import { listWebDavBackup } from "@/services/cmds"; dayjs.extend(customParseFormat); diff --git a/src/components/setting/mods/clash-core-viewer.tsx b/src/components/setting/mods/clash-core-viewer.tsx index 1b44236f5..869b57842 100644 --- a/src/components/setting/mods/clash-core-viewer.tsx +++ b/src/components/setting/mods/clash-core-viewer.tsx @@ -1,14 +1,8 @@ -import { mutate } from "swr"; -import { forwardRef, useImperativeHandle, useState } from "react"; -import { BaseDialog, DialogRef } from "@/components/base"; -import { useTranslation } from "react-i18next"; -import { useVerge } from "@/hooks/use-verge"; -import { useLockFn } from "ahooks"; -import { LoadingButton } from "@mui/lab"; import { SwitchAccessShortcutRounded, RestartAltRounded, } from "@mui/icons-material"; +import { LoadingButton } from "@mui/lab"; import { Box, Chip, @@ -17,6 +11,13 @@ import { ListItemButton, ListItemText, } from "@mui/material"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { mutate } from "swr"; + +import { BaseDialog, DialogRef } from "@/components/base"; +import { useVerge } from "@/hooks/use-verge"; import { changeClashCore, restartCore } from "@/services/cmds"; import { closeAllConnections, diff --git a/src/components/setting/mods/clash-port-viewer.tsx b/src/components/setting/mods/clash-port-viewer.tsx index 00f4606f9..ec4958040 100644 --- a/src/components/setting/mods/clash-port-viewer.tsx +++ b/src/components/setting/mods/clash-port-viewer.tsx @@ -1,8 +1,3 @@ -import { BaseDialog, Switch } from "@/components/base"; -import { useClashInfo } from "@/hooks/use-clash"; -import { useVerge } from "@/hooks/use-verge"; -import { showNotice } from "@/services/noticeService"; -import getSystem from "@/utils/get-system"; import { Shuffle } from "@mui/icons-material"; import { CircularProgress, @@ -17,6 +12,12 @@ import { useLockFn, useRequest } from "ahooks"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; +import { BaseDialog, Switch } from "@/components/base"; +import { useClashInfo } from "@/hooks/use-clash"; +import { useVerge } from "@/hooks/use-verge"; +import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; + const OS = getSystem(); interface ClashPortViewerProps {} diff --git a/src/components/setting/mods/config-viewer.tsx b/src/components/setting/mods/config-viewer.tsx index 971beef07..26609caa0 100644 --- a/src/components/setting/mods/config-viewer.tsx +++ b/src/components/setting/mods/config-viewer.tsx @@ -1,9 +1,10 @@ +import { Box, Chip } from "@mui/material"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; -import { Box, Chip } from "@mui/material"; -import { getRuntimeYaml } from "@/services/cmds"; + import { DialogRef } from "@/components/base"; import { EditorViewer } from "@/components/profile/editor-viewer"; +import { getRuntimeYaml } from "@/services/cmds"; export const ConfigViewer = forwardRef((_, ref) => { const { t } = useTranslation(); diff --git a/src/components/setting/mods/controller-viewer.tsx b/src/components/setting/mods/controller-viewer.tsx index 9c9282c06..f39b928b6 100644 --- a/src/components/setting/mods/controller-viewer.tsx +++ b/src/components/setting/mods/controller-viewer.tsx @@ -1,7 +1,3 @@ -import { BaseDialog, DialogRef, Switch } from "@/components/base"; -import { useClashInfo } from "@/hooks/use-clash"; -import { useVerge } from "@/hooks/use-verge"; -import { showNotice } from "@/services/noticeService"; import { ContentCopy } from "@mui/icons-material"; import { Alert, @@ -19,6 +15,11 @@ import { useLockFn } from "ahooks"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; +import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { useClashInfo } from "@/hooks/use-clash"; +import { useVerge } from "@/hooks/use-verge"; +import { showNotice } from "@/services/noticeService"; + export const ControllerViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); diff --git a/src/components/setting/mods/dns-viewer.tsx b/src/components/setting/mods/dns-viewer.tsx index 6d67c0627..f076dbc06 100644 --- a/src/components/setting/mods/dns-viewer.tsx +++ b/src/components/setting/mods/dns-viewer.tsx @@ -1,6 +1,4 @@ -import { forwardRef, useImperativeHandle, useState, useEffect } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; +import { RestartAltRounded } from "@mui/icons-material"; import { Box, Button, @@ -14,15 +12,18 @@ import { TextField, Typography, } from "@mui/material"; -import { RestartAltRounded } from "@mui/icons-material"; -import { useClash } from "@/hooks/use-clash"; -import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { invoke } from "@tauri-apps/api/core"; +import { useLockFn } from "ahooks"; import yaml from "js-yaml"; +import { forwardRef, useImperativeHandle, useState, useEffect } from "react"; +import { useTranslation } from "react-i18next"; import MonacoEditor from "react-monaco-editor"; + +import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { useClash } from "@/hooks/use-clash"; +import { showNotice } from "@/services/noticeService"; import { useThemeMode } from "@/services/states"; import getSystem from "@/utils/get-system"; -import { invoke } from "@tauri-apps/api/core"; -import { showNotice } from "@/services/noticeService"; const Item = styled(ListItem)(() => ({ padding: "5px 2px", diff --git a/src/components/setting/mods/external-controller-cors.tsx b/src/components/setting/mods/external-controller-cors.tsx index 8811e1aa0..d2522f359 100644 --- a/src/components/setting/mods/external-controller-cors.tsx +++ b/src/components/setting/mods/external-controller-cors.tsx @@ -1,12 +1,13 @@ -import { BaseDialog, Switch } from "@/components/base"; -import { useClash } from "@/hooks/use-clash"; -import { showNotice } from "@/services/noticeService"; import { Delete as DeleteIcon } from "@mui/icons-material"; import { Box, Button, Divider, List, ListItem, TextField } from "@mui/material"; import { useLockFn, useRequest } from "ahooks"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; +import { BaseDialog, Switch } from "@/components/base"; +import { useClash } from "@/hooks/use-clash"; +import { showNotice } from "@/services/noticeService"; + // 定义开发环境的URL列表 // 这些URL在开发模式下会被自动包含在允许的来源中 // 在生产环境中,这些URL会被过滤掉 diff --git a/src/components/setting/mods/guard-state.tsx b/src/components/setting/mods/guard-state.tsx index 7abbd7565..0e632ad8c 100644 --- a/src/components/setting/mods/guard-state.tsx +++ b/src/components/setting/mods/guard-state.tsx @@ -1,4 +1,5 @@ import { cloneElement, isValidElement, ReactNode, useRef } from "react"; + import noop from "@/utils/noop"; interface Props { diff --git a/src/components/setting/mods/hotkey-input.tsx b/src/components/setting/mods/hotkey-input.tsx index 2e767465c..3e746936c 100644 --- a/src/components/setting/mods/hotkey-input.tsx +++ b/src/components/setting/mods/hotkey-input.tsx @@ -1,9 +1,10 @@ -import { useRef, useState } from "react"; -import { alpha, Box, IconButton, styled } from "@mui/material"; import { DeleteRounded } from "@mui/icons-material"; -import { parseHotkey } from "@/utils/parse-hotkey"; +import { alpha, Box, IconButton, styled } from "@mui/material"; +import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; +import { parseHotkey } from "@/utils/parse-hotkey"; + const KeyWrapper = styled("div")(({ theme }) => ({ position: "relative", width: 165, diff --git a/src/components/setting/mods/hotkey-viewer.tsx b/src/components/setting/mods/hotkey-viewer.tsx index d1603cbbb..00f9f37fb 100644 --- a/src/components/setting/mods/hotkey-viewer.tsx +++ b/src/components/setting/mods/hotkey-viewer.tsx @@ -1,10 +1,12 @@ +import { styled, Typography } from "@mui/material"; +import { useLockFn } from "ahooks"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; -import { useLockFn } from "ahooks"; -import { styled, Typography } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; -import { BaseDialog, DialogRef, Switch } from "@/components/base"; + import { HotkeyInput } from "./hotkey-input"; + +import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { useVerge } from "@/hooks/use-verge"; import { showNotice } from "@/services/noticeService"; const ItemWrapper = styled("div")` diff --git a/src/components/setting/mods/layout-viewer.tsx b/src/components/setting/mods/layout-viewer.tsx index 2b498b76e..dd00e391e 100644 --- a/src/components/setting/mods/layout-viewer.tsx +++ b/src/components/setting/mods/layout-viewer.tsx @@ -1,5 +1,3 @@ -import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; -import { useTranslation } from "react-i18next"; import { List, Button, @@ -10,17 +8,21 @@ import { ListItemText, Box, } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; +import { convertFileSrc } from "@tauri-apps/api/core"; +import { join } from "@tauri-apps/api/path"; +import { open as openDialog } from "@tauri-apps/plugin-dialog"; +import { exists } from "@tauri-apps/plugin-fs"; +import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { GuardState } from "./guard-state"; + import { BaseDialog, DialogRef, Switch } from "@/components/base"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { GuardState } from "./guard-state"; -import { open as openDialog } from "@tauri-apps/plugin-dialog"; -import { convertFileSrc } from "@tauri-apps/api/core"; +import { useVerge } from "@/hooks/use-verge"; import { copyIconFile, getAppDir } from "@/services/cmds"; -import { join } from "@tauri-apps/api/path"; -import { exists } from "@tauri-apps/plugin-fs"; -import getSystem from "@/utils/get-system"; import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; const OS = getSystem(); diff --git a/src/components/setting/mods/lite-mode-viewer.tsx b/src/components/setting/mods/lite-mode-viewer.tsx index 1e0834208..6c2436675 100644 --- a/src/components/setting/mods/lite-mode-viewer.tsx +++ b/src/components/setting/mods/lite-mode-viewer.tsx @@ -1,6 +1,3 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { List, ListItem, @@ -9,9 +6,13 @@ import { Typography, InputAdornment, } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + import { BaseDialog, DialogRef, Switch } from "@/components/base"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; +import { useVerge } from "@/hooks/use-verge"; import { entry_lightweight_mode } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index 0de6285f0..02ca53695 100644 --- a/src/components/setting/mods/misc-viewer.tsx +++ b/src/components/setting/mods/misc-viewer.tsx @@ -1,6 +1,3 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { InputAdornment, List, @@ -10,9 +7,13 @@ import { Select, TextField, } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + import { BaseDialog, DialogRef, Switch } from "@/components/base"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; +import { useVerge } from "@/hooks/use-verge"; import { showNotice } from "@/services/noticeService"; export const MiscViewer = forwardRef((props, ref) => { diff --git a/src/components/setting/mods/network-interface-viewer.tsx b/src/components/setting/mods/network-interface-viewer.tsx index 9cd7dbcca..912529eb7 100644 --- a/src/components/setting/mods/network-interface-viewer.tsx +++ b/src/components/setting/mods/network-interface-viewer.tsx @@ -1,12 +1,13 @@ +import { ContentCopyRounded } from "@mui/icons-material"; +import { alpha, Box, Button, IconButton } from "@mui/material"; +import { writeText } from "@tauri-apps/plugin-clipboard-manager"; import { forwardRef, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; +import useSWR from "swr"; + import { BaseDialog, DialogRef } from "@/components/base"; import { getNetworkInterfacesInfo } from "@/services/cmds"; -import { alpha, Box, Button, IconButton } from "@mui/material"; -import { ContentCopyRounded } from "@mui/icons-material"; -import { writeText } from "@tauri-apps/plugin-clipboard-manager"; import { showNotice } from "@/services/noticeService"; -import useSWR from "swr"; export const NetworkInterfaceViewer = forwardRef((props, ref) => { const { t } = useTranslation(); diff --git a/src/components/setting/mods/password-input.tsx b/src/components/setting/mods/password-input.tsx index a42b6a45b..ae8dd7fd8 100644 --- a/src/components/setting/mods/password-input.tsx +++ b/src/components/setting/mods/password-input.tsx @@ -1,5 +1,3 @@ -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; import { Button, Dialog, @@ -8,6 +6,8 @@ import { DialogTitle, TextField, } from "@mui/material"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; interface Props { onConfirm: (passwd: string) => Promise; diff --git a/src/components/setting/mods/setting-comp.tsx b/src/components/setting/mods/setting-comp.tsx index 87cf3f38f..1575e3546 100644 --- a/src/components/setting/mods/setting-comp.tsx +++ b/src/components/setting/mods/setting-comp.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode, useState } from "react"; +import { ChevronRightRounded } from "@mui/icons-material"; import { Box, List, @@ -7,8 +7,9 @@ import { ListItemText, ListSubheader, } from "@mui/material"; -import { ChevronRightRounded } from "@mui/icons-material"; import CircularProgress from "@mui/material/CircularProgress"; +import React, { ReactNode, useState } from "react"; + import isAsyncFunction from "@/utils/is-async-function"; interface ItemProps { diff --git a/src/components/setting/mods/sysproxy-viewer.tsx b/src/components/setting/mods/sysproxy-viewer.tsx index 1ba1c91d0..329d857ed 100644 --- a/src/components/setting/mods/sysproxy-viewer.tsx +++ b/src/components/setting/mods/sysproxy-viewer.tsx @@ -1,19 +1,3 @@ -import { BaseDialog, DialogRef, Switch } from "@/components/base"; -import { BaseFieldset } from "@/components/base/base-fieldset"; -import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { EditorViewer } from "@/components/profile/editor-viewer"; -import { useVerge } from "@/hooks/use-verge"; -import { useAppData } from "@/providers/app-data-provider"; -import { getClashConfig } from "@/services/cmds"; -import { - getAutotemProxy, - getNetworkInterfacesInfo, - getSystemHostname, - getSystemProxy, - patchVergeConfig, -} from "@/services/cmds"; -import { showNotice } from "@/services/noticeService"; -import getSystem from "@/utils/get-system"; import { EditRounded } from "@mui/icons-material"; import { Autocomplete, @@ -37,6 +21,23 @@ import { import { useTranslation } from "react-i18next"; import useSWR, { mutate } from "swr"; +import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { BaseFieldset } from "@/components/base/base-fieldset"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; +import { EditorViewer } from "@/components/profile/editor-viewer"; +import { useVerge } from "@/hooks/use-verge"; +import { useAppData } from "@/providers/app-data-provider"; +import { getClashConfig } from "@/services/cmds"; +import { + getAutotemProxy, + getNetworkInterfacesInfo, + getSystemHostname, + getSystemProxy, + patchVergeConfig, +} from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; + const DEFAULT_PAC = `function FindProxyForURL(url, host) { return "PROXY %proxy_host%:%mixed-port%; SOCKS5 %proxy_host%:%mixed-port%; DIRECT;"; }`; diff --git a/src/components/setting/mods/theme-mode-switch.tsx b/src/components/setting/mods/theme-mode-switch.tsx index 29ae9ef0c..edd3fab92 100644 --- a/src/components/setting/mods/theme-mode-switch.tsx +++ b/src/components/setting/mods/theme-mode-switch.tsx @@ -1,5 +1,5 @@ -import { useTranslation } from "react-i18next"; import { Button, ButtonGroup } from "@mui/material"; +import { useTranslation } from "react-i18next"; type ThemeValue = IVergeConfig["theme_mode"]; diff --git a/src/components/setting/mods/theme-viewer.tsx b/src/components/setting/mods/theme-viewer.tsx index f4e535b87..e3f764c5e 100644 --- a/src/components/setting/mods/theme-viewer.tsx +++ b/src/components/setting/mods/theme-viewer.tsx @@ -1,6 +1,4 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; +import { EditRounded } from "@mui/icons-material"; import { Button, List, @@ -10,11 +8,14 @@ import { TextField, useTheme, } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; -import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + import { BaseDialog, DialogRef } from "@/components/base"; import { EditorViewer } from "@/components/profile/editor-viewer"; -import { EditRounded } from "@mui/icons-material"; +import { useVerge } from "@/hooks/use-verge"; +import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; import { showNotice } from "@/services/noticeService"; export const ThemeViewer = forwardRef((props, ref) => { diff --git a/src/components/setting/mods/tun-viewer.tsx b/src/components/setting/mods/tun-viewer.tsx index 3468f34a2..18f2c8ce2 100644 --- a/src/components/setting/mods/tun-viewer.tsx +++ b/src/components/setting/mods/tun-viewer.tsx @@ -1,6 +1,3 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { List, ListItem, @@ -10,12 +7,17 @@ import { Button, TextField, } from "@mui/material"; -import { useClash } from "@/hooks/use-clash"; -import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + import { StackModeSwitch } from "./stack-mode-switch"; + +import { BaseDialog, DialogRef, Switch } from "@/components/base"; +import { useClash } from "@/hooks/use-clash"; import { enhanceProfiles } from "@/services/cmds"; -import getSystem from "@/utils/get-system"; import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; const OS = getSystem(); diff --git a/src/components/setting/mods/update-viewer.tsx b/src/components/setting/mods/update-viewer.tsx index e4780be7d..3b67e1751 100644 --- a/src/components/setting/mods/update-viewer.tsx +++ b/src/components/setting/mods/update-viewer.tsx @@ -1,4 +1,9 @@ -import useSWR from "swr"; +import { Box, LinearProgress, Button } from "@mui/material"; +import { Event, UnlistenFn } from "@tauri-apps/api/event"; +import { relaunch } from "@tauri-apps/plugin-process"; +import { open as openUrl } from "@tauri-apps/plugin-shell"; +import { check as checkUpdate } from "@tauri-apps/plugin-updater"; +import { useLockFn } from "ahooks"; import { forwardRef, useImperativeHandle, @@ -6,19 +11,15 @@ import { useMemo, useEffect, } from "react"; -import { useLockFn } from "ahooks"; -import { Box, LinearProgress, Button } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { relaunch } from "@tauri-apps/plugin-process"; -import { check as checkUpdate } from "@tauri-apps/plugin-updater"; -import { BaseDialog, DialogRef } from "@/components/base"; -import { useUpdateState, useSetUpdateState } from "@/services/states"; -import { Event, UnlistenFn } from "@tauri-apps/api/event"; -import { portableFlag } from "@/pages/_layout"; -import { open as openUrl } from "@tauri-apps/plugin-shell"; import ReactMarkdown from "react-markdown"; +import useSWR from "swr"; + +import { BaseDialog, DialogRef } from "@/components/base"; import { useListen } from "@/hooks/use-listen"; +import { portableFlag } from "@/pages/_layout"; import { showNotice } from "@/services/noticeService"; +import { useUpdateState, useSetUpdateState } from "@/services/states"; export const UpdateViewer = forwardRef((props, ref) => { const { t } = useTranslation(); diff --git a/src/components/setting/mods/web-ui-item.tsx b/src/components/setting/mods/web-ui-item.tsx index 73d0681d6..577f6413d 100644 --- a/src/components/setting/mods/web-ui-item.tsx +++ b/src/components/setting/mods/web-ui-item.tsx @@ -1,11 +1,3 @@ -import { useState } from "react"; -import { - Divider, - IconButton, - Stack, - TextField, - Typography, -} from "@mui/material"; import { CheckRounded, CloseRounded, @@ -13,6 +5,14 @@ import { EditRounded, OpenInNewRounded, } from "@mui/icons-material"; +import { + Divider, + IconButton, + Stack, + TextField, + Typography, +} from "@mui/material"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; interface Props { diff --git a/src/components/setting/mods/web-ui-viewer.tsx b/src/components/setting/mods/web-ui-viewer.tsx index 34219deaf..7e0d9e86c 100644 --- a/src/components/setting/mods/web-ui-viewer.tsx +++ b/src/components/setting/mods/web-ui-viewer.tsx @@ -1,12 +1,14 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { Button, Box, Typography } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; -import { openWebUrl } from "@/services/cmds"; +import { useLockFn } from "ahooks"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { WebUIItem } from "./web-ui-item"; + import { BaseDialog, BaseEmpty, DialogRef } from "@/components/base"; import { useClashInfo } from "@/hooks/use-clash"; -import { WebUIItem } from "./web-ui-item"; +import { useVerge } from "@/hooks/use-verge"; +import { openWebUrl } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; export const WebUIViewer = forwardRef((props, ref) => { diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index d9b3d17dd..908a24c77 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -1,26 +1,28 @@ -import { DialogRef, Switch } from "@/components/base"; -import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { useClash } from "@/hooks/use-clash"; -import { useVerge } from "@/hooks/use-verge"; -import { updateGeoData } from "@/services/cmds"; -import { invoke_uwp_tool } from "@/services/cmds"; -import { showNotice } from "@/services/noticeService"; -import getSystem from "@/utils/get-system"; import { LanRounded, SettingsRounded } from "@mui/icons-material"; import { MenuItem, Select, TextField, Typography } from "@mui/material"; import { invoke } from "@tauri-apps/api/core"; import { useLockFn } from "ahooks"; import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; + import { ClashCoreViewer } from "./mods/clash-core-viewer"; import { ClashPortViewer } from "./mods/clash-port-viewer"; import { ControllerViewer } from "./mods/controller-viewer"; import { DnsViewer } from "./mods/dns-viewer"; +import { HeaderConfiguration } from "./mods/external-controller-cors"; import { GuardState } from "./mods/guard-state"; import { NetworkInterfaceViewer } from "./mods/network-interface-viewer"; import { SettingItem, SettingList } from "./mods/setting-comp"; import { WebUIViewer } from "./mods/web-ui-viewer"; -import { HeaderConfiguration } from "./mods/external-controller-cors"; + +import { DialogRef, Switch } from "@/components/base"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; +import { useClash } from "@/hooks/use-clash"; +import { useVerge } from "@/hooks/use-verge"; +import { invoke_uwp_tool } from "@/services/cmds"; +import { updateGeoData } from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; const isWIN = getSystem() === "windows"; diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index c015b4ff1..a4bf0ce47 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -1,18 +1,19 @@ -import { mutate } from "swr"; +import { WarningRounded } from "@mui/icons-material"; +import { Tooltip } from "@mui/material"; import React, { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { WarningRounded } from "@mui/icons-material"; -import { useVerge } from "@/hooks/use-verge"; -import { DialogRef, Switch } from "@/components/base"; -import { SettingList, SettingItem } from "./mods/setting-comp"; +import { mutate } from "swr"; + import { GuardState } from "./mods/guard-state"; +import { SettingList, SettingItem } from "./mods/setting-comp"; import { SysproxyViewer } from "./mods/sysproxy-viewer"; import { TunViewer } from "./mods/tun-viewer"; -import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { Tooltip } from "@mui/material"; -import { useSystemState } from "@/hooks/use-system-state"; -import ProxyControlSwitches from "@/components/shared/ProxyControlSwitches"; +import { DialogRef, Switch } from "@/components/base"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; +import ProxyControlSwitches from "@/components/shared/ProxyControlSwitches"; +import { useSystemState } from "@/hooks/use-system-state"; +import { useVerge } from "@/hooks/use-verge"; import { showNotice } from "@/services/noticeService"; interface Props { diff --git a/src/components/setting/setting-verge-advanced.tsx b/src/components/setting/setting-verge-advanced.tsx index 918582bbe..0de987479 100644 --- a/src/components/setting/setting-verge-advanced.tsx +++ b/src/components/setting/setting-verge-advanced.tsx @@ -1,6 +1,22 @@ +import { ContentCopyRounded } from "@mui/icons-material"; +import { Typography } from "@mui/material"; +import { version } from "@root/package.json"; +import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { useCallback, useRef } from "react"; import { useTranslation } from "react-i18next"; -import { Typography } from "@mui/material"; + +import { BackupViewer } from "./mods/backup-viewer"; +import { ConfigViewer } from "./mods/config-viewer"; +import { HotkeyViewer } from "./mods/hotkey-viewer"; +import { LayoutViewer } from "./mods/layout-viewer"; +import { LiteModeViewer } from "./mods/lite-mode-viewer"; +import { MiscViewer } from "./mods/misc-viewer"; +import { SettingList, SettingItem } from "./mods/setting-comp"; +import { ThemeViewer } from "./mods/theme-viewer"; +import { UpdateViewer } from "./mods/update-viewer"; + +import { DialogRef } from "@/components/base"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; import { exitApp, openAppDir, @@ -9,20 +25,6 @@ import { openDevTools, exportDiagnosticInfo, } from "@/services/cmds"; -import { check as checkUpdate } from "@tauri-apps/plugin-updater"; -import { version } from "@root/package.json"; -import { DialogRef } from "@/components/base"; -import { SettingList, SettingItem } from "./mods/setting-comp"; -import { ConfigViewer } from "./mods/config-viewer"; -import { HotkeyViewer } from "./mods/hotkey-viewer"; -import { MiscViewer } from "./mods/misc-viewer"; -import { ThemeViewer } from "./mods/theme-viewer"; -import { LayoutViewer } from "./mods/layout-viewer"; -import { UpdateViewer } from "./mods/update-viewer"; -import { BackupViewer } from "./mods/backup-viewer"; -import { LiteModeViewer } from "./mods/lite-mode-viewer"; -import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { ContentCopyRounded } from "@mui/icons-material"; import { showNotice } from "@/services/noticeService"; interface Props { diff --git a/src/components/setting/setting-verge-basic.tsx b/src/components/setting/setting-verge-basic.tsx index 34b7d7c58..1ce6c124d 100644 --- a/src/components/setting/setting-verge-basic.tsx +++ b/src/components/setting/setting-verge-basic.tsx @@ -1,26 +1,28 @@ +import { ContentCopyRounded } from "@mui/icons-material"; +import { Button, MenuItem, Select, Input } from "@mui/material"; +import { open } from "@tauri-apps/plugin-dialog"; import { useCallback, useRef } from "react"; import { useTranslation } from "react-i18next"; -import { open } from "@tauri-apps/plugin-dialog"; -import { Button, MenuItem, Select, Input } from "@mui/material"; -import { copyClashEnv } from "@/services/cmds"; -import { useVerge } from "@/hooks/use-verge"; -import { DialogRef } from "@/components/base"; + +import { BackupViewer } from "./mods/backup-viewer"; +import { ConfigViewer } from "./mods/config-viewer"; +import { GuardState } from "./mods/guard-state"; +import { HotkeyViewer } from "./mods/hotkey-viewer"; +import { LayoutViewer } from "./mods/layout-viewer"; +import { MiscViewer } from "./mods/misc-viewer"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { ThemeModeSwitch } from "./mods/theme-mode-switch"; -import { ConfigViewer } from "./mods/config-viewer"; -import { HotkeyViewer } from "./mods/hotkey-viewer"; -import { MiscViewer } from "./mods/misc-viewer"; import { ThemeViewer } from "./mods/theme-viewer"; -import { GuardState } from "./mods/guard-state"; -import { LayoutViewer } from "./mods/layout-viewer"; import { UpdateViewer } from "./mods/update-viewer"; -import { BackupViewer } from "./mods/backup-viewer"; -import getSystem from "@/utils/get-system"; -import { routers } from "@/pages/_routers"; + +import { DialogRef } from "@/components/base"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { ContentCopyRounded } from "@mui/icons-material"; +import { useVerge } from "@/hooks/use-verge"; +import { routers } from "@/pages/_routers"; +import { copyClashEnv } from "@/services/cmds"; import { supportedLanguages } from "@/services/i18n"; import { showNotice } from "@/services/noticeService"; +import getSystem from "@/utils/get-system"; interface Props { onError?: (err: Error) => void; diff --git a/src/components/shared/ProxyControlSwitches.tsx b/src/components/shared/ProxyControlSwitches.tsx index e2f4839b7..f1ffe8b12 100644 --- a/src/components/shared/ProxyControlSwitches.tsx +++ b/src/components/shared/ProxyControlSwitches.tsx @@ -1,5 +1,3 @@ -import React, { useRef, useCallback } from "react"; -import { useTranslation } from "react-i18next"; import { SettingsRounded, PlayCircleOutlineRounded, @@ -9,18 +7,21 @@ import { WarningRounded, } from "@mui/icons-material"; import { Box, Typography, alpha, useTheme } from "@mui/material"; +import { useLockFn } from "ahooks"; +import React, { useRef, useCallback } from "react"; +import { useTranslation } from "react-i18next"; + import { DialogRef, Switch } from "@/components/base"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; import { GuardState } from "@/components/setting/mods/guard-state"; import { SysproxyViewer } from "@/components/setting/mods/sysproxy-viewer"; import { TunViewer } from "@/components/setting/mods/tun-viewer"; -import { useVerge } from "@/hooks/use-verge"; import { useSystemProxyState } from "@/hooks/use-system-proxy-state"; import { useSystemState } from "@/hooks/use-system-state"; -import { showNotice } from "@/services/noticeService"; +import { useVerge } from "@/hooks/use-verge"; import { useServiceInstaller } from "@/hooks/useServiceInstaller"; -import { useLockFn } from "ahooks"; import { useServiceUninstaller } from "@/hooks/useServiceUninstaller"; +import { showNotice } from "@/services/noticeService"; interface ProxySwitchProps { label?: string; diff --git a/src/components/test/test-item.tsx b/src/components/test/test-item.tsx index 50ca11f0c..5408866c8 100644 --- a/src/components/test/test-item.tsx +++ b/src/components/test/test-item.tsx @@ -1,18 +1,20 @@ -import { useEffect, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; -import { Box, Divider, MenuItem, Menu, styled, alpha } from "@mui/material"; -import { BaseLoading } from "@/components/base"; import { LanguageRounded } from "@mui/icons-material"; -import { showNotice } from "@/services/noticeService"; -import { TestBox } from "./test-box"; -import delayManager from "@/services/delay"; -import { cmdTestDelay, downloadIconCache } from "@/services/cmds"; -import { UnlistenFn } from "@tauri-apps/api/event"; +import { Box, Divider, MenuItem, Menu, styled, alpha } from "@mui/material"; import { convertFileSrc } from "@tauri-apps/api/core"; +import { UnlistenFn } from "@tauri-apps/api/event"; +import { useLockFn } from "ahooks"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { TestBox } from "./test-box"; + +import { BaseLoading } from "@/components/base"; import { useListen } from "@/hooks/use-listen"; +import { cmdTestDelay, downloadIconCache } from "@/services/cmds"; +import delayManager from "@/services/delay"; +import { showNotice } from "@/services/noticeService"; interface Props { id: string; diff --git a/src/components/test/test-viewer.tsx b/src/components/test/test-viewer.tsx index 9d8d08507..0962c4249 100644 --- a/src/components/test/test-viewer.tsx +++ b/src/components/test/test-viewer.tsx @@ -1,11 +1,12 @@ -import { forwardRef, useImperativeHandle, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; -import { useForm, Controller } from "react-hook-form"; import { TextField } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; -import { BaseDialog } from "@/components/base"; +import { useLockFn } from "ahooks"; import { nanoid } from "nanoid"; +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + +import { BaseDialog } from "@/components/base"; +import { useVerge } from "@/hooks/use-verge"; import { showNotice } from "@/services/noticeService"; interface Props { diff --git a/src/hooks/use-clash.ts b/src/hooks/use-clash.ts index cffce52a7..6284dbcfe 100644 --- a/src/hooks/use-clash.ts +++ b/src/hooks/use-clash.ts @@ -1,5 +1,6 @@ -import useSWR, { mutate } from "swr"; import { useLockFn } from "ahooks"; +import useSWR, { mutate } from "swr"; + import { getVersion } from "@/services/cmds"; import { getClashInfo, diff --git a/src/hooks/use-current-proxy.ts b/src/hooks/use-current-proxy.ts index 84da26e50..2826a793c 100644 --- a/src/hooks/use-current-proxy.ts +++ b/src/hooks/use-current-proxy.ts @@ -1,4 +1,5 @@ import { useMemo } from "react"; + import { useAppData } from "@/providers/app-data-provider"; // 定义代理组类型 diff --git a/src/hooks/use-i18n.ts b/src/hooks/use-i18n.ts index f20baf9aa..c4d6a1ea9 100644 --- a/src/hooks/use-i18n.ts +++ b/src/hooks/use-i18n.ts @@ -1,8 +1,10 @@ import { useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; -import { changeLanguage, supportedLanguages } from "@/services/i18n"; + import { useVerge } from "./use-verge"; +import { changeLanguage, supportedLanguages } from "@/services/i18n"; + export const useI18n = () => { const { i18n, t } = useTranslation(); const { patchVerge } = useVerge(); diff --git a/src/hooks/use-listen.ts b/src/hooks/use-listen.ts index 4d17b6b5a..4cd0e7222 100644 --- a/src/hooks/use-listen.ts +++ b/src/hooks/use-listen.ts @@ -1,5 +1,5 @@ -import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; import { event } from "@tauri-apps/api"; +import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; import { useRef } from "react"; export const useListen = () => { diff --git a/src/hooks/use-profiles.ts b/src/hooks/use-profiles.ts index 467b903f4..5484cf70b 100644 --- a/src/hooks/use-profiles.ts +++ b/src/hooks/use-profiles.ts @@ -1,4 +1,5 @@ import useSWR, { mutate } from "swr"; + import { getProfiles, patchProfile, diff --git a/src/hooks/use-proxy-selection.ts b/src/hooks/use-proxy-selection.ts index 49061a526..47fc53d97 100644 --- a/src/hooks/use-proxy-selection.ts +++ b/src/hooks/use-proxy-selection.ts @@ -1,5 +1,8 @@ -import { useCallback, useMemo } from "react"; import { useLockFn } from "ahooks"; +import { useCallback, useMemo } from "react"; + +import { useProfiles } from "@/hooks/use-profiles"; +import { useVerge } from "@/hooks/use-verge"; import { updateProxy, updateProxyAndSync, @@ -8,8 +11,6 @@ import { getConnections, deleteConnection, } from "@/services/cmds"; -import { useProfiles } from "@/hooks/use-profiles"; -import { useVerge } from "@/hooks/use-verge"; // 缓存连接清理 const cleanupConnections = async (previousProxy: string) => { diff --git a/src/hooks/use-system-proxy-state.ts b/src/hooks/use-system-proxy-state.ts index 4ecc3227a..9d04c3ebb 100644 --- a/src/hooks/use-system-proxy-state.ts +++ b/src/hooks/use-system-proxy-state.ts @@ -1,7 +1,8 @@ import useSWR, { mutate } from "swr"; + import { useVerge } from "@/hooks/use-verge"; -import { getAutotemProxy } from "@/services/cmds"; import { useAppData } from "@/providers/app-data-provider"; +import { getAutotemProxy } from "@/services/cmds"; import { closeAllConnections } from "@/services/cmds"; // 系统代理状态检测统一逻辑 diff --git a/src/hooks/use-system-state.ts b/src/hooks/use-system-state.ts index 056028c73..3d7cc21d5 100644 --- a/src/hooks/use-system-state.ts +++ b/src/hooks/use-system-state.ts @@ -1,4 +1,5 @@ import useSWR from "swr"; + import { getRunningMode, isAdmin, isServiceAvailable } from "@/services/cmds"; /** diff --git a/src/hooks/use-traffic-monitor.ts b/src/hooks/use-traffic-monitor.ts index 09a3a8aac..abaa56772 100644 --- a/src/hooks/use-traffic-monitor.ts +++ b/src/hooks/use-traffic-monitor.ts @@ -1,5 +1,6 @@ import { useState, useEffect, useRef, useCallback } from "react"; import useSWR from "swr"; + import { useClashInfo } from "@/hooks/use-clash"; import { useVisibility } from "@/hooks/use-visibility"; import { getSystemMonitorOverviewSafe } from "@/services/cmds"; diff --git a/src/hooks/use-verge.ts b/src/hooks/use-verge.ts index 1ab876b8c..ccd1537e3 100644 --- a/src/hooks/use-verge.ts +++ b/src/hooks/use-verge.ts @@ -1,8 +1,9 @@ -import useSWR from "swr"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import { getVergeConfig, patchVergeConfig } from "@/services/cmds"; +import useSWR from "swr"; + import { useSystemState } from "@/hooks/use-system-state"; +import { getVergeConfig, patchVergeConfig } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; export const useVerge = () => { diff --git a/src/hooks/useServiceInstaller.ts b/src/hooks/useServiceInstaller.ts index 12e04e16c..6422f17e8 100644 --- a/src/hooks/useServiceInstaller.ts +++ b/src/hooks/useServiceInstaller.ts @@ -1,8 +1,9 @@ -import { installService, restartCore } from "@/services/cmds"; -import { showNotice } from "@/services/noticeService"; import { t } from "i18next"; import { useCallback } from "react"; +import { installService, restartCore } from "@/services/cmds"; +import { showNotice } from "@/services/noticeService"; + const executeWithErrorHandling = async ( operation: () => Promise, loadingMessage: string, diff --git a/src/hooks/useServiceUninstaller.ts b/src/hooks/useServiceUninstaller.ts index f3341eb78..0586c3b88 100644 --- a/src/hooks/useServiceUninstaller.ts +++ b/src/hooks/useServiceUninstaller.ts @@ -1,8 +1,10 @@ +import { t } from "i18next"; +import { useCallback } from "react"; + +import { useSystemState } from "./use-system-state"; + import { restartCore, stopCore, uninstallService } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; -import { t } from "i18next"; -import { useSystemState } from "./use-system-state"; -import { useCallback } from "react"; const executeWithErrorHandling = async ( operation: () => Promise, diff --git a/src/main.tsx b/src/main.tsx index 7bc6ed8c6..0860aec41 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -7,19 +7,20 @@ if (!window.ResizeObserver) { window.ResizeObserver = ResizeObserver; } +import { ComposeContextProvider } from "foxact/compose-context-provider"; import React from "react"; import { createRoot } from "react-dom/client"; -import { ComposeContextProvider } from "foxact/compose-context-provider"; import { BrowserRouter } from "react-router-dom"; + import { BaseErrorBoundary } from "./components/base"; import Layout from "./pages/_layout"; +import { AppDataProvider } from "./providers/app-data-provider"; import { initializeLanguage } from "./services/i18n"; import { LoadingCacheProvider, ThemeModeProvider, UpdateStateProvider, } from "./services/states"; -import { AppDataProvider } from "./providers/app-data-provider"; const mainElementId = "root"; const container = document.getElementById(mainElementId); diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index b44e3983f..7fed67697 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -1,36 +1,44 @@ -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; -import { SWRConfig, mutate } from "swr"; -import { useEffect, useCallback, useState, useRef } from "react"; -import { useTranslation } from "react-i18next"; -import { useLocation, useRoutes, useNavigate } from "react-router-dom"; import { List, Paper, ThemeProvider, SvgIcon } from "@mui/material"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { useLocalStorage } from "foxact/use-local-storage"; +import { useEffect, useCallback, useState, useRef } from "react"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { useLocation, useRoutes, useNavigate } from "react-router-dom"; +import { SWRConfig, mutate } from "swr"; + import { routers } from "./_routers"; -import { getAxios } from "@/services/api"; -import { forceRefreshClashConfig } from "@/services/cmds"; -import { useVerge } from "@/hooks/use-verge"; -import { useI18n } from "@/hooks/use-i18n"; -import LogoSvg from "@/assets/image/logo.svg?react"; -import iconLight from "@/assets/image/icon_light.svg?react"; + import iconDark from "@/assets/image/icon_dark.svg?react"; -import { useThemeMode, useEnableLog } from "@/services/states"; +import iconLight from "@/assets/image/icon_light.svg?react"; +import LogoSvg from "@/assets/image/logo.svg?react"; import { LayoutItem } from "@/components/layout/layout-item"; import { LayoutTraffic } from "@/components/layout/layout-traffic"; import { UpdateButton } from "@/components/layout/update-button"; import { useCustomTheme } from "@/components/layout/use-custom-theme"; +import { useI18n } from "@/hooks/use-i18n"; +import { useVerge } from "@/hooks/use-verge"; +import { getAxios } from "@/services/api"; +import { forceRefreshClashConfig } from "@/services/cmds"; +import { useThemeMode, useEnableLog } from "@/services/states"; import getSystem from "@/utils/get-system"; + import "dayjs/locale/ru"; import "dayjs/locale/zh-cn"; -import React from "react"; + import { useListen } from "@/hooks/use-listen"; + import { listen } from "@tauri-apps/api/event"; + import { useClashInfo } from "@/hooks/use-clash"; import { initGlobalLogService } from "@/services/global-log-service"; + import { invoke } from "@tauri-apps/api/core"; + import { showNotice } from "@/services/noticeService"; import { NoticeManager } from "@/components/base/NoticeManager"; -import { useLocalStorage } from "foxact/use-local-storage"; import { LogLevel } from "@/hooks/use-log-data"; const appWindow = getCurrentWebviewWindow(); diff --git a/src/pages/_routers.tsx b/src/pages/_routers.tsx index d917ae287..d0a9b541a 100644 --- a/src/pages/_routers.tsx +++ b/src/pages/_routers.tsx @@ -1,30 +1,30 @@ -import LogsPage from "./logs"; -import ProxiesPage from "./proxies"; -import ProfilesPage from "./profiles"; -import SettingsPage from "./settings"; -import ConnectionsPage from "./connections"; -import RulesPage from "./rules"; -import HomePage from "./home"; -import UnlockPage from "./unlock"; -import { BaseErrorBoundary } from "@/components/base"; - -import HomeSvg from "@/assets/image/itemicon/home.svg?react"; -import ProxiesSvg from "@/assets/image/itemicon/proxies.svg?react"; -import ProfilesSvg from "@/assets/image/itemicon/profiles.svg?react"; -import ConnectionsSvg from "@/assets/image/itemicon/connections.svg?react"; -import RulesSvg from "@/assets/image/itemicon/rules.svg?react"; -import LogsSvg from "@/assets/image/itemicon/logs.svg?react"; -import UnlockSvg from "@/assets/image/itemicon/unlock.svg?react"; -import SettingsSvg from "@/assets/image/itemicon/settings.svg?react"; - -import WifiRoundedIcon from "@mui/icons-material/WifiRounded"; import DnsRoundedIcon from "@mui/icons-material/DnsRounded"; -import LanguageRoundedIcon from "@mui/icons-material/LanguageRounded"; import ForkRightRoundedIcon from "@mui/icons-material/ForkRightRounded"; -import SubjectRoundedIcon from "@mui/icons-material/SubjectRounded"; -import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded"; import HomeRoundedIcon from "@mui/icons-material/HomeRounded"; +import LanguageRoundedIcon from "@mui/icons-material/LanguageRounded"; import LockOpenRoundedIcon from "@mui/icons-material/LockOpenRounded"; +import SettingsRoundedIcon from "@mui/icons-material/SettingsRounded"; +import SubjectRoundedIcon from "@mui/icons-material/SubjectRounded"; +import WifiRoundedIcon from "@mui/icons-material/WifiRounded"; + +import ConnectionsPage from "./connections"; +import HomePage from "./home"; +import LogsPage from "./logs"; +import ProfilesPage from "./profiles"; +import ProxiesPage from "./proxies"; +import RulesPage from "./rules"; +import SettingsPage from "./settings"; +import UnlockPage from "./unlock"; + +import ConnectionsSvg from "@/assets/image/itemicon/connections.svg?react"; +import HomeSvg from "@/assets/image/itemicon/home.svg?react"; +import LogsSvg from "@/assets/image/itemicon/logs.svg?react"; +import ProfilesSvg from "@/assets/image/itemicon/profiles.svg?react"; +import ProxiesSvg from "@/assets/image/itemicon/proxies.svg?react"; +import RulesSvg from "@/assets/image/itemicon/rules.svg?react"; +import SettingsSvg from "@/assets/image/itemicon/settings.svg?react"; +import UnlockSvg from "@/assets/image/itemicon/unlock.svg?react"; +import { BaseErrorBoundary } from "@/components/base"; export const routers = [ { diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx index caf358e79..937d36219 100644 --- a/src/pages/connections.tsx +++ b/src/pages/connections.tsx @@ -1,29 +1,30 @@ -import { useMemo, useRef, useState, useCallback } from "react"; -import { useLockFn } from "ahooks"; -import { Box, Button, IconButton, MenuItem } from "@mui/material"; -import { Virtuoso } from "react-virtuoso"; -import { useTranslation } from "react-i18next"; import { TableChartRounded, TableRowsRounded, PlayCircleOutlineRounded, PauseCircleOutlineRounded, } from "@mui/icons-material"; -import { closeAllConnections } from "@/services/cmds"; -import { useConnectionSetting } from "@/services/states"; +import { Box, Button, IconButton, MenuItem } from "@mui/material"; +import { useTheme } from "@mui/material/styles"; +import { useLockFn } from "ahooks"; +import { useMemo, useRef, useState, useCallback } from "react"; +import { useTranslation } from "react-i18next"; +import { Virtuoso } from "react-virtuoso"; + import { BaseEmpty, BasePage } from "@/components/base"; -import { ConnectionItem } from "@/components/connection/connection-item"; -import { ConnectionTable } from "@/components/connection/connection-table"; +import { BaseSearchBox } from "@/components/base/base-search-box"; +import { BaseStyledSelect } from "@/components/base/base-styled-select"; import { ConnectionDetail, ConnectionDetailRef, } from "@/components/connection/connection-detail"; -import parseTraffic from "@/utils/parse-traffic"; -import { BaseSearchBox } from "@/components/base/base-search-box"; -import { BaseStyledSelect } from "@/components/base/base-styled-select"; -import { useTheme } from "@mui/material/styles"; +import { ConnectionItem } from "@/components/connection/connection-item"; +import { ConnectionTable } from "@/components/connection/connection-table"; import { useVisibility } from "@/hooks/use-visibility"; import { useAppData } from "@/providers/app-data-provider"; +import { closeAllConnections } from "@/services/cmds"; +import { useConnectionSetting } from "@/services/states"; +import parseTraffic from "@/utils/parse-traffic"; const initConn: IConnections = { uploadTotal: 0, diff --git a/src/pages/home.tsx b/src/pages/home.tsx index db59c3225..730dad60c 100644 --- a/src/pages/home.tsx +++ b/src/pages/home.tsx @@ -1,4 +1,11 @@ -import { useTranslation } from "react-i18next"; +import { + RouterOutlined, + SettingsOutlined, + DnsOutlined, + SpeedOutlined, + HelpOutlineRounded, + HistoryEduOutlined, +} from "@mui/icons-material"; import { Box, Button, @@ -14,25 +21,19 @@ import { Grid, Skeleton, } from "@mui/material"; -import { useVerge } from "@/hooks/use-verge"; -import { useProfiles } from "@/hooks/use-profiles"; -import { - RouterOutlined, - SettingsOutlined, - DnsOutlined, - SpeedOutlined, - HelpOutlineRounded, - HistoryEduOutlined, -} from "@mui/icons-material"; -import { ProxyTunCard } from "@/components/home/proxy-tun-card"; -import { ClashModeCard } from "@/components/home/clash-mode-card"; -import { EnhancedTrafficStats } from "@/components/home/enhanced-traffic-stats"; -import { useState, useMemo, Suspense, lazy, useCallback } from "react"; -import { HomeProfileCard } from "@/components/home/home-profile-card"; -import { EnhancedCard } from "@/components/home/enhanced-card"; -import { CurrentProxyCard } from "@/components/home/current-proxy-card"; -import { BasePage } from "@/components/base"; import { useLockFn } from "ahooks"; +import { useState, useMemo, Suspense, lazy, useCallback } from "react"; +import { useTranslation } from "react-i18next"; + +import { BasePage } from "@/components/base"; +import { ClashModeCard } from "@/components/home/clash-mode-card"; +import { CurrentProxyCard } from "@/components/home/current-proxy-card"; +import { EnhancedCard } from "@/components/home/enhanced-card"; +import { EnhancedTrafficStats } from "@/components/home/enhanced-traffic-stats"; +import { HomeProfileCard } from "@/components/home/home-profile-card"; +import { ProxyTunCard } from "@/components/home/proxy-tun-card"; +import { useProfiles } from "@/hooks/use-profiles"; +import { useVerge } from "@/hooks/use-verge"; import { entry_lightweight_mode, openWebUrl } from "@/services/cmds"; const LazyTestCard = lazy(() => diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 18cdc729e..0f8e6f84b 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -1,26 +1,26 @@ -import { useMemo, useState } from "react"; -import { Box, Button, IconButton, MenuItem } from "@mui/material"; -import { Virtuoso } from "react-virtuoso"; -import { useTranslation } from "react-i18next"; -import { useLocalStorage } from "foxact/use-local-storage"; - import { PlayCircleOutlineRounded, PauseCircleOutlineRounded, } from "@mui/icons-material"; -import { LogLevel } from "@/hooks/use-log-data"; -import { useEnableLog } from "@/services/states"; +import { Box, Button, IconButton, MenuItem } from "@mui/material"; +import { useLocalStorage } from "foxact/use-local-storage"; +import { useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Virtuoso } from "react-virtuoso"; + import { BaseEmpty, BasePage } from "@/components/base"; -import LogItem from "@/components/log/log-item"; import { BaseSearchBox } from "@/components/base/base-search-box"; -import { BaseStyledSelect } from "@/components/base/base-styled-select"; import { SearchState } from "@/components/base/base-search-box"; +import { BaseStyledSelect } from "@/components/base/base-styled-select"; +import LogItem from "@/components/log/log-item"; +import { LogLevel } from "@/hooks/use-log-data"; import { useGlobalLogData, clearGlobalLogs, changeLogLevel, toggleLogEnabled, } from "@/services/global-log-service"; +import { useEnableLog } from "@/services/states"; // 后端通过 /logs?level={level} 进行筛选,前端不再需要手动筛选日志级别 diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index a873a1247..8232c9155 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -1,7 +1,3 @@ -import useSWR, { mutate } from "swr"; -import { useEffect, useMemo, useRef, useState } from "react"; -import { useLockFn } from "ahooks"; -import { Box, Button, IconButton, Stack, Divider, Grid } from "@mui/material"; import { DndContext, closestCenter, @@ -15,7 +11,6 @@ import { SortableContext, sortableKeyboardCoordinates, } from "@dnd-kit/sortable"; -import { LoadingButton } from "@mui/lab"; import { ClearRounded, ContentPasteRounded, @@ -23,7 +18,31 @@ import { RefreshRounded, TextSnippetOutlined, } from "@mui/icons-material"; +import { LoadingButton } from "@mui/lab"; +import { Box, Button, IconButton, Stack, Divider, Grid } from "@mui/material"; +import { listen } from "@tauri-apps/api/event"; +import { TauriEvent } from "@tauri-apps/api/event"; +import { readText } from "@tauri-apps/plugin-clipboard-manager"; +import { readTextFile } from "@tauri-apps/plugin-fs"; +import { useLockFn } from "ahooks"; +import { throttle } from "lodash-es"; +import { useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; +import { useLocation } from "react-router-dom"; +import useSWR, { mutate } from "swr"; + +import { BasePage, DialogRef } from "@/components/base"; +import { BaseStyledTextField } from "@/components/base/base-styled-text-field"; +import { ProfileItem } from "@/components/profile/profile-item"; +import { ProfileMore } from "@/components/profile/profile-more"; +import { + ProfileViewer, + ProfileViewerRef, +} from "@/components/profile/profile-viewer"; +import { ConfigViewer } from "@/components/setting/mods/config-viewer"; +import { useListen } from "@/hooks/use-listen"; +import { useProfiles } from "@/hooks/use-profiles"; +import { closeAllConnections } from "@/services/cmds"; import { importProfile, enhanceProfiles, @@ -35,26 +54,8 @@ import { createProfile, getProfiles, } from "@/services/cmds"; -import { useSetLoadingCache, useThemeMode } from "@/services/states"; -import { closeAllConnections } from "@/services/cmds"; -import { BasePage, DialogRef } from "@/components/base"; -import { - ProfileViewer, - ProfileViewerRef, -} from "@/components/profile/profile-viewer"; -import { ProfileMore } from "@/components/profile/profile-more"; -import { ProfileItem } from "@/components/profile/profile-item"; -import { useProfiles } from "@/hooks/use-profiles"; -import { ConfigViewer } from "@/components/setting/mods/config-viewer"; -import { throttle } from "lodash-es"; -import { BaseStyledTextField } from "@/components/base/base-styled-text-field"; -import { readTextFile } from "@tauri-apps/plugin-fs"; -import { readText } from "@tauri-apps/plugin-clipboard-manager"; -import { useLocation } from "react-router-dom"; -import { useListen } from "@/hooks/use-listen"; -import { listen } from "@tauri-apps/api/event"; -import { TauriEvent } from "@tauri-apps/api/event"; import { showNotice } from "@/services/noticeService"; +import { useSetLoadingCache, useThemeMode } from "@/services/states"; // 记录profile切换状态 const debugProfileSwitch = (action: string, profile: string, extra?: any) => { diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx index c4e1f6404..44bf3d20a 100644 --- a/src/pages/proxies.tsx +++ b/src/pages/proxies.tsx @@ -1,8 +1,13 @@ -import useSWR from "swr"; -import { useEffect, useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; import { Box, Button, ButtonGroup } from "@mui/material"; +import { useLockFn } from "ahooks"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import useSWR from "swr"; + +import { BasePage } from "@/components/base"; +import { ProviderButton } from "@/components/proxy/provider-button"; +import { ProxyGroups } from "@/components/proxy/proxy-groups"; +import { useVerge } from "@/hooks/use-verge"; import { closeAllConnections, getClashConfig, @@ -10,10 +15,6 @@ import { updateProxyChainConfigInRuntime, } from "@/services/cmds"; import { patchClashMode } from "@/services/cmds"; -import { useVerge } from "@/hooks/use-verge"; -import { BasePage } from "@/components/base"; -import { ProxyGroups } from "@/components/proxy/proxy-groups"; -import { ProviderButton } from "@/components/proxy/provider-button"; const ProxyPage = () => { const { t } = useTranslation(); diff --git a/src/pages/rules.tsx b/src/pages/rules.tsx index 152ced35a..5fe7e85c0 100644 --- a/src/pages/rules.tsx +++ b/src/pages/rules.tsx @@ -1,14 +1,15 @@ +import { Box } from "@mui/material"; import { useState, useMemo, useRef, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Virtuoso, VirtuosoHandle } from "react-virtuoso"; -import { Box } from "@mui/material"; + import { BaseEmpty, BasePage } from "@/components/base"; -import RuleItem from "@/components/rule/rule-item"; -import { ProviderButton } from "@/components/rule/provider-button"; import { BaseSearchBox } from "@/components/base/base-search-box"; import { ScrollTopButton } from "@/components/layout/scroll-top-button"; -import { useAppData } from "@/providers/app-data-provider"; +import { ProviderButton } from "@/components/rule/provider-button"; +import RuleItem from "@/components/rule/rule-item"; import { useVisibility } from "@/hooks/use-visibility"; +import { useAppData } from "@/providers/app-data-provider"; const RulesPage = () => { const { t } = useTranslation(); diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx index cd2ea8955..18eb8af28 100644 --- a/src/pages/settings.tsx +++ b/src/pages/settings.tsx @@ -1,15 +1,16 @@ +import { GitHub, HelpOutlineRounded, Telegram } from "@mui/icons-material"; import { Box, ButtonGroup, IconButton, Grid } from "@mui/material"; import { useLockFn } from "ahooks"; import { useTranslation } from "react-i18next"; + import { BasePage } from "@/components/base"; -import { GitHub, HelpOutlineRounded, Telegram } from "@mui/icons-material"; -import { openWebUrl } from "@/services/cmds"; -import SettingVergeBasic from "@/components/setting/setting-verge-basic"; -import SettingVergeAdvanced from "@/components/setting/setting-verge-advanced"; import SettingClash from "@/components/setting/setting-clash"; import SettingSystem from "@/components/setting/setting-system"; -import { useThemeMode } from "@/services/states"; +import SettingVergeAdvanced from "@/components/setting/setting-verge-advanced"; +import SettingVergeBasic from "@/components/setting/setting-verge-basic"; +import { openWebUrl } from "@/services/cmds"; import { showNotice } from "@/services/noticeService"; +import { useThemeMode } from "@/services/states"; const SettingPage = () => { const { t } = useTranslation(); diff --git a/src/pages/test.tsx b/src/pages/test.tsx index 45797f6b7..75a48f4e2 100644 --- a/src/pages/test.tsx +++ b/src/pages/test.tsx @@ -1,6 +1,3 @@ -import { useEffect, useRef, useState } from "react"; -import { useVerge } from "@/hooks/use-verge"; -import { Box, Button, Grid } from "@mui/material"; import { DndContext, closestCenter, @@ -14,20 +11,22 @@ import { SortableContext, sortableKeyboardCoordinates, } from "@dnd-kit/sortable"; - -import { useTranslation } from "react-i18next"; -import { BasePage } from "@/components/base"; -import { TestViewer, TestViewerRef } from "@/components/test/test-viewer"; -import { TestItem } from "@/components/test/test-item"; +import { Box, Button, Grid } from "@mui/material"; import { emit } from "@tauri-apps/api/event"; import { nanoid } from "nanoid"; -import { ScrollTopButton } from "@/components/layout/scroll-top-button"; +import { useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; // test icons import apple from "@/assets/image/test/apple.svg?raw"; import github from "@/assets/image/test/github.svg?raw"; import google from "@/assets/image/test/google.svg?raw"; import youtube from "@/assets/image/test/youtube.svg?raw"; +import { BasePage } from "@/components/base"; +import { ScrollTopButton } from "@/components/layout/scroll-top-button"; +import { TestItem } from "@/components/test/test-item"; +import { TestViewer, TestViewerRef } from "@/components/test/test-viewer"; +import { useVerge } from "@/hooks/use-verge"; const TestPage = () => { const { t } = useTranslation(); diff --git a/src/pages/unlock.tsx b/src/pages/unlock.tsx index d4d6c2275..f380448b4 100644 --- a/src/pages/unlock.tsx +++ b/src/pages/unlock.tsx @@ -1,4 +1,11 @@ -import { useEffect, useState } from "react"; +import { + CheckCircleOutlined, + CancelOutlined, + HelpOutline, + PendingOutlined, + RefreshRounded, + AccessTimeOutlined, +} from "@mui/icons-material"; import { Box, Button, @@ -12,18 +19,12 @@ import { useTheme, Grid, } from "@mui/material"; -import { useTranslation } from "react-i18next"; import { invoke } from "@tauri-apps/api/core"; -import { BasePage, BaseEmpty } from "@/components/base"; import { useLockFn } from "ahooks"; -import { - CheckCircleOutlined, - CancelOutlined, - HelpOutline, - PendingOutlined, - RefreshRounded, - AccessTimeOutlined, -} from "@mui/icons-material"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { BasePage, BaseEmpty } from "@/components/base"; import { showNotice } from "@/services/noticeService"; interface UnlockItem { diff --git a/src/providers/app-data-provider.tsx b/src/providers/app-data-provider.tsx index 9e72ecd3f..11b8bc819 100644 --- a/src/providers/app-data-provider.tsx +++ b/src/providers/app-data-provider.tsx @@ -1,3 +1,4 @@ +import { listen } from "@tauri-apps/api/event"; import React, { createContext, useContext, @@ -5,8 +6,11 @@ import React, { useMemo, useRef, } from "react"; -import { useVerge } from "@/hooks/use-verge"; import useSWR from "swr"; + +import { useClashInfo } from "@/hooks/use-clash"; +import { useVerge } from "@/hooks/use-verge"; +import { useVisibility } from "@/hooks/use-visibility"; import { getProxies, getRules, @@ -23,9 +27,6 @@ import { getAppUptime, forceRefreshProxies, } from "@/services/cmds"; -import { useClashInfo } from "@/hooks/use-clash"; -import { useVisibility } from "@/hooks/use-visibility"; -import { listen } from "@tauri-apps/api/event"; // 连接速度计算接口 interface ConnectionSpeedData { diff --git a/src/services/api.ts b/src/services/api.ts index a7fb8672f..a5508509f 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,5 +1,6 @@ import { fetch } from "@tauri-apps/plugin-http"; import axios, { AxiosInstance } from "axios"; + import { getClashInfo } from "./cmds"; let instancePromise: Promise = null!; diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 04e7bd6f5..3ea4570ba 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -1,4 +1,5 @@ import { invoke } from "@tauri-apps/api/core"; + import { showNotice } from "@/services/noticeService"; export async function copyClashEnv() { diff --git a/src/services/global-log-service.ts b/src/services/global-log-service.ts index 7b6a3928f..ebd62e76b 100644 --- a/src/services/global-log-service.ts +++ b/src/services/global-log-service.ts @@ -1,5 +1,6 @@ // 全局日志服务,使应用在任何页面都能收集日志 import { create } from "zustand"; + import { fetchLogsViaIPC, startLogsStreaming, diff --git a/src/services/ipc-log-service.ts b/src/services/ipc-log-service.ts index f98464aa2..6d5e29ccc 100644 --- a/src/services/ipc-log-service.ts +++ b/src/services/ipc-log-service.ts @@ -1,11 +1,12 @@ // IPC-based log service using Tauri commands with streaming support +import dayjs from "dayjs"; + import { getClashLogs, startLogsMonitoring, stopLogsMonitoring, clearLogs as clearLogsCmd, } from "@/services/cmds"; -import dayjs from "dayjs"; type LogLevel = "debug" | "info" | "warning" | "error" | "all";