{"version":3,"sources":["webpack:///./Scripts/Components/GoogleReview.js","webpack:///./Scripts/Hooks/useGeolocationPosition.js","webpack:///./Scripts/Hooks/useGoogleMaps.js","webpack:///./Scripts/Hooks/useNavigatorPermissionsQuery.js","webpack:///./Scripts/Hooks/useRefreshGeolocationPositionIfPermissionGranted.js","webpack:///./Scripts/Hooks/useSortedStations.js","webpack:///./Scripts/Services/GoogleMaps.js"],"names":["props","useState","reviews","setReviews","open","setOpen","ref","useRef","reviewRef","maps","useGoogleMaps","useEffect","current","location","LatLng","lat","long","service","places","PlacesService","Map","nearbySearch","keyword","radius","result","status","PlacesServiceStatus","OK","length","placeId","place_id","getDetails","fields","rating","reviewTotal","user_ratings_total","handleClickOutside","e","contains","target","document","addEventListener","removeEventListener","getStar","className","getRating","style","display","onClick","translate","map","item","index","key","author_name","relative_time_description","text","useGeolocationPosition","geolocationPosition","setGeolocationPosition","refreshGeolocationPosition","navigator","geolocation","getCurrentPosition","api","setApi","useNavigatorPermissionsQuery","query","setStatus","refreshStatus","permissions","then","useRefreshGeolocationPositionIfPermissionGranted","geolocationPermission","state","useSortedStations","stations","googleMaps","filter","station","onlyVisibleInTireHotel","sortedStations","setSortedStations","p0","coords","latitude","longitude","newSortedStations","sort","a","b","geometry","spherical","computeDistanceBetween","coordinatesLat","coordinatesLong","instance","promise","Promise","resolve","script","createElement","src","async","defer","onload","google","head","appendChild"],"mappings":"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","file":"364.b21a73bdad66e20e8a9b.js","sourcesContent":["import React, { useEffect, useState, useRef } from 'react'\r\nimport { useGoogleMaps } from '../Hooks'\r\nimport { translate } from '../Services/translation'\r\n\r\nconst GoogleReview = (props) => {\r\n // STATE\r\n const [reviews, setReviews] = useState(null)\r\n const [open, setOpen] = useState(false)\r\n\r\n // REFS\r\n const ref = useRef()\r\n const reviewRef = useRef()\r\n\r\n // HOOKS\r\n const maps = useGoogleMaps()\r\n\r\n useEffect(() => {\r\n if (maps && ref.current && !reviews) {\r\n const location = new maps.LatLng(props.lat, props.long)\r\n\r\n const service = new maps.places.PlacesService(\r\n new maps.Map(ref.current)\r\n )\r\n service.nearbySearch(\r\n {\r\n location,\r\n keyword: 'Däckskiftarna',\r\n radius: 1400,\r\n },\r\n (result, status) => {\r\n if (\r\n status == maps.places.PlacesServiceStatus.OK &&\r\n result?.length > 0\r\n ) {\r\n const placeId = result[0].place_id\r\n\r\n service.getDetails(\r\n {\r\n placeId,\r\n fields: [\r\n 'rating',\r\n 'reviews',\r\n 'user_ratings_total',\r\n ],\r\n },\r\n (result, status) => {\r\n if (\r\n status == maps.places.PlacesServiceStatus.OK\r\n ) {\r\n setReviews({\r\n rating: result.rating,\r\n reviews: result.reviews,\r\n reviewTotal: result.user_ratings_total,\r\n })\r\n }\r\n }\r\n )\r\n }\r\n }\r\n )\r\n }\r\n }, [maps, ref, reviews, setReviews])\r\n\r\n // Event listener for closing review modal when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (e) => {\r\n if (\r\n open &&\r\n reviewRef.current &&\r\n !reviewRef.current.contains(e.target)\r\n ) {\r\n setOpen(false)\r\n }\r\n }\r\n\r\n document.addEventListener('click', handleClickOutside)\r\n\r\n return () => {\r\n document.removeEventListener('click', handleClickOutside)\r\n }\r\n }, [open, reviewRef])\r\n\r\n // Reusable elements\r\n const getStar = (rating) => {\r\n if (rating >= 0.29 && rating <= 0.71) {\r\n return \r\n } else if (rating > 0.71) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n const getRating = (rating) => {\r\n return (\r\n \r\n {getStar(rating)}\r\n {getStar(rating - 1)}\r\n {getStar(rating - 2)}\r\n {getStar(rating - 3)}\r\n {getStar(rating - 4)}\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n {reviews && (\r\n
\r\n setOpen(true)}\r\n className=\"review__container--button\"\r\n >\r\n \r\n {reviews.rating}\r\n \r\n {getRating(reviews.rating)}\r\n {reviews?.reviewTotal && (\r\n {`${\r\n reviews.reviewTotal\r\n } ${\r\n reviews.reviewTotal > 1\r\n ? translate('stationpage.reviews')\r\n : translate('stationpage.review')\r\n }`}\r\n )}\r\n \r\n {reviews.reviews?.length > 0 && open && (\r\n
\r\n \r\n
\r\n

{translate('stationpage.reviews')}

\r\n \r\n
\r\n {reviews.reviews.map((item, index) => (\r\n
\r\n
\r\n
{item.author_name}
\r\n \r\n {` ${item.relative_time_description}`}\r\n \r\n
\r\n {getRating(item.rating)}\r\n

{item.text}

\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 GoogleReview\r\n","import { useState } from 'react'\r\n\r\nexport default function useGeolocationPosition() {\r\n const [geolocationPosition, setGeolocationPosition] = useState(null)\r\n function refreshGeolocationPosition() {\r\n navigator?.geolocation?.getCurrentPosition?.(setGeolocationPosition)\r\n }\r\n return { geolocationPosition, refreshGeolocationPosition }\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport { maps } from '../Services/GoogleMaps'\r\n\r\nexport default function useGoogleMaps() {\r\n const [api, setApi] = useState(maps.instance)\r\n useEffect(() => {\r\n if (!api) {\r\n maps.promise.then(setApi)\r\n }\r\n }, [api])\r\n return api\r\n}\r\n","import { useState } from 'react'\r\n\r\nexport default function useNavigatorPermissionsQuery(query) {\r\n const [status, setStatus] = useState(null)\r\n function refreshStatus() {\r\n navigator?.permissions?.query(query)?.then(setStatus)\r\n }\r\n return { status, refreshStatus }\r\n}\r\n","import { useEffect } from 'react'\r\n\r\nexport default function useRefreshGeolocationPositionIfPermissionGranted({\r\n geolocationPermission,\r\n geolocationPosition,\r\n refreshGeolocationPosition,\r\n}) {\r\n useEffect(() => {\r\n // init permission status\r\n if (!geolocationPermission.status) {\r\n geolocationPermission.refreshStatus()\r\n return\r\n }\r\n\r\n // eagerly init position if permission already granted\r\n if (\r\n !geolocationPosition &&\r\n geolocationPermission.status?.state === 'granted'\r\n ) {\r\n refreshGeolocationPosition()\r\n }\r\n }, [geolocationPosition, geolocationPermission.status])\r\n}\r\n","import { useState, useEffect } from 'react'\r\n\r\n/**\r\n * NOTE: if stations === sortedStations, no sort has yet occurred\r\n */\r\nexport default function useSortedStations({\r\n geolocationPosition,\r\n stations,\r\n googleMaps,\r\n}) {\r\n const [sortedStations, setSortedStations] = useState(stations.filter((station) => !station.onlyVisibleInTireHotel))\r\n\r\n useEffect(() => {\r\n if (!geolocationPosition || stations.length === 0 || !googleMaps) {\r\n return\r\n }\r\n const p0 = new googleMaps.LatLng(\r\n geolocationPosition.coords.latitude,\r\n geolocationPosition.coords.longitude\r\n )\r\n const newSortedStations = [...stations].sort(\r\n (a, b) => \r\n googleMaps.geometry.spherical.computeDistanceBetween(\r\n new googleMaps.LatLng(a.coordinatesLat, a.coordinatesLong),\r\n p0\r\n ) -\r\n googleMaps.geometry.spherical.computeDistanceBetween(\r\n new googleMaps.LatLng(b.coordinatesLat, b.coordinatesLong),\r\n p0\r\n )\r\n )\r\n setSortedStations(newSortedStations)\r\n }, [geolocationPosition, stations, googleMaps])\r\n\r\n return sortedStations\r\n}\r\n","export const maps = {\r\n instance: null,\r\n promise: new Promise((resolve) => {\r\n const script = document.createElement('script')\r\n script.src =\r\n 'https://maps.googleapis.com/maps/api/js?key=AIzaSyBCq5hqIV9Yk1dZ7IsJeEueAxk2Fu4xqNA&libraries=geometry,places&callback=Function.prototype'\r\n script.async = true\r\n script.defer = true\r\n script.onload = function () {\r\n maps.instance = google.maps\r\n resolve(maps.instance)\r\n }\r\n document.head.appendChild(script)\r\n }),\r\n}\r\n"],"sourceRoot":""}