setting-system.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import useSWR from "swr";
  2. import { useRef } from "react";
  3. import { useTranslation } from "react-i18next";
  4. import { IconButton, Tooltip } from "@mui/material";
  5. import { PrivacyTipRounded, Settings, InfoRounded } from "@mui/icons-material";
  6. import { checkService } from "@/services/cmds";
  7. import { useVerge } from "@/hooks/use-verge";
  8. import { DialogRef, Switch } from "@/components/base";
  9. import { SettingList, SettingItem } from "./mods/setting-comp";
  10. import { GuardState } from "./mods/guard-state";
  11. import { ServiceViewer } from "./mods/service-viewer";
  12. import { SysproxyViewer } from "./mods/sysproxy-viewer";
  13. import { TunViewer } from "./mods/tun-viewer";
  14. import getSystem from "@/utils/get-system";
  15. interface Props {
  16. onError?: (err: Error) => void;
  17. }
  18. const SettingSystem = ({ onError }: Props) => {
  19. const { t } = useTranslation();
  20. const { verge, mutateVerge, patchVerge } = useVerge();
  21. // service mode
  22. const { data: serviceStatus } = useSWR("checkService", checkService, {
  23. revalidateIfStale: false,
  24. shouldRetryOnError: false,
  25. focusThrottleInterval: 36e5, // 1 hour
  26. });
  27. const serviceRef = useRef<DialogRef>(null);
  28. const sysproxyRef = useRef<DialogRef>(null);
  29. const tunRef = useRef<DialogRef>(null);
  30. const {
  31. enable_tun_mode,
  32. enable_auto_launch,
  33. enable_service_mode,
  34. enable_silent_start,
  35. enable_system_proxy,
  36. } = verge ?? {};
  37. const onSwitchFormat = (_e: any, value: boolean) => value;
  38. const onChangeData = (patch: Partial<IVergeConfig>) => {
  39. mutateVerge({ ...verge, ...patch }, false);
  40. };
  41. return (
  42. <SettingList title={t("System Setting")}>
  43. <SysproxyViewer ref={sysproxyRef} />
  44. <TunViewer ref={tunRef} />
  45. <ServiceViewer ref={serviceRef} enable={!!enable_service_mode} />
  46. <SettingItem
  47. label={t("Tun Mode")}
  48. extra={
  49. <>
  50. <Tooltip title={t("Tun Mode Info")} placement="top">
  51. <IconButton color="inherit" size="small">
  52. <InfoRounded
  53. fontSize="inherit"
  54. style={{ cursor: "pointer", opacity: 0.75 }}
  55. />
  56. </IconButton>
  57. </Tooltip>
  58. <IconButton
  59. color="inherit"
  60. size="small"
  61. onClick={() => tunRef.current?.open()}
  62. >
  63. <Settings
  64. fontSize="inherit"
  65. style={{ cursor: "pointer", opacity: 0.75 }}
  66. />
  67. </IconButton>
  68. </>
  69. }
  70. >
  71. <GuardState
  72. value={enable_tun_mode ?? false}
  73. valueProps="checked"
  74. onCatch={onError}
  75. onFormat={onSwitchFormat}
  76. onChange={(e) => onChangeData({ enable_tun_mode: e })}
  77. onGuard={(e) => patchVerge({ enable_tun_mode: e })}
  78. >
  79. <Switch edge="end" />
  80. </GuardState>
  81. </SettingItem>
  82. <SettingItem
  83. label={t("Service Mode")}
  84. extra={
  85. <IconButton
  86. color="inherit"
  87. size="small"
  88. onClick={() => serviceRef.current?.open()}
  89. >
  90. <PrivacyTipRounded
  91. fontSize="inherit"
  92. style={{ cursor: "pointer", opacity: 0.75 }}
  93. />
  94. </IconButton>
  95. }
  96. >
  97. <GuardState
  98. value={enable_service_mode ?? false}
  99. valueProps="checked"
  100. onCatch={onError}
  101. onFormat={onSwitchFormat}
  102. onChange={(e) => onChangeData({ enable_service_mode: e })}
  103. onGuard={(e) => patchVerge({ enable_service_mode: e })}
  104. >
  105. <Switch
  106. edge="end"
  107. disabled={
  108. serviceStatus !== "active" && serviceStatus !== "installed"
  109. }
  110. />
  111. </GuardState>
  112. </SettingItem>
  113. <SettingItem
  114. label={t("System Proxy")}
  115. extra={
  116. <IconButton
  117. color="inherit"
  118. size="small"
  119. onClick={() => sysproxyRef.current?.open()}
  120. >
  121. <Settings
  122. fontSize="inherit"
  123. style={{ cursor: "pointer", opacity: 0.75 }}
  124. />
  125. </IconButton>
  126. }
  127. >
  128. <GuardState
  129. value={enable_system_proxy ?? false}
  130. valueProps="checked"
  131. onCatch={onError}
  132. onFormat={onSwitchFormat}
  133. onChange={(e) => onChangeData({ enable_system_proxy: e })}
  134. onGuard={(e) => patchVerge({ enable_system_proxy: e })}
  135. >
  136. <Switch edge="end" />
  137. </GuardState>
  138. </SettingItem>
  139. <SettingItem label={t("Auto Launch")}>
  140. <GuardState
  141. value={enable_auto_launch ?? false}
  142. valueProps="checked"
  143. onCatch={onError}
  144. onFormat={onSwitchFormat}
  145. onChange={(e) => onChangeData({ enable_auto_launch: e })}
  146. onGuard={(e) => patchVerge({ enable_auto_launch: e })}
  147. >
  148. <Switch edge="end" />
  149. </GuardState>
  150. </SettingItem>
  151. <SettingItem label={t("Silent Start")}>
  152. <GuardState
  153. value={enable_silent_start ?? false}
  154. valueProps="checked"
  155. onCatch={onError}
  156. onFormat={onSwitchFormat}
  157. onChange={(e) => onChangeData({ enable_silent_start: e })}
  158. onGuard={(e) => patchVerge({ enable_silent_start: e })}
  159. >
  160. <Switch edge="end" />
  161. </GuardState>
  162. </SettingItem>
  163. </SettingList>
  164. );
  165. };
  166. export default SettingSystem;