import React, { useState } from 'react'; import { ServerEggVariable } from '@/api/server/types'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; import { usePermissions } from '@/plugins/usePermissions'; import InputSpinner from '@/components/elements/InputSpinner'; import Input from '@/components/elements/Input'; import tw from 'twin.macro'; import { debounce } from 'debounce'; import updateStartupVariable from '@/api/server/updateStartupVariable'; import useServer from '@/plugins/useServer'; import { ServerContext } from '@/state/server'; import useFlash from '@/plugins/useFlash'; import FlashMessageRender from '@/components/FlashMessageRender'; interface Props { variable: ServerEggVariable; } const VariableBox = ({ variable }: Props) => { const FLASH_KEY = `server:startup:${variable.envVariable}`; const server = useServer(); const [ loading, setLoading ] = useState(false); const [ canEdit ] = usePermissions([ 'startup.update' ]); const { clearFlashes, clearAndAddHttpError } = useFlash(); const setServer = ServerContext.useStoreActions(actions => actions.server.setServer); const setVariableValue = debounce((value: string) => { setLoading(true); clearFlashes(FLASH_KEY); updateStartupVariable(server.uuid, variable.envVariable, value) .then(response => setServer({ ...server, variables: server.variables.map(v => v.envVariable === response.envVariable ? response : v), })) .catch(error => { console.error(error); clearAndAddHttpError({ error, key: FLASH_KEY }); }) .then(() => setLoading(false)); }, 500); return ( setVariableValue(e.currentTarget.value)} readOnly={!canEdit} name={variable.envVariable} defaultValue={variable.serverValue} placeholder={variable.defaultValue} />

{variable.description}

); }; export default VariableBox;