- Introduced .editorconfig for consistent coding styles across the project. - Added .golangci.yml for Go linting configuration. - Updated AGENTS.md to clarify project structure and components. - Enhanced CONTRIBUTING.md with Makefile usage for common tasks. - Updated Dockerfiles to use Go 1.24 and improved build instructions. - Refined README.md and deployment documentation for clarity. - Added testing documentation in testing.md for backend and frontend tests. - Introduced Makefile for streamlined development commands and tasks.
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import { HnHMaxZoom } from '~/lib/LeafletCustomTypes'
|
|
import * as L from 'leaflet'
|
|
|
|
export interface CharacterData {
|
|
name: string
|
|
position: { x: number; y: number }
|
|
type: string
|
|
id: number
|
|
map: number
|
|
}
|
|
|
|
export interface CharacterMapViewRef {
|
|
map: L.Map
|
|
mapid: number
|
|
markerLayer?: L.LayerGroup
|
|
}
|
|
|
|
export interface MapCharacter {
|
|
id: number
|
|
name: string
|
|
position: { x: number; y: number }
|
|
type: string
|
|
map: number
|
|
text: string
|
|
value: number
|
|
leafletMarker: L.Marker | null
|
|
remove: (mapview: CharacterMapViewRef) => void
|
|
add: (mapview: CharacterMapViewRef) => void
|
|
update: (mapview: CharacterMapViewRef, updated: CharacterData | MapCharacter) => void
|
|
setClickCallback: (callback: (e: L.LeafletMouseEvent) => void) => void
|
|
}
|
|
|
|
export function createCharacter(data: CharacterData): MapCharacter {
|
|
let leafletMarker: L.Marker | null = null
|
|
let onClick: ((e: L.LeafletMouseEvent) => void) | null = null
|
|
|
|
const character: MapCharacter = {
|
|
id: data.id,
|
|
name: data.name,
|
|
position: { ...data.position },
|
|
type: data.type,
|
|
map: data.map,
|
|
text: data.name,
|
|
value: data.id,
|
|
|
|
get leafletMarker() {
|
|
return leafletMarker
|
|
},
|
|
|
|
remove(mapview: CharacterMapViewRef): void {
|
|
if (leafletMarker) {
|
|
const layer = mapview.markerLayer ?? mapview.map
|
|
layer.removeLayer(leafletMarker)
|
|
leafletMarker = null
|
|
}
|
|
},
|
|
|
|
add(mapview: CharacterMapViewRef): void {
|
|
if (character.map === mapview.mapid) {
|
|
const position = mapview.map.unproject([character.position.x, character.position.y], HnHMaxZoom)
|
|
leafletMarker = L.marker(position, { title: character.name })
|
|
leafletMarker.on('click', (e: L.LeafletMouseEvent) => {
|
|
if (onClick) onClick(e)
|
|
})
|
|
const targetLayer = mapview.markerLayer ?? mapview.map
|
|
leafletMarker.addTo(targetLayer)
|
|
}
|
|
},
|
|
|
|
update(mapview: CharacterMapViewRef, updated: CharacterData | MapCharacter): void {
|
|
if (character.map !== updated.map) {
|
|
character.remove(mapview)
|
|
}
|
|
character.map = updated.map
|
|
character.position = { ...updated.position }
|
|
if (!leafletMarker && character.map === mapview.mapid) {
|
|
character.add(mapview)
|
|
}
|
|
if (leafletMarker) {
|
|
const position = mapview.map.unproject([updated.position.x, updated.position.y], HnHMaxZoom)
|
|
leafletMarker.setLatLng(position)
|
|
}
|
|
},
|
|
|
|
setClickCallback(callback: (e: L.LeafletMouseEvent) => void): void {
|
|
onClick = callback
|
|
},
|
|
}
|
|
|
|
return character
|
|
}
|