import { Typography } from "@material-ui/core"; import CardSpacer from "@saleor/components/CardSpacer"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import Savebar from "@saleor/components/Savebar"; import { MenuErrorFragment } from "@saleor/fragments/types/MenuErrorFragment"; import { SubmitPromise } from "@saleor/hooks/useForm"; import { sectionNames } from "@saleor/intl"; import { ConfirmButtonTransitionState } from "@saleor/macaw-ui"; import { Backlink } from "@saleor/macaw-ui"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { MenuDetails_menu } from "../../types/MenuDetails"; import { MenuItemType } from "../MenuItemDialog"; import MenuItems, { TreeOperation } from "../MenuItems"; import MenuProperties from "../MenuProperties"; import { computeRelativeTree } from "./tree"; export interface MenuDetailsFormData { name: string; } export interface MenuDetailsSubmitData extends MenuDetailsFormData { operations: TreeOperation[]; } export interface MenuDetailsPageProps { saveButtonState: ConfirmButtonTransitionState; disabled: boolean; errors: MenuErrorFragment[]; menu: MenuDetails_menu; onBack: () => void; onDelete: () => void; onItemAdd: () => void; onItemClick: (id: string, type: MenuItemType) => void; onItemEdit: (id: string) => void; onSubmit: (data: MenuDetailsSubmitData) => SubmitPromise; } const MenuDetailsPage: React.FC = ({ disabled, errors, menu, saveButtonState, onBack, onDelete, onItemAdd, onItemClick, onItemEdit, onSubmit }) => { const intl = useIntl(); const initialForm: MenuDetailsFormData = { name: menu?.name ?? "" }; const [treeOperations, setTreeOperations] = React.useState( [] ); const removeSimulatedMoves = (operations: TreeOperation[]) => operations.filter(operation => !operation.simulatedMove); const handleSubmit = async (data: MenuDetailsFormData) => { const result = await onSubmit({ name: data.name, operations: removeSimulatedMoves(treeOperations) }); if (result) { setTreeOperations([]); } return result; }; const handleChange = (operations: TreeOperation[]) => { setTreeOperations([...treeOperations, ...operations]); }; return (
{({ change, data, hasChanged, submit }) => ( {intl.formatMessage(sectionNames.navigation)}
{intl.formatMessage(sectionNames.navigation)}
0} items={ menu?.items ? computeRelativeTree(menu.items, treeOperations) : [] } onChange={handleChange} onItemAdd={onItemAdd} onItemClick={onItemClick} onItemEdit={onItemEdit} onUndo={() => setTreeOperations(operations => { if (operations.length > 1) { // Undo of a simulated move needs removal of 2 moves instead of one if (operations[operations.length - 2].simulatedMove) { return operations.slice(0, operations.length - 2); } } return operations.slice(0, operations.length - 1); }) } />
)}
); }; MenuDetailsPage.displayName = "MenuDetailsPage"; export default MenuDetailsPage;