misc-viewer.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { forwardRef, useImperativeHandle, useState } from "react";
  2. import { useLockFn } from "ahooks";
  3. import { useTranslation } from "react-i18next";
  4. import { List, ListItem, ListItemText, Switch, TextField } from "@mui/material";
  5. import { useVerge } from "@/hooks/use-verge";
  6. import { BaseDialog, DialogRef } from "@/components/base";
  7. import Notice from "@/components/base/base-notice";
  8. export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
  9. const { t } = useTranslation();
  10. const { verge, patchVerge } = useVerge();
  11. const [open, setOpen] = useState(false);
  12. const [values, setValues] = useState({
  13. autoCloseConnection: false,
  14. defaultLatencyTest: "",
  15. });
  16. useImperativeHandle(ref, () => ({
  17. open: () => {
  18. setOpen(true);
  19. setValues({
  20. autoCloseConnection: verge?.auto_close_connection || false,
  21. defaultLatencyTest: verge?.default_latency_test || "",
  22. });
  23. },
  24. close: () => setOpen(false),
  25. }));
  26. const onSave = useLockFn(async () => {
  27. try {
  28. await patchVerge({
  29. auto_close_connection: values.autoCloseConnection,
  30. default_latency_test: values.defaultLatencyTest,
  31. });
  32. setOpen(false);
  33. } catch (err: any) {
  34. Notice.error(err.message || err.toString());
  35. }
  36. });
  37. return (
  38. <BaseDialog
  39. open={open}
  40. title={t("Miscellaneous")}
  41. contentSx={{ width: 420 }}
  42. okBtn={t("Save")}
  43. cancelBtn={t("Cancel")}
  44. onClose={() => setOpen(false)}
  45. onCancel={() => setOpen(false)}
  46. onOk={onSave}
  47. >
  48. <List>
  49. <ListItem sx={{ padding: "5px 2px" }}>
  50. <ListItemText primary="Auto Close Connections" />
  51. <Switch
  52. edge="end"
  53. checked={values.autoCloseConnection}
  54. onChange={(_, c) =>
  55. setValues((v) => ({ ...v, autoCloseConnection: c }))
  56. }
  57. />
  58. </ListItem>
  59. <ListItem sx={{ padding: "5px 2px" }}>
  60. <ListItemText primary="Default Latency Test" />
  61. <TextField
  62. size="small"
  63. autoComplete="off"
  64. autoCorrect="off"
  65. autoCapitalize="off"
  66. spellCheck="false"
  67. sx={{ width: 200 }}
  68. value={values.defaultLatencyTest}
  69. placeholder="http://www.gstatic.com/generate_204"
  70. onChange={(e) =>
  71. setValues((v) => ({ ...v, defaultLatencyTest: e.target.value }))
  72. }
  73. />
  74. </ListItem>
  75. </List>
  76. </BaseDialog>
  77. );
  78. });