stack-mode-switch.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { useTranslation } from "react-i18next";
  2. import { Button, ButtonGroup, Tooltip } from "@mui/material";
  3. import { checkService } from "@/services/cmds";
  4. import { useVerge } from "@/hooks/use-verge";
  5. import getSystem from "@/utils/get-system";
  6. import useSWR from "swr";
  7. const isWIN = getSystem() === "windows";
  8. interface Props {
  9. value?: string;
  10. onChange?: (value: string) => void;
  11. }
  12. export const StackModeSwitch = (props: Props) => {
  13. const { value, onChange } = props;
  14. const { verge } = useVerge();
  15. const { enable_service_mode } = verge ?? {};
  16. // service mode
  17. const { data: serviceStatus } = useSWR(
  18. isWIN ? "checkService" : null,
  19. checkService,
  20. {
  21. revalidateIfStale: false,
  22. shouldRetryOnError: false,
  23. }
  24. );
  25. const { t } = useTranslation();
  26. return (
  27. <Tooltip
  28. title={
  29. isWIN && (serviceStatus !== "active" || !enable_service_mode)
  30. ? t("System and Mixed Can Only be Used in Service Mode")
  31. : ""
  32. }
  33. >
  34. <ButtonGroup size="small" sx={{ my: "4px" }}>
  35. <Button
  36. variant={value?.toLowerCase() === "system" ? "contained" : "outlined"}
  37. onClick={() => onChange?.("system")}
  38. disabled={
  39. isWIN && (serviceStatus !== "active" || !enable_service_mode)
  40. }
  41. sx={{ textTransform: "capitalize" }}
  42. >
  43. System
  44. </Button>
  45. <Button
  46. variant={value?.toLowerCase() === "gvisor" ? "contained" : "outlined"}
  47. onClick={() => onChange?.("gvisor")}
  48. sx={{ textTransform: "capitalize" }}
  49. >
  50. gVisor
  51. </Button>
  52. <Button
  53. variant={value?.toLowerCase() === "mixed" ? "contained" : "outlined"}
  54. onClick={() => onChange?.("mixed")}
  55. disabled={
  56. isWIN && (serviceStatus !== "active" || !enable_service_mode)
  57. }
  58. sx={{ textTransform: "capitalize" }}
  59. >
  60. Mixed
  61. </Button>
  62. </ButtonGroup>
  63. </Tooltip>
  64. );
  65. };