import { Button, ControlGroup, Dialog, DialogBody, DialogFooter, Icon, InputGroup, Tag, } from '@blueprintjs/core'; import { parseMemoryMB, parseTimeMS } from '@hydrooj/utils/lib/common'; import { isEqual } from 'lodash'; import React, { useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { i18n } from 'vj/utils'; import { RootState } from '../reducer'; interface SubtaskSettingsProps { subtaskId: number; time: string; memory: string; } export function SubtaskSettings(props: SubtaskSettingsProps) { const [open, setOpen] = React.useState(false); const [depsOpen, setDepsOpen] = React.useState(false); const score = useSelector((state: RootState) => state.config.subtasks.find((i) => i.id === props.subtaskId).score); const time = useSelector((state: RootState) => state.config.subtasks.find((i) => i.id === props.subtaskId).time); const memory = useSelector((state: RootState) => state.config.subtasks.find((i) => i.id === props.subtaskId).memory); const deps = useSelector((state: RootState) => state.config.subtasks.find((i) => i.id === props.subtaskId).if || [], isEqual); const type = useSelector((state: RootState) => state.config.subtasks.find((i) => i.id === props.subtaskId).type || 'min'); const [ctime, setTime] = React.useState(time); const [cmemory, setMemory] = React.useState(memory); const [cscore, setScore] = React.useState(score); const [cdeps, setDeps] = React.useState(deps.join(', ')); const [ctype, setType] = React.useState(type); const dispatch = useDispatch(); useEffect(() => { dispatch({ type: 'problemconfig/updateSubtaskConfig', id: props.subtaskId, payload: { type: ctype, }, }); }, [ctype]); function onConfirm() { dispatch({ type: 'problemconfig/updateSubtaskConfig', id: props.subtaskId, payload: { time: ctime, memory: cmemory, score: cscore, if: cdeps.split(',').map((i) => i.trim()).filter((i) => +i).map((i) => +i), }, }); setOpen(false); setDepsOpen(false); } return (<> setOpen(false)}> } rightElement={ms} onChange={(ev) => setTime(`${ev.currentTarget.value}ms`)} placeholder={`Inherit (${parseTimeMS(props.time, false) || '1000'})`} value={ctime ? parseTimeMS(ctime, false).toString() || '' : ''} /> } rightElement={MB} onChange={(ev) => setMemory(`${ev.currentTarget.value}MB`)} placeholder={`Inherit (${parseMemoryMB(props.memory, false) || '256'})`} value={cmemory ? parseMemoryMB(cmemory, false).toString() || '' : ''} /> } onChange={(ev) => setScore(+ev.target.value || 0)} placeholder="Score" type="number" value={cscore.toString()} /> } /> setDepsOpen(false)}> } onChange={(ev) => setDeps(ev.currentTarget.value)} placeholder={'Dependencies'} value={cdeps || ''} /> } />
  • setOpen(true)}>
       {time || props.time || '1s'}    {memory || props.memory || '256m'} {' '} {score || 0}
  • setDepsOpen(true)}>
       {i18n('Dependencies')}: {deps.length ? deps.join(', ') : i18n('(None)')}
  • {i18n('Scoring method')}
  • ); } export function GlobalSettings() { const time = useSelector((s: RootState) => s.config?.time); const memory = useSelector((s: RootState) => s.config?.memory); const [open, setOpen] = React.useState(false); const [ctime, setTime] = React.useState(time); const [cmemory, setMemory] = React.useState(memory); React.useEffect(() => { setTime(time); }, [time]); React.useEffect(() => { setMemory(memory); }, [memory]); const dispatch = useDispatch(); function onConfirm() { dispatch({ type: 'problemconfig/updateGlobalConfig', time: ctime, memory: cmemory, }); setOpen(false); } return (<> setOpen(false)}> } rightElement={ms} onChange={(ev) => setTime(`${ev.currentTarget.value}ms`)} placeholder="1000" value={ctime ? parseTimeMS(ctime, false).toString() || '' : ''} /> } rightElement={MB} onChange={(ev) => setMemory(`${ev.currentTarget.value}MB`)} placeholder="256" value={cmemory ? parseMemoryMB(cmemory, false).toString() || '' : ''} /> } />
  • setOpen(true)}>
       {time || '1s'} {' '} {memory || '256MB'}
  • ); }