import React, { useEffect, useState } from 'react'; import { Divider, Form, Grid, Header, Message } from 'semantic-ui-react'; import { API, removeTrailingSlash, showError, verifyJSON } from '../helpers'; const SystemSetting = () => { let [inputs, setInputs] = useState({ PasswordLoginEnabled: '', PasswordRegisterEnabled: '', EmailVerificationEnabled: '', GitHubOAuthEnabled: '', DiscordOAuthEnabled: '', GitHubClientId: '', GitHubClientSecret: '', DiscordClientId: '', DiscordClientSecret: '', Notice: '', SMTPServer: '', SMTPPort: '', SMTPAccount: '', SMTPFrom: '', SMTPToken: '', ServerAddress: '', Footer: '', WeChatAuthEnabled: '', WeChatServerAddress: '', WeChatServerToken: '', WeChatAccountQRCodeImageURL: '', TurnstileCheckEnabled: '', TurnstileSiteKey: '', TurnstileSecretKey: '', RegisterEnabled: '', }); const [originInputs, setOriginInputs] = useState({}); let [loading, setLoading] = 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); setOriginInputs(newInputs); } else { showError(message); } }; useEffect(() => { getOptions().then(); }, []); const updateOption = async (key, value) => { setLoading(true); switch (key) { case 'PasswordLoginEnabled': case 'PasswordRegisterEnabled': case 'EmailVerificationEnabled': case 'GitHubOAuthEnabled': case 'DiscordOAuthEnabled': case 'WeChatAuthEnabled': case 'TurnstileCheckEnabled': case 'RegisterEnabled': 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) { setInputs((inputs) => ({ ...inputs, [key]: value })); } else { showError(message); } setLoading(false); }; const handleInputChange = async (e, { name, value }) => { if ( name === 'Notice' || name.startsWith('SMTP') || name === 'ServerAddress' || name === 'DiscordClientId' || name === 'DiscordClientSecret' || name === 'GitHubClientId' || name === 'GitHubClientSecret' || name === 'WeChatServerAddress' || name === 'WeChatServerToken' || name === 'WeChatAccountQRCodeImageURL' || name === 'TurnstileSiteKey' || name === 'TurnstileSecretKey' ) { 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 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 submitDiscordOAuth = async () => { if (originInputs['DiscordClientId'] !== inputs.DiscordClientId) { await updateOption('DiscordClientId', inputs.DiscordClientId); } if ( originInputs['DiscordClientSecret'] !== inputs.DiscordClientSecret && inputs.DiscordClientSecret !== '' ) { await updateOption('DiscordClientSecret', inputs.DiscordClientSecret); } }; 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); } }; return (
General Settings
Update Server Address
Configure Login/Registration
Configure SMTP To support the system email sending
Save SMTP Settings
Configure Discord OAuth App To support login & registration via GitHub, Click here Manage your Discord OAuth App
Fill in the Homepage URL {inputs.ServerAddress} ,Fill in the Authorization callback URL{' '} {`${inputs.ServerAddress}/oauth/discord`} Save Discord OAuth Settings
Configure GitHub OAuth App To support login & registration via GitHub, Click here Manage your GitHub OAuth App
Fill in the Homepage URL {inputs.ServerAddress} ,Fill in the Authorization callback URL{' '} {`${inputs.ServerAddress}/oauth/github`} Save GitHub OAuth Settings
Configure WeChat Server To support login & registration via WeChat, Click here Learn about WeChat Server
Save WeChat Server Settings
Configure Turnstile To support user verification, Click here Manage your Turnstile Sites, recommend selecting Invisible Widget Type
Save Turnstile Settings
); }; export default SystemSetting;