Events.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { FC, useContext, useEffect } from "react";
  2. import { KrpanoRendererContext } from "../contexts/KrpanoRendererContext";
  3. import { EventCallback } from "../types";
  4. import { mapEventPropsToJSCall } from "../utils";
  5. /**
  6. * @see https://krpano.com/docu/xml/#events
  7. */
  8. export interface EventsConfig {
  9. /** 事件名,若存在该参数则为局部事件 */
  10. name?: string;
  11. keep?: boolean;
  12. onEnterFullscreen?: EventCallback;
  13. onExitFullscreen?: EventCallback;
  14. onXmlComplete?: EventCallback;
  15. onPreviewComplete?: EventCallback;
  16. onLoadComplete?: EventCallback;
  17. onBlendComplete?: EventCallback;
  18. onNewPano?: EventCallback;
  19. onRemovePano?: EventCallback;
  20. onNewScene?: EventCallback;
  21. onXmlError?: EventCallback;
  22. onLoadError?: EventCallback;
  23. onKeydown?: EventCallback;
  24. onKeyup?: EventCallback;
  25. onClick?: EventCallback;
  26. onSingleClick?: EventCallback;
  27. onDoubleClick?: EventCallback;
  28. onMousedown?: EventCallback;
  29. onMouseup?: EventCallback;
  30. onMousewheel?: EventCallback;
  31. onContextmenu?: EventCallback;
  32. onIdle?: EventCallback;
  33. onViewChange?: EventCallback;
  34. onViewChanged?: EventCallback;
  35. onResize?: EventCallback;
  36. onFrameBufferResize?: EventCallback;
  37. /**
  38. * 启动自动旋转时回调
  39. */
  40. onAutoRotateStart?: EventCallback;
  41. /**
  42. * 停止自动旋转时回调
  43. */
  44. onAutoRotateStop?: EventCallback;
  45. /**
  46. * 全景图完成一轮自动旋转时回调
  47. */
  48. onAutoRotateOneRound?: EventCallback;
  49. /**
  50. * 自动旋转状态发生改变时回调
  51. */
  52. onAutoRotateChange?: EventCallback;
  53. onIPhoneFullscreen?: EventCallback;
  54. }
  55. export interface EventsProps extends EventsConfig {}
  56. const GlobalEvents = "__GlobalEvents";
  57. export const Events: FC<EventsProps> = ({ name, keep, ...EventsAttrs }) => {
  58. const renderer = useContext(KrpanoRendererContext);
  59. const EventSelector = `events[${name || GlobalEvents}]`;
  60. // 在renderer上绑定回调
  61. useEffect(() => {
  62. renderer?.bindEvents(EventSelector, { ...EventsAttrs });
  63. return () => {
  64. renderer?.unbindEvents(EventSelector, { ...EventsAttrs });
  65. };
  66. }, [renderer, EventsAttrs]);
  67. // Krpano标签上添加js call,触发事件
  68. useEffect(() => {
  69. renderer?.setTag(
  70. "events",
  71. // 全局事件直接设置
  72. name || null,
  73. {
  74. ...mapEventPropsToJSCall(
  75. { ...EventsAttrs },
  76. (eventName) =>
  77. `js(${renderer.name}.fire(${eventName},${EventSelector}))`
  78. ),
  79. keep,
  80. },
  81. true
  82. );
  83. }, [name, renderer]);
  84. return <div className="events"></div>;
  85. };