misc-viewer.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { useEffect, useState } from "react";
  2. import { useLockFn } from "ahooks";
  3. import { useTranslation } from "react-i18next";
  4. import {
  5. Button,
  6. Dialog,
  7. DialogActions,
  8. DialogContent,
  9. DialogTitle,
  10. List,
  11. ListItem,
  12. ListItemText,
  13. Switch,
  14. TextField,
  15. } from "@mui/material";
  16. import { ModalHandler } from "@/hooks/use-modal-handler";
  17. import { useVergeConfig } from "@/hooks/use-verge-config";
  18. import Notice from "@/components/base/base-notice";
  19. interface Props {
  20. handler: ModalHandler;
  21. }
  22. const MiscViewer = ({ handler }: Props) => {
  23. const { t } = useTranslation();
  24. const { data, patchVerge } = useVergeConfig();
  25. const [open, setOpen] = useState(false);
  26. const [values, setValues] = useState({
  27. autoCloseConnection: false,
  28. defaultLatencyTest: "",
  29. });
  30. if (handler) {
  31. handler.current = {
  32. open: () => setOpen(true),
  33. close: () => setOpen(false),
  34. };
  35. }
  36. useEffect(() => {
  37. if (open) {
  38. setValues({
  39. autoCloseConnection: data?.auto_close_connection || false,
  40. defaultLatencyTest: data?.default_latency_test || "",
  41. });
  42. }
  43. }, [open, data]);
  44. const onSave = useLockFn(async () => {
  45. try {
  46. await patchVerge({
  47. auto_close_connection: values.autoCloseConnection,
  48. default_latency_test: values.defaultLatencyTest,
  49. });
  50. setOpen(false);
  51. } catch (err: any) {
  52. Notice.error(err.message || err.toString());
  53. }
  54. });
  55. return (
  56. <Dialog open={open} onClose={() => setOpen(false)}>
  57. <DialogTitle>{t("Miscellaneous")}</DialogTitle>
  58. <DialogContent sx={{ width: 420 }}>
  59. <List>
  60. <ListItem sx={{ padding: "5px 2px" }}>
  61. <ListItemText primary="Auto Close Connections" />
  62. <Switch
  63. edge="end"
  64. checked={values.autoCloseConnection}
  65. onChange={(_, c) =>
  66. setValues((v) => ({ ...v, autoCloseConnection: c }))
  67. }
  68. />
  69. </ListItem>
  70. <ListItem sx={{ padding: "5px 2px" }}>
  71. <ListItemText primary="Default Latency Test" />
  72. <TextField
  73. size="small"
  74. autoComplete="off"
  75. autoCorrect="off"
  76. autoCapitalize="off"
  77. spellCheck="false"
  78. sx={{ width: 200 }}
  79. value={values.defaultLatencyTest}
  80. placeholder="http://www.gstatic.com/generate_204"
  81. onChange={(e) =>
  82. setValues((v) => ({ ...v, defaultLatencyTest: e.target.value }))
  83. }
  84. />
  85. </ListItem>
  86. </List>
  87. </DialogContent>
  88. <DialogActions>
  89. <Button variant="outlined" onClick={() => setOpen(false)}>
  90. {t("Cancel")}
  91. </Button>
  92. <Button onClick={onSave} variant="contained">
  93. {t("Save")}
  94. </Button>
  95. </DialogActions>
  96. </Dialog>
  97. );
  98. };
  99. export default MiscViewer;