Files
tm_panel/src/app/(home)/_components/region-labels/map.tsx
T

67 lines
1.4 KiB
TypeScript

"use client";
import jsVectorMap from "jsvectormap";
import { useEffect, useRef } from "react";
import "@/js/us-aea-en";
export default function Map() {
const mapContainerRef = useRef<HTMLDivElement | null>(null);
useEffect(() => {
let map: InstanceType<typeof jsVectorMap> | null = null;
const container = mapContainerRef.current;
if (!container) return;
// Dev Strict Mode can run effects twice; clear old markup before re-init.
container.innerHTML = "";
map = new jsVectorMap({
selector: "#mapOne",
map: "us_aea_en",
zoomButtons: true,
regionStyle: {
initial: {
fill: "#C8D0D8",
},
hover: {
fillOpacity: 1,
fill: "#3056D3",
},
},
regionLabelStyle: {
initial: {
fontWeight: "semibold",
fill: "#fff",
},
hover: {
cursor: "pointer",
},
},
labels: {
regions: {
render(code: string) {
return code.split("-")[1];
},
},
},
});
return () => {
try {
map?.destroy?.();
} catch {
// jsVectorMap can throw during React Strict Mode cleanup in dev.
}
container.innerHTML = "";
};
}, []);
return (
<div className="h-[422px]">
<div ref={mapContainerRef} id="mapOne" className="mapOne map-btn" />
</div>
);
}