|
@@ -1,13 +1,21 @@
|
|
-import { FC, ReactNode, useContext, useEffect, useMemo } from "react";
|
|
|
|
|
|
+import { FC, ReactNode, memo, useContext, useEffect, useMemo } from "react";
|
|
import { EventCallback } from "../types";
|
|
import { EventCallback } from "../types";
|
|
import { KrpanoRendererContext } from "../contexts";
|
|
import { KrpanoRendererContext } from "../contexts";
|
|
-import { buildKrpanoAction, mapEventPropsToJSCall, mapObject } from "../utils";
|
|
|
|
|
|
+import {
|
|
|
|
+ buildKrpanoAction,
|
|
|
|
+ childrenToOuterHTML,
|
|
|
|
+ mapEventPropsToJSCall,
|
|
|
|
+ mapObject,
|
|
|
|
+} from "../utils";
|
|
|
|
|
|
export interface HotspotProps {
|
|
export interface HotspotProps {
|
|
name: string;
|
|
name: string;
|
|
children?: ReactNode;
|
|
children?: ReactNode;
|
|
url?: string;
|
|
url?: string;
|
|
- type?: string;
|
|
|
|
|
|
+ /**
|
|
|
|
+ * @see https://krpano.com/docu/xml/?version=121#layer.type
|
|
|
|
+ */
|
|
|
|
+ type?: "image" | "text";
|
|
keep?: boolean;
|
|
keep?: boolean;
|
|
visible?: boolean;
|
|
visible?: boolean;
|
|
enabled?: boolean;
|
|
enabled?: boolean;
|
|
@@ -33,6 +41,7 @@ export interface HotspotProps {
|
|
scale?: number;
|
|
scale?: number;
|
|
rotate?: number;
|
|
rotate?: number;
|
|
alpha?: number;
|
|
alpha?: number;
|
|
|
|
+ bg?: boolean;
|
|
onOver?: EventCallback;
|
|
onOver?: EventCallback;
|
|
onHover?: EventCallback;
|
|
onHover?: EventCallback;
|
|
onOut?: EventCallback;
|
|
onOut?: EventCallback;
|
|
@@ -42,14 +51,15 @@ export interface HotspotProps {
|
|
onLoaded?: EventCallback;
|
|
onLoaded?: EventCallback;
|
|
}
|
|
}
|
|
|
|
|
|
-export const HotSpot: FC<HotspotProps> = ({ name, children, ...rest }) => {
|
|
|
|
|
|
+export const HotSpot: FC<HotspotProps> = memo(({ name, ...rest }) => {
|
|
const EventSelector = `hotspot[${name}]`;
|
|
const EventSelector = `hotspot[${name}]`;
|
|
const renderer = useContext(KrpanoRendererContext);
|
|
const renderer = useContext(KrpanoRendererContext);
|
|
const options = useMemo(() => {
|
|
const options = useMemo(() => {
|
|
- const { scale = 0.5, ...r } = rest;
|
|
|
|
|
|
+ const { scale = 0.5, children, ...r } = rest;
|
|
|
|
|
|
return {
|
|
return {
|
|
scale,
|
|
scale,
|
|
|
|
+ html: r.type === "text" ? childrenToOuterHTML(children) : null,
|
|
onOver: buildKrpanoAction("tween", "scale", scale + 0.05),
|
|
onOver: buildKrpanoAction("tween", "scale", scale + 0.05),
|
|
onOut: buildKrpanoAction("tween", "scale", scale),
|
|
onOut: buildKrpanoAction("tween", "scale", scale),
|
|
...r,
|
|
...r,
|
|
@@ -76,18 +86,20 @@ export const HotSpot: FC<HotspotProps> = ({ name, children, ...rest }) => {
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
- renderer?.setTag(
|
|
|
|
|
|
+ if (!renderer) return;
|
|
|
|
+
|
|
|
|
+ renderer.setTag(
|
|
"hotspot",
|
|
"hotspot",
|
|
name,
|
|
name,
|
|
Object.assign(
|
|
Object.assign(
|
|
{ ...options },
|
|
{ ...options },
|
|
mapEventPropsToJSCall(
|
|
mapEventPropsToJSCall(
|
|
{ ...options },
|
|
{ ...options },
|
|
- (key) => `js(${renderer?.name}.fire(${key},${EventSelector}))`
|
|
|
|
|
|
+ (key) => `js(${renderer.name}.fire(${key},${EventSelector}))`
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
);
|
|
}, [renderer, name, options]);
|
|
}, [renderer, name, options]);
|
|
|
|
|
|
- return <div className="hotspot">{children}</div>;
|
|
|
|
-};
|
|
|
|
|
|
+ return <div className="hotspot" />;
|
|
|
|
+});
|