import React from "react"; import { useTranslation } from "react-i18next"; import { useRecoilValue } from "recoil"; import Slider from "rc-slider"; import { Form, Field } from "react-final-form"; import AutoSave from "../../ui/formUtils/AutoSave"; import { ItemMapAtom, selectedItemsAtom } from "../Board/"; import { useItems } from "../Board/Items"; import Label from "../../ui/formUtils/Label"; import Hint from "../../ui/formUtils/Hint"; import ActionsField from "./ActionsField"; import { getFormFieldComponent, getDefaultActionsFromItem, getAvailableActionsFromItem, } from "."; const ItemFormFactory = () => { const { t } = useTranslation(); const { batchUpdateItems } = useItems(); const selectedItems = useRecoilValue(selectedItemsAtom); const itemMap = useRecoilValue(ItemMapAtom); const item = itemMap[selectedItems[0]]; const [defaultActions] = React.useState(getDefaultActionsFromItem(item)); const [availableActions] = React.useState(getAvailableActionsFromItem(item)); let FieldsComponent; if (selectedItems.length === 1) { FieldsComponent = getFormFieldComponent(item.type); } else { const types = new Set(selectedItems.map((itemId) => itemMap[itemId].type)); if (types.size === 1) { FieldsComponent = getFormFieldComponent(Array.from(types)[0]); } else { FieldsComponent = () => null; } } let initialValues; // Set initial values to item values if only one element selected // Empty object otherwise if (selectedItems.length === 1) { initialValues = { ...item }; initialValues.actions = initialValues.actions || defaultActions; } else { initialValues = {}; } const onSubmitHandler = React.useCallback( (formValues) => { batchUpdateItems(selectedItems, (item) => ({ ...item, ...formValues, })); }, [batchUpdateItems, selectedItems] ); return (
(

{t("Snap to grid")}

{t("Available actions")}

)} /> ); }; export default React.memo(ItemFormFactory);