ItemFormFactory.jsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import React from "react";
  2. import { useRecoilValue } from "recoil";
  3. import { Form } from "react-final-form";
  4. import { ItemMapAtom, SelectedItemsAtom } from "../atoms";
  5. import { useItems } from "./";
  6. import AutoSave from "../../ui/formUtils/AutoSave";
  7. export const getFormFieldComponent = (type, itemMap) => {
  8. if (type in itemMap) {
  9. return itemMap[type].form;
  10. }
  11. return () => null;
  12. };
  13. const ItemFormFactory = ({ ItemFormComponent }) => {
  14. const { batchUpdateItems } = useItems();
  15. const selectedItems = useRecoilValue(SelectedItemsAtom);
  16. const itemMap = useRecoilValue(ItemMapAtom);
  17. const onSubmitHandler = React.useCallback(
  18. (formValues) => {
  19. batchUpdateItems(selectedItems, (item) => ({
  20. ...item,
  21. ...formValues,
  22. }));
  23. },
  24. [batchUpdateItems, selectedItems]
  25. );
  26. return (
  27. <Form
  28. onSubmit={onSubmitHandler}
  29. render={() => (
  30. <div
  31. style={{
  32. display: "flex",
  33. flexDirection: "column",
  34. }}
  35. >
  36. <AutoSave save={onSubmitHandler} />
  37. <ItemFormComponent
  38. items={selectedItems.map((itemId) => itemMap[itemId])}
  39. />
  40. </div>
  41. )}
  42. />
  43. );
  44. };
  45. export default React.memo(ItemFormFactory);