{"version":3,"sources":["img/iflower-logo.png","img/marker-1.png","img/home-marker-blue.png","img/pointer-marker-red.png","img/map-radar-blue.png","img/shop-marker-blue.png","img/iflower-intro-bg.png","components/Intro.js","img/zalo-icon-blue.png","img/phone-icon-blue.png","img/directions-icon-blue.png","components/Shop.js","api/apiRequestIntance.js","api/apiService.js","components/utils/strConverter.js","components/MessageInfo.js","img/search-blue.png","img/show-list-blue.png","img/show-map-blue.png","components/Searcher.js","components/LoadingSpinner.js","components/SearcherCtrl.js","img/shops-banner-bg12.png","img/flower-shop-square.png","img/shops-banner-bg.jpg","components/ScannedShop.js","components/Scanner.js","components/ScannerCtrl.js","components/SearchButton.js","components/ScannerButton.js","components/Popup.js","components/utils/useGAEventTracker.js","components/Map.js","App.js","index.js"],"names":["Intro","_jsxs","id","children","_jsx","className","src","bg","alt","href","style","backgroundColor","color","Shop","React","Component","constructor","props","super","this","state","isExpanded","toggleExpand","bind","formatItems","items","join","summary","substr","length","indexOfLastSpace","split","reverse","indexOf","setState","render","ShopName","DisplayName","DisplayAddress","PhoneNumber","Banner","data","zaloCall","phoneCall","urlBanner","padding","fontFamily","onClick","handleClickedItem","alignContent","textAlign","height","width","margin","clear","opacity","fontSize","fontWeight","float","directions","handleDirections","zalo","phone","instance","axios","create","baseURL","withCredentials","async","getToken","console","log","url","method","headers","ContentType","Timeout","Email","Password","catch","e","error","refreshToken","callGetApiInstance","endpoint","SIX_APP_API_JWT","localStorage","getItem","response","status","setItem","removeItem","Authorization","getAllShops","getDirection","start","dest","callService","removeVieTones","str","trim","replace","removeSpecName","originalString","toLowerCase","map","item","removeSpecAddress","addSpecAddressRule","includes","aggregateKeyList","queryList","i","j","concatRange","slice","filter","element","concat","aggregateKey","query","ret","j1","onlyUnique","value","index","array","MessageInfo","_ref","msg1","msg2","Searcher","handleToggler","results","isDirectMode","isDirectInit","isDirectLocateInit","isDirectPoint","currentCoords","lng","lat","currentZoom","currentLng","currentLat","firstLoad","isLoading","filteredList","isCollapsed","destLng","destLat","startLng","startLat","onChange","handleSearch","handleCalls","handleListToggler","then","drawMap","initSearcher","initSpinner","geo","geoScan","selectMarker","srcMarkerScan","removeControl","getCenter","initMarker","setZoom","name","spinner","highlightMarkers","addControl","jsonMarkers","JSON","stringify","_destLng","_destLat","getSuggestions","parse","p","Longitude","Latitude","redrawDirections","handleDirection","toFixed","srcMarker","on","coords","longitude","latitude","updatedValue","getZoom","setLngLat","getElement","addEventListener","genFeatureListFromGeoData","json","newFeaturesList","push","type","geometry","coordinates","parseFloat","properties","ShopId","displayName","address","Address","displayAddress","phoneNumber","banner","features","genFeatureListFromGeoList","markers","isChangedLocation","setMapCenter","generateGeoJSON","hours","location","getFilterCentersSuggestions","termsString","terms","List","every","term","District","Province","some","f","aggrFilterList","Ward","Street","match","data2","data3","ShopAddress","initializeMap","textFeatureList","t","s","textFeatureCollection","getSource","setData","initMap","vendor","usualgeoJSON","highlightgeoJSON","jsonFilteredMarkers","popup","marker","redrawMap","oriHighlightMarkers","jsonOriFilteredMarkers","routeFeature","routes","plotOnMap","apply","trucks","branches","b","schedule","usualMarkers","m","getLayer","removeLayer","removeSource","addSource","addLayer","interactive","source","paint","setCenter","getDistance","fromLngLat","toLngLat","from","turf","to","units","makeRadius","lngLatArray","radiusInMeters","point","spatialJoin","sourceGeoJSON","filterFeature","feature","preventDefault","fetchShops","useGAEventTracker","gaEventTracker","target","initDirections","window","screen","componentDidMount","_isExpanded","filteredMarkers","resultsCount","isFirstLoad","keyword","renderedResults","mapViewMode","listViewMode","onSubmit","placeholder","searchBlue","border","sx","position","overflow","maxWidth","maxHeight","marginTop","marginBottom","LoadingSpinner","SearcherCtrl","initGeoLoc","arrLngLat","remove","addTo","isDisplayed","isStart","destMarkerScan","onAdd","container","document","createElement","ReactDOM","curCoords","handleRadar","directionModeRef","currentMarkerRef","geoLocate","geoLocateRef","handleZoom","resetSource","onRemove","parentNode","removeChild","ScannedShop","Scanner","oriResults","highlightResults","joinedHighlightResults","mapSource","isScanInit","isScanLocateUsed","refreshScan","handleScan","scan","searchRadius","featuresInBuffer","joinedHighlightGeo","joinedHighlighResults","initScanner","sourceId","isSourceLoaded","joinedPoints","querySourceFeatures","filteredPoints","ele","idx","findIndex","elem","distance","selectMarkerScan","current","handleSelection","mapRadarBlue","ScannerCtrl","SearchButton","mapResult","handleScanner","searcher","scanner","innerHTML","search","initGUI","layout","ScannerButton","Popup","category","arguments","undefined","action","label","ReactGA","event","Map","mapContainer","useRef","popUpRef","mapboxgl","offset","spinnerRef","GeolocateControl","positionOptions","enableHighAccuracy","trackUserLocation","showUserHeading","elAppSpinner","elSpinner","el","elMapRadar","elSrc","elDest","btnSearcher","btnScanner","setMap","useState","setGeo","setGeoScan","setSearcher","setScanner","setSpinner","appSpinner","setAppSpinner","setPopup","isSearchActivated","setIsSearchActivated","setMapResult","setSelectMarker","setSelectMarkerScan","setSrcMarker","setSrcMarkerScan","setDestMarkerScan","setIsExpanded","mapData","setMapData","setMapSource","setLng","setLat","zoom","isSearch","useEffect","accessToken","process","center","maxZoom","minZoom","background","zIndex","borderRadius","Marker","loadImage","markerImg1","image","addImage","markerImg","setLayoutProperty","backgroundImage","pointerMarkerRed","backgroundSize","homeMarkerBlue","shopMarkerBlue","getCanvas","cursor","popupNode","setDOMContent","size","flyTo","logo","ref","initialize","App","pageview","pathname","Router","Route","path","component","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.8375d8f5.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/iflower-logo.8292ab36.png\";","export default __webpack_public_path__ + \"static/media/marker-1.ac2d69a5.png\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAECUExURYLQ9gBo/4LQ93vN93/P93/P9obP83nN94HQ9////3/M8nrN9n7O94TR94bR9n3O933M84PQ94PN837M84XR95mZmZubm3vL84HN83zL83rN94DP93zO94fP9JWVlaCgoI2NjaKioqysrJOTk5GRkYODg4CAgImJiaioqIiIiKenp5CQkJaWlpiYmLOzs62trZ+fn5eXl4DP9p2dnYuLi7CwsISEhKurq6WlpZ6enq+vr5ycnIGBgYyMjLGxsZSUlKurqrS0s6ampn9/f4+Pj6mpqaOjo6SkpI6OjoKCgobR94WFhXvN9oeHh35+fpqamoqKirS0tLCwr62trIDN8gAAALgMZJ8AAABWdFJOU/////////////////////////////////////////////////////////////////////////////////////////////////////////////////8ASk1s2QAAAAlwSFlzAAALEwAACxMBAJqcGAAAIBhJREFUeF7t3XuTJlWRx3GBcWAQFAVZVySIdQlAgfUSqBHqrlfCUNdYd3Xe/1vZp3u+z62qMvPcK8+p8/mL56lTdfJk/uieS3fPV55PhzYDcHAzAAc3A3BwMwAHNwNwcDMABzcDcHAzAAc3A3BwMwAHNwNwcDMABzcDcHAzAAc3A3BwhwvAV15SvcyywzhGAJhuJG4e29gBYJJ5XuFhYxo1AAyvIB48mgEDwMCqYIuBjBUAxlQZm41hnAAwnUaesGv3hggAQ2mO7bvWfwAYxk4ool99B4Ap7Ixi+tRxAGi/C5TUoV4DQOMd+SqVdabLANByd55SX0/6CwDNdooi+9FZAGiza5TaiZ4CQIM7QME96CcA9LYTFO1fJwGgrV2hdOe6CAAd7Q7lu+Y/ADSzUxzCL+8BoI8d4yBe+Q4APewch/HJcwDo3wA4kEduA/AqvRsFx3LHaQCe0LaRcDRnfAaAlo2G07niMQC0a0AOv5LQXwDo1aA4pB/eAkCfBsZBvfAVAHo0OA7rg6cA0J8D4MAe+AkAvTkIDr0/NwGgMdW99kz1Osuq49i7cxIAulLNU+Ybg1ur4eg7cxEAOlID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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/map-radar-blue.004b9c7e.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/iflower-intro-bg.61da84dd.png\";","import React from \"react\";\n//import logo from \"./../img/iflower-logo.png\";\nimport bg from \"./../img/iflower-intro-bg.png\";\n\nexport default function Intro() {\n return (\n
\n
\n \"App\n
\n
\n

Welcome to iFlower.vn

\n

Nền tảng tìm kiếm Shop hoa tươi toàn quốc

\n
\n
\n Dễ dàng tìm kiếm địa điểm chính xác, ưng ý nhất trên mạng lưới hàng nghìn Shop hoa toàn quốc.\n
\n
\n
\n
\n Shop hoa có cơ hội tiếp cận hàng triệu Khách hàng trong và ngoài nước có nhu cầu tặng hoa.\n
\n
\n
\n
\n Phát triển, định vị Thương hiệu và Sản phẩm Shop hoa trên nền tảng Bản đồ số.\n
\n
\n
\n\n //
\n //

\n // iFlower.vn - Nền tảng tìm kiếm địa điểm Shop hoa tươi toàn quốc\n //

\n // \n // \"iFlower\"\n // {/*\"iFlower\"*/}\n // \n //

\n // Người dùng dễ dàng tìm kiếm địa điểm ưng ý nhất thông qua mạng lưới hàng nghìn Shop hoa toàn quốc tại iFlower.vn.\n //

\n \n //

\n // Shop hoa có cơ hội tiếp cận hàng triệu khách hàng trong nước và nước ngoài có nhu cầu tặng hoa tại Việt Nam.\n //

\n //

\n // Phát triển, định vị Thương hiệu và Sản phẩm Shop hoa trên nền tảng BẢN ĐỒ SỐ thông minh cùng nhiều trải nghiệm thú vị.\n //

\n //
\n );\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport zalo from \"./../img/zalo-icon-blue.png\";\nimport phone from \"./../img/phone-icon-blue.png\";\nimport directions from \"./../img/directions-icon-blue.png\";\n///import banner1 from \"./../img/shops-banner-bg12.png\";\n//import banner2 from \"./../img/flower-shop-square.png\";\n//import banner from \"./../img/shops-banner-bg.jpg\";\n\nexport default class Shop extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isExpanded: false,\n };\n\n this.toggleExpand = this.toggleExpand.bind(this);\n }\n\n formatItems(items) {\n if (this.state.isExpanded) {\n return items.join(\", \");\n }\n const summary = items.join(\", \").substr(0, 80);\n if (summary.length > 70) {\n const indexOfLastSpace =\n summary.split(\"\").reverse().join(\"\").indexOf(\",\") + 1;\n return summary.substr(0, 80 - indexOfLastSpace) + \" & more...\";\n }\n return summary;\n }\n\n toggleExpand() {\n this.setState({\n isExpanded: !this.state.isExpanded,\n });\n }\n\n render() {\n const { ShopName, DisplayName, DisplayAddress, PhoneNumber, Banner } = this.props.data;\n let zaloCall = \"https://zalo.me/\" + PhoneNumber.split(/\\s/).join('');\n let phoneCall = \"tel:\" + PhoneNumber.split(/\\s/).join('');\n let urlBanner = Banner ? \"https://vinflower.com/wp-content/uploads/iflower/images/banners/\" + Banner : \"https://vinflower.com/wp-content/uploads/2023/06/5539763.png\";\n\n return (\n
  • \n
    \n
    \n {/*
    {DisplayName}
    */}\n {/*{this.props.data['name'] }*/}\n
    \n
    \n {/*\"Banner\"*/}\n \"Banner\"\n
    \n
    \n
    \n
    {DisplayName}
    \n
    {DisplayAddress}
    \n\n\n {/**/}\n {/*
    Gọi ngay
    */}\n {/*
    */}\n {/*
    {DisplayAddress}
    */}\n {/*
    */}\n {/* */}\n {/* \"Directions\"*/}\n {/* */}\n {/*
    */}\n
    \n
    \n \"Directions\"\n \n \"Phone\"\n \n \n \"Zalo\"\n \n
    \n
    \n
  • \n );\n }\n}\n","import axios from \"axios\";\r\n\r\nconst instance = axios.create({\r\n baseURL: `${process.env.REACT_APP_API_URL}`,\r\n withCredentials: false,\r\n //headers: {\r\n // ContentType: 'application/json;charset=utf-8',\r\n // Authorization: `Bearer ${API_JWT}`,\r\n // timeout: 5000,\r\n //}, \r\n});\r\n\r\nexport function validateEnv() {\r\n if (process.env.REACT_APP_API_URL == null)\r\n throw new Error(\"App Message: You need to have API_URL (env), see README\");\r\n if (process.env.REACT_APP_SIX_OPEN_ID == null)\r\n throw new Error(\"App Message: The Client need to have SIX_OPEN_ID (env), see README\");\r\n if (process.env.REACT_APP_API_URL == null)\r\n throw new Error(\"App Message: The Client need to have SIX_SECRET_KEY (env), see README\");\r\n}\r\n\r\nexport async function login(username, password) {\r\n const response = await axios.post('api/tokens', {username,password});\r\n if (response.status === 200) {\r\n const token = response.data;\r\n sessionStorage.setItem('token', token);\r\n }\r\n}\r\n\r\nexport async function getToken() {\r\n try {\r\n validateEnv();\r\n console.log(\"App Message: Get Access Token\");\r\n return await instance({\r\n url: \"tokens\",\r\n method: \"POST\",\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Timeout: 5000,\r\n },\r\n data: { Email: `${process.env.REACT_APP_SIX_OPEN_ID}`, Password: `${process.env.REACT_APP_SIX_SECRET_KEY}` },\r\n })\r\n //.then((res) => {\r\n //// handle success\r\n //console.log(res);\r\n //})\r\n .catch((e) => {\r\n // handle error\r\n //console.log(e);\r\n });\r\n } catch (e) {\r\n // handle error\r\n console.error(e);\r\n }\r\n}\r\n\r\nexport async function refreshToken() {\r\n try {\r\n validateEnv();\r\n console.log(\"App Message: Refreshed Token\");\r\n return await instance({\r\n url: \"tokens/refreshToken\",\r\n method: \"GET\",\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Timeout: 5000,\r\n },\r\n //data: { Email: `${userName}`, RefreshToken: `${refreshToken}` },\r\n })\r\n //.then((res) => {\r\n //// handle success\r\n //console.log(res);\r\n //})\r\n .catch((e) => {\r\n // handle error\r\n console.log(e);\r\n });\r\n } catch (e) {\r\n // handle error\r\n console.error(e);\r\n }\r\n}\r\n\r\n//export const initApiInstace = ({ jwt: token}) => {\r\n// if (process.env.API_ACCESS_TOKEN == null) {\r\n// throw new Error(\"You need to have API_ACCESS_TOKEN (env), see README\");\r\n// }\r\n\r\n// console.log(\"Initialize API instance\");\r\n// return axios.create({\r\n// baseURL: API_URL,\r\n// headers: {\r\n// ContentType: 'application/json;charset=utf-8',\r\n// Authorization: `Bearer ${API_JWT}`,\r\n// timeout: 5000,\r\n// },\r\n// });\r\n//};\r\n\r\n\r\n//const instance = () => {\r\n// if (process.env.REACT_APP_API_ACCESS_TOKEN == null) {\r\n// throw new Error(\"App Message: You need to have API_ACCESS_TOKEN (env), see README\");\r\n// }\r\n// if (process.env.REACT_APP_API_URL == null) {\r\n// throw new Error(\"App Message: You need to have API_URL (env), see README\");\r\n// }\r\n\r\n// API_URL = process.env.REACT_APP_API_URL;\r\n// API_JWT = process.env.REACT_APP_API_ACCESS_TOKEN;\r\n// console.log(\"Initialize API instance\");\r\n// return axios.create({\r\n// baseURL: API_URL,\r\n// headers: {\r\n// ContentType: 'application/json;charset=utf-8',\r\n// Authorization: `Bearer ${API_JWT}`,\r\n// timeout: 5000,\r\n// },\r\n// });\r\n//};\r\n\r\nexport default instance;","import axios from \"axios\";\r\nimport instance from './apiRequestIntance';\r\nimport { getToken, refreshToken } from './apiRequestIntance';\r\n\r\n//TODO: Remove\r\nconst API_URL = \"http://localhost:64191/api/\";\r\nconst API_JWT = \"\";\r\n\r\nexport async function callService(endpoint, method) { \r\n try {\r\n return await instance({\r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n //Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n })\r\n //.then((res) => {\r\n //// handle success\r\n //console.log(res);\r\n //})\r\n //.catch((e) => {\r\n // // handle error\r\n // console.log(\"App Message: CallGetApiInstance - \" + e);\r\n // isSuccessed = false;\r\n //});\r\n } catch (e) {\r\n // handle error \r\n console.log(\"App Message: [401] Access Denied - Refresh Token...\");\r\n }\r\n}\r\n\r\nexport async function callGetApiInstance(endpoint, method) {\r\n let SIX_APP_API_JWT = \"\";\r\n try {\r\n SIX_APP_API_JWT = localStorage.getItem('token');\r\n if (SIX_APP_API_JWT === null || SIX_APP_API_JWT === \"\") {\r\n const response = await getToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n else {\r\n console.log(\"App Message: Cannot get Token from server\");\r\n localStorage.removeItem('token', SIX_APP_API_JWT);\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"App Message: Cannot get Token from storage\");\r\n localStorage.removeItem('token', SIX_APP_API_JWT);\r\n }\r\n try { \r\n return await instance({ \r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n })\r\n //.then((res) => {\r\n //// handle success\r\n //console.log(res);\r\n //})\r\n //.catch((e) => {\r\n // // handle error\r\n // console.log(\"App Message: CallGetApiInstance - \" + e);\r\n // isSuccessed = false;\r\n //});\r\n } catch (e) { \r\n // handle error \r\n console.log(\"App Message: [401] Access Denied - Refresh Token...\");\r\n try {\r\n const response = await refreshToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n return await instance({\r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n })\r\n }\r\n catch (e) {\r\n console.log(\"App Message: [400] Bad Request - Reget Token...\");\r\n const response = await getToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n return await instance({\r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport async function callPayloadApiInstance(endpoint, method, payload) {\r\n let SIX_APP_API_JWT = \"\";\r\n try {\r\n SIX_APP_API_JWT = localStorage.getItem('token');\r\n if (SIX_APP_API_JWT === null || SIX_APP_API_JWT === \"\") {\r\n const response = await getToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n else {\r\n console.log(\"App Message: Cannot get Token from server\");\r\n localStorage.removeItem('token', SIX_APP_API_JWT);\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"App Message: Cannot get Token from storage\");\r\n localStorage.removeItem('token', SIX_APP_API_JWT);\r\n }\r\n\r\n try { \r\n return await instance({ \r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n data: payload,\r\n })\r\n //.then((res) => {\r\n //// handle success\r\n //console.log(res);\r\n //})\r\n //.catch((e) => {\r\n // // handle error\r\n // console.log(\"App Message: CallPayloadApiInstance - \" + e);\r\n //});\r\n } catch (e) {\r\n // handle error\r\n console.log(\"App Message: [401] Access Denied - Refresh Token...\");\r\n try {\r\n const response = await refreshToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n return await instance({\r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n data: payload,\r\n })\r\n }\r\n catch (e) {\r\n console.log(\"App Message: [401] Bad Request - Reget Token...\");\r\n const response = await getToken();\r\n SIX_APP_API_JWT = \"\";\r\n if (response.status === 200) {\r\n SIX_APP_API_JWT = response.data;\r\n localStorage.setItem('token', SIX_APP_API_JWT);\r\n }\r\n return await instance({\r\n url: endpoint,\r\n method: method,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${SIX_APP_API_JWT}`,\r\n Timeout: 5000,\r\n },\r\n data: payload,\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport async function getAllShops(endpoint) {\r\n //return callGetApi(endpoint); \r\n return await callGetApiInstance(endpoint, \"GET\");\r\n}\r\n\r\nexport async function getDirection(start, dest) { \r\n //const start = '105.8087552,21.0265046';\r\n //const start = '105.8087552,21.0265046';\r\n //return callGetApi(endpoint); \r\n //const endpoint = `https://api.mapbox.com/directions/v5/mapbox/driving/105.8087552,21.0265046;105.8087552,21.0265046?access_token=${mapboxgl.accessToken}&geometries=geojson`;\r\n const endpoint = `${process.env.REACT_APP_MAP_API_URL}${start};${dest}?access_token=${process.env.REACT_APP_MAP_ACCESS_TOKEN}&geometries=geojson`;\r\n return await callService(endpoint, \"GET\");\r\n}\r\n\r\n\r\nexport async function getShopsById(endpoint, id) {\r\n //return callApi(endpoint + \"/\" + id, \"GET\");\r\n //return callGetApi(endpoint + \"/\" + id);\r\n return await callGetApiInstance(endpoint + \"/\" + id, \"GET\");\r\n}\r\n\r\nexport async function getShopsByQuery(endpoint, query) {\r\n //return callApi(endpoint + \"?q=\" + query, \"GET\");\r\n //return callGetApi(endpoint + \"?q=\" + query);\r\n return await callGetApiInstance(endpoint + \"?q=\" + query, \"GET\");\r\n}\r\n\r\nexport async function addShops(endpoint, data) {\r\n //return callApi(endpoint, \"POST\", data);\r\n return await callPayloadApiInstance(endpoint, \"POST\", data);\r\n}\r\n\r\nexport async function editShop(endpoint, data) {\r\n //return callApi(endpoint, \"PUT\", data);\r\n return await callPayloadApiInstance(endpoint, \"PUT\", data);\r\n}\r\n\r\nexport async function deleteShop(endpoint, data) {\r\n //return callApi(endpoint, \"DELETE\");\r\n return await callPayloadApiInstance(endpoint, \"DELETE\", data);\r\n}\r\n\r\nexport async function getAllCategories(endpoint) {\r\n //return callApi(endpoint, \"GET\");\r\n //return callGetApi(endpoint, \"GET\");\r\n return await callGetApiInstance(endpoint, \"GET\");\r\n}\r\n\r\n\r\n//______________________________\r\nexport function callApi(endpoint, method = \"GET\", body) {\r\n return axios({\r\n method,\r\n url: `${API_URL}/${endpoint}`,\r\n data: body,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${API_JWT}`,\r\n }\r\n }).catch((e) => {\r\n console.log(e);\r\n });\r\n}\r\n\r\nexport function callGetApi(endpoint) {\r\n return axios({\r\n method: 'get',\r\n url: `${API_URL}/${endpoint}`,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${API_JWT}`,\r\n }\r\n }).catch((e) => {\r\n console.log(e);\r\n });\r\n}\r\n\r\nexport function callPostApi(endpoint, payload) {\r\n return axios({\r\n method: 'post',\r\n url: `${API_URL}/${endpoint}`,\r\n data: payload,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${API_JWT}`,\r\n }\r\n }).catch((e) => {\r\n console.log(e);\r\n });\r\n}\r\n\r\nexport function callPutApi(endpoint, payload) {\r\n return axios({\r\n method: 'put',\r\n url: `${API_URL}/${endpoint}`,\r\n data: payload,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${API_JWT}`,\r\n }\r\n }).catch((e) => {\r\n console.log(e);\r\n });\r\n}\r\n\r\nexport function callDeleteApi(endpoint, payload) {\r\n return axios({\r\n method: 'delete',\r\n url: `${API_URL}/${endpoint}`,\r\n data: payload,\r\n headers: {\r\n ContentType: 'application/json;charset=utf-8',\r\n Authorization: `Bearer ${API_JWT}`,\r\n }\r\n }).catch((e) => {\r\n console.log(e);\r\n });\r\n}\r\n\r\n\r\n//export function getData(endpoint, method = \"GET\", body) {\r\n// axios.defaults.baseURL = API_URL;\r\n// axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';\r\n// //axios.defaults.headers.post['Authorization'] = \"Bear abc\"\r\n// //axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*';\r\n// axios.get(endpoint, onSuccess, onFailure)\r\n// .then(resp => {\r\n// let result = resp.data;\r\n// return onSuccess(result);\r\n// })\r\n// .catch(error => {\r\n// if (onFailure) {\r\n// return onFailure(error);\r\n// }\r\n// })\r\n// }\r\n//}\r\n\r\n","\r\nexport function removeVieTones(str) {\r\n if (str === null || str.trim() === \"\") { \r\n return \"\";\r\n }\r\n \r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, \"a\");\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, \"e\");\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, \"i\");\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, \"o\");\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, \"u\");\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, \"y\");\r\n str = str.replace(/đ/g, \"d\");\r\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, \"A\");\r\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, \"E\");\r\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, \"I\");\r\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, \"O\");\r\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, \"U\");\r\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, \"Y\");\r\n str = str.replace(/Đ/g, \"D\");\r\n // Some system encode vietnamese combining accent as individual utf-8 characters\r\n // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này\r\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, \"\"); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng\r\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, \"\"); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư\r\n // Remove extra spaces\r\n // Bỏ các khoảng trắng liền nhau\r\n str = str.replace(/ + /g, \" \");\r\n str = str.trim();\r\n // Remove punctuations\r\n // Bỏ dấu câu, kí tự đặc biệt\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, \" \");\r\n return str;\r\n}\r\n\r\nexport function removeSpecName(str)\r\n{\r\n if (str === null || str.trim() === \"\") return \"\";\r\n var originalString = str.toLowerCase();\r\n //var arr = [\"Shop hoa\", \"Tiệm hoa\", \"Cửa hàng hoa\", \"Shop\", \"Tiệm\", \"Cửa hàng\", \"Hoa tươi\", \"Hoa\", \"Tươi\", \"Flowers\", \"Flower\"];\r\n var arr = [\"Shop\", \"Tiệm\", \"Cửa hàng\", \"Tiem\", \"Cua hang\", \"Hoa tươi\", \"Hoa tuoi\"];\r\n arr.map(item => { \r\n //originalString = originalString.replace(removeVieTones(item).toLowerCase(), '').trim();\r\n originalString = originalString.replace(item.toLowerCase(), '').trim();\r\n });\r\n return originalString;\r\n}\r\n\r\nexport function removeSpecAddress(str) {\r\n var originalString = str.toLowerCase();\r\n var arr = [\"Nối dài\", \"Đường nối\", \"Điểm nối\"];\r\n arr.map(item => {\r\n originalString = originalString.replace(removeVieTones(item).toLowerCase(), '');\r\n });\r\n return originalString;\r\n}\r\n\r\nexport function addSpecAddressRule(str) {\r\n if (str === null || str.trim() === \"\") return \"\";\r\n var originalString = str.toLowerCase();\r\n if (originalString.includes(\"hcm\") || originalString.includes(\"hochiminh\")) {\r\n originalString = originalString.replace(\"hcm\", \"ho chi minh\").replace(\"hochiminh\", \"ho chi minh\");\r\n }\r\n\r\n if (originalString.includes(\"saigon\") || originalString.includes(\"sai gon\")) {\r\n originalString = originalString.replace(\"saigon\", \"ho chi minh\").replace(\"sai gon\", \"ho chi minh\");\r\n }\r\n\r\n if (originalString.includes(\"hn\") || originalString.includes(\"hanoi\")) {\r\n originalString = originalString.replace(\"hn\", \"ha noi\").replace(\"hanoi\", \"ha noi\");\r\n } \r\n\r\n if (originalString.includes(\"tdm\")) {\r\n originalString = originalString.replace(\"tdm\", \"thu dau mot\");\r\n }\r\n\r\n //Dist_______________\r\n if (originalString.includes(\"q1\") || originalString.includes(\"q 1\") || originalString.includes(\"q.1\") || originalString.includes(\"q. 1\")) {\r\n originalString = originalString.replace(\"q1\", \"quan 1\").replace(\"q 1\", \"quan 1\").replace(\"q.1\", \"quan 1\").replace(\"q. 1\", \"quan 1\");\r\n }\r\n if (originalString.includes(\"q2\") || originalString.includes(\"q 2\") || originalString.includes(\"q.2\") || originalString.includes(\"q. 2\")) {\r\n originalString = originalString.replace(\"q2\", \"quan 2\").replace(\"q 2\", \"quan 2\").replace(\"q.2\", \"quan 2\").replace(\"q. 1\", \"quan 2\");\r\n }\r\n if (originalString.includes(\"q3\") || originalString.includes(\"q 3\") || originalString.includes(\"q.3\") || originalString.includes(\"q. 3\")) {\r\n originalString = originalString.replace(\"q3\", \"quan 3\").replace(\"q 3\", \"quan 3\").replace(\"q.3\", \"quan 3\").replace(\"q. 1\", \"quan 3\");\r\n }\r\n if (originalString.includes(\"q4\") || originalString.includes(\"q 4\") || originalString.includes(\"q.4\") || originalString.includes(\"q. 4\")) {\r\n originalString = originalString.replace(\"q4\", \"quan 4\").replace(\"q 4\", \"quan 4\").replace(\"q.4\", \"quan 4\").replace(\"q. 4\", \"quan 4\");\r\n }\r\n if (originalString.includes(\"q5\") || originalString.includes(\"q 5\") || originalString.includes(\"q.5\") || originalString.includes(\"q. 5\")) {\r\n originalString = originalString.replace(\"q5\", \"quan 5\").replace(\"q 5\", \"quan 5\").replace(\"q.5\", \"quan 5\").replace(\"q. 5\", \"quan 5\");\r\n }\r\n if (originalString.includes(\"q6\") || originalString.includes(\"q 6\") || originalString.includes(\"q.6\") || originalString.includes(\"q. 6\")) {\r\n originalString = originalString.replace(\"q6\", \"quan 6\").replace(\"q 6\", \"quan 6\").replace(\"q.6\", \"quan 6\").replace(\"q. 6\", \"quan 6\");\r\n }\r\n if (originalString.includes(\"q7\") || originalString.includes(\"q 7\") || originalString.includes(\"q.7\") || originalString.includes(\"q. 7\")) {\r\n originalString = originalString.replace(\"q7\", \"quan 7\").replace(\"q 7\", \"quan 7\").replace(\"q.7\", \"quan 7\").replace(\"q. 7\", \"quan 7\");\r\n }\r\n if (originalString.includes(\"q8\") || originalString.includes(\"q 8\") || originalString.includes(\"q.8\") || originalString.includes(\"q. 8\")) {\r\n originalString = originalString.replace(\"q8\", \"quan 8\").replace(\"q 8\", \"quan 8\").replace(\"q.8\", \"quan 8\").replace(\"q. 8\", \"quan 8\");\r\n }\r\n if (originalString.includes(\"q9\") || originalString.includes(\"q 9\") || originalString.includes(\"q.9\") || originalString.includes(\"q. 9\")) {\r\n originalString = originalString.replace(\"q9\", \"quan 9\").replace(\"q 9\", \"quan 9\").replace(\"q.9\", \"quan 9\").replace(\"q. 9\", \"quan 9\");\r\n }\r\n if (originalString.includes(\"q10\") || originalString.includes(\"q 10\") || originalString.includes(\"q.10\") || originalString.includes(\"q. 10\")) {\r\n originalString = originalString.replace(\"q10\", \"quan 10\").replace(\"q 10\", \"quan 10\").replace(\"q.10\", \"quan 10\").replace(\"q. 10\", \"quan 10\");\r\n }\r\n if (originalString.includes(\"q11\") || originalString.includes(\"q 11\") || originalString.includes(\"q.11\") || originalString.includes(\"q. 11\")) {\r\n originalString = originalString.replace(\"q11\", \"quan 11\").replace(\"q 11\", \"quan 11\").replace(\"q.11\", \"quan 11\").replace(\"q. 11\", \"quan 11\");\r\n }\r\n if (originalString.includes(\"q12\") || originalString.includes(\"q 12\") || originalString.includes(\"q.12\") || originalString.includes(\"q. 12\")) {\r\n originalString = originalString.replace(\"q12\", \"quan 12\").replace(\"q 12\", \"quan 12\").replace(\"q.12\", \"quan 12\").replace(\"q. 12\", \"quan 12\");\r\n }\r\n\r\n //Ward__________\r\n if (originalString.includes(\"p1\") || originalString.includes(\"p 1\") || originalString.includes(\"p.1\") || originalString.includes(\"p. 1\")) {\r\n originalString = originalString.replace(\"p1\", \"phuong 1\").replace(\"p 1\", \"phuong 1\").replace(\"p.1\", \"phuong 1\").replace(\"p. 1\", \"phuong 1\");\r\n }\r\n if (originalString.includes(\"p2\") || originalString.includes(\"p 2\") || originalString.includes(\"p.2\") || originalString.includes(\"p. 2\")) {\r\n originalString = originalString.replace(\"p2\", \"phuong 2\").replace(\"p 2\", \"phuong 2\").replace(\"p.2\", \"phuong 2\").replace(\"p. 1\", \"phuong 2\");\r\n }\r\n if (originalString.includes(\"p3\") || originalString.includes(\"p 3\") || originalString.includes(\"p.3\") || originalString.includes(\"p. 3\")) {\r\n originalString = originalString.replace(\"p3\", \"phuong 3\").replace(\"p 3\", \"phuong 3\").replace(\"p.3\", \"phuong 3\").replace(\"p. 1\", \"phuong 3\");\r\n }\r\n if (originalString.includes(\"p4\") || originalString.includes(\"p 4\") || originalString.includes(\"p.4\") || originalString.includes(\"p. 4\")) {\r\n originalString = originalString.replace(\"p4\", \"phuong 4\").replace(\"p 4\", \"phuong 4\").replace(\"p.4\", \"phuong 4\").replace(\"p. 4\", \"phuong 4\");\r\n }\r\n if (originalString.includes(\"p5\") || originalString.includes(\"p 5\") || originalString.includes(\"p.5\") || originalString.includes(\"p. 5\")) {\r\n originalString = originalString.replace(\"p5\", \"phuong 5\").replace(\"p 5\", \"phuong 5\").replace(\"p.5\", \"phuong 5\").replace(\"p. 5\", \"phuong 5\");\r\n }\r\n if (originalString.includes(\"p6\") || originalString.includes(\"p 6\") || originalString.includes(\"p.6\") || originalString.includes(\"p. 6\")) {\r\n originalString = originalString.replace(\"p6\", \"phuong 6\").replace(\"p 6\", \"phuong 6\").replace(\"p.6\", \"phuong 6\").replace(\"p. 6\", \"phuong 6\");\r\n }\r\n if (originalString.includes(\"p7\") || originalString.includes(\"p 7\") || originalString.includes(\"p.7\") || originalString.includes(\"p. 7\")) {\r\n originalString = originalString.replace(\"p7\", \"phuong 7\").replace(\"p 7\", \"phuong 7\").replace(\"p.7\", \"phuong 7\").replace(\"p. 7\", \"phuong 7\");\r\n }\r\n if (originalString.includes(\"p8\") || originalString.includes(\"p 8\") || originalString.includes(\"p.8\") || originalString.includes(\"p. 8\")) {\r\n originalString = originalString.replace(\"p8\", \"phuong 8\").replace(\"p 8\", \"phuong 8\").replace(\"p.8\", \"phuong 8\").replace(\"p. 8\", \"phuong 8\");\r\n }\r\n if (originalString.includes(\"p9\") || originalString.includes(\"p 9\") || originalString.includes(\"p.9\") || originalString.includes(\"p. 9\")) {\r\n originalString = originalString.replace(\"p9\", \"phuong 9\").replace(\"p 9\", \"phuong 9\").replace(\"p.9\", \"phuong 9\").replace(\"p. 9\", \"phuong 9\");\r\n }\r\n if (originalString.includes(\"p10\") || originalString.includes(\"p 10\") || originalString.includes(\"p.10\") || originalString.includes(\"p. 10\")) {\r\n originalString = originalString.replace(\"p10\", \"phuong 10\").replace(\"p 10\", \"phuong 10\").replace(\"p.10\", \"phuong 10\").replace(\"p. 10\", \"puan 10\");\r\n }\r\n if (originalString.includes(\"p11\") || originalString.includes(\"p 11\") || originalString.includes(\"p.11\") || originalString.includes(\"p. 11\")) {\r\n originalString = originalString.replace(\"p11\", \"phuong 11\").replace(\"p 11\", \"phuong 11\").replace(\"p.11\", \"phuong 11\").replace(\"p. 11\", \"phuong 11\");\r\n }\r\n if (originalString.includes(\"p12\") || originalString.includes(\"p 12\") || originalString.includes(\"p.12\") || originalString.includes(\"p. 12\")) {\r\n originalString = originalString.replace(\"p12\", \"phuong 12\").replace(\"p 12\", \"phuong 12\").replace(\"p.12\", \"phuong 12\").replace(\"p. 12\", \"phuong 12\");\r\n }\r\n if (originalString.includes(\"p13\") || originalString.includes(\"p 13\") || originalString.includes(\"p.13\") || originalString.includes(\"p. 13\")) {\r\n originalString = originalString.replace(\"p13\", \"phuong 13\").replace(\"p 13\", \"phuong 13\").replace(\"p.13\", \"phuong 13\").replace(\"p. 13\", \"phuong 13\");\r\n }\r\n if (originalString.includes(\"p14\") || originalString.includes(\"p 14\") || originalString.includes(\"p.14\") || originalString.includes(\"p. 14\")) {\r\n originalString = originalString.replace(\"p14\", \"phuong 14\").replace(\"p 14\", \"phuong 14\").replace(\"p.14\", \"phuong 14\").replace(\"p. 14\", \"phuong 14\");\r\n }\r\n if (originalString.includes(\"p15\") || originalString.includes(\"p 15\") || originalString.includes(\"p.15\") || originalString.includes(\"p. 51\")) {\r\n originalString = originalString.replace(\"p15\", \"phuong 15\").replace(\"p 1\", \"phuong 15\").replace(\"p.15\", \"phuong 15\").replace(\"p. 15\", \"phuong 15\");\r\n }\r\n if (originalString.includes(\"p16\") || originalString.includes(\"p 16\") || originalString.includes(\"p.16\") || originalString.includes(\"p. 16\")) {\r\n originalString = originalString.replace(\"p16\", \"phuong 16\").replace(\"p 16\", \"phuong 16\").replace(\"p.16\", \"phuong 16\").replace(\"p. 16\", \"phuong 16\");\r\n }\r\n if (originalString.includes(\"p17\") || originalString.includes(\"p 17\") || originalString.includes(\"p.17\") || originalString.includes(\"p. 17\")) {\r\n originalString = originalString.replace(\"p17\", \"phuong 17\").replace(\"p 17\", \"phuong 17\").replace(\"p.17\", \"phuong 17\").replace(\"p. 1\", \"phuong 17\");\r\n }\r\n if (originalString.includes(\"p18\") || originalString.includes(\"p 18\") || originalString.includes(\"p.18\") || originalString.includes(\"p. 18\")) {\r\n originalString = originalString.replace(\"p18\", \"phuong 18\").replace(\"p 18\", \"phuong 18\").replace(\"p.18\", \"phuong 18\").replace(\"p. 18\", \"phuong 18\");\r\n }\r\n if (originalString.includes(\"p19\") || originalString.includes(\"p 19\") || originalString.includes(\"p.19\") || originalString.includes(\"p. 19\")) {\r\n originalString = originalString.replace(\"p19\", \"phuong 19\").replace(\"p 19\", \"phuong 19\").replace(\"p.19\", \"phuong 19\").replace(\"p. 19\", \"phuong 19\");\r\n }\r\n return originalString;\r\n}\r\n\r\nexport function aggregateKeyList(queryList)\r\n{\r\n //List queryList = new List() { \"ABC\", \"DEF\", \"GHI\" }; \r\n var aggregateKeyList = [];\r\n //for (int i = 0; i <= queryList.Count; i++)\r\n //{\r\n // for (int j = 1; j <= queryList.Count - i; j++)\r\n // {\r\n // var concatRange = string.Join(\" \", queryList.GetRange(i, j));\r\n // aggregateKeyList.Add(concatRange);\r\n // }\r\n //}\r\n\r\n //for (let i = 0; i < queryList.length; i++) {\r\n // //console.log(queryList[i]);\r\n // for (let j = 1; j <= queryList.length - i; j++)\r\n // {\r\n // //var concatRange = string.Join(\" \", queryList.GetRange(i, j));\r\n // var getRange = queryList.slice(i, j);\r\n // //const concatRange = [\"ABC\", \"DEF\", \"123\"].filter(element => element).join(' ');\r\n // const concatRange = getRange.filter(element => element).join(' ');\r\n // //var concatRange = string.Join(\" \", queryList.GetRange(i, j));\r\n // aggregateKeyList = aggregateKeyList.concat(concatRange);\r\n // }\r\n //}\r\n\r\n for (let i = 0; i < queryList.length; i++) {\r\n //console.log(queryList[i]);\r\n for (let j = 1; j <= queryList.length; j++) {\r\n //var concatRange = string.Join(\" \", queryList.GetRange(i, j));\r\n var getRange = queryList.slice(i, j);\r\n //const concatRange = [\"ABC\", \"DEF\", \"123\"].filter(element => element).join(' ');\r\n const concatRange = getRange.filter(element => element).join(' ');\r\n //var concatRange = string.Join(\" \", queryList.GetRange(i, j));\r\n aggregateKeyList = aggregateKeyList.concat(concatRange);\r\n }\r\n }\r\n\r\n aggregateKeyList = aggregateKeyList.filter(function (e) { return e });\r\n return aggregateKeyList;\r\n}\r\n\r\nexport function aggregateKey(query) {\r\n //List queryList = new List() { \"ABC\", \"DEF\", \"GHI\" }; \r\n var aggregateKeyList = []; \r\n var queryList = query.split(\",\");\r\n for (let i = 0; i < queryList.length; i++) {\r\n //console.log(queryList[i]);\r\n for (let j = 1; j <= queryList.length; j++) { \r\n var getRange = queryList.slice(i, j);\r\n const concatRange = getRange.filter(element => element).join(' ');\r\n aggregateKeyList = aggregateKeyList.concat(concatRange);\r\n }\r\n }\r\n\r\n aggregateKeyList = aggregateKeyList.filter(function (e) { return e });\r\n var ret = \"\";\r\n if (aggregateKeyList.length > 0) { \r\n for (let j1 = 0; j1 < aggregateKeyList.length; j1++) { \r\n ret = ret + \",\" + aggregateKeyList[j1].toLowerCase().trim();\r\n }\r\n } \r\n return ret;\r\n}\r\n\r\nexport function onlyUnique(value, index, array) {\r\n return array.indexOf(value) === index;\r\n}\r\n\r\nexport function filterData(rowData, keyword) {\r\n return rowData.filter((row) => {\r\n return row.name.toLowerCase().includes(keyword.toLowerCase());\r\n });\r\n}\r\n\r\nexport function sortData(rowData, sortingColumn, sortingDirection) {\r\n if (sortingColumn === null)\r\n return rowData;\r\n\r\n return rowData.slice().sort((a, b) => {\r\n const aValue = a[sortingColumn];\r\n const bValue = b[sortingColumn];\r\n\r\n if (aValue === bValue) {\r\n return 0;\r\n }\r\n\r\n if (sortingDirection === \"asc\") {\r\n return aValue < bValue ? -1 : 1;\r\n } else {\r\n return aValue < bValue ? 1 : -1;\r\n }\r\n });\r\n}","import React from \"react\";\nimport logo from \"./../img/iflower-logo.png\";\nimport bg from \"./../img/iflower-intro-bg.png\";\n\nconst MessageInfo = ({ msg1, msg2 }) => {\n \n return (\n
    \n {/*

    */}\n {/* iFlower.vn - Nền tảng tìm kiếm địa điểm Shop hoa tươi toàn quốc*/}\n {/*

    */}\n {/**/}\n {/* \"iFlower\" */}\n {/**/}\n

    \n {msg1} {msg2}\n {/*Không tìm thấy Shop nào.
    Di và kéo Map để điều chỉnh Marker (ở trung tâm màn hình) về vị trí cần tìm.*/}\n

    \n
    \n );\n}\nexport default MessageInfo;","export default __webpack_public_path__ + \"static/media/search-blue.762b444b.png\";","export default __webpack_public_path__ + \"static/media/show-list-blue.0b521dd6.png\";","export default \"data:image/png;base64,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\"","import React from \"react\";\r\n//import { RiMenuLine } from \"react-icons/ri\";\r\n//import { setTimeout } from 'timers/promises'\r\nimport * as turf from '@turf/turf';\r\nimport Intro from \"./Intro\";\r\nimport Shop from \"./Shop\";\r\nimport { getAllShops, getDirection } from \"./../api/apiService\";\r\nimport { removeVieTones, removeSpecName, removeSpecAddress} from \"./utils/strConverter\";\r\nimport { addSpecAddressRule, onlyUnique, aggregateKeyList, aggregateKey } from \"./utils/strConverter\";\r\nimport List from \"@mui/material/List\";\r\n//import { FcFinePrint } from \"react-icons/fc\";\r\n//import ListItem from \"@mui/material/ListItem\";\r\n//import ListItemText from \"@mui/material/ListItemText\";\r\n//import ListSubheader from \"@mui/material/ListSubheader\";\r\n//import LoadingSpinner from \"./LoadingSpinner\";\r\nimport MessageInfo from \"./MessageInfo\";\r\n//import search from \"./../img/search-blue-1.png\";\r\nimport searchBlue from \"./../img/search-blue.png\";\r\nimport listViewMode from \"./../img/show-list-blue.png\";\r\nimport mapViewMode from \"./../img/show-map-blue.png\";\r\nimport \"./index.css\";\r\nimport \"./main.css\";\r\n\r\nclass Searcher extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n results: [],\r\n directions: [],\r\n isDirectMode: false,\r\n isDirectInit: false,\r\n isDirectLocateInit: true,\r\n isDirectPoint: false,\r\n currentCoords: { lng: 0, lat: 0 },\r\n currentZoom: 12.5,\r\n currentLng: 0,\r\n currentLat: 0,\r\n query: \"\",\r\n firstLoad: true,\r\n isLoading: false,\r\n filteredList: [],\r\n //isCollapsed: localStorage.getItem('is-sidebar-collapsed'),\r\n //isExpanded: isCollapsed ? false : true, \r\n isCollapsed: false,\r\n isExpanded: true,\r\n destLng: 0,\r\n destLat: 0,\r\n startLng: 0,\r\n startLat: 0,\r\n \r\n };\r\n this.onChange = this.onChange.bind(this);\r\n this.handleSearch = this.handleSearch.bind(this);\r\n this.handleClickedItem = this.handleClickedItem.bind(this);\r\n this.handleDirections = this.handleDirections.bind(this);\r\n this.handleCalls = this.handleCalls.bind(this);\r\n this.handleToggler = this.handleToggler.bind(this);\r\n this.handleListToggler = this.handleListToggler.bind(this);\r\n //this.state.isExpanded = this.state.isCollapsed ? false : true;\r\n }\r\n \r\n handleToggler = () => {\r\n if (this.state.isExpanded) {\r\n this.state.isExpanded = false;\r\n localStorage.setItem('is-sidebar-collapsed', true);\r\n console.log(localStorage.getItem('is-sidebar-collapsed'));\r\n console.log(\"isExpanded: \" + this.state.isExpanded);\r\n return;\r\n }\r\n this.state.isExpanded = true;\r\n console.log(\"isExpanded: \" + this.state.isExpanded);\r\n localStorage.removeItem('is-sidebar-collapsed');\r\n }\r\n\r\n async fetchShops() {\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner; \r\n //spinner.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]).addTo(map);\r\n //this.setState({\r\n // isLoading: true\r\n //}); \r\n await getAllShops(\"shops?q=\" + this.state.query)\r\n .then((item) => { \r\n this.setState({\r\n results: item.data,\r\n firstLoad: false\r\n }); \r\n this.drawMap(this.state.query);\r\n\r\n //this.initSearcher();\r\n this.props.initSearcher();\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n }); \r\n this.props.initSpinner(false); \r\n })\r\n .catch(() => { \r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n }); \r\n this.props.initSpinner(false);\r\n });\r\n }\r\n\r\n initSearcher() {\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan;\r\n const selectMarker = this.props.selectMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n try {\r\n map.removeControl(geoScan);\r\n }\r\n catch { }\r\n //this.props.initGeoLoc();\r\n const { lng, lat } = map.getCenter();\r\n /*this.props.initMarker(lng, lat);*/\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n //this.props.initMarker([0, 0]);\r\n //selectMarker.remove();\r\n //srcMarkerScan.remove();\r\n this.props.initMarker([lng, lat]);\r\n map.setZoom(13.4);\r\n }\r\n\r\n async initDirections(name) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n //const geoLocate = this.props.geoLocate; \r\n const geo = this.props.geo;\r\n const results = this.state.results;\r\n //const directions = this.state.directions;\r\n var highlightMarkers;\r\n\r\n this.props.handleToggler(); \r\n //spinner.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]).addTo(map);\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n\r\n if (!this.state.isDirectInit) {\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n map.addControl(geo, 'top-right');\r\n this.setState({ isDirectInit: true, isDirectLocateInit: true});\r\n }\r\n if (!this.state.isDirectLocateInit) {\r\n //geo.trigger();\r\n //console.log(this.state.isDirectLocateInit);\r\n }\r\n\r\n this.setState({ isDirectMode: true, });\r\n\r\n ////Init Marker\r\n //const { lng, lat } = map.getCenter();\r\n ///*this.props.initMarker(lng, lat);*/\r\n //this.setState({\r\n // startLng: lng,\r\n // startLat: lat,\r\n // //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n //});\r\n //this.props.initMarker([lng, lat]);\r\n //this.props.initGeoLoc();\r\n //map.setZoom(13.4);\r\n\r\n //geoLocate.trigger();\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n var _destLng, _destLat = \"\";\r\n if (name && name.trim() !== \"\") {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n if (highlightMarkers.length === 1) { \r\n //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n }\r\n\r\n var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n \r\n selectLoc.map((p) => {\r\n _destLng = p.Longitude;\r\n _destLat = p.Latitude;\r\n this.setState({\r\n destLng: p.Longitude,\r\n destLat: p.Latitude,\r\n startLng: p.Longitude,\r\n startLat: p.Latitude,\r\n }); \r\n }); \r\n await getDirection(`${_destLng},${_destLat}`, `${_destLng},${_destLat}`)\r\n .then((item) => {\r\n this.setState({\r\n directions: item.data,\r\n firstLoad: false,\r\n //isDirectInit: true,\r\n });\r\n //this.redrawMap(this.state.query);\r\n this.redrawDirections(name);\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner; \r\n //spinner.remove(); \r\n this.props.initSpinner(false);\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n this.props.initSpinner(false);\r\n });\r\n \r\n this.props.handleDirection(true, map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4));\r\n const srcMarker = this.props.srcMarker;\r\n geo.on('trackuserlocationstart', (e) => { \r\n this.setState({ \r\n isDirectLocateInit: true\r\n });\r\n });\r\n\r\n geo.on('trackuserlocationend', (e) => {\r\n this.setState({\r\n isDirectLocateInit: false\r\n });\r\n });\r\n // Set an event listener that fires when a geolocate event occurs. \r\n geo.on('geolocate', (e) => { \r\n //const srcMarker = this.props.srcMarker;\r\n let lng = e.coords.longitude;\r\n let lat = e.coords.latitude;\r\n let updatedValue = {};\r\n updatedValue = { lng: lng, lat: lat };\r\n this.setState({\r\n currentCoords: updatedValue,\r\n currentLng: lng,\r\n currentLat: lat,\r\n //isDirectLocateInit: true\r\n }); \r\n \r\n //console.log(\"isDirectMode: \" + this.state.isDirectMode);\r\n //if (this.state.isDirectMode) {\r\n // const srcMarker = this.props.srcMarker;\r\n // srcMarker.remove();\r\n // srcMarker.setLngLat([lng, lat]);\r\n //}\r\n if (this.state.isDirectMode)\r\n this.props.handleDirection(true, lng, lat);\r\n\r\n //this.setState({\r\n // startLng: lng,\r\n // startLat: lat,\r\n // //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n //});\r\n ////srcMarker.setLngLat([lng, lat]);\r\n //this.props.initMarker([lng, lat]);\r\n\r\n //console.log(\"Direction Mode: \" + this.state.isDirectMode);\r\n //if (this.state.isDirectMode) {\r\n //const srcMarker = this.props.selectMarker;\r\n ////const srcMarker = this.props.selectMarker;\r\n //srcMarker.remove();\r\n //srcMarker.setLngLat([lng, lat]).addTo(map);\r\n //this.props.initMarker([lng, lat]); \r\n //}\r\n });\r\n \r\n map.on(\"moveend\", async () => {\r\n //if (!map) return; \r\n this.setState({ currentZoom: map.getZoom().toFixed(1)}); \r\n // Get new center coordinates \r\n const { lng, lat } = map.getCenter(); \r\n srcMarker.setLngLat([lng, lat]);\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n //srcMarker.setLngLat([lng, lat]);\r\n //this.props.initMarker([lng, lat]);\r\n\r\n var from = [this.state.startLng, this.state.startLat];\r\n var to = [this.state.destLng, this.state.destLat];\r\n //TODO: get distance\r\n //var distance = this.getDistance(from, to); \r\n //console.log(`Distance: ${distance} km`);\r\n });\r\n \r\n srcMarker.getElement().addEventListener('click', (e) => { \r\n let isDirInit = (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat) ? true : false; \r\n if (isDirInit) {\r\n return;\r\n }\r\n this.setState({ isDirectPoint: true });\r\n\r\n this.props.handleDirection(false, this.state.startLng, this.state.startLat); \r\n\r\n getDirection(`${this.state.startLng},${this.state.startLat}`, `${this.state.destLng},${this.state.destLat}`)\r\n .then((item) => {\r\n this.setState({\r\n directions: item.data,\r\n firstLoad: false,\r\n });\r\n //this.redrawMap(this.state.query);\r\n this.redrawDirections(name);\r\n //this.setMapCenter([this.state.startLng, this.state.startLat]);\r\n //this.props.handleZoom(this.state.currentZoom);\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner; \r\n //spinner.remove();\r\n //srcMarker.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]);\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false, \r\n });\r\n });\r\n\r\n this.setState({ \r\n isDirectMode: false, \r\n });\r\n });\r\n \r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n this.props.initSpinner(false);\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner; \r\n //spinner.remove();\r\n } else {\r\n // do nothing\r\n }\r\n }\r\n\r\n //async getDirections(name) {\r\n // const map = this.props.map;\r\n // const spinner = this.props.spinner;\r\n // const results = this.state.results;\r\n // //const directions = this.state.directions;\r\n // var highlightMarkers; \r\n\r\n // spinner.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]).addTo(map);\r\n\r\n // this.setState({\r\n // isLoading: true\r\n // });\r\n // const jsonMarkers = JSON.stringify(results);\r\n // var destLng, destLat = \"\";\r\n // if (name && name.trim() !== \"\") {\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n // if (highlightMarkers.length === 1) { \r\n // //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n // } else {\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n // }\r\n\r\n // var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n // selectLoc.map((p) => {\r\n // destLng = p.Longitude;\r\n // destLat = p.Latitude; \r\n // });\r\n\r\n // await getDirection('105.8409111,21.0240492', `${destLng},${destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // //spinner.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n // });\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.setLngLat([105.8409111, 21.0240492]).addTo(map);\r\n \r\n // } else {\r\n // // do nothing\r\n // }\r\n //}\r\n\r\n genFeatureListFromGeoData(json) {\r\n //const results = null;\r\n const newFeaturesList = [];\r\n try {\r\n //TODO: Optimize \r\n const markers = JSON.parse(json);\r\n markers.map((p) => {\r\n newFeaturesList.push({\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(p.Longitude), parseFloat(p.Latitude)],\r\n // coordinates: [\r\n // parseFloat(p.location.longitude),\r\n // parseFloat(p.location.latitude),\r\n // ],\r\n },\r\n properties: {\r\n id: p.ShopId,\r\n name: p.ShopName,\r\n displayName: p.DisplayName,\r\n //code: p.shopCode,\r\n address: p.Address,\r\n displayAddress: p.DisplayAddress,\r\n phoneNumber: p.PhoneNumber,\r\n banner: p.Banner,\r\n //\"point-color\": \"253,237,57,1\",\r\n },\r\n });\r\n //End push\r\n });\r\n } catch (e) {\r\n //console.log(\"App Message (Data): \" + e);\r\n return {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n };\r\n // expected output: SyntaxError: Unexpected token o in JSON at position 1\r\n }\r\n\r\n return {\r\n type: \"FeatureCollection\",\r\n features: newFeaturesList,\r\n };\r\n }\r\n\r\n genFeatureListFromGeoList(json) {\r\n //const results = null;\r\n const newFeaturesList = [];\r\n try { \r\n const markers = JSON.parse(json);\r\n this.setState({\r\n //results: res.body,\r\n firstLoad: false,\r\n filteredList: markers,\r\n });\r\n \r\n var isChangedLocation = false;\r\n //markers.List.map((p) => { \r\n markers.map((p) => {\r\n ////TODO: fly to loc - recheck\r\n if (!isChangedLocation && !this.state.isDirectPoint) {\r\n //console.log(\"App Message: Find by Condition.\");\r\n this.setMapCenter([parseFloat(p.Longitude), parseFloat(p.Latitude)]);\r\n isChangedLocation = true;\r\n this.setState({ isDirectPoint: false });\r\n }\r\n\r\n newFeaturesList.push({\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(p.Longitude), parseFloat(p.Latitude)],\r\n // coordinates: [\r\n // parseFloat(p.location.longitude),\r\n // parseFloat(p.location.latitude),\r\n // ],\r\n },\r\n properties: {\r\n id: p.ShopId,\r\n name: p.ShopName,\r\n displayName: p.DisplayName,\r\n //code: p.ShopCode,\r\n address: p.Address,\r\n displayAddress: p.DisplayAddress,\r\n phoneNumber: p.PhoneNumber,\r\n banner: p.Banner,\r\n //\"point-color\": \"253,237,57,1\",\r\n },\r\n });\r\n //End push\r\n });\r\n } catch (e) {\r\n //console.log(\"App Message: Find All\");\r\n return {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n };\r\n // expected output: SyntaxError: Unexpected token o in JSON at position 1\r\n }\r\n\r\n return {\r\n type: \"FeatureCollection\",\r\n features: newFeaturesList,\r\n };\r\n }\r\n\r\n generateGeoJSON(markers) {\r\n return {\r\n type: \"FeatureCollection\",\r\n features: markers.map((p) => ({\r\n type: \"Feature\",\r\n properties: {\r\n name: p.name,\r\n hours: p.hours,\r\n address: p.address,\r\n \"point-color\": \"253,237,57,1\",\r\n },\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [\r\n parseFloat(p.location.longitude),\r\n parseFloat(p.location.latitude),\r\n ],\r\n },\r\n })),\r\n };\r\n }\r\n\r\n getFilterCentersSuggestions(jsonMarkers, termsString) {\r\n const markers = JSON.parse(jsonMarkers); \r\n //const terms = termsString.trim().toLowerCase().replace(\",\", \" \").split(\" \"); \r\n const terms = removeVieTones(termsString.trim().toLowerCase()).split(\" \"); \r\n return markers.List.filter((p) =>\r\n terms.every((term) =>\r\n [p.ShopName, p.District, p.Province, p.Address].some((f) =>\r\n removeVieTones(f).trim().toLowerCase().includes(term)\r\n )\r\n )\r\n );\r\n }\r\n\r\n getSuggestions(jsonMarkers, termsString) { \r\n const markers = JSON.parse(jsonMarkers);\r\n termsString = removeSpecName(termsString.trim().toLowerCase()); \r\n var key = addSpecAddressRule(termsString.trim().toLowerCase()); \r\n const terms = removeVieTones(key).split(\" \");\r\n const aggrFilterList = aggregateKeyList(terms);\r\n //for (let i = 0; i < aggrFilterList.length; i++) {\r\n // console.log(aggrFilterList[i]);\r\n //}\r\n\r\n var data = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //removeVieTones(p.ShopName).split(\" \"),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(), \r\n removeVieTones(p.Street).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Address).toLowerCase().trim()\r\n //removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().match(term))\r\n ));\r\n\r\n //const key1 = removeVieTones(removeSpecName(key));\r\n //console.log(key1);\r\n //const terms1 = removeVieTones(key1).split(\" \");\r\n //const aggrFilterList1 = aggregateKeyList(terms1); \r\n\r\n var data2 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Street).toLowerCase().trim(),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Address).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n var data3 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.Name).toLowerCase().trim(), \r\n //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim(),\r\n removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n \r\n\r\n //var filterdShops = [];\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\").match(key))\r\n //// ));\r\n\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => removeVieTones(p.Province != null && p.Province.trim() != \"\" ? p.Province.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)));\r\n\r\n //var shopsByProvince = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.Province).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n\r\n //console.log(\"Total Count: \" + markers.length);\r\n //console.log(\"Province Count: \" + shopsByProvince.length);\r\n //var sJsonProvince = JSON.stringify(shopsByProvince);\r\n ////console.log(sJsonProvince);\r\n //var oJsonProvince = JSON.parse(sJsonProvince);\r\n //var shopsByDistrict = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.District).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n //console.log(\"District Count: \" + shopsByDistrict.length);\r\n //var sJsonDistrict = JSON.stringify(shopsByDistrict);\r\n //var oJsonDistrict = JSON.parse(sJsonDistrict);\r\n //var shopsByWard = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Ward != null && p.Ward.trim() != \"\" ? p.Ward.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Ward Count: \" + shopsByWard.length);\r\n //var sJsonWard = JSON.stringify(shopsByWard);\r\n //var oJsonWard = JSON.parse(sJsonWard);\r\n //var shopsByStreet = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Street != null && p.Street.trim() != \"\" ? p.Street.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Street Count: \" + shopsByStreet.length);\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\") === key)\r\n //// ));\r\n\r\n ////var shopsByDistrict = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.District).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByWard = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByStreet = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Street).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n //filterdShops = filterdShops.concat(shopsByStreet, shopsByWard, shopsByDistrict, shopsByProvince );\r\n ////filterdShops = filterdShops.concat(shopsByProvince);\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //// removeVieTones(p.Province).toLowerCase().trim(),\r\n //// removeVieTones(p.District).toLowerCase().trim(),\r\n //// removeVieTones(p.Ward).toLowerCase().trim(),\r\n //// removeVieTones(p.Street).toLowerCase().trim(),\r\n //// //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.Province).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).includes(term))\r\n //// ));\r\n\r\n ////const data = markers;\r\n\r\n ////const dataByWard = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [ removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n data = data.concat(data2).concat(data3);\r\n //data = data3.concat(data2).concat(data);\r\n data = data.filter(onlyUnique);\r\n return data;\r\n //return sortData(data, \"Province\", \"asc\");\r\n //return sortData(filterdShops, \"Province\", \"asc\");\r\n //return filterdShops;\r\n }\r\n\r\n initializeMap() {\r\n const map = this.props.map;\r\n //Populate Data Source\r\n const textFeatureList = [];\r\n textFeatureList.push(\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(114.4250), parseFloat(15.4862)]\r\n },\r\n properties: {\r\n t: \"BIỂN ĐÔNG (Eastern Sea)\", //Text you want to display on Map\r\n s: 14,\r\n //\"text-color\": \"253,237,57,1\",\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(112.8046), parseFloat(16.6072)]\r\n },\r\n properties: {\r\n t: \"Quần đảo Hoàng Sa (Việt Nam)\", //Text you want to display on Map\r\n s: 12,\r\n //\"text-color\": \"253,237,57,1\",\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(115.7708), parseFloat(10.6287)]\r\n },\r\n properties: {\r\n t: \"Quần đảo Trường Sa (Việt Nam)\", //Text you want to display on Map\r\n s: 12,\r\n //\"text-color\": \"253,237,57,1\",\r\n }\r\n }\r\n );\r\n\r\n const textFeatureCollection = {\r\n type: \"FeatureCollection\",\r\n features: textFeatureList\r\n }\r\n\r\n map.getSource(\"text-points-data\").setData(textFeatureCollection);\r\n\r\n //textFeaturesList.push({\r\n // type: \"Feature\",\r\n // geometry: {\r\n // type: \"Point\",\r\n // coordinates: [parseFloat(p.Longitude), parseFloat(p.Latitude)], //TODO: reversion\r\n // // coordinates: [\r\n // // parseFloat(p.location.longitude),\r\n // // parseFloat(p.location.latitude),\r\n // // ],\r\n // },\r\n // properties: {\r\n // id: p.ShopId,\r\n // name: p.ShopName,\r\n // //code: p.ShopCode,\r\n // address: p.Address,\r\n // //\"point-color\": \"253,237,57,1\",\r\n // },\r\n //});\r\n //map.getSource(\"text-points-data\").setData(highlightgeoJSON);\r\n\r\n }\r\n\r\n initMap(vendor, data) {\r\n const map = this.props.map; \r\n var markers, highlightMarkers, usualMarkers, usualgeoJSON, highlightgeoJSON;\r\n //const jsonMarkers = JSON.stringify(results);\r\n const jsonMarkers = JSON.stringify(data);\r\n //console.log(\"Returned API Results: \" + JSON.stringify(results));\r\n //markers = JSON.parse(jsonMarkers); \r\n\r\n if (vendor && vendor.trim() !== \"\") {\r\n highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor); \r\n this.setState({\r\n query: vendor,\r\n //results: res.body,\r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n }\r\n\r\n //console.log(JSON.stringify(jsonMarkers));\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n // usualgeoJSON = this.genFeatureListFromGeoData(usualMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n console.log(\"jsonFilteredMarkers\" + JSON.stringify(highlightMarkers));\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n }\r\n\r\n drawMap(vendor) {\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const marker = this.props.marker;\r\n //const spinner = this.props.spinner;\r\n const results = this.state.results;\r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON; \r\n //popup.remove();\r\n //marker.remove();\r\n //if (popup.isOpen()) popup.remove();\r\n\r\n //TODO: Optimize\r\n const jsonMarkers = JSON.stringify(results);\r\n \r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n \r\n if (vendor && vendor.trim() !== \"\") {\r\n //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor); \r\n this.setState({\r\n query: vendor,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n this.setState({\r\n //query: vendor,\r\n //results: res.body, \r\n //firstLoad: true,\r\n });\r\n }\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n //const routeFeature = {\r\n // 'type': 'Feature',\r\n // 'properties': {},\r\n // 'geometry': directions.routes[0].geometry,\r\n //};\r\n //map.getSource(\"route-data\").setData(routeFeature);\r\n\r\n map.getSource(\"route-data\").setData({\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n });\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n\r\n //this.setState({\r\n // isLoading: false\r\n //});\r\n }\r\n\r\n redrawMap(vendor) {\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const marker = this.props.marker;\r\n const results = this.state.results;\r\n const spinner = this.props.spinner;\r\n \r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n\r\n //popup.remove();\r\n //marker.remove(); \r\n //if (popup.isOpen()) popup.remove(); \r\n \r\n \r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n try {\r\n if (vendor && vendor.trim() !== \"\") {\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor);\r\n //console.log(\"highlightMarkers Count: \" + highlightMarkers.length);\r\n //console.log(\"highlightMarkers: \" + JSON.stringify(highlightMarkers));\r\n if (highlightMarkers.length === 1) {\r\n this.setState({\r\n query: vendor,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n //usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor + ' ' + this.state.query);\r\n this.setState({\r\n //query: vendor + ' ' + this.state.query,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n }); \r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers); \r\n }\r\n\r\n //TODO: GET Long Latt dest\r\n //console.log(\"Filtered Data: \" + filteredData);\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n }\r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n\r\n //const routeFeature = {\r\n // 'type': 'Feature',\r\n // 'properties': {},\r\n // 'geometry': directions.routes[0].geometry,\r\n //};\r\n map.getSource(\"route-data\").setData({\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n });\r\n\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n } catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n }\r\n\r\n redrawDirections(vendor) {\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const spinner = this.props.spinner;\r\n const results = this.state.results;\r\n const directions = this.state.directions;\r\n const currentZoom = this.state.currentZoom;\r\n var oriHighlightMarkers, highlightMarkers, usualgeoJSON, highlightgeoJSON, oriHighlightgeoJSON;\r\n //popup.remove(); \r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n try {\r\n if (vendor && vendor.trim() !== \"\") {\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers); \r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor);\r\n oriHighlightMarkers = highlightMarkers;\r\n if (highlightMarkers.length === 1) {\r\n this.setState({\r\n query: vendor,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n //usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor + ' ' + this.state.query);\r\n this.setState({\r\n //query: vendor + ' ' + this.state.query,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n }\r\n\r\n const jsonOriFilteredMarkers = JSON.stringify(oriHighlightMarkers);\r\n oriHighlightgeoJSON = this.genFeatureListFromGeoList(jsonOriFilteredMarkers);\r\n \r\n //console.log(\"Filtered Data: \" + filteredData);\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n oriHighlightgeoJSON = highlightgeoJSON;\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n }\r\n\r\n map.setZoom(currentZoom); \r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n\r\n const routeFeature = {\r\n 'type': 'Feature',\r\n 'properties': {},\r\n 'geometry': directions.routes[0].geometry,\r\n };\r\n \r\n map.getSource(\"route-data\").setData(routeFeature);\r\n\r\n var from = [this.state.startLng, this.state.startLat];\r\n var to = [this.state.destLng, this.state.destLat];\r\n //TODO: get distance\r\n //var distance = this.getDistance(from, to);\r\n //console.log(`Distance: ${distance} km`);\r\n\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n } catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n }\r\n\r\n plotOnMap(vendor) {\r\n const map = this.props.map;\r\n const results = this.state.results;\r\n const markers = [].concat.apply(\r\n [],\r\n results.trucks.map((t) =>\r\n t.branches.map((b) => ({\r\n location: b.location,\r\n name: t.name,\r\n schedule: b.schedule,\r\n hours: b.hours,\r\n address: b.address,\r\n }))\r\n )\r\n );\r\n\r\n var highlightMarkers, usualMarkers, usualgeoJSON, highlightgeoJSON;\r\n\r\n if (vendor) {\r\n highlightMarkers = markers.filter(\r\n (m) => m.name.toLowerCase() === vendor.toLowerCase()\r\n );\r\n usualMarkers = markers.filter(\r\n (m) => m.name.toLowerCase() !== vendor.toLowerCase()\r\n );\r\n } else {\r\n usualMarkers = markers;\r\n }\r\n\r\n usualgeoJSON = this.generateGeoJSON(usualMarkers);\r\n if (highlightMarkers) {\r\n highlightgeoJSON = this.generateGeoJSON(highlightMarkers);\r\n }\r\n\r\n // clearing layers\r\n if (map.getLayer(\"trucks\")) {\r\n map.removeLayer(\"trucks\");\r\n }\r\n if (map.getSource(\"trucks\")) {\r\n map.removeSource(\"trucks\");\r\n }\r\n if (map.getLayer(\"trucks-highlight\")) {\r\n map.removeLayer(\"trucks-highlight\");\r\n }\r\n if (map.getSource(\"trucks-highlight\")) {\r\n map.removeSource(\"trucks-highlight\");\r\n }\r\n\r\n map\r\n .addSource(\"trucks\", {\r\n type: \"geojson\",\r\n data: usualgeoJSON,\r\n })\r\n .addLayer({\r\n id: \"trucks\",\r\n type: \"circle\",\r\n interactive: true,\r\n source: \"trucks\",\r\n paint: {\r\n \"circle-radius\": 8,\r\n \"circle-color\": \"rgba(253,237,57,1)\",\r\n },\r\n });\r\n\r\n if (highlightMarkers) {\r\n map\r\n .addSource(\"trucks-highlight\", {\r\n type: \"geojson\",\r\n data: highlightgeoJSON,\r\n })\r\n .addLayer({\r\n id: \"trucks-highlight\",\r\n type: \"circle\",\r\n interactive: true,\r\n source: \"trucks-highlight\",\r\n paint: {\r\n \"circle-radius\": 8,\r\n \"circle-color\": \"rgba(164,65,99,1)\",\r\n },\r\n });\r\n }\r\n }\r\n\r\n setMapCenter(coords) {\r\n const map = this.props.map;\r\n if (map) {\r\n map.setCenter(coords);\r\n //map.setZoom(11.5);\r\n }\r\n }\r\n\r\n getDistance(fromLngLat, toLngLat) {\r\n var from = turf.point(fromLngLat);\r\n var to = turf.point(toLngLat);\r\n var options = { units: 'kilometers' };\r\n var distance = turf.distance(from, to, options); \r\n return distance.toFixed(2);\r\n }\r\n\r\n makeRadius(lngLatArray, radiusInMeters) {\r\n var point = turf.point(lngLatArray);\r\n var options = { units: 'meters' };\r\n var buffered = turf.buffer(point, radiusInMeters, options);\r\n return buffered;\r\n }\r\n\r\n spatialJoin(sourceGeoJSON, filterFeature) {\r\n // Loop through all the features in the source geojson and return the ones that \r\n // are inside the filter feature (buffered radius) and are confirmed landing sites \r\n var joined = sourceGeoJSON.features.filter(function (feature) {\r\n //return turf.booleanPointInPolygon(feature, filterFeature) && feature.properties.isConfirmed === 'yes';\r\n //console.log(feature.properties.displayName);\r\n return turf.booleanPointInPolygon(feature, filterFeature);\r\n });\r\n return joined;\r\n }\r\n\r\n //useGAnalyticsEventTracker(title) {\r\n // const eventTracker = useAnalyticsEventTracker(title);\r\n // return eventTracker;\r\n //}\r\n\r\n handleSearch(e) {\r\n e.preventDefault();\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n const map = this.props.map; \r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan; \r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n try {\r\n map.removeControl(geoScan);\r\n }\r\n catch { } \r\n \r\n this.props.initSpinner(true); \r\n this.props.handleDirection(false, 0, 0);\r\n \r\n this.setState({\r\n isDirectMode: false,\r\n isDirectPoint: false,\r\n });\r\n\r\n this.fetchShops();\r\n \r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n gaEventTracker('Shop Search');\r\n }\r\n\r\n handleClickedItem(name) {\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n\r\n this.props.initSpinner(true);\r\n this.props.handleDirection(false, 0, 0);\r\n\r\n this.setState({\r\n isDirectMode: false,\r\n isDirectPoint: false,\r\n });\r\n\r\n this.redrawMap(name);\r\n\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop Selection [${name}]`);\r\n gaEventTracker(`Shop Selection`);\r\n }\r\n\r\n onChange(e) {\r\n this.setState({ query: e.target.value });\r\n if (e.target.value.trim() === \"\")\r\n this.setState({ filteredList: [] });\r\n }\r\n\r\n \r\n\r\n handleDirections(name) {\r\n this.initDirections(name);\r\n const gaEventTracker = this.props.useGAEventTracker('Map'); \r\n //console.log(window.screen.width <= 500);\r\n if (window.screen.width <= 500)\r\n this.handleListToggler();\r\n //gaEventTracker(`Shop [${name}]`);\r\n gaEventTracker(`Shop Direction`); //this.plotOnMap(name);\r\n }\r\n\r\n handleCalls(type, name) {\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`${type} [${name}]`);\r\n gaEventTracker(`${type}`);\r\n }\r\n\r\n handleListToggler() {\r\n if (this.state.isExpanded) {\r\n this.setState({isExpanded: false });\r\n //localStorage.setItem('is-sidebar-collapsed', true);\r\n return;\r\n }\r\n this.setState({isExpanded : true });\r\n //localStorage.removeItem('is-sidebar-collapsed'); \r\n }\r\n\r\n componentDidMount() { \r\n //this.handleSearch();\r\n }\r\n\r\n render() {\r\n const hint = \"Shop, P/Xã, Q/Huyện, T/Thành\";\r\n const _isExpanded = this.state.isExpanded;\r\n\r\n //if (this.state.firstLoad) {\r\n // return (\r\n //
    \r\n //
    \r\n //
    \r\n //
    \r\n //
    \r\n // );\r\n //}\r\n\r\n //const query = this.state.query;\r\n // const resultsCount = this.state.results.hits || 0;\r\n // const locationsCount = this.state.results.locations || 0;\r\n // //const results = this.state.results.trucks || [];\r\n // const results = this.state.results.List || [];\r\n\r\n const filteredMarkers = this.state.filteredList;\r\n //console.log(filteredMarkers);\r\n const resultsCount = filteredMarkers.length || 0; \r\n const results = filteredMarkers || []; \r\n const isLoading = this.state.isLoading;\r\n const isFirstLoad = this.state.firstLoad;\r\n const keyword = this.state.query;\r\n //console.log(results);\r\n\r\n const renderedResults = results.map((item, i) => (\r\n \r\n ));\r\n\r\n return (\r\n
    \r\n
    \r\n \"View\r\n
    \r\n
    \r\n {/*\"View*/}\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \"Search\" \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n\r\n {(resultsCount > 0 && keyword.trim() !== \"\") ? (\r\n
    \r\n \r\n {renderedResults}\r\n {/* {isLoading ? : renderedResults}*/}\r\n \r\n
    \r\n ) :\r\n (
    \r\n {\r\n isFirstLoad ? (\r\n
    \r\n
    \r\n
    \r\n ) : (\r\n
    \r\n \r\n {/*{isLoading ? : }*/}\r\n \r\n
    \r\n )\r\n }\r\n
    )\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default Searcher;\r\n","import React from \"react\";\nimport \"./index.css\";\n\nexport default function LoadingSpinner() {\n return (\n //
    \n //
    \n //
    \n
    \n
    \n
    \n\n );\n}","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport Searcher from \"./Searcher\";\r\nimport LoadingSpinner from \"./LoadingSpinner\";\r\nimport \"./index.css\";\r\n\r\nclass SearcherCtrl extends React.Component {\r\n constructor(props) {\r\n super(props); \r\n this.onClick = this.onClick.bind(this);\r\n this.initGeoLoc = this.initGeoLoc.bind(this);\r\n this.initSearcher = this.initSearcher.bind(this);\r\n this.initMarker = this.initMarker.bind(this);\r\n this.initSpinner = this.initSpinner.bind(this);\r\n this.handleDirection = this.handleDirection.bind(this);\r\n }\r\n\r\n onClick(e) {\r\n console.log('clicked');\r\n }\r\n\r\n initGeoLoc() {\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan;\r\n //const mapResult = this.props.mapResult;\r\n //const mapSource = this.props.mapSource;\r\n try {\r\n map.removeControl(geo);\r\n map.removeControl(geoScan);\r\n }\r\n catch { }\r\n\r\n map.addControl(geo, 'top-right');\r\n }\r\n\r\n initSearcher(arrLngLat) {\r\n console.log(\"Ctrl: initSearch\");\r\n //const srcMarker = this.props.marker;\r\n //if (srcMarker)\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n const map = this.props.map;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n if (!arrLngLat) {\r\n const { lng, lat } = map.getCenter();\r\n\r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n srcMarker.remove();\r\n //srcMarker.setLngLat([lng, lat]).addTo(map);\r\n }\r\n else {\r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n\r\n //TODO: recheck \r\n srcMarker.remove();\r\n //srcMarker.setLngLat(arrLngLat).addTo(map);\r\n\r\n //Reset Map Layer & Source\r\n if (map.getLayer(\"search-radius\")) {\r\n map.removeLayer(\"search-radius\");\r\n }\r\n // Reset Map Source\r\n if (map.getSource(\"radius-points-data\")) {\r\n map.removeSource(\"radius-points-data\");\r\n }\r\n\r\n map.addSource(\"radius-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: 'search-radius',\r\n source: \"radius-points-data\",\r\n //source: {\r\n // type: 'geojson',\r\n // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n //},\r\n type: 'fill',\r\n paint: {\r\n 'fill-color': '#D33B37',\r\n 'fill-opacity': 0.1\r\n }\r\n });\r\n }\r\n }\r\n\r\n initMarker(arrLngLat) {\r\n console.log(\"Ctrl: initMarker\");\r\n //const srcMarker = this.props.marker;\r\n //if (srcMarker)\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n const map = this.props.map;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n if (!arrLngLat) { \r\n const { lng, lat } = map.getCenter();\r\n \r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n\r\n srcMarker.remove();\r\n srcMarker.setLngLat([lng, lat]).addTo(map);\r\n }\r\n else { \r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n\r\n //TODO: recheck \r\n srcMarker.remove();\r\n srcMarker.setLngLat(arrLngLat).addTo(map);\r\n\r\n //Reset Map Layer & Source\r\n if (map.getLayer(\"search-radius\")) {\r\n map.removeLayer(\"search-radius\");\r\n }\r\n // Reset Map Source\r\n if (map.getSource(\"radius-points-data\")) {\r\n map.removeSource(\"radius-points-data\");\r\n }\r\n\r\n map.addSource(\"radius-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: 'search-radius',\r\n source: \"radius-points-data\",\r\n //source: {\r\n // type: 'geojson',\r\n // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n //},\r\n type: 'fill',\r\n paint: {\r\n 'fill-color': '#D33B37',\r\n 'fill-opacity': 0.1\r\n }\r\n });\r\n }\r\n }\r\n\r\n initSpinner(isDisplayed) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const { lng, lat } = map.getCenter();\r\n if (isDisplayed) {\r\n //const spinnerNode = document.createElement('div');\r\n //spinnerNode.style.cssText = 'width:0px; height:0px; margin: 0px 0px 0px 0px;border:0px solid #FFF;background-color: transparent;margin-top:200;';\r\n //spinnerNode.style.zIndex = 1005;\r\n //ReactDOM.render(, spinnerNode);\r\n //spinner.setLngLat([lng, lat]).setDOMContent(spinnerNode).addTo(map); \r\n spinner.setLngLat([lng, lat]).addTo(map);\r\n } else {\r\n spinner.remove();\r\n }\r\n }\r\n\r\n handleDirection(isStart, lng, lat) { \r\n const map = this.props.map;\r\n // Revert\r\n const selectMarker = this.props.selectMarker;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n if (lng === 0 || lat === 0) {\r\n if (selectMarker)\r\n selectMarker.remove();\r\n if (srcMarker)\r\n srcMarker.remove();\r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n if (destMarkerScan)\r\n destMarkerScan.remove();\r\n return;\r\n }\r\n\r\n if (!isStart) {\r\n srcMarker.remove();\r\n srcMarkerScan.remove();\r\n // Remove previous markers \r\n //mapMarkers.forEach((marker) => marker.remove());\r\n //mapMarkers = [];\r\n selectMarker.remove();\r\n selectMarker.setLngLat([lng, lat]).addTo(map);\r\n\r\n if (map.getLayer(\"search-radius\")) {\r\n map.removeLayer(\"search-radius\");\r\n }\r\n // Reset Map Source\r\n if (map.getSource(\"radius-points-data\")) {\r\n map.removeSource(\"radius-points-data\");\r\n }\r\n\r\n map.addSource(\"radius-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: 'search-radius',\r\n source: \"radius-points-data\",\r\n //source: {\r\n // type: 'geojson',\r\n // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n //},\r\n type: 'fill',\r\n paint: {\r\n 'fill-color': '#D33B37',\r\n 'fill-opacity': 0.1\r\n }\r\n });\r\n }\r\n else {\r\n srcMarker.remove();\r\n srcMarkerScan.remove();\r\n srcMarker.setLngLat([lng, lat]).addTo(map);\r\n selectMarker.remove();\r\n }\r\n }\r\n\r\n onAdd() {\r\n this.container = document.createElement(\"div\");\r\n //this.container.className = 'custom-control';\r\n //this.map = map;\r\n ReactDOM.render(, this.container);\r\n return this.container;\r\n }\r\n\r\n onRemove() {\r\n this.container.parentNode.removeChild(this.container);\r\n //this.map = undefined;\r\n }\r\n}\r\n\r\nexport default SearcherCtrl;","export default __webpack_public_path__ + \"static/media/shops-banner-bg12.61da84dd.png\";","export default __webpack_public_path__ + \"static/media/flower-shop-square.ea8dc3c0.png\";","export default __webpack_public_path__ + \"static/media/shops-banner-bg.28f8a070.jpg\";","import React from \"react\";\nimport zalo from \"./../img/zalo-icon-blue.png\";\nimport phone from \"./../img/phone-icon-blue.png\";\nimport directions from \"./../img/directions-icon-blue.png\";\nimport banner1 from \"./../img/shops-banner-bg12.png\";\nimport banner2 from \"./../img/flower-shop-square.png\";\nimport banner from \"./../img/shops-banner-bg.jpg\";\n\nexport default class ScannedShop extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isExpanded: false,\n };\n\n this.toggleExpand = this.toggleExpand.bind(this);\n }\n\n formatItems(items) {\n if (this.state.isExpanded) {\n return items.join(\", \");\n }\n const summary = items.join(\", \").substr(0, 80);\n if (summary.length > 70) {\n const indexOfLastSpace =\n summary.split(\"\").reverse().join(\"\").indexOf(\",\") + 1;\n return summary.substr(0, 80 - indexOfLastSpace) + \" & more...\";\n }\n return summary;\n }\n\n toggleExpand() {\n this.setState({\n isExpanded: !this.state.isExpanded,\n });\n }\n\n render() {\n const { name, displayName, displayAddress, phoneNumber, banner} = this.props.data;\n const arrLngLat = this.props.location.coordinates;\n let zaloCall = \"https://zalo.me/\" + phoneNumber.split(/\\s/).join('');\n let phoneCall = \"tel:\" + phoneNumber.split(/\\s/).join('');\n let urlBanner = banner ? \"https://vinflower.com/wp-content/uploads/iflower/images/banners/\" + banner : \"https://vinflower.com/wp-content/uploads/2023/06/5539763.png\";\n return (\n
  • \n
    \n
    \n
    \n
    {displayName}
    \n
    {displayAddress}
    \n
    \n
    \n {/*\"Banner\"*/}\n \"Banner\"\n
    \n
    \n
    \n
    \n \"Directions\"\n\n \n \"Phone\"\n \n \n \"Zalo\"\n \n
    \n
    \n
  • \n\n ////OLD\n //
  • \n //
    \n //
    \n // {/*
    {DisplayName}
    */}\n // {/*{this.props.data['name'] }*/}\n //
    \n //
    \n // \"Banner\"\n //
    \n //
    \n //
    {DisplayAddress}
    \n //
    {DisplayName}
    \n //
    {DisplayAddress}
    \n\n\n // {/**/}\n // {/*
    Gọi ngay
    */}\n // {/*
    */}\n // {/*
    {DisplayAddress}
    */}\n // {/*
    */}\n // {/* */}\n // {/* \"Directions\"*/}\n // {/* */}\n // {/*
    */}\n //
    \n //
    \n // \"Directions\"\n // \n // \"Phone\"\n // \n // \n // \"Zalo\"\n // \n //
    \n //
    \n //
  • \n );\n }\n}\n","import React from \"react\";\r\n//import ReactDOM from \"react-dom\";\r\nimport * as turf from '@turf/turf';\r\nimport { getAllShops, getDirection } from \"./../api/apiService\";\r\nimport { removeVieTones, removeSpecName, removeSpecAddress } from \"./utils/strConverter\";\r\nimport { addSpecAddressRule, onlyUnique, aggregateKeyList, aggregateKey } from \"./utils/strConverter\";\r\n//import useCheckMobileScreen from \"./utils/useCheckMobileScreen\";\r\n//import LoadingSpinner from \"./LoadingSpinner\";\r\nimport MessageInfo from \"./MessageInfo\";\r\nimport mapRadarBlue from \"./../img/map-radar-blue.png\";\r\nimport listViewMode from \"./../img/show-list-blue.png\";\r\nimport mapViewMode from \"./../img/show-map-blue.png\";\r\n//import zalo from \"./../img/zalo-icon-blue.png\";\r\n//import phone from \"./../img/phone-icon-blue.png\";\r\n//import directions from \"./../img/directions-icon-blue.png\";\r\n//import banner1 from \"./../img/shops-banner-bg12.png\";\r\n//import banner2 from \"./../img/flower-shop-square.png\";\r\nimport \"./index.css\";\r\nimport List from \"@mui/material/List\";\r\n//import { FcFinePrint } from \"react-icons/fc\";\r\nimport ScannedShop from \"./ScannedShop\";\r\n//import Shop from \"./Shop\";\r\n//import Intro from \"./Intro\";\r\n\r\nclass Scanner extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n results: [],\r\n oriResults: [],\r\n highlightResults: [],\r\n joinedHighlightResults: [],\r\n isLoading: false,\r\n mapSource: [],\r\n isCollapsed: false,\r\n isExpanded: true,\r\n //directions: [],\r\n //isDirectMode: false,\r\n isScanInit: true,\r\n isScanLocateUsed: false,\r\n //isDirectPoint: false,\r\n //currentCoords: { lng: 0, lat: 0 },\r\n //currentZoom: 12.5,\r\n //currentLng: 0,\r\n //currentLat: 0,\r\n //query: \"\",\r\n //firstLoad: true,\r\n //isLoading: false,\r\n //filteredList: [],\r\n //isCollapsed: localStorage.getItem('is-sidebar-collapsed'),\r\n //isExpanded: localStorage.getItem('is-sidebar-collapsed') ? false : true,\r\n destLng: 0,\r\n destLat: 0,\r\n startLng: 0,\r\n startLat: 0,\r\n };\r\n this.onClick = this.onClick.bind(this);\r\n this.refreshScan = this.refreshScan.bind(this);\r\n this.handleScan = this.handleScan.bind(this);\r\n this.handleClickedItem = this.handleClickedItem.bind(this);\r\n this.handleDirections = this.handleDirections.bind(this);\r\n this.handleCalls = this.handleCalls.bind(this);\r\n this.handleListToggler = this.handleListToggler.bind(this);\r\n }\r\n\r\n onClick(e) {\r\n console.log('clicked');\r\n }\r\n\r\n refreshScan() {\r\n this.setState({\r\n startLng: this.state.startLng,\r\n startLat: this.state.startLat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n //console.log(\"Scanning...\");\r\n this.scan([this.state.startLng, this.state.startLat]);\r\n\r\n this.props.handleDirection(false, this.state.startLng, this.state.startLat);\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n handleScan() { \r\n try {\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n //Fetch data\r\n this.fetchShops(); \r\n }\r\n catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n //this.initDirections('');\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop [${name}]`);\r\n gaEventTracker(`Shop Scanner`); \r\n }\r\n\r\n scan(from) {\r\n var map = this.props.map;\r\n //var from = [this.state.startLng, this.state.startLat];\r\n var searchRadius = this.makeRadius(from, 2500);\r\n map.getSource('radius-points-data').setData(searchRadius);\r\n\r\n var featuresInBuffer = this.spatialJoin(this.state.highlightResults, searchRadius);\r\n var joinedHighlightGeo = turf.featureCollection(featuresInBuffer);\r\n this.setState({ joinedHighlighResults: joinedHighlightGeo });\r\n map.getSource('confirmed-points-data').setData(joinedHighlightGeo);\r\n }\r\n\r\n initScanner() { \r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan;\r\n const selectMarker = this.props.selectMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n \r\n //map.setZoom(13.4);\r\n //console.log(\"Init Scanner...\");\r\n //this.props.initGeoLoc();\r\n //scanner init\r\n\r\n if (this.state.isScanInit) {\r\n //console.log(this.state.isScanInit);\r\n try {\r\n map.removeControl(geoScan);\r\n }\r\n catch { }\r\n map.addControl(geoScan, 'top-right');\r\n this.setState({ isScanInit: false });\r\n\r\n const { lng, lat } = map.getCenter();\r\n /*this.props.initMarker(lng, lat);*/\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n\r\n //map.setZoom(13.4);\r\n this.props.initMarker([lng, lat]); \r\n this.scan([lng, lat]); \r\n }\r\n\r\n map.on('sourcedata', (e) => { \r\n if (e.sourceId === \"confirmed-points-data\" && e.isSourceLoaded) { \r\n const joinedPoints = map.querySourceFeatures(\"confirmed-points-data\"); \r\n let filteredPoints = joinedPoints.filter((ele, idx) => idx === joinedPoints.findIndex(elem => elem.properties.id === ele.properties.id)); \r\n this.setState({ \r\n mapSource: filteredPoints\r\n });\r\n }\r\n });\r\n\r\n map.on(\"moveend\", async () => { \r\n if (!map) return; \r\n this.setState({ currentZoom: map.getZoom().toFixed(1) }); \r\n // Get new center coordinates \r\n const { lng, lat } = map.getCenter();\r\n //this.props.initMarker([lng, lat]); \r\n //srcMarkerScan.setLngLat([lng, lat]);\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n }); \r\n srcMarkerScan.setLngLat([lng, lat]);\r\n //this.scan([lng, lat]); \r\n });\r\n\r\n srcMarkerScan.getElement().addEventListener('click', (e) => {\r\n try {\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n //refresh data\r\n this.refreshScan();\r\n }\r\n catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n \r\n //this.setState({\r\n // startLng: this.state.startLng,\r\n // startLat: this.state.startLat,\r\n // //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n //});\r\n ////console.log(\"Scanning...\");\r\n //this.scan([this.state.startLng, this.state.startLat]);\r\n \r\n //this.props.handleDirection(false, this.state.startLng, this.state.startLat);\r\n });\r\n\r\n geoScan.on('trackuserlocationstart', (e) => {\r\n this.setState({\r\n isScanLocateUsed: true\r\n });\r\n //console.log(\"trackuserlocationstart\");\r\n //let lng = this.state.startLng;\r\n //let lat = this.state.startLat;\r\n //console.log(\"CUR_LOC: [\" + lng + \", \" + lat + \"]\");\r\n //this.scan([lng, lat]);\r\n });\r\n\r\n geoScan.on('trackuserlocationend', (e) => {\r\n this.setState({\r\n isScanLocateUsed: false\r\n });\r\n //console.log(\"trackuserlocationend\");\r\n });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n geoScan.on('geolocate', (e) => {\r\n if (!map) return;\r\n //map.setZoom(13.4);\r\n //console.log(\"geolocate\");\r\n let lng = e.coords.longitude;\r\n let lat = e.coords.latitude;\r\n \r\n //this.props.initMarker([lng, lat]);\r\n //srcMarkerScan.remove();\r\n //srcMarkerScan.setLngLat([lng, lat]).addTo(map);\r\n srcMarkerScan.setLngLat([lng, lat]);\r\n\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n if (this.state.isScanLocateUsed) {\r\n //console.log(\"isScanLocateUsed\");\r\n this.scan([lng, lat]);\r\n }\r\n //map.setZoom(13.4);\r\n\r\n //var from = [lng, lat];\r\n //var searchRadius = this.makeRadius(from, 2500);\r\n //map.getSource('radius-points-data').setData(searchRadius);\r\n\r\n //var featuresInBuffer = this.spatialJoin(this.state.highlightResults, searchRadius);\r\n //var joinedHighlightGeo = turf.featureCollection(featuresInBuffer);\r\n //this.setState({ joinedHighlightResults: joinedHighlightGeo });\r\n //map.getSource('confirmed-points-data').setData(turf.featureCollection(joinedHighlightGeo));\r\n });\r\n\r\n //srcMarkerScan.getElement().addEventListener('click', (e) => {\r\n // console.log(\"Selected\");\r\n //});\r\n }\r\n\r\n makeRadius(lngLatArray, radiusInMeters) {\r\n var point = turf.point(lngLatArray);\r\n var options = { units: 'meters' };\r\n var buffered = turf.buffer(point, radiusInMeters, options);\r\n return buffered;\r\n }\r\n\r\n spatialJoin(sourceGeoJSON, filterFeature) {\r\n // Loop through all the features in the source geojson and return the ones that \r\n // are inside the filter feature (buffered radius) and are confirmed landing sites \r\n var joined = sourceGeoJSON.features.filter(function (feature) {\r\n //return turf.booleanPointInPolygon(feature, filterFeature) && feature.properties.isDeleted === 'false'; \r\n return turf.booleanPointInPolygon(feature, filterFeature);\r\n }); \r\n return joined;\r\n }\r\n\r\n async fetchShops() {\r\n //const map = this.props.map; \r\n //console.log(\"[2] Requested\");\r\n await getAllShops(\"shops?q=\")\r\n .then((item) => {\r\n this.setState({\r\n results: item.data,\r\n //firstLoad: false\r\n });\r\n //console.log(\"[2] Returned: \" + item.data.length)\r\n //this.drawMap(this.state.query);\r\n this.drawMap(item.data);\r\n \r\n this.initScanner();\r\n\r\n //console.log(this.state.highlightResults);\r\n //this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n //});\r\n //spinner.current.remove(); \r\n //this.props.initGeoLoc();\r\n //map.setZoom(13.4);\r\n //Stop Busy\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n });\r\n }\r\n\r\n drawMap(data) {\r\n //console.log(\"Data: \" + data);\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const marker = this.props.marker;\r\n //const spinner = this.props.spinner;\r\n const results = this.state.results;\r\n //const results = data;\r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n //popup.current.remove();\r\n //marker.current.remove();\r\n //if (popup.current.isOpen()) popup.current.remove(); \r\n //console.log(\"Data: \" + results);\r\n const jsonMarkers = JSON.stringify(results);\r\n //console.log(\"2 Data: \" + jsonMarkers.length);\r\n //const jsonMarkers1 = JSON.stringify(data);\r\n //console.log(\"2 Data: \" + jsonMarkers1.length);\r\n\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n\r\n //if (vendor && vendor.trim() !== \"\") {\r\n if (results) {\r\n //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n highlightMarkers = this.getSuggestions(jsonMarkers, '');\r\n console.log(\"Return Count: \" + highlightMarkers.length);\r\n //this.setState({\r\n // query: vendor,\r\n // //results: res.body, \r\n // firstLoad: false,\r\n // filteredList: highlightMarkers,\r\n //});\r\n //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers); \r\n }\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers); \r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //console.log(jsonFilteredMarkers);\r\n this.setState({ highlightResults: highlightgeoJSON }); \r\n }\r\n\r\n getSuggestions(jsonMarkers, termsString) {\r\n const markers = JSON.parse(jsonMarkers);\r\n termsString = removeSpecName(termsString.trim().toLowerCase());\r\n var key = addSpecAddressRule(termsString.trim().toLowerCase());\r\n const terms = removeVieTones(key).split(\" \");\r\n const aggrFilterList = aggregateKeyList(terms);\r\n //for (let i = 0; i < aggrFilterList.length; i++) {\r\n // console.log(aggrFilterList[i]);\r\n //}\r\n\r\n var data = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //removeVieTones(p.ShopName).split(\" \"),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Address).toLowerCase().trim()\r\n //removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().match(term))\r\n ));\r\n\r\n //const key1 = removeVieTones(removeSpecName(key));\r\n //console.log(key1);\r\n //const terms1 = removeVieTones(key1).split(\" \");\r\n //const aggrFilterList1 = aggregateKeyList(terms1); \r\n\r\n var data2 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Street).toLowerCase().trim(),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Address).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n var data3 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.Name).toLowerCase().trim(), \r\n //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim(),\r\n removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n\r\n //var filterdShops = [];\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\").match(key))\r\n //// ));\r\n\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => removeVieTones(p.Province != null && p.Province.trim() != \"\" ? p.Province.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)));\r\n\r\n //var shopsByProvince = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.Province).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n\r\n //console.log(\"Total Count: \" + markers.length);\r\n //console.log(\"Province Count: \" + shopsByProvince.length);\r\n //var sJsonProvince = JSON.stringify(shopsByProvince);\r\n ////console.log(sJsonProvince);\r\n //var oJsonProvince = JSON.parse(sJsonProvince);\r\n //var shopsByDistrict = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.District).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n //console.log(\"District Count: \" + shopsByDistrict.length);\r\n //var sJsonDistrict = JSON.stringify(shopsByDistrict);\r\n //var oJsonDistrict = JSON.parse(sJsonDistrict);\r\n //var shopsByWard = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Ward != null && p.Ward.trim() != \"\" ? p.Ward.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Ward Count: \" + shopsByWard.length);\r\n //var sJsonWard = JSON.stringify(shopsByWard);\r\n //var oJsonWard = JSON.parse(sJsonWard);\r\n //var shopsByStreet = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Street != null && p.Street.trim() != \"\" ? p.Street.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Street Count: \" + shopsByStreet.length);\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\") === key)\r\n //// ));\r\n\r\n ////var shopsByDistrict = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.District).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByWard = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByStreet = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Street).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n //filterdShops = filterdShops.concat(shopsByStreet, shopsByWard, shopsByDistrict, shopsByProvince );\r\n ////filterdShops = filterdShops.concat(shopsByProvince);\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //// removeVieTones(p.Province).toLowerCase().trim(),\r\n //// removeVieTones(p.District).toLowerCase().trim(),\r\n //// removeVieTones(p.Ward).toLowerCase().trim(),\r\n //// removeVieTones(p.Street).toLowerCase().trim(),\r\n //// //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.Province).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).includes(term))\r\n //// ));\r\n\r\n ////const data = markers;\r\n\r\n ////const dataByWard = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [ removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n data = data.concat(data2).concat(data3);\r\n //data = data3.concat(data2).concat(data);\r\n data = data.filter(onlyUnique);\r\n return data;\r\n //return sortData(data, \"Province\", \"asc\");\r\n //return sortData(filterdShops, \"Province\", \"asc\");\r\n //return filterdShops;\r\n }\r\n\r\n genFeatureListFromGeoData(json) {\r\n //const results = null;\r\n const newFeaturesList = [];\r\n try {\r\n //TODO: Optimize \r\n const markers = JSON.parse(json);\r\n markers.map((p) => {\r\n newFeaturesList.push({\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(p.Longitude), parseFloat(p.Latitude)],\r\n // coordinates: [\r\n // parseFloat(p.location.longitude),\r\n // parseFloat(p.location.latitude),\r\n // ],\r\n },\r\n properties: {\r\n id: p.ShopId,\r\n name: p.ShopName,\r\n displayName: p.DisplayName,\r\n //code: p.shopCode,\r\n address: p.Address,\r\n displayAddress: p.DisplayAddress,\r\n phoneNumber: p.PhoneNumber,\r\n banner: p.Banner,\r\n longitude: p.Longitude,\r\n latitude: p.Latitude,\r\n //\"point-color\": \"253,237,57,1\",\r\n },\r\n });\r\n //End push\r\n });\r\n } catch (e) {\r\n //console.log(\"App Message (Data): \" + e);\r\n return {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n };\r\n // expected output: SyntaxError: Unexpected token o in JSON at position 1\r\n }\r\n\r\n return {\r\n type: \"FeatureCollection\",\r\n features: newFeaturesList,\r\n };\r\n }\r\n\r\n genFeatureListFromGeoList(json) {\r\n //const results = null;\r\n const newFeaturesList = [];\r\n try {\r\n const markers = JSON.parse(json);\r\n //this.setState({\r\n // //results: res.body,\r\n // //firstLoad: false,\r\n // //filteredList: markers,\r\n //});\r\n\r\n var isChangedLocation = false;\r\n //markers.List.map((p) => { \r\n markers.map((p) => {\r\n //////TODO: fly to loc - recheck\r\n //if (!isChangedLocation && !this.state.isDirectPoint) {\r\n // //console.log(\"App Message: Find by Condition.\");\r\n // this.setMapCenter([parseFloat(p.Longitude), parseFloat(p.Latitude)]);\r\n // isChangedLocation = true;\r\n // this.setState({ isDirectPoint: false });\r\n //}\r\n\r\n newFeaturesList.push({\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(p.Longitude), parseFloat(p.Latitude)],\r\n // coordinates: [\r\n // parseFloat(p.location.longitude),\r\n // parseFloat(p.location.latitude),\r\n // ],\r\n },\r\n properties: {\r\n id: p.ShopId,\r\n name: p.ShopName,\r\n displayName: p.DisplayName,\r\n //code: p.ShopCode,\r\n address: p.Address,\r\n displayAddress: p.DisplayAddress,\r\n phoneNumber: p.PhoneNumber,\r\n banner: p.Banner,\r\n //\"point-color\": \"253,237,57,1\",\r\n },\r\n });\r\n //End push\r\n });\r\n } catch (e) {\r\n //console.log(\"App Message: Find All\");\r\n return {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n };\r\n // expected output: SyntaxError: Unexpected token o in JSON at position 1\r\n }\r\n\r\n return {\r\n type: \"FeatureCollection\",\r\n features: newFeaturesList,\r\n };\r\n }\r\n \r\n redrawMap(vendor) {\r\n const map = this.props.map;\r\n //const popup = this.props.popup;\r\n //const marker = this.props.marker;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n const results = this.state.results;\r\n //const spinner = this.props.spinner;\r\n\r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n\r\n //popup.remove();\r\n //marker.remove(); \r\n //if (popup.isOpen()) popup.remove(); \r\n\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n try {\r\n if (vendor && vendor.trim() !== \"\") {\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor);\r\n //console.log(\"highlightMarkers Count: \" + highlightMarkers.length);\r\n //console.log(\"highlightMarkers: \" + JSON.stringify(highlightMarkers));\r\n if (highlightMarkers.length === 1) {\r\n this.setState({\r\n query: vendor,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n //usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n //console.log(\"selectLoc \" + jsonFilteredMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, vendor + ' ' + this.state.query);\r\n this.setState({\r\n //query: vendor + ' ' + this.state.query,\r\n //results: res.body, \r\n firstLoad: false,\r\n filteredList: highlightMarkers,\r\n });\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n //console.log(\"selectLoc2 \" + jsonFilteredMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n }\r\n //console.log(\"selectLoc0 \" + JSON.stringify(highlightMarkers));\r\n // Get Lng Lat of Dest\r\n var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n\r\n selectLoc.map((p) => { \r\n this.setState({\r\n destLng: p.Longitude,\r\n destLat: p.Latitude,\r\n startLng: p.Longitude,\r\n startLat: p.Latitude,\r\n });\r\n if (destMarkerScan) destMarkerScan.remove();\r\n destMarkerScan.setLngLat([p.Longitude, p.Latitude]).addTo(map);\r\n });\r\n\r\n //const shopMarker = this.props.descMarkerScan\r\n //TODO: GET Long Latt dest\r\n //console.log(\"Filtered Data: \" + filteredData);\r\n // highlightMarkers = markers.List.filter(\r\n // (m) =>\r\n // vendor &&\r\n // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // );\r\n // usualMarkers = markers.filter(\r\n // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n //);\r\n\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n } else {\r\n //usualMarkers = markers;\r\n //console.log(usualMarkers);\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n }\r\n\r\n //NOTE: Not render\r\n //map.getSource(\"custom-points-data\").setData(usualgeoJSON); \r\n //map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n\r\n //const routeFeature = {\r\n // 'type': 'Feature',\r\n // 'properties': {},\r\n // 'geometry': directions.routes[0].geometry,\r\n //};\r\n map.getSource(\"route-data\").setData({\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n });\r\n\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n } catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n }\r\n\r\n redrawDirections(vendor, arrLngLat) {\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const spinner = this.props.spinner;\r\n const results = this.state.results;\r\n const directions = this.state.directions;\r\n const currentZoom = this.state.currentZoom;\r\n var oriHighlightMarkers, highlightMarkers, usualgeoJSON, highlightgeoJSON, oriHighlightgeoJSON;\r\n //popup.remove(); \r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n\r\n //const jsonMarkers = JSON.stringify(results);\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n try {\r\n //if (vendor && vendor.trim() !== \"\") {\r\n // usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, vendor);\r\n // oriHighlightMarkers = highlightMarkers;\r\n // if (highlightMarkers.length === 1) {\r\n // this.setState({\r\n // query: vendor,\r\n // //results: res.body, \r\n // firstLoad: false,\r\n // filteredList: highlightMarkers,\r\n // });\r\n // //usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n // const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n // highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n // } else {\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, vendor + ' ' + this.state.query);\r\n // this.setState({\r\n // //query: vendor + ' ' + this.state.query,\r\n // //results: res.body, \r\n // firstLoad: false,\r\n // filteredList: highlightMarkers,\r\n // });\r\n // const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n // highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n // }\r\n\r\n // const jsonOriFilteredMarkers = JSON.stringify(oriHighlightMarkers);\r\n // oriHighlightgeoJSON = this.genFeatureListFromGeoList(jsonOriFilteredMarkers);\r\n\r\n // //console.log(\"Filtered Data: \" + filteredData);\r\n // // highlightMarkers = markers.List.filter(\r\n // // (m) =>\r\n // // vendor &&\r\n // // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // // );\r\n // // usualMarkers = markers.filter(\r\n // // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n // //);\r\n\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers);\r\n //} else {\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers);\r\n\r\n // usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n // const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n // highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n // oriHighlightgeoJSON = highlightgeoJSON;\r\n // //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n //}\r\n\r\n //map.setZoom(currentZoom);\r\n\r\n //map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n //// map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n //map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n\r\n const routeFeature = {\r\n 'type': 'Feature',\r\n 'properties': {},\r\n 'geometry': directions.routes[0].geometry,\r\n };\r\n\r\n map.getSource(\"route-data\").setData(routeFeature);\r\n //console.log(this.state.startLng + \", \" + this.state.startLat + \"][\" + arrLngLat[0] + \", \" + arrLngLat[1]);\r\n var from = [this.state.startLng, this.state.startLat];\r\n var to = arrLngLat;\r\n //var to = [this.state.destLng, this.state.destLat];\r\n var distance = this.getDistance(from, to);\r\n console.log(`Distance: ${distance} km`);\r\n\r\n //var searchRadius = this.makeRadius(from, 1500);\r\n //console.log(\"SearchRadius: \" + searchRadius);\r\n ////map.getSource('search-radius').setData(searchRadius);\r\n //var featuresInBuffer = this.spatialJoin(oriHighlightgeoJSON, searchRadius);\r\n //console.log(\"FeaturesInBuffer: \" + featuresInBuffer);\r\n //map.getSource('confirmed-points-data').setData(searchRadius);\r\n ////map.getSource('confirmed-points-data').setData(turf.featureCollection(featuresInBuffer));\r\n\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n } catch (e) {\r\n this.setState({\r\n isLoading: false\r\n });\r\n this.props.initSpinner(false);\r\n }\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n }\r\n\r\n async initDirections(name) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n \r\n const srcMarkerScan = this.props.marker;\r\n const selectMarkerScan = this.props.selectMarkerScan;\r\n const selectMarker = this.props.selectMarker;\r\n const results = this.state.results;\r\n //const directions = this.state.directions;\r\n var highlightMarkers;\r\n //this.props.handleToggler();\r\n\r\n //spinner.current\r\n // .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n // .addTo(map);\r\n\r\n const geoLocate = this.props.geoLocate;\r\n try {\r\n map.removeControl(geoLocate.current);\r\n }\r\n catch { }\r\n\r\n map.addControl(geoLocate.current, 'top-right');\r\n\r\n this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n geoLocate.current.on('geolocate', (e) => {\r\n let lng = e.coords.longitude;\r\n let lat = e.coords.latitude;\r\n let updatedValue = {};\r\n updatedValue = { lng: lng, lat: lat };\r\n this.setState({\r\n currentCoords: updatedValue,\r\n currentLng: lng,\r\n currentLat: lat,\r\n });\r\n\r\n if (this.state.isDirectMode) {\r\n const srcMarkerScan = this.props.marker;\r\n srcMarkerScan.current.remove();\r\n srcMarkerScan.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n });\r\n\r\n //geoLocate.trigger();\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n var _destLng, _destLat = \"\";\r\n if (name && name.trim() !== \"\") {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n if (highlightMarkers.length === 1) {\r\n //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n }\r\n\r\n var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n\r\n selectLoc.map((p) => {\r\n _destLng = p.Longitude;\r\n _destLat = p.Latitude;\r\n this.setState({\r\n destLng: p.Longitude,\r\n destLat: p.Latitude,\r\n startLng: p.Longitude,\r\n startLat: p.Latitude,\r\n });\r\n });\r\n\r\n //await getDirection(`${_destLng},${_destLat}`, `${_destLng},${_destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false,\r\n // isDirectInit: true,\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // spinner.current.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n // });\r\n\r\n this.props.handleDirection(true, map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4));\r\n //const srcMarkerScan = this.props.marker;\r\n //Show direct guideline (popup) \r\n\r\n //map.on(\"load\", () => {\r\n // if (!map) return;\r\n // this.addRadarButton(map);\r\n //});\r\n\r\n //map.on(\"resize\", async () => {\r\n // map.setSize(13.5);\r\n // console.log(13.5);\r\n //});\r\n\r\n //radarButton.current.getElement().addEventListener('onClick', (e) => {\r\n // const centerPosition = {\r\n // center: [map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)],\r\n // };\r\n // map.flyTo(centerPosition);\r\n //});\r\n\r\n\r\n srcMarkerScan.current.getElement().addEventListener('click', (e) => {\r\n //console.log(\"srcMarkerScan clicked\");\r\n let isDirInit = (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat) ? true : false;\r\n if (isDirInit) {\r\n return;\r\n }\r\n this.setState({ isDirectPoint: true });\r\n\r\n this.props.handleDirection(false, this.state.startLng, this.state.startLat);\r\n //selectMarker.remove();\r\n //selectMarker.setLngLat([this.state.startLng, this.state.startLat]).addTo(map);\r\n\r\n //getDirection(`${this.state.startLng},${this.state.startLat}`, `${this.state.destLng},${this.state.destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false,\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // //this.setMapCenter([this.state.startLng, this.state.startLat]);\r\n // //this.props.handleZoom(this.state.currentZoom);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // spinner.current.remove();\r\n // //srcMarkerScan.current.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]);\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false,\r\n // });\r\n // });\r\n\r\n this.setState({\r\n isDirectMode: false,\r\n });\r\n });\r\n\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner;\r\n spinner.current.remove();\r\n } else {\r\n // do nothing\r\n }\r\n }\r\n\r\n handleClickedItem(name, arrLngLat) {\r\n //const map = this.props.map;\r\n //const destMarkerScan = this.props.destMarkerScan; \r\n //const geo = this.props.geo;\r\n //const geoScan = this.props.geoScan;\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n //try {\r\n // map.removeControl(geo);\r\n // map.removeControl(geoScan);\r\n //}\r\n //catch { }\r\n this.setState({\r\n isDirectMode: false,\r\n isDirectPoint: false,\r\n });\r\n this.redrawMap(name); \r\n this.props.handleSelection(arrLngLat);\r\n\r\n //if (destMarkerScan) {\r\n // destMarkerScan.remove();\r\n // destMarkerScan.setLngLat(arrLngLat).addTo(map);\r\n //}\r\n\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop Selection [${name}]`);\r\n gaEventTracker(`Shop Selection`);\r\n }\r\n\r\n handleDirections(name, arrLngLat) {\r\n //const map = this.props.map;\r\n //const destMarkerScan = this.props.destMarkerScan; \r\n //const geo = this.props.geo;\r\n //const geoScan = this.props.geoScan;\r\n this.setState({\r\n isLoading: true\r\n });\r\n this.props.initSpinner(true);\r\n //try {\r\n // //map.removeControl(geo);\r\n // //map.removeControl(geoScan);\r\n //}\r\n //catch { }\r\n this.setState({\r\n isDirectMode: false,\r\n isDirectPoint: false,\r\n });\r\n //console.log(window.screen.width <= 500);\r\n if (window.screen.width <= 500)\r\n this.handleListToggler();\r\n\r\n this.redrawMap(name);\r\n this.setState({\r\n destLng: arrLngLat[0],\r\n destLat: arrLngLat[1],\r\n //startLng: p.Longitude,\r\n //startLat: p.Latitude,\r\n });\r\n this.props.handleSelection(arrLngLat);\r\n this.props.handleDirection(false, this.state.startLng, this.state.startLat); \r\n getDirection(`${this.state.startLng},${this.state.startLat}`, `${arrLngLat[0]},${arrLngLat[1]}`)\r\n .then((item) => {\r\n this.setState({\r\n directions: item.data,\r\n firstLoad: false,\r\n });\r\n //console.log(item.data);\r\n //this.redrawMap(this.state.query);\r\n this.redrawDirections(name, arrLngLat);\r\n //this.setMapCenter([this.state.startLng, this.state.startLat]);\r\n //this.props.handleZoom(this.state.currentZoom);\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n this.props.initSpinner(false);\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner;\r\n //spinner.current.remove();\r\n //srcMarkerScan.current.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]);\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false,\r\n });\r\n this.props.initSpinner(false);\r\n });\r\n\r\n //getDirection(`${this.state.startLng},${this.state.startLat}`, `${this.state.destLng},${this.state.destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false,\r\n // isDirectInit: true,\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // //TODO: stop spinner\r\n // //spinner.current.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n // });\r\n\r\n //if (destMarkerScan) {\r\n // destMarkerScan.remove();\r\n // destMarkerScan.setLngLat(arrLngLat).addTo(map);\r\n //}\r\n\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop Selection [${name}]`);\r\n gaEventTracker(`Shop Selection`);\r\n }\r\n\r\n //handleDirections(name) {\r\n // this.initDirections(name);\r\n // const gaEventTracker = this.props.useGAEventTracker('Map');\r\n // //gaEventTracker(`Shop [${name}]`);\r\n // gaEventTracker(`Shop Direction`); //this.plotOnMap(name);\r\n //}\r\n\r\n handleCalls(type, name) {\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`${type} [${name}]`);\r\n gaEventTracker(`${type}`);\r\n }\r\n\r\n handleListToggler() { \r\n if (this.state.isExpanded) {\r\n this.setState({ isExpanded: false });\r\n //localStorage.setItem('is-sidebar-collapsed', true);\r\n return;\r\n }\r\n this.setState({ isExpanded: true });\r\n //localStorage.removeItem('is-sidebar-collapsed');\r\n \r\n }\r\n\r\n componentDidMount() { \r\n this.handleScan();\r\n }\r\n\r\n render() {\r\n const txtLabel = \"Hiển thị các Shop gần nhất\";\r\n const filteredMarkers = this.state.mapSource; //this.state.filteredList; \r\n const resultsCount = filteredMarkers.length || 0; \r\n const results = filteredMarkers || [];\r\n //console.log(\"Count : \" + results.length);\r\n const isLoading = this.state.isLoading;\r\n //const keyword = this.state.query;\r\n const _isExpanded = this.state.isExpanded;\r\n \r\n \r\n //const renderedResults = results.map((item, i) => ( \r\n //
  • \r\n //
    \r\n //
    \r\n // {/*
    */}\r\n // {/*
    */}\r\n //
    {item.properties['address']}
    \r\n //
    { item.properties['displayName']}
    \r\n //
    {item.properties['displayAddress']}
    \r\n //
    \r\n //
    \r\n // \"Banner\"\r\n //
    \r\n //
    \r\n //
    \r\n //
    \r\n // \"Directions\"\r\n\r\n // \r\n // \"Phone\"\r\n // \r\n // \r\n // \"Zalo\"\r\n // \r\n //
    \r\n //
    \r\n //
  • \r\n //));\r\n\r\n const renderedResults = results.map((item, i) => ( \r\n \r\n ));\r\n return (\r\n
    \r\n
    \r\n \"View\r\n
    \r\n
    \r\n {/* */}\r\n {/*\"View*/}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {txtLabel}\r\n \"Scan\"\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {\r\n (resultsCount > 0) ? ( \r\n
    \r\n
    \r\n \r\n {renderedResults}\r\n {/* {{isLoading ? : renderedResults}}*/}\r\n \r\n
    \r\n
    \r\n ) :\r\n (\r\n
    \r\n
    \r\n \r\n {/*{isLoading ? : }*/}\r\n
    \r\n
    \r\n )\r\n }\r\n
    \r\n )\r\n }\r\n\r\n}\r\n\r\nexport default Scanner;","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport * as turf from '@turf/turf';\r\nimport { getAllShops, getDirection } from \"./../api/apiService\";\r\nimport { removeVieTones, removeSpecName, removeSpecAddress } from \"./utils/strConverter\";\r\nimport { addSpecAddressRule, onlyUnique, aggregateKeyList, aggregateKey } from \"./utils/strConverter\";\r\nimport LoadingSpinner from \"./LoadingSpinner\";\r\nimport Scanner from \"./Scanner\";\r\nimport mapRadarBlue from \"./../img/map-radar-blue.png\";\r\nimport \"./index.css\";\r\n\r\nclass ScannerCtrl extends React.Component {\r\n constructor(props) {\r\n super(props); \r\n this.onClick = this.onClick.bind(this);\r\n this.initSpinner = this.initSpinner.bind(this);\r\n this.initGeoLoc = this.initGeoLoc.bind(this);\r\n this.initMarker = this.initMarker.bind(this); \r\n this.handleDirection = this.handleDirection.bind(this);\r\n this.handleSelection = this.handleSelection.bind(this);\r\n }\r\n\r\n onClick(e) {\r\n console.log('clicked');\r\n }\r\n\r\n initGeoLoc() {\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n //const mapResult = this.props.mapResult;\r\n //const mapSource = this.props.mapSource;\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n\r\n map.addControl(geo, 'top-right');\r\n\r\n //try {\r\n // map.removeControl(mapResult);\r\n //}\r\n //catch { }\r\n //map.addControl(mapResult, \"top-left\");\r\n\r\n //this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n //geo.on('geolocate', (e) => {\r\n // let lng = e.coords.longitude;\r\n // let lat = e.coords.latitude;\r\n // //let updatedValue = {};\r\n // //updatedValue = { lng: lng, lat: lat };\r\n // //this.setState({\r\n // // currentCoords: updatedValue,\r\n // // currentLng: lng,\r\n // // currentLat: lat,\r\n // //});\r\n\r\n // //if (this.state.isDirectMode) {\r\n // map.setZoom(13.4);\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.current.remove();\r\n // srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n // //}\r\n\r\n // var from = [lng, lat];\r\n // //var to = [this.state.destLng, this.state.destLat];\r\n // //var distance = this.getDistance(from, to);\r\n // //console.log(`Distance: ${distance} km`);\r\n // var searchRadius = this.makeRadius(from, 1500);\r\n // //map.getSource('search-radius').setData(searchRadius);\r\n // //var featuresInBuffer = this.spatialJoin(this.state.hightlightResults, searchRadius);\r\n // map.getSource('confirmed-points-data').setData(searchRadius);\r\n \r\n //});\r\n\r\n //const srcMarker = this.props.marker;\r\n //const { lng, lat } = map.getCenter();\r\n //srcMarker.current.remove();\r\n //srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n\r\n initMarker(arrLngLat) {\r\n //const srcMarker = this.props.srcMarkerScan;\r\n //if (srcMarker)\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n const map = this.props.map;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n const selectMarker = this.props.selectMarker;\r\n if (!arrLngLat) { \r\n if (selectMarker)\r\n selectMarker.remove();\r\n if (srcMarker)\r\n srcMarker.remove();\r\n\r\n const { lng, lat } = map.getCenter();\r\n srcMarkerScan.remove();\r\n srcMarkerScan.setLngLat([lng, lat]).addTo(map);\r\n }\r\n else {\r\n if (selectMarker)\r\n selectMarker.remove();\r\n if (srcMarker)\r\n srcMarker.remove();\r\n\r\n //TODO: recheck\r\n srcMarkerScan.remove();\r\n srcMarkerScan.setLngLat(arrLngLat).addTo(map);\r\n\r\n //Reset Map Layer & Source\r\n if (map.getLayer(\"route\")) {\r\n map.removeLayer(\"route\");\r\n }\r\n if (map.getSource(\"route-data\")) {\r\n map.removeSource(\"route-data\");\r\n }\r\n map.addSource('route-data', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'properties': {},\r\n 'geometry': {\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n }\r\n }\r\n });\r\n map.addLayer({\r\n 'id': 'route',\r\n 'type': 'line',\r\n 'source': 'route-data',\r\n 'layout': {\r\n 'line-join': 'round',\r\n 'line-cap': 'round',\r\n },\r\n 'paint': {\r\n 'line-color': '#0A95FF',\r\n 'line-width': 5,\r\n 'line-opacity': 0.75\r\n }\r\n });\r\n }\r\n }\r\n\r\n initSpinner(isDisplayed) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const { lng, lat } = map.getCenter();\r\n if (isDisplayed) {\r\n //const spinnerNode = document.createElement('div');\r\n //spinnerNode.style.cssText = 'width:0px; height:0px; margin: 0px 0px 0px 0px;border-radius:10px; border:0px solid #ddd; box-shadow: 0px 0px 5px 4px rgba(67,60,67,.16)';\r\n //spinnerNode.style.zIndex = 1005;\r\n //ReactDOM.render(, spinnerNode);\r\n //spinner.setLngLat([lng, lat]).setDOMContent(spinnerNode).addTo(map);\r\n spinner.setLngLat([lng, lat]).addTo(map);\r\n } else {\r\n spinner.remove();\r\n }\r\n }\r\n\r\n\r\n //makeRadius(lngLatArray, radiusInMeters) {\r\n // var point = turf.point(lngLatArray);\r\n // var options = { units: 'meters' };\r\n // var buffered = turf.buffer(point, radiusInMeters, options);\r\n // return buffered;\r\n //}\r\n\r\n //spatialJoin(sourceGeoJSON, filterFeature) {\r\n // // Loop through all the features in the source geojson and return the ones that \r\n // // are inside the filter feature (buffered radius) and are confirmed landing sites\r\n // //console.log(sourceGeoJSON);\r\n // var joined = sourceGeoJSON.features.filter(function (feature) {\r\n // //return turf.booleanPointInPolygon(feature, filterFeature) && feature.properties.isConfirmed === 'yes'; \r\n // return turf.booleanPointInPolygon(feature, filterFeature);\r\n // });\r\n // return joined;\r\n //}\r\n\r\n //handleScanner(name) {\r\n // this.fetchShops();\r\n // //this.initDirections('');\r\n // const gaEventTracker = this.props.useGAEventTracker('Map');\r\n // //gaEventTracker(`Shop [${name}]`);\r\n // gaEventTracker(`Shop Scanner`);\r\n //}\r\n\r\n handleSelection(arrLngLat) {\r\n const map = this.props.map;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n destMarkerScan.remove();\r\n destMarkerScan.setLngLat(arrLngLat).addTo(map);\r\n }\r\n\r\n handleDirection(isStart, lng, lat) {\r\n const map = this.props.map;\r\n // Revert\r\n const selectMarker = this.props.selectMarker;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n if (lng === 0 || lat === 0) {\r\n selectMarker.remove();\r\n srcMarker.remove();\r\n srcMarkerScan.remove();\r\n destMarkerScan.remove();\r\n return;\r\n }\r\n\r\n if (!isStart) {\r\n srcMarker.remove();\r\n //srcMarkerScan.remove();\r\n // Remove previous markers \r\n //mapMarkers.forEach((marker) => marker.remove());\r\n //mapMarkers = [];\r\n selectMarker.remove();\r\n selectMarker.setLngLat([lng, lat]).addTo(map);\r\n\r\n //if (map.getLayer(\"search-radius\")) {\r\n // map.removeLayer(\"search-radius\");\r\n //}\r\n //// Reset Map Source\r\n //if (map.getSource(\"radius-points-data\")) {\r\n // map.removeSource(\"radius-points-data\");\r\n //}\r\n\r\n //map.addSource(\"radius-points-data\", {\r\n // type: \"geojson\",\r\n // data: {\r\n // type: \"FeatureCollection\",\r\n // features: [],\r\n // },\r\n //});\r\n\r\n //map.addLayer({\r\n // id: 'search-radius',\r\n // source: \"radius-points-data\",\r\n // //source: {\r\n // // type: 'geojson',\r\n // // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n // //},\r\n // type: 'fill',\r\n // paint: {\r\n // 'fill-color': '#D33B37',\r\n // 'fill-opacity': 0.1\r\n // }\r\n //});\r\n }\r\n else {\r\n srcMarker.remove();\r\n srcMarkerScan.remove();\r\n srcMarker.setLngLat([lng, lat]).addTo(map);\r\n selectMarker.remove();\r\n }\r\n }\r\n onAdd() {\r\n //const scannerNode = document.createElement(\"div\");\r\n this.container = document.createElement(\"div\");\r\n //this.container.className = 'custom-control';\r\n //this.map = map;\r\n ReactDOM.render(, this.container);\r\n //const resulteNode = document.createElement(\"div\");\r\n //ReactDOM.render(, scannerNode);\r\n return this.container;\r\n }\r\n\r\n onRemove() {\r\n this.container.parentNode.removeChild(this.container);\r\n //this.map = undefined;\r\n }\r\n\r\n //resetSource(name, data) {\r\n // const map = this.props.map;\r\n // map.getSource(name).setData(data);\r\n //}\r\n\r\n //async fetchShops() {\r\n // const map = this.props.map;\r\n // const spinner = this.props.spinner;\r\n // //spinner.current\r\n // // .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n // // .addTo(map);\r\n\r\n // //this.setState({\r\n // // isLoading: true\r\n // //});\r\n\r\n // await getAllShops(\"shops?q=\" + 'ha noi')\r\n // .then((item) => {\r\n // //this.setState({\r\n // // results: item.data,\r\n // // firstLoad: false\r\n // //});\r\n\r\n // //this.drawMap(this.state.query);\r\n // this.drawMap(item.data);\r\n // //console.log(item.data);\r\n // //this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false\r\n // //});\r\n\r\n // spinner.current.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // //this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false\r\n // //});\r\n // spinner.current.remove();\r\n // });\r\n //}\r\n\r\n //drawMap(data) {\r\n // //console.log(\"Data: \" + data);\r\n // //this.setState({\r\n // // isLoading: true\r\n // //});\r\n // const map = this.props.map;\r\n // const popup = this.props.popup;\r\n // const marker = this.props.marker;\r\n // //const spinner = this.props.spinner;\r\n // //const results = this.state.results;\r\n // const results = data;\r\n // //const directions = this.state.directions;\r\n // var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n // popup.current.remove();\r\n // marker.current.remove();\r\n // //if (popup.current.isOpen()) popup.current.remove(); \r\n // //console.log(\"Data: \" + results);\r\n // const jsonMarkers = JSON.stringify(data);\r\n // //console.log(\"Data: \" + jsonMarkers);\r\n\r\n // //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n // //console.log(\"Directions: \" + jsonDirections);\r\n\r\n // //if (vendor && vendor.trim() !== \"\") {\r\n // //if (data) {\r\n // // //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n // // highlightMarkers = this.getSuggestions(jsonMarkers, 'ha noi');\r\n // // //console.log(\"Return Count: \" + highlightMarkers.length);\r\n // // //this.setState({\r\n // // // query: vendor,\r\n // // // //results: res.body, \r\n // // // firstLoad: false,\r\n // // // filteredList: highlightMarkers,\r\n // // //});\r\n // // //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // // // highlightMarkers = markers.List.filter(\r\n // // // (m) =>\r\n // // // vendor &&\r\n // // // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // // // );\r\n // // // usualMarkers = markers.filter(\r\n // // // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n // // //);\r\n\r\n // // //usualMarkers = markers;\r\n // // //console.log(usualMarkers);\r\n // //} else {\r\n // // //usualMarkers = markers;\r\n // // //console.log(usualMarkers); \r\n // //}\r\n\r\n // usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n // const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n // highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n // //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n\r\n // map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n // //const routeFeature = {\r\n // // 'type': 'Feature',\r\n // // 'properties': {},\r\n // // 'geometry': directions.routes[0].geometry,\r\n // //};\r\n // //map.getSource(\"route-data\").setData(routeFeature);\r\n\r\n // map.getSource(\"route-data\").setData({\r\n // 'type': 'LineString',\r\n // 'coordinates': []\r\n // });\r\n\r\n // // // clearing layers\r\n // // if (map.getLayer(\"shops\")) {\r\n // // map.removeLayer(\"shops\");\r\n // // }\r\n // // if (map.getSource(\"shops\")) {\r\n // // map.removeSource(\"shops\");\r\n // // }\r\n // // if (map.getLayer(\"shops-highlight\")) {\r\n // // map.removeLayer(\"shopss-highlight\");\r\n // // }\r\n // // if (map.getSource(\"shops-highlight\")) {\r\n // // map.removeSource(\"shops-highlight\");\r\n // // }\r\n\r\n // // map\r\n // // .addSource(\"shops\", {\r\n // // type: \"geojson\",\r\n // // data: usualgeoJSON,\r\n // // })\r\n // // .addLayer({\r\n // // id: \"shops\",\r\n // // type: \"circle\",\r\n // // interactive: true,\r\n // // source: \"trucks\",\r\n // // paint: {\r\n // // \"circle-radius\": 8,\r\n // // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // // },\r\n // // });\r\n\r\n // // if (highlightMarkers) {\r\n // // map\r\n // // .addSource(\"shops-highlight\", {\r\n // // type: \"geojson\",\r\n // // data: highlightgeoJSON,\r\n // // })\r\n // // .addLayer({\r\n // // id: \"shops-highlight\",\r\n // // type: \"circle\",\r\n // // interactive: true,\r\n // // source: \"shops-highlight\",\r\n // // paint: {\r\n // // \"circle-radius\": 8,\r\n // // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // // },\r\n // // });\r\n // // }\r\n\r\n // //this.setState({\r\n // // isLoading: false\r\n // //});\r\n //}\r\n\r\n //getSuggestions(jsonMarkers, termsString) {\r\n // const markers = JSON.parse(jsonMarkers);\r\n // termsString = removeSpecName(termsString.trim().toLowerCase());\r\n // var key = addSpecAddressRule(termsString.trim().toLowerCase());\r\n // const terms = removeVieTones(key).split(\" \");\r\n // const aggrFilterList = aggregateKeyList(terms);\r\n // //for (let i = 0; i < aggrFilterList.length; i++) {\r\n // // console.log(aggrFilterList[i]);\r\n // //}\r\n\r\n // var data = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // //removeVieTones(p.ShopName).toLowerCase().trim(),\r\n // //removeVieTones(p.ShopName).split(\" \"),\r\n // //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n // removeVieTones(p.Province).toLowerCase().trim(),\r\n // removeVieTones(p.District).toLowerCase().trim(),\r\n // removeVieTones(p.Ward).toLowerCase().trim(),\r\n // removeVieTones(p.Ward).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n // removeVieTones(p.Street).toLowerCase().trim(),\r\n // removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n // removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n // removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n // removeVieTones(p.Address).toLowerCase().trim()\r\n // //removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n // ]\r\n // .some((f) => removeVieTones(f).toLowerCase().trim().match(term))\r\n // ));\r\n\r\n // //const key1 = removeVieTones(removeSpecName(key));\r\n // //console.log(key1);\r\n // //const terms1 = removeVieTones(key1).split(\" \");\r\n // //const aggrFilterList1 = aggregateKeyList(terms1); \r\n\r\n // var data2 = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n // removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n // removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n // removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n // removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Street).toLowerCase().trim(),\r\n // //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Address).toLowerCase().trim()\r\n // ]\r\n // .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n // ));\r\n\r\n // var data3 = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // //removeVieTones(p.Name).toLowerCase().trim(), \r\n // //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim(),\r\n // removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n // ]\r\n // .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n // ));\r\n\r\n\r\n // //var filterdShops = [];\r\n // ////var shopsByProvince = markers.filter((p) =>\r\n // //// aggrFilterList.every((key) => [ \r\n // //// removeVieTones(p.Province).toLowerCase().trim()]\r\n // //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\").match(key))\r\n // //// ));\r\n\r\n // ////var shopsByProvince = markers.filter((p) =>\r\n // //// aggrFilterList.every((key) => removeVieTones(p.Province != null && p.Province.trim() != \"\" ? p.Province.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)));\r\n\r\n // //var shopsByProvince = markers.filter((p) =>\r\n // // aggrFilterList.every((term) => [\r\n // // removeVieTones(p.Province).toLowerCase().trim()\r\n // // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // // ));\r\n\r\n // //console.log(\"Total Count: \" + markers.length);\r\n // //console.log(\"Province Count: \" + shopsByProvince.length);\r\n // //var sJsonProvince = JSON.stringify(shopsByProvince);\r\n // ////console.log(sJsonProvince);\r\n // //var oJsonProvince = JSON.parse(sJsonProvince);\r\n // //var shopsByDistrict = markers.filter((p) =>\r\n // // aggrFilterList.every((term) => [\r\n // // removeVieTones(p.District).toLowerCase().trim()\r\n // // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // // ));\r\n // //console.log(\"District Count: \" + shopsByDistrict.length);\r\n // //var sJsonDistrict = JSON.stringify(shopsByDistrict);\r\n // //var oJsonDistrict = JSON.parse(sJsonDistrict);\r\n // //var shopsByWard = markers.filter((p) =>\r\n // // aggrFilterList.every((key) =>\r\n // // removeVieTones(p.Ward != null && p.Ward.trim() != \"\" ? p.Ward.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // // ));\r\n // //console.log(\"Ward Count: \" + shopsByWard.length);\r\n // //var sJsonWard = JSON.stringify(shopsByWard);\r\n // //var oJsonWard = JSON.parse(sJsonWard);\r\n // //var shopsByStreet = markers.filter((p) =>\r\n // // aggrFilterList.every((key) =>\r\n // // removeVieTones(p.Street != null && p.Street.trim() != \"\" ? p.Street.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // // ));\r\n // //console.log(\"Street Count: \" + shopsByStreet.length);\r\n // ////var shopsByProvince = markers.filter((p) =>\r\n // //// aggrFilterList.every((key) => [ \r\n // //// removeVieTones(p.Province).toLowerCase().trim()]\r\n // //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\") === key)\r\n // //// ));\r\n\r\n // ////var shopsByDistrict = data.filter((p) =>\r\n // //// aggrFilterList.every((key) => [\r\n // //// removeVieTones(p.District).toLowerCase().trim()]\r\n // //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n // //// ));\r\n\r\n // ////var shopsByWard = data.filter((p) =>\r\n // //// aggrFilterList.every((key) => [\r\n // //// removeVieTones(p.Ward).toLowerCase().trim()]\r\n // //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n // //// ));\r\n\r\n // ////var shopsByStreet = data.filter((p) =>\r\n // //// aggrFilterList.every((key) => [\r\n // //// removeVieTones(p.Street).toLowerCase().trim()]\r\n // //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n // //// ));\r\n\r\n // //filterdShops = filterdShops.concat(shopsByStreet, shopsByWard, shopsByDistrict, shopsByProvince );\r\n // ////filterdShops = filterdShops.concat(shopsByProvince);\r\n\r\n // ////const data = markers.filter((p) =>\r\n // //// aggrFilterList.every((term) => [\r\n // //// removeVieTones(p.ShopName).toLowerCase().trim(),\r\n // //// removeVieTones(p.Province).toLowerCase().trim(),\r\n // //// removeVieTones(p.District).toLowerCase().trim(),\r\n // //// removeVieTones(p.Ward).toLowerCase().trim(),\r\n // //// removeVieTones(p.Street).toLowerCase().trim(),\r\n // //// //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim()\r\n // //// ]\r\n // //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n // //// ));\r\n\r\n // ////const data = markers.filter((p) =>\r\n // //// aggrFilterList.every((term) => [\r\n // //// removeVieTones(p.Province).toLowerCase().trim()\r\n // //// ]\r\n // //// .some((f) => removeVieTones(f.trim().toLowerCase()).includes(term))\r\n // //// ));\r\n\r\n // ////const data = markers;\r\n\r\n // ////const dataByWard = markers.filter((p) =>\r\n // //// aggrFilterList.every((term) => [ removeVieTones(p.Ward).toLowerCase().trim()]\r\n // //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n // //// ));\r\n\r\n // data = data.concat(data2).concat(data3);\r\n // //data = data3.concat(data2).concat(data);\r\n // data = data.filter(onlyUnique);\r\n // return data;\r\n // //return sortData(data, \"Province\", \"asc\");\r\n // //return sortData(filterdShops, \"Province\", \"asc\");\r\n // //return filterdShops;\r\n //}\r\n\r\n //async initDirections(name) {\r\n // const map = this.props.map;\r\n // const spinner = this.props.spinner;\r\n // const geoLocate = this.props.geoLocate;\r\n // const srcMarker = this.props.marker;\r\n // const results = this.state.results;\r\n // //const directions = this.state.directions;\r\n // var highlightMarkers;\r\n // this.props.handleToggler();\r\n\r\n // spinner.current\r\n // .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n // .addTo(map);\r\n\r\n // try {\r\n // map.removeControl(geoLocate.current);\r\n // }\r\n // catch { }\r\n\r\n // map.addControl(geoLocate.current, 'top-right');\r\n\r\n // this.setState({ isDirectMode: true, });\r\n\r\n // // Set an event listener that fires when a geolocate event occurs. \r\n // geoLocate.current.on('geolocate', (e) => {\r\n // let lng = e.coords.longitude;\r\n // let lat = e.coords.latitude;\r\n // let updatedValue = {};\r\n // updatedValue = { lng: lng, lat: lat };\r\n // this.setState({\r\n // currentCoords: updatedValue,\r\n // currentLng: lng,\r\n // currentLat: lat,\r\n // });\r\n\r\n // if (this.state.isDirectMode) {\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.current.remove();\r\n // srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n // }\r\n // });\r\n\r\n // //geoLocate.current.trigger();\r\n\r\n // this.setState({\r\n // isLoading: true\r\n // });\r\n\r\n // const jsonMarkers = JSON.stringify(results);\r\n // var _destLng, _destLat = \"\";\r\n // if (name && name.trim() !== \"\") {\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n // if (highlightMarkers.length === 1) {\r\n // //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n // } else {\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n // }\r\n\r\n // var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n\r\n // selectLoc.map((p) => {\r\n // _destLng = p.Longitude;\r\n // _destLat = p.Latitude;\r\n // this.setState({\r\n // destLng: p.Longitude,\r\n // destLat: p.Latitude,\r\n // startLng: p.Longitude,\r\n // startLat: p.Latitude,\r\n // });\r\n // });\r\n\r\n // //await getDirection(`${_destLng},${_destLat}`, `${_destLng},${_destLat}`)\r\n // // .then((item) => {\r\n // // this.setState({\r\n // // directions: item.data,\r\n // // firstLoad: false,\r\n // // isDirectInit: true,\r\n // // });\r\n // // //this.redrawMap(this.state.query);\r\n // // this.redrawDirections(name);\r\n // // this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false\r\n // // });\r\n\r\n // // //const map = this.props.map;\r\n // // //const spinner = this.props.spinner;\r\n // // spinner.current.remove();\r\n // // })\r\n // // .catch(() => {\r\n // // //setErrorMessage(\"Unable to fetch list\");\r\n // // this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false\r\n // // });\r\n // // });\r\n\r\n // this.props.handleDirection(true, map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4));\r\n // //const srcMarker = this.props.marker;\r\n // //Show direct guideline (popup) \r\n\r\n // map.on(\"moveend\", async () => {\r\n // if (!map) return;\r\n // console.log('moveend');\r\n // this.setState({ currentZoom: map.getZoom().toFixed(1) });\r\n // //console.log(\"Current zoom: \" + map.getZoom().toFixed(1)); \r\n // // Get new center coordinates \r\n // const { lng, lat } = map.getCenter();\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n // this.setState({\r\n // startLng: lng,\r\n // startLat: lat,\r\n // //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n // });\r\n // });\r\n\r\n // //map.on(\"load\", () => {\r\n // // if (!map) return;\r\n // // this.addRadarButton(map);\r\n // //});\r\n\r\n // //map.on(\"resize\", async () => {\r\n // // map.setSize(13.5);\r\n // // console.log(13.5);\r\n // //});\r\n\r\n // //radarButton.current.getElement().addEventListener('onClick', (e) => {\r\n // // const centerPosition = {\r\n // // center: [map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)],\r\n // // };\r\n // // map.flyTo(centerPosition);\r\n // //});\r\n\r\n\r\n // srcMarker.current.getElement().addEventListener('click', (e) => {\r\n // let isDirInit = (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat) ? true : false;\r\n // if (isDirInit) {\r\n // return;\r\n // }\r\n // this.setState({ isDirectPoint: true });\r\n\r\n // this.props.handleDirection(false, this.state.startLng, this.state.startLat);\r\n\r\n // //getDirection(`${this.state.startLng},${this.state.startLat}`, `${this.state.destLng},${this.state.destLat}`)\r\n // // .then((item) => {\r\n // // this.setState({\r\n // // directions: item.data,\r\n // // firstLoad: false,\r\n // // });\r\n // // //this.redrawMap(this.state.query);\r\n // // this.redrawDirections(name);\r\n // // //this.setMapCenter([this.state.startLng, this.state.startLat]);\r\n // // //this.props.handleZoom(this.state.currentZoom);\r\n // // this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false\r\n // // });\r\n\r\n // // //const map = this.props.map;\r\n // // //const spinner = this.props.spinner;\r\n // // spinner.current.remove();\r\n // // //srcMarker.current.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)]);\r\n // // })\r\n // // .catch(() => {\r\n // // //setErrorMessage(\"Unable to fetch list\");\r\n // // this.setState({\r\n // // isLoading: false,\r\n // // firstLoad: false,\r\n // // });\r\n // // });\r\n\r\n // this.setState({\r\n // isDirectMode: false,\r\n // });\r\n // });\r\n\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // spinner.current.remove();\r\n // } else {\r\n // // do nothing\r\n // }\r\n //}\r\n\r\n}\r\n\r\nexport default ScannerCtrl;","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport * as turf from '@turf/turf';\r\nimport { getAllShops, getDirection } from \"./../api/apiService\";\r\nimport { removeVieTones, removeSpecName, removeSpecAddress } from \"./utils/strConverter\";\r\nimport { addSpecAddressRule, onlyUnique, aggregateKeyList, aggregateKey } from \"./utils/strConverter\";\r\nimport LoadingSpinner from \"./LoadingSpinner\";\r\nimport Scanner from \"./Scanner\";\r\n//import mapRadarBlue from \"./../img/map-radar-blue.png\";\r\nimport search from \"./../img/search-blue.png\";\r\nimport \"./index.css\";\r\n\r\nclass SearchButton extends React.Component {\r\n constructor(props) {\r\n super(props); \r\n //this.onClick = this.onClick.bind(this);\r\n this.initGeoLoc = this.initGeoLoc.bind(this);\r\n this.initMarker = this.initMarker.bind(this);\r\n this.initSpinner = this.initSpinner.bind(this);\r\n }\r\n\r\n //onClick(e) {\r\n // console.log('clicked');\r\n //}\r\n\r\n initGeoLoc() {\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n const mapResult = this.props.mapResult;\r\n //const mapSource = this.props.mapSource;\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n\r\n map.addControl(geo, 'top-right');\r\n\r\n //try {\r\n // map.removeControl(mapResult);\r\n //}\r\n //catch { }\r\n //map.addControl(mapResult, \"top-left\");\r\n\r\n //this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n //geo.on('geolocate', (e) => {\r\n // let lng = e.coords.longitude;\r\n // let lat = e.coords.latitude;\r\n // //let updatedValue = {};\r\n // //updatedValue = { lng: lng, lat: lat };\r\n // //this.setState({\r\n // // currentCoords: updatedValue,\r\n // // currentLng: lng,\r\n // // currentLat: lat,\r\n // //});\r\n\r\n // //if (this.state.isDirectMode) {\r\n // map.setZoom(13.4);\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.current.remove();\r\n // srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n // //}\r\n\r\n // var from = [lng, lat];\r\n // //var to = [this.state.destLng, this.state.destLat];\r\n // //var distance = this.getDistance(from, to);\r\n // //console.log(`Distance: ${distance} km`);\r\n // var searchRadius = this.makeRadius(from, 1500);\r\n // //map.getSource('search-radius').setData(searchRadius);\r\n // //var featuresInBuffer = this.spatialJoin(this.state.hightlightResults, searchRadius);\r\n // map.getSource('confirmed-points-data').setData(searchRadius);\r\n \r\n //});\r\n\r\n //const srcMarker = this.props.marker;\r\n //const { lng, lat } = map.getCenter();\r\n //srcMarker.current.remove();\r\n //srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n\r\n makeRadius(lngLatArray, radiusInMeters) {\r\n var point = turf.point(lngLatArray);\r\n var options = { units: 'meters' };\r\n var buffered = turf.buffer(point, radiusInMeters, options);\r\n return buffered;\r\n }\r\n\r\n spatialJoin(sourceGeoJSON, filterFeature) {\r\n // Loop through all the features in the source geojson and return the ones that \r\n // are inside the filter feature (buffered radius) and are confirmed landing sites\r\n //console.log(sourceGeoJSON);\r\n var joined = sourceGeoJSON.features.filter(function (feature) {\r\n //return turf.booleanPointInPolygon(feature, filterFeature) && feature.properties.isConfirmed === 'yes'; \r\n return turf.booleanPointInPolygon(feature, filterFeature);\r\n });\r\n return joined;\r\n }\r\n\r\n initMarker(arrLngLat) {\r\n //const srcMarker = this.props.marker;\r\n //if (srcMarker)\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n const map = this.props.map;\r\n const srcMarker = this.props.srcMarker;\r\n if (!arrLngLat) {\r\n const { lng, lat } = map.getCenter();\r\n srcMarker.remove();\r\n srcMarker.setLngLat([lng, lat]).addTo(map);\r\n }\r\n else {\r\n srcMarker.remove();\r\n srcMarker.setLngLat(arrLngLat).addTo(map);\r\n }\r\n }\r\n\r\n initSpinner(isDisplayed) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const { lng, lat } = map.getCenter();\r\n if (isDisplayed) {\r\n spinner.current\r\n //.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n .setLngLat([lng, lat]).addTo(map);\r\n } else {\r\n spinner.current.remove();\r\n }\r\n }\r\n\r\n handleScanner(name) {\r\n this.fetchShops();\r\n //this.initDirections('');\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop [${name}]`);\r\n gaEventTracker(`Shop Scanner`);\r\n }\r\n\r\n onAdd() {\r\n const map = this.props.map; \r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan;\r\n const searcher = this.props.searcher;\r\n const scanner = this.props.scanner;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n //const selectMarkerScan = this.props.selectMarkerScan;\r\n const selectMarker = this.props.selectMarker;\r\n //const scannerNode = document.createElement(\"div\");\r\n this.container = document.createElement(\"div\");\r\n this.container.className = \"mapboxgl-ctrl mapboxgl-ctrl-group\";\r\n this.container.innerHTML = ``;\r\n this.container.addEventListener(\"contextmenu\", (e) => e.preventDefault());\r\n this.container.addEventListener(\"click\", () => {\r\n if (srcMarker)\r\n srcMarker.remove(); \r\n if (srcMarkerScan)\r\n srcMarkerScan.remove();\r\n if (destMarkerScan)\r\n destMarkerScan.remove();\r\n if (selectMarker)\r\n selectMarker.remove();\r\n //if (selectMarkerScan)\r\n // selectMarkerScan.remove();\r\n \r\n try { \r\n map.removeControl(searcher); \r\n }\r\n catch { }\r\n try {\r\n map.removeControl(scanner);\r\n }\r\n catch { }\r\n\r\n //try {\r\n // map.removeControl(btnSearcher);\r\n //}\r\n //catch { }\r\n //try {\r\n // map.removeControl(btnScanner);\r\n //}\r\n //catch { }\r\n\r\n try {\r\n map.removeControl(geo); \r\n }\r\n catch { }\r\n try { \r\n map.removeControl(geoScan);\r\n }\r\n catch { }\r\n\r\n map.addControl(searcher, \"top-left\");\r\n //map.addControl(searcher, \"bottom-left\");\r\n this.props.initGUI(map, true);\r\n \r\n\r\n if (map.getLayer(\"hightlight-points-layer\"))\r\n map.removeLayer(\"hightlight-points-layer\");\r\n \r\n if (map.getSource(\"hightlight-points-data\"))\r\n map.removeSource(\"hightlight-points-data\"); \r\n\r\n map.addSource(\"hightlight-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: \"hightlight-points-layer\",\r\n source: \"hightlight-points-data\",\r\n type: \"symbol\",\r\n layout: {\r\n // full list of icons here: https://labs.mapbox.com/maki-icons\r\n \"icon-image\": 'mapMarker', // this will put little croissants on our map\r\n \"icon-padding\": 0,\r\n \"icon-allow-overlap\": true,\r\n 'icon-size': 0.3\r\n }, \r\n });\r\n\r\n if (map.getLayer(\"search-radius\"))\r\n map.removeLayer(\"search-radius\");\r\n \r\n if (map.getSource(\"radius-points-data\")) \r\n map.removeSource(\"radius-points-data\"); \r\n \r\n map.addSource(\"radius-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: 'search-radius',\r\n source: \"radius-points-data\",\r\n //source: {\r\n // type: 'geojson',\r\n // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n //},\r\n type: 'fill',\r\n paint: {\r\n 'fill-color': '#D33B37',\r\n 'fill-opacity': 0.1\r\n }\r\n });\r\n\r\n if (map.getLayer(\"confirmed-points-layer\")) {\r\n map.removeLayer(\"confirmed-points-layer\");\r\n }\r\n \r\n if (map.getSource(\"confirmed-points-data\")) {\r\n map.removeSource(\"confirmed-points-data\");\r\n }\r\n\r\n map.addSource(\"confirmed-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: \"confirmed-points-layer\",\r\n source: \"confirmed-points-data\",\r\n type: \"symbol\",\r\n layout: {\r\n // full list of icons here: https://labs.mapbox.com/maki-icons\r\n \"icon-image\": 'mapMarker1', // this will put little croissants on our map\r\n \"icon-padding\": 0,\r\n \"icon-allow-overlap\": true,\r\n 'icon-size': 0.3\r\n },\r\n });\r\n\r\n //DIRECT\r\n if (map.getLayer(\"route\")) {\r\n map.removeLayer(\"route\");\r\n }\r\n if (map.getSource(\"route-data\")) {\r\n map.removeSource(\"route-data\");\r\n }\r\n \r\n map.addSource('route-data', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'properties': {},\r\n 'geometry': {\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n }\r\n }\r\n });\r\n\r\n map.addLayer({\r\n 'id': 'route',\r\n 'type': 'line',\r\n 'source': 'route-data',\r\n 'layout': {\r\n 'line-join': 'round',\r\n 'line-cap': 'round',\r\n },\r\n 'paint': {\r\n 'line-color': '#0A95FF',\r\n 'line-width': 5,\r\n 'line-opacity': 0.75\r\n }\r\n });\r\n });\r\n\r\n return this.container;\r\n }\r\n\r\n onRemove() {\r\n this.container.parentNode.removeChild(this.container);\r\n //this.map = undefined;\r\n }\r\n\r\n resetSource(name, data) {\r\n const map = this.props.map;\r\n map.getSource(name).setData(data);\r\n }\r\n\r\n async fetchShops() {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n //spinner.current\r\n // .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n // .addTo(map);\r\n\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n\r\n await getAllShops(\"shops?q=\" + 'ha noi')\r\n .then((item) => {\r\n //this.setState({\r\n // results: item.data,\r\n // firstLoad: false\r\n //});\r\n\r\n //this.drawMap(this.state.query);\r\n this.drawMap(item.data);\r\n //console.log(item.data);\r\n //this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n //});\r\n\r\n spinner.current.remove();\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n //this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n //});\r\n spinner.current.remove();\r\n });\r\n }\r\n\r\n drawMap(data) {\r\n //console.log(\"Data: \" + data);\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const marker = this.props.marker;\r\n //const spinner = this.props.spinner;\r\n //const results = this.state.results;\r\n const results = data;\r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n popup.current.remove();\r\n marker.current.remove();\r\n //if (popup.current.isOpen()) popup.current.remove(); \r\n //console.log(\"Data: \" + results);\r\n const jsonMarkers = JSON.stringify(data);\r\n //console.log(\"Data: \" + jsonMarkers);\r\n\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n\r\n //if (vendor && vendor.trim() !== \"\") {\r\n //if (data) {\r\n // //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, 'ha noi');\r\n // //console.log(\"Return Count: \" + highlightMarkers.length);\r\n // //this.setState({\r\n // // query: vendor,\r\n // // //results: res.body, \r\n // // firstLoad: false,\r\n // // filteredList: highlightMarkers,\r\n // //});\r\n // //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // // highlightMarkers = markers.List.filter(\r\n // // (m) =>\r\n // // vendor &&\r\n // // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // // );\r\n // // usualMarkers = markers.filter(\r\n // // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n // //);\r\n\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers);\r\n //} else {\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers); \r\n //}\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n //const routeFeature = {\r\n // 'type': 'Feature',\r\n // 'properties': {},\r\n // 'geometry': directions.routes[0].geometry,\r\n //};\r\n //map.getSource(\"route-data\").setData(routeFeature);\r\n\r\n map.getSource(\"route-data\").setData({\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n });\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n\r\n //this.setState({\r\n // isLoading: false\r\n //});\r\n }\r\n\r\n getSuggestions(jsonMarkers, termsString) {\r\n const markers = JSON.parse(jsonMarkers);\r\n termsString = removeSpecName(termsString.trim().toLowerCase());\r\n var key = addSpecAddressRule(termsString.trim().toLowerCase());\r\n const terms = removeVieTones(key).split(\" \");\r\n const aggrFilterList = aggregateKeyList(terms);\r\n //for (let i = 0; i < aggrFilterList.length; i++) {\r\n // console.log(aggrFilterList[i]);\r\n //}\r\n\r\n var data = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //removeVieTones(p.ShopName).split(\" \"),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Address).toLowerCase().trim()\r\n //removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().match(term))\r\n ));\r\n\r\n //const key1 = removeVieTones(removeSpecName(key));\r\n //console.log(key1);\r\n //const terms1 = removeVieTones(key1).split(\" \");\r\n //const aggrFilterList1 = aggregateKeyList(terms1); \r\n\r\n var data2 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Street).toLowerCase().trim(),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Address).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n var data3 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.Name).toLowerCase().trim(), \r\n //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim(),\r\n removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n\r\n //var filterdShops = [];\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\").match(key))\r\n //// ));\r\n\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => removeVieTones(p.Province != null && p.Province.trim() != \"\" ? p.Province.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)));\r\n\r\n //var shopsByProvince = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.Province).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n\r\n //console.log(\"Total Count: \" + markers.length);\r\n //console.log(\"Province Count: \" + shopsByProvince.length);\r\n //var sJsonProvince = JSON.stringify(shopsByProvince);\r\n ////console.log(sJsonProvince);\r\n //var oJsonProvince = JSON.parse(sJsonProvince);\r\n //var shopsByDistrict = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.District).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n //console.log(\"District Count: \" + shopsByDistrict.length);\r\n //var sJsonDistrict = JSON.stringify(shopsByDistrict);\r\n //var oJsonDistrict = JSON.parse(sJsonDistrict);\r\n //var shopsByWard = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Ward != null && p.Ward.trim() != \"\" ? p.Ward.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Ward Count: \" + shopsByWard.length);\r\n //var sJsonWard = JSON.stringify(shopsByWard);\r\n //var oJsonWard = JSON.parse(sJsonWard);\r\n //var shopsByStreet = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Street != null && p.Street.trim() != \"\" ? p.Street.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Street Count: \" + shopsByStreet.length);\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\") === key)\r\n //// ));\r\n\r\n ////var shopsByDistrict = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.District).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByWard = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByStreet = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Street).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n //filterdShops = filterdShops.concat(shopsByStreet, shopsByWard, shopsByDistrict, shopsByProvince );\r\n ////filterdShops = filterdShops.concat(shopsByProvince);\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //// removeVieTones(p.Province).toLowerCase().trim(),\r\n //// removeVieTones(p.District).toLowerCase().trim(),\r\n //// removeVieTones(p.Ward).toLowerCase().trim(),\r\n //// removeVieTones(p.Street).toLowerCase().trim(),\r\n //// //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.Province).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).includes(term))\r\n //// ));\r\n\r\n ////const data = markers;\r\n\r\n ////const dataByWard = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [ removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n data = data.concat(data2).concat(data3);\r\n //data = data3.concat(data2).concat(data);\r\n data = data.filter(onlyUnique);\r\n return data;\r\n //return sortData(data, \"Province\", \"asc\");\r\n //return sortData(filterdShops, \"Province\", \"asc\");\r\n //return filterdShops;\r\n }\r\n\r\n async initDirections(name) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const geoLocate = this.props.geoLocate;\r\n const srcMarker = this.props.marker;\r\n const results = this.state.results;\r\n //const directions = this.state.directions;\r\n var highlightMarkers;\r\n this.props.handleToggler();\r\n\r\n spinner.current\r\n .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n .addTo(map);\r\n\r\n try {\r\n map.removeControl(geoLocate.current);\r\n }\r\n catch { }\r\n\r\n map.addControl(geoLocate.current, 'top-right');\r\n\r\n this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n geoLocate.current.on('geolocate', (e) => {\r\n let lng = e.coords.longitude;\r\n let lat = e.coords.latitude;\r\n let updatedValue = {};\r\n updatedValue = { lng: lng, lat: lat };\r\n this.setState({\r\n currentCoords: updatedValue,\r\n currentLng: lng,\r\n currentLat: lat,\r\n });\r\n\r\n if (this.state.isDirectMode) {\r\n const srcMarker = this.props.marker;\r\n srcMarker.current.remove();\r\n srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n });\r\n\r\n //geoLocate.current.trigger();\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n var _destLng, _destLat = \"\";\r\n if (name && name.trim() !== \"\") {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n if (highlightMarkers.length === 1) {\r\n //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n }\r\n\r\n var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n\r\n selectLoc.map((p) => {\r\n _destLng = p.Longitude;\r\n _destLat = p.Latitude;\r\n this.setState({\r\n destLng: p.Longitude,\r\n destLat: p.Latitude,\r\n startLng: p.Longitude,\r\n startLat: p.Latitude,\r\n });\r\n });\r\n\r\n //await getDirection(`${_destLng},${_destLat}`, `${_destLng},${_destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false,\r\n // isDirectInit: true,\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // spinner.current.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n // });\r\n\r\n this.props.handleDirection(true, map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4));\r\n //const srcMarker = this.props.marker;\r\n //Show direct guideline (popup) \r\n\r\n map.on(\"moveend\", async () => {\r\n if (!map) return;\r\n console.log('moveend');\r\n this.setState({ currentZoom: map.getZoom().toFixed(1) });\r\n //console.log(\"Current zoom: \" + map.getZoom().toFixed(1)); \r\n // Get new center coordinates \r\n const { lng, lat } = map.getCenter();\r\n const srcMarker = this.props.marker;\r\n srcMarker.current.setLngLat([lng, lat]);\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n });\r\n\r\n //map.on(\"load\", () => {\r\n // if (!map) return;\r\n // this.addRadarButton(map);\r\n //});\r\n\r\n //map.on(\"resize\", async () => {\r\n // map.setSize(13.5);\r\n // console.log(13.5);\r\n //});\r\n\r\n //radarButton.current.getElement().addEventListener('onClick', (e) => {\r\n // const centerPosition = {\r\n // center: [map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)],\r\n // };\r\n // map.flyTo(centerPosition);\r\n //});\r\n\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner;\r\n spinner.current.remove();\r\n } else {\r\n // do nothing\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default SearchButton;","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport * as turf from '@turf/turf';\r\nimport { getAllShops, getDirection } from \"./../api/apiService\";\r\nimport { removeVieTones, removeSpecName, removeSpecAddress } from \"./utils/strConverter\";\r\nimport { addSpecAddressRule, onlyUnique, aggregateKeyList, aggregateKey } from \"./utils/strConverter\";\r\nimport LoadingSpinner from \"./LoadingSpinner\";\r\nimport Scanner from \"./Scanner\";\r\nimport mapRadarBlue from \"./../img/map-radar-blue.png\";\r\nimport \"./index.css\";\r\n\r\nclass ScannerButton extends React.Component {\r\n constructor(props) {\r\n super(props); \r\n //this.onClick = this.onClick.bind(this);\r\n this.initGeoLoc = this.initGeoLoc.bind(this);\r\n this.initMarker = this.initMarker.bind(this);\r\n this.initSpinner = this.initSpinner.bind(this);\r\n }\r\n\r\n //onClick(e) {\r\n // console.log('clicked');\r\n //}\r\n\r\n initGeoLoc() {\r\n const map = this.props.map;\r\n const geo = this.props.geo;\r\n const mapResult = this.props.mapResult;\r\n //const mapSource = this.props.mapSource;\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n\r\n map.addControl(geo, 'top-right');\r\n\r\n //try {\r\n // map.removeControl(mapResult);\r\n //}\r\n //catch { }\r\n //map.addControl(mapResult, \"top-left\");\r\n\r\n //this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n //geo.on('geolocate', (e) => {\r\n // let lng = e.coords.longitude;\r\n // let lat = e.coords.latitude;\r\n // //let updatedValue = {};\r\n // //updatedValue = { lng: lng, lat: lat };\r\n // //this.setState({\r\n // // currentCoords: updatedValue,\r\n // // currentLng: lng,\r\n // // currentLat: lat,\r\n // //});\r\n\r\n // //if (this.state.isDirectMode) {\r\n // map.setZoom(13.4);\r\n // const srcMarker = this.props.marker;\r\n // srcMarker.current.remove();\r\n // srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n // //}\r\n\r\n // var from = [lng, lat];\r\n // //var to = [this.state.destLng, this.state.destLat];\r\n // //var distance = this.getDistance(from, to);\r\n // //console.log(`Distance: ${distance} km`);\r\n // var searchRadius = this.makeRadius(from, 1500);\r\n // //map.getSource('search-radius').setData(searchRadius);\r\n // //var featuresInBuffer = this.spatialJoin(this.state.hightlightResults, searchRadius);\r\n // map.getSource('confirmed-points-data').setData(searchRadius);\r\n \r\n //});\r\n\r\n //const srcMarker = this.props.marker;\r\n //const { lng, lat } = map.getCenter();\r\n //srcMarker.current.remove();\r\n //srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n\r\n makeRadius(lngLatArray, radiusInMeters) {\r\n var point = turf.point(lngLatArray);\r\n var options = { units: 'meters' };\r\n var buffered = turf.buffer(point, radiusInMeters, options);\r\n return buffered;\r\n }\r\n\r\n spatialJoin(sourceGeoJSON, filterFeature) {\r\n // Loop through all the features in the source geojson and return the ones that \r\n // are inside the filter feature (buffered radius) and are confirmed landing sites\r\n //console.log(sourceGeoJSON);\r\n var joined = sourceGeoJSON.features.filter(function (feature) {\r\n //return turf.booleanPointInPolygon(feature, filterFeature) && feature.properties.isConfirmed === 'yes'; \r\n return turf.booleanPointInPolygon(feature, filterFeature);\r\n });\r\n return joined;\r\n }\r\n\r\n initMarker(arrLngLat) {\r\n //const srcMarker = this.props.marker;\r\n //if (srcMarker)\r\n // srcMarker.current.setLngLat([lng, lat]);\r\n const map = this.props.map;\r\n const srcMarker = this.props.srcMarker;\r\n if (!arrLngLat) {\r\n const { lng, lat } = map.getCenter();\r\n srcMarker.remove();\r\n srcMarker.setLngLat([lng, lat]).addTo(map);\r\n }\r\n else {\r\n srcMarker.remove();\r\n srcMarker.setLngLat(arrLngLat).addTo(map);\r\n }\r\n }\r\n\r\n initSpinner(isDisplayed) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const { lng, lat } = map.getCenter();\r\n if (isDisplayed) {\r\n spinner.current\r\n //.setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n .setLngLat([lng, lat]).addTo(map);\r\n } else {\r\n spinner.current.remove();\r\n }\r\n }\r\n\r\n handleScanner(name) {\r\n this.fetchShops();\r\n //Add geo\r\n //const geoScan = this.props.geoScan;\r\n //geoScan.trigger();\r\n //this.initDirections('');\r\n const gaEventTracker = this.props.useGAEventTracker('Map');\r\n //gaEventTracker(`Shop [${name}]`);\r\n gaEventTracker(`Shop Scanner`);\r\n }\r\n\r\n onAdd() {\r\n const map = this.props.map;\r\n //const geoLocate = this.props.geoLocate;\r\n const geo = this.props.geo;\r\n const geoScan = this.props.geoScan;\r\n const searcher = this.props.searcher;\r\n const scanner = this.props.scanner;\r\n //const btnSearcher = this.props.btnSearcher;\r\n //const btnScanner = this.props.btnScanner;\r\n const srcMarker = this.props.srcMarker;\r\n const srcMarkerScan = this.props.srcMarkerScan;\r\n const destMarkerScan = this.props.destMarkerScan;\r\n //const scannerNode = document.createElement(\"div\");\r\n this.container = document.createElement(\"div\");\r\n this.container.className = \"mapboxgl-ctrl mapboxgl-ctrl-group\";\r\n this.container.innerHTML = ``;\r\n this.container.addEventListener(\"contextmenu\", (e) => e.preventDefault());\r\n this.container.addEventListener(\"click\", () => {\r\n srcMarker.remove();\r\n srcMarkerScan.remove();\r\n destMarkerScan.remove();\r\n try {\r\n map.removeControl(searcher); \r\n }\r\n catch { }\r\n try { \r\n map.removeControl(scanner); \r\n }\r\n catch { }\r\n\r\n //try {\r\n // map.removeControl(btnSearcher);\r\n //}\r\n //catch { }\r\n //try {\r\n // map.removeControl(btnScanner);\r\n //}\r\n //catch { }\r\n\r\n try {\r\n map.removeControl(geo);\r\n }\r\n catch { }\r\n try {\r\n map.removeControl(geoScan);\r\n }\r\n catch { }\r\n\r\n //map.addControl(scanner, \"top-left\");\r\n map.addControl(scanner, \"top-left\");\r\n //map.addControl(btnSearcher, \"top-right\");\r\n this.props.initGUI(map, false);\r\n\r\n // Hightlight data\r\n if (map.getLayer(\"hightlight-points-layer\")) {\r\n map.removeLayer(\"hightlight-points-layer\");\r\n }\r\n if (map.getSource(\"hightlight-points-data\")) {\r\n map.removeSource(\"hightlight-points-data\");\r\n }\r\n\r\n map.addSource(\"hightlight-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.addLayer({\r\n id: \"hightlight-points-layer\",\r\n source: \"hightlight-points-data\",\r\n type: \"symbol\",\r\n layout: {\r\n // full list of icons here: https://labs.mapbox.com/maki-icons\r\n \"icon-image\": 'mapMarker', // this will put little croissants on our map\r\n \"icon-padding\": 0,\r\n \"icon-allow-overlap\": true,\r\n 'icon-size': 0.3\r\n },\r\n });\r\n\r\n // Custom data\r\n if (map.getLayer(\"custom-points-layer\")) {\r\n map.removeLayer(\"custom-points-layer\");\r\n }\r\n if (map.getSource(\"custom-points-data\")) {\r\n map.removeSource(\"custom-points-data\");\r\n }\r\n\r\n map.addSource(\"custom-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n // Add the layer, and reference the data source above by name\r\n map.addLayer({\r\n id: \"custom-points-layer\",\r\n source: \"custom-points-data\",\r\n // type: \"symbol\",\r\n // layout: {\r\n // // full list of icons here: https://labs.mapbox.com/maki-icons\r\n // \"icon-image\": \"bakery-15\", // this will put little croissants on our map\r\n // \"icon-padding\": 0,\r\n // \"icon-allow-overlap\": true,\r\n // },\r\n type: \"circle\",\r\n interactive: true,\r\n paint: {\r\n \"circle-radius\": 10,\r\n //\"circle-color\": \"#F2A400\",\r\n \"circle-color\": \"#F98C0D\",\r\n //\"circle-color\": \"rgba(253,237,57,1)\",\r\n //\"circle-color\": \"rgba(164,65,99,1)\",\r\n },\r\n });\r\n\r\n });\r\n \r\n return this.container;\r\n }\r\n\r\n onRemove() {\r\n this.container.parentNode.removeChild(this.container);\r\n //this.map = undefined;\r\n }\r\n\r\n resetSource(name, data) {\r\n const map = this.props.map;\r\n map.getSource(name).setData(data);\r\n }\r\n\r\n async fetchShops() {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n //spinner.current\r\n // .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n // .addTo(map);\r\n\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n\r\n await getAllShops(\"shops?q=\" + 'ha noi')\r\n .then((item) => {\r\n //this.setState({\r\n // results: item.data,\r\n // firstLoad: false\r\n //});\r\n\r\n //this.drawMap(this.state.query);\r\n this.drawMap(item.data);\r\n //console.log(item.data);\r\n //this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n //});\r\n\r\n spinner.current.remove();\r\n })\r\n .catch(() => {\r\n //setErrorMessage(\"Unable to fetch list\");\r\n //this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n //});\r\n spinner.current.remove();\r\n });\r\n }\r\n\r\n drawMap(data) {\r\n //console.log(\"Data: \" + data);\r\n //this.setState({\r\n // isLoading: true\r\n //});\r\n const map = this.props.map;\r\n const popup = this.props.popup;\r\n const marker = this.props.marker;\r\n //const spinner = this.props.spinner;\r\n //const results = this.state.results;\r\n const results = data;\r\n //const directions = this.state.directions;\r\n var highlightMarkers, usualgeoJSON, highlightgeoJSON;\r\n popup.current.remove();\r\n marker.current.remove();\r\n //if (popup.current.isOpen()) popup.current.remove(); \r\n //console.log(\"Data: \" + results);\r\n const jsonMarkers = JSON.stringify(data);\r\n //console.log(\"Data: \" + jsonMarkers);\r\n\r\n //const jsonDirections = JSON.stringify(directions.routes[0].geometry);\r\n //console.log(\"Directions: \" + jsonDirections);\r\n\r\n //if (vendor && vendor.trim() !== \"\") {\r\n //if (data) {\r\n // //highlightMarkers = this.getFilterCentersSuggestions(jsonMarkers, vendor);\r\n // highlightMarkers = this.getSuggestions(jsonMarkers, 'ha noi');\r\n // //console.log(\"Return Count: \" + highlightMarkers.length);\r\n // //this.setState({\r\n // // query: vendor,\r\n // // //results: res.body, \r\n // // firstLoad: false,\r\n // // filteredList: highlightMarkers,\r\n // //});\r\n // //console.log(\"Filtered Data: \" + filteredData);\r\n\r\n // // highlightMarkers = markers.List.filter(\r\n // // (m) =>\r\n // // vendor &&\r\n // // m?.Address.trim().toLowerCase().includes(vendor.trim().toLowerCase())\r\n // // );\r\n // // usualMarkers = markers.filter(\r\n // // (m) => m.ShopName.toLowerCase() !== vendor.toLowerCase()\r\n // //);\r\n\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers);\r\n //} else {\r\n // //usualMarkers = markers;\r\n // //console.log(usualMarkers); \r\n //}\r\n\r\n usualgeoJSON = this.genFeatureListFromGeoData(jsonMarkers);\r\n const jsonFilteredMarkers = JSON.stringify(highlightMarkers);\r\n highlightgeoJSON = this.genFeatureListFromGeoList(jsonFilteredMarkers);\r\n //highlightgeoJSON = this.genFeatureListFromGeoData(highlightMarkers);\r\n\r\n map.getSource(\"custom-points-data\").setData(usualgeoJSON);\r\n // map.getSource(\"usual-points-data\").setData(usualgeoJSON);\r\n map.getSource(\"hightlight-points-data\").setData(highlightgeoJSON);\r\n //const routeFeature = {\r\n // 'type': 'Feature',\r\n // 'properties': {},\r\n // 'geometry': directions.routes[0].geometry,\r\n //};\r\n //map.getSource(\"route-data\").setData(routeFeature);\r\n\r\n map.getSource(\"route-data\").setData({\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n });\r\n\r\n // // clearing layers\r\n // if (map.getLayer(\"shops\")) {\r\n // map.removeLayer(\"shops\");\r\n // }\r\n // if (map.getSource(\"shops\")) {\r\n // map.removeSource(\"shops\");\r\n // }\r\n // if (map.getLayer(\"shops-highlight\")) {\r\n // map.removeLayer(\"shopss-highlight\");\r\n // }\r\n // if (map.getSource(\"shops-highlight\")) {\r\n // map.removeSource(\"shops-highlight\");\r\n // }\r\n\r\n // map\r\n // .addSource(\"shops\", {\r\n // type: \"geojson\",\r\n // data: usualgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"trucks\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(253,237,57,1)\",\r\n // },\r\n // });\r\n\r\n // if (highlightMarkers) {\r\n // map\r\n // .addSource(\"shops-highlight\", {\r\n // type: \"geojson\",\r\n // data: highlightgeoJSON,\r\n // })\r\n // .addLayer({\r\n // id: \"shops-highlight\",\r\n // type: \"circle\",\r\n // interactive: true,\r\n // source: \"shops-highlight\",\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // \"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n // });\r\n // }\r\n\r\n //this.setState({\r\n // isLoading: false\r\n //});\r\n }\r\n\r\n getSuggestions(jsonMarkers, termsString) {\r\n const markers = JSON.parse(jsonMarkers);\r\n termsString = removeSpecName(termsString.trim().toLowerCase());\r\n var key = addSpecAddressRule(termsString.trim().toLowerCase());\r\n const terms = removeVieTones(key).split(\" \");\r\n const aggrFilterList = aggregateKeyList(terms);\r\n //for (let i = 0; i < aggrFilterList.length; i++) {\r\n // console.log(aggrFilterList[i]);\r\n //}\r\n\r\n var data = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //removeVieTones(p.ShopName).split(\" \"),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Ward).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(p.Street).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(p.Address).toLowerCase().trim()\r\n //removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().match(term))\r\n ));\r\n\r\n //const key1 = removeVieTones(removeSpecName(key));\r\n //console.log(key1);\r\n //const terms1 = removeVieTones(key1).split(\" \");\r\n //const aggrFilterList1 = aggregateKeyList(terms1); \r\n\r\n var data2 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Province).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.District).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Ward).toLowerCase().trim(),\r\n removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Street).toLowerCase().trim(),\r\n //removeVieTones(aggregateKey(p.ShopName)).toLowerCase().trim() + \" \" + removeVieTones(p.Address).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n var data3 = markers.filter((p) =>\r\n aggrFilterList.every((term) => [\r\n //removeVieTones(p.Name).toLowerCase().trim(), \r\n //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim(),\r\n removeVieTones(removeSpecAddress(p.ShopAddress)).toLowerCase().trim()\r\n ]\r\n .some((f) => removeVieTones(f).toLowerCase().trim().includes(term))\r\n ));\r\n\r\n\r\n //var filterdShops = [];\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\").match(key))\r\n //// ));\r\n\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => removeVieTones(p.Province != null && p.Province.trim() != \"\" ? p.Province.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)));\r\n\r\n //var shopsByProvince = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.Province).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n\r\n //console.log(\"Total Count: \" + markers.length);\r\n //console.log(\"Province Count: \" + shopsByProvince.length);\r\n //var sJsonProvince = JSON.stringify(shopsByProvince);\r\n ////console.log(sJsonProvince);\r\n //var oJsonProvince = JSON.parse(sJsonProvince);\r\n //var shopsByDistrict = markers.filter((p) =>\r\n // aggrFilterList.every((term) => [\r\n // removeVieTones(p.District).toLowerCase().trim()\r\n // ].some((f) => removeVieTones(f).trim().toLowerCase().match(term))\r\n // ));\r\n //console.log(\"District Count: \" + shopsByDistrict.length);\r\n //var sJsonDistrict = JSON.stringify(shopsByDistrict);\r\n //var oJsonDistrict = JSON.parse(sJsonDistrict);\r\n //var shopsByWard = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Ward != null && p.Ward.trim() != \"\" ? p.Ward.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Ward Count: \" + shopsByWard.length);\r\n //var sJsonWard = JSON.stringify(shopsByWard);\r\n //var oJsonWard = JSON.parse(sJsonWard);\r\n //var shopsByStreet = markers.filter((p) =>\r\n // aggrFilterList.every((key) =>\r\n // removeVieTones(p.Street != null && p.Street.trim() != \"\" ? p.Street.toLowerCase().trim() : \"\").toLowerCase().trim().match(key)\r\n // ));\r\n //console.log(\"Street Count: \" + shopsByStreet.length);\r\n ////var shopsByProvince = markers.filter((p) =>\r\n //// aggrFilterList.every((key) => [ \r\n //// removeVieTones(p.Province).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item != null && item.trim() != \"\" ? item.toLowerCase().trim() : \"\") === key)\r\n //// ));\r\n\r\n ////var shopsByDistrict = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.District).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByWard = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n ////var shopsByStreet = data.filter((p) =>\r\n //// aggrFilterList.every((key) => [\r\n //// removeVieTones(p.Street).toLowerCase().trim()]\r\n //// .some((item) => removeVieTones(item.trim().toLowerCase()).equals(key))\r\n //// ));\r\n\r\n //filterdShops = filterdShops.concat(shopsByStreet, shopsByWard, shopsByDistrict, shopsByProvince );\r\n ////filterdShops = filterdShops.concat(shopsByProvince);\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.ShopName).toLowerCase().trim(),\r\n //// removeVieTones(p.Province).toLowerCase().trim(),\r\n //// removeVieTones(p.District).toLowerCase().trim(),\r\n //// removeVieTones(p.Ward).toLowerCase().trim(),\r\n //// removeVieTones(p.Street).toLowerCase().trim(),\r\n //// //removeVieTones(removeSpecAddress(p.Address)).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n ////const data = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [\r\n //// removeVieTones(p.Province).toLowerCase().trim()\r\n //// ]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).includes(term))\r\n //// ));\r\n\r\n ////const data = markers;\r\n\r\n ////const dataByWard = markers.filter((p) =>\r\n //// aggrFilterList.every((term) => [ removeVieTones(p.Ward).toLowerCase().trim()]\r\n //// .some((f) => removeVieTones(f.trim().toLowerCase()).equals(term))\r\n //// ));\r\n\r\n data = data.concat(data2).concat(data3);\r\n //data = data3.concat(data2).concat(data);\r\n data = data.filter(onlyUnique);\r\n return data;\r\n //return sortData(data, \"Province\", \"asc\");\r\n //return sortData(filterdShops, \"Province\", \"asc\");\r\n //return filterdShops;\r\n }\r\n\r\n async initDirections(name) {\r\n const map = this.props.map;\r\n const spinner = this.props.spinner;\r\n const geoLocate = this.props.geoLocate;\r\n const srcMarker = this.props.marker;\r\n const results = this.state.results;\r\n //const directions = this.state.directions;\r\n var highlightMarkers;\r\n this.props.handleToggler();\r\n\r\n spinner.current\r\n .setLngLat([map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)])\r\n .addTo(map);\r\n\r\n try {\r\n map.removeControl(geoLocate.current);\r\n }\r\n catch { }\r\n\r\n map.addControl(geoLocate.current, 'top-right');\r\n\r\n this.setState({ isDirectMode: true, });\r\n\r\n // Set an event listener that fires when a geolocate event occurs. \r\n geoLocate.current.on('geolocate', (e) => {\r\n let lng = e.coords.longitude;\r\n let lat = e.coords.latitude;\r\n let updatedValue = {};\r\n updatedValue = { lng: lng, lat: lat };\r\n this.setState({\r\n currentCoords: updatedValue,\r\n currentLng: lng,\r\n currentLat: lat,\r\n });\r\n\r\n if (this.state.isDirectMode) {\r\n const srcMarker = this.props.marker;\r\n srcMarker.current.remove();\r\n srcMarker.current.setLngLat([lng, lat]).addTo(map);\r\n }\r\n });\r\n\r\n //geoLocate.current.trigger();\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n const jsonMarkers = JSON.stringify(results);\r\n var _destLng, _destLat = \"\";\r\n if (name && name.trim() !== \"\") {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name);\r\n\r\n if (highlightMarkers.length === 1) {\r\n //console.log(\"* Dest Marker: \" + JSON.stringify(highlightMarkers)); \r\n } else {\r\n highlightMarkers = this.getSuggestions(jsonMarkers, name + ' ' + this.state.query);\r\n }\r\n\r\n var selectLoc = JSON.parse(JSON.stringify(highlightMarkers));\r\n\r\n selectLoc.map((p) => {\r\n _destLng = p.Longitude;\r\n _destLat = p.Latitude;\r\n this.setState({\r\n destLng: p.Longitude,\r\n destLat: p.Latitude,\r\n startLng: p.Longitude,\r\n startLat: p.Latitude,\r\n });\r\n });\r\n\r\n //await getDirection(`${_destLng},${_destLat}`, `${_destLng},${_destLat}`)\r\n // .then((item) => {\r\n // this.setState({\r\n // directions: item.data,\r\n // firstLoad: false,\r\n // isDirectInit: true,\r\n // });\r\n // //this.redrawMap(this.state.query);\r\n // this.redrawDirections(name);\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n\r\n // //const map = this.props.map;\r\n // //const spinner = this.props.spinner;\r\n // spinner.current.remove();\r\n // })\r\n // .catch(() => {\r\n // //setErrorMessage(\"Unable to fetch list\");\r\n // this.setState({\r\n // isLoading: false,\r\n // firstLoad: false\r\n // });\r\n // });\r\n\r\n this.props.handleDirection(true, map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4));\r\n //const srcMarker = this.props.marker;\r\n //Show direct guideline (popup) \r\n\r\n map.on(\"moveend\", async () => {\r\n if (!map) return;\r\n console.log('moveend');\r\n this.setState({ currentZoom: map.getZoom().toFixed(1) });\r\n //console.log(\"Current zoom: \" + map.getZoom().toFixed(1)); \r\n // Get new center coordinates \r\n const { lng, lat } = map.getCenter();\r\n const srcMarker = this.props.marker;\r\n srcMarker.current.setLngLat([lng, lat]);\r\n this.setState({\r\n startLng: lng,\r\n startLat: lat,\r\n //isDirectInit: (this.state.startLng === this.state.destLng && this.state.startLat === this.state.destLat)?true:false,\r\n });\r\n });\r\n\r\n //map.on(\"load\", () => {\r\n // if (!map) return;\r\n // this.addRadarButton(map);\r\n //});\r\n\r\n //map.on(\"resize\", async () => {\r\n // map.setSize(13.5);\r\n // console.log(13.5);\r\n //});\r\n\r\n //radarButton.current.getElement().addEventListener('onClick', (e) => {\r\n // const centerPosition = {\r\n // center: [map.getCenter().lng.toFixed(4), map.getCenter().lat.toFixed(4)],\r\n // };\r\n // map.flyTo(centerPosition);\r\n //});\r\n\r\n this.setState({\r\n isLoading: false,\r\n firstLoad: false\r\n });\r\n\r\n //const map = this.props.map;\r\n //const spinner = this.props.spinner;\r\n spinner.current.remove();\r\n } else {\r\n // do nothing\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default ScannerButton;","import React from \"react\";\nimport zalo from \"./../img/zalo-icon-blue.png\";\nimport phone from \"./../img/phone-icon-blue.png\";\n\nconst Popup = ({ feature }) => {\n const { id, displayName, displayAddress, phoneNumber, banner } = feature.properties;\n let zaloCall = \"https://zalo.me/\" + phoneNumber.split(/\\s/).join('');\n let phoneCall = \"tel:\" + phoneNumber.split(/\\s/).join('');\n let urlBanner = banner ? \"https://vinflower.com/wp-content/uploads/iflower/images/banners/\" + banner : \"https://vinflower.com/wp-content/uploads/2023/06/5539763.png\";\n\n return (\n
  • \n
    \n
    \n
    \n
    {displayName}
    \n
    {displayAddress}
    \n
    \n
    \n {/*\"Banner\"*/}\n \"Banner\"\n
    \n
    \n
    \n
    \n {/*\"Directions\"*/}\n*/}\n \n \"Phone\"\n \n \n \"Zalo\"\n \n
    \n
    \n
  • \n\n //OLD\n //
    \n //
    {displayName}
    \n //
    Liên hệ ngay với Shop
    \n // \n // \"Phone\"\n // \n //
    {displayAddress}
    \n // \n // \"Zalo\n // \n //
    \n );\n};\n\nexport default Popup;\n","\r\nimport ReactGA from \"react-ga\";\r\n\r\nconst useGAEventTracker = (category=\"Map\") => {\r\n const eventTracker = (action = \"Search Action\", label = \"Search Location\") => {\r\n ReactGA.event({category, action, label});\r\n }\r\n return eventTracker;\r\n}\r\n\r\nexport default useGAEventTracker;\r\n\r\n\r\n\r\n","import ReactDOM from \"react-dom\";\r\nimport React, { useRef, useEffect, useState } from \"react\";\r\nimport mapboxgl from \"mapbox-gl\"; // eslint-disable-line import/no-webpack-loader-syntax\r\nimport logo from \"./../img/iflower-logo.png\";\r\nimport markerImg from \"./../img/marker-1.png\";\r\nimport markerImg1 from \"./../img/marker-1.png\";\r\n//import locMarker from \"./../img/pointer-marker.png\";\r\n//import homeMarker from \"./../img/home-marker.png\";\r\nimport homeMarkerBlue from \"./../img/home-marker-blue.png\";\r\nimport pointerMarkerRed from \"./../img/pointer-marker-red.png\";\r\nimport mapRadarBlue from \"./../img/map-radar-blue.png\";\r\nimport shopMarkerBlue from \"./../img/shop-marker-blue.png\";\r\n\r\n//import { RiMenuLine } from \"react-icons/ri\";\r\n//import { FcFinePrint } from \"react-icons/fc\";\r\n//import Sidebar from \"./Sidebar\";\r\n\r\n//import Result from \"./Result\";\r\n//import Scanner from \"./Scanner\";\r\n//import ResultCtrl from \"./ResultCtrl\";\r\n\r\nimport SearcherCtrl from \"./SearcherCtrl\";\r\nimport ScannerCtrl from \"./ScannerCtrl\";\r\nimport SearchButton from \"./SearchButton\";\r\nimport ScannerButton from \"./ScannerButton\";\r\n\r\nimport Popup from \"./Popup\";\r\nimport \"./index.css\";\r\nimport LoadingSpinner from \"./LoadingSpinner\";\r\nimport useGAEventTracker from './utils/useGAEventTracker';\r\n\r\nimport \"./main.css\";\r\n\r\n\r\n\r\nexport default function Map() {\r\n const mapContainer = useRef(null);\r\n const popUpRef = useRef(new mapboxgl.Popup({ offset: 15 }));\r\n const spinnerRef = useRef(new mapboxgl.Popup({ offset: 0 }));\r\n\r\n // Initialize the geolocate control.\r\n const geoLocateRef = useRef(new mapboxgl.GeolocateControl({\r\n positionOptions: {\r\n enableHighAccuracy: true\r\n },\r\n trackUserLocation: true,\r\n showUserHeading: true, \r\n }));\r\n\r\n const elAppSpinner = document.createElement(\"div\");\r\n const elSpinner = document.createElement(\"div\");\r\n const el = document.createElement(\"div\");\r\n const elMapRadar = document.createElement(\"div\");\r\n const elSrc = document.createElement(\"div\"); //selected home\r\n const elDest = document.createElement(\"div\"); //selected desc\r\n \r\n var directionModeRef = useRef(false);\r\n var btnSearcher = useRef(new SearchButton());\r\n var btnScanner = useRef(new ScannerButton());\r\n \r\n //const gaEventTracker = useGAEventTracker('Map');\r\n //const map = useRef(null);\r\n \r\n const [map, setMap] = useState(null);\r\n const [geo, setGeo] = useState(null);\r\n const [geoScan, setGeoScan] = useState(null);\r\n const [searcher, setSearcher] = useState(null);\r\n const [scanner, setScanner] = useState(null);\r\n\r\n //const [btnSearcher, setBtnSearcher] = useState(null);\r\n //const [btnScanner, setBtnScanner] = useState(null);\r\n\r\n const [spinner, setSpinner] = useState(null);\r\n const [appSpinner, setAppSpinner] = useState(null);\r\n const [popup, setPopup] = useState(null);\r\n\r\n const [isSearchActivated, setIsSearchActivated] = useState(true);\r\n \r\n //const [isScanInit, setIsScanInit] = useState(null);\r\n //const [isSearchInit, setIsSearchInit] = useState(null);\r\n\r\n const [mapResult, setMapResult] = useState(null);\r\n const [selectMarker, setSelectMarker] = useState(null);\r\n const [selectMarkerScan, setSelectMarkerScan] = useState(null);\r\n const [srcMarker, setSrcMarker] = useState(null);\r\n const [srcMarkerScan, setSrcMarkerScan] = useState(null);\r\n const [destMarkerScan, setDestMarkerScan] = useState(null);\r\n const isCollapsed = localStorage.getItem('is-sidebar-collapsed');\r\n const [isExpanded, setIsExpanded] = useState(isCollapsed ? false : true);\r\n \r\n let mapMarkers = [];\r\n const [mapData, setMapData] = useState([]);\r\n const [mapSource, setMapSource] = useState([]);\r\n const [lng, setLng] = useState(105.8388);\r\n const [lat, setLat] = useState(21.0191);\r\n const [zoom, setZoom] = useState(12.5);\r\n\r\n //let currentCoords = useRef({ lng: 0, lat: 0 });\r\n\r\n const initGUI = (map, isSearch) => { \r\n setIsSearchActivated(isSearch);\r\n if (isSearch) { \r\n try {\r\n map.removeControl(btnSearcher);\r\n }\r\n catch { }\r\n map.addControl(btnScanner, \"top-right\");\r\n }\r\n else { \r\n try {\r\n map.removeControl(btnScanner);\r\n }\r\n catch { }\r\n map.addControl(btnSearcher, \"top-right\");\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (process.env.REACT_APP_MAP_ACCESS_TOKEN == null) {\r\n throw new Error(\"You need to have API_ACCESS_TOKEN (env), see README\");\r\n }\r\n mapboxgl.accessToken = process.env.REACT_APP_MAP_ACCESS_TOKEN;\r\n\r\n const initializeMap = ({ setMap, mapContainer }) => {\r\n //if (map) return; // Initialize map only once\r\n console.log(\"Initializing...\");\r\n const map = new mapboxgl.Map({\r\n container: mapContainer.current,\r\n style: \"mapbox://styles/mapbox/streets-v12\", // stylesheet location\r\n //style: 'mapbox://styles/mapbox/light-v11', // style URL\r\n //style: \"mapbox://styles/prakhar/cij2cpsn1004p8ykqqir34jm8\",\r\n center: [lng, lat],\r\n zoom: 12.5,\r\n maxZoom: 19,\r\n minZoom: 6\r\n });\r\n\r\n if (!map) return; // Wait for map to initialize\r\n\r\n elAppSpinner.className = \"loadSpinner\";\r\n //elAppSpinner.style.backgroundImage = `url(${spinnerBlue})`;\r\n elAppSpinner.style.width = `0px`;\r\n elAppSpinner.style.height = `0px`;\r\n elAppSpinner.style.background = 'none';\r\n ReactDOM.render(, elAppSpinner);\r\n\r\n const appSpinner = new mapboxgl.Marker(elAppSpinner);\r\n setAppSpinner(appSpinner);\r\n\r\n //Show Loading Spinner\r\n // TODO: determine init loc!\r\n //const { lng, lat } = map.getCenter();\r\n \r\n appSpinner.setLngLat([lng, lat]).addTo(map);\r\n\r\n //const spinner = new mapboxgl.Popup({ offset: 0 });\r\n const spinner = new mapboxgl.Marker(elSpinner);\r\n const selectMarker = new mapboxgl.Marker(elSrc);\r\n const srcMarker = new mapboxgl.Marker(el); //pointerMarkerRed\r\n const srcMarkerScan = new mapboxgl.Marker(elMapRadar); //pointerScannerBlue\r\n const destMarkerScan = new mapboxgl.Marker(elDest); // shop Marker\r\n \r\n const popup = new mapboxgl.Popup({ offset: 15 });\r\n const geo = new mapboxgl.GeolocateControl({\r\n positionOptions: {\r\n enableHighAccuracy: true\r\n },\r\n trackUserLocation: true,\r\n showUserHeading: true,\r\n });\r\n\r\n const geoScan = new mapboxgl.GeolocateControl({\r\n positionOptions: {\r\n enableHighAccuracy: true\r\n },\r\n trackUserLocation: true,\r\n showUserHeading: true,\r\n });\r\n\r\n const searcher = new SearcherCtrl({ map: map, geo: geo, geoScan: geoScan, selectMarker: selectMarker, srcMarker: srcMarker, srcMarkerScan: srcMarkerScan, destMarkerScan: destMarkerScan, spinner: spinner, popup: popup, handleRadar: handleRadar, directionModeRef: directionModeRef, geoLocate: geoLocateRef, handleZoom: handleZoom, handleToggler: handleToggler, useGAEventTracker: useGAEventTracker });\r\n\r\n const scanner = new ScannerCtrl({ map: map, geo: geo, geoScan: geoScan, selectMarker: selectMarker, srcMarker: srcMarker, srcMarkerScan: srcMarkerScan, destMarkerScan: destMarkerScan, spinner: spinner, popup: popup, handleRadar: handleRadar, directionModeRef: directionModeRef, geoLocate: geoLocateRef, handleZoom: handleZoom, handleToggler: handleToggler, useGAEventTracker: useGAEventTracker });\r\n\r\n btnSearcher = new SearchButton({ map: map, geo: geo, geoScan: geoScan, searcher: searcher, scanner: scanner, initGUI: initGUI, selectMarker: selectMarker, srcMarker: srcMarker, srcMarkerScan: srcMarkerScan, destMarkerScan: destMarkerScan, handleRadar: handleRadar, spinner: spinnerRef, directionModeRef: directionModeRef, geoLocate: geoLocateRef, handleZoom: handleZoom, handleToggler: handleToggler, useGAEventTracker: useGAEventTracker });\r\n\r\n btnScanner = new ScannerButton({ map: map, geo: geo, geoScan: geoScan, searcher: searcher, scanner: scanner, initGUI: initGUI, selectMarker: selectMarker, srcMarker: srcMarker, srcMarkerScan: srcMarkerScan, destMarkerScan: destMarkerScan, handleRadar: handleRadar, spinner: spinnerRef, directionModeRef: directionModeRef, geoLocate: geoLocateRef, handleZoom: handleZoom, handleToggler: handleToggler, useGAEventTracker: useGAEventTracker });\r\n\r\n //spinner.remove();\r\n map.on(\"load\", () => { \r\n if (!map) return;\r\n //spinner.setLngLat([lng, lat]).addTo(map);\r\n // create spinner node\r\n //const spinner = document.createElement('div');\r\n //spinner.style.cssText = 'width:0px; height:0px; margin: 0px 0px 0px 0px;border-radius:10px; border:0px solid #ddd; box-shadow: 0px 0px 5px 4px rgba(67,60,67,.16)';\r\n //spinner.style.zIndex = 1005;\r\n //ReactDOM.render(, spinner);\r\n //spinnerRef.current.setLngLat([lng, lat]).setDOMContent(spinner).addTo(map);\r\n //setSpinner(spinner);\r\n\r\n //Show loading spinner\r\n //const { lng, lat } = map.getCenter();\r\n //spinner.setLngLat([lng, lat]).addTo(map);\r\n\r\n setSpinner(spinner);\r\n setPopup(popup);\r\n setSrcMarker(srcMarker);\r\n setSrcMarkerScan(srcMarkerScan);\r\n setDestMarkerScan(destMarkerScan);\r\n setSelectMarker(selectMarker);\r\n setMap(map);\r\n setGeo(geo);\r\n setGeoScan(geoScan); \r\n setSearcher(searcher);\r\n setScanner(scanner);\r\n\r\n //setBtnSearcher(btnSearcher);\r\n //setBtnScanner(btnScanner);\r\n\r\n map.addControl(searcher, \"top-left\");\r\n //map.addControl(scanner, \"top-left\");\r\n //map.addControl(btnSearcher, \"top-right\");\r\n //map.addControl(btnScanner, \"top-right\");\r\n initGUI(map, true);\r\n \r\n // DIRECT\r\n map.addSource('route-data', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'properties': {},\r\n 'geometry': {\r\n 'type': 'LineString',\r\n 'coordinates': []\r\n }\r\n }\r\n });\r\n\r\n map.addLayer({\r\n 'id': 'route',\r\n 'type': 'line',\r\n 'source': 'route-data',\r\n 'layout': {\r\n 'line-join': 'round',\r\n 'line-cap': 'round',\r\n },\r\n 'paint': {\r\n 'line-color': '#0A95FF',\r\n 'line-width': 5,\r\n 'line-opacity': 0.75\r\n }\r\n });\r\n\r\n // Confirmed shop landing sites.\r\n map.addSource(\"confirmed-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n map.loadImage(\r\n markerImg1,\r\n (error, image) => {\r\n if (error) throw error;\r\n // Add the image to the map style.\r\n map.addImage('mapMarker1', image);\r\n // Add the layer, and reference the data source above by name\r\n map.addLayer({\r\n id: \"confirmed-points-layer\",\r\n source: \"confirmed-points-data\",\r\n type: \"symbol\",\r\n layout: {\r\n // full list of icons here: https://labs.mapbox.com/maki-icons\r\n \"icon-image\": 'mapMarker1', // this will put little croissants on our map\r\n \"icon-padding\": 0,\r\n \"icon-allow-overlap\": true,\r\n 'icon-size': 0.3\r\n },\r\n //type: \"circle\",\r\n //interactive: true,\r\n //paint: {\r\n // \"circle-radius\": 12,\r\n // \"circle-color\": \"#F98C0D\",\r\n //},\r\n });\r\n }\r\n );\r\n //map.addLayer({\r\n // id: 'shop-confirmed',\r\n // source: \"confirmed-points-data\",\r\n // //type: 'symbol',\r\n // //layout: {\r\n // // 'icon-image': 'rocket-11',\r\n // // 'icon-size': 1,\r\n // // 'icon-allow-overlap': true\r\n // //}\r\n // type: \"circle\",\r\n // interactive: true,\r\n // paint: {\r\n // \"circle-radius\": 8,\r\n // //\"circle-color\": \"#F2A400\",\r\n // \"circle-color\": \"#D33B37\",\r\n // //\"circle-color\": \"rgba(253,237,57,1)\",\r\n // //\"circle-color\": \"rgba(164,65,99,1)\",\r\n // },\r\n //}); \r\n\r\n map.addSource(\"radius-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n // Draw the shop search radius on the map\r\n map.addLayer({\r\n id: 'search-radius',\r\n source: \"radius-points-data\",\r\n //source: {\r\n // type: 'geojson',\r\n // data: { \"type\": \"FeatureCollection\", \"features\": [] }\r\n //},\r\n type: 'fill',\r\n paint: {\r\n 'fill-color': '#D33B37',\r\n 'fill-opacity': 0.1\r\n }\r\n });\r\n\r\n // CUSTOM\r\n // Add the data source for new a feature collection with no features\r\n map.addSource(\"custom-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n // Add the layer, and reference the data source above by name\r\n map.addLayer({\r\n id: \"custom-points-layer\",\r\n source: \"custom-points-data\",\r\n // type: \"symbol\",\r\n // layout: {\r\n // // full list of icons here: https://labs.mapbox.com/maki-icons\r\n // \"icon-image\": \"bakery-15\", // this will put little croissants on our map\r\n // \"icon-padding\": 0,\r\n // \"icon-allow-overlap\": true,\r\n // },\r\n type: \"circle\",\r\n interactive: true,\r\n paint: {\r\n \"circle-radius\": 10,\r\n //\"circle-color\": \"#F2A400\",\r\n \"circle-color\": \"#F98C0D\",\r\n //\"circle-color\": \"rgba(253,237,57,1)\",\r\n //\"circle-color\": \"rgba(164,65,99,1)\",\r\n },\r\n });\r\n\r\n //Add layer to show all shop sighting locations\r\n //map.addLayer({\r\n // id: 'shops',\r\n // source: \"custom-points-data\",\r\n // type: 'circle',\r\n // paint: {\r\n // 'circle-color': '#5555f6',\r\n // 'circle-radius': 8,\r\n // 'circle-opacity': .5\r\n // }\r\n //});\r\n\r\n //USUAL\r\n // Add the data source for new a feature collection with no features\r\n map.addSource(\"usual-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n // Add the layer, and reference the data source above by name\r\n map.addLayer({\r\n id: \"usual-points-layer\",\r\n source: \"usual-points-data\",\r\n // type: \"symbol\",\r\n // layout: {\r\n // // full list of icons here: https://labs.mapbox.com/maki-icons\r\n // \"icon-image\": \"bakery-15\", // this will put little croissants on our map\r\n // \"icon-padding\": 0,\r\n // \"icon-allow-overlap\": true,\r\n // },\r\n type: \"circle\",\r\n interactive: true,\r\n paint: {\r\n \"circle-radius\": 10,\r\n \"circle-color\": \"#F98C0D\",\r\n },\r\n });\r\n\r\n //HIGHTLIGHT\r\n // Add the data source for new a feature collection with no features\r\n map.addSource(\"hightlight-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n map.loadImage(\r\n markerImg,\r\n (error, image) => {\r\n if (error) throw error;\r\n // Add the image to the map style.\r\n map.addImage('mapMarker', image);\r\n // Add the layer, and reference the data source above by name\r\n map.addLayer({\r\n id: \"hightlight-points-layer\",\r\n source: \"hightlight-points-data\",\r\n type: \"symbol\",\r\n layout: {\r\n // full list of icons here: https://labs.mapbox.com/maki-icons\r\n \"icon-image\": 'mapMarker', // this will put little croissants on our map\r\n \"icon-padding\": 0,\r\n \"icon-allow-overlap\": true,\r\n 'icon-size': 0.3\r\n },\r\n //type: \"circle\",\r\n //interactive: true,\r\n //paint: {\r\n // \"circle-radius\": 12,\r\n // \"circle-color\": \"#F98C0D\",\r\n //},\r\n });\r\n }\r\n );\r\n\r\n //CUSTOMIZE \r\n // Add the layer, and refer\r\n // Empty Source\r\n //const text_points_data_GeoJsonSource = {\r\n // type: 'geojson',\r\n // data: textfeatureCollection //Initially this is empty\r\n // };\r\n\r\n // Add the data source for new a feature collection with no features\r\n map.addSource(\"text-points-data\", {\r\n type: \"geojson\",\r\n data: {\r\n type: \"FeatureCollection\",\r\n features: [],\r\n },\r\n });\r\n\r\n //Create Text Layer with textGeoJsonSource\r\n const sectionTextLayer = {\r\n id: \"sectionTextLayer\",\r\n type: \"symbol\",\r\n source: \"text-points-data\",\r\n interactive: true,\r\n paint: {\r\n \"text-color\": \"rgba(0,0,0,255)\", //Color of your choice\r\n //\"text-color\": \"rgba(164,65,99,1)\", //Color of your choice\r\n //\"text-halo-blur\": textHaloBlur,\r\n //\"text-halo-color\": textHaloColor,\r\n //\"text-halo-width\": textHaloWidth,\r\n //\"text-opacity\": 1\r\n },\r\n layout: {\r\n \"text-field\": ['get', 't'], //This will get \"t\" property from your geojson\r\n //\"text-font\": ['Calibri'],\r\n \"text-size\": ['get', 's'],\r\n \"text-rotation-alignment\": \"auto\",\r\n \"text-allow-overlap\": true,\r\n \"text-anchor\": \"top\"\r\n }\r\n };\r\n\r\n\r\n //Populate Data to Source\r\n const textFeatureList = [];\r\n //const objJson = JSON.parse(textGeoJSONFeature);\r\n textFeatureList.push(\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(114.9061), parseFloat(14.2901)]\r\n },\r\n properties: {\r\n t: \"BIỂN ĐÔNG\", //Text display on Map\r\n s: 17\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(112.8046), parseFloat(16.6072)]\r\n },\r\n properties: {\r\n t: \"Quần đảo Hoàng Sa (Việt Nam)\", //Text display on Map\r\n s: 12\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(115.7708), parseFloat(10.6287)]\r\n },\r\n properties: {\r\n t: \"Quần đảo Trường Sa (Việt Nam)\", //Text display on Map\r\n s: 12\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(108.0835), parseFloat(20.4965)]\r\n },\r\n properties: {\r\n t: \"VỊNH BẮC BỘ\", //Text display on Map\r\n s: 15\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(108.016256), parseFloat(21.195290)]\r\n },\r\n properties: {\r\n t: \"Đ. Bồ Cát\", //Text display on Map\r\n s: 11\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(107.728831), parseFloat(20.132233)]\r\n },\r\n properties: {\r\n t: \"Đ. Bạch Long Vỹ\", //Text display on Map\r\n s: 11\r\n }\r\n },\r\n {\r\n type: \"Feature\",\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [parseFloat(103.4884), parseFloat(9.3097)]\r\n },\r\n properties: {\r\n t: \"Đ. Thổ Chu (Việt Nam)\", //Text display on Map\r\n s: 11\r\n }\r\n }\r\n );\r\n\r\n const textFeatureCollection = {\r\n type: \"FeatureCollection\",\r\n features: textFeatureList\r\n }\r\n\r\n map.getSource(\"text-points-data\").setData(textFeatureCollection);\r\n\r\n //Override base map with Occean Polygon layer\r\n // Add a data source containing GeoJSON data.\r\n map.addSource('eastern-sea-polygon', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n 'type': 'Polygon',\r\n // These coordinates outline\r\n 'coordinates': [\r\n [\r\n [115.6548, 16.3424],\r\n [115.3419, 16.3424],\r\n [114.0761, 11.7272],\r\n [114.4546, 11.7272],\r\n [115.6548, 16.3424]\r\n\r\n ]\r\n ]\r\n }\r\n }\r\n });\r\n map.addSource('gulf-sea-polygon', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n 'type': 'Polygon',\r\n // These coordinates outline\r\n 'coordinates': [\r\n [\r\n [102.5184, 9.8762],\r\n [101.7436, 9.8762],\r\n [101.4207, 9.0768],\r\n [102.7949, 9.0768],\r\n [102.5184, 9.8762]\r\n ]\r\n ]\r\n }\r\n }\r\n });\r\n map.addSource('gulf-northern-polygon', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n 'type': 'Polygon',\r\n // These coordinates outline\r\n 'coordinates': [\r\n [\r\n [108.3600, 20.6863],\r\n [107.2271, 20.6863],\r\n [107.6586, 20.1768],\r\n [108.9433, 20.1768],\r\n [108.3600, 20.6863]\r\n ]\r\n ]\r\n }\r\n }\r\n });\r\n\r\n map.addSource('gulf-northern-polygon-2', {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n 'type': 'Polygon',\r\n // These coordinates outline\r\n 'coordinates': [\r\n [\r\n [108.8100, 20.1204],\r\n [107.2177, 20.1204],\r\n [106.5206, 19.1002],\r\n [107.9526, 19.1002],\r\n [108.8100, 20.0105]\r\n ]\r\n ]\r\n }\r\n }\r\n });\r\n\r\n // Add a new layer to visualize the polygon.\r\n map.addLayer({\r\n 'id': 'easternSea',\r\n 'type': 'fill',\r\n 'source': 'eastern-sea-polygon', //reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#66CBFF', // occean blue color fill\r\n 'fill-opacity': 1\r\n }\r\n });\r\n map.addLayer({\r\n 'id': 'gulf-northern',\r\n 'type': 'fill',\r\n 'source': 'gulf-northern-polygon', //reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#99DDFF', // occean blue color fill\r\n 'fill-opacity': 1\r\n }\r\n });\r\n map.addLayer({\r\n 'id': 'gulf-northern-2',\r\n 'type': 'fill',\r\n 'source': 'gulf-northern-polygon-2', //reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#99DDFF', // occean blue color fill\r\n 'fill-opacity': 1\r\n }\r\n });\r\n map.addLayer({\r\n 'id': 'gulf',\r\n 'type': 'fill',\r\n 'source': 'gulf-sea-polygon', //reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#99DDFF', // occean blue color fill\r\n 'fill-opacity': 1\r\n }\r\n });\r\n\r\n //// Add a outline around the polygon to test\r\n //map.addLayer({\r\n // 'id': 'outline2',\r\n // 'type': 'line',\r\n // 'source': 'gulf-northern-polygon',\r\n // 'layout': {},\r\n // 'paint': {\r\n // 'line-color': '#FFF',\r\n // 'line-width': 1\r\n // }\r\n //});\r\n\r\n //End Override Occean\r\n\r\n map.addLayer(sectionTextLayer);\r\n\r\n //Set language\r\n const language = \"vi\";\r\n // Use setLayoutProperty to set the value of a layout property in a style layer.\r\n // The three arguments are the id of the layer, the name of the layout property,\r\n // and the new property value.\r\n map.setLayoutProperty('country-label', 'text-field', ['get', `name_${language}`]);\r\n\r\n elSpinner.className = \"loadSpinner\";\r\n //elSpinner.style.backgroundImage = `url(${spinnerBlue})`;\r\n elSpinner.style.width = `0px`;\r\n elSpinner.style.height = `0px`;\r\n elSpinner.style.background = 'none';\r\n ReactDOM.render(, elSpinner);\r\n\r\n //elSrc.addEventListener('click', () => {\r\n // //window.alert(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}]`);\r\n // //console.log(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}] `);\r\n //});\r\n\r\n // Add marker to map\r\n //const el = document.createElement(\"div\");\r\n el.className = \"marker\";\r\n el.style.backgroundImage = `url(${pointerMarkerRed})`;\r\n el.style.width = `40px`;\r\n el.style.height = `40px`;\r\n el.style.backgroundSize = '100%';\r\n //el.addEventListener('click', () => {\r\n // window.alert(`LOC: [${lng}, ${lat}]`);\r\n //});\r\n\r\n elSrc.className = \"marker\";\r\n elSrc.style.backgroundImage = `url(${homeMarkerBlue})`;\r\n elSrc.style.width = `40px`;\r\n elSrc.style.height = `40px`;\r\n elSrc.style.backgroundSize = '100%';\r\n //elSrc.addEventListener('click', () => {\r\n // //window.alert(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}]`);\r\n // //console.log(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}] `);\r\n //});\r\n\r\n elDest.className = \"marker\";\r\n elDest.style.backgroundImage = `url(${shopMarkerBlue})`;\r\n elDest.style.width = `40px`;\r\n elDest.style.height = `40px`;\r\n elDest.style.backgroundSize = '100%';\r\n //elSrc.addEventListener('click', () => {\r\n // //window.alert(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}]`);\r\n // //console.log(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}] `);\r\n //});\r\n\r\n elMapRadar.className = \"marker\";\r\n elMapRadar.style.backgroundImage = `url(${mapRadarBlue})`;\r\n elMapRadar.style.width = `40px`;\r\n elMapRadar.style.height = `40px`;\r\n elMapRadar.style.backgroundSize = '100%';\r\n //elMapRadar.addEventListener('click', () => {\r\n // window.alert(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}]`);\r\n // //console.log(`Vị trí hiện tại của bạn: [${currentCoords.lng}, ${currentCoords.lat}] `);\r\n //});\r\n //map.add(mapRadar, 'top-right');\r\n //mapRadar.addTo(map);\r\n \r\n //var topPane = map._createPane('leaflet-top-pane', map.getPanes().mapPane);\r\n //var topLayer = mblabels.addTo(map);\r\n //topPane.appendChild(topLayer.getContainer());\r\n\r\n //var MyControl = mapboxgl.Control.extend({\r\n // options: {\r\n // position: 'bottomleft'\r\n // },\r\n\r\n // onAdd: function (map) {\r\n // // create the control container with a particular class name\r\n // // ** you can add the image to the div as a background image using css\r\n // //var container = L.DomUtil.create('div', 'my-custom-control');\r\n\r\n // // ... initialize other DOM elements, add listeners, etc.\r\n // //return container;\r\n\r\n // return mapRadar;\r\n // }\r\n //});\r\n\r\n //map.addControl(new MyControl());\r\n //TODO:remove\r\n //currentMarkerRef.current.setLngLat([lng, lat]);\r\n //spinnerRef.current.remove();\r\n\r\n appSpinner.remove();\r\n console.log(\"Loaded!!!\");\r\n });\r\n\r\n //if (!map) return; // wait for map to initialize\r\n map.on(\"move\", () => {\r\n if (!map) return;\r\n setLng(map.getCenter().lng.toFixed(4));\r\n setLat(map.getCenter().lat.toFixed(4));\r\n //if (map.getZoom().toFixed(1) >= 6) {\r\n // //setZoom(map.getZoom().toFixed(1));\r\n //} \r\n //else\r\n // map.setZoom(6.0); \r\n });\r\n\r\n //map.on(\"moveend\", async () => {\r\n // if (!map) return;\r\n // // Get new center coordinates\r\n // const { lng, lat } = map.getCenter();\r\n\r\n // currentMarkerRef.current.setLngLat([lng, lat]);\r\n // //console.log(`${curCoords.lng}, ${curCoords.lat}`);\r\n // //console.log(`GRef Current location: [${currentCoords.lng}, ${currentCoords.lat}] `);\r\n //});\r\n\r\n // Change cursor to pointer when user hovers over a clickable feature\r\n map.on(\"mouseenter\", [\"custom-points-layer\", \"confirmed-points-layer\"], (e) => {\r\n if (!map) return;\r\n if (e.features.length) {\r\n map.getCanvas().style.cursor = \"pointer\";\r\n }\r\n });\r\n\r\n // Reset cursor to default when user is no longer hovering over a clickable feature\r\n map.on(\"mouseleave\", [\"custom-points-layer\", \"confirmed-points-layer\"], () => {\r\n if (!map) return;\r\n map.getCanvas().style.cursor = \"\";\r\n //popUpRef.current.remove();\r\n });\r\n\r\n //map.on(\"mouseenter\", currentMarkerRef.current.id, () => {\r\n // map.getCanvas().style.cursor = \"pointer\";\r\n //});\r\n\r\n //map.on(\"mouseleave\", currentMarkerRef.current.id, () => {\r\n // map.getCanvas().style.cursor = \"default\";\r\n //});\r\n\r\n //map.on('sourcedata', (e) => {\r\n // //if (e.sourceId === \"confirmed-points-data\" && e.isSourceLoaded) {\r\n // if (e.sourceId === \"confirmed-points-data\") {\r\n // const joinedPoints = map.querySourceFeatures(\"confirmed-points-data\");\r\n // console.log(\"Count: \" + joinedPoints.length);\r\n // joinedPoints.map((item, i) => { console.log(\"Props: \" + item.properties['name']); });\r\n // setMapSource(joinedPoints);\r\n\r\n // //const renderedResults = this.props.mapSource.map((item, i) => (
    {item.properties['name']}
    \r\n // // /**/\r\n // //));\r\n \r\n // //const mapResult = new ResultCtrl({ map: map, geo: geo, mapSource: mapSource, selectMarker: selectMarker, srcMarker: srcMarker, getListData: getListData, handleRadar: handleRadar, spinner: spinnerRef, directionModeRef: directionModeRef, marker: currentMarkerRef, geoLocate: geoLocateRef, handleZoom: handleZoom, handleDirection: handleDirection, handleToggler: handleToggler, useGAEventTracker: useGAEventTracker });\r\n // //setMapResult(mapResult);\r\n // //try {\r\n // // map.removeControl(mapResult);\r\n // //}\r\n // //catch { }\r\n // //map.addControl(mapResult, \"top-left\");\r\n // }\r\n //});\r\n\r\n //map.on('click', function (e) { \r\n // // handle Toggler\r\n // if (isExpanded) {\r\n // setIsExpanded(false);\r\n // localStorage.setItem('is-sidebar-collapsed', true);\r\n // }\r\n //});\r\n\r\n // setup popup display on the marker\r\n map.on(\"click\", [\"custom-points-layer\", \"confirmed-points-layer\"], function (e) {\r\n if (!map) return;\r\n \r\n // var features = map.queryRenderedFeatures(e.point, {\r\n // layers: [\"trucks\", \"trucks-highlight\"],\r\n // radius: 10,\r\n // includeGeometry: true,\r\n // });\r\n // if (!features.length) return;\r\n // var feature = features[0];\r\n // new mapboxgl.Popup()\r\n // .setLngLat(feature.geometry.coordinates)\r\n // .setHTML(formatHTMLforMarker(feature.properties))\r\n // .addTo(map);\r\n\r\n //console.log(\"App Message: Selected Object\");\r\n if (e.features.length) {\r\n const feature = e.features[0]; \r\n // create popup node\r\n const popupNode = document.createElement('div');\r\n //popupNode.style.cssText = 'width:200px; height:200px; margin: 10px 0px 0px 0px;border-radius:10px; border:1px solid #2296F4; box-shadow: 0px 0px 5px 4px rgba(67,60,67,.16), z-index:3000';\r\n popupNode.style.zIndex = 2005;\r\n ReactDOM.render(, popupNode);\r\n // set popup on map\r\n popUpRef.current\r\n .setLngLat(feature.geometry.coordinates)\r\n .setDOMContent(popupNode)\r\n .addTo(map);\r\n //popUpRef.addClassName('classPopup');\r\n }\r\n });\r\n\r\n //spinner.remove();\r\n };\r\n\r\n if (!map) {\r\n initializeMap({ setMap, mapContainer }); \r\n }\r\n }, [map]);\r\n\r\n //const setListData = (data) => {\r\n // setMapData(data);\r\n // console.log(\"setMapData: \" + data);\r\n //}\r\n\r\n //const getListData = () => {\r\n // console.log(\"MapData: \" + this.props.map.getSource(\"confirmed-points-data\")._option.data.features);\r\n // return this.props.map.getSource(\"confirmed-points-data\")._option.data.features;\r\n //}\r\n\r\n const handleToggler = () => {\r\n if (isExpanded) {\r\n setIsExpanded(false);\r\n localStorage.setItem('is-sidebar-collapsed', true); \r\n return;\r\n }\r\n setIsExpanded(true); \r\n localStorage.removeItem('is-sidebar-collapsed');\r\n }\r\n\r\n const handleZoom = (size) => {\r\n //map.setZoom(13.4);\r\n map.flyTo(map.getCenter(), 15.4);\r\n console.log(\"Handle Current zoom: \" + size);\r\n }\r\n\r\n //const handleDirection = (isStart = true, lng = 0, lat = 0) => { \r\n // if (lng === 0 || lat === 0) {\r\n // currentMarkerRef.current.remove(); \r\n // destMarker.current.remove(); \r\n // return;\r\n // }\r\n\r\n // if (!isStart) {\r\n // currentMarkerRef.current.remove();\r\n // // Remove previous markers \r\n // //mapMarkers.forEach((marker) => marker.remove());\r\n // //mapMarkers = [];\r\n // destMarker.current.remove();\r\n // destMarker.current.setLngLat([lng, lat]).addTo(map);\r\n // }\r\n // else {\r\n // //geoLocateRef.current.trigger();\r\n // currentMarkerRef.current.remove();\r\n // currentMarkerRef.current.setLngLat([lng, lat]).addTo(map);\r\n // destMarker.current.remove(); \r\n // }\r\n //}\r\n\r\n const handleRadar = (map, size) => {\r\n map.setZoom(size);\r\n map.flyTo(map.getCenter(), size);\r\n console.log(\"Handle Current zoom: \" + size);\r\n }\r\n\r\n return ( \r\n
    \r\n
    \r\n \r\n \"iFlower\"\r\n \r\n \r\n {/**/}\r\n {/* */}\r\n {/*
    */}\r\n {/* */}\r\n \r\n {/*
    */}\r\n
    \r\n \r\n
    \r\n
    \r\n {/*Longitude: {lng} | Latitude: {lat} | Zoom: {zoom}*/}\r\n
    \r\n Phát triển bởi © iFlower.vn\r\n \r\n \"iFlower\"\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\n\r\n","import React, { useEffect, Component } from 'react';\r\n//import ReactDOM from 'react-dom';\r\nimport { Route } from \"react-router\";\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\n//import { BrowserRouter as Router, Route, Routes } from \"react-router-dom\";\r\nimport ReactGA from 'react-ga';\r\n\r\n//import { Home } from './components/pages/Home';\r\n//import { Layout } from './components/pages/Layout';\r\n//import { FetchData } from './components/pages/FetchData';\r\n//import { Counter } from './components/pages/Counter';\r\nimport Map from './components/Map';\r\n//import logo from \"./img/six-logo-orange.png\";\r\n//import six_logo_orange from \"./img/six-logo-orange.png\";\r\n//import iflower_logo_blue from \"./img/iflower-logo-blue.png\";\r\n//import './custom.css'\r\n\r\nReactGA.initialize(process.env.REACT_APP_GA_TRACKING_ID);\r\n\r\n//export default class App extends Component {\r\n// static displayName = App.name; \r\n\r\n// render() {\r\n// return (\r\n// //\r\n// // \r\n// // \r\n// // \r\n// // \r\n// // \r\n// //\r\n\r\n//
    \r\n//
    \r\n// \r\n// \"six\r\n// \r\n// \r\n//
    \r\n// {/**/} \r\n\r\n// \r\n// {/**/}\r\n// {/**/}\r\n// {/**/}\r\n//
    \r\n//
    \r\n//
    \r\n \r\n// {/*
    Empowered by SIX
    */}\r\n//
    \r\n// );\r\n// }\r\n//}\r\n\r\n//const Home = () => (\r\n//
    \r\n//

    Home

    \r\n//
    \r\n//);\r\n\r\n//const ContactUs = () => (\r\n// \r\n//

    Contact

    \r\n// \r\n//
    \r\n//);\r\n\r\n//const AboutUs = () => (\r\n//
    \r\n//

    About

    \r\n//
    \r\n//);\r\n\r\n//const FakeText = () => (\r\n//

    \r\n// Welcome Contact Us\r\n//

    \r\n//);\r\n\r\nconst App = () => {\r\n useEffect(() => {\r\n ReactGA.pageview(window.location.pathname + window.location.search);\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n {/*} />*/}\r\n {/*} />*/}\r\n {/*} />*/}\r\n \r\n \r\n {/**/}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"mapbox-gl/dist/mapbox-gl.css\";\r\nimport \"./custom.css\";\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n"],"sourceRoot":""}