satupeta-main/app/(modules)/maps/hooks/useLayerToggle.tsx
2026-01-27 09:31:12 +07:00

66 lines
1.7 KiB
TypeScript

import { useAtom } from "jotai";
import {
activeLayersAtom,
addLayerAtom,
removeLayerAtom,
} from "../state/active-layers";
import { isOpenMapsetDialogAtom } from "../state/mapset-dialog";
import { getWmsLayerBounds, parseWmsUrl } from "../../../../shared/utils/wms";
import { Mapset } from "@/shared/types/mapset";
export function useLayerToggle(mapset: Mapset) {
const [activeLayers] = useAtom(activeLayersAtom);
const [, addLayer] = useAtom(addLayerAtom);
const [, removeLayer] = useAtom(removeLayerAtom);
const [, setIsOpenDialog] = useAtom(isOpenMapsetDialogAtom);
const isActiveLayer = activeLayers.find(
(layer) => layer.source.id === mapset.id
);
const toggleLayer = async () => {
if (isActiveLayer) {
removeLayer(isActiveLayer.id);
} else {
const parsed = parseWmsUrl(mapset?.layer_url);
const layerData = {
id: "db_" + mapset.id,
name: mapset.name,
source: {
id: mapset.id,
source: "db",
},
layer: {
type: "wms" as const,
url: parsed?.baseUrl,
layers: parsed?.params.layers,
format: "image/png",
transparent: false,
bounds: parsed?.params.bounds,
},
};
// Get bounds if URL and layer name are available
if (parsed?.baseUrl && parsed?.params.layers && !parsed?.params.bounds) {
const bounds = await getWmsLayerBounds(
parsed.baseUrl,
parsed.params.layers
);
if (bounds) {
layerData.layer.bounds = bounds;
}
}
addLayer(layerData);
}
setIsOpenDialog(false);
};
return {
isActiveLayer,
toggleLayer,
};
}