import { EditFilled, FileExcelFilled, SyncOutlined } from "@ant-design/icons"; import { Alert, Button, Card, Col, Row, Space } from "antd"; import { useEffect, useState } from "react"; import { Gallery } from "react-grid-gallery"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { getBillMedia, getJobMedia, toggleMediaSelected } from "../../redux/media/media.actions"; import { selectAllMedia } from "../../redux/media/media.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { CreateExplorerLinkForJob } from "../../utils/localmedia"; import DocumentsLocalUploadComponent from "../documents-local-upload/documents-local-upload.component"; import JobsDocumentsLocalDeleteButton from "./jobs-documents-local-gallery.delete.component"; import JobsLocalGalleryDownloadButton from "./jobs-documents-local-gallery.download"; import JobsDocumentsLocalGalleryReassign from "./jobs-documents-local-gallery.reassign.component"; import JobsDocumentsLocalGallerySelectAllComponent from "./jobs-documents-local-gallery.selectall.component"; import Lightbox from "react-image-lightbox"; import "react-image-lightbox/style.css"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, allMedia: selectAllMedia }); const mapDispatchToProps = (dispatch) => ({ getJobMedia: (id) => dispatch(getJobMedia(id)), getBillMedia: ({ jobid, invoice_number }) => { dispatch(getBillMedia({ jobid, invoice_number })); }, toggleMediaSelected: ({ jobid, filename }) => dispatch(toggleMediaSelected({ jobid, filename })) }); export default connect(mapStateToProps, mapDispatchToProps)(JobsDocumentsLocalGallery); export function JobsDocumentsLocalGallery({ bodyshop, toggleMediaSelected, getJobMedia, getBillMedia, allMedia, job, invoice_number, vendorid }) { const { t } = useTranslation(); const [modalState, setModalState] = useState({ open: false, index: 0 }); useEffect(() => { if (job) { if (invoice_number) { getBillMedia({ jobid: job.id, invoice_number }); } else { getJobMedia(job.id); } } }, [job, invoice_number, getJobMedia, getBillMedia]); let optimized; const jobMedia = allMedia?.[job.id] ? allMedia[job.id].reduce( (acc, val) => { if (val.type?.mime && val.type.mime.startsWith("image")) { acc.images.push({ ...val, fullsize: val.src, src: val.thumbnail, height: val.thumbnailHeight, width: val.thumbnailWidth, ...(val.optimized && { src: val.optimized, fullsize: val.src }) }); if (val.optimized) optimized = true; } else { acc.other.push({ ...val, fullsize: val.src, src: val.thumbnail, height: val.thumbnailHeight, width: val.thumbnailWidth, tags: [{ value: val.filename, title: val.filename }] }); } return acc; }, { images: [], other: [] } ) : { images: [], other: [] }; const hasMediaAccess = HasFeatureAccess({ bodyshop, featureName: "media" }); return (