reactjsreact-image-lightbox

Separate images in react-image-lightbox


I have a problem when using this library in some groups of images separately, what really happens is that it takes the list of images from the last group always when I click on another group of images:

const Projects = [
        {
            id: 1,
            name: 'Intercambiador Del Norte',
            images: [
                INorte,
                INorte2,
                INorte3,
                INorte4,
                INorte5
            ],
            address: {
                lat: 15.553887638630355,
                lng: -87.9969039384759
            },
        },
        {
            id: 2,
            name: 'Intercambiador De Occidente',
            images: [
                IOccidente,
                IOccidente2,
                IOccidente3,
                IOccidente4,
                IOccidente5
            ],
            address: {
                lat: 15.43197682825506,
                lng: -88.02134910151912
            },
        },
        {
            id: 3,
            name: 'Puente Peatonal IHSS',
            images: [
                IHSS,
                IHSS2,
                IHSS3,
                IHSS4,
                IHSS5
            ],
            address: {
                lat: 15.541246406040697,
                lng: -88.01537077792884
            },
        },
        {
            id: 4,
            name: 'Paso A Desnivel Col. Santa Martha',
            images: [
                StaMartha,
                StaMartha2,
                StaMartha3,
                StaMartha4,
                StaMartha5
            ],
            address: {
                lat: 15.497648696265482,
                lng: -87.98749457873993
            },
        },
        {
            id: 5,
            name: 'Puente A Desnivel 27 Calle',
            images: [
                Veintisiente,
                Veintisiente2,
                Veintisiente3,
                Veintisiente4,
                Veintisiente5
            ],
            address: {
                lat: 15.478059823233426,
                lng: -87.97416842866024
            },
        },
        {
            id: 6,
            name: 'Ampliación De Bulevar 33 Calle',
            images: [
                TreintaYTresCalle,
                TreintaYTresCalle2,
                TreintaYTresCalle3,
                TreintaYTresCalle4,
                TreintaYTresCalle5,
            ],
            address: {
                lat: 15.47188476038704,
                lng: -88.00512399419196
            },
        },
        {
            id: 7,
            name: 'Paso A Desnivel Blvd Del Este Con Salida Vieja A La Lima',
            images: [
                SdaLima,
                SdaLima2,
                SdaLima3,
                SdaLima4,
                SdaLima5
            ],
            address: {
                lat: 15.50228931099425,
                lng: -87.99440008840381
            },
        },
        {
            id: 8,
            name: 'Paso a Desnivel en la Intersección Bulevar Del Norte y Acceso A El Zapotal',
            images: [Zapotal,INorte2],
            address: {
                lat: 15.551436185695238,
                lng: -88.00215568011586
            },
        },
    ];

Another part of the code:

Projects.map(function(project, index) {
<Image onClick={() => setIsOpen(true)} loading="lazy" className="rounded-img img- 
  project shadow-three" src={project.images[0]} />
   {isOpen && (
      <Lightbox
          imageLoadErrorMessage="This image failed to load"
          imageTitle={project.name}
          mainSrc={project.images[photoIndex]}
          nextSrc={project.images[(photoIndex + 1) % project.images.length]}
          prevSrc={
          project.images[
            (photoIndex + project.images.length - 1) % project.images.length
          ]
          }
          onCloseRequest={() => setIsOpen(false)}
          onMovePrevRequest={() =>
             setPhotoIndex(
                           (photoIndex + project.images.length - 1) % project.images.length
                           )
                           }
              onMoveNextRequest={() =>
                  setPhotoIndex((photoIndex + 1) % project.images.length)
              }
        />
                                        
    )}
}

I know this could be a logic problem and not a library problem

Thanks in advance to everyone who takes their time


Solution

  • When you call lightbox you don't tell it which image group you want to show it. Here is an example of how you can do it.

    you can see it on my codesandbox

      export default function App() {
        const [isOpen, setIsOpen] = useState(false);
        const [imagesIndex, setimagesIndex] = useState(null);
        const [photoIndex, setPhotoIndex] = useState(0);
    
        return (
          <>
            {Projects.map((project, index) => {
              return (
                <img
                  key={project.id}
                  onClick={() => {
                    setIsOpen(true);
                    setimagesIndex(index);
                  }}
                  loading="lazy"
                  className="rounded-img img-project shadow-three"
                  src={project.images[0]}
                  alt={project.name}
                />
              );
            })}
            {isOpen && (
              <Lightbox
                imageLoadErrorMessage="This image failed to load"
                imageTitle={Projects[imagesIndex].name}
                mainSrc={Projects[imagesIndex].images[photoIndex]}
                nextSrc={
                  Projects[imagesIndex].images[
                    (photoIndex + 1) % Projects[imagesIndex].images.length
                  ]
                }
                prevSrc={
                  Projects[imagesIndex].images[
                    (photoIndex + Projects[imagesIndex].images.length - 1) %
                      Projects[imagesIndex].images.length
                  ]
                }
                onCloseRequest={() => {
                  setIsOpen(false);
                  setimagesIndex(null);
                }}
                onMovePrevRequest={() =>
                  setPhotoIndex(
                    (photoIndex + Projects[imagesIndex].images.length - 1) %
                      Projects[imagesIndex].images.length
                  )
                }
                onMoveNextRequest={() =>
                  setPhotoIndex(
                    (photoIndex + 1) % Projects[imagesIndex].images.length
                  )
                }
              />
            )}
          </>
        );
      }