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 | import React, { CSSProperties, useState } from 'react'; import { Box, useTheme } from '@mui/material'; import useDeviceInfo from '../../utils/useDeviceInfo'; import FormBottomBar, { FormButton } from '../FormBottomBar'; import BusySpinner from '../BusySpinner'; export type PageFormProps = { children: React.ReactNode; cancelID: string; saveID: string; onCancel: () => void; onSave: () => void; cancelButtonText: string; saveButtonText: string; saveDisabled?: boolean; className?: string; hideEdit?: boolean; additionalRightButtons?: FormButton[]; style?: CSSProperties; }; export default function PageForm(props: PageFormProps): JSX.Element { const { children, className, hideEdit, onSave, style, ...bottomBarProps } = props; const theme = useTheme(); const { isMobile } = useDeviceInfo(); const [processing, setProcessing] = useState(false); const handleSave = async () => { setProcessing(true); // eslint-disable-next-line @typescript-eslint/await-thenable await onSave(); // <-- we want all onSaves to be async setProcessing(false); }; return ( <> {processing && <BusySpinner withSkrim={true} />} <Box className={className} paddingBottom={hideEdit ? theme.spacing(4) : theme.spacing(isMobile ? 25 : 15)} style={style} > {children} </Box> {/* eslint-disable-next-line @typescript-eslint/no-misused-promises */} {!hideEdit && <FormBottomBar onSave={handleSave} {...bottomBarProps} />} </> ); } |