All files / src/components/PageForm index.tsx

0% Statements 0/9
0% Branches 0/8
0% Functions 0/2
0% Lines 0/9

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