AutoSave.jsx 869 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import React from "react";
  2. import { FormSpy } from "react-final-form";
  3. const diff = (o1, o2) => {
  4. const keys = [...new Set([...Object.keys(o1), ...Object.keys(o2)])];
  5. const result = keys.reduce((diff, key) => {
  6. if (o1[key] === o2[key]) return diff;
  7. return {
  8. ...diff,
  9. [key]: o2[key],
  10. };
  11. }, {});
  12. if (Object.keys(result).length === 0) {
  13. return null;
  14. }
  15. return result;
  16. };
  17. const AutoSaveIn = ({ values, save }) => {
  18. const [prevValues, setPrevValues] = React.useState(values);
  19. React.useEffect(() => {
  20. const differences = diff(prevValues, values);
  21. if (differences) {
  22. setPrevValues(values);
  23. save(differences);
  24. }
  25. }, [values, save, prevValues]);
  26. return null;
  27. };
  28. const AutoSave = (props) => (
  29. <FormSpy {...props} subscription={{ values: true }} component={AutoSaveIn} />
  30. );
  31. export default AutoSave;