import { inject, onBeforeUnmount, type Ref, watch } from "vue"; import type { Source } from "maplibre-gl"; import { isLoadedSymbol, mapSymbol, SourceOptionProps } from "@/lib/types"; import type { SourceLayerRegistry } from "@/lib/lib/sourceLayer.registry"; import { SourceLib } from "@/lib/lib/source.lib"; export function useSource( source: Ref, props: SourceOptionProps, registry: SourceLayerRegistry, ) { const map = inject(mapSymbol)!, isLoaded = inject(isLoadedSymbol)!; function addSource() { if (isLoaded.value) { map.value!.addSource(props.sourceId, SourceLib.genSourceOpts(props)); source.value = map.value!.getSource(props.sourceId); } } watch(isLoaded, addSource, { immediate: true }); map.value!.on("style.load", addSource); return onBeforeUnmount(() => { if (isLoaded.value) { registry.unmount(); map.value!.removeSource(props.sourceId); } map.value!.off("style.load", addSource); }); }