package com.mjstudio.reactnativenavermap.module import android.graphics.PointF import com.facebook.react.bridge.ReactApplicationContext import com.mjstudio.reactnativenavermap.util.px import com.naver.maps.map.NaverMap import com.naver.maps.map.overlay.InfoWindow import com.naver.maps.map.overlay.Marker class RNCNaverMapInfoWindowRegistry { private val infoWindows = mutableMapOf() private val infoWindowContents = mutableMapOf() fun create( id: String, reactContext: ReactApplicationContext, ) { if (infoWindows.containsKey(id)) return val infoWindow = InfoWindow().apply { adapter = object : InfoWindow.DefaultTextAdapter(reactContext) { override fun getText(infoWindow: InfoWindow): CharSequence = infoWindowContents[id] ?: "" } } infoWindows[id] = infoWindow } fun destroy(id: String) { infoWindows[id]?.let { infoWindow -> infoWindow.close() infoWindows.remove(id) infoWindowContents.remove(id) } } fun close(id: String) { infoWindows[id]?.close() } fun closeForMap(map: NaverMap) { infoWindows.values .filter { it.map === map || it.marker?.map === map } .forEach { it.close() } } fun closeForMarker(marker: Marker) { infoWindows.values .filter { it.marker === marker } .forEach { it.close() } } fun setContent( id: String, text: String, ) { infoWindowContents[id] = text val infoWindow = infoWindows[id] ?: return if (isOpen(infoWindow)) { infoWindow.invalidate() } } fun setOptions( id: String, anchorX: Double, anchorY: Double, offsetX: Double, offsetY: Double, alpha: Double, ) { val infoWindow = infoWindows[id] ?: return infoWindow.anchor = PointF(anchorX.toFloat(), anchorY.toFloat()) infoWindow.offsetX = offsetX.px infoWindow.offsetY = offsetY.px infoWindow.alpha = alpha.toFloat() } fun isOpen(id: String): Boolean = infoWindows[id]?.let(::isOpen) ?: false fun get(id: String): InfoWindow? = infoWindows[id] fun clear() { infoWindows.values.forEach { it.close() } infoWindows.clear() infoWindowContents.clear() } private fun isOpen(infoWindow: InfoWindow): Boolean = infoWindow.map != null || infoWindow.marker != null }