mpetroff / pannellum

Pannellum is a lightweight, free, and open source panorama viewer for the web.
https://pannellum.org/
MIT License
4.15k stars 710 forks source link

Cannot use pannellum in react site, getting "viewer is not a function" error #1157

Open spimou opened 1 year ago

spimou commented 1 year ago

I want to use pannellum 2.5.6 inside react 18.2.0. Here is my code so far

import React, { useRef, useEffect } from 'react'; 
import * as pannellum from 'pannellum'
const pano = '../assets/pano.jpg';

function ViewPane() {
  const pannellumContainer = useRef(null);

  useEffect(() => {
    const viewer = pannellum.viewer(pannellumContainer.current, {
      type: 'equirectangular',
      panorama: pano
    });
    return () => {
      viewer.destroy();
    };
  }, []);

  return (
    <div
      ref={pannellumContainer}
      style={{ width: '100%', height: '500px' }}
    ></div>
  );
}

export default ViewPane;

I get caught TypeError: pannellum__WEBPACK_IMPORTED_MODULE_1__.viewer is not a function error

I have tried several alternatives, like const viewer = new pannellum.viewer(pannellumContainer.current, { and I getcaught TypeError: pannellum__WEBPACK_IMPORTED_MODULE_1__.viewer is not a constructor error

I tried replacing viewer with Viewer, same errors reffering to Viewer

I tried importing like soimport { Viewer } from 'pannellum' and then using it like so const viewer = Viewer(pannellumContainer.current, {I get the samecaught TypeError: (0 , pannellum__WEBPACK_IMPORTED_MODULE_1__.Viewer) is not a function error

I also tried using useRef to set Viewer like so : import itimport { Viewer } from 'pannellum', set useRef const v = useRef(null);and in the useEffect v.current = new Viewer(pannellumContainer.current, { and I get the caught TypeError: pannellum__WEBPACK_IMPORTED_MODULE_1__.Viewer is not a constructor error

How can I fix this?

mpetroff commented 1 year ago

Pannellum isn't an ES6 module, so you can't import it like one. You can either use a <script> tag, as is used in all of the examples, or use import 'pannellum'; (or you might need import 'pannellum.js'; or import 'path/to/pannellum.js';, depending on how you have things set up).

floatline commented 11 months ago

This worked for me

useLayoutEffect(() => {
        pannellumContainer.current = window.pannellum.viewer(pannellumContainer.current, {
        type: 'equirectangular',
        panorama: pano

        });
        return () => {
            pannellumContainer.current.destroy()
        }
    }, []);
floatline commented 11 months ago

Also, as @mpetroff mentioned, pannellum should be imported as import 'pannellum';