{"version":3,"sources":["constants/modes.ts","components/panels/Icon.tsx","redux/editor/constants.ts","redux/editor/actions.ts","redux/editor/selectors.ts","components/dialogs/RouterDialog.tsx","redux/map/constants.ts","redux/map/actions.ts","redux/map/selectors.ts","components/dialogs/PolylineDialog.tsx","constants/stickers.ts","components/dialogs/StickersDialog.tsx","components/dialogs/TrashDialog.tsx","constants/logos.ts","components/dialogs/LogoDialog.tsx","utils/reducer.ts","constants/auth.ts","constants/dialogs.ts","redux/user/constants.ts","redux/user/handlers.ts","redux/user/index.ts","constants/api.ts","constants/providers.ts","config/frontend.ts","utils/api/instance.ts","utils/api/interceptors.ts","utils/api/index.ts","redux/user/actions.ts","redux/user/selectors.ts","constants/tips.ts","constants/map.ts","utils/simplify.ts","utils/gpx.ts","utils/geom.ts","utils/renderer.ts","utils/map/DomMarker.ts","utils/map/OsrmRouter.ts","utils/format.ts","redux/editor/handlers.ts","redux/editor/index.ts","utils/dom.ts","redux/editor/sagas.ts","redux/map/sagas.ts","redux/user/sagas.ts","redux/map/handlers.ts","redux/map/index.ts","utils/window.ts","redux/store.ts","utils/history.ts","components/Switch.tsx","components/dialogs/SaveDialog.tsx","components/dialogs/CancelDialog.tsx","components/gpx/GpxDialogRow.tsx","components/dialogs/GpxDialog.tsx","components/dialogs/ProviderDialog.tsx","components/dialogs/ShotPrefetchDialog.tsx","components/panels/EditorDialog.tsx","components/panels/Tooltip.tsx","components/panels/EditorPanel.tsx","components/Fills.tsx","components/user/GuestButton.tsx","components/user/UserPicture.tsx","components/user/UserButton.tsx","constants/app_info.ts","components/user/UserMenu.tsx","components/dialogs/TitleDialog.tsx","components/dialogs/NominatimSearchPanel.tsx","components/panels/UserPanel.tsx","components/panels/RendererPanel.tsx","components/renderer/Renderer.tsx","components/maps/RouteRowView.tsx","components/maps/RouteRowEditor.tsx","components/maps/RouteRowDrop.tsx","components/maps/RouteRowWrapper.tsx","components/Scroll.tsx","components/search/MapListDialogHead.tsx","components/dialogs/DialogLoader.tsx","components/dialogs/MapListDialog.tsx","components/nominatim/NominatimListItem.tsx","components/dialogs/NominatimDialog.tsx","containers/LeftDialog.tsx","components/dialogs/AppInfoDialog.tsx","components/UserLocation.tsx","components/panels/DistanceBar.tsx","components/panels/TopLeftPanel.tsx","components/panels/TopRightPanel.tsx","components/logo/LogoPreview.tsx","utils/map/InteractivePoly.ts","map/Route/index.tsx","map/Router/index.tsx","utils/context.ts","map/TileLayer/index.tsx","components/StickerDesc.tsx","map/Sticker/index.tsx","map/Stickers/index.tsx","utils/arrow.ts","utils/marks.ts","map/KmMarks/index.tsx","map/CurrentLocation/index.tsx","map/GpxPolyline/index.tsx","map/Map/index.tsx","containers/App.tsx","index.tsx"],"names":["MODES","Icon","memo","icon","size","width","height","viewBox","id","xlinkHref","x","y","stroke","mask","P","DRAWING_DIRECTIONS","EDITOR_ACTIONS","SET_EDITING","CHANGE_MODE","SET_MODE","SET_DISTANCE","SET_CHANGED","SET_SPEED","SET_ROUTER_POINTS","SET_ACTIVE_STICKER","START_EDITING","STOP_EDITING","ROUTER_CANCEL","ROUTER_SUBMIT","CLEAR_POLY","CLEAR_STICKERS","CLEAR_ALL","CLEAR_CANCEL","SEND_SAVE_REQUEST","SET_SAVE_LOADING","RESET_SAVE_DIALOG","CANCEL_SAVE","SET_SAVE","SHOW_RENDERER","HIDE_RENDERER","SET_RENDERER","TAKE_A_SHOT","CROP_A_SHOT","SET_DIALOG","SET_DIALOG_ACTIVE","LOCATION_CHANGED","SET_READY","SET_MARKERS_SHOWN","GET_GPX_TRACK","SET_IS_EMPTY","SET_FEATURE","SET_IS_ROUTING","KEY_PRESSED","SET_ROUTER","SET_NOMINATIM","SEARCH_NOMINATIM","SET_HISTORY","UNDO","REDO","CAPTURE_HIPSTORY","SET_DIRECTION","SET_GPX","UPLOAD_GPX","DROP_GPX","editorSetEditing","editing","type","editorChangeMode","mode","editorSetMode","editorSetChanged","changed","editorStopEditing","editorClearAll","editorSetSave","save","editorHideRenderer","editorSetRenderer","payload","editorTakeAShot","editorSetDialog","dialog","editorSetDialogActive","dialog_active","editorSetReady","ready","editorGetGPXTrack","editorSetFeature","features","editorSetActiveSticker","activeSticker","editorSetRouter","router","editorSetNominatim","nominatim","editorSetHistory","history","editorUndo","editorRedo","editorSetGpx","gpx","selectEditor","state","editor","selectEditorSave","selectEditorEditing","selectEditorMode","selectEditorRenderer","renderer","selectEditorRouter","selectEditorDistance","distance","selectEditorNominatim","selectEditorDirection","drawing_direction","selectEditorGpx","noPoints","editorRouterCancel","Fragment","className","onClick","firstPoint","draggablePoints","editorRouterSubmit","mapDispatchToProps","RouterDialog","connect","waypoints","classnames","length","MAP_ACTIONS","SET_MAP","SET_PROVIDER","SET_ROUTE","SET_TITLE","SET_DESCRIPTION","SET_ADDRESS","SET_ADDRESS_ORIGIN","SET_OWNER","SET_PUBLIC","SET_LOGO","ADD_STICKER","SET_STICKER","SET_STICKERS","DROP_STICKER","MAP_CLICKED","ZOOM_CHANGE","mapSet","map","mapSetProvider","provider","mapSetRoute","route","mapSetStickers","stickers","mapAddSticker","sticker","selectMap","selectMapProvider","selectMapLogo","logo","selectMapRoute","selectMapStickers","selectMapTitle","title","selectMapAddress","address","editorSetDirection","PolylineDialog","direction","reverseRoute","useCallback","reverse","curRouteStart","slice","curRouteEnd","continueBackward","continueForward","classNames","inactive","active","STICKERS","base","url","layers","men","off","title_long","square","bridge","ikea","bugr","monum","opera","forest","road","chicken","camp","rocks","crap","pancake","fastfood","beer","mountains","waterfall","fields","beach","village","scrulpture","night","tick","empty","real","shawarma","dump","swamp","coffee","pin","start","p1","p2","p3","p4","p5","p6","finish","danger","question","points","pt1","pt2","pt3","pt4","pt5","pt6","StickersDialog","style","Object","keys","set","backgroundImage","backgroundPosition","editorClearPoly","editorClearStickers","editorClearCancel","TrashDialog","LOGOS","default","nvs","pinmix","jolly","pedals","rider","rider_evening","prokatimsya","mapSetLogo","LogoDialog","item","onMouseDown","createReducer","initialState","handlers","action","hasOwnProperty","ROLES","DEFAULT_USER","new_messages","place_types","random_url","role","routes","success","token","undefined","photo","name","uid","DIALOGS","TABS","MY","PENDING","STARRED","TABS_TITLES","USER_ACTIONS","searchSetDistance","filter","USER_HANDLERS","user","location","tab","values","indexOf","list","min","max","limit","step","shift","loading","is_published","el","userReducer","starred","author","API","TILEMAPS","DGIS","range","DEFAULT","BLANK","HOT","ESAT","ENABLED","DEFAULT_PROVIDER","PROVIDERS","reduce","obj","replaceProviderUrl","zoom","random","Math","round","replace","String","OSRM_URL","process","OSRM_PROFILE","CLIENT","API_ADDR","OSRM_TEST_URL","south_west","north_east","join","STROKE_WIDTH","PUBLIC_PATH","NOMINATIM_TEST_URL","NOMINATIM_URL","COLORS","api","axios","create","baseURL","postMapInterceptor","res","response","data","code","error","Error","checkUserToken","get","params","getGuestToken","getStoredMap","postMap","force","is_public","description","post","catch","checkIframeToken","viewer_id","auth_key","then","result","getRouteList","search","checkOSRMService","bounds","searchNominatim","query","format","country_code","dedupe","place_id","latlng","lat","lng","lon","display_name","dropRoute","delete","modifyRoute","patch","sendRouteStarred","setUser","userLogout","searchSetTitle","searchChangeDistance","searchSetTab","searchSetLoading","searchPutRoutes","mapsSetShift","setRouteStarred","selectUser","selectUserUser","selectUserLocation","TIPS","MainMap","props","disableClicks","clickable","enableClicks","getVisibleBounds","routeLayer","stickerLayer","i","getBounds","fitVisibleBounds","options","fitBounds","FeatureGroup","addTo","Map","document","getElementById","setView","simplify","latlngs","project","LineUtil","unproject","getGPXString","cat","text","downloadGPXTrack","track","saveAs","Blob","importGpxTrack","file","a","reader","FileReader","Promise","resolve","readAsText","onload","onerror","content","GPX","parse","trk","trk_res","trkseg","trkseg_res","trkpt","pnt","LatLng","metadata","findDistancePx","sqrt","distKmHaversine","A","B","t1","n1","t2","n2","dLat","PI","dLon","sin","cos","asin","findDistanceHaversine","dist2","distToSegment","C","l2","t","distToSegmentSquared","angleBetweenPoints","parseFloat","atan2","toFixed","allwaysPositiveAngleDeg","angle","nearestInt","value","parts","latLngToTile","getZoom","Number","floor","log","tan","z","getTilePlacement","window","innerWidth","innerHeight","southWest","getSouthWest","northEast","getNorthEast","southWestTile","northEastTile","minX","maxY","maxX","minY","southWestTileCoords","point","pow","n","atan","exp","latLng","tileToLatLng","tileTransformTranslate","latLngToLayerPoint","msw2","shiftX","shiftY","getStickersPlacement","latLngToContainerPoint","getImageSource","coords","imageFetcher","source","reject","img","Image","crossOrigin","src","fetchImages","ctx","geometry","images","push","all","image","composeImages","posX","posY","drawImage","composePoly","color","weight","dash","lineCap","lineJoin","lineWidth","beginPath","moveTo","lineTo","gradient","createLinearGradient","addColorStop","strokeStyle","setLineDash","closePath","composeArrows","distances","min_arrows","min_distance","sort","b","middle","translate","rotate","restore","composeStickerArrow","scale","fillStyle","fill","roundedRect","rad","arc","composeStickerText","tX","tY","font","lines","split","lineHeight","line","measureText","reversed","rectX","rectY","rectW","rectH","textX","measureRect","fillText","composeDistMark","dist","measureDistText","measureDistRect","composeStickerImage","offsetX","composeStickers","downloadCanvas","canvas","toBlob","blob","DomMarker","element","oldicon","this","classList","add","DivIcon","createWaypointMarker","createElement","OsrmRouter","Routing","serviceUrl","profile","fitSelectedRoutes","showAlternatives","routeLine","r","styles","opacity","dashArray","addWaypoints","altLineOptions","show","plan","createMarker","_","wp","Marker","draggable","on","setWaypoints","getWaypoints","routeWhileDragging","routingOptions","geometryOnly","useHints","ru","en","removeGarbage","toHours","info","hrs","parseInt","lmin","toTranslit","string","RegExp","parseDesc","getEstimated","speed","time","EDITOR_HANDLERS","estimated","routerPoints","save_processing","save_overwriting","save_finished","save_error","renderer_active","markers_shown","is_empty","is_routing","EDITOR_INITIAL_STATE","routing","progress","finished","overwriting","processing","records","position","enabled","getStyle","oElm","strCssRule","defaultView","getComputedStyle","getPropertyValue","currentStyle","strMatch","toUpperCase","getRandomColor","getAdaptiveScale","stopEditingSaga","checkOSRMServiceSaga","setReadySaga","getRenderData","takeAShotSaga","getCropData","cropAShotSaga","locationChangeSaga","keyPressedSaga","getGPXTrackSaga","routerCancel","mapClick","routerSubmit","cancelSave","searchNominatimSaga","changeMode","changeHistory","undoHistory","redoHistory","uploadGpx","editorSaga","hideLoader","pointerEvents","select","getUrlData","path","put","pushPath","call","getContext","sticker_points","clearRect","toDataURL","worker","race","timeout","delay","logoImage","loadMapFromPath","animate","key","target","coordinates","current","EDITOR_HISTORY_LENGTH","uuid","takeEvery","takeLatest","takeLeading","onMapClick","loadMapSaga","startEmptyEditorSaga","mapInitSaga","setActiveStickerSaga","startEditingSaga","clearPolySaga","clearStickersSaga","clearAllSaga","clearSaga","sendSaveRequestSaga","setChanged","mapSaga","console","owner","pushLoaderState","hash","test","matches","match","setTitleSaga","cancel","take","generateGuestSaga","authCheckSaga","gotVkUserSaga","searchGetRoutes","searchSetSagaWorker","searchSetSaga","openMapDialogSaga","searchSetTabSaga","userLogoutSaga","setUserSaga","mapsLoadMoreSaga","dropRouteSaga","modifyRouteSaga","toggleRouteStarredSaga","updateUserRoutes","userSaga","parseQuery","pushNetworkInitError","u","limits","count","resp_shift","resp_step","findIndex","find","REHYDRATE","MAP_HANDLERS","index","address_origin","isMobile","mapPersistConfig","whitelist","storage","userPersistConfig","editorPersistConfig","sagaMiddleware","createSagaMiddleware","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","store","createStore","combineReducers","persistReducer","applyMiddleware","callback","createBrowserHistory","listen","dispatch","editorLocationChanged","pathname","setUserLocation","navigator","geolocation","watchPosition","latitude","longitude","event","_zoom","getPath","host","protocol","queryString","queries","decodeURIComponent","substring","substr","l","temp","countDownToRefresh","left","reload","setTimeout","Switch","onPress","editorCancelSave","editorSendSaveRequest","SaveDialogUnconnected","getAddress","trim","toLowerCase","setTitle","setState","setAddress","setDescription","e","forceSaveRequest","cancelSaving","onCopy","preventDefault","str","setAttribute","body","appendChild","execCommand","removeChild","copyToClipboard","togglePublic","componentWillUnmount","onChange","autoFocus","readOnly","placeholder","gray","React","Component","SaveDialog","CancelDialogUnconnected","proceed","CancelDialog","GpxDialogRow","onRouteToggle","onFocusRoute","onRouteDrop","onRouteColor","onRouteReplace","backgroundColor","editorDropGpx","editorUploadGpx","GpxDialog","toggleGpx","onGpxUpload","files","latLngBounds","addCurrent","disabled","ProviderDialog","ShotPrefetchDialog","DIALOG_CONTENTS","EditorDialog","Tooltip","children","top","editorStartEditing","editorKeyPressed","tagName","EditorPanelUnconnected","panel","onKeyPress","startPolyMode","startStickerMode","startRouterMode","startTrashMode","startSaveMode","addEventListener","getBoundingClientRect","removeEventListener","can_undo","can_redo","can_clear","ref","primary","PureComponent","EditorPanel","Fills","x1","x2","y1","y2","offset","stopColor","refX","refY","markerWidth","markerHeight","orient","d","fillRule","GuestButton","UserPicture","UserButton","setMenuOpened","APP_INFO","VERSION","RELEASE","CHANGELOG","2","1","UserMenu","openAppInfoDialog","TitleDialogUnconnected","raised","height_raised","onHover","onLeave","setMaxHeight","ref_sizer","ref_title","ref_text","sizer_height","title_height","text_height","title_margin","text_margins","text_line","container_height","min_height","minLines","max_height","maxLines","ref_overflow","onMouseOver","onMouseOut","has_shade","marginBottom","TitleDialog","NominatimSearchPanel","onSearch","useState","setSearch","setValue","onSubmit","gotVkUser","openMapDialog","editorSearchNominatim","UserPanelUnconnected","menuOpened","openMapsDialog","openOauthFrame","open","openGpxDialog","ip","agent","userdata","UserPanel","RendererPanel","onCancel","zIndex","editorCropAShot","onImageLoaded","croppr","Croppr","onInitialize","onCropInit","crop","regionEl","box","transform","logoImg","append","getImage","getValue","destroy","padding","paddingBottom","alt","onLoad","Renderer","RouteRowView","openRoute","startEditing","showMenu","showDropCard","hideMenu","is_admin","toggleStarred","has_menu","bind","RouteRowEditor","stopEditing","setPublic","RouteRowDrop","RouteRowWrapper","is_editing_target","is_menu_target","is_editing_mode","Scroll","renderTrackHorizontal","prop","renderTrackVertical","renderThumbHorizontal","renderThumbVertical","MapListDialogHead","onSearchChange","onDistanceChange","marks","useMemo","Array","defaultValue","pushable","DialogLoader","mapsLoadMore","toggleRouteStarred","MapListDialogUnconnected","menu_target","editor_target","is_editing","is_dropping","_id","onScroll","scrollHeight","scrollTop","clientHeight","MapListDialog","NominatimListItem","panTo","NominatimDialog","flex","LEFT_DIALOGS","href","LeftDialog","UserLocation","cy","cx","ry","rx","editorSetSpeed","DistanceBarUnconnected","toggleDialog","dialogOpened","DistanceBar","pick","TopLeftPanel","TopRightPanel","startProviderMode","startLogoMode","clearMode","onFocus","onBlur","tabIndex","LogoPreviewUnconnected","LogoPreview","InteractivePoly","updateConstraintsToLatLngs","is_drawing","constraints","constrLine","getLatLngs","setConstraints","setLatLngs","updateTouchHinter","touchHinter","setPoints","emitEvent","recreateMarkers","recalcDistance","fire","createHintMarker","marker","divIcon","iconSize","iconAnchor","dropMarker","onMarkerDrag","onMarkerDragStart","onMarkerDragEnd","markerLayer","clearAllMarkers","forEach","markers","updateMarkers","clearLayers","showVisibleMarkers","showAllMarkers","_map","hasLayer","addLayer","hideAllMarkers","removeLayer","getLatLng","hidden","visible","maxMarkers","disable","stopDragHinting","stopDrawing","removeFrom","enable","startDragHinting","continue","startDrawing","prepend","stop","moveDragHint","hintMarker","setLatLng","hideDragHint","showDragHint","startDragHintMove","originalEvent","stopPropagation","prev","dragHintFindNearest","hint_prev_marker","dragging","is_dragging","dragHintMove","dragHintAddMarker","stopDragHintMove","dragHintChangeDistance","splice","insertLatLng","next","initial_distance","current_distance","neighbours","radius","pointInArea","concat","vertex_index","vertex","markerDragChangeDistance","replaceLatlng","initial","onDrawingMove","onDrawingClick","drawingChangeDistance","unshift","setDirection","dropMarkerDistanceChange","getPolyLength","LayerGroup","constraintsStyle","interactive","Polyline","smoothFactor","addInitHook","once","setStyle","editorSetDistance","editorSetMarkersShown","RouteUnconnected","layer","setLayer","useEffect","onRouteChanged","Route","RouterUnconnected","setDist","end","setEnd","updateWaypoints","filtered","updateDistance","summary","totalDistance","html","right","zIndexOffset","remove","Router","TileContext","createContext","TileLayer","tileLayer","attribution","maxNativeZoom","maxZoom","setUrl","Provider","StickerDesc","setText","blockMouse","input","focus","onMouseDownCapture","onMouseUpCapture","onDragStartCapture","onTouchStartCapture","dangerouslySetInnerHTML","__html","onDragStart","Sticker","mapSetSticker","mapDropSticker","setDragging","wrapper","useRef","stickerArrow","stickerImage","onDelete","updateAngle","ang","onDragStop","onMoveStarted","onMoveFinished","onDrag","touches","pageX","pageY","onTextChange","onTextBlur","getLabelDirection","createPortal","onMouseUp","onTouchStart","onTouchEnd","Stickers","setZoom","onZoomChange","arrowClusterIcon","cluster","getAllChildMarkers","KmMarksLayer","marksLayer","endMarker","showMiddleMarkers","drawMiddleMarkers","showEndMarker","drawEndMarker","last_km_mark","diff","sum","rounded","kmMarksStep","createMiddleMarker","addLayers","createEndMarker","createStartMarker","MarkerClusterGroup","spiderfyOnMaxZoom","showCoverageOnHover","zoomToBoundsOnClick","maxClusterRadius","iconCreateFunction","showStartMarker","showArrows","KmMarksUnconnected","KmMarks","CurrentLocation","zoomToLocation","GpxPolyline","mapClicked","MapUnconnected","App","run","persistor","persistStore","interceptors","request","use","getState","assocPath","status","message","statusText","configureStore","Index","ReactDOM","render"],"mappings":"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pBwO,GAAWqB,aACTrB,GAAWsB,eAAexV,QACxB,SAAA0N,GAAK,OACFA,EAAMK,QAAWL,EAAMK,OAAOpI,MAAQD,EAAOC,KAAO+H,EAAMK,OAAOnI,MAAQF,EAAOE,YAK7F6P,oBAAoB,IAEtBA,oBAAoB,EACpBC,eAAgB,CACdC,cAAc,GAEhBC,UAAU,I,SC1DNC,GAAK,CACT,IACA,MACA,IACA,IACA,MACA,IACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEIC,GAAK,CACT,IACA,GACA,GACA,GACA,GACA,GACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,IACA,KAGWC,GAAgB,SAACpN,GAAD,OAC3BA,EAAKtG,QAAQ,oBAAqB,KAAKA,QAAQ,UAAW,MAE/C2T,GAAU,SAACC,GACtB,IAAMC,EAAMC,SAAS7T,OAAO2T,GAAO,IAC7BzV,EAAM2B,KAAKC,MAA6B,IAAtBkK,OAAO2J,GAAQC,IACjCE,EAAO5V,EAAM,GAAK,IAAMA,EAAMA,EACpC,MAAM,GAAN,OAAU0V,EAAV,YAAiBE,IAGNC,GAAa,eAACC,EAAD,u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","file":"static/js/main.3ec2323c.chunk.js","sourcesContent":["\nexport const MODES = {\n POLY: 'POLY',\n STICKERS: 'STICKERS',\n STICKERS_SELECT: 'STICKERS_SELECT',\n ROUTER: 'ROUTER',\n SHOTTER: 'SHOTTER',\n TRASH: 'TRASH',\n NONE: 'NONE',\n LOGO: 'LOGO',\n SAVE: 'SAVE',\n CONFIRM_CANCEL: 'CONFIRM_CANCEL',\n PROVIDER: 'PROVIDER',\n SHOT_PREFETCH: 'SHOT_PREFETCH',\n GPX: 'GPX',\n};\n","import React, { memo } from 'react';\n\nexport const Icon = memo(({ icon, size = 32 }: { icon: string; size?: number }) => (\n \n \n \n \n \n \n \n \n));\n","const P = 'EDITOR';\n\nexport const GPX_ROUTE_COLORS = [\n '#ff3344',\n '#3344ff',\n '#33ff44',\n '#33ffff',\n];\n\nexport const DRAWING_DIRECTIONS: Record<'FORWARDS' | 'BACKWARDS', 'forward' | 'backward'> = {\n FORWARDS: 'forward',\n BACKWARDS: 'backward',\n};\n\nexport const EDITOR_HISTORY_LENGTH = 100;\n\nexport const EDITOR_ACTIONS = {\n SET_EDITING: `${P}-SET_EDITING`,\n CHANGE_MODE: `${P}-CHANGE_MODE`,\n SET_MODE: `${P}-SET_MODE`,\n SET_DISTANCE: `${P}-SET_DISTANCE`,\n SET_CHANGED: `${P}-SET_CHANGED`,\n SET_SPEED: `${P}-SET_SPEED`,\n SET_ROUTER_POINTS: `${P}-SET_ROUTER_POINTS`,\n SET_ACTIVE_STICKER: `${P}-SET_ACTIVE_STICKER`,\n START_EDITING: `${P}-START_EDITING`,\n STOP_EDITING: `${P}-STOP_EDITING`,\n ROUTER_CANCEL: `${P}-ROUTER_CANCEL`,\n ROUTER_SUBMIT: `${P}-ROUTER_SUBMIT`,\n\n CLEAR_POLY: `${P}-CLEAR_POLY`,\n CLEAR_STICKERS: `${P}-CLEAR_STICKERS`,\n CLEAR_ALL: `${P}-CLEAR_ALL`,\n CLEAR_CANCEL: `${P}-CLEAR_CANCEL`,\n\n SEND_SAVE_REQUEST: `${P}-SEND_SAVE_REQUEST`,\n SET_SAVE_LOADING: `${P}-SET_SAVE_LOADING`,\n RESET_SAVE_DIALOG: `${P}-RESET_SAVE_DIALOG`,\n CANCEL_SAVE: `${P}-CANCEL_SAVE`,\n\n SET_SAVE: `${P}-SET_SAVE`,\n\n SHOW_RENDERER: `${P}-SHOW_RENDERER`,\n HIDE_RENDERER: `${P}-HIDE_RENDERER`,\n SET_RENDERER: `${P}-SET_RENDERER`,\n TAKE_A_SHOT: `${P}-TAKE_A_SHOT`,\n CROP_A_SHOT: `${P}-CROP_A_SHOT`,\n\n SET_DIALOG: `${P}-SET_DIALOG`,\n SET_DIALOG_ACTIVE: `${P}-SET_DIALOG_ACTIVE`,\n LOCATION_CHANGED: `${P}-LOCATION_CHANGED`,\n SET_READY: `${P}-SET_READY`,\n\n SET_MARKERS_SHOWN: `${P}-SET_MARKERS_SHOWN`,\n GET_GPX_TRACK: `${P}-GET_GPX_TRACK`,\n SET_IS_EMPTY: `${P}-SET_IS_EMPTY`,\n SET_FEATURE: `${P}-SET_FEATURE`,\n SET_IS_ROUTING: `${P}-SET_IS_ROUTING`,\n KEY_PRESSED: `${P}-KEY_PRESSED`,\n\n SET_ROUTER: `${P}-SET_ROUTER`,\n SET_NOMINATIM: `${P}-SET_NOMINATIM`,\n SEARCH_NOMINATIM: `${P}-SEARCH_NOMINATIM`,\n\n SET_HISTORY: `${P}-SET_HISTORY`,\n UNDO: `${P}-UNDO`,\n REDO: `${P}-REDO`,\n CAPTURE_HIPSTORY: `${P}-CAPTURE_HIPSTORY`,\n\n SET_DIRECTION: `${P}-SET_DIRECTION`,\n SET_GPX: `${P}-SET_GPX`,\n UPLOAD_GPX: `${P}-UPLOAD_GPX`,\n DROP_GPX: `${P}-DROP_GPX`,\n};\n","import { EDITOR_ACTIONS } from './constants';\nimport { IEditorState } from '.';\nimport { IRoute } from '../map/types';\nimport { KeyboardEvent } from 'react';\n\nexport const editorSetEditing = (editing: IEditorState['editing']) => ({\n type: EDITOR_ACTIONS.SET_EDITING,\n editing,\n});\n\nexport const editorChangeMode = (mode: IEditorState['mode']) => ({\n type: EDITOR_ACTIONS.CHANGE_MODE,\n mode,\n});\n\nexport const editorSetMode = (mode: IEditorState['mode']) => ({\n type: EDITOR_ACTIONS.SET_MODE,\n mode,\n});\n\nexport const editorSetDistance = (distance: IEditorState['distance']) => ({\n type: EDITOR_ACTIONS.SET_DISTANCE,\n distance,\n});\nexport const editorSetChanged = (changed: IEditorState['changed']) => ({\n type: EDITOR_ACTIONS.SET_CHANGED,\n changed,\n});\nexport const editorSetSpeed = speed => ({ type: EDITOR_ACTIONS.SET_SPEED, speed });\n\nexport const editorStartEditing = () => ({ type: EDITOR_ACTIONS.START_EDITING });\nexport const editorStopEditing = () => ({ type: EDITOR_ACTIONS.STOP_EDITING });\n\nexport const editorRouterCancel = () => ({ type: EDITOR_ACTIONS.ROUTER_CANCEL });\nexport const editorRouterSubmit = () => ({ type: EDITOR_ACTIONS.ROUTER_SUBMIT });\n\nexport const editorClearPoly = () => ({ type: EDITOR_ACTIONS.CLEAR_POLY });\nexport const editorClearStickers = () => ({ type: EDITOR_ACTIONS.CLEAR_STICKERS });\nexport const editorClearAll = () => ({ type: EDITOR_ACTIONS.CLEAR_ALL });\nexport const editorClearCancel = () => ({ type: EDITOR_ACTIONS.CLEAR_CANCEL });\n\nexport const editorSendSaveRequest = (payload: {\n title: IRoute['title'];\n address: IRoute['address'];\n is_public: IRoute['is_public'];\n description: IRoute['description'];\n force: boolean;\n}) => ({\n type: EDITOR_ACTIONS.SEND_SAVE_REQUEST,\n ...payload,\n});\n\nexport const editorResetSaveDialog = () => ({ type: EDITOR_ACTIONS.RESET_SAVE_DIALOG });\n\nexport const editorSetSave = (save: Partial) => ({\n type: EDITOR_ACTIONS.SET_SAVE,\n save,\n});\n\nexport const editorCancelSave = () => ({\n type: EDITOR_ACTIONS.CANCEL_SAVE,\n});\n\nexport const editorHideRenderer = () => ({ type: EDITOR_ACTIONS.HIDE_RENDERER });\nexport const editorSetRenderer = payload => ({ type: EDITOR_ACTIONS.SET_RENDERER, payload });\nexport const editorTakeAShot = () => ({ type: EDITOR_ACTIONS.TAKE_A_SHOT });\nexport const editorCropAShot = payload => ({ type: EDITOR_ACTIONS.CROP_A_SHOT, ...payload });\nexport const editorSetDialog = dialog => ({ type: EDITOR_ACTIONS.SET_DIALOG, dialog });\nexport const editorSetDialogActive = dialog_active => ({\n type: EDITOR_ACTIONS.SET_DIALOG_ACTIVE,\n dialog_active,\n});\nexport const editorSetReady = ready => ({ type: EDITOR_ACTIONS.SET_READY, ready });\n\nexport const editorGetGPXTrack = () => ({ type: EDITOR_ACTIONS.GET_GPX_TRACK });\nexport const editorSetMarkersShown = markers_shown => ({\n type: EDITOR_ACTIONS.SET_MARKERS_SHOWN,\n markers_shown,\n});\nexport const editorSetIsEmpty = is_empty => ({ type: EDITOR_ACTIONS.SET_IS_EMPTY, is_empty });\nexport const editorSetFeature = (features: { [x: string]: boolean }) => ({\n type: EDITOR_ACTIONS.SET_FEATURE,\n features,\n});\n\nexport const editorSetIsRouting = (is_routing: boolean) => ({\n type: EDITOR_ACTIONS.SET_IS_ROUTING,\n is_routing,\n});\n\nexport const editorSetRouterPoints = (routerPoints: IEditorState['routerPoints']) => ({\n type: EDITOR_ACTIONS.SET_ROUTER_POINTS,\n routerPoints,\n});\n\nexport const editorSetActiveSticker = (activeSticker: IEditorState['activeSticker']) => ({\n type: EDITOR_ACTIONS.SET_ACTIVE_STICKER,\n activeSticker,\n});\n\nexport const editorLocationChanged = location => ({\n type: EDITOR_ACTIONS.LOCATION_CHANGED,\n location,\n});\n\nexport const editorKeyPressed = ({\n key,\n target: { tagName },\n}: {\n key: string;\n target: { tagName: string };\n}) => ({\n type: EDITOR_ACTIONS.KEY_PRESSED,\n key,\n target: tagName,\n});\n\nexport const editorSetRouter = (router: Partial) => ({\n type: EDITOR_ACTIONS.SET_ROUTER,\n router,\n});\n\nexport const editorSetNominatim = (nominatim: Partial) => ({\n type: EDITOR_ACTIONS.SET_NOMINATIM,\n nominatim,\n});\n\nexport const editorSearchNominatim = (search: IEditorState['nominatim']['search']) => ({\n type: EDITOR_ACTIONS.SEARCH_NOMINATIM,\n search,\n});\n\nexport const editorSetHistory = (history: Partial) => ({\n type: EDITOR_ACTIONS.SET_HISTORY,\n history,\n});\n\nexport const editorUndo = () => ({\n type: EDITOR_ACTIONS.UNDO,\n});\n\nexport const editorRedo = () => ({\n type: EDITOR_ACTIONS.REDO,\n});\n\nexport const editorCaptureHistory = () => ({\n type: EDITOR_ACTIONS.CAPTURE_HIPSTORY,\n});\n\nexport const editorSetDirection = (drawing_direction: IEditorState['drawing_direction']) => ({\n type: EDITOR_ACTIONS.SET_DIRECTION,\n drawing_direction,\n});\n\nexport const editorSetGpx = (gpx: Partial) => ({\n type: EDITOR_ACTIONS.SET_GPX,\n gpx,\n});\n\nexport const editorUploadGpx = (file: File) => ({\n type: EDITOR_ACTIONS.UPLOAD_GPX,\n file,\n});\n\nexport const editorDropGpx = (index: number) => ({\n type: EDITOR_ACTIONS.DROP_GPX,\n index,\n});\n","import { IState } from '../store';\n\nexport const selectEditor = (state: IState) => state.editor;\nexport const selectEditorSave = (state: IState) => state.editor.save;\nexport const selectEditorEditing = (state: IState) => state.editor.editing;\nexport const selectEditorMode = (state: IState) => state.editor.mode;\nexport const selectEditorActiveSticker = (state: IState) => state.editor.activeSticker;\nexport const selectEditorRenderer = (state: IState) => state.editor.renderer;\nexport const selectEditorRouter = (state: IState) => state.editor.router;\nexport const selectEditorDistance = (state: IState) => state.editor.distance;\nexport const selectEditorNominatim = (state: IState) => state.editor.nominatim;\nexport const selectEditorDirection = (state: IState) => state.editor.drawing_direction;\nexport const selectEditorGpx = (state: IState) => state.editor.gpx;\n","import React, { FC } from 'react';\nimport { Icon } from '~/components/panels/Icon';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport classnames from 'classnames';\nimport { connect } from 'react-redux';\nimport { selectEditor, selectEditorRouter, selectEditorDirection } from '~/redux/editor/selectors';\nimport pick from 'ramda/es/pick';\nimport { IState } from '~/redux/store';\n\nconst noPoints = ({\n editorRouterCancel,\n}: {\n editorRouterCancel: typeof EDITOR_ACTIONS.editorRouterCancel;\n}) => (\n \n
\n
\n \n
Укажите первую точку на карте
\n
\n
\n \n
\n
\n\n
\n
\n Отмена\n
\n
\n
\n \n);\n\nconst firstPoint = ({\n editorRouterCancel,\n}: {\n editorRouterCancel: typeof EDITOR_ACTIONS.editorRouterCancel;\n}) => (\n \n
\n
\n \n
УКАЖИТЕ СЛЕДУЮЩУЮ ТОЧКУ
\n
\n
\n
\n
\n\n
\n
\n Отмена\n
\n
\n
\n \n);\n\nconst draggablePoints = ({\n editorRouterCancel,\n editorRouterSubmit,\n}: {\n editorRouterCancel: typeof EDITOR_ACTIONS.editorRouterCancel;\n editorRouterSubmit: typeof EDITOR_ACTIONS.editorRouterSubmit;\n}) => (\n \n
\n
\n \n
Продолжайте маршрут
\n
\n
\n
\n
\n\n
\n
\n Отмена\n
\n
\n Применить\n
\n
\n
\n \n);\n\nconst mapStateToProps = (state: IState) => ({\n router: selectEditorRouter(state),\n});\n\nconst mapDispatchToProps = {\n editorRouterCancel: EDITOR_ACTIONS.editorRouterCancel,\n editorRouterSubmit: EDITOR_ACTIONS.editorRouterSubmit,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst RouterDialogUnconnected: FC = ({\n router: { waypoints },\n editorRouterCancel,\n editorRouterSubmit,\n}) => (\n
\n
\n\n {!waypoints.length && noPoints({ editorRouterCancel })}\n {waypoints.length === 1 && firstPoint({ editorRouterCancel })}\n {waypoints.length >= 2 && draggablePoints({ editorRouterCancel, editorRouterSubmit })}\n
\n);\n\nconst RouterDialog = connect(mapStateToProps, mapDispatchToProps)(RouterDialogUnconnected);\n\nexport { RouterDialog };\n","const P = 'MAP'\n\nexport const MAP_ACTIONS = {\n SET_MAP: `${P}-SET_MAP`,\n SET_PROVIDER: `${P}-SET_PROVIDER`,\n SET_ROUTE: `${P}-SET_ROUTE`,\n SET_TITLE: `${P}-SET_TILE`,\n SET_DESCRIPTION: `${P}-SETDESCRIPTION`,\n SET_ADDRESS: `${P}-SET_ADDRESS`,\n SET_ADDRESS_ORIGIN: `${P}-SET_ADDRESS_ORIGIN`,\n SET_OWNER: `${P}-SET_OWNER`,\n SET_PUBLIC: `${P}-SET_PUBLIC`,\n SET_LOGO: `${P}-SET_LOGO`,\n\n ADD_STICKER: `${P}-ADD_STICKER`,\n SET_STICKER: `${P}-SET_STICKER`,\n SET_STICKERS: `${P}-SET_STICKERS`,\n DROP_STICKER: `${P}-DROP_STICKER`,\n\n MAP_CLICKED: `${P}-MAP_CLICKED`,\n ZOOM_CHANGE: `${P}-ZOOM_CHANGE`\n}","import { MAP_ACTIONS } from './constants';\nimport { IMapReducer } from './';\nimport { IStickerDump } from '~/redux/map/types';\nimport { LatLng } from 'leaflet';\n// import { ILatLng } from './types';\n\nexport const mapSet = (map: Partial) => ({\n type: MAP_ACTIONS.SET_MAP,\n map,\n});\n\nexport const mapSetProvider = (provider: IMapReducer['provider']) => ({\n type: MAP_ACTIONS.SET_PROVIDER,\n provider,\n});\n\nexport const mapSetRoute = (route: IMapReducer['route']) => ({\n type: MAP_ACTIONS.SET_ROUTE,\n route,\n});\n\nexport const mapSetStickers = (stickers: IStickerDump[]) => ({\n type: MAP_ACTIONS.SET_STICKERS,\n stickers,\n});\n\nexport const mapSetSticker = (index: number, sticker: IStickerDump) => ({\n type: MAP_ACTIONS.SET_STICKER,\n index,\n sticker,\n});\n\nexport const mapAddSticker = (sticker: IStickerDump) => ({\n type: MAP_ACTIONS.ADD_STICKER,\n sticker,\n});\n\nexport const mapDropSticker = (index: number) => ({\n type: MAP_ACTIONS.DROP_STICKER,\n index,\n});\n\nexport const mapClicked = (latlng: LatLng) => ({\n type: MAP_ACTIONS.MAP_CLICKED,\n latlng,\n});\n\nexport const mapSetTitle = (title: string) => ({\n type: MAP_ACTIONS.SET_TITLE,\n title,\n});\n\nexport const mapSetDescription = (description: string) => ({\n type: MAP_ACTIONS.SET_DESCRIPTION,\n description,\n});\n\nexport const mapSetAddress = (address: string) => ({\n type: MAP_ACTIONS.SET_ADDRESS,\n address,\n});\n\nexport const mapSetOwner = (owner: IMapReducer['owner']) => ({\n type: MAP_ACTIONS.SET_DESCRIPTION,\n owner,\n});\n\nexport const mapSetPublic = (is_public: IMapReducer['is_public']) => ({\n type: MAP_ACTIONS.SET_PUBLIC,\n is_public,\n});\n\nexport const mapSetLogo = (logo: IMapReducer['logo']) => ({\n type: MAP_ACTIONS.SET_LOGO,\n logo,\n});\n\nexport const mapSetAddressOrigin = (address_origin: IMapReducer['address_origin']) => ({\n type: MAP_ACTIONS.SET_ADDRESS_ORIGIN,\n address_origin,\n});\n\nexport const mapZoomChange = (zoom: number) => ({\n type: MAP_ACTIONS.ZOOM_CHANGE,\n zoom,\n});\n","import { IState } from \"~/redux/store\";\n\nexport const selectMap = (state: IState) => state.map;\nexport const selectMapProvider = (state: IState) => state.map.provider;\nexport const selectMapLogo = (state: IState) => state.map.logo;\nexport const selectMapRoute= (state: IState) => state.map.route;\nexport const selectMapStickers = (state: IState) => state.map.stickers;\nexport const selectMapTitle= (state: IState) => state.map.title;\nexport const selectMapAddress = (state: IState) => state.map.address;\nexport const selectMapZoom = (state: IState) => state.map.zoom;","import React, { FC, useCallback } from 'react';\nimport { Icon } from '~/components/panels/Icon';\nimport { connect } from 'react-redux';\nimport * as MAP_ACTIONS from '~/redux/map/actions';\nimport { IState } from '~/redux/store';\nimport { selectMapRoute } from '~/redux/map/selectors';\nimport classNames from 'classnames';\nimport { selectEditorDirection } from '~/redux/editor/selectors';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { DRAWING_DIRECTIONS } from '~/redux/editor/constants';\n\nconst mapStateToProps = (state: IState) => ({\n route: selectMapRoute(state),\n direction: selectEditorDirection(state),\n});\n\nconst mapDispatchToProps = {\n mapSetRoute: MAP_ACTIONS.mapSetRoute,\n editorSetDirection: EDITOR_ACTIONS.editorSetDirection,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst PolylineDialogUnconnected: FC = ({\n route,\n direction,\n editorSetDirection,\n mapSetRoute,\n}) => {\n const reverseRoute = useCallback(() => {\n if (route.length < 2) return;\n mapSetRoute([...route].reverse());\n }, [mapSetRoute, route]);\n\n const curRouteStart = useCallback(() => {\n if (route.length < 1) return;\n\n mapSetRoute(route.slice(1, route.length));\n }, [mapSetRoute, route]);\n\n const curRouteEnd = useCallback(() => {\n if (route.length < 1) return;\n\n mapSetRoute(route.slice(0, route.length - 1));\n }, [mapSetRoute, route]);\n\n const continueBackward = useCallback(() => {\n editorSetDirection(DRAWING_DIRECTIONS.BACKWARDS);\n }, [editorSetDirection]);\n\n const continueForward = useCallback(() => {\n editorSetDirection(DRAWING_DIRECTIONS.FORWARDS);\n }, [editorSetDirection]);\n\n return (\n
\n
\n
\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n
\n\n
Ручной режим
\n
\n
\n
\n );\n};\n\nconst PolylineDialog = connect(mapStateToProps, mapDispatchToProps)(PolylineDialogUnconnected);\n\nexport { PolylineDialog };\n","// Стикеры\n// import L from \"leaflet\";\nexport interface IStickerItem {\n off: number,\n title: string,\n title_long: string,\n}\n\nexport interface IStickerPack {\n title: string,\n url: string,\n size: number,\n layers: {\n [x: string]: IStickerItem,\n }\n}\n\nexport interface ISticker {\n angle: number;\n set: string;\n sticker: string;\n text: string;\n latlngs: {\n lat: number;\n lng: number;\n }\n}\n\nexport interface IStickers {\n base: IStickerPack,\n real: IStickerPack,\n pin: IStickerPack,\n points: IStickerPack,\n}\n\n// export const stickers = ['green', 'basic', 'green-small'];\nexport const STICKERS: IStickers = {\n base: {\n title: 'Простые',\n url: '/images/stickers-base.svg',\n size: 72,\n layers: {\n men: { off: 5, title: 'Александр 3', title_long: 'Парк Городское Начало' },\n square: { off: 9, title: 'пл.Калинина', title_long: 'пл.Калинина' },\n bridge: { off: 4, title: 'Мост', title_long: 'Мост' },\n ikea: { off: 7, title: 'Икея', title_long: 'Парковка ТЦ Мега' },\n bugr: { off: 8, title: 'Бугринка', title_long: 'Та самая коса\\n(культовое место Усталых Педалек)' },\n monum: { off: 10, title: 'ГПНТБ', title_long: 'ГПНТБ' },\n opera: { off: 11, title: 'Оперный', title_long: 'Оперный театр' },\n forest: { off: 1, title: 'Лес', title_long: 'Берёзовая роща' },\n road: { off: 2, title: 'Трасса', title_long: 'Дорога' },\n chicken: { off: 3, title: 'Курочка', title_long: 'Курочка' },\n camp: { off: 6, title: 'Палатка', title_long: 'Палаточный лагерь' },\n rocks: { off: 14, title: 'Камни', title_long: 'Кааааммммуушшшки' },\n crap: { off: 15, title: 'Щет', title_long: 'Полный щет' },\n pancake: { off: 13, title: 'Блинцы', title_long: 'Блинчики' },\n fastfood: { off: 16, title: 'Фастфуд', title_long: 'Быстрая еда' },\n beer: { off: 12, title: 'Пивко', title_long: 'Пивко' },\n mountains: { off: 17, title: 'Горы', title_long: 'Высокие горы' },\n waterfall: { off: 18, title: 'Водопад', title_long: 'Водопад' },\n fields: { off: 19, title: 'Поля', title_long: 'Зеленые поля' },\n beach: { off: 38, title: 'Пляж', title_long: 'Жаркий пляж' },\n village: { off: 39, title: 'Деревня', title_long: 'Деревня' },\n scrulpture: { off: 46, title: 'Памятник', title_long: 'Памятник' },\n night: { off: 48, title: 'Ночь', title_long: 'Ночь' },\n tick: { off: 49, title: 'Клещ!', title_long: 'Клещ!' },\n empty: { off: 20, title: 'Пусто', title_long: 'Пусто' },\n }\n },\n real: {\n title: 'Реалистичные',\n url: '/images/stickers-base.svg',\n size: 72,\n layers: {\n chicken: { off: 31, title: 'Курочка', title_long: 'Курочка' },\n rocks: { off: 32, title: 'Камни', title_long: 'Кааааммммуушшшки' },\n shawarma: { off: 33, title: 'Шаварма', title_long: 'Вкусная шаурма' },\n dump: { off: 34, title: 'Какашка', title_long: 'Нехорошее место' },\n fastfood: { off: 35, title: 'Фастфуд', title_long: 'Быстрая еда' },\n swamp: { off: 36, title: 'Болото', title_long: 'Пошла ты,\\nтрясина грёбаная!' },\n beer: { off: 37, title: 'Пивко', title_long: 'В Питере - пить!' },\n coffee: { off: 47, title: 'Кофеёк', title_long: 'КОФЕЕЕЕ' },\n },\n },\n pin: {\n title: 'ПИН-микс',\n url: '/images/stickers-base.svg',\n size: 72,\n layers: {\n start: { off: 21, title: '1', title_long: 'Первая точка' },\n p1: { off: 22, title: '1', title_long: 'Первая точка' },\n p2: { off: 23, title: '2', title_long: 'Вторая точка' },\n p3: { off: 24, title: '3', title_long: 'Третья точка' },\n p4: { off: 25, title: '4', title_long: 'Четвёртая точка' },\n p5: { off: 26, title: '5', title_long: 'Пятая точка' },\n p6: { off: 27, title: '7', title_long: 'Шестая точка' },\n finish: { off: 28, title: 'Финиш', title_long: 'Финиш здесь' },\n danger: { off: 29, title: 'Осторожно!', title_long: 'Осторожно!' },\n question: { off: 30, title: 'Вопрос', title_long: 'Что тут?' },\n }\n },\n points: {\n title: 'Точки',\n url: '/images/stickers-base.svg',\n size: 72,\n layers: {\n pt1: { off: 40, title: '1', title_long: 'Первая точка' },\n pt2: { off: 41, title: '2', title_long: 'Вторая точка' },\n pt3: { off: 42, title: '3', title_long: 'Третья точка' },\n pt4: { off: 43, title: '4', title_long: 'Четвёртая точка' },\n pt5: { off: 44, title: '5', title_long: 'Пятая точка' },\n pt6: { off: 45, title: '6', title_long: 'Шестая точка' },\n }\n }\n};\n","import React from 'react';\n\nimport { STICKERS } from '~/constants/stickers';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { connect } from 'react-redux';\n\nconst mapStateToProps = () => ({});\nconst mapDispatchToProps = {\n editorSetActiveSticker: EDITOR_ACTIONS.editorSetActiveSticker,\n};\n\ntype Props = ReturnType &\n typeof mapDispatchToProps & {\n width: number;\n };\n\nconst StickersDialogUnconnected = ({ editorSetActiveSticker, width }: Props) => (\n
\n
\n {Object.keys(STICKERS).map(set => (\n
\n
{STICKERS[set].title || null}
\n
\n {Object.keys(STICKERS[set].layers).map(sticker => (\n editorSetActiveSticker({ set, sticker })}\n />\n ))}\n
\n
\n ))}\n
\n
\n);\n\nconst StickersDialog = connect(mapStateToProps, mapDispatchToProps)(StickersDialogUnconnected);\n\nexport { StickersDialog };","import React, { FC } from 'react';\nimport { connect } from 'react-redux';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\n\nconst mapStateToProps = () => ({});\nconst mapDispatchToProps = {\n editorClearPoly: EDITOR_ACTIONS.editorClearPoly,\n editorClearStickers: EDITOR_ACTIONS.editorClearStickers,\n editorClearAll: EDITOR_ACTIONS.editorClearAll,\n editorClearCancel: EDITOR_ACTIONS.editorClearCancel,\n};\n\ntype Props = ReturnType &\n typeof mapDispatchToProps & {\n width: number;\n };\n\nconst TrashDialogUnconnected: FC = ({\n editorClearPoly,\n editorClearStickers,\n editorClearAll,\n editorClearCancel,\n width,\n}) => (\n
\n
\n
\n
Все изменения будут удалены!
\n
\n
\n
\n
\n
\n
\n Маршрут\n
\n \n
\n Стикеры\n
\n\n
\n ВСЕ\n
\n
\n\n
\n\n
\n Отмена\n
\n
\n
\n
\n);\n\nconst TrashDialog = connect(mapStateToProps, mapDispatchToProps)(TrashDialogUnconnected);\n\nexport { TrashDialog };\n","export interface ILogos {\n [x: string]: [string, string, string],\n}\n\nexport const LOGOS = {\n default: ['Без лого', null, 'bottom-right'],\n nvs: ['НВС', '/images/logos/lgo.png', 'bottom-right'],\n pinmix: ['Пин-Микс', '/images/logos/pin-mix.png', 'top-right'],\n jolly: ['Пин-Микс + JW', '/images/logos/jw.png', 'top-right'],\n pedals: ['Усталые Педальки', '/images/logos/pedals.png', 'bottom-right'],\n rider: ['Райдер', '/images/logos/rider.png', 'bottom-right'],\n rider_evening: ['Вечерние городские', '/images/logos/rider_evening.png', 'top-right'],\n prokatimsya: ['PRO_КАТИМСЯ?!', '/images/logos/prokatimsya.png', 'top-right'],\n};\n\nexport const DEFAULT_LOGO = 'nvs';\n","import React from 'react';\nimport { LOGOS } from '~/constants/logos';\nimport { Icon } from '~/components/panels/Icon';\nimport classnames from 'classnames';\nimport * as MAP_ACTIONS from \"~/redux/map/actions\"\nimport { selectMapLogo } from '~/redux/map/selectors';\nimport { connect } from 'react-redux';\n\nconst mapStateToProps = state => ({\n logo: selectMapLogo(state),\n});\n\nconst mapDispatchToProps = {\n mapSetLogo: MAP_ACTIONS.mapSetLogo,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst LogoDialogUnconnected = ({ logo, mapSetLogo }: Props) => (\n
\n
\n
\n \n
\n {\n Object.keys(LOGOS).map(item => (\n mapSetLogo(item)}\n key={item}\n >\n {LOGOS[item][0]}\n
\n ))\n }\n
\n
\n);\n\nconst LogoDialog = connect(mapStateToProps, mapDispatchToProps)(LogoDialogUnconnected);\n\nexport { LogoDialog };","export const createReducer = (\n initialState,\n handlers,\n) => (state = initialState, action) => (handlers.hasOwnProperty(action.type)\n ? handlers[action.type](state, action)\n : state);\n","export interface IRoles {\n guest: string;\n vk: string;\n admin: string;\n}\n\nexport interface IUser {\n new_messages: number;\n place_types: {};\n random_url: string;\n role: IRoles[keyof IRoles];\n routes: {};\n success: boolean;\n id: string;\n uid: string;\n token?: string;\n photo: string;\n name: string;\n}\n\nexport const ROLES: IRoles = {\n guest: \"guest\",\n vk: \"vk\",\n admin: \"admin\"\n};\n\nexport const DEFAULT_USER: IUser = {\n new_messages: 0,\n place_types: {},\n random_url: \"\",\n role: ROLES.guest,\n routes: {},\n success: false,\n id: '',\n token: undefined,\n photo: '',\n name: '',\n uid: '',\n};\n","export const DIALOGS = ({\n NONE: 'NONE',\n MAP_LIST: 'MAP_LIST',\n APP_INFO: 'APP_INFO',\n NOMINATIM: 'NOMINATIM',\n});\n\nexport const TABS = {\n MY: 'my',\n PENDING: 'pending',\n STARRED: 'starred',\n}\n\nexport const TABS_TITLES = ({\n [TABS.MY]: 'Мои',\n [TABS.PENDING]: 'Заявки',\n [TABS.STARRED]: 'Каталог',\n});\n","export const USER_ACTIONS = {\n SET_USER: 'SET_USER',\n USER_LOGOUT: 'USER_LOGOUT',\n USER_LOGIN: 'USER_LOGIN',\n GOT_VK_USER: 'GOT_VK_USER',\n\n IFRAME_LOGIN_VK: 'IFRAME_LOGIN_VK',\n SET_USER_LOCATION: 'SET_USER_LOCATION',\n \n SEARCH_SET_TITLE: 'SEARCH_SET_TITLE',\n SEARCH_SET_DISTANCE: 'SEARCH_SET_DISTANCE',\n SEARCH_CHANGE_DISTANCE: 'SEARCH_CHANGE_DISTANCE',\n\n SEARCH_SET_TAB: 'SEARCH_SET_TAB',\n SEARCH_PUT_ROUTES: 'SEARCH_PUT_ROUTES',\n SEARCH_SET_LOADING: 'SEARCH_SET_LOADING',\n\n OPEN_MAP_DIALOG: 'OPEN_MAP_DIALOG',\n MAPS_LOAD_MORE: 'MAPS_LOAD_MORE',\n MAPS_SET_SHIFT: 'MAPS_SET_SHIFT',\n\n DROP_ROUTE: 'DROP_ROUTE',\n SET_STARRED: 'SET_STARRED',\n MODIFY_ROUTE: 'MODIFY_ROUTE',\n\n SET_ROUTE_STARRED: 'SET_ROUTE_STARRED',\n TOGGLE_ROUTE_STARRED: 'TOGGLE_ROUTE_STARRED',\n};\n","import { IRootState, IRootReducer } from '.';\nimport * as ActionCreators from './actions';\nimport { TABS } from '~/constants/dialogs';\nimport { USER_ACTIONS } from './constants';\n\ntype UnsafeReturnType = T extends (...args: any[]) => infer R ? R : any;\n\nexport interface ActionHandler {\n (state: IRootState, payload: UnsafeReturnType): IRootState;\n}\n\nconst setUser: ActionHandler = (state, { user }) => ({\n ...state,\n user: {\n ...state.user,\n ...user,\n },\n});\n\nconst searchSetTitle: ActionHandler = (\n state,\n { title = '' }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n filter: {\n ...state.routes.filter,\n title,\n distance: [0, 10000],\n },\n },\n});\n\nconst searchSetDistance: ActionHandler = (\n state,\n { distance = [0, 9999] }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n filter: {\n ...state.routes.filter,\n distance,\n },\n },\n});\n\nconst searchSetTab: ActionHandler = (\n state,\n { tab = TABS[Object.keys(TABS)[0]] }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n filter: {\n ...state.routes.filter,\n tab: Object.values(TABS).indexOf(tab) >= 0 ? tab : TABS[Object.values(TABS)[0]],\n },\n },\n});\n\nconst searchPutRoutes: ActionHandler = (\n state,\n { list = [], min, max, limit, step, shift }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n list,\n limit,\n step,\n shift,\n filter: {\n ...state.routes.filter,\n distance:\n state.routes.filter.min === state.routes.filter.max\n ? [min, max]\n : state.routes.filter.distance,\n min,\n max,\n },\n },\n});\n\nconst searchSetLoading: ActionHandler = (\n state,\n { loading = false }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n loading,\n },\n});\n\nconst setStarred: ActionHandler = (\n state,\n { is_published = false }\n) => ({ ...state, is_published });\n\nconst mapsSetShift: ActionHandler = (state, { shift = 0 }) => ({\n ...state,\n routes: {\n ...state.routes,\n shift,\n },\n});\n\nconst setRouteStarred: ActionHandler = (\n state,\n { address, is_published }\n) => ({\n ...state,\n routes: {\n ...state.routes,\n list: state.routes.list\n .map(el => (el.address === address ? { ...el, is_published } : el))\n .filter(\n el =>\n (state.routes.filter.tab === TABS.STARRED && el.is_published) ||\n (state.routes.filter.tab === TABS.PENDING && !el.is_published)\n ),\n },\n});\n\nconst setLocation = (\n state: IRootReducer,\n { location }: ReturnType\n): IRootReducer => ({\n ...state,\n location,\n});\n\nexport const USER_HANDLERS = {\n [USER_ACTIONS.SET_USER]: setUser,\n [USER_ACTIONS.SET_USER_LOCATION]: setLocation,\n\n [USER_ACTIONS.SEARCH_SET_TITLE]: searchSetTitle,\n [USER_ACTIONS.SEARCH_SET_DISTANCE]: searchSetDistance,\n [USER_ACTIONS.SEARCH_CHANGE_DISTANCE]: searchSetDistance,\n [USER_ACTIONS.SEARCH_SET_TAB]: searchSetTab,\n [USER_ACTIONS.SEARCH_PUT_ROUTES]: searchPutRoutes,\n [USER_ACTIONS.SEARCH_SET_LOADING]: searchSetLoading,\n\n [USER_ACTIONS.MAPS_SET_SHIFT]: mapsSetShift,\n\n [USER_ACTIONS.SET_STARRED]: setStarred,\n\n [USER_ACTIONS.SET_ROUTE_STARRED]: setRouteStarred,\n};\n","import { createReducer } from '~/utils/reducer';\nimport { DEFAULT_USER, IUser } from '~/constants/auth';\nimport { USER_HANDLERS } from './handlers';\nimport { LatLngLiteral } from 'leaflet';\n\nexport interface IRouteListItem {\n address: string;\n title: string;\n distance: number;\n is_public: boolean;\n is_published: boolean;\n updated_at: string;\n}\n\nexport interface IRootReducer {\n // ready: boolean,\n user: IUser;\n location?: LatLngLiteral;\n routes: {\n limit: 0;\n loading: boolean;\n list: Array;\n step: number;\n shift: number;\n filter: {\n title: string;\n starred: boolean;\n distance: [number, number];\n author: string;\n tab: string;\n min: number;\n max: number;\n };\n };\n}\n\nexport type IRootState = Readonly;\n\nexport const INITIAL_STATE: IRootReducer = {\n user: { ...DEFAULT_USER },\n location: undefined,\n routes: {\n limit: 0,\n loading: false, // <-- maybe delete this\n list: [],\n step: 20,\n shift: 0,\n filter: {\n title: '',\n starred: false,\n distance: [0, 10000],\n author: '',\n tab: '',\n min: 0,\n max: 10000,\n },\n },\n};\n\nexport const userReducer = createReducer(INITIAL_STATE, USER_HANDLERS);\n","export const API = {\n GET_GUEST: `/api/auth/`,\n CHECK_TOKEN: `/api/auth/`,\n IFRAME_LOGIN_VK: `/api/auth/vk`,\n GET_MAP: `/api/route/`,\n POST_MAP: `/api/route/`,\n GET_ROUTE_LIST: tab => `/api/route/list/${tab}`,\n\n DROP_ROUTE: `/api/route/`,\n MODIFY_ROUTE: `/api/route/`,\n SET_STARRED: `/api/route/publish`,\n};\n\nexport const API_RETRY_INTERVAL = 10;\n","export interface IProvider {\n name: string,\n url: string,\n range: Array,\n}\n\nexport type ITileMaps = Record\n\n// Стили карт\nconst TILEMAPS: ITileMaps = {\n DGIS: {\n name: '2gis',\n url: 'https://tile1.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1',\n range: ['a','b','c'],\n },\n DEFAULT: {\n name: 'OpenStreetMap',\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n range: ['a', 'b', 'c'],\n },\n BLANK: {\n name: 'Blanque',\n url: 'https://{s}.carto.tile.vault48.org/light_all/{z}/{x}/{y}.png',\n range: [1, 2, 3, 4],\n },\n HOT: {\n name: 'Hot',\n url: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',\n range: ['a', 'b', 'c'],\n },\n ESAT: {\n name: 'Sattelite',\n url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n range: [1,2,3,4],\n }\n};\n\nconst ENABLED: Array = ['BLANK', 'DEFAULT', 'DGIS', 'HOT', 'ESAT'];\n\nexport const DEFAULT_PROVIDER: keyof ITileMaps = ENABLED[1];\nexport const PROVIDERS: ITileMaps = ENABLED.reduce((obj, provider) => ({\n ...obj,\n [provider]: TILEMAPS[provider],\n}), {});\n\nexport const replaceProviderUrl = (provider, { x, y, zoom }: { x: number, y: number, zoom: number }): string => {\n const { url, range } = (PROVIDERS[provider] || PROVIDERS[DEFAULT_PROVIDER]);\n const random: (number | string) = (range && range.length >= 2)\n ? range[Math.round((Math.random() * (range.length - 1)))]\n : 1;\n\n return url.replace('{x}', String(x)).replace('{y}', String(y)).replace('{z}', String(zoom)).replace('{s}', String(random));\n};\n","import { DEFAULT_PROVIDER, PROVIDERS } from '~/constants/providers';\nimport { LatLngLiteral } from 'leaflet';\n\nconst PUBLIC_PATH = process.env.REACT_APP_PUBLIC_PATH || '';\nconst API_ADDR = process.env.REACT_APP_API_ADDR || '';\nconst OSRM_URL = process.env.REACT_APP_OSRM_URL || '';\nconst OSRM_PROFILE = process.env.REACT_APP_OSRM_PROFILE || 'bike';\nconst OSRM_TEST_URL = ([south_west, north_east]: LatLngLiteral[]) =>\n `${OSRM_URL}/${OSRM_PROFILE}/${Object.values(south_west).join(',')};${Object.values(\n north_east\n ).join(',')}`;\n\nexport const CLIENT = {\n OSRM_URL,\n API_ADDR,\n OSRM_TEST_URL,\n OSRM_PROFILE,\n STROKE_WIDTH: 5,\n PUBLIC_PATH,\n NOMINATIM_TEST_URL: '',\n NOMINATIM_URL: '',\n};\n\nexport const COLORS = {\n PATH_COLOR: ['#ff7700', '#ff3344'],\n};\n\nexport const PROVIDER = PROVIDERS[DEFAULT_PROVIDER];\n\nexport const MOBILE_BREAKPOINT = 768;\n","import axios from 'axios';\nimport { CLIENT } from '~/config/frontend';\n\nexport const api = axios.create({\n baseURL: CLIENT.API_ADDR,\n})\n","import { AxiosError } from 'axios';\nimport { PostMapResponse } from '~/utils/api/types';\n\nexport const postMapInterceptor = (res: AxiosError) => {\n if (res.response?.data.code) {\n return res.response;\n }\n\n if (res.response?.data.error) {\n throw new Error(res.response?.data.error);\n }\n\n throw res;\n};\n","import { API } from '~/constants/api';\nimport { IRootState } from '~/redux/user';\nimport { IUser } from '~/constants/auth';\nimport { CLIENT } from '~/config/frontend';\nimport { LatLngLiteral } from 'leaflet';\nimport { IRoute } from '~/redux/map/types';\nimport { INominatimResult } from '~/redux/types';\nimport { api } from './instance';\nimport { postMapInterceptor } from '~/utils/api/interceptors';\nimport {\n CheckTokenRequest,\n CheckTokenResult,\n GetGuestTokenResult, GetRouteListRequest, GetRouteListResponse, GetStoredMapRequest, GetStoredMapResult,\n PostMapRequest,\n PostMapResponse,\n} from '~/utils/api/types';\n\nexport const checkUserToken = ({\n id,\n token,\n}: CheckTokenRequest) =>\n api\n .get(API.CHECK_TOKEN, {\n params: { id, token },\n });\n\nexport const getGuestToken = () =>\n api\n .get(API.GET_GUEST);\n\nexport const getStoredMap = ({\n name,\n}: GetStoredMapRequest) =>\n api\n .get(API.GET_MAP, {\n params: { name },\n });\n\nexport const postMap = ({\n title,\n address,\n route,\n stickers,\n force,\n logo,\n distance,\n provider,\n is_public,\n description,\n}: PostMapRequest) =>\n api\n .post(\n API.POST_MAP,\n {\n route: {\n title,\n address,\n route,\n stickers,\n logo,\n distance,\n provider,\n is_public,\n description,\n },\n force,\n },\n ).catch(postMapInterceptor);\n\nexport const checkIframeToken = ({\n viewer_id,\n auth_key,\n}: {\n viewer_id: string;\n auth_key: string;\n}) =>\n api\n .get<{\n success: boolean,\n user: IUser,\n }>(API.IFRAME_LOGIN_VK, {\n params: { viewer_id, auth_key },\n })\n .then(result => !!result.data.success && !!result.data.user)\n .catch(() => false);\n\nexport const getRouteList = ({\n search,\n min,\n max,\n tab,\n step,\n shift,\n}: GetRouteListRequest) =>\n api\n .get(\n API.GET_ROUTE_LIST(tab),\n {\n params: {\n search,\n min,\n max,\n step,\n shift,\n },\n },\n );\n\nexport const checkOSRMService = (bounds: LatLngLiteral[]) =>\n !!CLIENT &&\n !!CLIENT.OSRM_URL &&\n api\n .get(CLIENT.OSRM_TEST_URL(bounds))\n .then(() => true)\n .catch(() => false);\n\nexport const checkNominatimService = () =>\n !!CLIENT &&\n !!CLIENT.NOMINATIM_TEST_URL &&\n api\n .get(CLIENT.NOMINATIM_TEST_URL)\n .then(() => true)\n .catch(() => false);\n\nexport const searchNominatim = (query: string) =>\n CLIENT &&\n CLIENT.NOMINATIM_URL &&\n api\n .get(`${CLIENT.NOMINATIM_URL} ${query}`, {\n params: {\n format: 'json',\n country_code: 'ru',\n 'accept-language': 'ru_RU',\n dedupe: 1,\n },\n })\n .then(\n data =>\n data &&\n data.data &&\n data.data.map(\n (item): INominatimResult => ({\n id: item.place_id,\n latlng: {\n lat: item.lat,\n lng: item.lon,\n },\n title: item.display_name,\n }),\n ),\n )\n .catch(() => []);\n\nexport const dropRoute = ({ address }: { address: string }) =>\n api\n .delete(API.DROP_ROUTE, { data: { address } });\n\nexport const modifyRoute = ({\n address,\n title,\n is_public,\n}: {\n address: string;\n title: string;\n is_public: boolean;\n}) =>\n api\n .patch<{\n route: IRoute;\n }>(API.MODIFY_ROUTE, { address, is_public, title });\n\nexport const sendRouteStarred = ({\n address,\n is_published,\n}: {\n address: string;\n is_published: boolean;\n}) =>\n api\n .post<{ route: IRoute }>(API.SET_STARRED, { address, is_published });\n","import { USER_ACTIONS } from '~/redux/user/constants';\nimport { IUser } from \"~/constants/auth\";\nimport { IRootReducer } from '.';\n\nexport const setUser = (user: IUser) => ({ type: USER_ACTIONS.SET_USER, user });\nexport const userLogout = () => ({ type: USER_ACTIONS.USER_LOGOUT });\nexport const userLogin = () => ({ type: USER_ACTIONS.USER_LOGIN });\n\nexport const setStarred = is_published => ({ type: USER_ACTIONS.SET_STARRED, is_published });\nexport const openMapDialog = tab => ({ type: USER_ACTIONS.OPEN_MAP_DIALOG, tab });\nexport const gotVkUser = user => ({ type: USER_ACTIONS.GOT_VK_USER, user });\nexport const searchSetTitle = title => ({ type: USER_ACTIONS.SEARCH_SET_TITLE, title });\nexport const searchSetDistance = distance => ({ type: USER_ACTIONS.SEARCH_SET_DISTANCE, distance });\nexport const searchChangeDistance = distance => ({ type: USER_ACTIONS.SEARCH_CHANGE_DISTANCE, distance });\nexport const searchSetTab = tab => ({ type: USER_ACTIONS.SEARCH_SET_TAB, tab });\nexport const searchSetLoading = loading => ({ type: USER_ACTIONS.SEARCH_SET_LOADING, loading });\n\nexport const searchPutRoutes = payload => ({ type: USER_ACTIONS.SEARCH_PUT_ROUTES, ...payload });\nexport const mapsLoadMore = () => ({ type: USER_ACTIONS.MAPS_LOAD_MORE });\nexport const mapsSetShift = (shift: number) => ({ type: USER_ACTIONS.MAPS_SET_SHIFT, shift });\n\nexport const dropRoute = (address: string) => ({ type: USER_ACTIONS.DROP_ROUTE, address });\nexport const modifyRoute = (address: string, { title, is_public }: { title: string, is_public: boolean }) => ({\n type: USER_ACTIONS.MODIFY_ROUTE, address, title, is_public\n});\nexport const toggleRouteStarred = (address: string) => ({ type: USER_ACTIONS.TOGGLE_ROUTE_STARRED, address });\nexport const setRouteStarred = (address: string, is_published: boolean) => ({ type: USER_ACTIONS.SET_ROUTE_STARRED, address, is_published });\n\nexport const setUserLocation = (location: IRootReducer['location']) => ({ type: USER_ACTIONS.SET_USER_LOCATION, location });\n","import { IState } from '~/redux/store'\n\nexport const selectUser = (state: IState) => state.user;\nexport const selectUserUser = (state: IState) => state.user.user;\nexport const selectUserLocation = (state: IState) => state.user.location;","export const TIPS: { [x: string]: string } = {\n SAVE_INFO: 'Никто, кроме вас не сможет изменить маршрут - только создать его копию и сохранить по другому адресу',\n SAVE_TIMED_OUT: 'Сервер не ответил на запрос, попробуйте еще раз',\n SAVE_EMPTY: 'Этот маршрут пуст, нарисуйте что-нибудь для начала',\n SAVE_SUCCESS: 'Отлично! Ваш маршрут сохранён. Поделитесь ссылкой с друзьями, приятной покатушки!',\n SAVE_OVERWRITE: 'У вас уже есть маршрут с таким именем. Можно перезаписать его или переименовать?',\n SAVE_EXISTS: 'Маршрут с таким адресом уже есть. Придумайте что-нибудь другое.'\n};\n","import { Map, FeatureGroup, FitBoundsOptions } from 'leaflet';\n\nexport class MapContainer extends Map {\n constructor(props) {\n super(props);\n this.routeLayer.addTo(this);\n this.stickerLayer.addTo(this);\n }\n\n disableClicks = () => {\n this.clickable = false;\n };\n\n enableClicks = () => {\n this.clickable = true;\n };\n\n getVisibleBounds = () => {\n const layers = [this.routeLayer, this.stickerLayer];\n for (let i = 0; i < layers.length; i += 1) {\n const bounds = layers[i].getBounds();\n if (Object.keys(bounds).length == 2) return bounds;\n }\n return null;\n };\n\n fitVisibleBounds = (options: FitBoundsOptions) => {\n const bounds = this.getVisibleBounds();\n \n if (!bounds) return;\n this.fitBounds(bounds, options)\n }\n\n public clickable = true;\n\n public routeLayer = new FeatureGroup();\n public stickerLayer = new FeatureGroup();\n}\n\nexport const MainMap = new MapContainer(document.getElementById('canvas')).setView(\n [55.0153275, 82.9071235],\n 13\n);\n","import { LatLng, LineUtil } from 'leaflet';\nimport { MainMap } from '~/constants/map';\n\nexport const simplify = (latlngs: LatLng[]): LatLng[] => {\n const zoom = 12;\n const mul = 0.7; // 0 - not simplifying, 1 - very rude.\n const points = latlngs.map(({ lat, lng }) => MainMap.project({ lat, lng }, zoom));\n return LineUtil.simplify(points, mul).map(item => MainMap.unproject(item, zoom));\n};\n","import saveAs from 'file-saver';\nimport GPX from 'gpx-parser-builder';\nimport { LatLng } from 'leaflet';\n\ntype GpxImportTrkPt = {\n $: { lat: string; lon: string }[];\n name: string;\n};\n\ntype GpxImportTrkSeg = {\n trkpt: { trkpt: GpxImportTrkPt }[];\n};\n\ntype GpxImportRaw = {\n metadata: { name: string };\n trk: {\n name: string;\n trkseg: GpxImportTrkSeg[];\n }[];\n};\n\ninterface IGPXSticker {\n latlng: LatLng;\n text?: string;\n}\n\ninterface IGetGPXString {\n route: Array;\n stickers?: Array;\n title?: string;\n}\n\nexport const getGPXString = ({\n route,\n title,\n stickers,\n}: IGetGPXString): string => `\n\n \n ${title || 'GPX Track'} \n \n ${(stickers || []).reduce(\n (cat, { latlng: { lat, lng }, text }) =>\n `${cat}\n \n ${text}\n generic\n ${title}\n `,\n ''\n )}\n \n ${title || 'GPX Track'}\n \n ${route.reduce(\n (cat, { lat, lng }) =>\n ` ${cat}\n `,\n ''\n )}\n \n \n \n`;\n\nexport const downloadGPXTrack = ({ track, title }: { track: string; title?: string }): void =>\n saveAs(\n new Blob([track], { type: 'application/gpx+xml;charset=utf-8' }),\n `${(title || 'track').replace(/\\./gi, ' ')}.gpx`\n );\n\nexport const importGpxTrack = async (file: File) => {\n const reader = new FileReader();\n const content = await new Promise(resolve => {\n reader.readAsText(file);\n\n reader.onload = () => {\n resolve(reader.result);\n };\n\n reader.onerror = () => {\n resolve(null);\n };\n });\n\n const gpx: GpxImportRaw = GPX.parse(content);\n\n if (!gpx || !gpx.trk) return null;\n\n const latlngs: LatLng[] = gpx.trk.reduce((trk_res, trk) => {\n return trk.trkseg\n ? trk.trkseg.reduce((trkseg_res, trkseg) => {\n return trkseg.trkpt\n ? [\n ...trkseg_res,\n ...trkseg.trkpt.map(pnt => new LatLng(pnt['$'].lat, pnt['$'].lon)),\n ]\n : trkseg_res;\n }, trk_res)\n : trk_res;\n }, [] as LatLng[]);\n\n return [\n {\n name: (gpx.metadata && gpx.metadata.name) || (gpx.trk && gpx.trk[0] && gpx.trk[0].name) || '',\n latlngs,\n },\n ];\n};\n","import { LatLng, latLng, LatLngLiteral, Point, point } from 'leaflet';\n\nexport const middleCoord = (l1: LatLng, l2: LatLng): LatLng => latLng({\n lat: l2.lat + (l1.lat - l2.lat) / 2,\n lng: l2.lng + (l1.lng - l2.lng) / 2,\n});\n\nexport const middleCoordPx = (p1: Point, p2: Point): Point =>\n point({\n x: p1.x + (p2.x - p1.x) / 2,\n y: p1.y + (p2.y - p1.y) / 2,\n });\n\nexport const deg2rad = (deg: number): number => (deg * Math.PI) / 180;\nexport const rad2deg = (rad: number): number => (rad / Math.PI) * 180;\n\nexport const findDistancePx = (p1: Point, p2: Point): number => {\n return Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2);\n};\n\nexport const findDistance = (t1: number, n1: number, t2: number, n2: number): number => {\n // convert coordinates to radians\n const lat1 = deg2rad(t1);\n const lon1 = deg2rad(n1);\n const lat2 = deg2rad(t2);\n const lon2 = deg2rad(n2);\n\n // find the differences between the coordinates\n const dlat = lat2 - lat1;\n const dlon = lon2 - lon1;\n\n // here's the heavy lifting\n const a = Math.sin(dlat / 2) ** 2 + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dlon / 2) ** 2;\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // great circle distance in radians\n const dk = c * 6373; // great circle distance in km\n\n return Math.round(dk * 1000) / 1000;\n};\n\n// probably faster one\nexport const findDistanceHaversine = (t1: number, n1: number, t2: number, n2: number): number => {\n const R = 6371; // km\n const dLat = ((t2 - t1) * Math.PI) / 180;\n const dLon = ((n2 - n1) * Math.PI) / 180;\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((t1 * Math.PI) / 180) *\n Math.cos((t2 * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2);\n const c = 2 * Math.asin(Math.sqrt(a));\n return R * c;\n};\n\nexport const distKm = (A: LatLngLiteral, B: LatLngLiteral): number =>\n findDistance(A.lat, A.lng, B.lat, B.lng);\n\nexport const distKmHaversine = (A: LatLngLiteral, B: LatLngLiteral): number =>\n findDistanceHaversine(A.lat, A.lng, B.lat, B.lng);\n\nexport const getLabelDirection = (angle: number): 'left' | 'right' =>\n angle % Math.PI >= -(Math.PI / 2) && angle % Math.PI <= Math.PI / 2 ? 'left' : 'right';\n\nexport const getPolyLength = (latlngs: LatLngLiteral[]): number => {\n if (latlngs.length < 2) return 0;\n\n return latlngs.reduce(\n (dist, item, index) =>\n index < latlngs.length - 1 ? dist + distKmHaversine(item, latlngs[index + 1]) : dist,\n 0\n );\n};\n\n// if C between A and B\nexport const pointInArea = (A: LatLng, B: LatLng, C: LatLng, radius: number = 0.001): boolean =>\n C.lng <= Math.max(A.lng + radius, B.lng + radius) &&\n C.lat <= Math.max(A.lat + radius, B.lat + radius) &&\n C.lat >= Math.min(A.lat - radius, B.lat - radius) &&\n C.lng >= Math.min(A.lng - radius, B.lng - radius);\n\nexport const dist2 = (A: LatLngLiteral, B: LatLngLiteral): number =>\n (A.lat - B.lat) ** 2 + (A.lng - B.lng) ** 2;\n\nconst distToSegmentSquared = (A: LatLng, B: LatLng, C: LatLng): number => {\n const l2 = dist2(A, B);\n if (l2 === 0) return dist2(C, A);\n\n const t = Math.max(\n 0,\n Math.min(1, ((C.lat - A.lat) * (B.lat - A.lat) + (C.lng - A.lng) * (B.lng - A.lng)) / l2)\n );\n\n return dist2(C, {\n lat: A.lat + t * (B.lat - A.lat),\n lng: A.lng + t * (B.lng - A.lng),\n });\n};\n\nexport const distToSegment = (A: LatLng, B: LatLng, C: LatLng): number =>\n Math.sqrt(distToSegmentSquared(A, B, C));\n\nexport const pointBetweenPoints = (A: LatLng, B: LatLng, C: LatLng): boolean =>\n distToSegment(A, B, C) < 0.01;\n\nexport const angleBetweenPoints = (A: Point, B: Point): number =>\n parseFloat(((Math.atan2(B.y - A.y, B.x - A.x) * 180) / Math.PI).toFixed());\nexport const angleBetweenPointsRad = (A: Point, B: Point): number =>\n Math.atan2(B.x - A.x, B.y - A.y);\n\nexport const allwaysPositiveAngleDeg = (angle: number): number =>\n angle >= -90 && angle <= 90 ? angle : 180 + angle;\n\nexport const nearestInt = (value: number, parts: number): number => value - (value % parts);\n","import { CLIENT, COLORS } from '~/config/frontend';\nimport saveAs from 'file-saver';\nimport { replaceProviderUrl } from '~/constants/providers';\nimport { STICKERS } from '~/constants/stickers';\nimport { IRoute, IStickerDump } from '~/redux/map/types';\nimport { angleBetweenPoints, angleBetweenPointsRad, findDistancePx, middleCoordPx } from '~/utils/geom';\nimport { LatLng, latLng, Point } from 'leaflet';\nimport { MainMap } from '~/constants/map';\n\nexport interface ITilePlacement {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n shiftX: number;\n shiftY: number;\n size: number;\n width: number;\n height: number;\n zoom: number;\n}\n\nexport interface IStickerPlacement extends IStickerDump {\n x: number;\n y: number;\n}\n\nconst latLngToTile = (latlng: {\n lat: number;\n lng: number;\n}): { x: number; y: number; z: number } => {\n const zoom = MainMap.getZoom();\n const xtile = Number(Math.floor(((latlng.lng + 180) / 360) * (1 << zoom)));\n const ytile = Number(\n Math.floor(\n ((1 -\n Math.log(\n Math.tan((latlng.lat * Math.PI) / 180) + 1 / Math.cos((latlng.lat * Math.PI) / 180)\n ) /\n Math.PI) /\n 2) *\n (1 << zoom)\n )\n );\n\n return { x: xtile, y: ytile, z: zoom };\n};\n\nconst tileToLatLng = (point: { x: number; y: number }): LatLng => {\n const z = MainMap.getZoom();\n const lng = (point.x / Math.pow(2, z)) * 360 - 180;\n const n = Math.PI - (2 * Math.PI * point.y) / Math.pow(2, z);\n const lat = (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\n return latLng({ lat, lng });\n};\n\nexport const getTilePlacement = (): ITilePlacement => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n // map corners\n const southWest = MainMap.getBounds().getSouthWest();\n const northEast = MainMap.getBounds().getNorthEast();\n\n // map corner's tile files [x, y, z] to fetch from server\n const southWestTile = latLngToTile(southWest);\n const northEastTile = latLngToTile(northEast);\n\n // filling tile file ranges\n const { x: minX, y: maxY, z: zoom } = southWestTile;\n const { x: maxX, y: minY } = northEastTile;\n\n // actual coords of file's corners (they're shifted from view)\n const southWestTileCoords = tileToLatLng(southWestTile);\n\n const tileTransformTranslate = MainMap.latLngToLayerPoint(southWestTileCoords);\n const msw2 = MainMap.latLngToLayerPoint(southWest);\n\n return {\n minX,\n maxX,\n minY,\n maxY,\n shiftX: tileTransformTranslate.x - msw2.x,\n shiftY: (maxY - minY) * 256 - (window.innerHeight + (tileTransformTranslate.y - msw2.y)),\n size: 256,\n width,\n height,\n zoom,\n };\n};\n\nexport const getPolyPlacement = (latlngs: LatLng[]): Point[] =>\n latlngs.length === 0 ? [] : latlngs.map(latlng => MainMap.latLngToContainerPoint(latlng));\n\nexport const getStickersPlacement = (stickers: IStickerDump[]): IStickerPlacement[] =>\n stickers.length === 0\n ? []\n : stickers.map(sticker => ({\n ...sticker,\n ...MainMap.latLngToContainerPoint(sticker.latlng),\n }));\n\nconst getImageSource = (coords: { x: number; y: number; zoom: number }, provider: string): string =>\n replaceProviderUrl(provider, coords);\n\nexport const imageFetcher = (source: string): Promise =>\n new Promise((resolve, reject) => {\n const img = new Image();\n\n img.crossOrigin = 'anonymous';\n img.onload = () => resolve(img);\n img.onerror = () => reject(img);\n\n img.src = source;\n });\n\nexport const fetchImages = (\n ctx: CanvasRenderingContext2D,\n geometry: ITilePlacement,\n provider\n): Promise<{ x: number; y: number; image: HTMLImageElement }[]> => {\n const { minX, maxX, minY, maxY, zoom } = geometry;\n\n const images: { x: number; y: number; source: string }[] = [];\n for (let x = minX; x <= maxX; x += 1) {\n for (let y = minY; y <= maxY; y += 1) {\n images.push({ x, y, source: getImageSource({ x, y, zoom }, provider) });\n }\n }\n\n return Promise.all(\n images.map(({ x, y, source }) =>\n imageFetcher(source)\n .then(image => ({ x, y, image }))\n .catch()\n )\n );\n};\n\nexport const composeImages = ({\n images,\n geometry,\n ctx,\n}: {\n images: [];\n geometry: ITilePlacement;\n ctx: CanvasRenderingContext2D;\n}): void => {\n const { minX, minY, shiftX, shiftY, size } = geometry;\n\n images.map(({ x, y, image }) => {\n const posX = (x - minX) * size + shiftX;\n const posY = (y - minY) * size - shiftY;\n\n return ctx.drawImage(image, posX, posY, 256, 256);\n });\n};\n\nexport const composePoly = ({\n points,\n ctx,\n color = 'gradient',\n weight = CLIENT.STROKE_WIDTH,\n dash = [],\n}: {\n points: Point[];\n ctx: CanvasRenderingContext2D;\n color?: string;\n opacity?: number;\n weight?: number;\n dash?: number[];\n}): void => {\n if (points.length === 0) return;\n\n let minX = points[0].x;\n let maxX = points[0].x;\n let minY = points[0].y;\n let maxY = points[0].y;\n\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.lineWidth = weight + 0.5;\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n\n for (let i = 1; i < points.length; i += 1) {\n ctx.lineTo(points[i].x, points[i].y);\n\n // gradient bounds\n if (points[i].x < minX) minX = points[i].x;\n if (points[i].x > maxX) maxX = points[i].x;\n if (points[i].y < minY) minY = points[i].y;\n if (points[i].y > maxY) maxY = points[i].y;\n }\n\n if (color === 'gradient') {\n const gradient = ctx.createLinearGradient(minX, minY, minX, maxY);\n gradient.addColorStop(0, COLORS.PATH_COLOR[0]);\n gradient.addColorStop(1, COLORS.PATH_COLOR[1]);\n\n ctx.strokeStyle = gradient;\n } else {\n ctx.strokeStyle = color;\n }\n\n if (dash) {\n ctx.setLineDash(dash);\n }\n\n ctx.stroke();\n ctx.closePath();\n};\n\nexport const composeArrows = async ({\n points,\n ctx,\n}: {\n points: Point[];\n ctx: CanvasRenderingContext2D;\n}): Promise => {\n const image = await imageFetcher('/images/arrow.svg');\n\n const distances = points.map(\n (point, i) => (points[i + 1] && findDistancePx(points[i], points[i + 1])) || 0\n );\n\n // we want to annotate at least 5 arrows\n const min_arrows = distances.length >= 5 ? 5 : distances.length - 1;\n const min_distance = distances.sort((a, b) => b - a)[min_arrows];\n\n return points.map((point, i) => {\n if (!points[i + 1]) return false;\n\n const distance = findDistancePx(points[i], points[i + 1]);\n const angle = angleBetweenPointsRad(points[i], points[i + 1]);\n\n if (distance < min_distance && distance < 100) return false;\n\n const middle = middleCoordPx(points[i], points[i + 1]);\n\n ctx.save();\n ctx.translate(middle.x, middle.y);\n ctx.rotate(Math.PI * 0.5 - angle);\n ctx.translate(-middle.x, -middle.y);\n\n ctx.moveTo(middle.x, middle.y);\n\n ctx.drawImage(image, middle.x - 24, middle.y - 24, 48, 48);\n\n ctx.restore();\n\n return true;\n });\n};\n\nconst measureText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n lineHeight: number\n): { width: number; height: number } =>\n text.split('\\n').reduce(\n (obj, line) => ({\n width: Math.max(ctx.measureText(line).width, obj.width),\n height: obj.height + lineHeight,\n }),\n { width: 0, height: 0 }\n );\n\nconst measureDistText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n height: number\n): { width: number; height: number } => ({\n width: ctx.measureText(text).width,\n height,\n});\n\nconst composeStickerArrow = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n angle: number,\n scale: number\n) => {\n ctx.save();\n ctx.translate(x, y);\n ctx.scale(scale, scale);\n ctx.rotate(angle + Math.PI * 0.75);\n ctx.translate(-x, -y);\n ctx.fillStyle = '#ff3344';\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + 38, y + 20);\n ctx.lineTo(x + 38, y + 38);\n ctx.lineTo(x + 20, y + 38);\n ctx.fill();\n ctx.closePath();\n ctx.restore();\n};\n\nconst measureRect = (x: number, y: number, width: number, height: number, scale: number, reversed: boolean) => ({\n rectX: reversed ? x - width - 36 * scale - 10 * scale : x,\n rectY: y - 7 * scale - height / 2,\n rectW: width + 46 * scale,\n rectH: height + 20 * scale,\n textX: reversed ? x - width - (36 * scale) : x + 36 * scale,\n});\n\nconst measureDistRect = (\n x: number,\n y: number,\n width: number,\n height: number,\n reversed: boolean\n) => ({\n rectX: reversed ? x - width - 12 : x - 8,\n rectY: y - 2 - height / 2,\n rectW: reversed ? width + 22 : width + 20,\n rectH: height + 4,\n textX: reversed ? x - width - 8 : x + 8,\n});\n\nexport const roundedRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n fill: string,\n rad: number = 5\n): void => {\n ctx.fillStyle = fill;\n ctx.beginPath();\n ctx.moveTo(x, y + rad);\n ctx.lineTo(x, y + height - rad);\n\n ctx.lineTo(x + rad, y + height - rad);\n ctx.lineTo(x + rad, y + height);\n ctx.lineTo(x + width - rad, y + height);\n ctx.lineTo(x + width - rad, y + height - rad);\n ctx.lineTo(x + width, y + height - rad);\n ctx.lineTo(x + width, y + rad);\n ctx.lineTo(x + width - rad, y + rad);\n ctx.lineTo(x + width - rad, y);\n ctx.lineTo(x + rad, y);\n ctx.lineTo(x + rad, y + rad);\n\n ctx.closePath();\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(x + rad, y + rad, rad, 0, 360);\n ctx.arc(x + width - rad, y + height - rad, rad, 0, 360);\n ctx.arc(x + width - rad, y + rad, rad, 0, 360);\n ctx.arc(x + rad, y + height - rad, rad, 0, 360);\n ctx.closePath();\n\n ctx.fill();\n};\n\nconst composeStickerText = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n angle: number,\n text: string,\n scale: number\n): void => {\n const rad = 56;\n const tX = (Math.cos(angle + Math.PI) * rad - 30 + 28) * scale + x;\n const tY = (Math.sin(angle + Math.PI) * rad - 30 + 29) * scale + y;\n\n ctx.font = `${12 * scale}px \"Helvetica Neue\", Arial`;\n const lines = text.split('\\n');\n const { width, height } = measureText(ctx, text, 16 * scale);\n\n const { rectX, rectY, rectW, rectH, textX } = measureRect(\n tX,\n tY,\n width,\n height,\n scale,\n angle > -(Math.PI / 2) && angle < Math.PI / 2\n );\n\n roundedRect(ctx, rectX, rectY, rectW, rectH, '#222222', 2);\n\n // text\n ctx.fillStyle = 'white';\n lines.map((line, i) => ctx.fillText(line, textX, rectY + (6 + 16 * (i + 1)) * scale));\n};\n\nexport const composeDistMark = ({\n ctx,\n points,\n distance,\n}: {\n ctx: CanvasRenderingContext2D;\n points: Point[];\n distance: number;\n}): void => {\n if (points.length <= 1) return;\n\n ctx.font = 'bold 12px \"Helvetica Neue\", Arial';\n\n const angle = angleBetweenPoints(points[points.length - 2], points[points.length - 1]);\n const dist = parseFloat(distance.toFixed(1));\n const { x, y } = points[points.length - 1];\n const { width, height } = measureDistText(ctx, String(dist), 16);\n const { rectX, rectY, rectW, rectH, textX } = measureDistRect(\n x,\n y,\n width,\n height,\n !(angle > -90 && angle < 90)\n );\n\n roundedRect(ctx, rectX, rectY, rectW, rectH, '#ff3344', 2);\n\n ctx.fillStyle = 'white';\n ctx.beginPath();\n ctx.arc(x, y, 5, 0, 360);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillText(String(dist), textX, rectY + 14);\n};\n\nconst composeStickerImage = async (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n angle: number,\n set: string,\n sticker: string,\n scale: number\n): Promise => {\n const rad = 56;\n const tX = (Math.cos(angle + Math.PI) * rad - 30 - 6) * scale + x;\n const tY = (Math.sin(angle + Math.PI) * rad - 30 - 6) * scale + y;\n const offsetX = STICKERS[set].layers[sticker].off * 72;\n\n await imageFetcher(STICKERS[set].url).then(image => {\n ctx.drawImage(image, offsetX, 0, 72, 72, tX, tY, 72 * scale, 72 * scale);\n });\n\n return;\n};\n\nexport const composeStickers = async ({\n stickers,\n ctx,\n zoom,\n}: {\n stickers: IStickerPlacement[];\n ctx: CanvasRenderingContext2D;\n zoom: number;\n}): Promise => {\n if (!stickers || stickers.length < 0) return;\n\n stickers.map(({ x, y, angle, text }) => {\n composeStickerArrow(ctx, x, y, angle || 0, zoom);\n\n if (text) composeStickerText(ctx, x, y, angle || 0, text, zoom);\n });\n\n await Promise.all(\n stickers.map(({ x, y, angle, set, sticker }) =>\n composeStickerImage(ctx, x, y, angle || 0, set, sticker, zoom)\n )\n );\n};\n\nexport const downloadCanvas = (canvas: HTMLCanvasElement, title: IRoute['title']): void =>\n canvas.toBlob(blob => saveAs(blob, title));\n","import { DivIcon, DivIconOptions } from 'leaflet';\n//\n// export const DomMarker = DivIcon.extend({\n// initialize: function (options) {\n// this.options = options;\n// },\n//\n// options: {\n// element: null // a initialized DOM element\n// // same options as divIcon except for html\n// },\n//\n// createIcon: function() {\n// const { element } = this.options;\n//\n// this._setIconStyles(element, 'icon');\n//\n// return element;\n// }\n// });\n\nexport interface DomMarkerProps extends DivIconOptions {\n element: HTMLElement\n}\n\nexport class DomMarker extends DivIcon {\n element: HTMLElement\n\n constructor({ element, ...props }: DomMarkerProps) {\n super(props);\n this.element = element;\n }\n\n createIcon(oldicon?: HTMLElement) {\n this.element.classList.add('icon')\n\n if (this.options.className) {\n this.element.classList.add(this.options.className);\n }\n return this.element;\n }\n}\n","import { Marker } from 'leaflet';\nimport * as Routing from 'leaflet-routing-machine/src/index';\nimport { CLIENT } from '~/config/frontend';\nimport { DomMarker } from '~/utils/map/DomMarker';\nimport { MainMap } from '~/constants/map';\n\nconst createWaypointMarker = () => {\n const element = document.createElement('div');\n\n return new DomMarker({\n element,\n className: 'router-waypoint',\n });\n};\n\nconst routeLine = r =>\n Routing.line(r, {\n styles: [\n { color: 'white', opacity: 0.8, weight: 12 },\n { color: '#4597d0', opacity: 1, weight: 4, dashArray: '15,10' },\n ],\n addWaypoints: true,\n });\n// .on('linetouched', this.lockPropagations);\n\nexport const OsrmRouter = Routing.control({\n serviceUrl: CLIENT.OSRM_URL,\n profile: CLIENT.OSRM_PROFILE,\n fitSelectedRoutes: false,\n showAlternatives: false,\n routeLine,\n altLineOptions: {\n styles: [{ color: '#4597d0', opacity: 1, weight: 3 }],\n },\n show: false,\n plan: Routing.plan([], {\n createMarker: (_, wp) => {\n return new Marker(wp.latLng, {\n draggable: true,\n icon: createWaypointMarker(),\n })\n .on('dragstart', () => MainMap.disableClicks())\n .on('dragend', () => MainMap.enableClicks())\n .on('contextmenu', ({ latlng }: any) => {\n OsrmRouter.setWaypoints(\n OsrmRouter.getWaypoints().filter(\n point =>\n !point.latLng || (point.latLng.lat !== latlng.lat && point.latLng.lng !== latlng.lng)\n )\n );\n });\n },\n routeWhileDragging: false,\n }),\n routeWhileDragging: false,\n routingOptions: {\n geometryOnly: false,\n },\n useHints: false,\n});\n","const ru = [\n ' ',\n '\\\\.',\n ',',\n ':',\n '\\\\?',\n '#',\n 'Я',\n 'я',\n 'Ю',\n 'ю',\n 'Ч',\n 'ч',\n 'Ш',\n 'ш',\n 'Щ',\n 'щ',\n 'Ж',\n 'ж',\n 'А',\n 'а',\n 'Б',\n 'б',\n 'В',\n 'в',\n 'Г',\n 'г',\n 'Д',\n 'д',\n 'Е',\n 'е',\n 'Ё',\n 'ё',\n 'З',\n 'з',\n 'И',\n 'и',\n 'Й',\n 'й',\n 'К',\n 'к',\n 'Л',\n 'л',\n 'М',\n 'м',\n 'Н',\n 'н',\n 'О',\n 'о',\n 'П',\n 'п',\n 'Р',\n 'р',\n 'С',\n 'с',\n 'Т',\n 'т',\n 'У',\n 'у',\n 'Ф',\n 'ф',\n 'Х',\n 'х',\n 'Ц',\n 'ц',\n 'Ы',\n 'ы',\n 'Ь',\n 'ь',\n 'Ъ',\n 'ъ',\n 'Э',\n 'э',\n];\nconst en = [\n '_',\n '',\n '',\n '',\n '',\n '',\n 'Ya',\n 'ya',\n 'Yu',\n 'yu',\n 'Ch',\n 'ch',\n 'Sh',\n 'sh',\n 'Sh',\n 'sh',\n 'Zh',\n 'zh',\n 'A',\n 'a',\n 'B',\n 'b',\n 'V',\n 'v',\n 'G',\n 'g',\n 'D',\n 'd',\n 'E',\n 'e',\n 'E',\n 'e',\n 'Z',\n 'z',\n 'I',\n 'i',\n 'J',\n 'j',\n 'K',\n 'k',\n 'L',\n 'l',\n 'M',\n 'm',\n 'N',\n 'n',\n 'O',\n 'o',\n 'P',\n 'p',\n 'R',\n 'r',\n 'S',\n 's',\n 'T',\n 't',\n 'U',\n 'u',\n 'F',\n 'f',\n 'H',\n 'h',\n 'C',\n 'c',\n 'Y',\n 'y',\n '',\n '',\n '',\n '',\n 'E',\n 'e',\n];\n\nexport const removeGarbage = (text: string): string =>\n text.replace(/[^A-Za-z\\-_0-9]/gi, '_').replace(/_{2,}/gi, '_');\n\nexport const toHours = (info: number): string => {\n const hrs = parseInt(String(info), 10);\n const min = Math.round((Number(info) - hrs) * 60);\n const lmin = min < 10 ? '0' + min : min;\n return `${hrs}:${lmin}`;\n};\n\nexport const toTranslit = (string: string = ''): string =>\n removeGarbage(\n ru.reduce((text, el, i) => text.replace(new RegExp(ru[i], 'g'), en[i]), String(string) || '')\n );\n\nexport const parseDesc = (text: string = ''): string => text.replace(/(\\n{2,})/gi, '\\n\\n');\n\nexport const getEstimated = (distance: number, speed: number = 15): number => {\n const time = (distance && (distance / speed)) || 0;\n return (time && parseFloat(time.toFixed(1)));\n};","import { getEstimated } from '~/utils/format';\nimport * as ACTIONS from '~/redux/editor/actions';\nimport { EDITOR_ACTIONS } from '~/redux/editor/constants';\nimport { IEditorState } from '~/redux/editor';\nimport { TIPS } from '~/constants/tips';\n\nconst setEditing = (\n state,\n { editing }: ReturnType\n): IEditorState => ({\n ...state,\n editing,\n});\n\nconst setChanged = (\n state,\n { changed }: ReturnType\n): IEditorState => ({\n ...state,\n changed,\n});\n\nconst setMode = (state, { mode }: ReturnType): IEditorState => ({\n ...state,\n mode,\n});\n\nconst setDistance = (\n state,\n { distance }: ReturnType\n): IEditorState => ({\n ...state,\n distance: parseFloat(distance.toFixed(1)),\n estimated: getEstimated(distance, state.speed),\n});\n\nconst setRouterPoints = (\n state,\n { routerPoints }: ReturnType\n): IEditorState => ({\n ...state,\n routerPoints,\n});\n\nconst setActiveSticker = (\n state,\n { activeSticker }: ReturnType\n): IEditorState => ({\n ...state,\n activeSticker: activeSticker || { set: null, sticker: null },\n});\n\nconst hideRenderer = (state): IEditorState => ({\n ...state,\n renderer: { ...state.renderer, renderer_active: false },\n});\n\nconst setRenderer = (\n state,\n { payload }: ReturnType\n): IEditorState => ({\n ...state,\n renderer: { ...state.renderer, ...payload },\n});\n\nconst sendSaveRequest = (state): IEditorState => ({\n ...state,\n save_processing: true,\n});\n\nconst setSave = (state, { save }: ReturnType): IEditorState => ({\n ...state,\n save: {\n ...state.save,\n ...save,\n },\n});\n\nconst resetSaveDialog = (state): IEditorState => ({\n ...state,\n save_overwriting: false,\n save_finished: false,\n save_processing: false,\n save_error: '',\n});\n\nconst setDialog = (\n state,\n { dialog }: ReturnType\n): IEditorState => ({\n ...state,\n dialog,\n});\n\nconst setDialogActive = (\n state,\n { dialog_active }: ReturnType\n): IEditorState => ({\n ...state,\n dialog_active: dialog_active || !state.dialog_active,\n});\n\nconst setReady = (\n state,\n { ready = true }: ReturnType\n): IEditorState => ({\n ...state,\n ready,\n});\n\nconst setSpeed = (\n state,\n { speed = 15 }: ReturnType\n): IEditorState => ({\n ...state,\n speed,\n estimated: getEstimated(state.distance, speed),\n});\n\nconst setMarkersShown = (\n state,\n { markers_shown = true }: ReturnType\n): IEditorState => ({ ...state, markers_shown });\n\nconst setIsEmpty = (\n state,\n { is_empty = true }: ReturnType\n): IEditorState => ({ ...state, is_empty });\n\nconst setFeature = (\n state,\n { features }: ReturnType\n): IEditorState => ({\n ...state,\n features: {\n ...state.features,\n ...features,\n },\n});\n\nconst setIsRouting = (\n state,\n { is_routing }: ReturnType\n): IEditorState => ({\n ...state,\n is_routing,\n});\n\nconst setRouter = (\n state,\n { router }: ReturnType\n): IEditorState => ({\n ...state,\n router: {\n ...state.router,\n ...router,\n },\n});\n\nconst setNominatim = (\n state,\n { nominatim }: ReturnType\n): IEditorState => ({\n ...state,\n nominatim: {\n ...state.nominatim,\n ...nominatim,\n },\n});\n\nconst setHistory = (\n state,\n { history }: ReturnType\n): IEditorState => ({\n ...state,\n history: {\n ...state.history,\n ...history,\n },\n});\n\nconst setDirection = (\n state,\n { drawing_direction }: ReturnType\n): IEditorState => ({\n ...state,\n drawing_direction,\n});\n\nconst setGpx = (\n state,\n { gpx }: ReturnType\n): IEditorState => ({\n ...state,\n gpx: {\n ...state.gpx,\n ...gpx,\n },\n});\n\nexport const EDITOR_HANDLERS = {\n [EDITOR_ACTIONS.SET_EDITING]: setEditing,\n [EDITOR_ACTIONS.SET_CHANGED]: setChanged,\n [EDITOR_ACTIONS.SET_MODE]: setMode,\n [EDITOR_ACTIONS.SET_DISTANCE]: setDistance,\n [EDITOR_ACTIONS.SET_ROUTER_POINTS]: setRouterPoints,\n [EDITOR_ACTIONS.SET_ACTIVE_STICKER]: setActiveSticker,\n\n [EDITOR_ACTIONS.SET_SAVE]: setSave,\n\n [EDITOR_ACTIONS.SEND_SAVE_REQUEST]: sendSaveRequest,\n [EDITOR_ACTIONS.RESET_SAVE_DIALOG]: resetSaveDialog,\n\n [EDITOR_ACTIONS.HIDE_RENDERER]: hideRenderer,\n [EDITOR_ACTIONS.SET_RENDERER]: setRenderer,\n\n [EDITOR_ACTIONS.SET_DIALOG]: setDialog,\n [EDITOR_ACTIONS.SET_DIALOG_ACTIVE]: setDialogActive,\n [EDITOR_ACTIONS.SET_READY]: setReady,\n\n [EDITOR_ACTIONS.SET_SPEED]: setSpeed,\n [EDITOR_ACTIONS.SET_MARKERS_SHOWN]: setMarkersShown,\n [EDITOR_ACTIONS.SET_IS_EMPTY]: setIsEmpty,\n\n [EDITOR_ACTIONS.SET_FEATURE]: setFeature,\n [EDITOR_ACTIONS.SET_IS_ROUTING]: setIsRouting,\n [EDITOR_ACTIONS.SET_ROUTER]: setRouter,\n [EDITOR_ACTIONS.SET_NOMINATIM]: setNominatim,\n\n [EDITOR_ACTIONS.SET_HISTORY]: setHistory,\n\n [EDITOR_ACTIONS.SET_DIRECTION]: setDirection,\n [EDITOR_ACTIONS.SET_GPX]: setGpx,\n};\n","import { createReducer } from '~/utils/reducer';\nimport { DIALOGS } from '~/constants/dialogs';\nimport { MODES } from '~/constants/modes';\nimport { EDITOR_HANDLERS } from './handlers';\n// import { ILatLng } from '../map/types';\nimport { INominatimResult } from '~/redux/types';\nimport { IMapReducer } from '../map';\nimport { DRAWING_DIRECTIONS } from './constants';\nimport { LatLng } from 'leaflet';\n\nexport interface IGpxRoute {\n latlngs: LatLng[],\n enabled: boolean;\n color: string;\n name: string;\n id: string;\n}\n\nexport interface IEditorHistoryItem {\n route: IMapReducer['route'];\n stickers: IMapReducer['stickers'];\n}\n\nexport interface IEditorState {\n changed: boolean;\n editing: boolean;\n ready: boolean;\n markers_shown: boolean;\n\n router: {\n points: LatLng[];\n waypoints: LatLng[];\n };\n\n mode: typeof MODES[keyof typeof MODES];\n\n dialog: typeof DIALOGS[keyof typeof DIALOGS];\n dialog_active: boolean;\n\n routerPoints: number;\n distance: number;\n estimated: number;\n speed: number;\n activeSticker: { set: string; sticker: string };\n is_empty: boolean;\n is_published: boolean;\n is_routing: boolean;\n drawing_direction: typeof DRAWING_DIRECTIONS[keyof typeof DRAWING_DIRECTIONS];\n\n features: {\n routing: boolean;\n nominatim: boolean;\n };\n\n nominatim: {\n search: string;\n loading: boolean;\n list: INominatimResult[];\n };\n\n renderer: {\n data: string;\n width: number;\n height: number;\n renderer_active: boolean;\n info: string;\n progress: number;\n };\n\n save: {\n error: string;\n finished: boolean;\n overwriting: boolean;\n processing: boolean;\n loading: boolean;\n };\n\n history: {\n records: IEditorHistoryItem[];\n position: number;\n };\n\n\n gpx: {\n enabled: boolean;\n list: IGpxRoute[],\n },\n}\n\nexport const EDITOR_INITIAL_STATE = {\n changed: false,\n editing: false,\n ready: false,\n markers_shown: false,\n\n mode: MODES.NONE,\n dialog: null,\n dialog_active: false,\n\n routerPoints: 0,\n distance: 0,\n estimated: 0,\n speed: 15,\n activeSticker: { set: null, sticker: null },\n drawing_direction: DRAWING_DIRECTIONS.FORWARDS,\n\n is_published: false,\n is_empty: true,\n is_routing: false,\n\n router: {\n waypoints: [],\n points: [],\n },\n\n features: {\n routing: false,\n nominatim: false,\n },\n\n nominatim: {\n search: '',\n loading: false,\n list: [],\n },\n\n renderer: {\n data: '',\n width: 0,\n height: 0,\n renderer_active: false,\n info: '',\n progress: 0,\n },\n\n save: {\n error: '',\n finished: false,\n overwriting: false,\n processing: false,\n loading: false,\n },\n\n history: {\n records: [{ route: [], stickers: [] }],\n position: 0,\n },\n\n gpx: {\n enabled: true,\n list: [],\n },\n};\n\nexport const editor = createReducer(EDITOR_INITIAL_STATE, EDITOR_HANDLERS);\n","export const getStyle = (oElm: any, strCssRule: string): string => {\n if(document.defaultView && document.defaultView.getComputedStyle){\n return document.defaultView.getComputedStyle(oElm, '').getPropertyValue(strCssRule);\n } else if(oElm.currentStyle){\n return oElm.currentStyle[strCssRule.replace(/\\-(\\w)/g, (strMatch, p1) => p1.toUpperCase())];\n }\n\n return '';\n};\n\n\nexport const getRandomColor = () => {\n return `hsla(${(Math.floor(Math.random() * 360))}, 100%, 50%, 0.4)`\n}\n\nexport const getAdaptiveScale = (zoom: number): number => (\n Math.min(1, Math.max(0.4, 1.5 / (2 ** (13 - zoom))))\n);","import {\n call,\n put,\n takeEvery,\n takeLatest,\n select,\n race,\n takeLeading,\n delay,\n} from 'redux-saga/effects';\nimport { selectEditor, selectEditorMode, selectEditorGpx } from '~/redux/editor/selectors';\nimport { simplify } from '~/utils/simplify';\nimport {\n editorHideRenderer,\n editorSetChanged,\n editorChangeMode,\n editorSetReady,\n editorSetRenderer,\n editorSetDialogActive,\n editorClearAll,\n editorSetFeature,\n editorLocationChanged,\n editorKeyPressed,\n editorSetSave,\n editorSearchNominatim,\n editorSetDialog,\n editorSetNominatim,\n editorSetMode,\n editorSetRouter,\n editorSetHistory,\n editorUndo,\n editorRedo,\n editorUploadGpx,\n editorSetGpx,\n} from '~/redux/editor/actions';\nimport { getUrlData, pushPath } from '~/utils/history';\nimport { MODES } from '~/constants/modes';\nimport { checkOSRMService, checkNominatimService, searchNominatim } from '~/utils/api';\nimport { LatLng } from 'leaflet';\nimport { searchSetTab } from '../user/actions';\nimport { TABS, DIALOGS } from '~/constants/dialogs';\nimport { EDITOR_ACTIONS, EDITOR_HISTORY_LENGTH } from './constants';\nimport { getGPXString, downloadGPXTrack, importGpxTrack } from '~/utils/gpx';\nimport {\n getTilePlacement,\n getPolyPlacement,\n getStickersPlacement,\n fetchImages,\n composeArrows,\n composeDistMark,\n composeImages,\n composePoly,\n composeStickers,\n imageFetcher,\n downloadCanvas,\n} from '~/utils/renderer';\nimport { selectMap, selectMapRoute } from '../map/selectors';\nimport { selectUser } from '../user/selectors';\nimport { LOGOS } from '~/constants/logos';\nimport { loadMapFromPath } from '../map/sagas';\nimport { mapClicked, mapSetRoute, mapSet } from '../map/actions';\nimport { MAP_ACTIONS } from '../map/constants';\nimport { OsrmRouter } from '~/utils/map/OsrmRouter';\nimport path from 'ramda/es/path';\nimport { MainMap } from '~/constants/map';\nimport { EDITOR_INITIAL_STATE } from '.';\nimport { Unwrap } from '~/utils/middleware';\nimport uuid from 'uuid';\nimport { getRandomColor, getAdaptiveScale } from '~/utils/dom';\n\nconst hideLoader = () => {\n const el = document.getElementById('loader');\n\n if (!el) {\n return true;\n }\n\n el.style.opacity = String(0);\n el.style.pointerEvents = 'none';\n\n return true;\n};\n\nfunction* stopEditingSaga() {\n const { changed, mode }: ReturnType = yield select(selectEditor);\n const { path } = getUrlData();\n\n if (changed && mode !== MODES.CONFIRM_CANCEL) {\n yield put(editorChangeMode(MODES.CONFIRM_CANCEL));\n return;\n }\n\n yield put(editorChangeMode(MODES.NONE));\n yield put(editorSetChanged(false));\n yield put(editorSetReady(true));\n\n yield pushPath(`/${path}/`);\n}\n\nfunction* checkOSRMServiceSaga() {\n const routing = yield call(checkOSRMService, [new LatLng(1, 1), new LatLng(2, 2)]);\n\n yield put(editorSetFeature({ routing }));\n}\n\nfunction* checkNominatimSaga() {\n const nominatim = yield call(checkNominatimService);\n yield put(editorSetFeature({ nominatim }));\n}\n\nexport function* setReadySaga() {\n yield put(editorSetReady(true));\n hideLoader();\n\n yield call(checkOSRMServiceSaga);\n\n // TODO: someday make nominatim, but sorted by nearest points.\n // yield call(checkNominatimSaga);\n\n yield put(searchSetTab(TABS.MY));\n}\n\nfunction* getRenderData() {\n yield put(editorSetRenderer({ info: 'Загрузка тайлов', progress: 0.1 }));\n\n const { route, stickers, provider }: ReturnType = yield select(selectMap);\n const { distance }: ReturnType = yield select(selectEditor);\n\n const canvas = document.getElementById('renderer');\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return\n }\n\n const geometry = getTilePlacement();\n const points = getPolyPlacement(route);\n const sticker_points = getStickersPlacement(stickers);\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const images = yield fetchImages(ctx, geometry, provider);\n\n yield put(editorSetRenderer({ info: 'Отрисовка', progress: 0.5 }));\n\n yield composeImages({ geometry, images, ctx });\n yield composePoly({ points, ctx });\n\n yield composeArrows({ points, ctx });\n yield composeDistMark({ ctx, points, distance });\n yield composeStickers({\n stickers: sticker_points,\n ctx,\n zoom: getAdaptiveScale(MainMap.getZoom()),\n });\n\n yield put(editorSetRenderer({ info: 'Готово', progress: 1 }));\n\n return yield canvas.toDataURL('image/jpeg');\n}\n\nfunction* takeAShotSaga() {\n const worker = call(getRenderData);\n\n const { result, timeout } = yield race({\n result: worker,\n timeout: delay(500),\n });\n\n if (timeout) yield put(editorChangeMode(MODES.SHOT_PREFETCH));\n\n const data = yield result || worker;\n\n yield put(editorChangeMode(MODES.NONE));\n yield put(\n editorSetRenderer({\n data,\n renderer_active: true,\n width: window.innerWidth,\n height: window.innerHeight,\n })\n );\n}\n\nfunction* getCropData({ x, y, width, height }) {\n const { logo }: ReturnType = yield select(selectMap);\n const {\n renderer: { data },\n }: ReturnType = yield select(selectEditor);\n\n const canvas = document.getElementById('renderer');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return\n }\n\n const image = yield imageFetcher(data);\n\n ctx.drawImage(image, -x, -y);\n\n if (logo && LOGOS[logo][1]) {\n const logoImage = yield imageFetcher(LOGOS[logo][1]);\n ctx.drawImage(logoImage, width - logoImage.width, height - logoImage.height);\n }\n\n return yield canvas.toDataURL('image/jpeg');\n}\n\nfunction* cropAShotSaga(params) {\n const { title, address }: ReturnType = yield select(selectMap);\n\n yield call(getCropData, params);\n const canvas = document.getElementById('renderer') as HTMLCanvasElement;\n\n downloadCanvas(canvas, (title || address).replace(/\\./gi, ' '));\n\n return yield put(editorHideRenderer());\n}\n\nfunction* locationChangeSaga({ location }: ReturnType) {\n const { ready }: ReturnType = yield select(selectEditor);\n\n if (!ready) return;\n\n const mode: ReturnType = yield select(selectEditorMode);\n\n if (mode !== MODES.NONE) {\n yield put(editorChangeMode(MODES.NONE));\n }\n\n yield call(loadMapFromPath);\n MainMap.fitVisibleBounds({ animate: true });\n}\n\nfunction* keyPressedSaga({ key, target }: ReturnType) {\n if (target === 'INPUT' || target === 'TEXTAREA') {\n return;\n }\n\n if (key === 'Escape') {\n const {\n dialog_active,\n mode,\n renderer: { renderer_active },\n }: ReturnType = yield select(selectEditor);\n\n if (renderer_active) return yield put(editorHideRenderer());\n if (dialog_active) return yield put(editorSetDialogActive(false));\n if (mode !== MODES.NONE) return yield put(editorChangeMode(MODES.NONE));\n } else if (key === 'Delete' || key === 'c') {\n const { editing } = yield select(selectEditor);\n\n if (!editing) return;\n\n const { mode } = yield select(selectUser);\n\n if (mode === MODES.TRASH) {\n yield put(editorClearAll());\n } else {\n yield put(editorChangeMode(MODES.TRASH));\n }\n } else if (key === 'z') {\n yield put(editorUndo());\n } else if (key === 'x') {\n yield put(editorRedo());\n }\n}\n\nfunction* getGPXTrackSaga() {\n const { route, stickers, title, address }: ReturnType = yield select(selectMap);\n\n if (!route.length && !stickers.length) return;\n\n const track = getGPXString({ route, stickers, title: title || address });\n\n return downloadGPXTrack({ track, title });\n}\n\nfunction* routerCancel() {\n yield put(editorChangeMode(MODES.NONE));\n}\n\nfunction* mapClick({ latlng }: ReturnType) {\n const { mode }: ReturnType = yield select(selectEditor);\n\n if (mode === MODES.ROUTER) {\n const wp = OsrmRouter.getWaypoints().filter(point => !!point.latLng);\n OsrmRouter.setWaypoints([...wp, latlng]);\n }\n}\n\nfunction* routerSubmit() {\n const route: ReturnType = yield select(selectMapRoute);\n const latlngs: LatLng[] = path(['_routes', 0, 'coordinates'], OsrmRouter) || [];\n\n const coordinates = simplify(latlngs);\n\n yield put(mapSetRoute([...route, ...coordinates]));\n OsrmRouter.setWaypoints([]);\n yield put(editorChangeMode(MODES.NONE));\n}\n\nfunction* cancelSave() {\n yield put(\n editorSetSave({\n ...EDITOR_INITIAL_STATE.save,\n })\n );\n}\n\nfunction* searchNominatimSaga({ search }: ReturnType) {\n const { dialog, dialog_active }: ReturnType = yield select(selectEditor);\n\n if (dialog !== DIALOGS.NOMINATIM || !dialog_active) {\n yield put(editorSetDialog(DIALOGS.NOMINATIM));\n yield put(editorSetDialogActive(true));\n }\n\n yield put(editorSetNominatim({ loading: true, search }));\n const list = yield call(searchNominatim, search);\n yield put(editorSetNominatim({ list }));\n\n yield delay(1000); // safely wait for 1s to prevent from ddosing nominatim\n yield put(editorSetNominatim({ loading: false }));\n}\n\nfunction* changeMode({ mode }: ReturnType) {\n const current: ReturnType = yield select(selectEditorMode);\n\n if (mode === current) {\n yield put(editorSetMode(MODES.NONE));\n return;\n }\n\n switch (current) {\n case MODES.ROUTER:\n yield put(editorSetRouter({ waypoints: [] }));\n }\n\n yield put(editorSetMode(mode));\n\n switch (mode) {\n }\n}\n\nfunction* changeHistory() {\n const { history }: ReturnType = yield select(selectEditor);\n const { route, stickers }: ReturnType = yield select(selectMap);\n\n const current =\n history.records.length - 1 > history.position\n ? history.records.slice(0, history.position + 1)\n : history.records;\n\n const records = [...current, { route, stickers }];\n const min = Math.max(0, records.length - EDITOR_HISTORY_LENGTH - 1);\n const max = Math.min(records.length, EDITOR_HISTORY_LENGTH + 2);\n\n yield put(\n editorSetHistory({\n records: records.slice(min, max),\n position: records.slice(min, max).length - 1,\n })\n );\n}\n\nfunction* undoHistory() {\n const { history }: ReturnType = yield select(selectEditor);\n\n if (history.position === 0 || history.records.length <= 1) return;\n\n const route = history.records[history.position - 1].route;\n const stickers = history.records[history.position - 1].stickers;\n\n yield put(mapSet({ route, stickers }));\n yield put(editorSetHistory({ position: history.position - 1 }));\n}\n\nfunction* redoHistory() {\n const { history }: ReturnType = yield select(selectEditor);\n\n if (history.position >= history.records.length - 1) return;\n\n const route = history.records[history.position + 1].route;\n const stickers = history.records[history.position + 1].stickers;\n\n yield put(mapSet({ route, stickers }));\n yield put(editorSetHistory({ position: history.position + 1 }));\n}\n\nfunction* uploadGpx({ file }: ReturnType) {\n const gpx: Unwrap = yield importGpxTrack(file);\n\n if (!gpx || !gpx.length) return;\n\n const { list }: ReturnType = yield select(selectEditorGpx);\n\n yield put(\n editorSetGpx({\n list: [\n ...list,\n ...gpx\n .filter(item => item.latlngs && item.latlngs.length)\n .map(item => ({\n enabled: true,\n latlngs: item.latlngs,\n color: getRandomColor(),\n name: item.name || `Track #${list.length + 1}`,\n id: uuid() as string,\n })),\n ],\n })\n );\n}\n\nexport function* editorSaga() {\n yield takeEvery(EDITOR_ACTIONS.LOCATION_CHANGED, locationChangeSaga);\n\n yield takeEvery(EDITOR_ACTIONS.STOP_EDITING, stopEditingSaga);\n yield takeLatest(EDITOR_ACTIONS.TAKE_A_SHOT, takeAShotSaga);\n yield takeLatest(EDITOR_ACTIONS.CROP_A_SHOT, cropAShotSaga);\n yield takeLatest(EDITOR_ACTIONS.KEY_PRESSED, keyPressedSaga);\n yield takeLatest(EDITOR_ACTIONS.GET_GPX_TRACK, getGPXTrackSaga);\n yield takeLatest(EDITOR_ACTIONS.ROUTER_CANCEL, routerCancel);\n yield takeLatest(MAP_ACTIONS.MAP_CLICKED, mapClick);\n yield takeLatest(EDITOR_ACTIONS.ROUTER_SUBMIT, routerSubmit);\n yield takeLatest(EDITOR_ACTIONS.CANCEL_SAVE, cancelSave);\n yield takeLeading(EDITOR_ACTIONS.SEARCH_NOMINATIM, searchNominatimSaga);\n yield takeLeading(EDITOR_ACTIONS.CHANGE_MODE, changeMode);\n\n yield takeEvery(\n [\n MAP_ACTIONS.ADD_STICKER,\n MAP_ACTIONS.DROP_STICKER,\n MAP_ACTIONS.SET_STICKERS,\n MAP_ACTIONS.SET_STICKER,\n MAP_ACTIONS.SET_ROUTE,\n EDITOR_ACTIONS.CAPTURE_HIPSTORY,\n ],\n changeHistory\n );\n\n yield takeEvery(EDITOR_ACTIONS.UNDO, undoHistory);\n yield takeEvery(EDITOR_ACTIONS.REDO, redoHistory);\n\n yield takeEvery(EDITOR_ACTIONS.UPLOAD_GPX, uploadGpx);\n}\n","import { call, delay, put, race, select, take, TakeEffect, takeEvery, takeLatest } from 'redux-saga/effects';\nimport { MAP_ACTIONS } from './constants';\nimport {\n mapAddSticker,\n mapClicked,\n mapSet,\n mapSetAddressOrigin,\n mapSetProvider,\n mapSetRoute,\n mapSetStickers,\n mapSetTitle,\n} from './actions';\nimport { selectUser } from '~/redux/user/selectors';\nimport { MODES } from '~/constants/modes';\nimport {\n editorCaptureHistory,\n editorChangeMode,\n editorClearAll,\n editorSendSaveRequest,\n editorSetActiveSticker,\n editorSetChanged,\n editorSetEditing,\n editorSetHistory,\n editorSetReady,\n editorSetSave,\n} from '~/redux/editor/actions';\nimport { getUrlData, pushLoaderState, pushPath } from '~/utils/history';\nimport { getStoredMap, postMap } from '~/utils/api';\nimport { Unwrap } from '~/utils/middleware';\nimport { selectMap, selectMapProvider, selectMapRoute, selectMapStickers } from './selectors';\nimport { TIPS } from '~/constants/tips';\nimport { setReadySaga } from '../editor/sagas';\nimport { selectEditor } from '../editor/selectors';\nimport { EDITOR_ACTIONS } from '../editor/constants';\nimport { MainMap } from '~/constants/map';\n\nfunction* onMapClick({ latlng }: ReturnType) {\n const {\n mode,\n activeSticker: { set, sticker },\n }: ReturnType = yield select(selectEditor);\n\n switch (mode) {\n case MODES.STICKERS:\n yield put(mapAddSticker({ latlng, set, sticker, text: '', angle: 2.11 }));\n yield put(editorChangeMode(MODES.NONE));\n break;\n\n default:\n break;\n }\n}\n\nexport function* replaceAddressIfItsBusy(destination, original) {\n if (original) {\n yield put(mapSetAddressOrigin(original));\n }\n\n pushPath(`/${destination}/edit`);\n}\n\nexport function* loadMapSaga(path) {\n try {\n const {\n data: {\n route, error, random_url,\n },\n }: Unwrap = yield call(getStoredMap, { name: path });\n\n if (route && !error) {\n yield put(\n mapSet({\n provider: route.provider,\n route: route.route,\n stickers: route.stickers,\n title: route.title,\n address: route.address,\n description: route.description,\n is_public: route.is_public,\n logo: route.logo,\n }),\n );\n\n yield put(editorSetHistory({ records: [{ route: route.route, stickers: route.stickers }] }));\n return { route, random_url };\n }\n\n return null;\n } catch (e) {\n console.log(e);\n yield call(startEmptyEditorSaga);\n }\n}\n\nexport function* startEmptyEditorSaga() {\n yield put(editorSetReady(false));\n\n const {\n user: { id, random_url },\n }: ReturnType = yield select(selectUser);\n\n const { path, mode } = getUrlData();\n\n if (!path || !mode || mode !== 'edit') {\n pushPath(`/${random_url}/edit`);\n }\n\n yield put(editorClearAll());\n yield put(mapSet({ owner: { id } }));\n yield put(editorSetEditing(true));\n yield put(editorSetReady(true));\n}\n\nexport function* loadMapFromPath() {\n const { path, mode } = getUrlData();\n yield put(editorSetHistory({ records: [{ route: [], stickers: [] }], position: 0 }));\n\n if (path) {\n const map = yield call(loadMapSaga, path);\n\n if (!map) {\n yield call(startEmptyEditorSaga);\n return;\n }\n\n yield put(editorSetEditing(!!(mode && mode === 'edit')));\n return;\n }\n\n yield call(startEmptyEditorSaga);\n}\n\nexport function* mapInitSaga() {\n pushLoaderState(90);\n\n const { hash } = getUrlData();\n const provider: ReturnType = yield select(selectMapProvider);\n\n yield put(mapSetProvider(provider));\n\n if (hash && /^#map/.test(hash)) {\n const matches = hash.match(/^#map[:/?!](.*)$/);\n\n if (matches && matches[1]) {\n yield pushPath(`/${matches[1]}`);\n yield call(setReadySaga);\n return;\n }\n }\n\n yield call(loadMapFromPath);\n yield call(setReadySaga);\n MainMap.fitVisibleBounds({ animate: false });\n pushLoaderState(100);\n}\n\nfunction* setActiveStickerSaga() {\n yield put(editorChangeMode(MODES.STICKERS));\n}\n\nfunction setTitleSaga({ title }: ReturnType) {\n if (title) {\n document.title = `${title} | Редактор маршрутов`;\n }\n}\n\nfunction* startEditingSaga() {\n const { path } = getUrlData();\n yield pushPath(`/${path}/edit`);\n}\n\nfunction* clearPolySaga() {\n const route: ReturnType = yield select(selectMapRoute);\n if (!route.length) return;\n yield put(mapSetRoute([]));\n}\n\nfunction* clearStickersSaga() {\n const stickers: ReturnType = yield select(selectMapStickers);\n if (!stickers.length) return;\n yield put(mapSetStickers([]));\n}\n\nfunction* clearAllSaga() {\n const route: ReturnType = yield select(selectMapRoute);\n const stickers: ReturnType = yield select(selectMapStickers);\n\n if (!stickers.length && !route.length) return;\n\n yield put(editorSetChanged(false));\n yield put(mapSet({ route: [], stickers: [] }));\n yield put(editorCaptureHistory());\n}\n\nfunction* clearSaga({ type }) {\n switch (type) {\n case EDITOR_ACTIONS.CLEAR_POLY:\n yield call(clearPolySaga);\n break;\n\n case EDITOR_ACTIONS.CLEAR_STICKERS:\n yield call(clearStickersSaga);\n break;\n\n case EDITOR_ACTIONS.CLEAR_ALL:\n yield call(clearAllSaga);\n break;\n\n default:\n break;\n }\n\n const { mode, activeSticker }: ReturnType = yield select(selectEditor);\n\n if (activeSticker && activeSticker.set && activeSticker.sticker) {\n yield put(editorSetActiveSticker({ set: '', sticker: '' }));\n }\n\n if (mode !== MODES.NONE) {\n yield put(editorChangeMode(MODES.NONE));\n }\n}\n\nfunction* sendSaveRequestSaga({\n title,\n address,\n force,\n is_public,\n description,\n}: ReturnType) {\n try {\n const { route, stickers, provider }: ReturnType = yield select(selectMap);\n\n if (!route.length && !stickers.length) {\n return yield put(\n editorSetSave({ error: TIPS.SAVE_EMPTY, loading: false, overwriting: false, finished: false }),\n );\n }\n\n const { logo }: ReturnType = yield select(selectMap);\n const { distance }: ReturnType = yield select(selectEditor);\n\n yield put(editorSetSave({ loading: true, overwriting: false, finished: false, error: '' }));\n\n const {\n result,\n timeout,\n cancel,\n }: {\n result: Unwrap;\n timeout: boolean;\n cancel: TakeEffect;\n } = yield race({\n result: postMap({\n route,\n stickers,\n title,\n force,\n address,\n logo,\n distance,\n provider,\n is_public,\n description,\n }),\n timeout: delay(10000),\n cancel: take(EDITOR_ACTIONS.RESET_SAVE_DIALOG),\n });\n\n yield put(editorSetSave({ loading: false }));\n\n if (cancel) return yield put(editorChangeMode(MODES.NONE));\n\n if (result && result.data.code === 'already_exist')\n return yield put(editorSetSave({ overwriting: true }));\n\n if (result && result.data.code === 'conflict')\n return yield put(\n editorSetSave({\n error: TIPS.SAVE_EXISTS,\n loading: false,\n overwriting: false,\n finished: false,\n }),\n );\n\n if (timeout || !result || !result.data.route || !result.data.route.address)\n return yield put(\n editorSetSave({\n error: TIPS.SAVE_TIMED_OUT,\n loading: false,\n overwriting: false,\n finished: false,\n }),\n );\n\n yield put(\n mapSet({\n address: result.data.route.address,\n title: result.data.route.title,\n is_public: result.data.route.is_public,\n description: result.data.route.description,\n }),\n );\n\n yield put(editorSetReady(false));\n pushPath(`/${address}/edit`);\n yield put(editorSetReady(true));\n\n yield put(\n editorSetSave({\n error: TIPS.SAVE_SUCCESS,\n loading: false,\n overwriting: false,\n finished: true,\n }),\n );\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* setChanged() {\n const { changed } = yield select(selectEditor);\n if (changed) return;\n\n yield put(editorSetChanged(true));\n}\n\nexport function* mapSaga() {\n yield takeEvery(\n [MAP_ACTIONS.SET_ROUTE, MAP_ACTIONS.SET_STICKER, MAP_ACTIONS.SET_STICKERS, MAP_ACTIONS.ADD_STICKER],\n setChanged,\n );\n\n yield takeEvery(EDITOR_ACTIONS.START_EDITING, startEditingSaga);\n yield takeEvery(EDITOR_ACTIONS.SET_ACTIVE_STICKER, setActiveStickerSaga);\n yield takeEvery(MAP_ACTIONS.MAP_CLICKED, onMapClick);\n yield takeEvery(MAP_ACTIONS.SET_TITLE, setTitleSaga);\n yield takeLatest(EDITOR_ACTIONS.SEND_SAVE_REQUEST, sendSaveRequestSaga);\n\n yield takeEvery(\n [\n EDITOR_ACTIONS.CLEAR_POLY,\n EDITOR_ACTIONS.CLEAR_STICKERS,\n EDITOR_ACTIONS.CLEAR_ALL,\n EDITOR_ACTIONS.CLEAR_CANCEL,\n ],\n clearSaga,\n );\n}\n","import { REHYDRATE, RehydrateAction } from 'redux-persist';\nimport { call, delay, put, select, takeEvery, takeLatest } from 'redux-saga/effects';\nimport {\n checkIframeToken,\n checkUserToken,\n dropRoute,\n getGuestToken,\n getRouteList,\n modifyRoute,\n sendRouteStarred,\n} from '~/utils/api';\nimport * as ActionCreators from '~/redux/user/actions';\nimport {\n mapsSetShift,\n searchChangeDistance,\n searchPutRoutes,\n searchSetLoading,\n searchSetTab,\n searchSetTitle,\n setRouteStarred,\n setUser,\n userLogin,\n} from '~/redux/user/actions';\n\nimport { parseQuery, pushLoaderState, pushNetworkInitError } from '~/utils/history';\nimport { USER_ACTIONS } from '~/redux/user/constants';\nimport { DEFAULT_USER } from '~/constants/auth';\n\nimport { DIALOGS, TABS } from '~/constants/dialogs';\nimport { Unwrap } from '~/utils/middleware';\nimport { selectUser, selectUserUser } from './selectors';\nimport { mapInitSaga } from '~/redux/map/sagas';\nimport { editorSetDialog, editorSetDialogActive } from '../editor/actions';\nimport { selectEditor } from '../editor/selectors';\n\nfunction* generateGuestSaga() {\n try {\n const {\n data: { user, random_url },\n }: Unwrap = yield call(getGuestToken);\n\n yield put(setUser({ ...user, random_url }));\n\n return { ...user, random_url };\n } catch(e) {\n console.log(e)\n }\n}\n\nfunction* authCheckSaga({ key }: RehydrateAction) {\n try {\n if (key !== 'user') return;\n\n pushLoaderState(70);\n\n const { id, token }: ReturnType = yield select(selectUserUser);\n const { ready }: ReturnType = yield select(selectEditor);\n\n if (window.location.search || true) {\n const { viewer_id, auth_key } = yield parseQuery(window.location.search);\n\n if (viewer_id && auth_key && id !== `vk:${viewer_id}`) {\n const user = yield call(checkIframeToken, { viewer_id, auth_key });\n\n if (user) {\n yield put(setUser(user));\n\n pushLoaderState(99);\n\n return yield call(mapInitSaga);\n }\n }\n }\n\n if (id && token) {\n const {\n data: { user, random_url },\n }: Unwrap = yield call(checkUserToken, {\n id,\n token,\n });\n\n if (user) {\n yield put(setUser({ ...user, random_url }));\n\n pushLoaderState(99);\n\n return yield call(mapInitSaga);\n } else if (!ready) {\n pushNetworkInitError();\n return;\n }\n }\n\n yield call(generateGuestSaga);\n\n pushLoaderState(80);\n\n return yield call(mapInitSaga);\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* gotVkUserSaga({ user: u }: ReturnType) {\n const {\n data: { user, random_url },\n }: Unwrap = yield call(checkUserToken, u);\n\n yield put(setUser({ ...user, random_url }));\n yield put(userLogin());\n}\n\nfunction* searchGetRoutes() {\n try {\n const {\n routes: {\n step,\n shift,\n filter: { title, distance, tab },\n },\n }: ReturnType = yield select(selectUser);\n\n const result: Unwrap = yield getRouteList({\n search: title,\n min: distance[0],\n max: distance[1],\n step,\n shift,\n tab,\n });\n\n return result;\n } catch (e) {\n console.log(e);\n }\n}\n\nexport function* searchSetSagaWorker() {\n try {\n const {\n routes: { filter },\n }: ReturnType = yield select(selectUser);\n\n const {\n data: {\n routes,\n limits: { min, max, count: limit },\n filter: { shift, step },\n },\n }: Unwrap = yield call(searchGetRoutes);\n\n yield put(searchPutRoutes({ list: routes, min, max, limit, shift, step }));\n\n // change distange range if needed and load additional data\n if (\n (filter.min > min && filter.distance[0] <= filter.min) ||\n (filter.max < max && filter.distance[1] >= filter.max)\n ) {\n yield put(\n searchChangeDistance([\n filter.min > min && filter.distance[0] <= filter.min ? min : filter.distance[0],\n filter.max < max && filter.distance[1] >= filter.max ? max : filter.distance[1],\n ]),\n );\n }\n\n return yield put(searchSetLoading(false));\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* searchSetSaga() {\n yield put(searchSetLoading(true));\n yield put(mapsSetShift(0));\n yield delay(300);\n yield call(searchSetSagaWorker);\n}\n\nfunction* openMapDialogSaga({ tab }: ReturnType) {\n try {\n const {\n routes: {\n filter: { tab: current },\n },\n }: ReturnType = yield select(selectUser);\n\n const { dialog_active }: ReturnType = yield select(selectEditor);\n\n if (dialog_active && tab === current) {\n return yield put(editorSetDialogActive(false));\n }\n\n if (tab !== current) {\n yield put(searchSetTab(tab));\n }\n\n yield put(editorSetDialog(DIALOGS.MAP_LIST));\n yield put(editorSetDialogActive(true));\n\n return tab;\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* searchSetTabSaga() {\n yield put(searchChangeDistance([0, 10000]));\n yield put(searchPutRoutes({ list: [], min: 0, max: 10000, step: 20, shift: 0 }));\n\n yield put(searchSetTitle(''));\n}\n\nfunction* userLogoutSaga() {\n yield put(setUser(DEFAULT_USER));\n yield call(generateGuestSaga);\n}\n\nfunction* setUserSaga() {\n const { dialog_active }: ReturnType = yield select(selectEditor);\n\n if (dialog_active) yield call(searchSetSagaWorker);\n\n return true;\n}\n\nfunction* mapsLoadMoreSaga() {\n try {\n const {\n routes: { limit, list, shift, step, loading, filter },\n }: ReturnType = yield select(selectUser);\n\n if (loading || list.length >= limit || limit === 0) return;\n\n yield delay(50);\n\n yield put(searchSetLoading(true));\n yield put(mapsSetShift(shift + step));\n\n const {\n data: {\n limits: { min, max, count },\n filter: { shift: resp_shift, step: resp_step },\n routes,\n },\n }: Unwrap = yield call(searchGetRoutes);\n\n if (\n (filter.min > min && filter.distance[0] <= filter.min) ||\n (filter.max < max && filter.distance[1] >= filter.max)\n ) {\n yield put(\n searchChangeDistance([\n filter.min > min && filter.distance[0] <= filter.min ? min : filter.distance[0],\n filter.max < max && filter.distance[1] >= filter.max ? max : filter.distance[1],\n ]),\n );\n }\n\n yield put(\n searchPutRoutes({\n min,\n max,\n limit: count,\n shift: resp_shift,\n step: resp_step,\n list: [...list, ...routes],\n }),\n );\n yield put(searchSetLoading(false));\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* dropRouteSaga({ address }: ReturnType) {\n try {\n const {\n routes: {\n list,\n step,\n shift,\n limit,\n filter: { min, max },\n },\n }: ReturnType = yield select(selectUser);\n\n const index = list.findIndex(el => el.address === address);\n\n if (index >= 0) {\n yield put(\n searchPutRoutes({\n list: list.filter(el => el.address !== address),\n min,\n max,\n step,\n shift: shift > 0 ? shift - 1 : 0,\n limit: limit > 0 ? limit - 1 : limit,\n }),\n );\n }\n\n return yield call(dropRoute, { address });\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* modifyRouteSaga({\n address,\n title,\n is_public,\n}: ReturnType) {\n try {\n const {\n routes: {\n list,\n step,\n shift,\n limit,\n filter: { min, max },\n },\n }: ReturnType = yield select(selectUser);\n\n const index = list.findIndex(el => el.address === address);\n\n if (index >= 0) {\n yield put(\n searchPutRoutes({\n list: list.map(el => (el.address !== address ? el : { ...el, title, is_public })),\n min,\n max,\n step,\n shift: shift > 0 ? shift - 1 : 0,\n limit: limit > 0 ? limit - 1 : limit,\n }),\n );\n }\n\n return yield call(modifyRoute, { address, title, is_public });\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* toggleRouteStarredSaga({\n address,\n}: ReturnType) {\n try {\n const {\n routes: { list },\n }: ReturnType = yield select(selectUser);\n\n const route = list.find(el => el.address === address);\n\n yield put(setRouteStarred(address, !route?.is_published));\n\n const result = yield sendRouteStarred({\n address,\n is_published: !route?.is_published,\n });\n\n if (!result) return yield put(setRouteStarred(address, !!route?.is_published));\n } catch (e) {\n console.log(e);\n }\n}\n\nexport function* updateUserRoutes() {\n yield put(searchSetTab(TABS.MY));\n}\n\nexport function* userSaga() {\n yield takeEvery(REHYDRATE, authCheckSaga);\n\n yield takeEvery(USER_ACTIONS.USER_LOGOUT, userLogoutSaga);\n yield takeLatest(USER_ACTIONS.GOT_VK_USER, gotVkUserSaga);\n\n yield takeLatest(\n [USER_ACTIONS.SEARCH_SET_TITLE, USER_ACTIONS.SEARCH_SET_DISTANCE],\n searchSetSaga,\n );\n\n yield takeLatest(USER_ACTIONS.OPEN_MAP_DIALOG, openMapDialogSaga);\n yield takeLatest(USER_ACTIONS.SEARCH_SET_TAB, searchSetTabSaga);\n yield takeLatest(USER_ACTIONS.SET_USER, setUserSaga);\n\n yield takeLatest(USER_ACTIONS.MAPS_LOAD_MORE, mapsLoadMoreSaga);\n\n yield takeLatest(USER_ACTIONS.DROP_ROUTE, dropRouteSaga);\n yield takeLatest(USER_ACTIONS.MODIFY_ROUTE, modifyRouteSaga);\n yield takeLatest(USER_ACTIONS.TOGGLE_ROUTE_STARRED, toggleRouteStarredSaga);\n\n yield takeLatest([USER_ACTIONS.USER_LOGIN, USER_ACTIONS.USER_LOGOUT], updateUserRoutes);\n}\n","import { MAP_ACTIONS } from './constants';\nimport { IMapReducer } from '.';\nimport {\n mapSet,\n mapSetProvider,\n mapSetRoute,\n mapSetSticker,\n mapAddSticker,\n mapSetTitle,\n mapSetAddress,\n mapSetDescription,\n mapSetOwner,\n mapSetPublic,\n mapSetLogo,\n mapSetAddressOrigin,\n mapSetStickers,\n mapZoomChange,\n} from './actions';\n\nconst setMap = (state: IMapReducer, { map }: ReturnType): IMapReducer => ({\n ...state,\n ...map,\n});\n\nconst setProvider = (\n state: IMapReducer,\n { provider }: ReturnType\n): IMapReducer => ({\n ...state,\n provider,\n});\n\nconst setRoute = (state: IMapReducer, { route }: ReturnType): IMapReducer => ({\n ...state,\n route,\n});\n\nconst setStickers = (\n state: IMapReducer,\n { stickers }: ReturnType\n): IMapReducer => ({\n ...state,\n stickers,\n});\n\nconst setSticker = (\n state: IMapReducer,\n { sticker, index }: ReturnType\n): IMapReducer => ({\n ...state,\n stickers: state.stickers.map((item, i) => (i === index ? sticker : item)),\n});\n\nconst dropSticker = (\n state: IMapReducer,\n { index }: ReturnType\n): IMapReducer => ({\n ...state,\n stickers: state.stickers.filter((_, i) => i !== index),\n});\n\nconst addSticker = (\n state: IMapReducer,\n { sticker }: ReturnType\n): IMapReducer => ({\n ...state,\n stickers: [...state.stickers, sticker],\n});\n\nconst setTitle = (state: IMapReducer, { title }: ReturnType): IMapReducer => ({\n ...state,\n title,\n});\n\nconst setAddress = (state: IMapReducer, { address }: ReturnType): IMapReducer => ({\n ...state,\n address,\n});\n\nconst setDescription = (state: IMapReducer, { description }: ReturnType): IMapReducer => ({\n ...state,\n description,\n});\n\nconst setOwner = (state: IMapReducer, { owner }: ReturnType): IMapReducer => ({\n ...state,\n owner,\n});\n\nconst setPublic = (state: IMapReducer, { is_public }: ReturnType): IMapReducer => ({\n ...state,\n is_public,\n});\n\nconst setLogo = (state: IMapReducer, { logo }: ReturnType): IMapReducer => ({\n ...state,\n logo,\n});\n\nconst setAddressOrigin = (state, { address_origin }: ReturnType): IMapReducer => ({\n ...state,\n address_origin\n});\n\nconst zoomChange = (state, { zoom }: ReturnType): IMapReducer => ({\n ...state,\n zoom\n});\n\nexport const MAP_HANDLERS = {\n [MAP_ACTIONS.SET_MAP]: setMap,\n [MAP_ACTIONS.SET_PROVIDER]: setProvider,\n [MAP_ACTIONS.SET_ROUTE]: setRoute,\n [MAP_ACTIONS.SET_STICKER]: setSticker,\n [MAP_ACTIONS.SET_STICKERS]: setStickers,\n [MAP_ACTIONS.DROP_STICKER]: dropSticker,\n [MAP_ACTIONS.ADD_STICKER]: addSticker,\n [MAP_ACTIONS.SET_TITLE]: setTitle,\n [MAP_ACTIONS.SET_ADDRESS]: setAddress,\n [MAP_ACTIONS.SET_DESCRIPTION]: setDescription,\n [MAP_ACTIONS.SET_OWNER]: setOwner,\n [MAP_ACTIONS.SET_PUBLIC]: setPublic,\n [MAP_ACTIONS.SET_LOGO]: setLogo,\n [MAP_ACTIONS.SET_ADDRESS_ORIGIN]: setAddressOrigin,\n [MAP_ACTIONS.ZOOM_CHANGE]: zoomChange,\n};\n","import { createReducer } from '~/utils/reducer';\nimport { MAP_HANDLERS } from './handlers';\nimport { DEFAULT_PROVIDER } from '~/constants/providers';\nimport { IMapRoute } from './types';\nimport { IStickerDump } from '~/redux/map/types';\nimport { DEFAULT_LOGO } from '~/constants/logos';\n\nexport interface IMapReducer {\n provider: string;\n route: IMapRoute;\n stickers: IStickerDump[];\n title: string;\n logo: string;\n address: string;\n address_origin: string;\n description: string;\n owner: { id: string };\n is_public: boolean;\n zoom: number;\n}\n\nexport const MAP_INITIAL_STATE: IMapReducer = {\n provider: DEFAULT_PROVIDER,\n logo: DEFAULT_LOGO,\n route: [],\n stickers: [],\n title: '',\n address: '',\n address_origin: '',\n description: '',\n owner: { id: '' },\n is_public: false,\n zoom: 13,\n}\n\nexport const map = createReducer(MAP_INITIAL_STATE, MAP_HANDLERS)\n","import { MOBILE_BREAKPOINT } from '~/config/frontend';\nimport { LatLngLiteral } from 'leaflet';\n\nexport const isMobile = (): boolean => window.innerWidth <= MOBILE_BREAKPOINT;\n\nexport const getLocation = (callback: (pos: LatLngLiteral | undefined) => void) => {\n window.navigator.geolocation.getCurrentPosition(position => {\n if (!position || !position.coords || !position.coords.latitude || !position.coords.longitude)\n return callback(undefined);\n\n const { latitude: lat, longitude: lng } = position.coords;\n\n callback({ lat, lng });\n return;\n });\n};\n\nexport const watchLocation = (callback: (pos: LatLngLiteral | undefined) => void): number => {\n return window.navigator.geolocation.watchPosition(\n position => {\n if (!position || !position.coords || !position.coords.latitude || !position.coords.longitude)\n return callback(undefined);\n\n const { latitude: lat, longitude: lng } = position.coords;\n\n callback({ lat, lng });\n return;\n },\n () => callback(undefined),\n {\n timeout: 30,\n }\n );\n};\n","import { applyMiddleware, combineReducers, compose, createStore, Store } from 'redux';\n\nimport { persistReducer, persistStore } from 'redux-persist';\nimport storage from 'redux-persist/lib/storage';\nimport createSagaMiddleware from 'redux-saga';\n\nimport { createBrowserHistory } from 'history';\nimport { editorLocationChanged } from '~/redux/editor/actions';\nimport { PersistConfig, Persistor } from 'redux-persist/es/types';\n\nimport { IRootReducer, userReducer } from '~/redux/user';\nimport { userSaga } from '~/redux/user/sagas';\n\nimport { editor, IEditorState } from '~/redux/editor';\nimport { editorSaga } from '~/redux/editor/sagas';\n\nimport { IMapReducer, map } from '~/redux/map';\nimport { mapSaga } from '~/redux/map/sagas';\nimport { watchLocation } from '~/utils/window';\nimport { LatLngLiteral } from 'leaflet';\nimport { setUserLocation, userLogout } from './user/actions';\nimport { MainMap } from '~/constants/map';\nimport { mapZoomChange } from './map/actions';\nimport { assocPath } from 'ramda';\nimport { AxiosError } from 'axios';\nimport { api } from '~/utils/api/instance';\n\nconst mapPersistConfig: PersistConfig = {\n key: 'map',\n whitelist: ['logo', 'provider'],\n storage,\n};\n\nconst userPersistConfig: PersistConfig = {\n key: 'user',\n whitelist: ['user', 'logo', 'provider', 'speed'],\n storage,\n};\n\nconst editorPersistConfig: PersistConfig = {\n key: 'editor',\n whitelist: ['gpx'],\n storage,\n};\n\nexport interface IState {\n user: IRootReducer;\n map: IMapReducer;\n editor: IEditorState;\n}\n// create the saga middleware\nexport const sagaMiddleware = createSagaMiddleware();\n\n// redux extension composer\nconst composeEnhancers =\n typeof window === 'object' && (window).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n ? (window).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({})\n : compose;\n\nexport const store = createStore(\n combineReducers({\n user: persistReducer(userPersistConfig, userReducer),\n editor: persistReducer(editorPersistConfig, editor),\n map: persistReducer(mapPersistConfig, map),\n }),\n composeEnhancers(applyMiddleware(sagaMiddleware))\n);\n\nexport function configureStore(): { store: Store; persistor: Persistor } {\n sagaMiddleware.run(userSaga);\n sagaMiddleware.run(mapSaga);\n sagaMiddleware.run(editorSaga);\n\n const persistor = persistStore(store);\n\n // Pass token to axios\n api.interceptors.request.use(options => {\n const token = store.getState().user.user.token;\n\n if (!token) {\n return options;\n }\n\n return assocPath(['headers', 'authorization'], token, options);\n });\n\n // Logout on 401\n api.interceptors.response.use(undefined, (error: AxiosError<{ error: string }>) => {\n if (error.response?.status === 401) {\n store.dispatch(userLogout());\n }\n\n error.message = error?.response?.data?.error || error?.response?.statusText || error.message;\n\n throw error;\n });\n\n return { store, persistor };\n}\n\nexport const history = createBrowserHistory();\n\nhistory.listen((location, action) => {\n if (action === 'REPLACE') return;\n store.dispatch(editorLocationChanged(location.pathname));\n});\n\nwatchLocation((location: LatLngLiteral | undefined) => store.dispatch(setUserLocation(location)));\nMainMap.on('zoomend', event => store.dispatch(mapZoomChange(event.target._zoom)))\n","import { history } from '~/redux/store';\nimport { API_RETRY_INTERVAL } from '~/constants/api';\n\nexport const getPath = (): string => (window.location && window.location.pathname);\nexport const pushPath = (url: string): string => history.push(url);\nexport const replacePath = (url: string): string => history.replace(url);\n\nexport const getUrlData = (url = getPath()) => {\n const [, path, mode] = url.split('/');\n const { host, hash, protocol } = window.location;\n\n return {\n path, mode, host, hash, protocol,\n };\n};\n\n// Parses query string\nexport const parseQuery = (queryString: string) => {\n let params = {};\n const queries = decodeURIComponent(queryString)\n .substring(queryString.substr(0, 1) === '?' ? 1 : 0)\n .split('&');\n for (let i = 0, l = queries.length; i < l; i += 1) {\n const temp = queries[i].split('=');\n params = { ...params, [temp[0]]: temp[1] };\n }\n return params;\n};\n\nexport const pushLoaderState = (state: number) => {\n document.getElementById('loader-bar')!.style.width = `${state}%`;\n};\n\nexport const countDownToRefresh = (left: number = API_RETRY_INTERVAL): void => {\n if (left <= 0) return document.location.reload();\n\n document.getElementById('loader-bar')!.style.width = `${(left / API_RETRY_INTERVAL) * 100}%`;\n setTimeout(() => countDownToRefresh(left - 0.25), 1000);\n};\n\nexport const pushNetworkInitError = () => {\n document.getElementById('loader-bar')!.classList.add('is_failed');\n document.getElementById('loader-bar')!.style.width = '100%';\n document.getElementById('loader-error')!.style.opacity = String(1);\n\n countDownToRefresh();\n};\n\nexport const copyToClipboard = str => {\n const el = document.createElement('textarea');\n el.value = str;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.select();\n document.execCommand('copy');\n document.body.removeChild(el);\n};\n","// @flow\nimport React from 'react';\nimport classnames from 'classnames';\n\ntype Props = {\n active: boolean,\n onPress?: () => void,\n}\nexport const Switch = ({ active, onPress = () => {} }: Props) => (\n \n);\n","import React from 'react';\nimport { copyToClipboard, getUrlData } from '~/utils/history';\nimport { toTranslit, parseDesc } from '~/utils/format';\nimport { TIPS } from '~/constants/tips';\nimport { Icon } from '~/components/panels/Icon';\nimport { Switch } from '~/components/Switch';\n\nimport classnames from 'classnames';\nimport { connect } from 'react-redux';\nimport { selectMap } from '~/redux/map/selectors';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { selectEditorSave } from '~/redux/editor/selectors';\nimport { MODES } from '~/constants/modes';\n\nconst mapStateToProps = state => ({\n map: selectMap(state),\n save: selectEditorSave(state),\n});\n\nconst mapDispatchToProps = {\n editorCancelSave: EDITOR_ACTIONS.editorCancelSave,\n editorChangeMode: EDITOR_ACTIONS.editorChangeMode,\n editorSendSaveRequest: EDITOR_ACTIONS.editorSendSaveRequest,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & { };\n\ninterface State {\n address: string;\n title: string;\n is_public: boolean;\n description: string;\n}\n\nclass SaveDialogUnconnected extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n address: props.map.address || '',\n title: props.map.title || '',\n is_public: props.map.is_public || false,\n description: props.map.description || '',\n };\n }\n\n getAddress = () => {\n const { path } = getUrlData();\n const { title, address } = this.state;\n\n return (\n toTranslit(address.trim()) ||\n toTranslit(title.trim().toLowerCase()).substr(0, 32) ||\n toTranslit(path.trim()).substr(0, 32)\n );\n };\n\n setTitle = ({ target: { value } }) =>\n this.setState({ title: (value && value.substr(0, 64)) || '' });\n\n setAddress = ({ target: { value } }) =>\n this.setState({ address: (value && value.substr(0, 32)) || '' });\n\n setDescription = ({ target: { value } }) =>\n this.setState({ description: (value && value.substr(0, 256)) || '' });\n\n editorSendSaveRequest = (e, force = false) => {\n const { title, is_public, description } = this.state;\n const address = this.getAddress();\n\n this.props.editorSendSaveRequest({\n title,\n address,\n force,\n is_public,\n description,\n });\n };\n\n forceSaveRequest = e => this.editorSendSaveRequest(e, true);\n\n cancelSaving = () => this.props.editorChangeMode(MODES.NONE);\n\n onCopy = e => {\n e.preventDefault();\n const { host, protocol } = getUrlData();\n copyToClipboard(`${protocol}//${host}/${this.getAddress()}`);\n };\n\n togglePublic = () => {\n this.setState({ is_public: !this.state.is_public });\n };\n\n componentWillUnmount = () => {\n this.props.editorCancelSave()\n };\n\n render() {\n const { title, is_public, description } = this.state;\n const {\n save: { error, finished, overwriting, loading },\n } = this.props;\n const { host, protocol } = getUrlData();\n\n return (\n
\n
\n
\n\n
\n
\n
Название
\n \n
\n
\n\n
\n
\n \n \n
\n \n
\n
\n\n
\n \n
\n
{error || TIPS.SAVE_INFO}
\n\n
\n \n \n {is_public ? ' В каталоге карт' : ' Только по ссылке'}\n
\n
\n {!finished && (\n
\n Отмена\n
\n )}\n {!finished && !overwriting && (\n
\n Сохранить\n
\n )}\n {overwriting && (\n
\n Перезаписать\n
\n )}\n {finished && (\n
\n Скопировать\n
\n )}\n {finished && (\n
\n Отлично!\n
\n )}\n
\n
\n
\n
\n
\n );\n }\n}\n\nconst SaveDialog = connect(mapStateToProps, mapDispatchToProps)(SaveDialogUnconnected);\n\nexport { SaveDialog };\n","import React from 'react';\n\nimport { MODES } from '~/constants/modes';\nimport { Icon } from '~/components/panels/Icon';\nimport { editorChangeMode, editorStopEditing } from '~/redux/editor/actions';\nimport { connect } from 'react-redux';\n\nconst mapStateToProps = () => ({});\nconst mapDispatchToProps = {\n editorChangeMode,\n editorStopEditing,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & { };\n\nclass CancelDialogUnconnected extends React.Component {\n cancel = () => {\n this.props.editorStopEditing();\n };\n\n proceed = () => {\n this.props.editorChangeMode(MODES.NONE);\n };\n\n render() {\n return (\n
\n
\n
\n \n
Закрыть редактор?
\n
\n
\n
\n
\n
\n
\n Удалить измения\n
\n\n
\n Вернуться\n
\n
\n
\n
\n );\n }\n}\n\nexport const CancelDialog = connect(mapStateToProps, mapDispatchToProps)(CancelDialogUnconnected)","import React, { FC, memo } from 'react';\nimport { IGpxRoute } from '~/redux/editor';\nimport { Switch } from '../Switch';\nimport { Icon } from '../panels/Icon';\nimport classnames from 'classnames';\n\ninterface IProps {\n item: IGpxRoute;\n index: number;\n enabled: boolean;\n\n onFocusRoute: (i: number) => void;\n onRouteDrop: (i: number) => void;\n onRouteToggle: (i: number) => void;\n onRouteColor: (i: number) => void;\n onRouteReplace: (i: number) => void;\n}\n\nconst GpxDialogRow: FC = memo(\n ({\n item,\n index,\n enabled,\n onRouteToggle,\n onFocusRoute,\n onRouteDrop,\n onRouteColor,\n onRouteReplace,\n }) => {\n return (\n
\n onRouteColor(index)}\n />\n\n
onFocusRoute(index)}>\n {item.name}\n
\n\n
\n
onRouteReplace(index)}>\n \n
\n\n
onRouteDrop(index)}>\n \n
\n\n
\n onRouteToggle(index)} />\n
\n
\n
\n );\n }\n);\n\nexport { GpxDialogRow };\n","import React, { FC, useCallback, ChangeEvent } from 'react';\nimport { connect } from 'react-redux';\nimport { IState } from '~/redux/store';\nimport { selectEditorGpx } from '~/redux/editor/selectors';\nimport { GpxDialogRow } from '~/components/gpx/GpxDialogRow';\nimport { GpxConfirm } from '~/components/gpx/GpxConfirm';\nimport { MainMap } from '~/constants/map';\nimport { latLngBounds } from 'leaflet';\nimport { Switch } from '../Switch';\nimport { selectMapRoute, selectMapTitle, selectMapAddress } from '~/redux/map/selectors';\nimport classNames from 'classnames';\nimport uuid from 'uuid';\nimport { getUrlData } from '~/utils/history';\nimport { getRandomColor } from '~/utils/dom';\n\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport * as MAP_ACTIONS from '~/redux/map/actions';\nimport { simplify } from '~/utils/simplify';\n\nconst mapStateToProps = (state: IState) => ({\n gpx: selectEditorGpx(state),\n route: selectMapRoute(state),\n title: selectMapTitle(state),\n address: selectMapAddress(state),\n});\n\nconst mapDispatchToProps = {\n editorDropGpx: EDITOR_ACTIONS.editorDropGpx,\n editorUploadGpx: EDITOR_ACTIONS.editorUploadGpx,\n editorSetGpx: EDITOR_ACTIONS.editorSetGpx,\n editorGetGPXTrack: EDITOR_ACTIONS.editorGetGPXTrack,\n mapSetRoute: MAP_ACTIONS.mapSetRoute,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst GpxDialogUnconnected: FC = ({\n title,\n address,\n gpx,\n route,\n editorGetGPXTrack,\n editorSetGpx,\n editorUploadGpx,\n mapSetRoute,\n}) => {\n const toggleGpx = useCallback(() => {\n editorSetGpx({ enabled: !gpx.enabled });\n }, [gpx, editorSetGpx]);\n\n const onGpxUpload = useCallback(\n (event: ChangeEvent) => {\n if (!event.target || !event.target.files || event.target.files.length === 0) {\n return;\n }\n\n editorUploadGpx(event.target.files[0]);\n },\n [editorUploadGpx]\n );\n\n const onFocusRoute = useCallback(\n index => {\n if (!gpx.list[index] || !gpx.list[index].latlngs) return;\n\n const bounds = latLngBounds(gpx.list[index].latlngs);\n MainMap.fitBounds(bounds);\n },\n [gpx, MainMap]\n );\n\n const onRouteDrop = useCallback(\n index => {\n editorSetGpx({ list: gpx.list.filter((el, i) => i !== index) });\n },\n [gpx, editorSetGpx]\n );\n\n const onRouteColor = useCallback(\n index => {\n if (!gpx.enabled) return;\n editorSetGpx({\n list: gpx.list.map((el, i) => (i !== index ? el : { ...el, color: getRandomColor() })),\n });\n },\n [gpx, editorSetGpx]\n );\n\n const onRouteToggle = useCallback(\n index => {\n if (!gpx.enabled) return;\n\n editorSetGpx({\n list: gpx.list.map((el, i) => (i !== index ? el : { ...el, enabled: !el.enabled })),\n });\n },\n [gpx, editorSetGpx]\n );\n\n const addCurrent = useCallback(() => {\n if (!route.length) return;\n\n const { path } = getUrlData();\n\n editorSetGpx({\n list: [\n ...gpx.list,\n {\n latlngs: route,\n enabled: false,\n name: title || address || path,\n id: uuid(),\n color: getRandomColor(),\n },\n ],\n });\n }, [route, gpx, editorSetGpx]);\n\n const onRouteReplace = useCallback(\n (i: number) => {\n mapSetRoute(simplify(gpx.list[i].latlngs));\n\n editorSetGpx({\n list: gpx.list.map((el, index) => (i !== index ? el : { ...el, enabled: false })),\n });\n },\n [gpx, mapSetRoute, editorSetGpx]\n );\n\n return (\n
\n
\n
Треки
\n \n
\n\n {gpx.list.map((item, index) => (\n \n ))}\n\n
\n \n\n \n Добавить текущий\n
\n\n \n Скачать текущий\n
\n
\n
\n );\n};\n\nconst GpxDialog = connect(mapStateToProps, mapDispatchToProps)(GpxDialogUnconnected);\n\nexport { GpxDialog };\n","import React from 'react';\nimport { PROVIDERS, replaceProviderUrl } from '~/constants/providers';\nimport { Icon } from '~/components/panels/Icon';\nimport classnames from 'classnames';\nimport * as MAP_ACTIONS from \"~/redux/map/actions\";\nimport { selectMapProvider } from '~/redux/map/selectors';\nimport { connect } from 'react-redux';\n\nconst mapStateToProps = state => ({\n provider: selectMapProvider(state),\n});\n\nconst mapDispatchToProps = {\n mapSetProvider: MAP_ACTIONS.mapSetProvider,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst ProviderDialogUnconnected = ({ provider, mapSetProvider }: Props) => (\n
\n
\n {\n Object.keys(PROVIDERS).map(item => (\n mapSetProvider(item)}\n key={PROVIDERS[item]?.name}\n >\n {\n provider === item &&\n
\n \n
\n }\n
\n ))\n }\n
\n
\n);\n\nconst ProviderDialog = connect(mapStateToProps, mapDispatchToProps)(ProviderDialogUnconnected)\n\nexport { ProviderDialog }\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { selectEditorRenderer } from '~/redux/editor/selectors';\n\nconst mapStateToProps = state => ({\n renderer: selectEditorRenderer(state),\n});\n\ntype Props = ReturnType & {};\n\nconst ShotPrefetchDialogUnconnected = ({ renderer: { info, progress }}: Props) => (\n
\n
\n
{info}
\n
\n
\n
\n
\n
\n
\n
\n);\n\nconst ShotPrefetchDialog = connect(mapStateToProps)(ShotPrefetchDialogUnconnected);\n\nexport { ShotPrefetchDialog }","import React, { createElement } from 'react';\nimport { MODES } from '~/constants/modes';\n\nimport { RouterDialog } from '~/components/dialogs/RouterDialog';\nimport { PolylineDialog } from '~/components/dialogs/PolylineDialog';\nimport { StickersDialog } from '~/components/dialogs/StickersDialog';\nimport { TrashDialog } from '~/components/dialogs/TrashDialog';\nimport { LogoDialog } from '~/components/dialogs/LogoDialog';\nimport { SaveDialog } from '~/components/dialogs/SaveDialog';\nimport { CancelDialog } from '~/components/dialogs/CancelDialog';\nimport { GpxDialog } from '~/components/dialogs/GpxDialog';\n\nimport { connect } from 'react-redux';\n\nimport { ProviderDialog } from '~/components/dialogs/ProviderDialog';\nimport { ShotPrefetchDialog } from '~/components/dialogs/ShotPrefetchDialog';\nimport { selectEditorMode } from '~/redux/editor/selectors';\n\nconst mapStateToProps = state => ({ mode: selectEditorMode(state) });\n\ntype Props = ReturnType & {\n width: number;\n};\n\nconst DIALOG_CONTENTS: { [x: string]: any } = {\n [MODES.ROUTER]: RouterDialog,\n [MODES.STICKERS_SELECT]: StickersDialog,\n [MODES.TRASH]: TrashDialog,\n [MODES.LOGO]: LogoDialog,\n [MODES.SAVE]: SaveDialog,\n [MODES.CONFIRM_CANCEL]: CancelDialog,\n [MODES.PROVIDER]: ProviderDialog,\n [MODES.SHOT_PREFETCH]: ShotPrefetchDialog,\n [MODES.POLY]: PolylineDialog,\n [MODES.GPX]: GpxDialog,\n};\n\nconst EditorDialogUnconnected = (props: Props) =>\n props.mode && DIALOG_CONTENTS[props.mode] ? createElement(DIALOG_CONTENTS[props.mode]) : null;\n\nconst EditorDialog = connect(mapStateToProps)(EditorDialogUnconnected);\n\nexport { EditorDialog };\n","import React from 'react';\nimport classnames from 'classnames';\n\nexport const Tooltip = ({ children, position = 'bottom' }: { children: string, position?: string }) => (\n
\n {children}\n
\n);\n","import React, { PureComponent } from 'react';\nimport { MODES } from '~/constants/modes';\nimport classnames from 'classnames';\n\nimport { Icon } from '~/components/panels/Icon';\nimport { EditorDialog } from '~/components/panels/EditorDialog';\nimport { connect } from 'react-redux';\nimport {\n editorChangeMode,\n editorKeyPressed,\n editorRedo,\n editorStartEditing,\n editorStopEditing,\n editorTakeAShot,\n editorUndo,\n} from '~/redux/editor/actions';\nimport { Tooltip } from '~/components/panels/Tooltip';\nimport { IState } from '~/redux/store';\nimport { selectEditor } from '~/redux/editor/selectors';\nimport { selectMap } from '~/redux/map/selectors';\n\nconst mapStateToProps = (state: IState) => {\n const { mode, changed, editing, features, history } = selectEditor(state);\n const { route, stickers } = selectMap(state);\n return {\n mode,\n changed,\n editing,\n features,\n history,\n route,\n stickers,\n };\n};\n\nconst mapDispatchToProps = {\n editorChangeMode,\n editorStartEditing,\n editorStopEditing,\n editorTakeAShot,\n editorKeyPressed,\n editorUndo,\n editorRedo,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nclass EditorPanelUnconnected extends PureComponent {\n componentDidMount() {\n if (!this.panel) {\n return;\n }\n\n window.addEventListener('keydown', this.onKeyPress as any);\n\n const obj = document.getElementById('control-dialog');\n const { width } = this.panel.getBoundingClientRect();\n\n if (!this.panel || !obj) return;\n\n obj.style.width = String(width);\n }\n\n panel: HTMLDivElement | null = null;\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.onKeyPress as any);\n }\n\n onKeyPress = event => {\n if (event.target.tagName === 'TEXTAREA' || event.target.tagName === 'INPUT') return;\n\n this.props.editorKeyPressed(event);\n };\n\n startPolyMode = () => this.props.editorChangeMode(MODES.POLY);\n startStickerMode = () => this.props.editorChangeMode(MODES.STICKERS_SELECT);\n startRouterMode = () => this.props.editorChangeMode(MODES.ROUTER);\n startTrashMode = () => this.props.editorChangeMode(MODES.TRASH);\n startSaveMode = () => {\n this.props.editorChangeMode(MODES.SAVE);\n };\n\n render() {\n const {\n mode,\n changed,\n editing,\n features: { routing },\n history: { records, position },\n route,\n stickers,\n } = this.props;\n\n const can_undo = records.length > 0 && position > 0;\n const can_redo = records.length && records.length - 1 > position;\n const can_clear = route.length > 0 || stickers.length > 0;\n\n return (\n
\n {\n this.panel = el;\n }}\n >\n \n \n\n \n Вернуть (x)\n \n \n\n \n Очистить (c)\n \n \n
\n\n
\n {routing && (\n \n Автоматический маршрут\n \n \n )}\n\n \n Редактирование маршрута\n \n \n\n \n Точки маршрута\n \n \n
\n\n
\n\n
\n \n\n \n СОХРАНИТЬ\n \n \n
\n
\n\n
\n
\n \n
\n
\n\n \n
\n );\n }\n}\n\nexport const EditorPanel = connect(mapStateToProps, mapDispatchToProps)(EditorPanelUnconnected);\n","import React from 'react';\n\nexport const Fills = () => (\n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n);\n","import React from 'react';\nimport { Icon } from '~/components/panels/Icon';\n\ntype Props = {\n onClick: () => void,\n}\n\nexport const GuestButton = ({ onClick }: Props) => (\n
\n \n \n ВОЙТИ\n \n
\n);\n","import React from 'react';\n\nexport const UserPicture = ({ photo }) => (\n \n);\n","// @flow\nimport React, { FC, memo } from 'react';\nimport { UserPicture } from '~/components/user/UserPicture';\nimport { IUser } from '~/constants/auth';\n\ninterface Props {\n user: IUser;\n setMenuOpened: () => void;\n}\n\nexport const UserButton: FC = memo(({ setMenuOpened, user: { uid, photo, name } }) => (\n
\n
\n \n\n
\n
{name || uid || '...'}
\n
{uid || 'пользователь'}
\n
\n
\n
\n));\n","export const APP_INFO = {\n VERSION: 2,\n RELEASE: 1,\n CHANGELOG: {\n 2: [\n [\n 'Redux, redux-saga', // [26.11.18]\n 'Рисование карт на стороне клиента', // [28.11.18]\n 'Backend на expressjs + mongoose', // [30.11.18]\n 'Импорт данных из старых версий карт', // [06.12.18]\n 'Диалог со списком карт пользователя', // [07.12.18]\n 'Мобильный интерфейс', // [07.12.18]\n 'Приложение для vk', // [11.12.18]\n 'Фильтр в диалоге поиска карт', // [13.12.18]\n 'Экспорт GPX', // [18.02.19]\n 'Улучшенный редактор ломанных', // [23.02.19]\n 'Отметки расстояний и стрелки', // [04.03.19]\n 'Редактирование маршрутов', // [07.03.19]\n ],\n [\n 'Первый коммит', // [15.08.18]\n 'ReactJS для управления интерфейсом', // [15.08.18]\n 'Карта, роутер, стикеры, панели редактора', // [16.08.18]\n 'Выбор логотипа и стиля карты', // [27.08.18]\n 'Переключение режимов, сохранение', // [29.08.18]\n 'Загрузка карт, перерисовка данных, маршруты', // [04.09.18]\n ],\n ],\n 1: [\n [\n 'Первый работающий редактор карт'\n ]\n ]\n }\n};\n","import React from 'react';\nimport { APP_INFO } from '~/constants/app_info';\nimport { userLogout } from \"~/redux/user/actions\";\n\ninterface Props {\n userLogout: typeof userLogout,\n openAppInfoDialog: () => void,\n}\n\nexport const UserMenu = ({ userLogout, openAppInfoDialog }: Props) => (\n
\n
\n ORCHID\n
\n MAP\n \n - {(APP_INFO.VERSION || 1)}.{(Object.keys(APP_INFO.CHANGELOG).length || 0)}\n \n
\n
\n О редакторе карт\n
\n
\n Выйти\n
\n
\n);\n\n/*\n
\n
Мы храним следующие данные о вас:
\n { id &&
ID: {id}
}\n { agent &&
Браузер: {agent}
}\n { ip &&
Адрес: {ip}
}\n
Мы используем их для авторизации и исправления ошибок.
\n
\n */\n","import React from 'react';\nimport { connect } from 'react-redux';\n\nimport classnames from 'classnames';\nimport { getStyle } from '~/utils/dom';\nimport { nearestInt } from '~/utils/geom';\nimport { parseDesc } from '~/utils/format';\nimport { selectMap } from '~/redux/map/selectors';\nimport { selectEditor } from '~/redux/editor/selectors';\n\nconst mapStateToProps = state => ({\n editor: selectEditor(state),\n map: selectMap(state),\n});\n\ntype Props = ReturnType & {\n minLines?: number;\n maxLines?: number;\n};\n\ninterface State {\n raised: boolean;\n height: number;\n height_raised: number;\n}\n\nexport class TitleDialogUnconnected extends React.PureComponent {\n state = {\n raised: false,\n height: 0,\n height_raised: 0,\n };\n\n onHover = () => this.setState({ raised: true });\n onLeave = () => this.setState({ raised: false });\n\n componentDidMount() {\n this.setMaxHeight();\n }\n\n componentDidUpdate() {\n this.setMaxHeight();\n }\n\n setMaxHeight = () => {\n if (!this.ref_sizer || !this.ref_title || !this.ref_text) return 0;\n\n const { height: sizer_height } = this.ref_sizer.getBoundingClientRect();\n const { height: title_height } = this.ref_title.getBoundingClientRect();\n const { height: text_height } = this.ref_text.getBoundingClientRect();\n\n if (text_height === 0) {\n this.setState({ height: 0, height_raised: 0 });\n return;\n }\n\n const title_margin = parseInt(getStyle(this.ref_title, 'margin-bottom'), 10) || 0;\n const text_margins =\n (parseInt(getStyle(this.ref_text, 'margin-top'), 10) || 0) +\n parseInt(getStyle(this.ref_text, 'margin-bottom'), 10) || 0;\n const text_line = parseInt(getStyle(this.ref_text, 'line-height'), 10) || 0;\n\n const container_height = sizer_height - title_height - title_margin - text_margins;\n\n const min_height = (this.props.minLines || 5) * text_line;\n const max_height = (this.props.maxLines || 20) * text_line;\n\n const height =\n nearestInt(Math.min(container_height, Math.min(text_height, min_height)), text_line) +\n text_margins;\n const height_raised =\n nearestInt(Math.min(container_height, Math.min(text_height, max_height)), text_line) +\n text_margins;\n\n this.setState({\n height: height_raised - height < 2 * text_line ? height_raised : height,\n height_raised,\n });\n };\n\n render() {\n const {\n editor: { editing },\n map: { title, description },\n } = this.props;\n const { raised, height, height_raised } = this.state;\n\n return (\n
\n {\n this.ref_sizer = el;\n }}\n >\n \n {\n this.ref_title = el;\n }}\n >\n

{title}

\n
\n\n height,\n })}\n style={{\n height: raised ? height_raised : height,\n marginBottom: height === 0 ? 0 : 15,\n }}\n ref={el => {\n this.ref_overflow = el;\n }}\n >\n {\n this.ref_text = el;\n }}\n >\n {parseDesc(description)}\n
\n
\n
\n \n \n );\n }\n\n ref_sizer;\n ref_title;\n ref_text;\n ref_overflow;\n}\n\nconst TitleDialog = connect(mapStateToProps)(TitleDialogUnconnected);\n\nexport { TitleDialog };\n","import React, { FC, useCallback, useState } from 'react';\nimport { Icon } from '../panels/Icon';\n\ninterface IProps {\n active: boolean;\n onSearch: (search: string) => void;\n}\n\nconst NominatimSearchPanel: FC = ({ active, onSearch }) => {\n const [search, setSearch] = useState('Колывань');\n\n const setValue = useCallback(({ target: { value } }) => setSearch(value), [setSearch]);\n\n const onSubmit = useCallback(event => {\n event.preventDefault();\n \n if (search.length < 3) return;\n\n onSearch(search);\n }, [search, onSearch]);\n\n return (\n
\n
\n
\n \n
\n\n \n
\n
\n );\n};\n\nexport { NominatimSearchPanel };\n","import React, { PureComponent } from 'react';\n\nimport { GuestButton } from '~/components/user/GuestButton';\nimport { DEFAULT_USER, ROLES } from '~/constants/auth';\nimport { UserButton } from '~/components/user/UserButton';\nimport { UserMenu } from '~/components/user/UserMenu';\nimport { setUser, userLogout, gotVkUser, openMapDialog } from '~/redux/user/actions';\nimport {\n editorTakeAShot,\n editorSetDialog,\n editorSetDialogActive,\n editorGetGPXTrack,\n editorSearchNominatim,\n editorChangeMode,\n} from '~/redux/editor/actions';\nimport { connect } from 'react-redux';\nimport { Icon } from '~/components/panels/Icon';\n\nimport classnames from 'classnames';\nimport { CLIENT } from '~/config/frontend';\nimport { DIALOGS, TABS } from '~/constants/dialogs';\nimport { Tooltip } from '~/components/panels/Tooltip';\nimport { TitleDialog } from '~/components/dialogs/TitleDialog';\nimport { NominatimSearchPanel } from '~/components/dialogs/NominatimSearchPanel';\nimport { IState } from '~/redux/store';\nimport { MODES } from '~/constants/modes';\n\nconst mapStateToProps = ({\n user: { user },\n editor: { dialog, dialog_active, features },\n map: { route, stickers },\n}: IState) => ({\n dialog,\n dialog_active,\n user,\n route,\n stickers,\n features,\n});\n\nconst mapDispatchToProps = {\n setUser,\n userLogout,\n editorTakeAShot,\n editorSetDialog,\n gotVkUser,\n editorSetDialogActive,\n openMapDialog,\n editorGetGPXTrack,\n editorSearchNominatim,\n editorChangeMode,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\ninterface State {\n menuOpened: boolean;\n}\n\nexport class UserPanelUnconnected extends PureComponent {\n state = {\n menuOpened: false,\n };\n\n componentDidMount() {\n window.addEventListener('message', (e) => {\n const { data } = e;\n\n if (\n !data ||\n !data.type ||\n data.type !== 'oauth_login' ||\n !data.user ||\n !data.user.id ||\n !data.user.token\n )\n return;\n\n const { id, token, role = 'vk', name = '', ip = '', photo = '', agent = '' } = data.user;\n\n const user = {\n ...DEFAULT_USER,\n role,\n id,\n token,\n userdata: {\n name,\n ip,\n agent,\n photo,\n },\n };\n\n this.setState({ menuOpened: false });\n this.props.gotVkUser(user);\n });\n }\n\n setMenuOpened = () => this.setState({ menuOpened: !this.state.menuOpened });\n\n openMapsDialog = () => {\n this.props.openMapDialog(TABS.MY);\n };\n\n openAppInfoDialog = () => {\n this.setMenuOpened();\n this.props.editorSetDialog(DIALOGS.APP_INFO);\n this.props.editorSetDialogActive(this.props.dialog !== DIALOGS.APP_INFO);\n };\n\n openOauthFrame = () => {\n const width = parseInt(String(window.innerWidth), 10);\n const height = parseInt(String(window.innerHeight), 10);\n const top = (height - 370) / 2;\n const left = (width - 700) / 2;\n\n window.open(\n `https://oauth.vk.com/authorize?client_id=5987644&scope=&redirect_uri=${CLIENT.API_ADDR}/api/auth/vk`,\n 'socialPopupWindow',\n `location=no,width=700,height=370,scrollbars=no,top=${top},left=${left},resizable=no`\n );\n };\n\n openGpxDialog = () => {\n this.props.editorChangeMode(MODES.GPX);\n };\n\n render() {\n const {\n props: { user, dialog, dialog_active, route, stickers, features },\n state: { menuOpened },\n } = this;\n\n // const is_empty = !route.length && !stickers.length;\n\n return (\n
\n \n\n {features.nominatim && (\n \n )}\n\n
\n
\n {!user || user.role === ROLES.guest ? (\n \n ) : (\n \n )}\n {user && user.role && user.role !== 'guest' && menuOpened && (\n \n )}\n
\n\n
\n\n
\n \n Каталог маршрутов\n \n \n
\n\n \n
\n\n
\n \n Экспорт GPX\n \n \n
\n \n\n
\n\n
\n \n
\n
\n
\n );\n }\n}\n\nconst UserPanel = connect(mapStateToProps, mapDispatchToProps)(UserPanelUnconnected);\n\nexport { UserPanel };\n","import React from 'react';\nimport { Icon } from '~/components/panels/Icon';\n\ntype Props = {\n onCancel: () => void,\n onSubmit: () => void,\n};\n\nexport const RendererPanel = ({ onCancel, onSubmit }: Props) => (\n \n
\n\n
\n \n \n Отмена\n \n\n \n СКАЧАТЬ\n \n \n
\n
\n);\n","import React from 'react';\n\nimport { connect } from 'react-redux';\nimport Croppr from 'croppr';\nimport 'croppr/dist/croppr.css';\nimport { LOGOS } from '~/constants/logos';\nimport { RendererPanel } from '~/components/panels/RendererPanel';\nimport { selectEditor } from '~/redux/editor/selectors';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { selectMap } from '~/redux/map/selectors';\n\nconst mapStateToProps = state => ({\n editor: selectEditor(state),\n map: selectMap(state),\n});\n\nconst mapDispatchToProps = {\n editorHideRenderer: EDITOR_ACTIONS.editorHideRenderer,\n editorCropAShot: EDITOR_ACTIONS.editorCropAShot,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\ntype State = {\n opacity: number,\n};\n\nclass Component extends React.Component {\n state = {\n opacity: 0,\n };\n\n onImageLoaded = () => {\n if (!this.image) {\n return\n }\n\n this.croppr = new Croppr(this.image, {\n onInitialize: this.onCropInit,\n });\n\n this.setState({ opacity: 1 });\n };\n\n componentWillUnmount() {\n if (this.croppr) this.croppr.destroy();\n }\n\n onCropInit = (crop) => {\n const { regionEl, box } = crop;\n const scale = ((box.x2 - box.x1) / window.innerWidth);\n\n this.logo = document.createElement('div');\n this.logo.className = 'renderer-logo';\n this.logo.style.transform = `scale(${scale})`;\n\n this.logoImg = document.createElement('img');\n if (this.props.map.logo && LOGOS[this.props.map.logo][1]) this.logoImg.src = LOGOS[this.props.map.logo][1];\n\n this.logo.append(this.logoImg);\n regionEl.append(this.logo);\n };\n\n croppr?: Croppr;\n logo: HTMLDivElement | null = null;\n image: HTMLImageElement | null = null;\n logoImg: HTMLImageElement | null = null;\n\n getImage = () => this.props.editorCropAShot(this.croppr?.getValue());\n\n render() {\n const { data } = this.props.editor.renderer;\n const { opacity } = this.state;\n const { innerWidth, innerHeight } = window;\n const padding = 30;\n const paddingBottom = 80;\n\n let width;\n let height;\n\n // if (innerWidth > innerHeight) {\n height = innerHeight - padding - paddingBottom;\n width = height * (innerWidth / innerHeight);\n // }\n\n return (\n
\n \n \n { this.image = el; }}\n onLoad={this.onImageLoaded}\n />\n
\n
\n\n \n
\n );\n }\n}\n\nexport const Renderer = connect(mapStateToProps, mapDispatchToProps)(Component);\n","// @flow\nimport React from \"react\";\nimport { Icon } from \"~/components/panels/Icon\";\nimport { MapListDialog } from \"~/components/dialogs/MapListDialog\";\nimport { Tooltip } from \"~/components/panels/Tooltip\";\nimport { ReactElement } from \"react\";\nimport classnames from \"classnames\";\nimport { toggleRouteStarred } from \"~/redux/user/actions\";\nimport { TABS } from \"~/constants/dialogs\";\n\ninterface Props {\n tab: string;\n\n address: string;\n title: string;\n distance: number;\n is_public: boolean;\n is_admin: boolean;\n is_published: boolean;\n\n openRoute: typeof MapListDialog.openRoute;\n toggleStarred: typeof MapListDialog.toggleStarred;\n startEditing: typeof MapListDialog.startEditing;\n stopEditing: typeof MapListDialog.stopEditing;\n showMenu: typeof MapListDialog.showMenu;\n hideMenu: typeof MapListDialog.hideMenu;\n showDropCard: typeof MapListDialog.showDropCard;\n}\n\nexport const RouteRowView = ({\n title,\n distance,\n address,\n openRoute,\n tab,\n startEditing,\n showMenu,\n showDropCard,\n hideMenu,\n is_admin,\n is_published,\n toggleStarred\n}: Props): ReactElement => (\n
\n {(tab === TABS.PENDING || tab === TABS.STARRED) && is_admin && (\n
\n {is_published ? (\n \n ) : (\n \n )}\n
\n )}\n
openRoute(address)}>\n
\n {(tab === \"my\" || !is_admin) && is_published && (\n
\n \n
\n )}\n {title || address}\n
\n\n
\n \n \n {address}\n \n \n \n {(distance && `${distance} km`) || \"0 km\"}\n \n
\n
\n {tab === \"my\" && (\n \n \n \n
\n
\n Удалить\n \n
\n \n Редактировать\n \n
\n
\n
\n
\n )}\n \n);\n","// @flow\nimport React from 'react';\nimport { Icon } from '~/components/panels/Icon';\nimport { Switch } from '~/components/Switch';\nimport { MapListDialog } from \"~/components/dialogs/MapListDialog\";\n\ninterface Props {\n title: string;\n address: string;\n is_public: boolean,\n modifyRoute: typeof MapListDialog.modifyRoute,\n}\n\ninterface State {\n title: string,\n is_public: boolean,\n}\n\nexport class RouteRowEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n title: props.title,\n is_public: props.is_public,\n };\n }\n\n stopEditing = () => {\n const {\n state: { title, is_public },\n props: { address }\n } = this;\n\n this.props.modifyRoute({ address, title, is_public })\n };\n\n setPublic = () => this.setState({ is_public: !this.state.is_public });\n setTitle = ({ target: { value } }: { target: { value: string } }) => this.setState({ title: value });\n\n render() {\n const {\n state: { title, is_public },\n } = this;\n\n return (\n
\n
\n
\n \n
\n
\n
\n
\n \n {\n is_public\n ? ' В каталоге карт'\n : ' Только по ссылке'\n }\n
\n
\n OK\n
\n
\n
\n
\n
\n );\n }\n}\n","// @flow\nimport React, { FC, memo } from 'react';\nimport { MapListDialog } from '~/components/dialogs/MapListDialog';\nimport { ReactElement } from 'react';\n\ninterface Props {\n address: string;\n stopEditing: typeof MapListDialog.stopEditing;\n dropRoute: typeof MapListDialog.dropRoute;\n}\n\nexport const RouteRowDrop: FC = memo(({ address, stopEditing, dropRoute }) => (\n
\n
\n
\n
\n Удалить\n
\n
\n Отмена\n
\n
\n
\n
\n));\n","import React, { FC, memo } from 'react';\nimport classnames from 'classnames';\nimport { MapListDialog } from '~/components/dialogs/MapListDialog';\nimport { RouteRowView } from '~/components/maps/RouteRowView';\nimport { RouteRowEditor } from '~/components/maps/RouteRowEditor';\nimport { RouteRowDrop } from '~/components/maps/RouteRowDrop';\nimport { ReactElement } from 'react';\n\ninterface Props {\n address: string;\n tab: string;\n title: string;\n distance: number;\n is_public: boolean;\n is_published: boolean;\n\n is_admin: boolean;\n is_editing_target: boolean;\n is_menu_target: boolean;\n\n openRoute: typeof MapListDialog.openRoute;\n startEditing: typeof MapListDialog.startEditing;\n stopEditing: typeof MapListDialog.stopEditing;\n showMenu: typeof MapListDialog.showMenu;\n hideMenu: typeof MapListDialog.hideMenu;\n showDropCard: typeof MapListDialog.showDropCard;\n dropRoute: typeof MapListDialog.dropRoute;\n modifyRoute: typeof MapListDialog.modifyRoute;\n toggleStarred: typeof MapListDialog.toggleStarred;\n\n is_editing_mode: 'edit' | 'drop';\n}\n\nexport const RouteRowWrapper: FC = memo(\n ({\n title,\n distance,\n address,\n openRoute,\n tab,\n startEditing,\n showMenu,\n showDropCard,\n is_public,\n is_editing_target,\n is_menu_target,\n is_editing_mode,\n dropRoute,\n stopEditing,\n modifyRoute,\n hideMenu,\n is_admin,\n is_published,\n toggleStarred,\n }) => (\n \n {is_editing_target && is_editing_mode === 'edit' && (\n \n )}\n {is_editing_target && is_editing_mode === 'drop' && (\n \n )}\n {!is_editing_target && (\n \n )}\n \n )\n);\n","import React from 'react';\nimport { Scrollbars } from 'tt-react-custom-scrollbars';\n\nexport const Scroll = props => (\n
}\n renderTrackVertical={prop =>
}\n renderThumbHorizontal={prop =>
}\n renderThumbVertical={prop =>
}\n {...props}\n >\n {props.children}\n \n);\n","import React, { FC, memo, useMemo, ChangeEvent, ChangeEventHandler } from 'react';\nimport Range from 'rc-slider/lib/Range';\n\ninterface Props {\n ready: boolean;\n min: number;\n max: number;\n search: string;\n distance: [number, number];\n onDistanceChange: (val: number[]) => void;\n onSearchChange: ChangeEventHandler;\n}\n\nconst MapListDialogHead: FC = memo(\n ({ min, max, ready, distance, search, onSearchChange, onDistanceChange }) => {\n const marks = useMemo(\n () =>\n [...new Array(Math.floor((Math.max(min, max) - Math.min(min, max)) / 25) + 1)].reduce(\n (obj, el, i) => ({\n ...obj,\n [min + i * 25]: min + i * 25 < 200 ? ` ${min + i * 25}` : ` ${min + i * 25}+`,\n }),\n {}\n ),\n [max, min]\n );\n\n return (\n
\n
\n \n\n
\n\n {ready && Object.keys(marks).length > 2 ? (\n = max}\n />\n ) : (\n
\n )}\n
\n
\n );\n }\n);\n\nexport { MapListDialogHead };\n","import React, { FC } from 'react';\nimport { Icon } from '~/components/panels/Icon';\n\ninterface IProps {}\n\nconst DialogLoader: FC = ({}) => {\n return (\n
\n
\n \n
\n
\n );\n};\n\nexport { DialogLoader };\n","import React, { PureComponent } from 'react';\nimport { connect } from 'react-redux';\nimport { RouteRowWrapper } from '~/components/maps/RouteRowWrapper';\nimport { Scroll } from '~/components/Scroll';\nimport {\n searchSetDistance,\n searchSetTitle,\n searchSetTab,\n mapsLoadMore,\n dropRoute,\n modifyRoute,\n toggleRouteStarred,\n} from '~/redux/user/actions';\n\nimport { editorSetDialogActive } from '~/redux/editor/actions';\n\nimport { isMobile } from '~/utils/window';\nimport classnames from 'classnames';\n\nimport { TABS, TABS_TITLES } from '~/constants/dialogs';\nimport { Icon } from '~/components/panels/Icon';\nimport { pushPath } from '~/utils/history';\nimport { IRouteListItem } from '~/redux/user';\nimport { ROLES } from '~/constants/auth';\nimport { IState } from '~/redux/store';\nimport { MapListDialogHead } from '~/components/search/MapListDialogHead';\nimport { DialogLoader } from '~/components/dialogs/DialogLoader';\n\nconst mapStateToProps = ({\n editor: { editing },\n user: {\n routes,\n user: { role },\n },\n}: IState) => {\n return {\n role,\n routes,\n editing,\n ready: routes.filter.max < 9999,\n };\n};\n\nconst mapDispatchToProps = {\n searchSetDistance,\n searchSetTitle,\n searchSetTab,\n editorSetDialogActive,\n mapsLoadMore,\n dropRoute,\n modifyRoute,\n toggleRouteStarred,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nexport interface State {\n menu_target: IRouteListItem['address'];\n editor_target: IRouteListItem['address'];\n\n is_editing: boolean;\n is_dropping: boolean;\n}\n\nclass MapListDialogUnconnected extends PureComponent {\n state = {\n menu_target: '',\n editor_target: '',\n is_editing: false,\n is_dropping: false,\n };\n\n startEditing = (editor_target: IRouteListItem['address']): void =>\n this.setState({\n editor_target,\n menu_target: '',\n is_editing: true,\n is_dropping: false,\n });\n\n showMenu = (menu_target: IRouteListItem['address']): void =>\n this.setState({\n menu_target,\n });\n\n hideMenu = (): void =>\n this.setState({\n menu_target: '',\n });\n\n showDropCard = (editor_target: IRouteListItem['address']): void =>\n this.setState({\n editor_target,\n menu_target: '',\n is_editing: false,\n is_dropping: true,\n });\n\n stopEditing = (): void => {\n this.setState({ editor_target: '' });\n };\n\n setTitle = ({ target: { value } }: { target: { value: string } }): void => {\n this.props.searchSetTitle(value);\n };\n\n openRoute = (_id: string): void => {\n if (isMobile()) this.props.editorSetDialogActive(false);\n\n this.stopEditing();\n\n pushPath(`/${_id}`);\n };\n\n onScroll = (e: {\n target: { scrollHeight: number; scrollTop: number; clientHeight: number };\n }): void => {\n const {\n target: { scrollHeight, scrollTop, clientHeight },\n } = e;\n const delta = scrollHeight - scrollTop - clientHeight;\n\n if (\n delta < 500 &&\n this.props.routes.list.length < this.props.routes.limit &&\n !this.props.routes.loading\n ) {\n this.props.mapsLoadMore();\n }\n };\n\n dropRoute = (address: string): void => {\n this.props.dropRoute(address);\n };\n\n modifyRoute = ({\n address,\n title,\n is_public,\n }: {\n address: string;\n title: string;\n is_public: boolean;\n }): void => {\n this.props.modifyRoute(address, { title, is_public });\n this.stopEditing();\n };\n\n toggleStarred = (id: string) => this.props.toggleRouteStarred(id);\n\n render() {\n const {\n ready,\n role,\n routes: {\n list,\n loading,\n filter: { min, max, title, distance, tab },\n },\n }: // marks,\n Props = this.props;\n\n const { editor_target, menu_target, is_editing, is_dropping } = this.state;\n\n return (\n
\n {list.length === 0 && loading && (\n \n )}\n\n {ready && !loading && list.length === 0 && (\n
\n
\n \n
\n ТУТ ПУСТО
И ОДИНОКО\n
\n )}\n\n
\n {Object.values(TABS).map(\n item =>\n (role === ROLES.admin || item !== TABS.PENDING) && (\n this.props.searchSetTab(item)}\n key={item}\n >\n {TABS_TITLES[item]}\n
\n )\n )}\n
\n\n \n\n \n
\n {list.map(route => (\n \n ))}\n
\n
\n\n
\n
\n );\n }\n}\n\nconst MapListDialog = connect(mapStateToProps, mapDispatchToProps)(MapListDialogUnconnected);\n\nexport { MapListDialog };\n","import React, { FC, useCallback } from 'react';\nimport { INominatimResult } from '~/redux/types';\nimport { MainMap } from '~/constants/map';\n\ninterface IProps {\n item: INominatimResult;\n}\n\nconst NominatimListItem: FC = ({ item }) => {\n const onClick = useCallback(() => {\n MainMap.panTo(item.latlng);\n }, [MainMap]);\n\n return (\n
\n
{item.title}
\n
\n );\n};\n\nexport { NominatimListItem };\n","import React, { FC, Fragment, useCallback } from 'react';\nimport { connect } from 'react-redux';\nimport { IState } from '~/redux/store';\nimport { selectEditorNominatim } from '~/redux/editor/selectors';\nimport { DialogLoader } from './DialogLoader';\nimport { NominatimListItem } from '~/components/nominatim/NominatimListItem';\nimport { MainMap } from '~/constants/map';\nimport { Scroll } from '../Scroll';\n\nconst mapStateToProps = (state: IState) => ({\n nominatim: selectEditorNominatim(state),\n});\n\ntype Props = ReturnType & {};\n\nconst NominatimDialogUnconnected: FC = ({ nominatim: { loading, list } }) => {\n const onItemClick = useCallback(\n (index: number) => {\n if (!list[index]) return;\n\n MainMap.setView(list[index].latlng, 17);\n },\n [MainMap, list]\n );\n\n return (\n \n \n
\n
\n\n
\n {loading && }\n {list.map((item, i) => (\n \n ))}\n
\n
\n \n \n );\n};\n\nconst NominatimDialog = connect(mapStateToProps)(NominatimDialogUnconnected);\n\nexport { NominatimDialog };\n","import React, { createElement, FC, memo } from 'react';\nimport { DIALOGS } from '~/constants/dialogs';\nimport classnames from 'classnames';\nimport { AppInfoDialog } from '~/components/dialogs/AppInfoDialog';\nimport { Icon } from '~/components/panels/Icon';\nimport { MapListDialog } from '~/components/dialogs/MapListDialog';\nimport { NominatimDialog } from '~/components/dialogs/NominatimDialog';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\n\ninterface Props {\n dialog: keyof typeof DIALOGS;\n dialog_active: Boolean;\n editorSetDialogActive: typeof EDITOR_ACTIONS.editorSetDialogActive;\n}\n\nconst LEFT_DIALOGS = {\n [DIALOGS.MAP_LIST]: MapListDialog,\n [DIALOGS.APP_INFO]: AppInfoDialog,\n [DIALOGS.NOMINATIM]: NominatimDialog,\n};\n\nconst LeftDialog: FC = memo(({ dialog, dialog_active, editorSetDialogActive }) => (\n \n {Object.keys(LEFT_DIALOGS).map(item => (\n \n {dialog && LEFT_DIALOGS[item] && createElement(LEFT_DIALOGS[item], {})}\n\n editorSetDialogActive(false)}\n >\n \n
\n\n editorSetDialogActive(false)}\n >\n \n
\n
\n ))}\n \n));\n\nexport { LeftDialog };\n","// @flow\nimport React, { Fragment } from 'react';\nimport { Scroll } from '~/components/Scroll';\nimport { APP_INFO } from '~/constants/app_info';\n\nexport const AppInfoDialog = () => (\n \n
\n\n
\n
\n
Orchid Map
\n
\n версия {APP_INFO.VERSION || 1}.{APP_INFO.CHANGELOG[APP_INFO.VERSION].length || 0}.\n {APP_INFO.CHANGELOG[APP_INFO.VERSION][0].length - 1 || 0}\n
\n
\n
\n \n
\n
Frontend:
\n \n ReactJS\n \n ,{' '}\n \n Leaflet\n \n ,{' '}\n \n Leaflet Routing Machine\n {' '}\n
\n
\n
Backend:
\n \n OSRM\n \n ,{' '}\n \n Golang\n \n ,{' '}\n \n Nginx\n \n ,{' '}\n
\n
\n
\n
\n \n);\n","import React, { FC, useCallback } from 'react';\nimport { IState } from '~/redux/store';\nimport { selectUserLocation } from '~/redux/user/selectors';\nimport { connect } from 'react-redux';\nimport { Tooltip } from './panels/Tooltip';\nimport { MainMap } from '~/constants/map';\n\nconst mapStateToProps = (state: IState) => ({\n location: selectUserLocation(state),\n});\n\ntype Props = ReturnType & {};\n\nconst UserLocationUnconnected: FC = ({ location }) => {\n const onClick = useCallback(() => {\n if (!location) return;\n\n MainMap.setView(location, 17);\n }, [MainMap, location]);\n\n return (\n
\n Где я?\n\n \n \n \n \n \n \n \n
\n );\n};\n\nexport const UserLocation = connect(mapStateToProps)(UserLocationUnconnected);\n","import React from 'react';\nimport { toHours } from '~/utils/format';\nimport { Icon } from '~/components/panels/Icon';\nimport { connect } from 'react-redux';\nimport Slider from 'rc-slider/lib/Slider';\nimport { editorSetSpeed } from '~/redux/editor/actions';\nimport { Tooltip } from '~/components/panels/Tooltip';\nimport { isMobile } from '~/utils/window';\nimport { IState } from '~/redux/store';\nimport pick from 'ramda/es/pick';\nimport { selectEditor } from '~/redux/editor/selectors';\n\nconst mapStateToProps = (state: IState) =>\n pick(['distance', 'estimated', 'speed'], selectEditor(state));\n\nconst mapDispatchToProps = { editorSetSpeed };\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\ninterface State {\n dialogOpened: boolean;\n}\n\nclass DistanceBarUnconnected extends React.PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n dialogOpened: false,\n };\n }\n\n step: number = 5;\n min: number = 5;\n max: number = 30;\n\n marks: { [x: number]: string } = [\n ...Array(Math.floor(this.max - this.min) / this.step + 1),\n ].reduce(\n (obj, el, index) => ({\n ...obj,\n [this.min + index * this.step]: String(this.min + index * this.step),\n }),\n {}\n );\n\n toggleDialog = () => {\n if (isMobile()) return;\n\n this.setState({ dialogOpened: !this.state.dialogOpened });\n };\n\n render() {\n const {\n props: { distance, estimated, speed },\n state: { dialogOpened },\n min,\n max,\n step,\n marks,\n } = this;\n\n return (\n \n
\n {distance} км \n Примерное время\n \n \n \n
{toHours(estimated)}
\n
\n {dialogOpened && (\n
\n
\n \n
\n
\n )}\n
\n );\n }\n}\n\nexport const DistanceBar = connect(mapStateToProps, mapDispatchToProps)(DistanceBarUnconnected);\n","import React, { memo } from 'react';\nimport { UserLocation } from '~/components/UserLocation';\nimport { DistanceBar } from '~/components/panels/DistanceBar';\n\nexport const TopLeftPanel = memo(() => (\n
\n \n \n
\n));\n","import React, { useCallback } from 'react';\nimport { Icon } from '~/components/panels/Icon';\nimport { PROVIDERS } from '~/constants/providers';\nimport { LOGOS } from '~/constants/logos';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { connect } from 'react-redux';\nimport { MODES } from '~/constants/modes';\n\nimport { Tooltip } from '~/components/panels/Tooltip';\nimport { selectMap } from '~/redux/map/selectors';\nimport { selectEditor } from '~/redux/editor/selectors';\nimport { IState } from '~/redux/store';\n\nconst mapStateToProps = (state: IState) => {\n const { provider, logo } = selectMap(state);\n const { markers_shown, editing } = selectEditor(state);\n\n return { provider, logo, markers_shown, editing };\n};\n\nconst mapDispatchToProps = {\n editorChangeMode: EDITOR_ACTIONS.editorChangeMode,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst TopRightPanelUnconnected = ({\n provider,\n logo,\n markers_shown,\n editing,\n editorChangeMode,\n}: Props) => {\n const startProviderMode = useCallback(() => editorChangeMode(MODES.PROVIDER), [editorChangeMode]);\n const startLogoMode = useCallback(() => editorChangeMode(MODES.LOGO), [editorChangeMode]);\n const clearMode = useCallback(() => editorChangeMode(MODES.NONE), [editorChangeMode]);\n\n return (\n
\n {editing && !markers_shown && (\n
\n \n Приблизьте, чтобы редактировать кривую\n
\n )}\n \n Стиль карты\n \n
\n {(provider && PROVIDERS[provider] && PROVIDERS[provider].name) || '...'}\n
\n\n \n Логотип\n \n
\n {(logo && LOGOS[logo] && LOGOS[logo][0]) || '...'}\n
\n
\n );\n};\n\nconst TopRightPanel = connect(mapStateToProps, mapDispatchToProps)(TopRightPanelUnconnected);\n\nexport { TopRightPanel };\n","import React from 'react';\nimport { LOGOS } from '~/constants/logos';\nimport { connect } from 'react-redux';\nimport { IRootState } from '~/redux/user';\nimport { selectMapLogo } from '~/redux/map/selectors';\n\nconst mapStateToProps = state => ({ logo: selectMapLogo(state) });\ntype Props = ReturnType;\n\nconst LogoPreviewUnconnected = React.memo(({ logo }: Props) => (\n \n));\n\nconst LogoPreview = connect(mapStateToProps)(LogoPreviewUnconnected);\n\nexport { LogoPreview };\n","/*\n done IMPORTANT: select closest point on drag instead of first\n done add touch hint poly\n done approx radius for dragFindNearest\n*/\n\nimport {\n LatLngExpression,\n Marker,\n Polyline,\n PolylineOptions,\n marker,\n divIcon,\n LayerGroup,\n LatLng,\n LeafletMouseEvent,\n latLng,\n LatLngLiteral,\n} from 'leaflet';\n\nimport { distKmHaversine, distToSegment, getPolyLength, pointInArea } from '~/utils/geom';\n\ninterface InteractivePolylineOptions extends PolylineOptions {\n maxMarkers?: number;\n constraintsStyle?: PolylineOptions;\n kmMarksEnabled?: boolean;\n kmMarksStep?: number;\n}\n\nclass InteractivePoly extends Polyline {\n constructor(\n latlngs: LatLngExpression[] | LatLngExpression[][],\n options?: InteractivePolylineOptions\n ) {\n super(latlngs, options);\n\n this.constraintsStyle = {\n ...this.constraintsStyle,\n ...(options?.constraintsStyle || {}),\n };\n this.maxMarkers = options?.maxMarkers || this.maxMarkers;\n\n this.constrLine = new Polyline([], this.constraintsStyle);\n\n this.startDragHinting();\n }\n\n updateConstraintsToLatLngs = (latlngs: LatLngExpression[]) => {\n if (this.is_drawing) {\n // update mouse hinter on latlngs change\n const constraints = this.constrLine.getLatLngs() as LatLng[];\n const source = latlngs && latlngs.length > 0 &&\n this.drawing_direction === 'forward'\n ? latlngs[latlngs.length - 1]\n : latlngs[0];\n\n if (!constraints || constraints.length < 2 || !source) {\n this.setConstraints([]);\n return;\n }\n\n this.setConstraints([constraints[0], source as LatLng]);\n }\n }\n\n setLatLngs = (latlngs: LatLngExpression[] | LatLngExpression[][] | LatLngExpression[][][]) => {\n super.setLatLngs(latlngs);\n\n this.updateConstraintsToLatLngs(latlngs as LatLngExpression[]);\n\n return this;\n };\n\n updateTouchHinter = ({ latlngs }: { latlngs: LatLngLiteral[] }): void => {\n this.touchHinter.setLatLngs(latlngs);\n };\n\n setPoints = (latlngs: LatLng[], emitEvent = false) => {\n this.setLatLngs(latlngs);\n this.recreateMarkers();\n this.recalcDistance();\n this.touchHinter.setLatLngs(latlngs);\n\n if (emitEvent) {\n this.fire('latlngschange', { latlngs });\n }\n };\n\n createHintMarker = (latlng: LatLng): Marker =>\n marker(latlng, {\n draggable: false,\n icon: divIcon({\n className: 'leaflet-vertex-drag-helper',\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n }),\n });\n\n createMarker = (latlng: LatLng): Marker =>\n marker(latlng, {\n draggable: true,\n icon: divIcon({\n className: 'leaflet-vertex-icon',\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n }),\n })\n .on('contextmenu', this.dropMarker)\n .on('drag', this.onMarkerDrag)\n .on('dragstart', this.onMarkerDragStart)\n .on('dragend', this.onMarkerDragEnd)\n .addTo(this.markerLayer);\n\n recreateMarkers = () => {\n this.clearAllMarkers();\n const latlngs = this.getLatLngs();\n\n if (!latlngs || latlngs.length === 0) return;\n\n latlngs.forEach(latlng => this.markers.push(this.createMarker(latlng)));\n\n this.updateMarkers();\n };\n\n clearAllMarkers = (): void => {\n this.markerLayer.clearLayers();\n this.markers = [];\n };\n\n updateMarkers = (): void => {\n this.showVisibleMarkers();\n };\n\n showAllMarkers = (): void => {\n if (!this.is_editing) return;\n if (this._map.hasLayer(this.markerLayer)) return;\n\n this._map.addLayer(this.markerLayer);\n this.fire('allvertexshow');\n };\n\n hideAllMarkers = (): void => {\n if (!this._map || !this._map.hasLayer(this.markerLayer)) return;\n\n this._map.removeLayer(this.markerLayer);\n this.fire('allvertexhide');\n };\n\n showVisibleMarkers = (): void => {\n if (!this.is_editing) return;\n\n const northEast = this._map.getBounds().getNorthEast();\n const southWest = this._map.getBounds().getSouthWest();\n\n const { visible, hidden } = this.markers.reduce(\n (obj, marker) => {\n const { lat, lng } = marker.getLatLng();\n const is_hidden =\n lat > northEast.lat || lng > northEast.lng || lat < southWest.lat || lng < southWest.lng;\n\n return is_hidden\n ? { ...obj, hidden: [...obj.hidden, marker] }\n : { ...obj, visible: [...obj.visible, marker] };\n },\n { visible: [], hidden: [] } as Record<'visible' | 'hidden', Marker[]>\n );\n\n if (visible.length > (this.maxMarkers || 2)) {\n return this.hideAllMarkers();\n }\n\n this.showAllMarkers();\n\n visible.forEach(marker => {\n if (!this.markerLayer.hasLayer(marker)) this.markerLayer.addLayer(marker);\n });\n\n hidden.forEach(marker => {\n if (this.markerLayer.hasLayer(marker)) this.markerLayer.removeLayer(marker);\n });\n };\n\n editor = {\n disable: () => {\n this.hideAllMarkers();\n this.is_editing = false;\n this.stopDragHinting();\n this.stopDrawing();\n this.touchHinter.removeFrom(this._map);\n this.fire('editordisable');\n },\n enable: () => {\n this.is_editing = true;\n this.showVisibleMarkers();\n this.startDragHinting();\n this.touchHinter.addTo(this._map);\n\n this.fire('editorenable');\n },\n continue: () => {\n this.is_drawing = true;\n this.drawing_direction = 'forward';\n this.startDrawing();\n },\n prepend: () => {\n this.is_drawing = true;\n this.drawing_direction = 'backward';\n this.startDrawing();\n },\n stop: () => {\n this.stopDrawing();\n },\n };\n\n moveDragHint = ({ latlng }: LeafletMouseEvent): void => {\n this.hintMarker.setLatLng(latlng);\n };\n\n hideDragHint = (): void => {\n if (this._map.hasLayer(this.hintMarker)) this._map.removeLayer(this.hintMarker);\n };\n\n showDragHint = (): void => {\n this._map.addLayer(this.hintMarker);\n };\n\n startDragHinting = (): void => {\n this.touchHinter.on('mousemove', this.moveDragHint);\n this.touchHinter.on('mousedown', this.startDragHintMove);\n this.touchHinter.on('mouseover', this.showDragHint);\n this.touchHinter.on('mouseout', this.hideDragHint);\n };\n\n stopDragHinting = (): void => {\n this.touchHinter.off('mousemove', this.moveDragHint);\n this.touchHinter.off('mousedown', this.startDragHintMove);\n this.touchHinter.off('mouseover', this.showDragHint);\n this.touchHinter.off('mouseout', this.hideDragHint);\n };\n\n startDragHintMove = (event: LeafletMouseEvent): void => {\n event.originalEvent.stopPropagation();\n event.originalEvent.preventDefault();\n\n if (this.is_drawing) {\n this.stopDrawing();\n this.is_drawing = true;\n }\n\n const prev = this.dragHintFindNearest(event.latlng);\n\n if (prev < 0) return;\n\n this.hint_prev_marker = prev;\n\n this.constrLine.setLatLngs([]).addTo(this._map);\n\n this._map.dragging.disable();\n\n this.is_dragging = true;\n\n this._map.on('mousemove', this.dragHintMove);\n this._map.on('mouseup', this.dragHintAddMarker);\n this._map.on('mouseout', this.stopDragHintMove);\n\n this.fire('vertexaddstart');\n };\n\n stopDragHintMove = (): void => {\n this._map.dragging.enable();\n\n this.constrLine.removeFrom(this._map);\n\n this._map.off('mousemove', this.dragHintMove);\n this._map.off('mouseup', this.dragHintAddMarker);\n this._map.off('mouseout', this.stopDragHintMove);\n\n if (this.is_drawing) this.startDrawing();\n\n setTimeout(() => {\n this.is_dragging = false;\n this.fire('vertexaddend');\n }, 0);\n };\n\n dragHintAddMarker = ({ latlng }: LeafletMouseEvent): void => {\n this.dragHintChangeDistance(this.hint_prev_marker, latlng);\n\n this.markers.splice(this.hint_prev_marker + 1, 0, this.createMarker(latlng));\n this.insertLatLng(latlng, this.hint_prev_marker + 1);\n this.hideDragHint();\n this.stopDragHintMove();\n };\n\n dragHintChangeDistance = (index: number, current: LatLngLiteral): void => {\n const prev = this.markers[index];\n const next = this.markers[index + 1];\n\n const initial_distance = distKmHaversine(prev.getLatLng(), next.getLatLng());\n\n const current_distance =\n ((prev && distKmHaversine(prev.getLatLng(), current)) || 0) +\n ((next && distKmHaversine(next.getLatLng(), current)) || 0);\n\n this.distance += current_distance - initial_distance;\n\n this.fire('distancechange', { distance: this.distance });\n };\n\n dragHintFindNearest = (latlng: LatLng): any => {\n const latlngs = this.getLatLngs() as LatLng[];\n\n const neighbours = latlngs\n .filter((current, index) => {\n const next = latlngs[index + 1] as LatLng;\n\n return next && pointInArea(current, next, latlng);\n })\n .map(el => latlngs.indexOf(el))\n .sort(\n (a, b) =>\n distToSegment(latlngs[a], latlngs[a + 1], latlng) -\n distToSegment(latlngs[b], latlngs[b + 1], latlng)\n );\n\n return neighbours.length > 0 ? neighbours[0] : -1;\n };\n\n dragHintMove = (event: LeafletMouseEvent): void => {\n event.originalEvent.stopPropagation();\n event.originalEvent.preventDefault();\n\n this.setConstraints([\n this.markers[this.hint_prev_marker].getLatLng(),\n event.latlng,\n this.markers[this.hint_prev_marker + 1].getLatLng(),\n ]);\n };\n\n onMarkerDrag = ({ target }: { target: Marker }) => {\n const coords = new Array(0)\n .concat((this.vertex_index! > 0 && this.markers[this.vertex_index! - 1].getLatLng()) || [])\n .concat(target.getLatLng())\n .concat(\n (this.vertex_index! < this.markers.length - 1 &&\n this.markers[this.vertex_index! + 1].getLatLng()) ||\n []\n );\n\n this.setConstraints(coords);\n\n this.fire('vertexdrag', { index: this.vertex_index, vertex: target });\n };\n\n onMarkerDragStart = ({ target }: { target: Marker }) => {\n if (this.is_drawing) {\n this.stopDrawing();\n this.is_drawing = true;\n }\n\n if (this.is_dragging) this.stopDragHintMove();\n\n this.vertex_index = this.markers.indexOf(target);\n\n this.is_dragging = true;\n this.constrLine.addTo(this._map);\n\n this.fire('vertexdragstart', { index: this.vertex_index, vertex: target });\n };\n\n onMarkerDragEnd = ({ target }: { target: Marker }): void => {\n const latlngs = this.getLatLngs() as LatLngLiteral[];\n this.markerDragChangeDistance(\n this.vertex_index!,\n latlngs[this.vertex_index!],\n target.getLatLng()\n );\n\n this.replaceLatlng(target.getLatLng(), this.vertex_index!);\n\n this.is_dragging = false;\n this.constrLine.removeFrom(this._map);\n\n this.vertex_index = 0;\n\n if (this.is_drawing) this.startDrawing();\n\n this.fire('vertexdragend', { index: this.vertex_index, vertex: target });\n };\n\n markerDragChangeDistance = (\n index: number,\n initial: LatLngLiteral,\n current: LatLngLiteral\n ): void => {\n const prev = index > 0 ? this.markers[index - 1] : null;\n const next = index <= this.markers.length + 1 ? this.markers[index + 1] : null;\n\n const initial_distance =\n ((prev && distKmHaversine(prev.getLatLng(), initial)) || 0) +\n ((next && distKmHaversine(next.getLatLng(), initial)) || 0);\n\n const current_distance =\n ((prev && distKmHaversine(prev.getLatLng(), current)) || 0) +\n ((next && distKmHaversine(next.getLatLng(), current)) || 0);\n\n this.distance += current_distance - initial_distance;\n\n this.fire('distancechange', { distance: this.distance });\n };\n\n startDrawing = (): void => {\n this.is_drawing = true;\n this.setConstraints([]);\n this.constrLine.addTo(this._map);\n this._map.on('mousemove', this.onDrawingMove);\n this._map.on('click', this.onDrawingClick);\n };\n\n stopDrawing = (): void => {\n this.constrLine.removeFrom(this._map);\n this._map.off('mousemove', this.onDrawingMove);\n this._map.off('click', this.onDrawingClick);\n this.is_drawing = false;\n };\n\n onDrawingMove = ({ latlng }: LeafletMouseEvent): void => {\n if (this.markers.length === 0) {\n this.setConstraints([]);\n return;\n }\n\n if (!this._map.hasLayer(this.constrLine)) this._map.addLayer(this.constrLine);\n\n const marker =\n this.drawing_direction === 'forward'\n ? this.markers[this.markers.length - 1]\n : this.markers[0];\n\n this.setConstraints([latlng, marker.getLatLng()]);\n };\n\n onDrawingClick = (event: LeafletMouseEvent): void => {\n if (this.is_dragging) return;\n\n const { latlng } = event;\n\n this.stopDrawing();\n\n const latlngs = this.getLatLngs() as any[];\n\n this.drawingChangeDistance(latlng);\n\n if (this.drawing_direction === 'forward') {\n latlngs.push(latlng);\n this.markers.push(this.createMarker(latlng));\n } else {\n latlngs.unshift(latlng);\n this.markers.unshift(this.createMarker(latlng));\n }\n\n this.setLatLngs(latlngs);\n this.fire('latlngschange', { latlngs });\n this.showVisibleMarkers();\n this.startDrawing();\n };\n\n drawingChangeDistance = (latlng: LatLngLiteral): void => {\n const latlngs = this.getLatLngs() as LatLngLiteral[];\n\n if (latlngs.length < 1) {\n this.distance = 0;\n this.fire('distancechange', { distance: this.distance });\n return;\n }\n\n const point = this.drawing_direction === 'forward' ? latlngs[latlngs.length - 1] : latlngs[0];\n\n this.distance += distKmHaversine(point, latlng);\n this.fire('distancechange', { distance: this.distance });\n };\n\n replaceLatlng = (latlng: LatLng, index: number): void => {\n const latlngs = this.getLatLngs() as LatLngLiteral[];\n latlngs.splice(index, 1, latlng);\n this.setLatLngs(latlngs);\n this.fire('latlngschange', { latlngs });\n };\n\n insertLatLng = (latlng, index): void => {\n const latlngs = this.getLatLngs();\n latlngs.splice(index, 0, latlng);\n this.setLatLngs(latlngs);\n this.fire('latlngschange', { latlngs });\n };\n\n setConstraints = (coords: LatLng[]) => {\n this.constrLine.setLatLngs(coords);\n };\n\n setDirection = (direction: 'forward' | 'backward') => {\n this.drawing_direction = direction;\n this.updateConstraintsToLatLngs(this.getLatLngs() as LatLngExpression[]);\n }\n\n dropMarker = ({ target }: LeafletMouseEvent): void => {\n const index = this.markers.indexOf(target);\n const latlngs = this.getLatLngs();\n\n if (typeof index === 'undefined' || latlngs.length === 0) return;\n\n this.dropMarkerDistanceChange(index);\n this._map.removeLayer(this.markers[index]);\n this.markers.splice(index, 1);\n latlngs.splice(index, 1);\n\n this.setLatLngs(latlngs);\n this.fire('latlngschange', { latlngs });\n };\n\n dropMarkerDistanceChange = (index: number): void => {\n const latlngs = this.getLatLngs() as LatLngLiteral[];\n\n const prev = index > 0 ? latlngs[index - 1] : null;\n const current = latlngs[index];\n const next = index <= latlngs.length + 1 ? latlngs[index + 1] : null;\n\n const initial_distance =\n ((prev && distKmHaversine(prev, current)) || 0) +\n ((next && distKmHaversine(next, current)) || 0);\n\n const current_distance = (prev && next && distKmHaversine(prev, next)) || 0;\n\n this.distance += current_distance - initial_distance;\n\n this.fire('distancechange', { distance: this.distance });\n };\n\n recalcDistance = () => {\n const latlngs = this.getLatLngs() as LatLngLiteral[];\n this.distance = getPolyLength(latlngs);\n\n this.fire('distancechange', { distance: this.distance });\n };\n\n markers: Marker[] = [];\n maxMarkers: InteractivePolylineOptions['maxMarkers'] = 2;\n markerLayer: LayerGroup = new LayerGroup();\n\n constraintsStyle: InteractivePolylineOptions['constraintsStyle'] = {\n weight: 6,\n color: 'red',\n dashArray: '10, 12',\n opacity: 0.5,\n interactive: false,\n };\n\n touchHinter: Polyline = new Polyline([], {\n weight: 24,\n smoothFactor: 3,\n className: 'touch-hinter-poly',\n });\n\n hintMarker: Marker = this.createHintMarker(latLng({ lat: 0, lng: 0 }));\n\n constrLine: Polyline;\n\n is_editing: boolean = true;\n is_dragging: boolean = false;\n is_drawing: boolean = false;\n\n drawing_direction: 'forward' | 'backward' = 'forward';\n vertex_index: number = 0;\n\n hint_prev_marker: number = 0;\n distance: number = 0;\n}\n\nInteractivePoly.addInitHook(function(this: InteractivePoly) {\n this.once('add', event => {\n if (event.target instanceof InteractivePoly) {\n this._map = event.target._map;\n\n this._map.on('touch', console.log);\n\n this.markerLayer.addTo(event.target._map);\n this.hintMarker.addTo(event.target._map);\n this.constrLine.addTo(event.target._map);\n this.touchHinter.addTo(event.target._map);\n\n this._map.on('moveend', this.updateMarkers);\n\n this.on('latlngschange' as any, this.updateTouchHinter as any);\n\n if (this.touchHinter && window.innerWidth < 768) {\n try {\n this.touchHinter.setStyle({ weight: 32 });\n } catch (e) {}\n }\n }\n });\n\n this.once('remove', event => {\n if (event.target instanceof InteractivePoly) {\n this.markerLayer.removeFrom(this._map);\n this.hintMarker.removeFrom(this._map);\n this.constrLine.removeFrom(this._map);\n this.touchHinter.removeFrom(this._map);\n\n this._map.off('moveend', this.updateMarkers);\n }\n });\n});\n\nexport { InteractivePoly };\n/*\n events:\n vertexdragstart,\n vertexdragend,\n vertexdrag,\n vertexaddstart\n vertexaddend\n\n allvertexhide\n allvertexshow\n\n editordisable\n editorenable\n\n distancechange\n\n latlngschange\n */\n","import React, { FC, memo, useCallback, useEffect, useState } from 'react';\nimport { InteractivePoly } from '~/utils/map/InteractivePoly';\nimport { isMobile } from '~/utils/window';\nimport { LatLng } from 'leaflet';\nimport { selectEditorDirection, selectEditorEditing, selectEditorMode } from '~/redux/editor/selectors';\nimport * as MAP_ACTIONS from '~/redux/map/actions';\nimport { connect } from 'react-redux';\nimport { selectMapRoute } from '~/redux/map/selectors';\nimport { MainMap } from '~/constants/map';\nimport { MODES } from '~/constants/modes';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { IState } from '~/redux/store';\n\nconst mapStateToProps = (state: IState) => ({\n mode: selectEditorMode(state),\n editing: selectEditorEditing(state),\n route: selectMapRoute(state),\n drawing_direction: selectEditorDirection(state),\n});\n\nconst mapDispatchToProps = {\n mapSetRoute: MAP_ACTIONS.mapSetRoute,\n editorSetDistance: EDITOR_ACTIONS.editorSetDistance,\n editorSetMarkersShown: EDITOR_ACTIONS.editorSetMarkersShown,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst RouteUnconnected: FC = memo(\n ({ route, editing, mode, drawing_direction, mapSetRoute, editorSetDistance, editorSetMarkersShown }) => {\n const [layer, setLayer] = useState(null);\n\n const onDistanceChange = useCallback(({ distance }) => editorSetDistance(distance), [\n editorSetDistance,\n ]);\n\n useEffect(() => {\n if (!MainMap) return;\n\n const interactive = new InteractivePoly([], {\n color: 'url(#activePathGradient)',\n weight: 6,\n maxMarkers: isMobile() ? 50 : 150,\n smoothFactor: 3,\n })\n .addTo(MainMap.routeLayer)\n .on('distancechange', onDistanceChange)\n .on('vertexdragstart', MainMap.disableClicks)\n .on('vertexdragend', MainMap.enableClicks)\n .on('vertexaddstart', MainMap.disableClicks)\n .on('vertexaddend', MainMap.enableClicks)\n .on('allvertexhide', () => editorSetMarkersShown(false))\n .on('allvertexshow', () => editorSetMarkersShown(true));\n\n setLayer(interactive);\n\n return () => {\n MainMap.routeLayer.removeLayer(interactive);\n };\n }, [MainMap, onDistanceChange]);\n\n const onRouteChanged = useCallback(\n ({ latlngs }) => {\n mapSetRoute(latlngs);\n },\n [mapSetRoute]\n );\n\n useEffect(() => {\n if (!layer) return;\n\n layer.on('latlngschange', onRouteChanged);\n\n return () => layer.off('latlngschange', onRouteChanged);\n }, [layer, onRouteChanged]);\n\n useEffect(() => {\n if (!layer) return;\n\n const points = (route && route.length > 0 && route) || [];\n\n layer.setPoints(points as LatLng[]);\n }, [route, layer]);\n\n useEffect(() => {\n if (!layer) return;\n\n if (editing) {\n layer.editor.enable();\n } else {\n layer.editor.disable();\n }\n }, [editing, layer]);\n\n useEffect(() => {\n if (!layer) return;\n\n if (mode === MODES.POLY && !layer.is_drawing) {\n layer.editor.continue();\n }\n\n if (mode !== MODES.POLY && layer.is_drawing) {\n layer.editor.stop();\n }\n }, [mode, layer]);\n\n useEffect(() => {\n if (!layer) return;\n\n layer.setDirection(drawing_direction);\n }, [drawing_direction, layer]);\n\n return null;\n }\n);\n\nconst Route = connect(mapStateToProps, mapDispatchToProps)(RouteUnconnected);\n\nexport { Route };\n","import { FC, memo, useCallback, useEffect, useState } from 'react';\nimport { OsrmRouter } from '~/utils/map/OsrmRouter';\nimport { connect } from 'react-redux';\nimport { selectMapRoute } from '~/redux/map/selectors';\nimport { selectEditorDistance, selectEditorMode, selectEditorRouter } from '~/redux/editor/selectors';\nimport { MainMap } from '~/constants/map';\nimport * as EDITOR_ACTIONS from '~/redux/editor/actions';\nimport { MODES } from '~/constants/modes';\nimport { divIcon, LatLngLiteral, marker } from 'leaflet';\nimport classNames from 'classnames';\nimport { angleBetweenPoints } from '~/utils/geom';\n\nconst mapStateToProps = state => ({\n route: selectMapRoute(state),\n router: selectEditorRouter(state),\n mode: selectEditorMode(state),\n distance: selectEditorDistance(state),\n});\n\nconst mapDispatchToProps = {\n editorSetRouter: EDITOR_ACTIONS.editorSetRouter,\n};\n\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst RouterUnconnected: FC = memo(\n ({ route, mode, router: { waypoints }, editorSetRouter, distance }) => {\n const [dist, setDist] = useState(0);\n const [end, setEnd] = useState(null);\n const [direction, setDirection] = useState(false);\n\n const updateWaypoints = useCallback(\n ({ waypoints }) => {\n const filtered = waypoints.filter(wp => !!wp.latLng);\n\n if (filtered.length < 2) {\n setDist(0);\n }\n\n editorSetRouter({ waypoints: filtered });\n },\n [editorSetRouter, setDist]\n );\n\n const updateDistance = useCallback(\n ({ routes, waypoints }) => {\n if (!routes || !routes.length || waypoints.length < 2) {\n setDist(0);\n return;\n }\n\n const { summary, coordinates } = routes[0];\n\n if (coordinates.length <= 1) {\n setDist(0);\n return;\n }\n\n const totalDistance = parseFloat((summary.totalDistance / 1000).toFixed(1)) || 0;\n const latlng =\n (waypoints[waypoints.length - 1] && waypoints[waypoints.length - 1].latLng) || null;\n\n const angle = angleBetweenPoints(\n MainMap.latLngToContainerPoint(waypoints[waypoints.length - 1].latLng),\n MainMap.latLngToContainerPoint(coordinates[coordinates.length - 1])\n );\n\n setDist(totalDistance);\n setEnd(latlng);\n setDirection(angle > -90 && angle < 90);\n },\n [setDist, setEnd]\n );\n\n useEffect(() => {\n OsrmRouter.on('waypointschanged', updateWaypoints)\n .on('routesfound', updateDistance)\n .addTo(MainMap);\n\n return () => {\n OsrmRouter.off('waypointschanged', updateWaypoints).setWaypoints([]);\n };\n }, [MainMap, updateWaypoints, mode]);\n\n useEffect(() => {\n if (!dist || !end) {\n return;\n }\n\n const item = marker(end, {\n draggable: false,\n interactive: false,\n icon: divIcon({\n html: `\n
\n ${parseFloat((distance + dist).toFixed(1))}\n
\n `,\n className: classNames('router-marker', { right: !direction }),\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n }),\n zIndexOffset: -100,\n });\n\n item.addTo(MainMap);\n\n return () => {\n item.removeFrom(MainMap).remove();\n };\n }, [dist, end, direction, distance]);\n\n useEffect(() => {\n if (mode !== MODES.ROUTER) {\n setDist(0);\n return;\n }\n\n const wp = OsrmRouter.getWaypoints()\n .filter(point => point.latLng)\n .map(point => point.latLng);\n\n if (\n !route.length ||\n !wp.length ||\n (route[route.length - 1].lat === wp[0].lat && route[route.length - 1].lng === wp[0].lng)\n )\n return;\n\n OsrmRouter.setWaypoints([route[route.length - 1], ...wp]);\n }, [route, mode, waypoints]);\n\n return null;\n }\n);\n\nconst Router = connect(mapStateToProps, mapDispatchToProps)(RouterUnconnected);\n\nexport { Router };\n","import React from 'react';\nimport { Map, TileLayer } from 'leaflet';\n\nexport const MapContext = React.createContext(undefined);\nexport const TileContext = React.createContext(undefined)\n","import React from \"react\";\nimport { TileContext } from \"~/utils/context\";\nimport { TileLayer as TileLayerInterface, tileLayer, Map } from \"leaflet\";\nimport { DEFAULT_PROVIDER, PROVIDERS } from \"~/constants/providers\";\nimport { IMapReducer } from \"~/redux/map\";\n\ntype IProps = React.HTMLAttributes & {\n provider: IMapReducer['provider'],\n map: Map,\n};\n\nconst TileLayer: React.FC = React.memo(({ children, provider, map }) => {\n const [layer, setLayer] = React.useState(undefined);\n\n React.useEffect(() => {\n if (!map) return;\n\n setLayer(\n tileLayer(PROVIDERS[DEFAULT_PROVIDER].url, {\n attribution: \"Независимое Велосообщество\",\n maxNativeZoom: 18,\n maxZoom: 18\n }).addTo(map)\n );\n }, [map]);\n\n React.useEffect(() => {\n if (!layer || !provider) return;\n\n const { url } =\n (provider && PROVIDERS[provider] && PROVIDERS[provider]) ||\n PROVIDERS[DEFAULT_PROVIDER];\n\n layer.setUrl(url);\n }, [layer, provider]);\n\n return (\n \n {children}\n \n );\n});\n\nexport { TileLayer };\n","import React from 'react';\nimport classnames from 'classnames';\n\ninterface Props {\n value: string;\n onChange: (text: string) => void;\n onBlur: () => void;\n}\n\ntype State = {\n text: String;\n}\n\nclass StickerDesc extends React.PureComponent {\n state = {\n text: this.props.value,\n };\n\n setText = e => {\n this.props.onChange(e.target.value);\n };\n\n blockMouse = e => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!this.input) {\n return\n }\n\n this.input.focus();\n };\n\n input: HTMLTextAreaElement | null = null;\n\n render() {\n const { value: text } = this.props;\n\n return (\n \n
\n ') || ' ')\n }}\n />\n { this.input = el; }}\n onBlur={this.props.onBlur}\n />\n
\n
\n )\n }\n}\n\nexport { StickerDesc };\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { marker, Marker } from 'leaflet';\nimport { IStickerDump } from '~/redux/map/types';\nimport { STICKERS } from '~/constants/stickers';\nimport { StickerDesc } from '~/components/StickerDesc';\nimport classNames from 'classnames';\nimport { DomMarker } from '~/utils/map/DomMarker';\nimport { createPortal } from 'react-dom';\nimport { MainMap } from '~/constants/map';\nimport { getAdaptiveScale } from '~/utils/dom';\n\ninterface IProps {\n sticker: IStickerDump;\n onDragStart?: () => void;\n index: number;\n is_editing: boolean;\n zoom: number;\n\n mapSetSticker: (index: number, sticker: IStickerDump) => void;\n mapDropSticker: (index: number) => void;\n}\n\nexport const getLabelDirection = (angle?: number): 'left' | 'right' =>\n !!angle && angle % Math.PI >= -(Math.PI / 2) && angle % Math.PI <= Math.PI / 2 ? 'left' : 'right';\n\nconst getX = e =>\n e.touches && e.touches.length > 0\n ? { pageX: e.touches[0].pageX, pageY: e.touches[0].pageY }\n : { pageX: e.pageX, pageY: e.pageY };\n\nconst Sticker: React.FC = ({\n sticker,\n index,\n is_editing,\n zoom,\n mapSetSticker,\n mapDropSticker,\n}) => {\n const [text, setText] = useState(sticker.text || '');\n const [layer, setLayer] = React.useState(null);\n const [dragging, setDragging] = React.useState(false);\n const wrapper = useRef(null);\n\n let angle = useRef(sticker.angle);\n\n const element = React.useMemo(() => document.createElement('div'), []);\n\n const stickerArrow = React.useRef(null);\n const stickerImage = React.useRef(null);\n\n const onChange = React.useCallback(state => mapSetSticker(index, state), [mapSetSticker, index]);\n const onDelete = React.useCallback(() => setTimeout(() => mapDropSticker(index), 0), [mapDropSticker, index]);\n\n const updateAngle = useCallback(\n ang => {\n const x = Math.cos(ang + Math.PI) * 56 - 30;\n const y = Math.sin(ang + Math.PI) * 56 - 30;\n\n if (!stickerImage.current || !stickerArrow.current) {\n return;\n }\n\n stickerImage.current.style.left = String(6 + x);\n stickerImage.current.style.top = String(6 + y);\n\n stickerArrow.current.style.transform = `rotate(${ang + Math.PI}rad)`;\n },\n [stickerArrow, stickerImage],\n );\n\n const onDragStart = React.useCallback(() => {\n if (!layer?.dragging) {\n return;\n }\n\n layer.dragging.disable();\n MainMap.dragging.disable();\n MainMap.disableClicks();\n\n setDragging(true);\n }, [setDragging, layer]);\n\n const onDragStop = React.useCallback(\n event => {\n event.stopPropagation();\n event.preventDefault();\n\n if (!layer?.dragging) {\n return;\n }\n\n setDragging(false);\n onChange({\n ...sticker,\n angle: angle.current,\n });\n\n layer.dragging.enable();\n MainMap.dragging.enable();\n\n setTimeout(MainMap.enableClicks, 100);\n },\n [setDragging, layer, MainMap, sticker, angle],\n );\n\n const onMoveStarted = React.useCallback(() => {\n MainMap.disableClicks();\n }, [onChange, sticker, MainMap]);\n\n const onMoveFinished = React.useCallback(\n event => {\n const target = event.target as Marker;\n\n onChange({\n ...sticker,\n latlng: target.getLatLng(),\n });\n\n MainMap.enableClicks();\n },\n [onChange, sticker],\n );\n\n const onDrag = React.useCallback(\n event => {\n if (!element) return;\n\n const { x, y } = element.getBoundingClientRect() as DOMRect;\n const { pageX, pageY } = getX(event);\n angle.current = parseFloat(Math.atan2(y - pageY, x - pageX).toFixed(2));\n updateAngle(angle.current);\n },\n [element, updateAngle, angle],\n );\n\n const onTextChange = React.useCallback(text => setText(text), [sticker, onChange]);\n\n const onTextBlur = React.useCallback(() => {\n onChange({\n ...sticker,\n text,\n });\n }, [text, onChange, sticker]);\n\n const direction = React.useMemo(() => {\n getLabelDirection(sticker?.angle);\n }, [sticker.angle]);\n\n useEffect(() => {\n updateAngle(sticker.angle);\n angle.current = sticker.angle;\n }, [sticker.angle]);\n\n useEffect(() => {\n if (!layer) return;\n layer.setLatLng(sticker.latlng);\n }, [layer, sticker.latlng]);\n\n useEffect(() => {\n if (!layer) return;\n\n setText(sticker.text || '');\n }, [layer, sticker.text]);\n\n useEffect(() => {\n if (!wrapper || !wrapper.current) return;\n\n const scale = getAdaptiveScale(zoom); // adaptive zoom :-)\n\n wrapper.current.style.transform = `scale(${scale}) perspective(1px)`;\n }, [zoom, wrapper]);\n\n // Attaches onMoveFinished event to item\n React.useEffect(() => {\n if (!layer) return;\n\n layer.addEventListener('dragstart', onMoveStarted);\n layer.addEventListener('dragend', onMoveFinished);\n\n return () => {\n layer.removeEventListener('dragstart', onMoveStarted);\n layer.removeEventListener('dragend', onMoveFinished);\n };\n }, [layer, onMoveFinished, onMoveStarted]);\n\n // Attaches and detaches handlers when user starts dragging\n React.useEffect(() => {\n if (dragging) {\n document.addEventListener('mousemove', onDrag);\n document.addEventListener('mouseup', onDragStop);\n }\n\n return () => {\n document.removeEventListener('mousemove', onDrag);\n document.removeEventListener('mouseup', onDragStop);\n };\n }, [dragging, onDrag, onDragStop]);\n\n // Initial leaflet marker creation, when element (dom element div) is ready\n React.useEffect(() => {\n const icon = new DomMarker({\n element,\n className: 'sticker-container',\n });\n\n const item = marker(sticker.latlng, { icon, draggable: true });\n\n setLayer(item);\n\n return () => {\n item.remove();\n };\n }, [sticker.latlng, element]);\n\n useEffect(() => {\n if (!layer) return;\n\n layer.addTo(MainMap.stickerLayer);\n\n return () => MainMap.stickerLayer.removeLayer(layer);\n }, [layer]);\n\n React.useEffect(() => {\n element.className = is_editing ? 'sticker-container' : 'sticker-container inactive';\n }, [element, is_editing, layer]);\n\n\n return createPortal(\n
\n
\n
\n \n\n \n\n
\n
\n
,\n element,\n );\n};\n\nexport { Sticker };\n","import React, { useState, memo, FC, useEffect, useCallback } from 'react';\nimport { IStickerDump } from '~/redux/map/types';\nimport { FeatureGroup, Map, LeafletEvent } from 'leaflet';\nimport { Sticker } from '~/map/Sticker';\nimport { mapSetSticker, mapDropSticker } from '~/redux/map/actions';\nimport { MainMap } from '~/constants/map';\n\ninterface IProps {\n stickers: IStickerDump[];\n is_editing: boolean;\n\n mapSetSticker: typeof mapSetSticker;\n mapDropSticker: typeof mapDropSticker;\n}\n\nconst Stickers: FC = memo(({ stickers, is_editing, mapSetSticker, mapDropSticker }) => {\n const [layer, setLayer] = useState(null);\n const [zoom, setZoom] = useState(MainMap.getZoom());\n\n const onZoomChange = useCallback(\n (event) => {\n setZoom(event.zoom);\n },\n [setZoom]\n );\n\n useEffect(() => {\n if (!MainMap) return;\n\n const item = new FeatureGroup().addTo(MainMap.stickerLayer);\n setLayer(item);\n MainMap.on('zoomanim', onZoomChange);\n\n return () => {\n MainMap.off('zoomanim', onZoomChange);\n MainMap.stickerLayer.removeLayer(item);\n };\n }, [MainMap, onZoomChange]);\n\n return (\n
\n {layer &&\n stickers.map((sticker, index) => (\n \n ))}\n
\n );\n});\n\nexport { Stickers };\n","import { divIcon, DivIcon, LatLngLiteral, Marker } from 'leaflet';\n\nconst arrow_image = '/images/arrow.svg';\n\nexport const createArrowIcon = (angle: number) =>\n divIcon({\n html: `\n
\n \n \n \n
\n `,\n className: 'leaflet-arrow-icon',\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n });\n\nexport const createArrow = (latlng: LatLngLiteral, angle: number): Marker =>\n new Marker(latlng, {\n draggable: false,\n interactive: false,\n icon: createArrowIcon(angle),\n });\n\nexport const arrowClusterIcon = (cluster): DivIcon => {\n const markers = cluster.getAllChildMarkers();\n\n // faster way\n cluster.setLatLng(markers[markers.length - 1].getLatLng());\n return markers[markers.length - 1].options.icon;\n};\n","import { divIcon, LatLngLiteral, LayerGroup, Map, marker, Marker } from 'leaflet';\nimport { arrowClusterIcon } from '~/utils/arrow';\nimport { MarkerClusterGroup } from 'leaflet.markercluster/dist/leaflet.markercluster-src.js';\nimport { allwaysPositiveAngleDeg, angleBetweenPoints, distKmHaversine } from '~/utils/geom';\nimport classNames from 'classnames';\nimport { MainMap } from '~/constants/map';\n\nconst arrow_image = '/images/arrow.svg';\n\ninterface KmMarksOptions {\n showStartMarker: boolean;\n showMiddleMarkers: boolean;\n showEndMarker: boolean;\n showArrows: boolean;\n kmMarksStep: number;\n}\n\nclass KmMarksLayer extends LayerGroup {\n constructor(latlngs?: LatLngLiteral[], options?: KmMarksOptions) {\n super();\n\n this.options = {\n showStartMarker: true,\n showMiddleMarkers: true,\n showEndMarker: true,\n showArrows: true,\n kmMarksStep: 10,\n ...(options || {}),\n } as KmMarksOptions;\n }\n\n setLatLngs = (latlngs: LatLngLiteral[]): void => {\n if (!this.map) return;\n\n this.marksLayer.clearLayers();\n this.endMarker.clearLayers();\n\n this.distance = 0;\n\n if (latlngs.length <= 1) return;\n\n if (this.options.showMiddleMarkers) this.drawMiddleMarkers(latlngs);\n if (this.options.showEndMarker) this.drawEndMarker(latlngs);\n };\n\n drawMiddleMarkers = (latlngs: LatLngLiteral[]) => {\n const marks: Marker[] = [];\n let last_km_mark = 0;\n\n this.distance = latlngs.reduce((dist, current, index) => {\n if (index >= latlngs.length - 1) return dist;\n\n const next = latlngs[index + 1];\n const diff = distKmHaversine(current, next);\n const sum = dist + diff;\n const rounded = Math.floor(sum / this.options.kmMarksStep) * this.options.kmMarksStep;\n const count = Math.floor((rounded - last_km_mark) / this.options.kmMarksStep);\n\n if (rounded > last_km_mark) {\n const angle = angleBetweenPoints(\n this.map.latLngToContainerPoint(current),\n this.map.latLngToContainerPoint(next)\n );\n\n // if segment is too long, we'll add multiple markers on it\n for (let i = 1; i <= count; i += 1) {\n const step = last_km_mark + i * this.options.kmMarksStep;\n const shift = (step - dist) / diff;\n\n const coords = {\n lat: current.lat - (current.lat - next.lat) * shift,\n lng: current.lng - (current.lng - next.lng) * shift,\n };\n\n marks.push(this.createMiddleMarker(coords, angle, step));\n }\n\n last_km_mark = rounded;\n }\n\n return sum;\n }, 0);\n\n this.marksLayer.addLayers(marks);\n };\n\n createMiddleMarker = (latlng: LatLngLiteral, angle: number, distance: number): Marker =>\n marker(latlng, {\n draggable: false,\n interactive: false,\n icon: divIcon({\n html: `\n
\n ${distance}\n \n \n \n
\n `,\n className: 'leaflet-km-marker',\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n }),\n });\n\n createEndMarker = (latlng: LatLngLiteral, angle: number, distance: number): Marker =>\n marker(latlng, {\n draggable: false,\n interactive: false,\n icon: divIcon({\n html: `\n
\n ${parseFloat(distance.toFixed(1))}\n
\n `,\n className: classNames('leaflet-km-marker end-marker', { right: angle > -90 && angle < 90 }),\n iconSize: [11, 11],\n iconAnchor: [6, 6],\n }),\n zIndexOffset: -100,\n });\n\n createStartMarker = (latlng: LatLngLiteral): Marker =>\n marker(latlng, {\n draggable: false,\n interactive: false,\n icon: divIcon({\n html: `\n \n \n \n \n \n `,\n className: classNames('leaflet-km-marker start-marker'),\n iconSize: [20, 20],\n iconAnchor: [6, 6],\n }),\n zIndexOffset: -100,\n });\n\n drawEndMarker = (latlngs: LatLngLiteral[]): void => {\n this.endMarker.clearLayers();\n\n const current = latlngs[latlngs.length - 2];\n const next = latlngs[latlngs.length - 1];\n\n const angle = angleBetweenPoints(\n this.map.latLngToContainerPoint(current),\n this.map.latLngToContainerPoint(next)\n );\n\n this.endMarker.addLayer(this.createEndMarker(next, angle, this.distance));\n if (latlngs && latlngs.length) {\n this.endMarker.addLayer(this.createStartMarker(latlngs[0]));\n }\n };\n\n options: KmMarksOptions;\n map: Map = MainMap;\n marksLayer: MarkerClusterGroup = new MarkerClusterGroup({\n spiderfyOnMaxZoom: false,\n showCoverageOnHover: false,\n zoomToBoundsOnClick: false,\n animate: false,\n maxClusterRadius: 120,\n iconCreateFunction: arrowClusterIcon,\n });\n endMarker: LayerGroup = new LayerGroup();\n distance: number = 0;\n}\n\nKmMarksLayer.addInitHook(function(this: KmMarksLayer) {\n this.once('add', event => {\n if (event.target instanceof KmMarksLayer) {\n this.map = event.target._map;\n this.marksLayer.addTo(this.map);\n this.endMarker.addTo(this.map);\n }\n });\n\n this.once('remove', event => {\n if (event.target instanceof KmMarksLayer) {\n this.marksLayer.removeFrom(this.map);\n this.endMarker.removeFrom(this.map);\n }\n });\n});\n\nexport { KmMarksLayer };\n","import React, { FC, memo, useEffect, useState } from 'react';\nimport { KmMarksLayer } from '~/utils/marks';\nimport { MainMap } from '~/constants/map';\nimport { selectMap } from '~/redux/map/selectors';\nimport pick from 'ramda/es/pick';\nimport { connect } from 'react-redux';\nimport { IState } from '~/redux/store';\n\nconst mapStateToProps = (state: IState) => ({\n map: pick(['route'], selectMap(state)),\n});\n\nconst mapDispatchToProps = {};\ntype Props = ReturnType & typeof mapDispatchToProps & {};\n\nconst KmMarksUnconnected: FC = memo(({ map: { route } }) => {\n const [layer, setLayer] = useState(null);\n\n useEffect(() => {\n const layer = new KmMarksLayer([]);\n layer.addTo(MainMap);\n setLayer(layer);\n return () => MainMap.removeLayer(layer);\n }, []);\n\n useEffect(() => {\n if (!layer) return;\n\n layer.setLatLngs(route);\n }, [layer, route]);\n return null;\n});\n\nconst KmMarks = connect(mapStateToProps, mapDispatchToProps)(KmMarksUnconnected);\n\nexport { KmMarks };\n","import React, { FC, useCallback, useEffect } from 'react';\nimport { DivIcon, LatLngLiteral, Marker } from 'leaflet';\nimport { MainMap } from '~/constants/map';\n\ninterface IProps {\n location?: LatLngLiteral;\n}\n\nconst CurrentLocation: FC = ({ location }) => {\n const zoomToLocation = useCallback(({ latlng }) => MainMap.setView(latlng, 17), [MainMap]);\n\n useEffect(() => {\n if (!location) return;\n\n const item = new Marker(location, {\n icon: new DivIcon({\n html: `\n
\n \n \n \n \n \n \n \n
\n `,\n }),\n })\n .on('click', zoomToLocation)\n .addTo(MainMap);\n\n return () => item.removeFrom(MainMap);\n }, [MainMap, location, zoomToLocation]);\n\n return null;\n};\n\nexport { CurrentLocation };\n","import { FC, useEffect, useState } from 'react';\nimport { Polyline, LatLngLiteral } from 'leaflet';\nimport { MainMap } from '~/constants/map';\n\ninterface IProps {\n latlngs: LatLngLiteral[];\n color: string;\n}\n\nconst GpxPolyline: FC = ({ latlngs, color }) => {\n const [layer, setLayer] = useState(null);\n\n useEffect(() => {\n const item = new Polyline([], {\n color,\n stroke: true,\n opacity: 1,\n weight: 7,\n // dashArray: [12,12],\n }).addTo(MainMap);\n setLayer(item);\n\n return () => MainMap.removeLayer(item);\n }, [MainMap]);\n\n useEffect(() => {\n if (!layer) return;\n\n layer.setLatLngs(latlngs);\n layer.setStyle({ color });\n }, [latlngs, layer, color]);\n\n return null;\n};\n\nexport { GpxPolyline };\n","import React, { memo } from 'react';\n\nimport { MainMap } from '~/constants/map';\nimport { createPortal } from 'react-dom';\nimport { selectMapProvider, selectMapRoute, selectMapStickers } from '~/redux/map/selectors';\nimport { connect } from 'react-redux';\nimport * as MAP_ACTIONS from '~/redux/map/actions';\n\nimport { Route } from '~/map/Route';\nimport { Router } from '~/map/Router';\nimport { TileLayer } from '~/map/TileLayer';\nimport { Stickers } from '~/map/Stickers';\nimport { KmMarks } from '~/map/KmMarks';\nimport { CurrentLocation } from '~/map/CurrentLocation';\nimport { GpxPolyline } from '~/map/GpxPolyline';\n\nimport 'leaflet/dist/leaflet.css';\nimport { selectEditorEditing, selectEditorMode, selectEditorGpx } from '~/redux/editor/selectors';\nimport { MODES } from '~/constants/modes';\nimport { selectUserLocation } from '~/redux/user/selectors';\n\nconst mapStateToProps = state => ({\n provider: selectMapProvider(state),\n route: selectMapRoute(state),\n stickers: selectMapStickers(state),\n editing: selectEditorEditing(state),\n mode: selectEditorMode(state),\n location: selectUserLocation(state),\n gpx: selectEditorGpx(state),\n});\n\nconst mapDispatchToProps = {\n mapSetRoute: MAP_ACTIONS.mapSetRoute,\n mapDropSticker: MAP_ACTIONS.mapDropSticker,\n mapSetSticker: MAP_ACTIONS.mapSetSticker,\n mapClicked: MAP_ACTIONS.mapClicked,\n};\n\ntype IProps = React.HTMLAttributes &\n ReturnType &\n typeof mapDispatchToProps & {};\n\nconst MapUnconnected: React.FC = memo(\n ({\n provider,\n stickers,\n editing,\n mode,\n location,\n gpx,\n\n mapClicked,\n mapSetSticker,\n mapDropSticker,\n }) => {\n const onClick = React.useCallback(\n event => {\n if (!MainMap.clickable || mode === MODES.NONE) return;\n\n mapClicked(event.latlng);\n },\n [mapClicked, mode]\n );\n\n React.useEffect(() => {\n MainMap.addEventListener('click', onClick);\n\n return () => {\n MainMap.removeEventListener('click', onClick);\n };\n }, [MainMap, onClick]);\n\n return createPortal(\n
\n \n\n \n\n \n \n\n \n \n\n {gpx.enabled &&\n gpx.list.map(\n ({ latlngs, enabled, color }, index) =>\n enabled && \n )}\n
,\n document.getElementById('canvas')!\n );\n }\n);\n\nconst Map = connect(mapStateToProps, mapDispatchToProps)(MapUnconnected);\nexport { Map };\n","import React from 'react';\n\nimport { EditorPanel } from '~/components/panels/EditorPanel';\nimport { Fills } from '~/components/Fills';\nimport { UserPanel } from '~/components/panels/UserPanel';\nimport { connect } from 'react-redux';\n\nimport { Renderer } from '~/components/renderer/Renderer';\nimport { editorHideRenderer, editorSetDialogActive } from '~/redux/editor/actions';\nimport { LeftDialog } from '~/containers/LeftDialog';\nimport { TopLeftPanel } from '~/components/panels/TopLeftPanel';\nimport { TopRightPanel } from '~/components/panels/TopRightPanel';\nimport { LogoPreview } from '~/components/logo/LogoPreview';\nimport { IStickerPack } from '~/constants/stickers';\nimport { DIALOGS } from '~/constants/dialogs';\n\nimport { Map } from '~/map/Map';\nimport { IEditorState } from '~/redux/editor';\nimport { IState } from '~/redux/store';\n\ntype Props = {\n sticker: string;\n renderer_active: boolean;\n\n mode: IEditorState['mode'];\n dialog: keyof typeof DIALOGS;\n dialog_active: boolean;\n set: keyof IStickerPack;\n editorHideRenderer: typeof editorHideRenderer;\n editorSetDialogActive: typeof editorSetDialogActive;\n};\n\nconst AppUnconnected = (props: Props) => (\n
\n \n \n \n\n \n \n\n \n\n \n\n \n\n {props.renderer_active && }\n
\n);\n\nconst mapStateToProps = ({\n editor: {\n mode,\n dialog,\n dialog_active,\n renderer,\n activeSticker: { sticker, set },\n },\n}: IState) => ({\n renderer_active: renderer.renderer_active,\n mode,\n dialog,\n dialog_active,\n sticker,\n set,\n});\n\nconst mapDispatchToProps = { editorHideRenderer, editorSetDialogActive };\n\nconst App = connect(mapStateToProps, mapDispatchToProps)(AppUnconnected);\n\nexport { App };\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { App } from '~/containers/App';\nimport '~/styles/_main.scss';\n\nimport { Provider } from 'react-redux';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport { configureStore } from '~/redux/store';\nimport { pushLoaderState } from '~/utils/history';\n\nconst { store, persistor } = configureStore();\n\npushLoaderState(10);\n\nconst Index = () => (\n \n \n \n \n \n);\n\nReactDOM.render(, document.getElementById('index'));\n"],"sourceRoot":""}