Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import React, { useContext, useState } from 'react'
import { AdminContext } from 'components/Admin/AdminPage'
import AppSettings from './AppSettings'
import SecuritySettings from './SecuritySettings'
import MailSettings from './MailSettings'
import AWSSettings from './AWSSettings'
import GoogleSettings from './GoogleSettings'
import GitHubSettings from './GitHubSettings'
function useRequest() {
const [requesting, setRequesting] = useState(false)
const startRequest = () => setRequesting(true)
const finishRequest = () => setRequesting(false)
const executeRequest = async request => {
try {
startRequest()
await request()
} finally {
finishRequest()
}
}
return [{ requesting }, { startRequest, finishRequest, executeRequest }] as const
}
function useAlert() {
const [alert, setAlert] = useState({})
const showAlert = (action, status, message) => setAlert({ ...alert, [action]: { message, status, show: true } })
const hideAlert = action => {
const { message, status } = alert[action] || { message: '', status: '' }
setAlert({ ...alert, [action]: { message, status, show: false } })
}
return [{ alert }, { showAlert, hideAlert }] as const
}
export default function AppPage() {
const { crowi, loading, settingForm, registrationMode, isUploadable, fetchSettings } = useContext(AdminContext)
const [{ requesting }, { executeRequest }] = useRequest()
const [{ alert }, { showAlert, hideAlert }] = useAlert()
const defaultAlert = { status: '', show: false, message: '' }
const updateSettings = action => params =>
executeRequest(async () => {
try {
await crowi.apiPost(`/admin/settings/${action}`, { settingForm: params })
await fetchSettings()
showAlert(action, 'success', 'Updated')
} catch ({ message }) {
showAlert(action, 'danger', message)
} finally {
setTimeout(() => hideAlert(action), 5000)
}
})
const getProps = action => ({ update: updateSettings(action), alert: alert[action] || defaultAlert, settingForm, requesting })
return (
!loading && (
<>
<AppSettings isUploadable={isUploadable} {...getProps('app')} />
<SecuritySettings registrationMode={registrationMode} {...getProps('sec')} />
<MailSettings {...getProps('mail')} />
<AWSSettings {...getProps('aws')} />
<GoogleSettings {...getProps('google')} />
<GitHubSettings {...getProps('github')} />
</>
)
)
}
|