{"version":3,"file":"js/application-b2c39a68999515a41b73.js","mappings":"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","sources":["webpack://app/./app/javascript/components/ sync ^\\.\\/.*$","webpack://app/./app/javascript/application.js","webpack://app/./app/javascript/components/App.tsx","webpack://app/./app/javascript/components/LocationMap.tsx","webpack://app/./app/javascript/components/LocationsViewer.tsx","webpack://app/./app/javascript/types/Location.ts"],"sourcesContent":["var map = {\n\t\"./App\": 5134,\n\t\"./App.tsx\": 5134,\n\t\"./Country\": 121,\n\t\"./LocationMap\": 9986,\n\t\"./LocationMap.tsx\": 9986,\n\t\"./LocationsViewer\": 6133,\n\t\"./LocationsViewer.tsx\": 6133\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6900;","import * as Sentry from '@sentry/react';\n\nconst SENTRY_DSN =\n 'https://4d11b54b44694a979c5b97ca31e4d726@o4504424965668864.ingest.sentry.io/4504424966848512';\n\nif (window.RAILS_ENV === 'production') {\n Sentry.init({\n dsn: SENTRY_DSN,\n integrations: [Sentry.browserTracingIntegration()],\n release: window.COMMIT_SHA,\n\n // Set tracesSampleRate to 1.0 to capture 100%\n // of transactions for performance monitoring.\n // We recommend adjusting this value in production\n tracesSampleRate: 0.2,\n });\n}\n\nconst componentRequireContext = require.context('components', true);\nconst ReactRailsUJS = require('react_ujs');\nReactRailsUJS.useContext(componentRequireContext);\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport * as PropTypes from 'prop-types';\nimport { BrowserRouter } from 'react-router-dom';\nimport 'whatwg-fetch';\n\nimport { Location } from '../types/Location';\nimport LocationsViewer from './LocationsViewer';\n\nconst getLocationsApiUrl = (\n cityId: string | undefined,\n countryCode: string | undefined,\n): string => {\n if (cityId && countryCode) {\n return `/api/locations?city_id=${cityId}&country_code=${countryCode}`;\n } else if (countryCode) {\n return `/api/locations?country_code=${countryCode}`;\n } else {\n return '/api/locations';\n }\n};\n\nconst App: React.FC = (props: {\n cityId: string | undefined;\n defaultLatitude: number;\n defaultLongitude: number;\n defaultZoom: number;\n countryCode: string | undefined;\n showMichelinGuideFilter: boolean;\n triggerException: boolean;\n}) => {\n const {\n cityId,\n defaultLatitude,\n defaultLongitude,\n defaultZoom,\n countryCode,\n showMichelinGuideFilter,\n triggerException,\n } = props;\n const [errorMessage, setErrorMessage] = useState(undefined);\n const [locations, setLocations] = useState([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (triggerException) {\n throw new Error('Exception triggered');\n }\n }, []);\n\n useEffect(() => {\n async function fetchData() {\n setIsLoading(true);\n\n const url = getLocationsApiUrl(cityId, countryCode);\n\n const response = await fetch(url, {\n headers: {\n accept: 'application/json; charset=utf-8',\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n setLocations(data.locations as Location[]);\n setIsLoading(false);\n } else {\n setErrorMessage('Error fetching locations');\n setIsLoading(false);\n }\n }\n\n fetchData();\n }, [cityId, countryCode]);\n\n return (\n \n
\n {isLoading && Loading...}\n {errorMessage && ⚠️ {errorMessage}}\n {!isLoading && (\n \n )}\n
\n
\n );\n};\n\nApp.propTypes = {\n cityId: PropTypes.string,\n defaultLatitude: PropTypes.number.isRequired,\n defaultLongitude: PropTypes.number.isRequired,\n defaultZoom: PropTypes.number.isRequired,\n countryCode: PropTypes.string,\n showMichelinGuideFilter: PropTypes.bool.isRequired,\n};\n\nexport default App;\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport * as PropTypes from 'prop-types';\nimport { Map } from 'leaflet';\nimport { Location, MappableLocation, MappableLocationShape } from '../types/Location';\nimport { MapContainer, TileLayer, Marker, Tooltip } from 'react-leaflet';\n\nconst LocationMap = (props: {\n defaultLatitude: number;\n defaultLongitude: number;\n defaultZoom: number;\n locations: MappableLocation[];\n onSelectLocation: (MappableLocationShape) => void;\n selectedLocation: Location;\n}) => {\n const {\n defaultLatitude,\n defaultLongitude,\n defaultZoom,\n locations,\n onSelectLocation,\n selectedLocation,\n } = props;\n\n const [map, setMap] = useState();\n\n useEffect(() => {\n if (\n selectedLocation &&\n map &&\n selectedLocation.latitude &&\n selectedLocation.longitude\n ) {\n map.setView([selectedLocation.latitude, selectedLocation.longitude], 13);\n }\n }, [selectedLocation, map]);\n\n return (\n
\n \n \n {locations.map((location) => (\n {\n if (map) map.setView([location.latitude, location.longitude], 13);\n onSelectLocation(location);\n },\n }}\n position={[location.latitude, location.longitude]}\n key={location.id}\n opacity={location.deleted_at ? 0.3 : 1}\n >\n {location.name}\n \n ))}\n \n
\n );\n};\n\nLocationMap.propTypes = {\n defaultLatitude: PropTypes.number.isRequired,\n defaultLongitude: PropTypes.number.isRequired,\n defaultZoom: PropTypes.number.isRequired,\n locations: PropTypes.arrayOf(MappableLocationShape).isRequired,\n onSelectLocation: PropTypes.func.isRequired,\n};\n\nexport default LocationMap;\n","import * as React from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport * as PropTypes from 'prop-types';\nimport { Location, LocationDeletedBy, LocationShape } from '../types/Location';\nimport { useSearchParams } from 'react-router-dom';\nimport sortBy from 'lodash/sortBy';\nimport groupBy from 'lodash/groupBy';\nimport * as timeago from 'timeago.js';\n\nimport LocationMap from './LocationMap';\n\ninterface FilterOption {\n value: string;\n label: string;\n count: number | undefined;\n}\n\nconst filterByCityId = (locations: Location[], cityId: string): Location[] => {\n if (cityId != '') {\n return locations.filter((location: Location) => location.city_id === cityId);\n } else {\n return locations;\n }\n};\n\nconst filterByCuisineId = (locations: Location[], cuisineId: string): Location[] => {\n if (cuisineId !== '') {\n return locations.filter((location: Location) => location.cuisine_id === cuisineId);\n } else {\n return locations;\n }\n};\n\nconst filterByMichelinGuideRating = (\n locations: Location[],\n michelinGuideRating: string,\n): Location[] => {\n if (michelinGuideRating !== '') {\n return locations.filter(\n (location: Location) => location.michelin_guide_2022_rating === michelinGuideRating,\n );\n } else {\n return locations;\n }\n};\n\nconst getCityOptions = (locations: Location[]): FilterOption[] => {\n const locationsByCityId = groupBy(locations, (location) => location.city_id);\n\n return sortBy(\n Object.entries(locationsByCityId).map(([cityId, locations]) => ({\n value: cityId,\n label: locations[0].city_name,\n count: (locations as Location[]).length,\n })),\n ({ label }) => label,\n );\n};\n\nconst getCuisineOptions = (locations: Location[]): FilterOption[] => {\n const locationsByCuisineId = groupBy(locations, (location) => location.cuisine_id);\n\n return sortBy(\n Object.entries(locationsByCuisineId).map(([cityId, locations]) => ({\n value: cityId,\n label: locations[0].cuisine_name,\n count: (locations as Location[]).length,\n })),\n ({ label }) => label,\n );\n};\n\nconst MICHELIN_GUIDE_RATINGS = {\n none: 'No MICHELIN Guide rating',\n bib_gourmand: 'MICHELIN Bib Gourmand',\n green_star: 'MICHELIN Green Star',\n one_star: 'One MICHELIN Star',\n two_star: 'Two MICHELIN Stars',\n three_star: 'Three MICHELIN Stars',\n};\n\nconst getMichelinGuideRatingOptions = (locations: Location[]): FilterOption[] => {\n const locationsByMichelinGuideRating = groupBy(\n locations,\n (location) => location.michelin_guide_2022_rating,\n );\n\n return sortBy(\n Object.entries(locationsByMichelinGuideRating).map(\n ([michelinGuideRating, locations]) => ({\n value: michelinGuideRating,\n label: MICHELIN_GUIDE_RATINGS[michelinGuideRating] || 'Unknown',\n count: (locations as Location[]).length,\n }),\n ),\n ({ value }) => Object.keys(MICHELIN_GUIDE_RATINGS).indexOf(value),\n );\n};\n\nconst LocationsViewer = (props: {\n defaultLatitude: number;\n defaultLongitude: number;\n defaultZoom: number;\n locations: Location[];\n showCityFilter: boolean;\n showMichelinGuideFilter: boolean;\n}) => {\n const {\n defaultLatitude,\n defaultLongitude,\n defaultZoom,\n locations,\n showCityFilter,\n showMichelinGuideFilter,\n } = props;\n\n const [searchParams, setSearchParams] = useSearchParams();\n\n const cityId = searchParams.get('city_id') || '';\n const cuisineId = searchParams.get('cuisine_id') || '';\n const michelinGuideRating = searchParams.get('michelin_guide_rating') || '';\n const selectedLocationId = searchParams.get('selected_location') || '';\n\n const [filteredLocations, setFilteredLocations] = useState(locations);\n const [activeFilteredLocationsCount, setActiveFilteredLocationsCount] =\n useState(0);\n const [selectedLocation, setSelectedLocation] = useState(null);\n\n const cities = useMemo(() => getCityOptions(locations), [locations]);\n\n useEffect(() => {\n const filteredList = filterByMichelinGuideRating(\n filterByCuisineId(filterByCityId(locations, cityId), cuisineId),\n michelinGuideRating,\n );\n\n setFilteredLocations(filteredList);\n\n setActiveFilteredLocationsCount(\n filteredList.filter((location) => location.deleted_at === null).length,\n );\n }, [cityId, cuisineId, michelinGuideRating]);\n\n useEffect(() => {\n if (selectedLocationId !== '') {\n const location = locations.find((location) => location.id === selectedLocationId);\n setSelectedLocation(location);\n }\n }, [selectedLocationId]);\n\n const cuisines = useMemo(() => getCuisineOptions(locations), [locations]);\n const michelinGuideRatings = useMemo(\n () => getMichelinGuideRatingOptions(locations),\n [locations],\n );\n\n const listContainer = useRef(null);\n\n return (\n <>\n
\n {showCityFilter && (\n
\n \n setSearchParams((params) => {\n params.set('city_id', event.target.value);\n return params;\n })\n }\n >\n \n {cities.map((city) => (\n \n ))}\n \n
\n )}\n\n
\n \n setSearchParams((params) => {\n params.set('cuisine_id', event.target.value);\n return params;\n })\n }\n >\n \n {cuisines.map((cuisine) => (\n \n ))}\n \n
\n\n
\n {showMichelinGuideFilter && (\n \n setSearchParams((params) => {\n console.log(event.target.value);\n if (event.target.value === 'null') {\n params.delete('michelin_guide_rating');\n } else {\n params.set('michelin_guide_rating', event.target.value);\n }\n return params;\n })\n }\n >\n \n {michelinGuideRatings.map((michelinGuideRating) => (\n \n ))}\n \n )}\n
\n\n {/* */}\n
\n location.latitude && location.longitude,\n )}\n onSelectLocation={(location) => {\n setSearchParams((params) => {\n params.set('selected_location', location.id);\n return params;\n });\n\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }}\n selectedLocation={selectedLocation}\n />\n
\n \n {activeFilteredLocationsCount} active locations\n
\n\n {selectedLocation && (\n
\n

\n {selectedLocation.deleted_at && {selectedLocation.name}}\n {!selectedLocation.deleted_at && <>{selectedLocation.name}}\n

\n

\n 📪 {selectedLocation.address_line_1}, {selectedLocation.postcode}\n {!selectedLocation.latitude && (\n \n (Not shown on map)\n \n )}\n

\n

🍴 {selectedLocation.cuisine_name}

\n {selectedLocation.michelin_guide_2022_rating && (\n

\n ⭐ {MICHELIN_GUIDE_RATINGS[selectedLocation.michelin_guide_2022_rating]}{' '}\n (MICHELIN Guide 2022)\n

\n )}\n {selectedLocation.website_url && (\n

\n 🌐{' '}\n \n {selectedLocation.website_url}\n \n

\n )}\n {!selectedLocation.included_in_initial_import && (\n \n Added {timeago.format(selectedLocation.created_at)}\n

\n )}\n {selectedLocation.deleted_at && (\n \n Removed{' '}\n {selectedLocation.deleted_by === LocationDeletedBy.AmericanExpress\n ? 'by American Express'\n : 'manually by Platinum Dining'}{' '}\n {timeago.format(selectedLocation.deleted_at)}\n

\n )}\n
\n )}\n\n {filteredLocations.map((location) => (\n {\n setSearchParams((params) => {\n params.set('selected_location', location.id);\n return params;\n });\n\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }}\n style={{\n opacity: location.deleted_at ? 0.4 : 1,\n }}\n >\n

\n {location.deleted_at && {location.name}}\n {!location.deleted_at && <>{location.name}}\n {location.is_new && New}\n

\n

\n {location.address_line_1}, {location.postcode}\n

\n {!location.latitude && (\n

\n (Not shown on map)\n

\n )}\n

{location.cuisine_name}

\n {!location.included_in_initial_import && !location.deleted_at && (\n \n Added {timeago.format(location.created_at)}\n

\n )}\n {location.michelin_guide_2022_rating && (\n

\n ⭐ {MICHELIN_GUIDE_RATINGS[location.michelin_guide_2022_rating]} (MICHELIN\n Guide 2022)\n

\n )}\n {location.deleted_at && (\n

\n Removed{' '}\n {location.deleted_by === LocationDeletedBy.AmericanExpress\n ? 'by American Express'\n : 'manually by Platinum Dining'}{' '}\n {timeago.format(location.deleted_at)}\n

\n )}\n \n ))}\n \n \n );\n};\n\nLocationsViewer.propTypes = {\n defaultLatitude: PropTypes.number.isRequired,\n defaultLongitude: PropTypes.number.isRequired,\n defaultZoom: PropTypes.number.isRequired,\n locations: PropTypes.arrayOf(LocationShape).isRequired,\n showCityFilter: PropTypes.bool.isRequired,\n showMichelinGuideFilter: PropTypes.bool.isRequired,\n};\n\nexport default LocationsViewer;\n","import * as PropTypes from 'prop-types';\n\nexport const LocationShape = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n address_line_1: PropTypes.string.isRequired,\n postcode: PropTypes.string.isRequired,\n city_id: PropTypes.string.isRequired,\n city_name: PropTypes.string.isRequired,\n cuisine_id: PropTypes.string.isRequired,\n cuisine_name: PropTypes.string.isRequired,\n latitude: PropTypes.number,\n longitude: PropTypes.number,\n michelin_guide_2022_rating: PropTypes.string,\n website_url: PropTypes.string,\n is_new: PropTypes.bool.isRequired,\n created_at: PropTypes.string.isRequired,\n included_in_initial_import: PropTypes.bool.isRequired,\n deleted_at: PropTypes.string,\n});\n\nexport const MappableLocationShape = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n address_line_1: PropTypes.string.isRequired,\n postcode: PropTypes.string.isRequired,\n city_id: PropTypes.string.isRequired,\n city_name: PropTypes.string.isRequired,\n cuisine_id: PropTypes.string.isRequired,\n cuisine_name: PropTypes.string.isRequired,\n latitude: PropTypes.number.isRequired,\n longitude: PropTypes.number.isRequired,\n michelin_guide_2022_rating: PropTypes.string,\n website_url: PropTypes.string,\n is_new: PropTypes.bool.isRequired,\n created_at: PropTypes.string.isRequired,\n included_in_initial_import: PropTypes.bool.isRequired,\n deleted_at: PropTypes.string,\n});\n\nexport enum LocationDeletedBy {\n AmericanExpress = 'american_express',\n PlatinumDining = 'platinum_dining',\n}\n\nexport interface Location {\n id: string;\n name: string;\n address_line_1: string;\n postcode: string;\n city_id: string;\n city_name: string;\n cuisine_id: string;\n cuisine_name: string;\n latitude: number | null;\n longitude: number | null;\n michelin_guide_2022_rating: string | null;\n website_url: string | null;\n is_new: boolean;\n created_at: string;\n included_in_initial_import: boolean;\n deleted_at: string | null;\n deleted_by: LocationDeletedBy | null;\n}\n\nexport interface MappableLocation extends Location {\n latitude: number;\n longitude: number;\n}\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","window","RAILS_ENV","Sentry","dsn","integrations","release","COMMIT_SHA","tracesSampleRate","componentRequireContext","require","useContext","App","props","cityId","defaultLatitude","defaultLongitude","defaultZoom","countryCode","showMichelinGuideFilter","triggerException","errorMessage","setErrorMessage","useState","undefined","locations","setLocations","isLoading","setIsLoading","useEffect","async","url","getLocationsApiUrl","response","fetch","headers","accept","ok","data","json","fetchData","React","BrowserRouter","className","LocationsViewer","showCityFilter","propTypes","PropTypes","isRequired","LocationMap","onSelectLocation","selectedLocation","setMap","latitude","longitude","setView","MapContainer","center","zoom","ref","scrollWheelZoom","style","height","TileLayer","attribution","location","Marker","eventHandlers","click","position","key","opacity","deleted_at","Tooltip","name","MappableLocationShape","MICHELIN_GUIDE_RATINGS","none","bib_gourmand","green_star","one_star","two_star","three_star","searchParams","setSearchParams","useSearchParams","get","cuisineId","michelinGuideRating","selectedLocationId","filteredLocations","setFilteredLocations","activeFilteredLocationsCount","setActiveFilteredLocationsCount","setSelectedLocation","cities","useMemo","locationsByCityId","groupBy","city_id","sortBy","entries","value","label","city_name","count","length","getCityOptions","filteredList","filterByMichelinGuideRating","filter","michelin_guide_2022_rating","filterByCuisineId","cuisine_id","filterByCityId","find","cuisines","locationsByCuisineId","cuisine_name","getCuisineOptions","michelinGuideRatings","locationsByMichelinGuideRating","indexOf","getMichelinGuideRatingOptions","listContainer","useRef","onChange","event","params","set","target","city","cuisine","console","log","delete","scrollTo","top","behavior","textTransform","fontWeight","paddingBottom","address_line_1","postcode","fontSize","marginTop","marginLeft","website_url","href","rel","included_in_initial_import","title","created_at","split","timeago","deleted_by","LocationDeletedBy","AmericanExpress","onClick","is_new","LocationShape"],"sourceRoot":""}