import { FC, useState } from "react"; import { useDealPageContext } from "../../../contexts/DealPageContext.tsx"; import { ActionIcon, Button, Checkbox, Divider, Fieldset, Flex, Group, rem, Textarea, TextInput, Tooltip, } from "@mantine/core"; import { useForm } from "@mantine/form"; import { ClientService, DealSchema, DealService, 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 ButtonCopy from "../../../../../components/ButtonCopy/ButtonCopy.tsx"; import FileSaver from "file-saver"; import { dateWithoutTimezone, getCurrentDateTimeForFilename } from "../../../../../shared/lib/date.ts"; import { IconBarcode, IconPrinter } from "@tabler/icons-react"; import styles from "../../../ui/DealsPage.module.css"; import { base64ToBlob } from "../../../../../shared/lib/utils.ts"; import { DatePickerInput } from "@mantine/dates"; 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"; type Props = { deal: DealSchema; }; export type DealGeneralFormType = Omit; const Content: FC = ({ deal }) => { const { setSelectedDeal } = useDealPageContext(); const clipboard = useClipboard(); const queryClient = useQueryClient(); const [project, setProject] = useState(deal.board.project); // ignore typescript const initialValues: DealGeneralFormType = { ...deal, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error deliveryDate: deal.deliveryDate ? new Date(deal.deliveryDate) : null, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error receivingSlotDate: deal.receivingSlotDate ? new Date(deal.receivingSlotDate) : null, }; const form = useForm({ initialValues: initialValues, validate: { name: (value: string) => value.length > 0 ? null : "Название сделки не может быть пустым", status: (value: StatusSchema) => !value && "Статус для сделки не выбран", }, }); const updateDealInfo = async (values: DealGeneralFormType) => { return DealService.updateDealGeneralInfo({ requestBody: { dealId: deal.id, data: { ...values, shippingWarehouse: values.shippingWarehouse?.toString(), }, }, }).then(({ ok, message }) => { notifications.guess(ok, { message }); if (!ok) return; DealService.getDealById({ dealId: deal.id }).then(data => { setSelectedDeal(data); form.setInitialValues(data); queryClient.invalidateQueries({ queryKey: ["getDealSummaries"], }); }); }); }; const updateClientInfo = async (values: DealGeneralFormType) => { return ClientService.updateClient({ requestBody: { data: values.client, }, }).then(({ ok, message }) => notifications.guess(ok, { message })); }; const handleSubmit = async (values: DealGeneralFormType) => { // Updating client info if there changes if (!isEqual(values.client, deal.client)) { await updateClientInfo(values); } // updating deal info // get shimpent warehouse name from object if its object, otherwise just pass it const shippingWarehouse = isShippingWarehouse(values.shippingWarehouse) ? values.shippingWarehouse.name : values.shippingWarehouse; await updateDealInfo({ ...values, deliveryDate: values.deliveryDate ? dateWithoutTimezone(new Date(values.deliveryDate)) : null, receivingSlotDate: values.receivingSlotDate ? dateWithoutTimezone(new Date(values.receivingSlotDate)) : null, shippingWarehouse: shippingWarehouse, }); }; const isShippingWarehouse = ( value: ShippingWarehouseSchema | string | null | undefined, ): value is ShippingWarehouseSchema => { return !["string", "null", "undefined"].includes(typeof value); }; const onCopyGuestUrlClick = () => { DealService.createDealGuestUrl({ requestBody: { dealId: deal.id, }, }).then(({ ok, message, url }) => { if (!ok) notifications.guess(ok, { message }); clipboard.copy(`${window.location.origin}/${url}`); }); }; const billRequestPdfUrl = deal?.billRequest?.pdfUrl || deal?.group?.billRequest?.pdfUrl; return (
handleSubmit(values))}>