@mint-ui/map 1.2.0-test.49 → 1.2.0-test.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.49",
3
+ "version": "1.2.0-test.50",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",
@@ -1,22 +0,0 @@
1
- import React from "react";
2
- import { MarkerOptions, Offset, Position } from "../../../types";
3
- export interface CanvasMarkerRendererParamsHanquf<T> {
4
- context: CanvasRenderingContext2D;
5
- offset: Offset[];
6
- payload?: CanvasMarkerDataHanquf<T>;
7
- }
8
- export interface CanvasMarkerOptionHanquf {
9
- position?: Position[];
10
- visible?: boolean;
11
- hitRadius?: number;
12
- }
13
- export declare type CanvasMarkerDataHanquf<T> = T & CanvasMarkerOptionHanquf;
14
- export declare type CanvasMarkerRenderFunctionHanquf<T> = (params: CanvasMarkerRendererParamsHanquf<T>) => void;
15
- export interface CanvasMarkerPropsHanquf<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
16
- renderer: CanvasMarkerRenderFunctionHanquf<T>;
17
- data: CanvasMarkerDataHanquf<T>[];
18
- onMouseOver?: (item: CanvasMarkerDataHanquf<T>) => void;
19
- onMouseOut?: (item: CanvasMarkerDataHanquf<T>) => void;
20
- onClick?: (item: CanvasMarkerDataHanquf<T>) => void;
21
- }
22
- export declare function CanvasMarkerHanquf<T>({ renderer, data, onMouseOver, onMouseOut, onClick, ...options }: CanvasMarkerPropsHanquf<T>): React.ReactPortal;
@@ -1,413 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var tslib = require('tslib');
6
- var React = require('react');
7
- var MintMapProvider = require('../../provider/MintMapProvider.js');
8
- var MapDrawables = require('../../../types/MapDrawables.js');
9
- require('../../../types/MapTypes.js');
10
- require('../../../types/MapEventTypes.js');
11
- var reactDom = require('react-dom');
12
- var canvasUtil = require('./draw/canvas-util.js');
13
- var geohash = require('../../util/geohash.js');
14
-
15
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
16
-
17
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
18
-
19
- function CanvasMarkerHanquf(_a) {
20
- var renderer = _a.renderer,
21
- data = _a.data,
22
- onMouseOver = _a.onMouseOver,
23
- onMouseOut = _a.onMouseOut,
24
- onClick = _a.onClick,
25
- options = tslib.__rest(_a, ["renderer", "data", "onMouseOver", "onMouseOut", "onClick"]); //controller
26
-
27
-
28
- var controller = MintMapProvider.useMintMapController(); //element
29
-
30
- var divRef = React.useRef(document.createElement('div'));
31
- var divElement = divRef.current; //canvas container ref
32
-
33
- var containerRef = React.useRef(null); //canvas ref
34
-
35
- var canvasRef = React.useRef(null); //canvas context
36
-
37
- var contextRef = React.useRef(); //marker
38
-
39
- var markerRef = React.useRef(); // interaction states
40
-
41
- var hoveredRef = React.useRef(null);
42
- var clickedRef = React.useRef(null); // geohash index: hash -> items
43
-
44
- var geoIndexRef = React.useRef(new Map());
45
- var geoPrecisionRef = React.useRef(6); // drag translate state
46
-
47
- var prevCenterOffsetRef = React.useRef(null);
48
- var accumTranslateRef = React.useRef({
49
- x: 0,
50
- y: 0
51
- });
52
- var draggingRef = React.useRef(false); //create object
53
-
54
- React.useEffect(function () {
55
- divElement.style.width = 'fit-content';
56
- divElement.style.pointerEvents = 'none';
57
- return function () {
58
- if (markerRef.current) {
59
- controller.clearDrawable(markerRef.current);
60
- markerRef.current = undefined;
61
- }
62
- };
63
- }, []); //create / update object
64
-
65
- React.useEffect(function () {
66
- if (options) {
67
- var bounds = controller.getCurrBounds();
68
-
69
- var markerOptions = tslib.__assign({
70
- position: bounds.nw
71
- }, options);
72
-
73
- if (markerRef.current) {
74
- controller.updateMarker(markerRef.current, markerOptions);
75
- } else {
76
- markerRef.current = new MapDrawables.Marker(markerOptions);
77
- markerRef.current.element = divElement;
78
- controller.createMarker(markerRef.current); //disablePointerEvent 처리
79
-
80
- if (divElement.parentElement) {
81
- divElement.style.pointerEvents = 'none';
82
- divElement.parentElement.style.pointerEvents = 'none';
83
- } //z-index 처리
84
-
85
-
86
- if (options.zIndex !== undefined) {
87
- controller.setMarkerZIndex(markerRef.current, options.zIndex);
88
- }
89
- }
90
- }
91
- }, [options]);
92
-
93
- var handleIdle = function () {
94
- // 클리어
95
- canvasUtil.clearRect(canvasRef.current, contextRef.current); // 표시 복구 (드래그/줌 중 숨김 처리 복원)
96
-
97
- containerRef.current && (containerRef.current.style.visibility = ''); // 드래그 종료 처리: 변환 초기화 및 기준 위치 갱신
98
-
99
- draggingRef.current = false;
100
- prevCenterOffsetRef.current = null;
101
- accumTranslateRef.current = {
102
- x: 0,
103
- y: 0
104
- };
105
-
106
- if (containerRef.current) {
107
- containerRef.current.style.transform = '';
108
- } // 마커 이동
109
-
110
-
111
- var bounds = controller.getCurrBounds();
112
-
113
- var markerOptions = tslib.__assign({
114
- position: bounds.nw
115
- }, options);
116
-
117
- markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // 렌더링 (hover/click item last)
118
-
119
- canvasUtil.renderMain(controller, rendererRef.current, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
120
- };
121
-
122
- var handleZoomStart = function () {
123
- containerRef.current && (containerRef.current.style.visibility = 'hidden');
124
- };
125
-
126
- var handleZoomEnd = function () {
127
- containerRef.current && (containerRef.current.style.visibility = '');
128
- }; //initialize
129
-
130
-
131
- React.useEffect(function () {
132
- var resizeObserver; // hover/out 공통 처리기 (mouse 좌표 기반)
133
-
134
- var updateHoverByMouseXY = function (mouseX, mouseY) {
135
- var hit = hitTest(mouseX, mouseY);
136
-
137
- if ((hit === null || hit === void 0 ? void 0 : hit.item) !== hoveredRef.current) {
138
- if (hoveredRef.current && onMouseOut) {
139
- onMouseOut(hoveredRef.current);
140
- }
141
-
142
- hoveredRef.current = (hit === null || hit === void 0 ? void 0 : hit.item) || null;
143
-
144
- if ((hit === null || hit === void 0 ? void 0 : hit.item) && onMouseOver) {
145
- onMouseOver(hit.item);
146
- }
147
-
148
- canvasUtil.clearRect(canvasRef.current, contextRef.current);
149
- canvasUtil.renderMain(controller, rendererRef.current, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
150
- }
151
- };
152
-
153
- var handleMouseLeave = function () {
154
- console.log('handleMouseLeave');
155
-
156
- if (hoveredRef.current && onMouseOut) {
157
- onMouseOut(hoveredRef.current);
158
- }
159
-
160
- hoveredRef.current = null;
161
- canvasUtil.clearRect(canvasRef.current, contextRef.current);
162
- canvasUtil.renderMain(controller, rendererRef.current, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
163
- }; // 지도 이벤트 → 화면 좌표 변환
164
-
165
-
166
- var parseEventToOffset = function (e) {
167
- var mapType = controller.getMapType();
168
- var latlng = (e === null || e === void 0 ? void 0 : e.latlng) || (e === null || e === void 0 ? void 0 : e.latLng);
169
-
170
- if (!latlng) {
171
- return null;
172
- }
173
-
174
- var pos = {
175
- lat: 0,
176
- lng: 0
177
- }; //@ts-ignore
178
-
179
- if (mapType === 'naver') {
180
- pos.lat = latlng._lat;
181
- pos.lng = latlng._lng; //@ts-ignore
182
- } else if (mapType === 'google') {
183
- pos.lat = latlng.lat();
184
- pos.lng = latlng.lng(); //@ts-ignore
185
- } else if (mapType === 'kakao') {
186
- pos.lat = latlng.Ma;
187
- pos.lng = latlng.La;
188
- } else {
189
- return null;
190
- }
191
-
192
- var offset = controller.positionToOffset(pos);
193
- return offset;
194
- };
195
-
196
- var handleMapMouseMove = function (e) {
197
- if (draggingRef.current) {
198
- return;
199
- }
200
-
201
- var offset = parseEventToOffset(e);
202
- if (!offset) return;
203
- updateHoverByMouseXY(offset.x, offset.y);
204
- };
205
-
206
- var handleMapClick = function (e) {
207
- console.log('handleClick');
208
- var offset = parseEventToOffset(e);
209
- if (!offset) return;
210
- var hit = hitTest(offset.x, offset.y);
211
-
212
- if (hit === null || hit === void 0 ? void 0 : hit.item) {
213
- clickedRef.current = hit.item;
214
- onClick && onClick(hit.item);
215
- canvasUtil.clearRect(canvasRef.current, contextRef.current);
216
- canvasUtil.renderMain(controller, rendererRef.current, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
217
- }
218
- };
219
-
220
- if (canvasRef.current && containerRef.current) {
221
- // 리사이즈 처리
222
- resizeObserver = new ResizeObserver(function () {
223
- // 클리어
224
- canvasUtil.clearRect(canvasRef.current, contextRef.current); // 스케일링
225
-
226
- canvasRef.current && contextRef.current && canvasUtil.scaleCanvas(controller, canvasRef.current, contextRef.current); // 렌더링 (respect hover/click ordering)
227
-
228
- canvasUtil.renderMain(controller, rendererRef.current, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
229
- });
230
- resizeObserver.observe(controller.mapDivElement); // IDLE 이벤트 등록
231
-
232
- controller.addEventListener('IDLE', handleIdle); // 줌 처리
233
-
234
- controller.addEventListener('ZOOMSTART', handleZoomStart);
235
- controller.addEventListener('ZOOM_CHANGED', handleZoomEnd); // 2d 컨텍스트
236
-
237
- contextRef.current = canvasRef.current.getContext('2d'); // 스케일링
238
-
239
- if (contextRef.current) {
240
- canvasUtil.scaleCanvas(controller, canvasRef.current, contextRef.current);
241
- } // 지도 이벤트 구독 (부모 pointer-events:none 이어도 동작)
242
-
243
-
244
- var map = controller.getMap();
245
-
246
- if (map) {
247
- //@ts-ignore
248
- map.addListener('mousemove', handleMapMouseMove); //@ts-ignore
249
-
250
- map.addListener('click', handleMapClick); //@ts-ignore
251
-
252
- map.addListener('center_changed', function () {
253
- // 드래그 중에는 리렌더 대신 transform 으로만 추종
254
- var center = controller.getCurrBounds().getCenter();
255
- var curr = controller.positionToOffset(center);
256
- var prev = prevCenterOffsetRef.current;
257
-
258
- if (!prev) {
259
- prevCenterOffsetRef.current = {
260
- x: curr.x,
261
- y: curr.y
262
- };
263
- draggingRef.current = true;
264
- return;
265
- }
266
-
267
- var dx = prev.x - curr.x;
268
- var dy = prev.y - curr.y;
269
- accumTranslateRef.current = {
270
- x: accumTranslateRef.current.x + dx,
271
- y: accumTranslateRef.current.y + dy
272
- };
273
- prevCenterOffsetRef.current = {
274
- x: curr.x,
275
- y: curr.y
276
- };
277
- draggingRef.current = true;
278
-
279
- if (containerRef.current) {
280
- containerRef.current.style.transform = "translate(".concat(accumTranslateRef.current.x, "px, ").concat(accumTranslateRef.current.y, "px)");
281
- }
282
- }); //@ts-ignore
283
-
284
- map.addListener('idle', handleIdle);
285
- } // 마우스가 지도 영역을 벗어나는 경우 처리
286
-
287
-
288
- controller.mapDivElement.addEventListener('mouseleave', handleMouseLeave);
289
- }
290
-
291
- return function () {
292
- resizeObserver && resizeObserver.disconnect();
293
- controller.mapDivElement && controller.mapDivElement.removeEventListener('mouseleave', handleMouseLeave);
294
- controller.removeEventListener('IDLE', handleIdle);
295
- controller.removeEventListener('ZOOMSTART', handleZoomStart);
296
- controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
297
- };
298
- }, []); // data ref
299
-
300
- var dataRef = React.useRef(data);
301
- React.useEffect(function () {
302
- dataRef.current = data; // rebuild geohash index
303
-
304
- var map = new Map();
305
- var precision = geoPrecisionRef.current;
306
-
307
- for (var _i = 0, _a = data || []; _i < _a.length; _i++) {
308
- var item = _a[_i];
309
- var pos = item.position && item.position[0];
310
- if (!pos) continue;
311
- var hash = geohash.geohashEncode(pos.lat, pos.lng, precision);
312
- var list = map.get(hash) || [];
313
- list.push(item);
314
- map.set(hash, list);
315
- }
316
-
317
- geoIndexRef.current = map;
318
- }, [data]); // renderer ref
319
-
320
- var rendererRef = React.useRef(renderer);
321
- React.useEffect(function () {
322
- rendererRef.current = renderer;
323
- }, [renderer]); // Build ordered list so hovered/clicked items render last (on top) within this canvas layer
324
-
325
- var buildOrderedData = function () {
326
- var base = dataRef.current || [];
327
- var result = [];
328
- var hoverItem;
329
- var clickItem;
330
-
331
- for (var _i = 0, base_1 = base; _i < base_1.length; _i++) {
332
- var item = base_1[_i];
333
-
334
- if (clickedRef.current && item === clickedRef.current) {
335
- clickItem = item;
336
- } else if (hoveredRef.current && item === hoveredRef.current) {
337
- hoverItem = item;
338
- } else {
339
- result.push(item);
340
- }
341
- }
342
-
343
- if (hoverItem) result.push(hoverItem);
344
- if (clickItem) result.push(clickItem);
345
- return result;
346
- }; // Geohash-accelerated hit-test
347
-
348
-
349
- var hitTest = function (mouseX, mouseY) {
350
- // convert mouse offset -> lat/lng then geohash it
351
- var pos = controller.offsetToPosition({
352
- x: mouseX,
353
- y: mouseY
354
- });
355
- var precision = geoPrecisionRef.current;
356
- var baseHash = geohash.geohashEncode(pos.lat, pos.lng, precision);
357
- var buckets = geohash.geohashNeighbors(baseHash); // collect candidates from buckets (preserve ordering for top-most first)
358
-
359
- var set = new Set();
360
- var ordered = buildOrderedData();
361
-
362
- for (var _i = 0, buckets_1 = buckets; _i < buckets_1.length; _i++) {
363
- var b = buckets_1[_i];
364
- var list = geoIndexRef.current.get(b);
365
- if (!list) continue;
366
-
367
- for (var _a = 0, list_1 = list; _a < list_1.length; _a++) {
368
- var it = list_1[_a];
369
- set.add(it);
370
- }
371
- } // iterate from top-most
372
-
373
-
374
- for (var i = ordered.length - 1; i >= 0; i--) {
375
- var item = ordered[i];
376
- if (!set.has(item)) continue;
377
- if (item.visible === false) continue;
378
- var p = item.position && item.position[0];
379
- if (!p) continue;
380
- var off = controller.positionToOffset(p);
381
- var r = Math.max(2, item.hitRadius || 20);
382
- var dx = mouseX - off.x;
383
- var dy = mouseY - off.y;
384
-
385
- if (dx * dx + dy * dy <= r * r) {
386
- return {
387
- item: item
388
- };
389
- }
390
- }
391
-
392
- return null;
393
- }; // Initial render
394
-
395
-
396
- canvasUtil.renderMain(controller, renderer, containerRef.current, canvasRef.current, contextRef.current, buildOrderedData());
397
- return reactDom.createPortal(React__default["default"].createElement("div", {
398
- ref: containerRef,
399
- style: {
400
- position: 'absolute',
401
- width: '100%',
402
- height: '100%',
403
- pointerEvents: 'none'
404
- }
405
- }, React__default["default"].createElement("canvas", {
406
- ref: canvasRef,
407
- style: {
408
- pointerEvents: 'revert-layer'
409
- }
410
- })), divElement);
411
- }
412
-
413
- exports.CanvasMarkerHanquf = CanvasMarkerHanquf;
@@ -1,125 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- // Lightweight Geohash encoder and neighbor utilities
6
- var BASE32 = '0123456789bcdefghjkmnpqrstuvwxyz';
7
- var NEIGHBORS = {
8
- n: {
9
- even: {
10
- border: 'prxz',
11
- neighbor: 'bc01fg45238967deuvhjyznpkmstqrwx'
12
- },
13
- odd: {
14
- border: 'bcfguvyz',
15
- neighbor: 'p0r21436x8zb9dcf5h7kjnmqesgutwvy'
16
- }
17
- },
18
- s: {
19
- even: {
20
- border: '028b',
21
- neighbor: '238967debc01fg45kmstqrwxuvhjyznp'
22
- },
23
- odd: {
24
- border: '0145hjnp',
25
- neighbor: '14365h7k9dcfesgujnmqp0r2twvyx8zb'
26
- }
27
- },
28
- e: {
29
- even: {
30
- border: 'bcfguvyz',
31
- neighbor: '14365h7k9dcfesgujnmqp0r2twvyx8zb'
32
- },
33
- odd: {
34
- border: 'prxz',
35
- neighbor: 'bc01fg45238967deuvhjyznpkmstqrwx'
36
- }
37
- },
38
- w: {
39
- even: {
40
- border: '0145hjnp',
41
- neighbor: '238967debc01fg45kmstqrwxuvhjyznp'
42
- },
43
- odd: {
44
- border: '028b',
45
- neighbor: 'p0r21436x8zb9dcf5h7kjnmqesgutwvy'
46
- }
47
- }
48
- };
49
- function geohashEncode(lat, lon, precision) {
50
- if (precision === void 0) {
51
- precision = 6;
52
- }
53
-
54
- var idx = 0;
55
- var bit = 0;
56
- var evenBit = true;
57
- var geohash = '';
58
- var latMin = -90,
59
- latMax = 90;
60
- var lonMin = -180,
61
- lonMax = 180;
62
-
63
- while (geohash.length < precision) {
64
- if (evenBit) {
65
- var lonMid = (lonMin + lonMax) / 2;
66
-
67
- if (lon >= lonMid) {
68
- idx = idx * 2 + 1;
69
- lonMin = lonMid;
70
- } else {
71
- idx = idx * 2;
72
- lonMax = lonMid;
73
- }
74
- } else {
75
- var latMid = (latMin + latMax) / 2;
76
-
77
- if (lat >= latMid) {
78
- idx = idx * 2 + 1;
79
- latMin = latMid;
80
- } else {
81
- idx = idx * 2;
82
- latMax = latMid;
83
- }
84
- }
85
-
86
- evenBit = !evenBit;
87
-
88
- if (++bit == 5) {
89
- geohash += BASE32.charAt(idx);
90
- bit = 0;
91
- idx = 0;
92
- }
93
- }
94
-
95
- return geohash;
96
- }
97
-
98
- function adjacent(hash, dir) {
99
- var lastChr = hash[hash.length - 1];
100
- var type = hash.length % 2 ? 'odd' : 'even'; // @ts-ignore
101
-
102
- var border = NEIGHBORS[dir][type].border; // @ts-ignore
103
-
104
- var neighbor = NEIGHBORS[dir][type].neighbor;
105
- var base = hash.substring(0, hash.length - 1);
106
-
107
- if (border.indexOf(lastChr) !== -1) {
108
- base = adjacent(base, dir);
109
- }
110
-
111
- var pos = neighbor.indexOf(lastChr);
112
- var nextChr = BASE32.charAt(pos);
113
- return base + nextChr;
114
- }
115
-
116
- function geohashNeighbors(hash) {
117
- var n = adjacent(hash, 'n');
118
- var s = adjacent(hash, 's');
119
- var e = adjacent(hash, 'e');
120
- var w = adjacent(hash, 'w');
121
- return [hash, n, s, e, w, adjacent(n, 'e'), adjacent(n, 'w'), adjacent(s, 'e'), adjacent(s, 'w')];
122
- }
123
-
124
- exports.geohashEncode = geohashEncode;
125
- exports.geohashNeighbors = geohashNeighbors;