import { EditFilled, FileExcelFilled, SyncOutlined } from "@ant-design/icons"; import { Button, Card, Col, Row, Space } from "antd"; import { useEffect, useState } from "react"; import { Gallery } from "../../vendor/react-grid-gallery"; import { useTranslation } from "react-i18next"; import Lightbox from "react-image-lightbox"; import "react-image-lightbox/style.css"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import DocumentsUploadComponent from "../documents-upload/documents-upload.component"; import { DetermineFileType } from "../documents-upload/documents-upload.utility"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility"; import JobsDocumentsDownloadButton from "./jobs-document-gallery.download.component"; import JobsDocumentsGalleryReassign from "./jobs-document-gallery.reassign.component"; import JobsDocumentsDeleteButton from "./jobs-documents-gallery.delete.component"; import JobsDocumentsGallerySelectAllComponent from "./jobs-documents-gallery.selectall.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = () => ({}); /* ################################################################################################ Developer Note: Known Technical Debt Item Modifications to this code requires complementary changes to the Imgproxy code. This code will be removed once the imgproxy migration is completed. ################################################################################################ */ function JobsDocumentsComponent({ bodyshop, data, jobId, refetch, billId, billsCallback, totalSize, downloadIdentifier, ignoreSizeLimit }) { const [galleryImages, setgalleryImages] = useState({ images: [], other: [] }); const { t } = useTranslation(); const [modalState, setModalState] = useState({ open: false, index: 0 }); useEffect(() => { let documents = data.reduce( (acc, value) => { const fileType = DetermineFileType(value.type); if (value.type.startsWith("image")) { acc.images.push({ // src: GenerateSrcUrl(value), src: GenerateThumbUrl(value), // src: GenerateSrcUrl(value), // thumbnail: GenerateThumbUrl(value), fullsize: GenerateSrcUrl(value), height: 225, width: 225, isSelected: false, key: value.key, extension: value.extension, id: value.id, type: value.type, size: value.size, tags: [{ value: value.type, title: value.type }] }); } else { let thumb; switch (fileType) { case "raw": thumb = `${window.location.origin}/file.png`; break; default: thumb = GenerateThumbUrl(value); break; } const fileName = value.key.split("/").pop(); acc.other.push({ source: GenerateSrcUrl(value), src: thumb, thumbnail: thumb, tags: [ { value: fileName, title: fileName }, { value: value.type, title: value.type }, ...(value.bill ? [ { value: value.bill.vendor.name, title: t("vendors.fields.name") }, { value: value.bill.date, title: t("bills.fields.date") }, { value: value.bill.invoice_number, title: t("bills.fields.invoice_number") } ] : []) ], height: 225, width: 225, isSelected: false, extension: value.extension, key: value.key, id: value.id, type: value.type, size: value.size }); } return acc; }, { images: [], other: [] } ); setgalleryImages(documents); }, [data, setgalleryImages, t]); const hasMediaAccess = HasFeatureAccess({ bodyshop, featureName: "media" }); const hasMobileAccess = HasFeatureAccess({ bodyshop, featureName: "mobile" }); return (