import { FC, useState } from "react"; import { useCardPageContext } from "../../contexts/CardPageContext.tsx"; import { Button, Checkbox, Divider, Fieldset, Flex, Group, rem, Textarea, TextInput } from "@mantine/core"; import { useForm } from "@mantine/form"; import { CardSchema, CardService, ClientService, ProjectSchema, ShippingWarehouseSchema, StatusSchema, } from "../../../../client"; import { isEqual } from "lodash"; import { notifications } from "../../../../shared/lib/notifications.ts"; import { useQueryClient } from "@tanstack/react-query"; import ShippingWarehouseAutocomplete from "../../../../components/Selects/ShippingWarehouseAutocomplete/ShippingWarehouseAutocomplete.tsx"; import { ButtonCopyControlled } from "../../../../components/ButtonCopyControlled/ButtonCopyControlled.tsx"; import { useClipboard } from "@mantine/hooks"; import ManagerSelect from "../../../../components/ManagerSelect/ManagerSelect.tsx"; import ProjectSelect from "../../../../components/ProjectSelect/ProjectSelect.tsx"; import BoardSelect from "../../../../components/BoardSelect/BoardSelect.tsx"; import DealStatusSelect from "../../../../components/DealStatusSelect/DealStatusSelect.tsx"; import CardAttributeFields from "../../../../components/CardAttributeFields/CardAttributeFields.tsx"; import getAttributesFromCard from "../../../../components/CardAttributeFields/utils/getAttributesFromCard.ts"; import isModuleInProject, { Modules } from "../../utils/isModuleInProject.ts"; import PaymentLinkButton from "./components/PaymentLinkButton.tsx"; import PrintDealBarcodesButton from "./components/PrintDealBarcodesButton.tsx"; type Props = { card: CardSchema; }; type Attributes = { [key: string]: number | boolean | string; }; export type CardGeneralFormType = Omit; const Content: FC = ({ card }) => { const { setSelectedCard } = useCardPageContext(); const clipboard = useClipboard(); const queryClient = useQueryClient(); const [project, setProject] = useState(card.board.project); const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, card.board.project); const getInitialValues = (card: CardSchema): CardGeneralFormType => { return { ...card, ...getAttributesFromCard(card), }; }; let initialValues = getInitialValues(card); const form = useForm({ initialValues, validate: { name: (value: string) => value.length > 0 ? null : "Название не может быть пустым", status: (value: StatusSchema) => !value && "Статус не выбран", }, }); const updateCardInfo = async (values: CardGeneralFormType) => { console.log("Updated attributes:"); console.log(values); const formCardAttrs = values as unknown as Attributes; const attributes = project?.attributes.reduce((attrs, projectAttr) => { return { ...attrs, [projectAttr.name]: formCardAttrs[projectAttr.name], }; }, {}); return CardService.updateCardGeneralInfo({ requestBody: { cardId: card.id, data: { ...values, statusId: values.status.id, boardId: values.board.id, shippingWarehouse: values.shippingWarehouse?.toString(), attributes, }, }, }).then(({ ok, message }) => { notifications.guess(ok, { message }); if (!ok) return; CardService.getCardById({ cardId: card.id }).then(data => { console.log(data); setSelectedCard(data); initialValues = getInitialValues(data); form.setValues(initialValues); queryClient.invalidateQueries({ queryKey: ["getCardSummaries"], }); }); }); }; const updateClientInfo = async (values: CardGeneralFormType) => { return ClientService.updateClient({ requestBody: { data: values.client, }, }).then(({ ok, message }) => notifications.guess(ok, { message })); }; const handleSubmit = async (values: CardGeneralFormType) => { // Updating client info if there changes if (!isEqual(values.client, card.client)) { await updateClientInfo(values); } const shippingWarehouse = isShippingWarehouse(values.shippingWarehouse) ? values.shippingWarehouse.name : values.shippingWarehouse; await updateCardInfo( { ...values, shippingWarehouse, }, ); }; const isShippingWarehouse = ( value: ShippingWarehouseSchema | string | null | undefined, ): value is ShippingWarehouseSchema => { return !["string", "null", "undefined"].includes(typeof value); }; const onCopyGuestUrlClick = () => { CardService.createDealGuestUrl({ requestBody: { cardId: card.id, }, }).then(({ ok, message, url }) => { if (!ok) notifications.guess(ok, { message }); clipboard.copy(`${window.location.origin}/${url}`); }); }; return (
handleSubmit(values))}>