misc-viewer.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { forwardRef, useImperativeHandle, useState } from "react";
  2. import { useLockFn } from "ahooks";
  3. import { useTranslation } from "react-i18next";
  4. import {
  5. List,
  6. ListItem,
  7. ListItemText,
  8. MenuItem,
  9. Select,
  10. Switch,
  11. TextField,
  12. } from "@mui/material";
  13. import { useVerge } from "@/hooks/use-verge";
  14. import { BaseDialog, DialogRef, Notice } from "@/components/base";
  15. export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
  16. const { t } = useTranslation();
  17. const { verge, patchVerge } = useVerge();
  18. const [open, setOpen] = useState(false);
  19. const [values, setValues] = useState({
  20. autoCloseConnection: false,
  21. enableClashFields: true,
  22. enableBuiltinEnhanced: true,
  23. proxyLayoutColumn: 6,
  24. defaultLatencyTest: "",
  25. });
  26. useImperativeHandle(ref, () => ({
  27. open: () => {
  28. setOpen(true);
  29. setValues({
  30. autoCloseConnection: verge?.auto_close_connection ?? false,
  31. enableClashFields: verge?.enable_clash_fields ?? true,
  32. enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true,
  33. proxyLayoutColumn: verge?.proxy_layout_column || 6,
  34. defaultLatencyTest: verge?.default_latency_test || "",
  35. });
  36. },
  37. close: () => setOpen(false),
  38. }));
  39. const onSave = useLockFn(async () => {
  40. try {
  41. await patchVerge({
  42. auto_close_connection: values.autoCloseConnection,
  43. enable_clash_fields: values.enableClashFields,
  44. enable_builtin_enhanced: values.enableBuiltinEnhanced,
  45. proxy_layout_column: values.proxyLayoutColumn,
  46. default_latency_test: values.defaultLatencyTest,
  47. });
  48. setOpen(false);
  49. } catch (err: any) {
  50. Notice.error(err.message || err.toString());
  51. }
  52. });
  53. return (
  54. <BaseDialog
  55. open={open}
  56. title={t("Miscellaneous")}
  57. contentSx={{ width: 450 }}
  58. okBtn={t("Save")}
  59. cancelBtn={t("Cancel")}
  60. onClose={() => setOpen(false)}
  61. onCancel={() => setOpen(false)}
  62. onOk={onSave}
  63. >
  64. <List>
  65. <ListItem sx={{ padding: "5px 2px" }}>
  66. <ListItemText primary="Auto Close Connections" />
  67. <Switch
  68. edge="end"
  69. checked={values.autoCloseConnection}
  70. onChange={(_, c) =>
  71. setValues((v) => ({ ...v, autoCloseConnection: c }))
  72. }
  73. />
  74. </ListItem>
  75. <ListItem sx={{ padding: "5px 2px" }}>
  76. <ListItemText primary="Clash Fields Filter" />
  77. <Switch
  78. edge="end"
  79. checked={values.enableClashFields}
  80. onChange={(_, c) =>
  81. setValues((v) => ({ ...v, enableClashFields: c }))
  82. }
  83. />
  84. </ListItem>
  85. <ListItem sx={{ padding: "5px 2px" }}>
  86. <ListItemText primary="Enable Builtin Enhanced" />
  87. <Switch
  88. edge="end"
  89. checked={values.enableBuiltinEnhanced}
  90. onChange={(_, c) =>
  91. setValues((v) => ({ ...v, enableBuiltinEnhanced: c }))
  92. }
  93. />
  94. </ListItem>
  95. <ListItem sx={{ padding: "5px 2px" }}>
  96. <ListItemText primary="Proxy Layout Column" />
  97. <Select
  98. size="small"
  99. sx={{ width: 100, "> div": { py: "7.5px" } }}
  100. value={values.proxyLayoutColumn}
  101. onChange={(e) => {
  102. setValues((v) => ({
  103. ...v,
  104. proxyLayoutColumn: e.target.value as number,
  105. }));
  106. }}
  107. >
  108. <MenuItem value={6} key={6}>
  109. Auto
  110. </MenuItem>
  111. {[1, 2, 3, 4, 5].map((i) => (
  112. <MenuItem value={i} key={i}>
  113. {i}
  114. </MenuItem>
  115. ))}
  116. </Select>
  117. </ListItem>
  118. <ListItem sx={{ padding: "5px 2px" }}>
  119. <ListItemText primary="Default Latency Test" />
  120. <TextField
  121. size="small"
  122. autoComplete="off"
  123. autoCorrect="off"
  124. autoCapitalize="off"
  125. spellCheck="false"
  126. sx={{ width: 250 }}
  127. value={values.defaultLatencyTest}
  128. placeholder="http://www.gstatic.com/generate_204"
  129. onChange={(e) =>
  130. setValues((v) => ({ ...v, defaultLatencyTest: e.target.value }))
  131. }
  132. />
  133. </ListItem>
  134. </List>
  135. </BaseDialog>
  136. );
  137. });