setting-system.tsx 5.6 KB

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