HotSpot.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { __rest } from "tslib";
  2. import { jsx as _jsx } from "react/jsx-runtime";
  3. import { memo, useContext, useEffect, useMemo } from "react";
  4. import { KrpanoRendererContext } from "../contexts";
  5. import { buildKrpanoAction, childrenToOuterHTML, mapEventPropsToJSCall, mapObject, } from "../utils";
  6. export const HotSpot = memo((_a) => {
  7. var { name } = _a, rest = __rest(_a, ["name"]);
  8. const EventSelector = `hotspot[${name}]`;
  9. const renderer = useContext(KrpanoRendererContext);
  10. const options = useMemo(() => {
  11. const { scale = 0.5, children } = rest, r = __rest(rest, ["scale", "children"]);
  12. return Object.assign({ scale, html: r.type === "text" ? childrenToOuterHTML(children) : null, onOver: buildKrpanoAction("tween", "scale", scale + 0.05), onOut: buildKrpanoAction("tween", "scale", scale) }, r);
  13. }, [rest]);
  14. useEffect(() => {
  15. const eventsObj = mapObject(Object.assign({}, options), (key, value) => {
  16. if (key.startsWith("on") && typeof value === "function") {
  17. return {
  18. [key]: value,
  19. };
  20. }
  21. return {};
  22. });
  23. renderer === null || renderer === void 0 ? void 0 : renderer.bindEvents(EventSelector, eventsObj);
  24. renderer === null || renderer === void 0 ? void 0 : renderer.addHotspot(name, {});
  25. return () => {
  26. renderer === null || renderer === void 0 ? void 0 : renderer.unbindEvents(EventSelector, eventsObj);
  27. renderer === null || renderer === void 0 ? void 0 : renderer.removeHotspot(name);
  28. };
  29. }, []);
  30. useEffect(() => {
  31. if (!renderer)
  32. return;
  33. renderer.setTag("hotspot", name, Object.assign(Object.assign({}, options), mapEventPropsToJSCall(Object.assign({}, options), (key) => `js(${renderer.name}.fire(${key},${EventSelector}))`)), true);
  34. }, [renderer, name, options]);
  35. return _jsx("div", { className: "hotspot" });
  36. });