import { useState, useEffect } from 'react';
import SubCard from 'ui-component/cards/SubCard';
import {
Stack,
FormControl,
InputLabel,
OutlinedInput,
Checkbox,
Button,
FormControlLabel,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Divider,
Alert,
Autocomplete,
TextField
} from '@mui/material';
import Grid from '@mui/material/Unstable_Grid2';
import { showError, showSuccess, removeTrailingSlash } from 'utils/common'; //,
import { API } from 'utils/api';
import { createFilterOptions } from '@mui/material/Autocomplete';
const filter = createFilterOptions();
const SystemSetting = () => {
let [inputs, setInputs] = useState({
PasswordLoginEnabled: '',
PasswordRegisterEnabled: '',
EmailVerificationEnabled: '',
GitHubOAuthEnabled: '',
GitHubClientId: '',
GitHubClientSecret: '',
LarkClientId: '',
LarkClientSecret: '',
OAuth2Enabled: '',
OAuth2AppId: '',
OAuth2AppSecret: '',
OAuth2AuthorizationEndpoint: '',
OAuth2TokenEndpoint: '',
OAuth2UserinfoEndpoint: '',
Notice: '',
SMTPServer: '',
SMTPPort: '',
SMTPAccount: '',
SMTPFrom: '',
SMTPToken: '',
ServerAddress: '',
Footer: '',
WeChatAuthEnabled: '',
WeChatServerAddress: '',
WeChatServerToken: '',
WeChatAccountQRCodeImageURL: '',
TurnstileCheckEnabled: '',
TurnstileSiteKey: '',
TurnstileSecretKey: '',
RegisterEnabled: '',
EmailDomainRestrictionEnabled: '',
EmailDomainWhitelist: [],
MessagePusherAddress: '',
MessagePusherToken: ''
});
const [originInputs, setOriginInputs] = useState({});
let [loading, setLoading] = useState(false);
const [EmailDomainWhitelist, setEmailDomainWhitelist] = useState([]);
const [showPasswordWarningModal, setShowPasswordWarningModal] = useState(false);
const getOptions = async () => {
const res = await API.get('/api/option/');
const { success, message, data } = res.data;
if (success) {
let newInputs = {};
data.forEach((item) => {
newInputs[item.key] = item.value;
});
setInputs({
...newInputs,
EmailDomainWhitelist: newInputs.EmailDomainWhitelist.split(',')
});
setOriginInputs(newInputs);
setEmailDomainWhitelist(newInputs.EmailDomainWhitelist.split(','));
} else {
showError(message);
}
};
useEffect(() => {
getOptions().then();
}, []);
const updateOption = async (key, value) => {
setLoading(true);
switch (key) {
case 'PasswordLoginEnabled':
case 'PasswordRegisterEnabled':
case 'EmailVerificationEnabled':
case 'GitHubOAuthEnabled':
case 'WeChatAuthEnabled':
case 'TurnstileCheckEnabled':
case 'EmailDomainRestrictionEnabled':
case 'RegisterEnabled':
case 'OAuth2Enabled':
value = inputs[key] === 'true' ? 'false' : 'true';
break;
default:
break;
}
const res = await API.put('/api/option/', {
key,
value
});
const { success, message } = res.data;
if (success) {
if (key === 'EmailDomainWhitelist') {
value = value.split(',');
}
setInputs((inputs) => ({
...inputs,
[key]: value
}));
showSuccess('设置成功!');
} else {
showError(message);
}
setLoading(false);
};
const handleInputChange = async (event) => {
let { name, value } = event.target;
if (name === 'PasswordLoginEnabled' && inputs[name] === 'true') {
// block disabling password login
setShowPasswordWarningModal(true);
return;
}
if (
name === 'Notice' ||
name.startsWith('SMTP') ||
name === 'ServerAddress' ||
name === 'GitHubClientId' ||
name === 'GitHubClientSecret' ||
name === 'WeChatServerAddress' ||
name === 'WeChatServerToken' ||
name === 'WeChatAccountQRCodeImageURL' ||
name === 'TurnstileSiteKey' ||
name === 'TurnstileSecretKey' ||
name === 'EmailDomainWhitelist' ||
name === 'MessagePusherAddress' ||
name === 'MessagePusherToken' ||
name === 'LarkClientId' ||
name === 'LarkClientSecret' ||
name === 'OAuth2AppId' ||
name === 'OAuth2AppSecret' ||
name === 'OAuth2AuthorizationEndpoint' ||
name === 'OAuth2TokenEndpoint' ||
name === 'OAuth2UserinfoEndpoint'
)
{
setInputs((inputs) => ({ ...inputs, [name]: value }));
} else {
await updateOption(name, value);
}
};
const submitServerAddress = async () => {
let ServerAddress = removeTrailingSlash(inputs.ServerAddress);
await updateOption('ServerAddress', ServerAddress);
};
const submitSMTP = async () => {
if (originInputs['SMTPServer'] !== inputs.SMTPServer) {
await updateOption('SMTPServer', inputs.SMTPServer);
}
if (originInputs['SMTPAccount'] !== inputs.SMTPAccount) {
await updateOption('SMTPAccount', inputs.SMTPAccount);
}
if (originInputs['SMTPFrom'] !== inputs.SMTPFrom) {
await updateOption('SMTPFrom', inputs.SMTPFrom);
}
if (originInputs['SMTPPort'] !== inputs.SMTPPort && inputs.SMTPPort !== '') {
await updateOption('SMTPPort', inputs.SMTPPort);
}
if (originInputs['SMTPToken'] !== inputs.SMTPToken && inputs.SMTPToken !== '') {
await updateOption('SMTPToken', inputs.SMTPToken);
}
};
const submitEmailDomainWhitelist = async () => {
await updateOption('EmailDomainWhitelist', inputs.EmailDomainWhitelist.join(','));
};
const submitWeChat = async () => {
if (originInputs['WeChatServerAddress'] !== inputs.WeChatServerAddress) {
await updateOption('WeChatServerAddress', removeTrailingSlash(inputs.WeChatServerAddress));
}
if (originInputs['WeChatAccountQRCodeImageURL'] !== inputs.WeChatAccountQRCodeImageURL) {
await updateOption('WeChatAccountQRCodeImageURL', inputs.WeChatAccountQRCodeImageURL);
}
if (originInputs['WeChatServerToken'] !== inputs.WeChatServerToken && inputs.WeChatServerToken !== '') {
await updateOption('WeChatServerToken', inputs.WeChatServerToken);
}
};
const submitGitHubOAuth = async () => {
if (originInputs['GitHubClientId'] !== inputs.GitHubClientId) {
await updateOption('GitHubClientId', inputs.GitHubClientId);
}
if (originInputs['GitHubClientSecret'] !== inputs.GitHubClientSecret && inputs.GitHubClientSecret !== '') {
await updateOption('GitHubClientSecret', inputs.GitHubClientSecret);
}
};
const submitTurnstile = async () => {
if (originInputs['TurnstileSiteKey'] !== inputs.TurnstileSiteKey) {
await updateOption('TurnstileSiteKey', inputs.TurnstileSiteKey);
}
if (originInputs['TurnstileSecretKey'] !== inputs.TurnstileSecretKey && inputs.TurnstileSecretKey !== '') {
await updateOption('TurnstileSecretKey', inputs.TurnstileSecretKey);
}
};
const submitMessagePusher = async () => {
if (originInputs['MessagePusherAddress'] !== inputs.MessagePusherAddress) {
await updateOption('MessagePusherAddress', removeTrailingSlash(inputs.MessagePusherAddress));
}
if (originInputs['MessagePusherToken'] !== inputs.MessagePusherToken && inputs.MessagePusherToken !== '') {
await updateOption('MessagePusherToken', inputs.MessagePusherToken);
}
};
const submitLarkOAuth = async () => {
if (originInputs['LarkClientId'] !== inputs.LarkClientId) {
await updateOption('LarkClientId', inputs.LarkClientId);
}
if (originInputs['LarkClientSecret'] !== inputs.LarkClientSecret && inputs.LarkClientSecret !== '') {
await updateOption('LarkClientSecret', inputs.LarkClientSecret);
}
};
const submitOAuth2 = async () => {
const OAuth2Config = {
OAuth2AppId: inputs.OAuth2AppId,
OAuth2AppSecret: inputs.OAuth2AppSecret,
OAuth2AuthorizationEndpoint: inputs.OAuth2AuthorizationEndpoint,
OAuth2TokenEndpoint: inputs.OAuth2TokenEndpoint,
OAuth2UserinfoEndpoint: inputs.OAuth2UserinfoEndpoint
};
console.log(OAuth2Config);
if (originInputs['OAuth2AppId'] !== inputs.OAuth2AppId) {
await updateOption('OAuth2AppId', inputs.OAuth2AppId);
}
if (originInputs['OAuth2AppSecret'] !== inputs.OAuth2AppSecret && inputs.OAuth2AppSecret !== '') {
await updateOption('OAuth2AppSecret', inputs.OAuth2AppSecret);
}
if (originInputs['OAuth2AuthorizationEndpoint'] !== inputs.OAuth2AuthorizationEndpoint) {
await updateOption('OAuth2AuthorizationEndpoint', inputs.OAuth2AuthorizationEndpoint);
}
if (originInputs['OAuth2TokenEndpoint'] !== inputs.OAuth2TokenEndpoint) {
await updateOption('OAuth2TokenEndpoint', inputs.OAuth2TokenEndpoint);
}
if (originInputs['OAuth2UserinfoEndpoint'] !== inputs.OAuth2UserinfoEndpoint) {
await updateOption('OAuth2UserinfoEndpoint', inputs.OAuth2UserinfoEndpoint);
}
};
return (
<>
服务器地址
}
/>
}
/>
}
/>
}
/>
}
/>
}
/>
}
/>
}
/>
}
/>
{
const event = {
target: {
name: 'EmailDomainWhitelist',
value: value
}
};
handleInputChange(event);
}}
filterSelectedOptions
renderInput={(params) => }
filterOptions={(options, params) => {
const filtered = filter(options, params);
const { inputValue } = params;
const isExisting = options.some((option) => inputValue === option);
if (inputValue !== '' && !isExisting) {
filtered.push(inputValue);
}
return filtered;
}}
/>
SMTP 服务器地址
SMTP 端口
SMTP 账户
SMTP 发送者邮箱
SMTP 访问凭证
{' '}
用以支持通过 GitHub 进行登录注册,
点击此处
管理你的 GitHub OAuth App
}
>
Homepage URL 填 {inputs.ServerAddress}
,Authorization callback URL 填 {`${inputs.ServerAddress}/oauth/github`}
GitHub Client ID
GitHub Client Secret
{' '}
用以支持通过飞书进行登录注册,
点击此处
管理你的飞书应用
}
>
主页链接填 {inputs.ServerAddress}
,重定向 URL 填 {`${inputs.ServerAddress}/oauth/lark`}
App ID
App Secret
用以支持通过微信进行登录注册,
点击此处
了解 WeChat Server
}
>
WeChat Server 服务器地址
WeChat Server 访问凭证
微信公众号二维码图片链接
用以支持通过第三方 OAuth2 登录,例如 Okta、Auth0 或自建的兼容 OAuth2.0 协议的 IdP 等
}
>
主页链接填 { inputs.ServerAddress }
,重定向 URL 填 { `${ inputs.ServerAddress }/oauth/oidc` }
App ID
App Secret
授权地址
认证地址
用户地址
用以推送报警信息,
点击此处
了解 Message Pusher
}
>
Message Pusher 推送地址
Message Pusher 访问凭证
用以支持用户校验,
点击此处
管理你的 Turnstile Sites,推荐选择 Invisible Widget Type
}
>
Turnstile Site Key
Turnstile Secret Key
>
);
};
export default SystemSetting;