controller-viewer.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { forwardRef, useImperativeHandle, useState } from "react";
  2. import { useLockFn } from "ahooks";
  3. import { useTranslation } from "react-i18next";
  4. import { List, ListItem, ListItemText, TextField } from "@mui/material";
  5. import { useClashInfo } from "@/hooks/use-clash";
  6. import { BaseDialog, DialogRef, Notice } from "@/components/base";
  7. export const ControllerViewer = forwardRef<DialogRef>((props, ref) => {
  8. const { t } = useTranslation();
  9. const [open, setOpen] = useState(false);
  10. const { clashInfo, patchInfo } = useClashInfo();
  11. const [controller, setController] = useState(clashInfo?.server || "");
  12. const [secret, setSecret] = useState(clashInfo?.secret || "");
  13. useImperativeHandle(ref, () => ({
  14. open: () => {
  15. setOpen(true);
  16. setController(clashInfo?.server || "");
  17. setSecret(clashInfo?.secret || "");
  18. },
  19. close: () => setOpen(false),
  20. }));
  21. const onSave = useLockFn(async () => {
  22. try {
  23. await patchInfo({ "external-controller": controller, secret });
  24. Notice.success("Change Clash Config successfully!", 1000);
  25. setOpen(false);
  26. } catch (err: any) {
  27. Notice.error(err.message || err.toString(), 4000);
  28. }
  29. });
  30. return (
  31. <BaseDialog
  32. open={open}
  33. title={t("Clash Port")}
  34. contentSx={{ width: 400 }}
  35. okBtn={t("Save")}
  36. cancelBtn={t("Cancel")}
  37. onClose={() => setOpen(false)}
  38. onCancel={() => setOpen(false)}
  39. onOk={onSave}
  40. >
  41. <List>
  42. <ListItem sx={{ padding: "5px 2px" }}>
  43. <ListItemText primary="External Controller" />
  44. <TextField
  45. size="small"
  46. autoComplete="off"
  47. sx={{ width: 175 }}
  48. value={controller}
  49. placeholder="Required"
  50. onChange={(e) => setController(e.target.value)}
  51. />
  52. </ListItem>
  53. <ListItem sx={{ padding: "5px 2px" }}>
  54. <ListItemText primary="Core Secret" />
  55. <TextField
  56. size="small"
  57. autoComplete="off"
  58. sx={{ width: 175 }}
  59. value={secret}
  60. placeholder="Recommended"
  61. onChange={(e) => setSecret(e.target.value)}
  62. />
  63. </ListItem>
  64. </List>
  65. </BaseDialog>
  66. );
  67. });