All files / client/components/Admin/App AppPage.tsx

0% Statements 0/35
0% Branches 0/6
0% Functions 0/13
0% Lines 0/29

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')} />
      </>
    )
  )
}