Browse Source

refactor(OtherSetting): change UI, improve interaction

QuentinHsu 2 years ago
parent
commit
6413bf342a
1 changed files with 122 additions and 91 deletions
  1. 122 91
      web/src/components/OtherSetting.js

+ 122 - 91
web/src/components/OtherSetting.js

@@ -1,15 +1,15 @@
-import React, { useEffect, useState } from 'react';
-import { Button, Divider, Form, Grid, Header, Message, Modal } from 'semantic-ui-react';
+import React, { useEffect, useRef, useState } from 'react';
+import { Col, Row , Form, Button, Banner } from '@douyinfe/semi-ui';
 import { API, showError, showSuccess } from '../helpers';
 import { marked } from 'marked';
 
 const OtherSetting = () => {
   let [inputs, setInputs] = useState({
-    Footer: '',
     Notice: '',
-    About: '',
     SystemName: '',
     Logo: '',
+    Footer: '',
+    About: '',
     HomePageContent: ''
   });
   let [loading, setLoading] = useState(false);
@@ -19,25 +19,6 @@ const OtherSetting = () => {
     content: ''
   });
 
-  const getOptions = async () => {
-    const res = await API.get('/api/option/');
-    const { success, message, data } = res.data;
-    if (success) {
-      let newInputs = {};
-      data.forEach((item) => {
-        if (item.key in inputs) {
-          newInputs[item.key] = item.value;
-        }
-      });
-      setInputs(newInputs);
-    } else {
-      showError(message);
-    }
-  };
-
-  useEffect(() => {
-    getOptions().then();
-  }, []);
 
   const updateOption = async (key, value) => {
     setLoading(true);
@@ -54,34 +35,70 @@ const OtherSetting = () => {
     setLoading(false);
   };
 
-  const handleInputChange = async (e, { name, value }) => {
+  const [loadingInput, setLoadingInput] = useState({
+    Notice: false,
+    SystemName: false,
+    Logo: false,
+    HomePageContent: false,
+    About: false,
+    Footer: false
+  });
+  const handleInputChange = async (value, e) => {
+    const name = e.target.id;
     setInputs((inputs) => ({ ...inputs, [name]: value }));
   };
 
+  // 通用设置
+  const formAPISettingGeneral = useRef();
+  // 通用设置 - Notice
   const submitNotice = async () => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Notice: true }));
     await updateOption('Notice', inputs.Notice);
+    showSuccess('公告已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Notice: false }));
   };
-
-  const submitFooter = async () => {
-    await updateOption('Footer', inputs.Footer);
-  };
-
+  // 个性化设置
+  const formAPIPersonalization = useRef();
+  //  个性化设置 - SystemName
   const submitSystemName = async () => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, SystemName: true }));
     await updateOption('SystemName', inputs.SystemName);
+    showSuccess('系统名称已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, SystemName: false }));
   };
 
+  // Logo
   const submitLogo = async () => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Logo: true }));
     await updateOption('Logo', inputs.Logo);
+    showSuccess('Logo 已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Logo: false }));
   };
-
+  // 首页内容
+  const submitOption = async (key) => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, HomePageContent: true }));
+    await updateOption(key, inputs[key]);
+    showSuccess('首页内容已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, HomePageContent: false }));
+  };
+  // 关于
   const submitAbout = async () => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, About: true }));
     await updateOption('About', inputs.About);
+    showSuccess('关于内容已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, About: false }));
   };
-
-  const submitOption = async (key) => {
-    await updateOption(key, inputs[key]);
+  // 页脚
+  const submitFooter = async () => {
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: true }));
+    await updateOption('Footer', inputs.Footer);
+    showSuccess('页脚内容已更新');
+    setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: false }));
   };
 
+
+
+
   const openGitHubRelease = () => {
     window.location =
       'https://github.com/songquanpeng/one-api/releases/latest';
@@ -102,82 +119,96 @@ const OtherSetting = () => {
       setShowUpdateModal(true);
     }
   };
+  const getOptions = async () => {
+    const res = await API.get('/api/option/');
+    const { success, message, data } = res.data;
+    if (success) {
+      let newInputs = {};
+      data.forEach((item) => {
+        if (item.key in inputs) {
+          newInputs[item.key] = item.value;
+        }
+      });
+      setInputs(newInputs);
+      formAPISettingGeneral.current.setValues(newInputs);
+      formAPIPersonalization.current.setValues(newInputs);
+    } else {
+      showError(message);
+    }
+  };
+
+  useEffect( () => {
+    getOptions();
+  }, []);
+
 
   return (
-    <Grid columns={1}>
-      <Grid.Column>
-        <Form loading={loading}>
-          <Header as='h3'>通用设置</Header>
-          {/*<Form.Button onClick={checkUpdate}>检查更新</Form.Button>*/}
-          <Form.Group widths='equal'>
+    <Row >
+      <Col span={24}>
+        {/* 通用设置 */}
+        <Form values={inputs} getFormApi={formAPI => formAPISettingGeneral.current = formAPI} style={{marginBottom: 15}}>
+          <Form.Section text={'通用设置'}>
             <Form.TextArea
-              label='公告'
-              placeholder='在此输入新的公告内容,支持 Markdown & HTML 代码'
-              value={inputs.Notice}
-              name='Notice'
+              label={'公告'}
+              placeholder={'在此输入新的公告内容,支持 Markdown & HTML 代码'}
+              field={'Notice'}
               onChange={handleInputChange}
               style={{ minHeight: 150, fontFamily: 'JetBrains Mono, Consolas' }}
-            />
-          </Form.Group>
-          <Form.Button onClick={submitNotice}>保存公告</Form.Button>
-          <Divider />
-          <Header as='h3'>个性化设置</Header>
-          <Form.Group widths='equal'>
+              />
+            <Button onClick={submitNotice} loading={loadingInput['Notice']}>设置公告</Button>
+          </Form.Section>
+        </Form>
+        {/* 个性化设置 */}
+        <Form values={inputs} getFormApi={formAPI => formAPIPersonalization.current = formAPI} style={{marginBottom: 15}}>
+          <Form.Section text={'个性化设置'}>
             <Form.Input
-              label='系统名称'
-              placeholder='在此输入系统名称'
-              value={inputs.SystemName}
-              name='SystemName'
+              label={'系统名称'}
+              placeholder={'在此输入系统名称'}
+              field={'SystemName'}
               onChange={handleInputChange}
-            />
-          </Form.Group>
-          <Form.Button onClick={submitSystemName}>设置系统名称</Form.Button>
-          <Form.Group widths='equal'>
+              />
+            <Button onClick={submitSystemName} loading={loadingInput['SystemName']}>设置系统名称</Button>
             <Form.Input
-              label='Logo 图片地址'
-              placeholder='在此输入 Logo 图片地址'
-              value={inputs.Logo}
-              name='Logo'
-              type='url'
+              label={'Logo 图片地址'}
+              placeholder={'在此输入 Logo 图片地址'}
+              field={'Logo'}
               onChange={handleInputChange}
-            />
-          </Form.Group>
-          <Form.Button onClick={submitLogo}>设置 Logo</Form.Button>
-          <Form.Group widths='equal'>
+              />
+            <Button onClick={submitLogo} loading={loadingInput['Logo']}>设置 Logo</Button>
             <Form.TextArea
-              label='首页内容'
-              placeholder='在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页。'
-              value={inputs.HomePageContent}
-              name='HomePageContent'
+              label={'首页内容'}
+              placeholder={'在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页。'}
+              field={'HomePageContent'}
               onChange={handleInputChange}
               style={{ minHeight: 150, fontFamily: 'JetBrains Mono, Consolas' }}
-            />
-          </Form.Group>
-          <Form.Button onClick={() => submitOption('HomePageContent')}>保存首页内容</Form.Button>
-          <Form.Group widths='equal'>
+              />
+            <Button onClick={() => submitOption('HomePageContent')} loading={loadingInput['HomePageContent']}>设置首页内容</Button>
             <Form.TextArea
-              label='关于'
-              placeholder='在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面。'
-              value={inputs.About}
-              name='About'
+              label={'关于'}
+              placeholder={'在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面。'}
+              field={'About'}
               onChange={handleInputChange}
               style={{ minHeight: 150, fontFamily: 'JetBrains Mono, Consolas' }}
+              />
+            <Button onClick={submitAbout} loading={loadingInput['About']}>设置关于</Button>
+            {/*  */}
+            <Banner
+              fullMode={false}
+              type="info"
+              description="移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目。"
+              closeIcon={null}
+              style={{  marginTop: 15 }}
             />
-          </Form.Group>
-          <Form.Button onClick={submitAbout}>保存关于</Form.Button>
-          <Message>移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目。</Message>
-          <Form.Group widths='equal'>
             <Form.Input
-              label='页脚'
-              placeholder='在此输入新的页脚,留空则使用默认页脚,支持 HTML 代码'
-              value={inputs.Footer}
-              name='Footer'
+              label={'页脚'}
+              placeholder={'在此输入新的页脚,留空则使用默认页脚,支持 HTML 代码'}
+              field={'Footer'}
               onChange={handleInputChange}
-            />
-          </Form.Group>
-          <Form.Button onClick={submitFooter}>设置页脚</Form.Button>
+              />
+            <Button onClick={submitFooter} loading={loadingInput['Footer']}>设置页脚</Button>
+          </Form.Section>
         </Form>
-      </Grid.Column>
+      </Col>
       {/*<Modal*/}
       {/*  onClose={() => setShowUpdateModal(false)}*/}
       {/*  onOpen={() => setShowUpdateModal(true)}*/}
@@ -200,7 +231,7 @@ const OtherSetting = () => {
       {/*    />*/}
       {/*  </Modal.Actions>*/}
       {/*</Modal>*/}
-    </Grid>
+   </Row>
   );
 };