SettingsDrawing.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import React, { useEffect, useState, useRef } from 'react';
  2. import { Button, Col, Form, Row, Spin, Tag } from '@douyinfe/semi-ui';
  3. import {
  4. compareObjects,
  5. API,
  6. showError,
  7. showSuccess,
  8. showWarning,
  9. } from '../../../helpers';
  10. export default function SettingsDrawing(props) {
  11. const [loading, setLoading] = useState(false);
  12. const [inputs, setInputs] = useState({
  13. DrawingEnabled: false,
  14. MjNotifyEnabled: false,
  15. MjAccountFilterEnabled: false,
  16. MjForwardUrlEnabled: false,
  17. MjModeClearEnabled: false,
  18. });
  19. const refForm = useRef();
  20. const [inputsRow, setInputsRow] = useState(inputs);
  21. function onSubmit() {
  22. const updateArray = compareObjects(inputs, inputsRow);
  23. if (!updateArray.length) return showWarning('你似乎并没有修改什么');
  24. const requestQueue = updateArray.map((item) => {
  25. let value = '';
  26. if (typeof inputs[item.key] === 'boolean') {
  27. value = String(inputs[item.key]);
  28. } else {
  29. value = inputs[item.key];
  30. }
  31. return API.put('/api/option/', {
  32. key: item.key,
  33. value,
  34. });
  35. });
  36. setLoading(true);
  37. Promise.all(requestQueue)
  38. .then((res) => {
  39. if (requestQueue.length === 1) {
  40. if (res.includes(undefined)) return;
  41. } else if (requestQueue.length > 1) {
  42. if (res.includes(undefined)) return showError('部分更新失败');
  43. }
  44. showSuccess('更新成功');
  45. })
  46. .catch(() => {
  47. showError('更新失败');
  48. })
  49. .finally(() => {
  50. setLoading(false);
  51. setInputsRow(structuredClone(inputs));
  52. });
  53. }
  54. useEffect(() => {
  55. const currentInputs = {};
  56. for (let key in props.options) {
  57. if (Object.keys(inputs).includes(key)) {
  58. currentInputs[key] = props.options[key];
  59. }
  60. }
  61. setInputs(currentInputs);
  62. setInputsRow(structuredClone(currentInputs));
  63. refForm.current.setValues(currentInputs);
  64. }, [props.options]);
  65. return (
  66. <>
  67. <Spin spinning={loading}>
  68. <Form
  69. values={inputs}
  70. getFormApi={(formAPI) => (refForm.current = formAPI)}
  71. style={{ marginBottom: 15 }}
  72. >
  73. <Form.Section text={'绘图设置'}>
  74. <Row gutter={16}>
  75. <Col span={8}>
  76. <Form.Switch
  77. field={'DrawingEnabled'}
  78. label={'启用绘图功能'}
  79. size='large'
  80. checkedText='|'
  81. uncheckedText='〇'
  82. defaultChecked={false}
  83. checked={false}
  84. onChange={(value) => {
  85. setInputs({
  86. ...inputs,
  87. DrawingEnabled: value,
  88. });
  89. }}
  90. />
  91. </Col>
  92. <Col span={8}>
  93. <Form.Switch
  94. field={'MjNotifyEnabled'}
  95. label={'允许回调(会泄露服务器 IP 地址)'}
  96. size='large'
  97. checkedText='|'
  98. uncheckedText='〇'
  99. defaultChecked={false}
  100. checked={false}
  101. onChange={(value) =>
  102. setInputs({
  103. ...inputs,
  104. MjNotifyEnabled: value,
  105. })
  106. }
  107. />
  108. </Col>
  109. <Col span={8}>
  110. <Form.Switch
  111. field={'MjAccountFilterEnabled'}
  112. label={'允许 AccountFilter 参数'}
  113. size='large'
  114. checkedText='|'
  115. uncheckedText='〇'
  116. defaultChecked={false}
  117. checked={false}
  118. onChange={(value) =>
  119. setInputs({
  120. ...inputs,
  121. MjAccountFilterEnabled: value,
  122. })
  123. }
  124. />
  125. </Col>
  126. <Col span={8}>
  127. <Form.Switch
  128. field={'MjForwardUrlEnabled'}
  129. label={'开启之后将上游地址替换为服务器地址'}
  130. size='large'
  131. checkedText='|'
  132. uncheckedText='〇'
  133. defaultChecked={false}
  134. checked={false}
  135. onChange={(value) =>
  136. setInputs({
  137. ...inputs,
  138. MjForwardUrlEnabled: value,
  139. })
  140. }
  141. />
  142. </Col>
  143. <Col span={8}>
  144. <Form.Switch
  145. field={'MjModeClearEnabled'}
  146. label={
  147. <>
  148. 开启之后会清除用户提示词中的 <Tag>--fast</Tag> 、
  149. <Tag>--relax</Tag> 以及 <Tag>--turbo</Tag> 参数
  150. </>
  151. }
  152. size='large'
  153. checkedText='|'
  154. uncheckedText='〇'
  155. defaultChecked={false}
  156. checked={false}
  157. onChange={(value) =>
  158. setInputs({
  159. ...inputs,
  160. MjModeClearEnabled: value,
  161. })
  162. }
  163. />
  164. </Col>
  165. </Row>
  166. <Row>
  167. <Button size='large' onClick={onSubmit}>
  168. 保存绘图设置
  169. </Button>
  170. </Row>
  171. </Form.Section>
  172. </Form>
  173. </Spin>
  174. </>
  175. );
  176. }