Files
webapp/app/composables/useClusteredNodes.ts
Ruslan Bakiev 5e55443975
All checks were successful
Build Docker Image / build (push) Successful in 3m41s
Fix map points: icons, color updates, loading state
- Add entityType prop to CatalogMap for icon selection
- Change circle layers to symbol layers with entity-specific icons
- Icons: shopping bag (offers), warehouse (hubs), factory (suppliers)
- Add watcher to update colors when pointColor/entityType changes
- Clear old points and show loading indicator when switching view modes
- Add clearNodes function to useClusteredNodes composable
2026-01-24 09:18:27 +07:00

58 lines
1.4 KiB
TypeScript

import { GetClusteredNodesDocument } from './graphql/public/geo-generated'
import type { ClusterPointType } from './graphql/public/geo-generated'
export interface MapBounds {
west: number
south: number
east: number
north: number
zoom: number
}
export function useClusteredNodes(
transportType?: Ref<string | undefined>,
nodeType?: Ref<string | undefined>
) {
const { client } = useApolloClient('publicGeo')
const clusteredNodes = ref<ClusterPointType[]>([])
const loading = ref(false)
const fetchClusters = async (bounds: MapBounds) => {
loading.value = true
try {
const { data } = await client.query({
query: GetClusteredNodesDocument,
variables: {
west: bounds.west,
south: bounds.south,
east: bounds.east,
north: bounds.north,
zoom: Math.floor(bounds.zoom),
transportType: transportType?.value,
nodeType: nodeType?.value
},
fetchPolicy: 'network-only'
})
clusteredNodes.value = (data?.clusteredNodes ?? []).filter(Boolean) as ClusterPointType[]
} catch (error) {
console.error('Failed to fetch clustered nodes:', error)
clusteredNodes.value = []
} finally {
loading.value = false
}
}
const clearNodes = () => {
clusteredNodes.value = []
}
return {
clusteredNodes,
loading,
fetchClusters,
clearNodes
}
}