Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e82b5a21
authored
Mar 06, 2024
by
QuentinHsu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor(OtherSetting): change UI, improve interaction
parent
d703cccc
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
122 additions
and
91 deletions
+122
-91
web/src/components/OtherSetting.js
+122
-91
No files found.
web/src/components/OtherSetting.js
View file @
e82b5a21
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
{
Button
,
Divider
,
Form
,
Grid
,
Header
,
Message
,
Modal
}
from
'semantic-ui-react
'
;
import
React
,
{
useEffect
,
use
Ref
,
use
State
}
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.Butt
on
>
/
>
<
Button
onClick
=
{
submitFooter
}
loading
=
{
loadingInput
[
'Footer'
]}
>
设置页脚
<
/Button
>
<
/Form.Secti
on
>
<
/Form
>
<
/
Grid.Column
>
<
/
Col
>
{
/*<Modal*/
}
{
/* onClose={() => setShowUpdateModal(false)}*/
}
{
/* onOpen={() => setShowUpdateModal(true)}*/
}
...
...
@@ -200,7 +231,7 @@ const OtherSetting = () => {
{
/* />*/
}
{
/* </Modal.Actions>*/
}
{
/*</Modal>*/
}
<
/Grid
>
<
/Row
>
);
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment