Skip to content
Snippets Groups Projects
ParcelInfo.tsx 7.81 KiB
import { MetadataTable, first, useBreakpointValue } from '@edata-portal/core';
import {
  PARCEL_LIST_ENDPOINT,
  UPDATE_PARCEL_ENDPOINT,
  DELETE_PARCEL_ENDPOINT,
  useGetEndpoint,
  useMutateEndpoint,
  GET_ADDRESSES_ENDPOINT,
  INVESTIGATION_LIST_ENDPOINT,
} from '@edata-portal/icat-plus-api';
import { AddressCard } from 'components/address/AddressCard';
import { getParcelStatus } from 'constants/statuses';

import { Col, Row, Alert, Card, Button, Modal } from 'react-bootstrap';
import { useNavigate } from 'react-router-dom';
import {
  faChevronDown,
  faChevronRight,
} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { useMemo, useState } from 'react';
import { EditParcelButton } from 'components/investigation/shipment/parcel/ParcelFormModal';
import { ParcelLabelButton } from 'components/investigation/shipment/parcel/ParcelLabelButton';
import { ParcelTransportOrganisation } from 'components/investigation/shipment/parcel/transportOrganisation/ParcelTransportOrganisation';

export function ParcelInfo({
  investigationId,
  parcelId,
}: {
  investigationId: string;
  parcelId: string;
}) {
  const parcels = useGetEndpoint({
    endpoint: PARCEL_LIST_ENDPOINT,
    params: {
      investigationId,
      parcelId,
    },
  });

  const parcel = useMemo(() => first(parcels), [parcels]);

  const [expanded, setExpanded] = useState(true);

  const investigations = useGetEndpoint({
    endpoint: INVESTIGATION_LIST_ENDPOINT,
    params: {
      ids: String(investigationId),
    },
  });

  const investigation =
    investigations && investigations.length > 0 ? investigations[0] : undefined;

  const addresses = useGetEndpoint({
    endpoint: GET_ADDRESSES_ENDPOINT,
  });

  const { mutate, isPending } = useMutateEndpoint({
    endpoint: UPDATE_PARCEL_ENDPOINT,
    params: {
      investigationId,
      shipmentId: parcel?.shipmentId || '',
    },
  });

  const { mutateAsync: deleteParcel } = useMutateEndpoint({
    endpoint: DELETE_PARCEL_ENDPOINT,
    params: {
      investigationId,
      shipmentId: parcel?.shipmentId || '',
    },
  });

  const navigate = useNavigate();

  const [show, setShow] = useState(false);

  const handleClose = () => setShow(false);
  const handleShow = () => setShow(true);

  const metadata1 = [
    {
      caption: 'Name',
      value: parcel?.name,
    },
    {
      caption: 'Description',
      value: parcel?.description,
    },
  ];
  const metadata2 = [
    {
      caption: 'Storage conditions',
      value: parcel?.storageConditions,
    },
    {
      caption: 'Comments',
      value: parcel?.comments,
    },
  ];

  const metadataElement = useBreakpointValue({
    xs: (
      <Row>
        <Col>
          <MetadataTable parameters={[...metadata1, ...metadata2]} />
        </Col>
      </Row>
    ),
    md: (
      <Row className="g-2">
        <Col xs={6}>
          <MetadataTable parameters={metadata1} />
        </Col>
        <Col xs={6}>
          <MetadataTable parameters={metadata2} />
        </Col>
      </Row>
    ),
  });

  if (!parcel) {
    return <Alert variant="info">Could not find parcel</Alert>;
  }

  const status = getParcelStatus(parcel.status);

  if (!status) {
    return <Alert variant="info">Parcel has invalid status</Alert>;
  }

  const editable = status.editable;

  return (
    <>
      <Card>
        <Card.Header
          onClick={() => setExpanded(!expanded)}
          style={{
            cursor: 'pointer',
          }}
        >
          <Row className="justify-content-between g-2 align-items-center">
            <Col xs={'auto'}>
              <Row className="g-2 align-items-center">
                <Col xs={'auto'}>
                  <FontAwesomeIcon
                    icon={expanded ? faChevronDown : faChevronRight}
                  />
                </Col>
                <Col xs={'auto'}>Parcel Info</Col>
              </Row>
            </Col>
            <Col xs={'auto'}>
              <Row className="g-2 align-items-center">
                {editable && (
                  <>
                    <Col xs={'auto'} onClick={(e) => e.stopPropagation()}>
                      <EditParcelButton parcel={parcel} />
                    </Col>
                    <Col xs={'auto'}>
                      <Button
                        variant="danger"
                        onClick={(e) => {
                          e.stopPropagation();
                          handleShow();
                        }}
                        disabled={isPending}
                        size="sm"
                      >
                        Delete
                      </Button>
                    </Col>
                  </>
                )}
                {status.sendable && parcel.content.length > 0 && (
                  <Col xs={'auto'}>
                    <ParcelLabelButton parcel={parcel} />
                  </Col>
                )}
              </Row>
            </Col>
          </Row>
        </Card.Header>
        {expanded && (
          <Card.Body className="p-2">
            <Col>
              {parcel.containsDangerousGoods && (
                <Row>
                  <Col>
                    <Alert variant="danger">
                      <strong>This parcel contains dangerous goods.</strong>
                    </Alert>
                  </Col>
                </Row>
              )}

              {metadataElement}

              <Row className="mt-3 g-2">
                <Col xs={12} md={6}>
                  <AddressCard
                    title="Sender's address"
                    address={parcel.shippingAddress}
                    choices={addresses || []}
                    onSelect={(address) => {
                      mutate({
                        body: {
                          ...parcel,
                          shippingAddress: address,
                        },
                      });
                    }}
                    isLoading={isPending}
                    investigationId={investigationId}
                    editable={editable}
                    required
                    isReturnAddress={false}
                  />
                </Col>
                <Col xs={12} md={6}>
                  <AddressCard
                    title="Return address"
                    address={parcel.returnAddress}
                    choices={addresses || []}
                    onSelect={(address) => {
                      mutate({
                        body: {
                          ...parcel,
                          returnAddress: address,
                        },
                      });
                    }}
                    isLoading={isPending}
                    investigationId={investigationId}
                    editable={editable}
                    isReturnAddress={true}
                  />
                </Col>
              </Row>
              {investigation && (
                <ParcelTransportOrganisation
                  investigation={investigation}
                  parcel={parcel}
                />
              )}
            </Col>
          </Card.Body>
        )}
      </Card>

      <Modal show={show} onHide={handleClose}>
        <Modal.Header closeButton>
          <Modal.Title>Remove parcel</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          Are you sure you want to remove the parcel {parcel.name}?
        </Modal.Body>
        <Modal.Footer>
          <Button variant="primary" onClick={handleClose}>
            No
          </Button>
          <Button
            variant="secondary"
            onClick={() => {
              handleClose();
              deleteParcel({ body: parcel }).then(() => {
                navigate(`/investigation/${investigationId}/logistics`);
              });
            }}
          >
            Yes
          </Button>
        </Modal.Footer>
      </Modal>
    </>
  );
}