@digitransit-component/digitransit-component-autosuggest 4.4.0 → 4.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.development.js +2 -2
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +4 -4
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../../digitransit-search-util/packages/digitransit-search-util-tru-eq/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-is-duplicate/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-helpers/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-filter-matching-to-input/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-serialize/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-json/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-geocoding-results/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../src/helpers/translations.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/MobileSearch.js","../../../../node_modules/@hsl-fi/hooks/lib/index.js","../src/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-label/index.js","../src/helpers/withScrollLock.js"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","/**\n * accept equality of non nullish values\n *\n * @name truEq\n * @param {Boolean|Number|BigInt|String|Symbol|Object} val1 First value to be compared\n * @param {Boolean|Number|BigInt|String|Symbol|Object} param2 Second value to be compared\n * @returns {Boolean} true/false\n * @example\n * digitransit-util.truEq('2', '2');\n * //=true\n */\nexport default function truEq(val1, val2) {\n return val1 && val2 && val1 === val2;\n}\n","import truEq from '@digitransit-search-util/digitransit-search-util-tru-eq';\n/**\n * Checks that is items duplicate\n *\n * @name isDuplicate\n * @param {Object} item1 Object containing following attributes:\n * {\n * properties {\n * gtfsId: String\n * gid: String from geocoder\n * name: String\n * label: String\n * address: String\n * geometry {\n * coordinates [Number lat, Number lon]\n * }\n * }\n * }\n * @param {Object} item2 Object with same attributes as item1\n * @returns {Boolean} true/false\n * @example\n * digitransit-util.isDuplicate(param1, param2);\n * //=true\n */\n\nconst gtfsStopLayers = ['stop', 'station', 'favouriteStop', 'favouriteStation'];\nconst vehicleRentalLayers = ['favouriteVehicleRentalStation', 'bikestation'];\n\nfunction labelIdToGid(id) {\n if (!id) {\n return '';\n }\n const parts = id.split(':');\n if (parts.length === 0) {\n return '';\n }\n return `citybikes${parts[0]}:bikestation:${parts[1]}`;\n}\n\nexport default function isDuplicate(item1, item2) {\n const props1 = item1.properties;\n const props2 = item2.properties;\n\n if (item1.type === 'FutureRoute' && item2.type === 'FutureRoute') {\n const o1 = props1.origin;\n const d1 = props1.destination;\n const o2 = props2.origin;\n const d2 = props2.destination;\n\n const name1 = `${o1.name}//${o1.localadmin}//${d1.name}//${d1.localadmin}`;\n const name2 = `${o2.name}//${o2.localadmin}//${d2.name}//${d2.localadmin}`;\n\n return name1 === name2;\n }\n if (item1.type === 'FutureRoute' || item2.type === 'FutureRoute') {\n return false;\n }\n if (\n vehicleRentalLayers.includes(props1.layer) &&\n vehicleRentalLayers.includes(props2.layer)\n ) {\n const id1 = props1.gid || labelIdToGid(props1.labelId);\n const id2 = props2.gid || labelIdToGid(props2.labelId);\n return id1 === id2;\n }\n if (props1.gtfsId && props2.gtfsId) {\n return props1.gtfsId === props2.gtfsId;\n }\n if (\n gtfsStopLayers.includes(props1.layer) &&\n gtfsStopLayers.includes(props2.layer) &&\n props1.gid &&\n props2.gid\n ) {\n return props1.gid === props2.gid;\n }\n\n const p1 = item1 && item1.geometry ? item1.geometry.coordinates : undefined;\n const p2 = item2 && item2.geometry ? item2.geometry.coordinates : undefined;\n\n if (p1 && p2) {\n // both have geometry\n if (Math.abs(p1[0] - p2[0]) < 1e-6 && Math.abs(p1[1] - p2[1]) < 1e-6) {\n // location match is not enough. Require a common property\n if (\n truEq(props1.name, props2.name) ||\n truEq(props1.label, props2.label) ||\n truEq(props1.address, props2.address) ||\n truEq(props1.address, props2.label) ||\n truEq(props1.label, props2.address)\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","import isString from 'lodash/isString';\nimport orderBy from 'lodash/orderBy';\nimport uniqWith from 'lodash/uniqWith';\nimport isDuplicate from '@digitransit-search-util/digitransit-search-util-is-duplicate';\n\nconst normalize = str => {\n if (!isString(str)) {\n return '';\n }\n return str.toLowerCase();\n};\n\n/**\n * LayerType depicts the type of the point-of-interest.\n */\nconst LayerType = {\n Address: 'address',\n Back: 'back',\n CurrentPosition: 'currentPosition',\n FavouriteStop: 'favouriteStop',\n FavouriteStation: 'favouriteStation',\n FavouritePlace: 'favouritePlace',\n FavouriteRoute: 'favouriteRoute',\n FavouriteVehicleRentalStation: 'favouriteVehicleRentalStation',\n FutureRoute: 'futureRoute',\n Station: 'station',\n SelectFromMap: 'selectFromMap',\n SelectFromOwnLocations: 'ownLocations',\n Stop: 'stop',\n Street: 'street',\n Venue: 'venue',\n VehicleRentalStation: 'bikestation',\n CarPark: 'carpark',\n BikePark: 'bikepark',\n};\nexport const isStop = ({ layer, type }) =>\n layer === 'stop' ||\n layer === 'favouriteStop' ||\n type === 'stop' ||\n type === 'favouriteStop';\n\nconst DEFAULT_ROUTES_PREFIX = 'linjat';\nconst DEFAULT_STOPS_PREFIX = 'pysakit';\n\nexport const mapRoute = (item, pathOpts) => {\n if (item === null || item === undefined) {\n return null;\n }\n\n const opts = pathOpts || {};\n\n const routesPrefix = opts.routesPrefix || DEFAULT_ROUTES_PREFIX;\n const stopsPrefix = opts.stopsPrefix || DEFAULT_STOPS_PREFIX;\n\n const link = `/${routesPrefix}/${item.gtfsId}/${stopsPrefix}`;\n return {\n type: 'Route',\n properties: {\n ...item,\n layer: `route-${item.mode}`,\n link,\n },\n geometry: {\n coordinates: null,\n },\n };\n};\n\n/**\n * Tries to match the given search term agains the collection of properties\n * for a geocoding result. The best match will be returned (min: 0, max: 1.5).\n *\n * @param {string} normalizedTerm the normalized search term.\n * @param {*} resultProperties the geocoding result's property collection.\n */\nexport const match = (normalizedTerm, resultProperties) => {\n if (!isString(normalizedTerm) || normalizedTerm.length === 0) {\n return 0;\n }\n\n const matchProps = ['name', 'label', 'address', 'shortName'];\n return matchProps\n .map(name => resultProperties[name])\n .filter(value => isString(value) && value.length > 0)\n .map(value => {\n const normalizedValue = normalize(value);\n if (normalizedValue.indexOf(normalizedTerm) === 0) {\n // full match at start. Return max result when match is full, not only partial\n return 0.5 + normalizedTerm.length / normalizedValue.length;\n }\n // because of filtermatchingtoinput, we know that match occurred somewhere\n // don't run filtermatching again but estimate roughly:\n // the longer the matching string, the better confidence, max being 0.5\n return (0.5 * normalizedTerm.length) / (normalizedTerm.length + 1);\n })\n .reduce(\n (previous, current) => (current > previous ? current : previous),\n 0,\n );\n};\n\n/**\n * Ranks the result based on its layer property.\n *\n * @param {string} layer the layer property.\n * @param {string} source the source property.\n */\nexport const getLayerRank = (layer, source) => {\n switch (layer) {\n case LayerType.CurrentPosition:\n return 1;\n case LayerType.Back:\n return 0.9;\n case LayerType.SelectFromMap:\n return 0.8;\n case LayerType.SelectFromOwnLocations:\n return 0.79;\n case LayerType.FavouriteStation:\n case LayerType.FavouritePlace:\n case LayerType.FavouriteStop:\n case LayerType.FavouriteRoute:\n case LayerType.FavouriteVehicleRentalStation:\n return 0.45;\n case LayerType.FutureRoute:\n return 0.44;\n case LayerType.Station: {\n if (isString(source) && source.indexOf('gtfs') === 0) {\n return 0.43;\n }\n return 0.42;\n }\n case LayerType.CarPark:\n return 0.38;\n case LayerType.BikePark:\n return 0.38;\n case LayerType.VehicleRentalStation:\n return 0.38;\n case LayerType.Stop:\n return 0.36;\n default:\n // venue, address, street, route-xxx\n return 0.41;\n }\n};\n\n/**\n * Helper function to sort the results. Orders as follows:\n * - current position first for an empty search\n * - matching routes first\n * - otherwise by confidence, except that:\n * - boost well matching stations (especially from GTFS)\n * - rank stops lower as they tend to occupy most of the search results\n * - items with no confidence (old searches and favorites):\n * - rank favourites better than ordinary old searches\n * - rank full match better than partial match\n * - rank match at middle word lower than match at the beginning\n * - rank bike rental stations lower\n * @param {*[]} results The search results that were received\n * @param {String} term The search term that was used\n */\nexport const sortSearchResults = (lineRegexp, results, term = '') => {\n if (!Array.isArray(results)) {\n return results;\n }\n const isLineIdentifier = value =>\n isString(value) && lineRegexp && lineRegexp.test(value);\n\n const normalizedTerm = normalize(term);\n const isLineSearch = isLineIdentifier(normalizedTerm);\n\n const orderedResults = orderBy(\n results,\n [\n // rank matching routes best\n result =>\n isLineSearch &&\n isLineIdentifier(normalize(result.properties.shortName)) &&\n normalize(result.properties.shortName).indexOf(normalizedTerm) === 0\n ? 1\n : 0,\n\n result => {\n const { confidence, layer, source } = result.properties;\n if (normalizedTerm.length === 0) {\n // Doing search with empty string.\n // No confidence to match, so use ranked old searches and favourites\n return getLayerRank(layer, source);\n }\n\n // must handle a mixup of geocoder searches and items above\n // Normal confidence range from geocoder is about 0.3 .. 1\n if (!confidence) {\n // not from geocoder, estimate confidence ourselves\n return (\n getLayerRank(layer, source) +\n match(normalizedTerm, result.properties)\n );\n }\n // geocoded items with confidence, just adjust a little\n switch (layer) {\n case LayerType.Station: {\n const boost = source.indexOf('gtfs') === 0 ? 0.02 : 0.01;\n return confidence + boost;\n }\n case LayerType.Stop:\n return confidence - 0.05;\n case LayerType.CarPark:\n return confidence - 0.05;\n case LayerType.BikePark:\n return confidence - 0.05;\n case LayerType.VehicleRentalStation:\n return confidence - 0.04;\n default:\n return confidence;\n }\n },\n 'properties.shortName',\n ],\n ['desc', 'desc', 'asc'],\n );\n\n return uniqWith(orderedResults, isDuplicate);\n};\n\n/**\n * Parses stop's name without stop code from a stop name from geocoding results\n *\n * @param {string} label stop's name from geocoding results.\n * @param {string} stopCode stop code.\n */\nexport const getStopName = (name, stopCode) => {\n if (\n stopCode !== undefined &&\n stopCode !== null &&\n name.lastIndexOf(stopCode) !== -1\n ) {\n return name.substring(0, name.lastIndexOf(stopCode) - 1);\n }\n return name;\n};\n","import get from 'lodash/get';\n\n/**\n * Function that filters list matching to input.\n *\n * @name filterMatchingToInput\n * @param {Array} list List containin objects e.g( {\n * type: 'Feature'\n * properties: {\n * label: 'testaddress4',\n * layer: 'address',\n * name: 'testaddress4',\n * },\n * geometry: { coordinates: [lon, lat] },\n * },)\n * @param {String} Input Input given for filtering the list\n * @param {Array} fields List of fields that list is filtered by e.g ([properties.label, properties.name])\n * @returns {Array} Filtered Array.\n * @example\n * digitransit-util.filterMatchingToInput([{type: feature, properties { ... name: testaddress4 } ... }], 'testaddress4', 'properties.name');\n * //= List containing object with given name.\n */\nexport default function filterMatchingToInput(list, Input, fields) {\n if (typeof Input === 'string' && Input.length > 0) {\n const input = Input.toLowerCase().trim();\n const multiWord = input.includes(' ') || input.includes(',');\n return list.filter(item => {\n let parts = [];\n fields.forEach(pName => {\n let value = get(item, pName);\n\n if (\n !multiWord &&\n (pName === 'properties.label' || pName === 'address') &&\n value\n ) {\n // special case: drop last parts i.e. city and neighbourhood\n value = value.split(',');\n if (value.length > 2) {\n value.splice(value.length - 2, 2);\n } else if (value.length > 1) {\n value.splice(value.length - 1, 1);\n }\n value = value.join(',');\n }\n if (value) {\n if (multiWord) {\n parts = parts.concat(value.toLowerCase());\n } else {\n parts = parts.concat(\n value.toLowerCase().replace(/,/g, ' ').split(' '),\n );\n }\n }\n });\n for (let i = 0; i < parts.length; i++) {\n if (parts[i].indexOf(input) === 0) {\n // accept match only at word start\n return true;\n }\n }\n return false;\n });\n }\n\n return list;\n}\n","/**\n * Serializes objects\n *\n * @name serialize\n * @param {Object} obj Object to be serialized\n * @param {Any} prefix\n * @returns {String} Serialized object\n * @example\n * digitransit-search-util.serialize(param1, param2);\n * //=true\n */\nexport default function serialize(obj, prefix) {\n if (!obj) {\n return '';\n }\n return Object.keys(obj)\n .map(p => {\n const k = prefix || p;\n const v = obj[p];\n\n return typeof v === 'object'\n ? serialize(v, k)\n : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`;\n })\n .join('&');\n}\n","import serialize from '@digitransit-search-util/digitransit-search-util-serialize';\n/**\n * Return Promise for a url json get request\n *\n * @name getJson\n * @param {String} url\n * @param {Array} params\n * @returns {Object} response\n * @example\n * digitransit-search-util.getJson(param1, param2);\n * //=response\n */\nconst axios = require('axios').default;\n\nexport default function getJson(url, params) {\n return axios\n .get(\n encodeURI(url) +\n (params\n ? (url.search(/\\?/) === -1 ? '?' : '&') + serialize(params)\n : ''),\n {\n timeout: 10000,\n method: 'GET',\n\n headers: {\n Accept: 'application/json',\n },\n },\n )\n .then(res => {\n return res.data;\n });\n}\n","import getJson from '@digitransit-search-util/digitransit-search-util-get-json';\n\nconst DEFAULT_PELIAS_URL = 'https://api.digitransit.fi/geocoding/v1/search';\n/**\n * <DESCRIPTION>\n *\n * @name getGeocodingResults\n * @param {String} searchString\n * @param {String} searchParams (Optional) Parameters appended to url, basically box / polygon to restrict search area\n * @param {String} lang (Optional) search language\n * @param {Object} focusPoint (Optional) Own Position (PELIAS API)\n * @param {String} sources (Optional) search sources (e.g OSM, GTFS..)\n * @param {Object} minimalRegexp (Optional) Regexp for testing\n * @param {*} geocodingLayers (Optional) Array of strings that is used to determine which layers is searched, e.g. ['venue', 'address', 'stop']\n * @returns {String} Results in JSON form\n * @example\n * digitransit-search-util.getGeocodingResults(\"result\");\n * //= e.g. {text:\"result\"}\n */\nexport default function getGeocodingResults(\n searchString,\n searchParams,\n lang,\n focusPoint,\n sources,\n peliasUrl,\n minimalRegexp,\n geocodingLayers,\n) {\n const text = searchString ? searchString.trim() : null;\n if (\n text === undefined ||\n text === null ||\n text.length < 1 ||\n (minimalRegexp && !minimalRegexp.test(text))\n ) {\n return Promise.resolve([]);\n }\n const PELIAS_URL = peliasUrl || DEFAULT_PELIAS_URL;\n let opts = { text, ...searchParams, ...focusPoint, lang };\n if (sources) {\n opts = { ...opts, sources };\n }\n if (geocodingLayers) {\n const layers = geocodingLayers.toString();\n opts = { ...opts, layers };\n }\n return getJson(PELIAS_URL, opts).then(res => {\n return res.features;\n });\n}\n","import debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport take from 'lodash/take';\nimport {\n sortSearchResults,\n isStop,\n} from '@digitransit-search-util/digitransit-search-util-helpers';\nimport filterMatchingToInput from '@digitransit-search-util/digitransit-search-util-filter-matching-to-input';\nimport getGeocodingResults from '@digitransit-search-util/digitransit-search-util-get-geocoding-results';\nimport getJson from '@digitransit-search-util/digitransit-search-util-get-json';\n\nfunction getStopsFromGeocoding(stops, URL_PELIAS_PLACE) {\n if (!stops || stops.length < 1) {\n return Promise.resolve([]);\n }\n let gids = '';\n const stopsWithGids = stops.map(stop => {\n const type = stop.type === 'stop' ? 'stop' : 'station';\n let gid = `gtfs${stop.gtfsId.split(':')[0].toLowerCase()}:${type}:GTFS:${\n stop.gtfsId\n }`;\n if (stop.code) {\n gid += `#${stop.code}`;\n }\n gids += `${gid},`;\n return { ...stop, gid };\n });\n const stopStationMap = stopsWithGids.reduce(function redu(\n map,\n stopOrStation,\n ) {\n // eslint-disable-next-line no-param-reassign\n map[stopOrStation.gid] = stopOrStation;\n return map;\n }, {});\n return getJson(URL_PELIAS_PLACE, {\n ids: gids.slice(0, -1),\n // lang: context.getStore('PreferencesStore').getLanguage(), TODO enable this when OTP supports translations\n }).then(res => {\n return res.features.map(stop => {\n const favourite = {\n type: 'FavouriteStop',\n properties: {\n addendum: stop.properties.addendum,\n gid: stopStationMap[stop.properties.gid].gid,\n code: stopStationMap[stop.properties.gid].code,\n gtfsId: stopStationMap[stop.properties.gid].gtfsId,\n lastUpdated: stopStationMap[stop.properties.gid].lastUpdated,\n favouriteId: stopStationMap[stop.properties.gid].favouriteId,\n address: stop.properties.label,\n layer: isStop(stop.properties) ? 'favouriteStop' : 'favouriteStation',\n },\n geometry: stop.geometry,\n };\n return favourite;\n });\n });\n}\nfunction filterFavouriteLocations(favourites, input) {\n return Promise.resolve(\n filterMatchingToInput(favourites, input, ['address', 'name']).map(item => ({\n type: 'FavouritePlace',\n properties: {\n ...item,\n label: item.name,\n layer: 'favouritePlace',\n },\n geometry: { type: 'Point', coordinates: [item.lon, item.lat] },\n })),\n );\n}\nfunction selectPositionFomMap(input) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'SelectFromMap',\n address: 'SelectFromMap',\n lat: null,\n lon: null,\n properties: {\n labelId: 'select-from-map',\n layer: 'selectFromMap',\n address: 'SelectFromMap',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n }\n return Promise.resolve([]);\n}\n\nfunction getCurrentPositionIfEmpty(input, position) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'CurrentLocation',\n address: position.address,\n lat: position.lat,\n lon: position.lon,\n properties: {\n labelId: 'use-own-position',\n layer: 'currentPosition',\n address: position.address,\n lat: position.lat,\n lon: position.lon,\n },\n geometry: {\n type: 'Point',\n coordinates: [position.lon, position.lat],\n },\n },\n ]);\n }\n\n return Promise.resolve([]);\n}\n\nfunction selectFromOwnLocations(input) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'SelectFromOwnLocations',\n address: 'SelectFromOwnLocations',\n lat: null,\n lon: null,\n properties: {\n labelId: 'select-from-own-locations',\n layer: 'ownLocations',\n address: 'selectFromOwnLocations',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n }\n return Promise.resolve([]);\n}\n\nfunction getBackSuggestion() {\n return Promise.resolve([\n {\n type: 'back',\n address: 'back',\n lat: null,\n lon: null,\n properties: {\n labelId: 'back',\n layer: 'back',\n address: 'back',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n}\n\nfunction filterFavouriteStops(stopsAndStations, input, useStops, useStations) {\n return stopsAndStations.then(stopsStations => {\n const candidates = stopsStations.filter(s =>\n s.type === 'stop' ? useStops : useStations,\n );\n return filterMatchingToInput(candidates, input, [\n 'properties.name',\n 'properties.name',\n 'properties.address',\n ]);\n });\n}\n\nfunction filterOldSearches(oldSearches, input, dropLayers) {\n let matchingOldSearches = filterMatchingToInput(oldSearches, input, [\n 'properties.name',\n 'properties.label',\n 'properties.address',\n 'properties.shortName',\n 'properties.longName',\n ]);\n if (dropLayers) {\n // don't want these\n matchingOldSearches = matchingOldSearches.filter(\n item => !dropLayers.includes(item.properties.layer),\n );\n }\n return Promise.resolve(\n take(matchingOldSearches, 10).map(item => {\n const newItem = {\n ...item,\n type: 'OldSearch',\n timetableClicked: false, // reset latest selection action\n arrowClicked: false,\n };\n delete newItem.properties.confidence;\n return newItem;\n }),\n );\n}\n\nfunction hasFavourites(searchContext) {\n const favouriteLocations = searchContext.getFavouriteLocations(\n searchContext.context,\n );\n if (favouriteLocations?.length > 0) {\n return true;\n }\n\n const favouriteVehicleRentalStations =\n searchContext.getFavouriteVehicleRentalStations(searchContext.context);\n if (favouriteVehicleRentalStations?.length > 0) {\n return true;\n }\n const favouriteStops = searchContext.getFavouriteStops(searchContext.context);\n return favouriteStops?.length > 0;\n}\n\nconst routeLayers = [\n 'route-TRAM',\n 'route-BUS',\n 'route-RAIL',\n 'route-FERRY',\n 'route-SUBWAY',\n 'route-AIRPLANE',\n 'route-FUNICULAR',\n];\nconst locationLayers = ['venue', 'address', 'street'];\nconst parkingLayers = ['carpark', 'bikepark'];\nconst stopLayers = ['stop', 'station'];\n\n/**\n * Executes the search\n *\n */\nexport function getSearchResults(\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n { input },\n callback,\n pathOpts,\n refPoint,\n) {\n const {\n getPositions,\n getFavouriteLocations,\n getOldSearches,\n getFavouriteStops,\n parkingAreaSources,\n getLanguage,\n getStopAndStationsQuery,\n getFavouriteVehicleRentalStationsQuery,\n getFavouriteVehicleRentalStations,\n getFavouriteRoutesQuery,\n getFavouriteRoutes,\n getRoutesQuery,\n context,\n isPeliasLocationAware: locationAware,\n minimalRegexp,\n lineRegexp,\n URL_PELIAS,\n URL_PELIAS_PLACE,\n feedIDs,\n geocodingSearchParams,\n geocodingSources,\n getFutureRoutes,\n cityBikeNetworks,\n } = searchContext;\n // if no targets are provided, search them all.\n const allTargets = !targets || targets.length === 0;\n // if no sources are provided, use them all.\n const allSources = !sources || sources.length === 0;\n const position = getPositions(context);\n const searchComponents = [];\n const searches = { type: 'all', term: input, results: [] };\n const language = getLanguage(context);\n const focusPoint =\n locationAware && refPoint?.lat && refPoint?.lon\n ? {\n // Round coordinates to approx 1 km, in order to improve caching\n 'focus.point.lat': refPoint.lat.toFixed(3),\n 'focus.point.lon': refPoint.lon.toFixed(3),\n }\n : {};\n const mode = transportMode ? transportMode.split('-')[1] : undefined;\n if (\n targets.includes('CurrentPosition') &&\n position.status !== 'geolocation-not-supported'\n ) {\n searchComponents.push(getCurrentPositionIfEmpty(input, position));\n }\n if (allTargets || targets.includes('MapPosition')) {\n searchComponents.push(selectPositionFomMap(input));\n }\n if (targets.includes('FutureRoutes')) {\n const items = getFutureRoutes(context);\n searchComponents.push(take(items, 3));\n }\n if (\n targets.includes('SelectFromOwnLocations') &&\n hasFavourites(searchContext)\n ) {\n searchComponents.push(selectFromOwnLocations(input));\n }\n if (allTargets || targets.includes('Locations')) {\n // eslint-disable-next-line prefer-destructuring\n const searchParams = geocodingSearchParams;\n if (sources.includes('Favourite')) {\n const favouriteLocations = getFavouriteLocations(context);\n searchComponents.push(\n filterFavouriteLocations(favouriteLocations, input),\n );\n if (sources.includes('Back')) {\n searchComponents.push(getBackSuggestion());\n }\n }\n\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = ['venue', 'address', 'street'];\n if (targets.includes('Stations')) {\n geocodingLayers.push('station'); // search stations from OSM\n }\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n geocodingSources.join(','),\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ),\n );\n }\n if (allSources || sources.includes('History')) {\n const locationHistory = getOldSearches(context, 'endpoint');\n const dropLayers = ['bikestation'];\n dropLayers.push(...stopLayers);\n dropLayers.push(...routeLayers);\n dropLayers.push(...parkingLayers);\n searchComponents.push(\n filterOldSearches(locationHistory, input, dropLayers),\n );\n }\n }\n if (allTargets || targets.includes('ParkingAreas')) {\n if (allSources || sources.includes('Datasource')) {\n const searchParams = geocodingSearchParams;\n if (geocodingSize && geocodingSize !== 10) {\n searchParams.size = geocodingSize;\n }\n const geocodingLayers = ['carpark', 'bikepark'];\n const feedIds = parkingAreaSources ? parkingAreaSources.join(',') : null;\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n feedIds,\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const history = getOldSearches(context);\n const dropLayers = ['bikestation'];\n dropLayers.push(...stopLayers);\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n searchComponents.push(filterOldSearches(history, input, dropLayers));\n }\n }\n\n const useStops = targets.includes('Stops');\n const useStations = targets.includes('Stations');\n\n if (allTargets || useStops || useStations) {\n if (sources.includes('Favourite')) {\n const favouriteStops = getFavouriteStops(context);\n let stopsAndStations;\n if (favouriteStops.every(stop => stop.type === 'station')) {\n stopsAndStations = getStopsFromGeocoding(\n favouriteStops,\n URL_PELIAS_PLACE,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n });\n } else {\n stopsAndStations = getStopAndStationsQuery(favouriteStops)\n .then(favourites =>\n getStopsFromGeocoding(favourites, URL_PELIAS_PLACE),\n )\n .then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n });\n }\n searchComponents.push(\n filterFavouriteStops(stopsAndStations, input, useStops, useStations),\n );\n }\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = [];\n if (useStops) {\n geocodingLayers.push('stop');\n }\n if (useStations) {\n geocodingLayers.push('station');\n }\n const searchParams =\n geocodingSize && geocodingSize !== 10 ? { size: geocodingSize } : {};\n if (geocodingSearchParams && geocodingSearchParams['boundary.country']) {\n searchParams['boundary.country'] =\n geocodingSearchParams['boundary.country'];\n }\n // a little hack: when searching location data, automatically dedupe stops\n // this could be a new explicit prop\n if (allTargets || targets.includes('Locations')) {\n searchParams.dedupestops = 1;\n }\n const feeds = feedIDs.map(v => `gtfs${v}`).join(',');\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n feeds,\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const stopHistory = getOldSearches(context).filter(item => {\n if (item.properties.gid) {\n return item.properties.gid.includes('GTFS:');\n }\n return true;\n });\n const dropLayers = ['bikestation'];\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n if (!useStops) {\n dropLayers.push('stop');\n }\n if (!useStations) {\n dropLayers.push('station');\n }\n if (transportMode) {\n searchComponents.push(\n filterOldSearches(stopHistory, input, dropLayers).then(result =>\n filterResults ? filterResults(result, mode) : result,\n ),\n );\n } else {\n searchComponents.push(\n filterOldSearches(stopHistory, input, dropLayers),\n );\n }\n }\n }\n if (allTargets || targets.includes('Routes')) {\n if (sources.includes('Favourite')) {\n const favouriteRoutes = getFavouriteRoutes(context);\n searchComponents.push(\n getFavouriteRoutesQuery(favouriteRoutes, input, mode, pathOpts).then(\n result =>\n filterResults ? filterResults(result, mode, 'Routes') : result,\n ),\n );\n }\n searchComponents.push(\n getRoutesQuery(input, feedIDs, transportMode, pathOpts).then(result =>\n filterResults ? filterResults(result, mode, 'Routes') : result,\n ),\n );\n if (allSources || sources.includes('History')) {\n const routeHistory = getOldSearches(context);\n const dropLayers = ['bikestation'];\n if (transportMode) {\n dropLayers.push(...routeLayers.filter(i => !(i === transportMode)));\n }\n dropLayers.push(...stopLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n\n searchComponents.push(\n filterOldSearches(routeHistory, input, dropLayers).then(results =>\n filterResults ? filterResults(results, mode, 'Routes') : results,\n ),\n );\n }\n }\n if (allTargets || targets.includes('VehicleRentalStations')) {\n if (sources.includes('Favourite')) {\n const favouriteVehicleRentalStation =\n getFavouriteVehicleRentalStations(context);\n searchComponents.push(\n getFavouriteVehicleRentalStationsQuery(\n favouriteVehicleRentalStation,\n input,\n ),\n );\n }\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = ['bikestation'];\n const searchParams =\n geocodingSize && geocodingSize !== 10 ? { size: geocodingSize } : {};\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n cityBikeNetworks.join(','),\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode, 'VehicleRentalStations');\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const history = getOldSearches(context);\n const dropLayers = [...stopLayers];\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n\n searchComponents.push(filterOldSearches(history, input, dropLayers));\n }\n }\n\n const searchResultsPromise = Promise.all(searchComponents)\n .then(flatten)\n .then(results => {\n searches.results = results;\n })\n .catch(err => {\n searches.error = err;\n });\n searchResultsPromise.then(() => {\n callback({\n ...searches,\n results: sortSearchResults(lineRegexp, searches.results, input),\n });\n });\n}\n\nconst debouncedSearch = debounce(getSearchResults, 300, {\n leading: true,\n});\n\nexport const executeSearch = (\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n data,\n callback,\n pathOpts,\n refPoint,\n) => {\n callback(null); // This means 'we are searching'\n debouncedSearch(\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n data,\n callback,\n pathOpts,\n refPoint,\n );\n};\n","import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","const translations = {\n de: {\n address: 'Adresse',\n 'address-place-or-business': 'Adress, Ort or Geschäft',\n 'add-via-button-label': 'Füge Zwischenziel hinzu',\n 'add-via-duration-button-label': 'Set stop duration at via point {{index}}',\n 'add-via-duration-button-label-close':\n 'Close stop duration selector at via point {{index}}',\n 'add-via-duration-button-label-open':\n 'Open stop duration selector at via point {{index}}',\n airplane: 'Flug',\n arrival: 'Ankunft',\n back: 'Zurück',\n bikerentalstation: 'Leihrad-Station',\n bus: 'Bus',\n cancel: 'Abbrechen',\n 'clear-button-label': 'Löschen',\n 'clear-search-history': 'Suchhistorie löschen',\n currentposition: 'Aktuelle Position',\n delete: 'Löschen',\n 'delete-old-searches-header': 'Wollen Sie die Such-Historie löschen?',\n departure: 'Abfahrt',\n destination: 'Ziel',\n 'give-origin': 'Start eingeben.',\n 'give-destination': 'Ziel eingeben.',\n favourite: 'Favoriten',\n ferry: 'Fähre',\n 'future-route': 'Zukünftige Verbindung',\n origin: 'Start',\n 'origin-stop-near-you': 'Start',\n ownlocations: 'Eigene Favoriten',\n loading: 'Laden...',\n 'minute-short': 'min',\n rail: 'Zug',\n search: 'Suche',\n 'search-address-or-place': 'Suche anhand von Adresse oder Ortsangabe',\n 'search-button-label': 'Suche',\n 'search-destination': 'Suche Zielort, Linie or Haltestelle',\n 'search-destination-index': 'Zielort eingeben',\n 'search-destination-results-but-no-search':\n 'Ergebnisse in “Zielort”-Reiter anzeigen',\n 'search-no-results': 'Kein Ort gefunden.',\n 'search-origin': 'Suche Startort, Linie oder Haltestelle',\n 'search-origin-index': 'Startort eingeben',\n 'search-position': 'Standort ermitteln',\n 'search-autosuggest-label': 'Venue, place and stopsearch.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigate list with arrow keys and select with enter key.',\n 'search-autosuggest-label-instructions-mobile':\n 'Enter the location and navigate in the list by swiping.',\n 'search-autosuggest-label-move-to-destination':\n 'After selecting the starting location you are automatically moved to the destination field.',\n 'search-autosuggest-len': 'There is {{count}} suggestion available',\n 'search-autosuggest-len_plural':\n 'There are {{count}} suggestions available',\n 'search-current-suggestion': 'Aktuelle Auswahl: {{selection}}',\n street: 'Straße',\n subway: 'U-Bahn',\n station: 'Station',\n stop: 'Haltestelle',\n 'stop-near-you': 'Suche Haltestellen und Linien in der Nähe',\n 'stop-near-you-bus': 'Suche Buslinien or Haltestellen',\n 'stop-near-you-citybike': 'Suche Leihrad-Stationen',\n 'stop-near-you-rail': 'Suche Zugverbindungen oder Bahnhöfe',\n 'stop-near-you-subway': 'Suche U-Bahn-Linien oder Haltestellen',\n 'stop-near-you-tram': 'Suche Stadtbahn-Haltestellen-Suche',\n 'today-at': 'Heute um',\n 'tomorrow-at': 'Morgen um',\n tram: 'Straßenbahn',\n 'use-own-position': 'Benutze aktuellen Standort',\n 'select-from-map': 'Wähle Position anhand Karte',\n 'select-from-own-locations': 'Aus eigenen Favoriten auswählen',\n venue: 'Venue',\n 'via-point': 'Zwischenziel',\n where: 'Wohin?',\n place: 'Ort',\n },\n en: {\n address: 'Address',\n 'address-place-or-business': 'Address, place or business',\n 'add-via-button-label': 'Add via point',\n 'add-via-duration-button-label': 'Set stop duration at via point {{index}}',\n 'add-via-duration-button-label-close':\n 'Close stop duration selector at via point {{index}}',\n 'add-via-duration-button-label-open':\n 'Open stop duration selector at via point {{index}}',\n airplane: 'Flight',\n arrival: 'Arrival',\n back: 'Back',\n bikepark: 'Park & Ride for bikes',\n bikerentalstation: 'Bike station',\n bus: 'bus',\n cancel: 'Cancel',\n carpark: 'Park & Ride',\n 'clear-button-label': 'Clear',\n 'clear-search-history': 'Clear search history',\n currentposition: 'Current position',\n delete: 'Delete',\n 'delete-old-searches-header': 'Do you want to clear the search history?',\n departure: 'Departure',\n destination: 'Destination',\n 'give-origin': 'Enter your origin.',\n 'give-destination': 'Enter your destination',\n favourite: 'Favourite',\n ferry: 'Ferry',\n 'future-route': 'Future route',\n origin: 'Start',\n 'origin-stop-near-you': 'Start',\n ownlocations: 'Own locations',\n loading: 'Loading...',\n 'minute-short': 'm',\n platform: 'Platform',\n rail: 'Train',\n required: 'required field',\n search: 'Search',\n 'search-address-or-place': 'Search by address or place name',\n 'search-button-label': 'Search',\n 'search-destination': 'Search destination, route or stop',\n 'search-destination-index': 'Enter destination',\n 'search-destination-results-but-no-search':\n 'View results in the adjacent “Destination” tab',\n 'search-no-results': 'No location',\n 'search-origin': 'Search origin, route or stop',\n 'search-origin-index': 'Enter origin',\n 'search-position': 'Detect location',\n 'search-autosuggest-label': 'Venue, place and stopsearch.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigate list with arrow keys and select with enter key.',\n 'search-autosuggest-label-instructions-mobile':\n 'Enter the location and navigate in the list by swiping.',\n 'search-autosuggest-label-move-to-destination':\n 'After selecting the starting location you are automatically moved to the destination field.',\n 'search-autosuggest-len': 'There is {{count}} suggestion available',\n 'search-autosuggest-len_plural':\n 'There are {{count}} suggestions available',\n 'search-current-suggestion': 'Current selection: {{selection}}',\n street: 'Street',\n subway: 'Metro',\n station: 'Station',\n stop: 'Stop',\n 'stop-near-you': 'Search stops and routes',\n 'stop-near-you-airplane': 'Search flights or airports',\n 'stop-near-you-bus': 'Search bus routes or stops',\n 'stop-near-you-citybike': 'Search city bike stations',\n 'stop-near-you-rail': 'Search train routes or stations',\n 'stop-near-you-subway': 'Search metro routes or stations ',\n 'stop-near-you-tram': 'Search tram routes or stops',\n 'stop-route-station': 'Bus and stop search',\n 'today-at': 'today at',\n 'tomorrow-at': 'tomorrow at',\n tram: 'Tram',\n track: 'Track',\n 'use-own-position': 'Use current location',\n 'select-from-map': 'Select position from map',\n 'select-from-own-locations': 'Select from own locations',\n venue: 'Venue',\n 'via-point': 'Via point',\n where: 'Where to?',\n place: 'Location',\n },\n fi: {\n address: 'Osoite',\n 'address-place-or-business': 'Osoite, paikka tai yritys',\n 'add-via-button-label': 'Lisää välipiste',\n 'add-via-duration-button-label':\n 'Aseta välipisteelle {{index}} pysähdyksen kesto',\n 'add-via-duration-button-label-close':\n 'Avaa välipisteen {{index}} pysähdyksen kesto valitsin',\n 'add-via-duration-button-label-open':\n 'Sulje välipisteen {{index}} pysähdyksen kesto valitsin',\n airplane: 'Lentokone',\n arrival: 'Perillä',\n back: 'Takaisin',\n vehiclerentalstation: 'Pyöräasema',\n bikepark: 'Liityntäpysäköinti',\n bus: 'bussi',\n cancel: 'Peruuta',\n carpark: 'Liityntäpysäköinti',\n 'clear-button-label': 'Tyhjennä',\n 'clear-search-history': 'Tyhjennä hakuhistoria',\n currentposition: 'Tämänhetkinen sijainti',\n delete: 'Poista',\n 'delete-old-searches-header': 'Haluatko tyhjentää hakuhistorian?',\n departure: 'Lähtöaika',\n destination: 'Määränpää',\n favourite: 'Suosikki',\n ferry: 'Lautta',\n 'future-route': 'Tuleva reitti',\n 'give-origin': 'Lähtöpaikka',\n 'give-destination': 'Määränpää',\n origin: 'Lähtöpaikka',\n 'origin-stop-near-you': 'Lähtöpaikka',\n ownlocations: 'Omat paikat',\n loading: 'Ladataan...',\n 'minute-short': 'min',\n platform: 'Laituri',\n rail: 'Juna',\n required: 'pakollinen kenttä',\n search: 'Etsi',\n 'search-address-or-place': 'Hae osoitteella tai paikan nimellä',\n 'search-button-label': 'Hae',\n 'search-destination': 'Hae määränpäätä, linjaa tai pysäkkiä',\n 'search-destination-index': 'Syötä määränpää',\n 'search-destination-results-but-no-search':\n 'Katso tulokset viereiseltä Määränpää-välilehdeltä',\n 'search-no-results': 'Ei tuloksia',\n 'search-origin': 'Hae lähtöpaikkaa, linjaa tai pysäkkiä',\n 'search-origin-index': 'Syötä lähtöpaikka',\n 'search-autosuggest-label': 'Paikka, linja ja pysäkkihaku.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigoi listassa nuolinäppäimillä ja valitse enterillä.',\n 'search-autosuggest-label-instructions-mobile':\n 'Syötä sijainti ja navigoi listassa pyyhkäisemällä.',\n 'search-autosuggest-label-move-to-destination':\n 'Valittuasi lähtöpaikan siirrytään suoraan määränpää-kenttään.',\n 'search-autosuggest-len': ' Löydettiin {{count}} ehdotus',\n 'search-autosuggest-len_plural': ' Löydettiin {{count}} ehdotusta',\n 'search-current-suggestion': 'Tämänhetkinen valinta: {{selection}}',\n 'search-position': 'Paikanna',\n street: 'Katu',\n subway: 'Metro',\n station: 'Asema',\n stop: 'Pysäkki',\n 'stop-near-you': 'Linja, pysäkki tai asema',\n 'stop-near-you-airplane': 'Hae lentoja tai lentoasemaa',\n 'stop-near-you-bus': 'Hae bussilinjaa tai pysäkkiä',\n 'stop-near-you-citybike': 'Hae kaupunkipyöräasemaa',\n 'stop-near-you-rail': 'Hae lähijunaa tai asemaa',\n 'stop-near-you-subway': 'Hae metrolinjaa tai asemaa',\n 'stop-near-you-tram': 'Hae raitiolinjaa tai pysäkkiä',\n 'stop-route-station': 'Linja- ja pysäkkihaku',\n 'today-at': 'tänään klo',\n 'tomorrow-at': 'huomenna klo',\n tram: 'Raitiovaunu',\n track: 'Raide',\n 'use-own-position': 'Käytä nykyistä sijaintia',\n 'select-from-map': 'Valitse sijainti kartalta',\n 'select-from-own-locations': 'Valitse omista paikoista',\n venue: 'Paikka',\n 'via-point': 'Välipiste',\n where: 'Minne mennään?',\n place: 'Paikka',\n },\n pl: {\n address: 'Adres',\n 'address-place-or-business': 'Adres, miejsce lub firma',\n 'add-via-button-label': 'Dodaj punkt pośredni',\n 'add-via-duration-button-label':\n 'Wybierz czas postoju dla punktu {{index}}',\n 'add-via-duration-button-label-close':\n 'Zamknij wybornik czasu postoju w punkcie {{index}}',\n 'add-via-duration-button-label-open':\n 'Otwórz wybornik czasu postoju w punkcie {{index}}',\n airplane: 'Lot',\n arrival: 'Przyjazd',\n back: 'Wróć',\n bikepark: 'Parkuj i Jedź dla rowerów',\n bikerentalstation: 'Stacja rowerowa',\n bus: 'autobus',\n cancel: 'Anuluj',\n carpark: 'Parkuj i Jedź',\n 'clear-button-label': 'Wyczyść',\n 'clear-search-history': 'Wyczyść historię wyszukiwania',\n currentposition: 'Obecne położenie',\n delete: 'Usuń',\n 'delete-old-searches-header':\n 'Czy na pewno chcesz wyczyścić historię wyszukiwania?',\n departure: 'Odjazd',\n destination: 'Cel',\n 'give-origin': 'Wprowadź swój punkt początkowy.',\n 'give-destination': 'Wprowadź swój cel',\n favourite: 'Ulubione',\n ferry: 'Prom',\n 'future-route': 'Przyszła trasa',\n origin: 'Początek',\n 'origin-stop-near-you': 'Początek',\n ownlocations: 'Własne miejsca',\n loading: 'Ładowanie…',\n 'minute-short': 'min.',\n platform: 'Peron',\n rail: 'Pociąg',\n required: 'wymagane pole',\n search: 'Szukaj',\n 'search-address-or-place': 'Szukaj po adresie lub nazwie miejsca',\n 'search-button-label': 'Szukaj',\n 'search-destination': 'Szukaj celu, trasy lub przystanku',\n 'search-destination-index': 'Wprowadź punkt docelowy',\n 'search-destination-results-but-no-search':\n 'Wyświetl wyniki w sąsiedniej karcie „Cel”',\n 'search-no-results': 'Brak lokalizacji',\n 'search-origin': 'Wyszukaj początek, koniec lub punkt pośredni',\n 'search-origin-index': 'Wprowadź punkt początkowy',\n 'search-position': 'Wykryj lokalizację',\n 'search-autosuggest-label': 'Miejsce, lokalizacja i przystanek.',\n 'search-autosuggest-label-instructions-desktop':\n 'Nawiguj po liście używając strzałek i wybieraj klawiszem Enter.',\n 'search-autosuggest-label-instructions-mobile':\n 'Wprowadź lokalizację i nawiguj po liście gestami przesuwania.',\n 'search-autosuggest-label-move-to-destination':\n 'Po wybraniu lokalizacji początkowej, automatycznie przejdziesz do pola miejsca docelowego.',\n 'search-autosuggest-len': 'Dostępna jest {{count}} propozycja',\n 'search-autosuggest-len_few': 'Dostępne są {{count}} propozycje',\n 'search-autosuggest-len_other': 'Dostępne jest {{count}} propozycji',\n 'search-current-suggestion': 'Obecny wybór: {{selection}}',\n street: 'Ulica',\n subway: 'Metro',\n station: 'Stacja',\n stop: 'Przystanek',\n 'stop-near-you': 'Szukaj przystanków i tras',\n 'stop-near-you-airplane': 'Szukaj lotów i lotnisk',\n 'stop-near-you-bus': 'Szukaj tras autobusowych i przystanków',\n 'stop-near-you-citybike': 'Szukaj stacji rowerów miejskich',\n 'stop-near-you-rail': 'Szukaj tras kolejowych i przystanków',\n 'stop-near-you-subway': 'Szukaj tras metra i przystanków ',\n 'stop-near-you-tram': 'Szukaj tras tramwajowych i przystanków',\n 'stop-route-station': 'Wyszukiwanie autobusów i przystanków',\n 'today-at': 'dziś o',\n 'tomorrow-at': 'jutro o',\n tram: 'Tramwaj',\n track: 'Tor',\n 'use-own-position': 'Użyj obecnej lokalizacji',\n 'select-from-map': 'Wybierz miejsce na mapie',\n 'select-from-own-locations': 'Wybierz z własnych miejsc',\n venue: 'Miejsce',\n 'via-point': 'Przez punkt',\n where: 'Dokąd?',\n place: 'Miejsce',\n },\n sv: {\n address: 'Adress',\n 'address-place-or-business': 'Adress, plats eller företag',\n 'add-via-button-label': 'Lägg till viapunkt',\n 'add-via-duration-button-label':\n 'Ställ in varaktighet för viapunkten {{index}}',\n 'add-via-duration-button-label-close':\n 'Stäng väljaren för varaktighet vid via-punkten {{index}}',\n 'add-via-duration-button-label-open':\n 'Öppna väljaren för varaktighet vid via-punkten {{index}}',\n airplane: 'Flyg',\n arrival: 'Anländer',\n back: 'Tillbaka',\n bikerentalstation: 'Stadscykelstation',\n bikepark: 'Anslutningsparkering för cyklar',\n bus: 'Bussi',\n cancel: 'Avbryt',\n carpark: 'Infartsparkering',\n 'clear-button-label': 'Töm',\n 'clear-search-history': 'Töm sökhistoriken',\n currentposition: 'Nuvarande position',\n delete: 'Ta bort',\n 'delete-old-searches-header': 'Vill du tömma sökhistoriken?',\n departure: 'Avgångstid',\n destination: 'Destination',\n favourite: 'Favorit',\n ferry: 'Färja',\n 'future-route': 'Framtida rutt',\n 'give-destination': 'Skriv in din destination',\n 'give-origin': 'Skriv in din avfärdsplats',\n origin: 'Avfärdsplats',\n 'origin-stop-near-you': 'Avfärdsplats',\n ownlocations: 'Egna platser',\n loading: 'Laddar...',\n 'minute-short': 'min',\n platform: 'Plattform',\n rail: 'Tåg',\n required: 'obligatoriskt fält',\n search: 'Sök',\n 'search-address-or-place': 'Sök med adressen eller platsens namn',\n 'search-button-label': 'Sök',\n 'search-destination': 'Sök destination, linje eller hållplats',\n 'search-destination-index': 'Skriv destination',\n 'search-destination-results-but-no-search':\n 'Se resultaten under fliken Destination',\n 'search-no-results': 'Inga sökresultat',\n 'search-origin': 'Sök avfärdsplats, linje eller hållplats',\n 'search-origin-index': 'Skriv avfärdsplats',\n 'search-position': 'Sök position',\n 'search-autosuggest-label': 'Plats, linje och hållplatssökning.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigera listan med piltangenterna och välj med Enter-tangeten.',\n 'search-autosuggest-label-instructions-mobile':\n 'Ange platsen och navigera i listan genom att svepa.',\n 'search-autosuggest-label-move-to-destination':\n 'Efter att du valt avgångsplatsen tas du direkt till Destination-fältet.',\n 'search-autosuggest-len': 'Hittade {{count}} förslag',\n 'search-current-suggestion': 'Nuvarande val: {{selection}}',\n street: 'Gata',\n subway: 'Metro',\n station: 'Station',\n stop: 'Hållplats',\n 'stop-near-you': 'Sök hållplatser eller linjer',\n 'stop-near-you-airplane': 'Sök flyg eller flygplatser',\n 'stop-near-you-bus': 'Sök busslinjer eller hållplatser',\n 'stop-near-you-citybike': 'Sök stadscykelstationer',\n 'stop-near-you-rail': 'Sök närtåger eller stationer',\n 'stop-near-you-subway': 'Sök metrolinjer eller stationer',\n 'stop-near-you-tram': 'Sök spårvagnlinjer eller hållplatser',\n 'stop-route-station': 'Buss och stopp sökningen',\n 'today-at': 'i dag kl',\n 'tomorrow-at': 'i morgon',\n tram: 'Spårvagn',\n track: 'Spår',\n 'use-own-position': 'Använd min position',\n 'select-from-map': 'Välj position från kartan',\n 'select-from-own-locations': 'Välj från egna platser',\n venue: 'Mötesplats',\n 'via-point': 'Via punkt',\n where: 'Vart vill du åka?',\n place: 'Plats',\n },\n};\n\nexport default translations;\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import PropTypes from 'prop-types';\nimport React, { useState, useEffect, useCallback } from 'react';\nimport ReactModal from 'react-modal';\nimport cx from 'classnames';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport Autosuggest from 'react-autosuggest';\nimport mobileStyles from './MobileSearch.scss';\nimport mobileNoScrollStyles from './MobileNoScroll.scss';\n\nclass AutosuggestPatch extends Autosuggest {\n constructor(props) {\n super(props);\n const self = this;\n self.onSuggestionTouchMove = () => {\n self.justSelectedSuggestion = false;\n self.pressedSuggestion = null;\n };\n }\n}\n\nconst MobileSearch = ({\n appElement,\n id,\n closeHandle,\n clearInput,\n value,\n suggestions,\n inputProps,\n fetchFunction,\n renderSuggestion,\n getSuggestionValue,\n ariaLabel,\n label,\n onSuggestionSelected,\n clearOldSearches,\n dialogHeaderText,\n dialogPrimaryButtonText,\n dialogSecondaryButtonText,\n clearInputButtonText,\n focusInput,\n color,\n hoverColor,\n accessiblePrimaryColor,\n searchOpen,\n fontWeights,\n showScroll,\n}) => {\n const styles = showScroll ? mobileStyles : mobileNoScrollStyles;\n\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n\n const [isDialogOpen, setDialogOpen] = useState(false);\n const inputRef = React.useRef();\n\n useEffect(() => {\n ReactModal.setAppElement(appElement);\n }, []);\n\n const onClose = useCallback(() => {\n closeHandle();\n });\n\n const onSelect = (e, ref) => {\n if (ref.suggestion.type === 'clear-search-history') {\n setDialogOpen(true);\n } else if (!ref.suggestion.properties.arrowClicked) {\n // Select item if fill input button is not pressed (diagonal arrow in suggestion items)\n onSuggestionSelected(e, ref);\n }\n };\n\n const isKeyboardSelectionEvent = event => {\n const space = [13, ' ', 'Spacebar'];\n const enter = [32, 'Enter'];\n const key = (event && (event.key || event.which || event.keyCode)) || '';\n\n if (!key || !space.concat(enter).includes(key)) {\n return false;\n }\n event.preventDefault();\n return true;\n };\n\n const getValue = suggestion => {\n if (suggestion.type === 'clear-search-history') {\n return '';\n }\n return getSuggestionValue(suggestion);\n };\n\n const renderItem = item => {\n if (item.type === 'clear-search-history') {\n return (\n <button type=\"button\" className={styles['clear-search-history']}>\n {item.labelId}\n </button>\n );\n }\n return renderSuggestion(item);\n };\n\n const renderDialogModal = () => {\n return (\n <DialogModal\n appElement={appElement}\n isModalOpen={isDialogOpen}\n handleClose={() => setDialogOpen(false)}\n headerText={dialogHeaderText}\n primaryButtonText={dialogPrimaryButtonText}\n secondaryButtonText={dialogSecondaryButtonText}\n primaryButtonOnClick={() => {\n clearOldSearches();\n setDialogOpen(false);\n }}\n secondaryButtonOnClick={() => setDialogOpen(false)}\n color={color}\n hoverColor={hoverColor}\n fontWeights={fontWeights}\n />\n );\n };\n\n const clearButton = () => {\n return (\n <button\n type=\"button\"\n className={styles['clear-input']}\n onClick={clearInput}\n onKeyDown={e => isKeyboardSelectionEvent(e) && clearInput()}\n aria-label={clearInputButtonText}\n >\n <Icon img=\"close\" color={color} />\n </button>\n );\n };\n\n const renderContent = () => {\n return (\n <div className={styles['combobox-container']} htmlFor={inputId}>\n <button\n type=\"button\"\n className={styles['combobox-icon']}\n onClick={() => onClose()}\n onKeyDown={e => isKeyboardSelectionEvent(e) && onClose()}\n aria-label={dialogSecondaryButtonText}\n tabIndex={0}\n >\n <Icon img=\"arrow\" />\n </button>\n <span className={styles['right-column']}>\n <span className={styles['combobox-label']} id={labelId}>\n {label}\n </span>\n <AutosuggestPatch\n alwaysRenderSuggestions\n id={id}\n suggestions={suggestions}\n onSuggestionsFetchRequested={fetchFunction}\n getSuggestionValue={getValue}\n renderSuggestion={renderItem}\n // focusInputOnSuggestionClick must be set to true.\n // If set to false, input won't be focused when user clicks on\n // Fill input button in suggestion list. (diagonal arrow in street name items)\n focusInputOnSuggestionClick\n shouldRenderSuggestions={() => true}\n inputProps={{\n ...inputProps,\n className: cx(\n `${styles.input} ${styles[id] || ''} ${\n inputProps.value ? styles.hasValue : ''\n }`,\n ),\n autoFocus: true,\n }}\n renderInputComponent={p => (\n <>\n <input aria-label={ariaLabel} id={id} {...p} />\n {value && clearButton()}\n </>\n )}\n theme={styles}\n onSuggestionSelected={onSelect}\n ref={inputRef}\n />\n </span>\n </div>\n );\n };\n // This does not seem to do anything.\n // When doing quick testing on this it looked like inputRef.current is always undefined.\n if (focusInput && inputRef.current?.input) {\n inputRef.current.input.focus();\n }\n\n return (\n <ReactModal\n isOpen={searchOpen}\n className={styles['mobile-modal']}\n overlayClassName={styles['mobile-modal-overlay']}\n onAfterClose={onClose}\n shouldCloseOnEsc\n >\n <div\n className={styles['mobile-modal-content']}\n style={{\n '--color': `${color}`,\n '--accessible-primary-color': accessiblePrimaryColor,\n '--hover-color': `${hoverColor}`,\n '--font-weight-medium': fontWeights.medium,\n }}\n >\n {renderContent()}\n {renderDialogModal()}\n </div>\n </ReactModal>\n );\n};\n\nMobileSearch.propTypes = {\n appElement: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n closeHandle: PropTypes.func.isRequired,\n clearInput: PropTypes.func.isRequired,\n value: PropTypes.string,\n clearInputButtonText: PropTypes.string.isRequired,\n // eslint-disable-next-line\n suggestions: PropTypes.arrayOf(PropTypes.object).isRequired,\n inputProps: PropTypes.shape({\n onChange: PropTypes.func.isRequired,\n onBlur: PropTypes.func.isRequired,\n value: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n className: PropTypes.string.isRequired,\n }).isRequired,\n fetchFunction: PropTypes.func.isRequired,\n getSuggestionValue: PropTypes.func.isRequired,\n renderSuggestion: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n label: PropTypes.string.isRequired,\n clearOldSearches: PropTypes.func.isRequired,\n ariaLabel: PropTypes.string,\n dialogHeaderText: PropTypes.string,\n dialogPrimaryButtonText: PropTypes.string,\n dialogSecondaryButtonText: PropTypes.string,\n focusInput: PropTypes.bool,\n color: PropTypes.string,\n hoverColor: PropTypes.string,\n accessiblePrimaryColor: PropTypes.string.isRequired,\n searchOpen: PropTypes.bool.isRequired,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number.isRequired,\n }).isRequired,\n showScroll: PropTypes.bool,\n};\n\nMobileSearch.defaultProps = {\n value: undefined,\n ariaLabel: undefined,\n dialogHeaderText: undefined,\n dialogPrimaryButtonText: undefined,\n dialogSecondaryButtonText: undefined,\n focusInput: false,\n color: undefined,\n hoverColor: undefined,\n showScroll: undefined,\n};\n\nexport default MobileSearch;\n","/*! For license information please see index.js.LICENSE.txt */\n!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t(require(\"react\"));else if(\"function\"==typeof define&&define.amd)define([\"react\"],t);else{var n=\"object\"==typeof exports?t(require(\"react\")):t(e.react);for(var o in n)(\"object\"==typeof exports?exports:e)[o]=n[o]}}(\"undefined\"!=typeof self?self:this,(function(e){return function(){var t={888:function(e,t,n){var o,r;r=void 0!==n.g?n.g:\"undefined\"!=typeof window?window:this,o=function(){return function(e){\"use strict\";var t={ignore:\"[data-scroll-ignore]\",header:null,topOnEmptyHash:!0,speed:500,speedAsDuration:!1,durationMax:null,durationMin:null,clip:!0,offset:0,easing:\"easeInOutCubic\",customEasing:null,updateURL:!0,popstate:!0,emitEvents:!0},n=function(){var e={};return Array.prototype.forEach.call(arguments,(function(t){for(var n in t){if(!t.hasOwnProperty(n))return;e[n]=t[n]}})),e},o=function(e){\"#\"===e.charAt(0)&&(e=e.substr(1));for(var t,n=String(e),o=n.length,r=-1,u=\"\",i=n.charCodeAt(0);++r<o;){if(0===(t=n.charCodeAt(r)))throw new InvalidCharacterError(\"Invalid character: the input contains U+0000.\");u+=t>=1&&t<=31||127==t||0===r&&t>=48&&t<=57||1===r&&t>=48&&t<=57&&45===i?\"\\\\\"+t.toString(16)+\" \":t>=128||45===t||95===t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122?n.charAt(r):\"\\\\\"+n.charAt(r)}return\"#\"+u},r=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},u=function(t){return t?(n=t,parseInt(e.getComputedStyle(n).height,10)+t.offsetTop):0;var n},i=function(t,n,o){0===t&&document.body.focus(),o||(t.focus(),document.activeElement!==t&&(t.setAttribute(\"tabindex\",\"-1\"),t.focus(),t.style.outline=\"none\"),e.scrollTo(0,n))},s=function(t,n,o,r){if(n.emitEvents&&\"function\"==typeof e.CustomEvent){var u=new CustomEvent(t,{bubbles:!0,detail:{anchor:o,toggle:r}});document.dispatchEvent(u)}};return function(c,a){var l,f,d,v,p={cancelScroll:function(e){cancelAnimationFrame(v),v=null,e||s(\"scrollCancel\",l)},animateScroll:function(o,c,a){p.cancelScroll();var f=n(l||t,a||{}),h=\"[object Number]\"===Object.prototype.toString.call(o),m=h||!o.tagName?null:o;if(h||m){var y=e.pageYOffset;f.header&&!d&&(d=document.querySelector(f.header));var b,g,w,E=u(d),O=h?o:function(t,n,o,u){var i=0;if(t.offsetParent)do{i+=t.offsetTop,t=t.offsetParent}while(t);return i=Math.max(i-n-o,0),u&&(i=Math.min(i,r()-e.innerHeight)),i}(m,E,parseInt(\"function\"==typeof f.offset?f.offset(o,c):f.offset,10),f.clip),S=O-y,_=r(),I=0,M=function(e,t){var n=t.speedAsDuration?t.speed:Math.abs(e/1e3*t.speed);return t.durationMax&&n>t.durationMax?t.durationMax:t.durationMin&&n<t.durationMin?t.durationMin:parseInt(n,10)}(S,f),L=function(t){b||(b=t),I+=t-b,w=y+S*function(e,t){var n;return\"easeInQuad\"===e.easing&&(n=t*t),\"easeOutQuad\"===e.easing&&(n=t*(2-t)),\"easeInOutQuad\"===e.easing&&(n=t<.5?2*t*t:(4-2*t)*t-1),\"easeInCubic\"===e.easing&&(n=t*t*t),\"easeOutCubic\"===e.easing&&(n=--t*t*t+1),\"easeInOutCubic\"===e.easing&&(n=t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1),\"easeInQuart\"===e.easing&&(n=t*t*t*t),\"easeOutQuart\"===e.easing&&(n=1- --t*t*t*t),\"easeInOutQuart\"===e.easing&&(n=t<.5?8*t*t*t*t:1-8*--t*t*t*t),\"easeInQuint\"===e.easing&&(n=t*t*t*t*t),\"easeOutQuint\"===e.easing&&(n=1+--t*t*t*t*t),\"easeInOutQuint\"===e.easing&&(n=t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t),e.customEasing&&(n=e.customEasing(t)),n||t}(f,g=(g=0===M?0:I/M)>1?1:g),e.scrollTo(0,Math.floor(w)),function(t,n){var r=e.pageYOffset;if(t==n||r==n||(y<n&&e.innerHeight+r)>=_)return p.cancelScroll(!0),i(o,n,h),s(\"scrollStop\",f,o,c),b=null,v=null,!0}(w,O)||(v=e.requestAnimationFrame(L),b=t)};0===e.pageYOffset&&e.scrollTo(0,0),function(e,t,n){t||history.pushState&&n.updateURL&&history.pushState({smoothScroll:JSON.stringify(n),anchor:e.id},document.title,e===document.documentElement?\"#top\":\"#\"+e.id)}(o,h,f),\"matchMedia\"in e&&e.matchMedia(\"(prefers-reduced-motion)\").matches?i(o,Math.floor(O),!1):(s(\"scrollStart\",f,o,c),p.cancelScroll(!0),e.requestAnimationFrame(L))}}},h=function(t){if(!t.defaultPrevented&&!(0!==t.button||t.metaKey||t.ctrlKey||t.shiftKey)&&\"closest\"in t.target&&(f=t.target.closest(c))&&\"a\"===f.tagName.toLowerCase()&&!t.target.closest(l.ignore)&&f.hostname===e.location.hostname&&f.pathname===e.location.pathname&&/#/.test(f.href)){var n,r;try{n=o(decodeURIComponent(f.hash))}catch(e){n=o(f.hash)}if(\"#\"===n){if(!l.topOnEmptyHash)return;r=document.documentElement}else r=document.querySelector(n);(r=r||\"#top\"!==n?r:document.documentElement)&&(t.preventDefault(),function(t){if(history.replaceState&&t.updateURL&&!history.state){var n=e.location.hash;n=n||\"\",history.replaceState({smoothScroll:JSON.stringify(t),anchor:n||e.pageYOffset},document.title,n||e.location.href)}}(l),p.animateScroll(r,f))}},m=function(e){if(null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(l)){var t=history.state.anchor;\"string\"==typeof t&&t&&!(t=document.querySelector(o(history.state.anchor)))||p.animateScroll(t,null,{updateURL:!1})}};return p.destroy=function(){l&&(document.removeEventListener(\"click\",h,!1),e.removeEventListener(\"popstate\",m,!1),p.cancelScroll(),l=null,f=null,d=null,v=null)},function(){if(!(\"querySelector\"in document&&\"addEventListener\"in e&&\"requestAnimationFrame\"in e&&\"closest\"in e.Element.prototype))throw\"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.\";p.destroy(),l=n(t,a||{}),d=l.header?document.querySelector(l.header):null,document.addEventListener(\"click\",h,!1),l.updateURL&&l.popstate&&e.addEventListener(\"popstate\",m,!1)}(),p}}(r)}.apply(t,[]),void 0===o||(e.exports=o)},432:function(e,t,n){\"use strict\";var o=this&&this.__createBinding||(Object.create?function(e,t,n,o){void 0===o&&(o=n),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,o){void 0===o&&(o=n),e[o]=t[n]}),r=this&&this.__exportStar||function(e,t){for(var n in e)\"default\"===n||Object.prototype.hasOwnProperty.call(t,n)||o(t,e,n)};Object.defineProperty(t,\"__esModule\",{value:!0}),r(n(47),t),r(n(926),t),r(n(349),t),r(n(137),t),r(n(729),t),r(n(383),t),r(n(450),t),r(n(358),t),r(n(753),t),r(n(869),t),r(n(352),t),r(n(446),t),r(n(164),t),r(n(305),t),r(n(502),t)},349:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useArrowNavigation=void 0;var o=n(156);t.useArrowNavigation=function(e){var t=e.listItems,n=e.onArrowUpOrDown,r=(0,o.useState)(0),u=r[0],i=r[1],s=(0,o.useCallback)((function(e){i(e)}),[t]),c=function(e){var o=e.key;if(null==t?void 0:t.length)if(\"ArrowUp\"===o)n&&n(),e.preventDefault(),s(u>0?u-1:t.length-1);else{if(\"ArrowDown\"!==o)return;n&&n(),e.preventDefault(),u<t.length-1?s(u+1):s(0)}};return(0,o.useEffect)((function(){return window.addEventListener(\"keydown\",c),function(){return window.removeEventListener(\"keydown\",c)}})),(0,o.useEffect)((function(){s(0)}),[t]),{selectedIndex:u}}},446:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useDebounce=void 0;var o=n(156);t.useDebounce=function(e,t){void 0===t&&(t=300);var n=(0,o.useState)(e),r=n[0],u=n[1];return(0,o.useEffect)((function(){var n=setTimeout((function(){u(e)}),t);return function(){clearTimeout(n)}}),[e,t]),r}},164:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useElementSize=void 0;var o=n(156);t.useElementSize=function(){var e,t,n=(0,o.useRef)(null);return[n,{width:null===(e=null==n?void 0:n.current)||void 0===e?void 0:e.clientWidth,height:null===(t=null==n?void 0:n.current)||void 0===t?void 0:t.clientHeight}]},t.default=t.useElementSize},137:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIntersectionObserver=void 0;var o=n(156);t.useIntersectionObserver=function(e){var t=(0,o.useRef)(null),n=(0,o.useState)(!1),r=n[0],u=n[1],i=function(e){var t=e[0];u(t.isIntersecting)};return(0,o.useEffect)((function(){if(window&&window.IntersectionObserver){var n=new IntersectionObserver(i,e),o=t.current;return t.current&&n.observe(t.current),function(){o&&n.unobserve(o)}}u(!1)}),[t,e]),{containerRef:t,isVisible:r}},t.default=t.useIntersectionObserver},729:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsBreakpoint=void 0;var o=n(156),r=n(432),u={xs:1,mobileSmall:320,mobile:375,tablet:768,tabletLarge:920,desktopSmall:1024,desktop:1260,desktopLarge:1440};t.useIsBreakpoint=function(e){var t=\"string\"==typeof e?u[e]:e,n=(0,o.useState)(null),i=n[0],s=n[1],c=(0,o.useCallback)((function(){s(window.innerWidth)}),[]);return(0,o.useEffect)((function(){c()}),[]),(0,r.useOnResize)(c),i>=t},t.default=t.useIsBreakpoint},450:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsLoadingAfterError=void 0;var o=n(156);t.useIsLoadingAfterError=function(e,t){var n=(0,o.useState)(t),r=n[0],u=n[1];return(0,o.useEffect)((function(){e||u(t)}),[e,t]),e&&r}},305:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsMobile=void 0;var o=n(729);t.useIsMobile=function(){return!(0,o.useIsBreakpoint)(\"tablet\")},t.default=t.useIsMobile},383:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsomorphicLayoutEffect=void 0;var o=n(156);t.useIsomorphicLayoutEffect=\"undefined\"!=typeof window?o.useLayoutEffect:o.useEffect,t.default=t.useIsomorphicLayoutEffect},753:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnLoseFocusWithin=void 0;var o=n(156);t.useOnLoseFocusWithin=function(e){var t=e.ref,n=e.callback,r=e.watch;(0,o.useEffect)((function(){var e=function(){var e;if(r)return(null===(e=t.current)||void 0===e?void 0:e.matches(\":focus-within\"))?void 0:n()};return document.addEventListener(\"keyup\",e),function(){return document.removeEventListener(\"keyup\",e)}}),[n,t,r])},t.default=t.useOnLoseFocusWithin},502:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnResize=void 0;var o=n(156);t.useOnResize=function(e){(0,o.useEffect)((function(){var t=function(){e(window.innerWidth)};return window.addEventListener(\"resize\",t,{passive:!0}),function(){return window.removeEventListener(\"resize\",t)}}),[])},t.default=t.useOnResize},352:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnWindowFocus=void 0;var o=n(156);t.useOnWindowFocus=function(e){(0,o.useEffect)((function(){var t=function(){e&&\"visible\"===document.visibilityState&&e()};return window.addEventListener(\"visibilitychange\",t,!1),function(){return window.removeEventListener(\"visibilitychange\",t)}}),[e])}},47:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOutsideReacter=void 0;var o=n(156);t.useOutsideReacter=function(e,t){function n(n){e.current&&!e.current.contains(n.target)&&t()}(0,o.useEffect)((function(){return document.addEventListener(\"mousedown\",n),function(){document.removeEventListener(\"mousedown\",n)}}))}},869:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useRunAfterUpdate=void 0;var o=n(156);t.useRunAfterUpdate=function(){var e=(0,o.useRef)(null);return(0,o.useEffect)((function(){e.current&&(e.current(),e.current=null)})),function(t){e.current=t}},t.default=t.useRunAfterUpdate},926:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useScrollLock=void 0;var o=n(156);t.useScrollLock=function(){return{lock:(0,o.useCallback)((function(){var e=window.scrollY+\"px\",t=document.body;t.style.position=\"fixed\",t.style.top=\"-\"+e}),[]),unlock:(0,o.useCallback)((function(){var e=document.body,t=e.style.top,n=-1*parseInt(t||\"0\");e.style.position=\"\",e.style.top=\"\",n&&window.scrollTo(0,-1*parseInt(t||\"0\"))}),[])}}},358:function(e,t,n){\"use strict\";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.useSmoothScroll=void 0;var r=n(156),u=o(n(888));t.useSmoothScroll=function(e){var t=(0,r.useRef)(null),n=e.ref,o=e.offset,i=void 0===o?0:o,s=e.speed,c=void 0===s?500:s;return(0,r.useEffect)((function(){t.current=new u.default(null,{speed:c,speedAsDuration:!0})}),[]),(0,r.useCallback)((function(){n&&t.current&&t.current.animateScroll(n.current,null,{offset:function(){return i},updateURL:!1})}),[i,n])}},156:function(t){\"use strict\";t.exports=e}},n={};function o(e){var r=n[e];if(void 0!==r)return r.exports;var u=n[e]={exports:{}};return t[e].call(u.exports,u,u.exports,o),u.exports}return o.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),o(432)}()}));\n//# sourceMappingURL=index.js.map","/* eslint-disable import/no-extraneous-dependencies */\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport i18next from 'i18next';\nimport cx from 'classnames';\nimport Autosuggest from 'react-autosuggest';\nimport { executeSearch } from '@digitransit-search-util/digitransit-search-util-execute-search-immidiate';\nimport SuggestionItem from '@digitransit-component/digitransit-component-suggestion-item';\nimport {\n getNameLabel,\n getStopCode,\n} from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport { getStopName } from '@digitransit-search-util/digitransit-search-util-helpers';\nimport getLabel from '@digitransit-search-util/digitransit-search-util-get-label';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { DateTime, Settings } from 'luxon';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport translations from './helpers/translations';\nimport styles from './helpers/styles.scss';\nimport MobileSearch from './helpers/MobileSearch';\nimport withScrollLock from './helpers/withScrollLock';\n\nSettings.defaultLocale = 'en';\n\ni18next.init({\n fallbackLng: 'fi',\n defaultNS: 'translation',\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n});\n\nconst Loading = props => (\n <div className={styles['spinner-loader']}>\n {(props && props.children) || (\n <span className={styles['sr-only']}>{i18next.t('loading')}</span>\n )}\n </div>\n);\n\nLoading.propTypes = {\n children: PropTypes.node,\n};\n\nLoading.defaultProps = {\n children: undefined,\n};\n\nconst getPlatform = addendum => {\n if (!addendum || !addendum.GTFS.platform) {\n return undefined;\n }\n const { modes, platform } = addendum.GTFS;\n const type =\n modes && modes[0] === 'RAIL' ? i18next.t('track') : i18next.t('platform');\n return [type, platform];\n};\n\nfunction getSuggestionContent(item) {\n if (item.type !== 'FutureRoute') {\n if (item.type === 'SelectFromMap') {\n return ['', i18next.t('select-from-map')];\n }\n if (item.type === 'CurrentLocation') {\n return ['', i18next.t('use-own-position')];\n }\n if (item.type === 'SelectFromOwnLocations') {\n return ['', i18next.t('select-from-own-locations')];\n }\n /* eslint-disable-next-line prefer-const */\n let [name, label] = getNameLabel(item.properties, true);\n let suggestionType;\n if (\n item.properties.layer.toLowerCase().includes('bikerental') ||\n item.properties.layer.toLowerCase().includes('bikestation')\n ) {\n suggestionType = i18next.t('vehiclerentalstation');\n const stopCode = item.properties.labelId;\n return [suggestionType, name, undefined, stopCode];\n }\n\n if (item.properties.layer === 'bikepark') {\n suggestionType = i18next.t('bikepark');\n return [suggestionType, name, undefined, undefined];\n }\n\n if (item.properties.layer === 'carpark') {\n suggestionType = i18next.t('carpark');\n return [suggestionType, name, undefined, undefined];\n }\n\n if (item.properties.mode) {\n suggestionType = i18next.t(\n item.properties.mode.toLowerCase().replace('favourite', ''),\n );\n } else {\n const layer = item.properties.layer\n .replace('route-', '')\n .toLowerCase()\n .replace('favourite', '');\n suggestionType = i18next.t(layer);\n }\n\n if (\n item.properties.id &&\n (item.properties.layer === 'stop' || item.properties.layer === 'station')\n ) {\n const stopCode = getStopCode(item.properties);\n const mode = item.properties.addendum?.GTFS.modes;\n const platform = getPlatform(item.properties.addendum);\n return [\n suggestionType,\n getStopName(name, stopCode),\n label,\n stopCode,\n mode,\n platform,\n ];\n }\n if (\n item.properties.layer === 'favouriteStop' ||\n item.properties.layer === 'favouriteStation'\n ) {\n const { address, code } = item.properties;\n const stoName = address ? getStopName(address.split(',')[0], code) : name;\n const platform = getPlatform(item.properties.addendum);\n return [suggestionType, stoName, label, code, undefined, platform];\n }\n return [suggestionType, name, label];\n }\n const { origin, destination } = item.properties;\n const tail1 = origin.locality ? `, ${origin.locality} foobar` : '';\n const tail2 = destination.locality ? `, ${destination.locality}` : '';\n const name1 = origin.name;\n const name2 = destination.name;\n return [\n i18next.t('future-route'),\n `${i18next.t('origin')} ${name1}${tail1} ${i18next.t(\n 'destination',\n )} ${name2}${tail2}`,\n item.translatedText,\n ];\n}\n\nfunction translateFutureRouteSuggestionTime(item) {\n const time = DateTime.fromSeconds(Number(item.properties.time));\n const now = DateTime.now();\n let str = item.properties.arriveBy\n ? i18next.t('arrival')\n : i18next.t('departure');\n if (time.hasSame(now, 'day')) {\n str = `${str} ${i18next.t('today-at')}`;\n } else if (time.hasSame(now.plus({ days: 1 }), 'day')) {\n str = `${str} ${i18next.t('tomorrow-at')}`;\n } else {\n str = `${str} ${time.toFormat('ccc d.L.')}`;\n }\n str = `${str} ${time.toFormat('HH:mm')}`;\n return str;\n}\n\nconst getSuggestionValue = suggestion => {\n if (\n suggestion.type === 'SelectFromOwnLocations' ||\n suggestion.type === 'back'\n ) {\n return '';\n }\n return getLabel(suggestion.properties);\n};\n/**\n * @example\n * const searchContext = {\n * isPeliasLocationAware: false // true / false does Let Pelias suggest based on current user location\n * minimalRegexp: undefined // used for testing min. regexp. For example: new RegExp('.{2,}'),\n * lineRegexp: undefined // identify searches for route numbers/labels: bus | train | metro. For example: new RegExp(\n * // '(^[0-9]+[a-z]?$|^[yuleapinkrtdz]$|(^m[12]?b?$))',\n * // 'i',\n * // ),\n * URL_PELIAS: '' // url for pelias searches\n * feedIDs: ['HSL', 'HSLLautta'] // FeedId's like [HSL, HSLLautta]\n * geocodingSources: ['oa','osm','nlsfi'] // sources for geocoding\n * geocodingSearchParams; {} // Searchparmas fro geocoding\n * getFavouriteLocations: () => ({}), // Function that returns array of favourite locations.\n * getFavouriteStops: () => ({}), // Function that returns array of favourite stops.\n * getLanguage: () => ({}), // Function that returns current language.\n * getFavouriteRoutes: () => ({}), // Function that returns array of favourite routes.\n * getPositions: () => ({}), // Function that returns user's geolocation.\n * getRoutesQuery: () => ({}), // Function that returns query for fetching routes.\n * getStopAndStationsQuery: () => ({}), // Function that fetches favourite stops and stations from graphql API.\n * getFavouriteRoutesQuery: () => ({}), // Function that returns query for fetching favourite routes.\n * getFavouriteVehicleRentalStations: () => ({}), // Function that returns favourite bike rental station.\n * getFavouriteVehicleRentalStationsQuery: () => ({}), // Function that returns query for fetching favourite bike rental stations.\n * startLocationWatch: () => ({}), // Function that locates users geolocation.\n * saveSearch: () => ({}), // Function that saves search to old searches store.\n * clearOldSearches: () => ({}), // Function that clears old searches store.\n * getFutureRoutes: () => ({}), // Function that return future routes\n * saveFutureRoute: () => ({}), // Function that saves a future route\n * clearFutureRoutes: () => ({}), // Function that clears future routes\n * };\n * const lang = 'fi'; // en, fi or sv\n * const onSelect = (item, id) => {\n * // Funtionality when user selects a suggesions. No default implementation is given.\n * return null;\n * };\n * const onClear = id => {\n * // Called when user clicks the clear search string button. No default implementation.\n * return null;\n * };\n * const getAutoSuggestIcons: {\n * // Called for every city bike station rendered as a search suggestion. Should return the icon and\n * // color used for that station. Two icons are available, 'citybike-stop-digitransit' anditybike-stop-digitransit-secondary'.\n * citybikes: station => {\n * return ['citybike-stop-digitransit', '#f2b62d'];\n * }\n * }\n * const transportMode = undefined;\n * const placeholder = \"stop-near-you\";\n * const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. Options are Locations, Stops, Stations, Routes, VehicleRentalStations, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets.\n * const sources = ['Favourite', 'History', 'Datasource'] // Defines where you are searching. all available are: Favourite, History (previously searched searches) and Datasource. Leave empty to use all sources.\n * return (\n * <DTAutosuggest\n * appElement={appElement} // Required. Root element's id. Needed for react-modal component.\n * searchContext={searchContext}\n * icon=\"origin\" // Optional String for icon that is shown left of searchfield. used with Icon library\n * id=\"origin\" // used for style props and info for component.\n * placeholder={placeholder} // String that is showns initally in search field\n * value=\"\" // e.g. user typed string that is shown in search field\n * onSelect={onSelect}\n * onClear={onClear}\n * autoFocus={false} // defines that should this field be automatically focused when page is loaded.\n * lang={lang}\n * getAutoSuggestIcons={getAutoSuggestIcons}\n * transportMode={transportMode} // transportmode with which we filter the routes, e.g. route-BUS\n * geocodingSize={10} // defines how many stops and stations to fetch from geocoding. Useful if you want to filter the results and still get a reasonable amount of suggestions.\n * filterResults={results => return results} // Optional filtering function for routes and stops\n * handelViaPoints={() => return null } // Optional Via point handling logic. This is currently managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * focusChange={() => return null} // When suggestion is selected, handle changing focus. This is currently managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * storeRef={() => return null} // Functionality to store refs. Currenlty managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * sources={sources}\n * targets={targets}\n * isMobile // Optional. Defaults to false. Whether to use mobile search.\n * mobileLabel=\"Custom label\" // Optional. Custom label text for autosuggest field on mobile.\n * inputClassName=\"\" // Optional. Custom classname applied to the input element of the component for providing CSS styles.\n * translatedPlaceholder= // Optional. Custon translated placeholder text for autosuggest field.\n */\nclass DTAutosuggest extends React.Component {\n static propTypes = {\n appElement: PropTypes.string.isRequired,\n autoFocus: PropTypes.bool,\n className: PropTypes.string,\n icon: PropTypes.string,\n id: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n translatedPlaceholder: PropTypes.string,\n value: PropTypes.string,\n searchContext: PropTypes.shape({\n URL_PELIAS: PropTypes.string,\n // eslint-disable-next-line\n context: PropTypes.object,\n clearOldSearches: PropTypes.func,\n clearFutureRoutes: PropTypes.func,\n }).isRequired,\n ariaLabel: PropTypes.string,\n onSelect: PropTypes.func.isRequired,\n transportMode: PropTypes.string,\n filterResults: PropTypes.func,\n geocodingSize: PropTypes.number,\n onClear: PropTypes.func,\n storeRef: PropTypes.func,\n handleViaPoints: PropTypes.func,\n focusChange: PropTypes.func,\n lang: PropTypes.string,\n sources: PropTypes.arrayOf(PropTypes.string),\n targets: PropTypes.arrayOf(PropTypes.string),\n isMobile: PropTypes.bool,\n color: PropTypes.string,\n hoverColor: PropTypes.string,\n accessiblePrimaryColor: PropTypes.string,\n timeZone: PropTypes.string,\n pathOpts: PropTypes.shape({\n routesPrefix: PropTypes.string,\n stopsPrefix: PropTypes.string,\n }),\n mobileLabel: PropTypes.string,\n lock: PropTypes.func.isRequired,\n unlock: PropTypes.func.isRequired,\n refPoint: PropTypes.shape({\n address: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n }),\n inputClassName: PropTypes.string,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number,\n }),\n modeIconColors: PropTypes.objectOf(PropTypes.string),\n getAutoSuggestIcons: PropTypes.objectOf(PropTypes.func),\n required: PropTypes.bool,\n modeSet: PropTypes.string,\n showScroll: PropTypes.bool,\n isEmbedded: PropTypes.bool,\n };\n\n static defaultProps = {\n autoFocus: false,\n className: '',\n icon: undefined,\n value: '',\n transportMode: undefined,\n filterResults: undefined,\n onClear: undefined,\n lang: 'fi',\n storeRef: undefined,\n handleViaPoints: undefined,\n focusChange: undefined,\n getAutoSuggestIcons: undefined,\n sources: [],\n targets: undefined,\n isMobile: false,\n isEmbedded: false,\n geocodingSize: undefined,\n color: '#007ac9',\n hoverColor: '#0062a1',\n accessiblePrimaryColor: '#0074be',\n timeZone: 'Europe/Helsinki',\n pathOpts: {\n routesPrefix: 'linjat',\n stopsPrefix: 'pysakit',\n },\n ariaLabel: undefined,\n mobileLabel: undefined,\n inputClassName: '',\n translatedPlaceholder: undefined,\n fontWeights: {\n medium: 500,\n },\n modeIconColors: {\n 'mode-bus': '#007ac9',\n 'mode-rail': '#8c4799',\n 'mode-tram': '#008151',\n 'mode-metro': '#ed8c00',\n 'mode-ferry': '#007A97',\n 'mode-citybike': '#f2b62d',\n 'mode-funicular': '#ff00ff',\n },\n required: false,\n modeSet: undefined,\n showScroll: false,\n refPoint: {},\n };\n\n constructor(props) {\n super(props);\n Settings.defaultZone = props.timeZone;\n Settings.defaultLocale = props.lang;\n this.state = {\n value: props.value,\n suggestions: [],\n editing: false,\n valid: true,\n renderMobileSearch: false,\n sources: props.sources,\n ownPlaces: false,\n typingTimer: null,\n typing: false,\n pendingSelection: null,\n suggestionIndex: 0,\n cleanExecuted: false,\n scrollY: 0,\n };\n Object.keys(translations).forEach(lang => {\n i18next.addResourceBundle(lang, 'translation', translations[lang]);\n });\n }\n\n // DT-4074: When a user's location is updated DTAutosuggest would re-render causing suggestion list to reset.\n // This will prevent it.\n shouldComponentUpdate(nextProps, nextState) {\n return !isEqual(nextState, this.state) || !isEqual(nextProps, this.props);\n }\n\n componentDidUpdate() {\n if (i18next.language !== this.props.lang) {\n i18next.changeLanguage(this.props.lang);\n }\n }\n\n // eslint-disable-next-line camelcase\n UNSAFE_componentWillReceiveProps(nextProps) {\n // wait until address is set or geolocationing fails\n if (nextProps.value !== this.state.value && !this.state.editing) {\n this.setState({\n value: nextProps.value,\n });\n }\n }\n\n onChange = (event, { newValue, method }) => {\n const newState = {\n value: this.fInput || newValue || '',\n renderMobileSearch: this.props.isMobile,\n };\n // Remove filled input value so it wont be reused unnecessary\n this.fInput = null;\n if (!this.state.editing) {\n newState.editing = true;\n this.setState(newState, () =>\n this.fetchFunction({ value: newValue || '' }),\n );\n } else if (method !== 'enter' || this.state.valid) {\n // test above drops unnecessary update\n // when user hits enter but search is unfinished\n if (this.state.typingTimer) {\n clearTimeout(this.state.typingTimer);\n }\n if (method === 'type') {\n // after timeout runs, aria alert will announce current selection\n const timer = setTimeout(() => {\n this.setState({ typing: false });\n }, 1000);\n newState.typingTimer = timer;\n newState.typing = true;\n }\n this.setState(newState);\n }\n };\n\n onBlur = () => {\n if (this.state.editing) {\n this.input.focus();\n }\n this.setState({\n editing: false,\n renderMobileSearch: false,\n value: this.props.value,\n });\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n };\n\n onSelected = (e, ref) => {\n if (this.state.valid) {\n if (ref.suggestion.type === 'SelectFromOwnLocations') {\n this.setState(\n {\n sources: ['Favourite', 'Back'],\n ownPlaces: true,\n pendingSelection: ref.suggestion.type,\n value: '',\n },\n () => {\n this.fetchFunction({ value: '' });\n },\n );\n return;\n }\n if (\n ref.suggestion.type === 'back' ||\n ref.suggestion.type === 'FutureRoute'\n ) {\n this.setState(\n {\n sources: this.props.sources,\n ownPlaces: false,\n pendingSelection: ref.suggestion.type,\n suggestionIndex: ref.suggestionIndex,\n },\n () => {\n this.fetchFunction({ value: '' });\n },\n );\n return;\n }\n this.selectionDone = true; // selection done, do not let upcoming keyboard events confuse the flow\n this.setState(\n {\n editing: false,\n value: ref.suggestionValue,\n },\n () => {\n this.input.blur();\n if (this.props.handleViaPoints) {\n this.props.handleViaPoints(ref.suggestion, ref.suggestionIndex);\n } else {\n this.props.onSelect(ref.suggestion, this.props.id);\n }\n this.setState(\n {\n renderMobileSearch: false,\n sources: this.props.sources,\n ownPlaces: false,\n suggestions: [],\n },\n () => {\n this.selectionDone = false;\n },\n );\n if (\n this.props.focusChange &&\n (!this.props.isMobile || this.props.isEmbedded)\n ) {\n this.props.focusChange();\n }\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n },\n );\n } else {\n this.setState(\n prevState => ({\n pendingSelection: prevState.value,\n }),\n () => this.checkPendingSelection(), // search may finish during state change\n );\n }\n };\n\n onSuggestionsClearRequested = () => {\n this.setState({\n suggestions: [],\n sources: this.props.sources,\n ownPlaces: false,\n editing: false,\n });\n };\n\n checkPendingSelection = () => {\n if (\n (this.state.pendingSelection === 'SelectFromOwnLocations' ||\n this.state.pendingSelection === 'back') &&\n this.state.valid\n ) {\n this.setState(\n {\n pendingSelection: null,\n editing: true,\n },\n () => {\n this.input.focus();\n },\n );\n // accept after all ongoing searches have finished\n } else if (this.state.pendingSelection && this.state.valid) {\n // finish the selection by picking first = best match or with 'FutureRoute' by suggestionIndex\n this.setState(\n {\n pendingSelection: null,\n editing: false,\n },\n () => {\n if (this.state.suggestions.length) {\n this.input.blur();\n const item = this.state.suggestions[this.state.suggestionIndex];\n if (item.type !== 'back') {\n this.props.onSelect(\n this.state.suggestions[this.state.suggestionIndex],\n this.props.id,\n );\n }\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n if (\n this.props.focusChange &&\n (!this.props.isMobile || this.props.isEmbedded)\n ) {\n this.props.focusChange();\n }\n }\n },\n );\n }\n };\n\n clearButton = () => {\n return (\n <button\n type=\"button\"\n className={styles['clear-input']}\n onClick={this.clearInput}\n aria-label={i18next.t('clear-button-label')}\n >\n <Icon img=\"close\" color={this.props.color} />\n </button>\n );\n };\n\n fetchFunction = ({ value, cleanExecuted }) => {\n return this.setState(\n { valid: false, cleanExecuted: !cleanExecuted ? false : cleanExecuted },\n () => {\n if (this.selectionDone) {\n // do not let component cast unnecessary requests\n return;\n }\n const { targets } = this.props;\n const useAll = isEmpty(targets);\n const isLocationSearch =\n isEmpty(targets) || targets.includes('Locations');\n let newTargets;\n if (this.state.ownPlaces) {\n newTargets = ['Locations'];\n if (useAll || targets.includes('Stops')) {\n newTargets.push('Stops');\n }\n if (useAll || targets.includes('Stations')) {\n newTargets.push('Stations');\n }\n if (useAll || targets.includes('VehicleRentalStations')) {\n newTargets.push('VehicleRentalStations');\n }\n } else if (!useAll) {\n newTargets = [...targets];\n // in desktop, favorites are accessed via sub search\n if (\n isLocationSearch &&\n !this.props.isMobile &&\n (isEmpty(this.props.sources) ||\n this.props.sources.includes('Favourite'))\n ) {\n newTargets.push('SelectFromOwnLocations');\n }\n }\n // remove location favourites in desktop search (collection item replaces it in target array)\n const sources =\n this.state.sources &&\n this.state.sources.filter(\n s =>\n !(\n isLocationSearch &&\n s === 'Favourite' &&\n !this.state.ownPlaces &&\n !this.props.isMobile\n ),\n );\n\n executeSearch(\n newTargets,\n sources,\n this.props.transportMode,\n this.props.searchContext,\n this.props.filterResults,\n this.props.geocodingSize,\n {\n input: value || '',\n },\n searchResult => {\n if (searchResult == null) {\n return;\n }\n // XXX translates current location\n const suggestions = (searchResult.results || [])\n .filter(\n suggestion =>\n suggestion.type !== 'FutureRoute' ||\n (suggestion.type === 'FutureRoute' &&\n suggestion.properties.time >\n DateTime.now().toUnixInteger()),\n )\n .map(suggestion => {\n if (\n suggestion.type === 'CurrentLocation' ||\n suggestion.type === 'SelectFromMap' ||\n suggestion.type === 'SelectFromOwnLocations' ||\n suggestion.type === 'back'\n ) {\n const translated = { ...suggestion };\n translated.properties.labelId = i18next.t(\n suggestion.properties.labelId,\n );\n return translated;\n }\n return suggestion;\n });\n if (\n value === this.state.value ||\n value === this.state.pendingSelection ||\n this.state.pendingSelection === 'SelectFromOwnLocations' ||\n this.state.pendingSelection === 'back' ||\n this.state.pendingSelection === 'FutureRoute'\n ) {\n this.setState(\n {\n valid: true,\n suggestions,\n },\n () => this.checkPendingSelection(),\n );\n }\n },\n this.props.pathOpts,\n this.props.refPoint,\n );\n },\n );\n };\n\n clearInput = () => {\n const newState = {\n editing: true,\n value: '',\n sources: this.props.sources,\n ownPlaces: false,\n renderMobileSearch: this.props.isMobile,\n };\n // must update suggestions\n this.setState(newState, () =>\n this.fetchFunction({ value: '', cleanExecuted: true }),\n );\n if (this.props.onClear) {\n this.props.onClear(this.props.id);\n }\n this.input.focus();\n };\n\n inputClicked = inputValue => {\n this.input.focus();\n this.clearLocationText();\n if (this.props.isMobile) {\n this.props.lock();\n }\n if (!this.state.editing) {\n const newState = {\n editing: true,\n // reset at start, just in case we missed something\n pendingSelection: null,\n renderMobileSearch: this.props.isMobile,\n };\n\n // DT-3263: added stateKeyDown\n const stateKeyDown = {\n editing: true,\n pendingSelection: null,\n value: inputValue,\n };\n\n if (!this.state.suggestions.length) {\n // DT-3263: added if-else statement\n if (typeof inputValue === 'object' || !inputValue) {\n this.setState(newState, () =>\n this.fetchFunction({ value: this.state.value }),\n );\n } else {\n this.setState(stateKeyDown, () =>\n this.fetchFunction({ value: inputValue }),\n );\n }\n } else {\n this.fetchFunction({ value: this.state.value });\n this.setState(newState);\n }\n } else if (this.props.isMobile && !this.state.renderMobileSearch) {\n this.setState({ renderMobileSearch: true });\n }\n };\n\n storeInputReference = autosuggest => {\n if (autosuggest !== null) {\n this.input = autosuggest.input;\n if (this.props.storeRef) {\n this.props.storeRef(autosuggest.input);\n }\n }\n };\n\n // Fill input when user clicks fill input button in street suggestion item\n fillInput = newValue => {\n this.fInput = newValue.properties.name;\n const newState = {\n editing: true,\n value: newValue.properties.name,\n checkPendingSelection: newValue,\n valid: true,\n };\n // must update suggestions\n this.setState(newState);\n this.fetchFunction({ value: newValue.properties.name });\n this.input.focus();\n };\n\n renderItem = item => {\n const newItem =\n item.type === 'FutureRoute'\n ? {\n ...item,\n translatedText: translateFutureRouteSuggestionTime(item),\n }\n : item;\n const content = getSuggestionContent(item);\n return (\n <SuggestionItem\n item={newItem}\n content={content}\n loading={!this.state.valid}\n isMobile={this.props.isMobile}\n ariaFavouriteString={i18next.t('favourite')}\n color={this.props.color}\n accessiblePrimaryColor={this.props.accessiblePrimaryColor}\n fillInput={this.fillInput}\n fontWeights={this.props.fontWeights}\n getAutoSuggestIcons={this.props.getAutoSuggestIcons}\n modeIconColors={this.props.modeIconColors}\n modeSet={this.props.modeSet}\n />\n );\n };\n\n closeMobileSearch = () => {\n this.props.unlock();\n this.setState(\n {\n renderMobileSearch: false,\n value: this.props.value,\n },\n () => {\n window.scrollTo(0, this.state.scrollY);\n this.onSuggestionsClearRequested();\n },\n );\n this.input.focus();\n // This closes the mobile keyboard\n this.input.blur();\n };\n\n keyDown = event => {\n if (this.selectionDone) {\n return;\n }\n const keyCode = event.key;\n if (keyCode === 'Shift') {\n // This enables shift + tab to be used\n return;\n }\n if (keyCode === 'Escape') {\n // Using onBlur makes 'Escape' act similarly to using 'Tab'\n this.onBlur();\n }\n if (this.state.editing) {\n if (keyCode === 'Enter' && this.state.value !== '') {\n this.setState({ pendingSelection: true }, () => {\n this.fetchFunction({ value: this.state.value });\n });\n }\n this.inputClicked();\n return;\n }\n\n if (\n (keyCode === 'Enter' || keyCode === 'ArrowDown') &&\n this.state.value === ''\n ) {\n this.clearInput();\n return;\n }\n\n if (keyCode === 'ArrowDown' && this.state.value !== '') {\n const newState = {\n editing: true,\n value: this.state.value,\n };\n // must update suggestions\n this.setState(newState, () =>\n this.fetchFunction({ value: this.state.value }),\n );\n }\n if (!this.state.editing) {\n this.setState({ editing: true });\n this.clearLocationText();\n }\n\n if (keyCode === 'Tab') {\n this.onBlur();\n }\n };\n\n suggestionAsAriaContent = () => {\n let label = [];\n const firstSuggestion = this.state.suggestions[0];\n if (firstSuggestion) {\n if (firstSuggestion.type && firstSuggestion.type.includes('Favourite')) {\n label.push(i18next.t('favourite'));\n }\n label = label.concat(getSuggestionContent(this.state.suggestions[0]));\n }\n return [...new Set(label)].join(' - ');\n };\n\n clearOldSearches = () => {\n const { context, clearOldSearches, clearFutureRoutes } =\n this.props.searchContext;\n if (context && clearOldSearches) {\n clearOldSearches(context);\n if (clearFutureRoutes) {\n clearFutureRoutes(context);\n }\n this.fetchFunction({ value: this.state.value });\n }\n };\n\n isOriginDestinationOrViapoint = () =>\n this.props.id === 'origin' ||\n this.props.id === 'destination' ||\n this.props.id === 'via-point' ||\n this.props.id === 'origin-stop-near-you';\n\n clearLocationText = () => {\n const positions = [\n 'Valittu sijainti',\n 'Nykyinen sijaintisi',\n 'Current position',\n 'Selected location',\n 'Vald position',\n 'Använd min position',\n 'Min position',\n 'Käytä nykyistä sijaintia',\n 'Use current location',\n 'Your current location',\n 'Wybrane miejsce',\n ];\n if (positions.includes(this.state.value)) {\n this.clearInput();\n }\n };\n\n onFocus = () => {\n const scrollY = window.pageYOffset;\n return this.setState({ scrollY });\n };\n\n render() {\n if (i18next.language !== this.props.lang) {\n i18next.changeLanguage(this.props.lang);\n }\n const { value, suggestions, renderMobileSearch, cleanExecuted } =\n this.state;\n const inputProps = {\n placeholder: this.props.translatedPlaceholder\n ? this.props.translatedPlaceholder\n : i18next.t(this.props.placeholder),\n value,\n onChange: this.onChange,\n onBlur: this.onBlur,\n className: cx(\n `${styles.input} ${\n this.props.isMobile && this.props.transportMode ? styles.thin : ''\n } ${styles[this.props.id] || ''} ${\n this.state.value ? styles.hasValue : ''\n } ${this.props.inputClassName}`,\n ),\n onKeyDown: this.keyDown, // DT-3263\n required: this.props.required,\n };\n const ariaBarId = this.props.id.replace('searchfield-', '');\n let SearchBarId = this.props.ariaLabel || i18next.t(ariaBarId);\n SearchBarId = SearchBarId.replace('searchfield-', '').concat('.'); // Full stop makes screen reader speech clearer.\n const ariaRequiredText = this.props.required\n ? `${i18next.t('required')}.`\n : '';\n const ariaLabelInstructions = this.props.isMobile\n ? i18next.t('search-autosuggest-label-instructions-mobile')\n : i18next.t('search-autosuggest-label-instructions-desktop');\n const movingToDestinationFieldText =\n this.props.id === 'origin'\n ? i18next.t('search-autosuggest-label-move-to-destination')\n : '';\n const ariaLabelText = ariaLabelInstructions\n .concat(' ')\n .concat(movingToDestinationFieldText);\n\n const ariaSuggestionLen = i18next.t('search-autosuggest-len', {\n count: suggestions.length,\n });\n\n const ariaCurrentSuggestion = () => {\n if (this.suggestionAsAriaContent() || this.props.value) {\n return i18next.t('search-current-suggestion', {\n selection:\n this.suggestionAsAriaContent().toLowerCase() || this.props.value,\n });\n }\n return '';\n };\n\n return (\n <React.Fragment>\n <span className={styles['sr-only']} role=\"alert\">\n {!this.state.typing &&\n this.state.editing &&\n `${ariaSuggestionLen} ${ariaCurrentSuggestion()}`}\n </span>\n {this.props.isMobile && (\n <MobileSearch\n searchOpen={renderMobileSearch}\n appElement={this.props.appElement}\n clearOldSearches={this.clearOldSearches}\n id={this.props.id}\n clearInput={this.clearInput}\n value={this.state.value}\n suggestions={[\n ...suggestions,\n {\n type: 'clear-search-history',\n labelId: i18next.t('clear-search-history'),\n },\n ]}\n inputProps={{\n ...inputProps,\n placeholder: this.isOriginDestinationOrViapoint()\n ? i18next.t('address-place-or-business')\n : inputProps.placeholder,\n }}\n fetchFunction={this.fetchFunction}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={this.renderItem}\n closeHandle={this.closeMobileSearch}\n ariaLabel={ariaRequiredText\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaCurrentSuggestion())}\n label={\n this.props.mobileLabel\n ? this.props.mobileLabel\n : i18next.t(this.props.id)\n }\n onSuggestionSelected={this.onSelected}\n dialogHeaderText={i18next.t('delete-old-searches-header')}\n dialogPrimaryButtonText={i18next.t('delete')}\n dialogSecondaryButtonText={i18next.t('cancel')}\n clearInputButtonText={i18next.t('clear-button-label')}\n focusInput={cleanExecuted}\n color={this.props.color}\n hoverColor={this.props.hoverColor}\n accessiblePrimaryColor={this.props.accessiblePrimaryColor}\n fontWeights={this.props.fontWeights}\n showScroll={this.props.showScroll}\n />\n )}\n {!renderMobileSearch && (\n <div\n className={cx([\n styles['autosuggest-input-container'],\n styles[this.props.id],\n ])}\n style={{\n '--color': `${this.props.color}`,\n '--hover-color': `${this.props.hoverColor}`,\n }}\n >\n {this.props.icon && (\n <div\n className={cx([\n styles[`autosuggest-input-icon`],\n styles[this.props.id],\n this.props.inputClassName &&\n `${this.props.inputClassName}-input-icon`,\n ])}\n aria-label={ariaRequiredText\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(i18next.t('search-autosuggest-label'))}\n >\n <Icon img={`${this.props.icon}`} />\n </div>\n )}\n <Autosuggest\n alwaysRenderSuggestions={this.state.editing}\n id={this.props.id}\n suggestions={suggestions}\n onSuggestionsFetchRequested={this.fetchFunction}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={this.renderItem}\n inputProps={{\n ...inputProps,\n onFocus: this.onFocus,\n }}\n focusInputOnSuggestionClick\n shouldRenderSuggestions={() => this.state.editing}\n highlightFirstSuggestion={!this.state.ownPlaces}\n theme={styles}\n renderInputComponent={p => (\n <>\n <label className={styles['sr-only']} htmlFor={this.props.id}>\n {ariaCurrentSuggestion()\n .concat(' ')\n .concat(ariaRequiredText)\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaLabelText)}\n </label>\n <input\n aria-label={ariaCurrentSuggestion()\n .concat(' ')\n .concat(ariaRequiredText)\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaLabelText)}\n id={this.props.id}\n onClick={this.inputClicked}\n onKeyDown={this.keyDown}\n {...p}\n />\n {this.state.value && this.clearButton()}\n </>\n )}\n onSuggestionSelected={this.onSelected}\n ref={this.storeInputReference}\n />\n </div>\n )}\n </React.Fragment>\n );\n }\n}\n\nconst DTAutosuggestWithScrollLock = withScrollLock(DTAutosuggest);\n\nexport default DTAutosuggestWithScrollLock;\n","import { getNameLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\n/**\n * Returns label for properties\n *\n * @name getLabel\n * @param {*} properties object\n * @returns {Boolean} true/false\n */\nexport default function getLabel(properties) {\n const parts = getNameLabel(properties, true);\n switch (properties.layer) {\n case 'selectFromMap':\n case 'currentPosition':\n case 'ownLocations':\n case 'back':\n return parts[1] || parts[0];\n case 'favouriteVehicleRentalStation':\n case 'favouritePlace':\n return parts[0];\n default:\n return parts.length > 1 && parts[1] !== ''\n ? parts.join(', ')\n : parts[1] || parts[0];\n }\n}\n","import React from 'react';\nimport hooks from '@hsl-fi/hooks';\n\nconst withScrollLock = Component => {\n return props => {\n const { lock, unlock } = hooks.useScrollLock();\n\n return <Component lock={lock} unlock={unlock} {...props} />;\n };\n};\n\nexport default withScrollLock;\n"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPropertyKey","t","i","r","e","toPrimitive","call","TypeError","String","Number","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","truEq","val1","val2","gtfsStopLayers","vehicleRentalLayers","labelIdToGid","id","parts","split","length","isDuplicate","item1","item2","props1","properties","props2","type","o1","origin","d1","destination","o2","d2","name","localadmin","includes","layer","gid","labelId","gtfsId","p1","geometry","coordinates","undefined","p2","Math","abs","label","address","normalize","str","isString","toLowerCase","LayerType","isStop","getLayerRank","source","indexOf","sortSearchResults","lineRegexp","results","term","Array","isArray","isLineIdentifier","test","normalizedTerm","isLineSearch","orderedResults","orderBy","result","shortName","confidence","match","resultProperties","map","filter","normalizedValue","reduce","previous","current","uniqWith","getStopName","stopCode","lastIndexOf","substring","filterMatchingToInput","list","Input","fields","input","trim","multiWord","item","forEach","pName","get","splice","join","concat","replace","serialize","obj","prefix","keys","p","k","v","encodeURIComponent","axios","require","default","getJson","url","params","encodeURI","search","timeout","method","headers","Accept","then","res","data","getGeocodingResults","searchString","searchParams","lang","focusPoint","sources","peliasUrl","minimalRegexp","geocodingLayers","text","Promise","resolve","PELIAS_URL","opts","_objectSpread","layers","toString","features","getStopsFromGeocoding","stops","URL_PELIAS_PLACE","gids","stopStationMap","stop","code","stopOrStation","ids","slice","addendum","lastUpdated","favouriteId","filterOldSearches","oldSearches","dropLayers","matchingOldSearches","take","newItem","timetableClicked","arrowClicked","routeLayers","locationLayers","parkingLayers","stopLayers","debouncedSearch","debounce","targets","transportMode","searchContext","filterResults","geocodingSize","callback","pathOpts","refPoint","getPositions","getFavouriteLocations","getOldSearches","getFavouriteStops","parkingAreaSources","getLanguage","getStopAndStationsQuery","getFavouriteVehicleRentalStationsQuery","getFavouriteVehicleRentalStations","getFavouriteRoutesQuery","getFavouriteRoutes","getRoutesQuery","context","isPeliasLocationAware","locationAware","URL_PELIAS","feedIDs","geocodingSearchParams","geocodingSources","getFutureRoutes","cityBikeNetworks","allTargets","allSources","position","searchComponents","searches","language","lat","lon","toFixed","mode","status","push","getCurrentPositionIfEmpty","selectPositionFomMap","items","favouriteLocations","favouriteVehicleRentalStations","favouriteStops","hasFavourites","selectFromOwnLocations","favourites","filterFavouriteLocations","locationHistory","size","feedIds","history","useStops","useStations","stopsAndStations","every","stopsStations","s","filterFavouriteStops","dedupestops","feeds","stopHistory","favouriteRoutes","routeHistory","favouriteVehicleRentalStation","all","flatten","catch","err","error","leading","getLocaladmin","suggestion","getStopCode","getNameLabel","memoize","plain","RegExp","escapeRegExp","longName","agency","formatFavouritePlaceLabel","cloneDeep","translations","de","airplane","arrival","back","bikerentalstation","bus","cancel","currentposition","delete","departure","favourite","ferry","ownlocations","loading","rail","street","subway","station","tram","venue","where","place","en","bikepark","carpark","platform","required","track","fi","vehiclerentalstation","pl","sv","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","AutosuggestPatch","Autosuggest","props","super","self","this","onSuggestionTouchMove","justSelectedSuggestion","pressedSuggestion","MobileSearch","appElement","closeHandle","clearInput","suggestions","inputProps","fetchFunction","renderSuggestion","getSuggestionValue","ariaLabel","onSuggestionSelected","clearOldSearches","dialogHeaderText","dialogPrimaryButtonText","dialogSecondaryButtonText","clearInputButtonText","focusInput","color","hoverColor","accessiblePrimaryColor","searchOpen","fontWeights","showScroll","_inputRef$current","styles","mobileStyles","mobileNoScrollStyles","inputId","isDialogOpen","setDialogOpen","useState","inputRef","React","useRef","useEffect","ReactModal","setAppElement","onClose","useCallback","onSelect","isKeyboardSelectionEvent","event","key","which","keyCode","preventDefault","getValue","renderItem","className","focus","isOpen","overlayClassName","onAfterClose","shouldCloseOnEsc","medium","htmlFor","onClick","onKeyDown","tabIndex","Icon","img","alwaysRenderSuggestions","onSuggestionsFetchRequested","focusInputOnSuggestionClick","shouldRenderSuggestions","hasValue","autoFocus","renderInputComponent","Fragment","assign","theme","DialogModal","isModalOpen","handleClose","headerText","primaryButtonText","secondaryButtonText","primaryButtonOnClick","secondaryButtonOnClick","process","env","NODE_ENV","propTypes","PropTypes","string","isRequired","func","arrayOf","object","shape","onChange","onBlur","placeholder","bool","number","defaultProps","module","exports","require$$0","n","g","window","ignore","header","topOnEmptyHash","speed","speedAsDuration","durationMax","durationMin","clip","offset","easing","customEasing","updateURL","popstate","emitEvents","arguments","hasOwnProperty","charAt","substr","u","charCodeAt","InvalidCharacterError","max","body","scrollHeight","documentElement","offsetHeight","clientHeight","parseInt","getComputedStyle","height","offsetTop","activeElement","setAttribute","outline","scrollTo","CustomEvent","bubbles","detail","anchor","toggle","dispatchEvent","c","a","l","f","d","cancelScroll","cancelAnimationFrame","animateScroll","h","m","tagName","y","pageYOffset","querySelector","b","w","E","O","offsetParent","min","innerHeight","S","_","I","M","L","floor","requestAnimationFrame","pushState","smoothScroll","JSON","stringify","title","matchMedia","matches","defaultPrevented","button","metaKey","ctrlKey","shiftKey","target","closest","hostname","location","pathname","href","decodeURIComponent","hash","replaceState","state","destroy","removeEventListener","Element","addEventListener","apply","__createBinding","create","__exportStar","useArrowNavigation","listItems","onArrowUpOrDown","selectedIndex","useDebounce","setTimeout","clearTimeout","useElementSize","width","clientWidth","useIntersectionObserver","isIntersecting","IntersectionObserver","observe","unobserve","containerRef","isVisible","useIsBreakpoint","xs","mobileSmall","mobile","tablet","tabletLarge","desktopSmall","desktop","desktopLarge","innerWidth","useOnResize","useIsLoadingAfterError","useIsMobile","useIsomorphicLayoutEffect","useLayoutEffect","useOnLoseFocusWithin","watch","passive","useOnWindowFocus","visibilityState","useOutsideReacter","contains","useRunAfterUpdate","useScrollLock","lock","scrollY","top","unlock","__importDefault","__esModule","useSmoothScroll","globalThis","Function","Settings","defaultLocale","i18next__default","init","fallbackLng","defaultNS","interpolation","escapeValue","node","getPlatform","GTFS","modes","i18next","getSuggestionContent","suggestionType","_item$properties$adde","tail1","locality","tail2","name1","name2","translatedText","translateFutureRouteSuggestionTime","time","DateTime","fromSeconds","now","arriveBy","hasSame","plus","days","toFormat","getLabel","DTAutosuggest","Component","newValue","newState","fInput","renderMobileSearch","isMobile","editing","valid","typingTimer","timer","setState","typing","closeMobileSearch","ownPlaces","pendingSelection","suggestionIndex","selectionDone","suggestionValue","blur","handleViaPoints","focusChange","isEmbedded","prevState","checkPendingSelection","cleanExecuted","useAll","isEmpty","isLocationSearch","newTargets","executeSearch","searchResult","toUnixInteger","translated","onClear","inputValue","clearLocationText","stateKeyDown","autosuggest","storeRef","content","SuggestionItem","ariaFavouriteString","fillInput","getAutoSuggestIcons","modeIconColors","modeSet","onSuggestionsClearRequested","inputClicked","firstSuggestion","Set","clearFutureRoutes","defaultZone","timeZone","addResourceBundle","shouldComponentUpdate","nextProps","nextState","isEqual","componentDidUpdate","changeLanguage","UNSAFE_componentWillReceiveProps","render","translatedPlaceholder","thin","inputClassName","keyDown","ariaBarId","SearchBarId","ariaRequiredText","ariaLabelInstructions","movingToDestinationFieldText","ariaLabelText","ariaSuggestionLen","count","ariaCurrentSuggestion","suggestionAsAriaContent","selection","role","isOriginDestinationOrViapoint","mobileLabel","onSelected","cx","icon","onFocus","highlightFirstSuggestion","clearButton","storeInputReference","routesPrefix","stopsPrefix","objectOf","DTAutosuggestWithScrollLock","hooks"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../../digitransit-search-util/packages/digitransit-search-util-tru-eq/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-is-duplicate/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-helpers/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-filter-matching-to-input/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-serialize/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-json/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-geocoding-results/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../src/helpers/translations.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/MobileSearch.js","../../../../node_modules/@hsl-fi/hooks/lib/index.js","../src/index.js","../../../../digitransit-search-util/packages/digitransit-search-util-get-label/index.js","../src/helpers/withScrollLock.js"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","/**\n * accept equality of non nullish values\n *\n * @name truEq\n * @param {Boolean|Number|BigInt|String|Symbol|Object} val1 First value to be compared\n * @param {Boolean|Number|BigInt|String|Symbol|Object} param2 Second value to be compared\n * @returns {Boolean} true/false\n * @example\n * digitransit-util.truEq('2', '2');\n * //=true\n */\nexport default function truEq(val1, val2) {\n return val1 && val2 && val1 === val2;\n}\n","import truEq from '@digitransit-search-util/digitransit-search-util-tru-eq';\n/**\n * Checks that is items duplicate\n *\n * @name isDuplicate\n * @param {Object} item1 Object containing following attributes:\n * {\n * properties {\n * gtfsId: String\n * gid: String from geocoder\n * name: String\n * label: String\n * address: String\n * geometry {\n * coordinates [Number lat, Number lon]\n * }\n * }\n * }\n * @param {Object} item2 Object with same attributes as item1\n * @returns {Boolean} true/false\n * @example\n * digitransit-util.isDuplicate(param1, param2);\n * //=true\n */\n\nconst gtfsStopLayers = ['stop', 'station', 'favouriteStop', 'favouriteStation'];\nconst vehicleRentalLayers = ['favouriteVehicleRentalStation', 'bikestation'];\n\nfunction labelIdToGid(id) {\n if (!id) {\n return '';\n }\n const parts = id.split(':');\n if (parts.length === 0) {\n return '';\n }\n return `citybikes${parts[0]}:bikestation:${parts[1]}`;\n}\n\nexport default function isDuplicate(item1, item2) {\n const props1 = item1.properties;\n const props2 = item2.properties;\n\n if (item1.type === 'FutureRoute' && item2.type === 'FutureRoute') {\n const o1 = props1.origin;\n const d1 = props1.destination;\n const o2 = props2.origin;\n const d2 = props2.destination;\n\n const name1 = `${o1.name}//${o1.localadmin}//${d1.name}//${d1.localadmin}`;\n const name2 = `${o2.name}//${o2.localadmin}//${d2.name}//${d2.localadmin}`;\n\n return name1 === name2;\n }\n if (item1.type === 'FutureRoute' || item2.type === 'FutureRoute') {\n return false;\n }\n if (\n vehicleRentalLayers.includes(props1.layer) &&\n vehicleRentalLayers.includes(props2.layer)\n ) {\n const id1 = props1.gid || labelIdToGid(props1.labelId);\n const id2 = props2.gid || labelIdToGid(props2.labelId);\n return id1 === id2;\n }\n if (props1.gtfsId && props2.gtfsId) {\n return props1.gtfsId === props2.gtfsId;\n }\n if (\n gtfsStopLayers.includes(props1.layer) &&\n gtfsStopLayers.includes(props2.layer) &&\n props1.gid &&\n props2.gid\n ) {\n return props1.gid === props2.gid;\n }\n\n const p1 = item1 && item1.geometry ? item1.geometry.coordinates : undefined;\n const p2 = item2 && item2.geometry ? item2.geometry.coordinates : undefined;\n\n if (p1 && p2) {\n // both have geometry\n if (Math.abs(p1[0] - p2[0]) < 1e-6 && Math.abs(p1[1] - p2[1]) < 1e-6) {\n // location match is not enough. Require a common property\n if (\n truEq(props1.name, props2.name) ||\n truEq(props1.label, props2.label) ||\n truEq(props1.address, props2.address) ||\n truEq(props1.address, props2.label) ||\n truEq(props1.label, props2.address)\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","import isString from 'lodash/isString';\nimport orderBy from 'lodash/orderBy';\nimport uniqWith from 'lodash/uniqWith';\nimport isDuplicate from '@digitransit-search-util/digitransit-search-util-is-duplicate';\n\nconst normalize = str => {\n if (!isString(str)) {\n return '';\n }\n return str.toLowerCase();\n};\n\n/**\n * This takes the sorted search results as input and moves results that end in letters first\n * among results with the same short name length.\n */\nconst orderResultsWithLettersFirst = sortedSearchResults => {\n let orderedResultsWithLettersFirst = [];\n\n let i = 0;\n let currentLength = 0;\n let letterArray = [];\n let numberArray = [];\n while (i < sortedSearchResults.length) {\n if (\n currentLength !== sortedSearchResults[i].properties?.shortName?.length\n ) {\n orderedResultsWithLettersFirst = orderedResultsWithLettersFirst.concat(\n letterArray,\n numberArray,\n );\n currentLength = sortedSearchResults[i].properties?.shortName?.length;\n letterArray = [];\n numberArray = [];\n }\n // Global isNaN and Number.isNaN have different functionality.\n // eslint-disable-next-line no-restricted-globals\n if (isNaN(sortedSearchResults[i].properties?.shortName?.slice(-1))) {\n letterArray.push(sortedSearchResults[i]);\n } else {\n numberArray.push(sortedSearchResults[i]);\n }\n i += 1;\n }\n orderedResultsWithLettersFirst = orderedResultsWithLettersFirst.concat(\n letterArray,\n numberArray,\n );\n\n return orderedResultsWithLettersFirst;\n};\n\n/**\n * LayerType depicts the type of the point-of-interest.\n */\nconst LayerType = {\n Address: 'address',\n Back: 'back',\n CurrentPosition: 'currentPosition',\n FavouriteStop: 'favouriteStop',\n FavouriteStation: 'favouriteStation',\n FavouritePlace: 'favouritePlace',\n FavouriteRoute: 'favouriteRoute',\n FavouriteVehicleRentalStation: 'favouriteVehicleRentalStation',\n FutureRoute: 'futureRoute',\n Station: 'station',\n SelectFromMap: 'selectFromMap',\n SelectFromOwnLocations: 'ownLocations',\n Stop: 'stop',\n Street: 'street',\n Venue: 'venue',\n VehicleRentalStation: 'bikestation',\n CarPark: 'carpark',\n BikePark: 'bikepark',\n};\nexport const isStop = ({ layer, type }) =>\n layer === 'stop' ||\n layer === 'favouriteStop' ||\n type === 'stop' ||\n type === 'favouriteStop';\n\nconst DEFAULT_ROUTES_PREFIX = 'linjat';\nconst DEFAULT_STOPS_PREFIX = 'pysakit';\n\nexport const mapRoute = (item, pathOpts) => {\n if (item === null || item === undefined) {\n return null;\n }\n\n const opts = pathOpts || {};\n\n const routesPrefix = opts.routesPrefix || DEFAULT_ROUTES_PREFIX;\n const stopsPrefix = opts.stopsPrefix || DEFAULT_STOPS_PREFIX;\n\n const link = `/${routesPrefix}/${item.gtfsId}/${stopsPrefix}`;\n return {\n type: 'Route',\n properties: {\n ...item,\n layer: `route-${item.mode}`,\n link,\n },\n geometry: {\n coordinates: null,\n },\n };\n};\n\n/**\n * Tries to match the given search term agains the collection of properties\n * for a geocoding result. The best match will be returned (min: 0, max: 1.5).\n *\n * @param {string} normalizedTerm the normalized search term.\n * @param {*} resultProperties the geocoding result's property collection.\n */\nexport const match = (normalizedTerm, resultProperties) => {\n if (!isString(normalizedTerm) || normalizedTerm.length === 0) {\n return 0;\n }\n\n const matchProps = ['name', 'label', 'address', 'shortName'];\n return matchProps\n .map(name => resultProperties[name])\n .filter(value => isString(value) && value.length > 0)\n .map(value => {\n const normalizedValue = normalize(value);\n if (normalizedValue.indexOf(normalizedTerm) === 0) {\n // full match at start. Return max result when match is full, not only partial\n return 0.5 + normalizedTerm.length / normalizedValue.length;\n }\n // because of filtermatchingtoinput, we know that match occurred somewhere\n // don't run filtermatching again but estimate roughly:\n // the longer the matching string, the better confidence, max being 0.5\n return (0.5 * normalizedTerm.length) / (normalizedTerm.length + 1);\n })\n .reduce(\n (previous, current) => (current > previous ? current : previous),\n 0,\n );\n};\n\n/**\n * Ranks the result based on its layer property.\n *\n * @param {string} layer the layer property.\n * @param {string} source the source property.\n */\nexport const getLayerRank = (layer, source) => {\n switch (layer) {\n case LayerType.CurrentPosition:\n return 1;\n case LayerType.Back:\n return 0.9;\n case LayerType.SelectFromMap:\n return 0.8;\n case LayerType.SelectFromOwnLocations:\n return 0.79;\n case LayerType.FavouriteStation:\n case LayerType.FavouritePlace:\n case LayerType.FavouriteStop:\n case LayerType.FavouriteRoute:\n case LayerType.FavouriteVehicleRentalStation:\n return 0.45;\n case LayerType.FutureRoute:\n return 0.44;\n case LayerType.Station: {\n if (isString(source) && source.indexOf('gtfs') === 0) {\n return 0.43;\n }\n return 0.42;\n }\n case LayerType.CarPark:\n return 0.38;\n case LayerType.BikePark:\n return 0.38;\n case LayerType.VehicleRentalStation:\n return 0.38;\n case LayerType.Stop:\n return 0.36;\n default:\n // venue, address, street, route-xxx\n return 0.41;\n }\n};\n\n/**\n * Helper function to sort the results. Orders as follows:\n * - current position first for an empty search\n * - matching routes first\n * - otherwise by confidence, except that:\n * - boost well matching stations (especially from GTFS)\n * - rank stops lower as they tend to occupy most of the search results\n * - items with no confidence (old searches and favorites):\n * - rank favourites better than ordinary old searches\n * - rank full match better than partial match\n * - rank match at middle word lower than match at the beginning\n * - rank bike rental stations lower\n * @param {*[]} results The search results that were received\n * @param {String} term The search term that was used\n */\nexport const sortSearchResults = (lineRegexp, results, term = '') => {\n if (!Array.isArray(results)) {\n return results;\n }\n const isLineIdentifier = value =>\n isString(value) && lineRegexp && lineRegexp.test(value);\n\n const normalizedTerm = normalize(term);\n const isLineSearch = isLineIdentifier(normalizedTerm);\n\n const orderedResults = orderBy(\n results,\n [\n // rank matching routes best\n result =>\n isLineSearch &&\n isLineIdentifier(normalize(result.properties.shortName)) &&\n normalize(result.properties.shortName).indexOf(normalizedTerm) === 0\n ? 1\n : 0,\n\n result => {\n const { confidence, layer, source } = result.properties;\n if (normalizedTerm.length === 0) {\n // Doing search with empty string.\n // No confidence to match, so use ranked old searches and favourites\n return getLayerRank(layer, source);\n }\n\n // must handle a mixup of geocoder searches and items above\n // Normal confidence range from geocoder is about 0.3 .. 1\n if (!confidence) {\n // not from geocoder, estimate confidence ourselves\n return (\n getLayerRank(layer, source) +\n match(normalizedTerm, result.properties)\n );\n }\n // geocoded items with confidence, just adjust a little\n switch (layer) {\n case LayerType.Station: {\n const boost = source.indexOf('gtfs') === 0 ? 0.02 : 0.01;\n return confidence + boost;\n }\n case LayerType.Stop:\n return confidence - 0.05;\n case LayerType.CarPark:\n return confidence - 0.05;\n case LayerType.BikePark:\n return confidence - 0.05;\n case LayerType.VehicleRentalStation:\n return confidence - 0.04;\n default:\n return confidence;\n }\n },\n 'properties.shortName',\n 'properties.longName',\n ],\n ['desc', 'desc', 'asc', 'asc'],\n );\n\n return uniqWith(orderResultsWithLettersFirst(orderedResults), isDuplicate);\n};\n\n/**\n * Parses stop's name without stop code from a stop name from geocoding results\n *\n * @param {string} label stop's name from geocoding results.\n * @param {string} stopCode stop code.\n */\nexport const getStopName = (name, stopCode) => {\n if (\n stopCode !== undefined &&\n stopCode !== null &&\n name.lastIndexOf(stopCode) !== -1\n ) {\n return name.substring(0, name.lastIndexOf(stopCode) - 1);\n }\n return name;\n};\n","import get from 'lodash/get';\n\n/**\n * Function that filters list matching to input.\n *\n * @name filterMatchingToInput\n * @param {Array} list List containin objects e.g( {\n * type: 'Feature'\n * properties: {\n * label: 'testaddress4',\n * layer: 'address',\n * name: 'testaddress4',\n * },\n * geometry: { coordinates: [lon, lat] },\n * },)\n * @param {String} Input Input given for filtering the list\n * @param {Array} fields List of fields that list is filtered by e.g ([properties.label, properties.name])\n * @returns {Array} Filtered Array.\n * @example\n * digitransit-util.filterMatchingToInput([{type: feature, properties { ... name: testaddress4 } ... }], 'testaddress4', 'properties.name');\n * //= List containing object with given name.\n */\nexport default function filterMatchingToInput(list, Input, fields) {\n if (typeof Input === 'string' && Input.length > 0) {\n const input = Input.toLowerCase().trim();\n const multiWord = input.includes(' ') || input.includes(',');\n return list.filter(item => {\n let parts = [];\n fields.forEach(pName => {\n let value = get(item, pName);\n\n if (\n !multiWord &&\n (pName === 'properties.label' || pName === 'address') &&\n value\n ) {\n // special case: drop last parts i.e. city and neighbourhood\n value = value.split(',');\n if (value.length > 2) {\n value.splice(value.length - 2, 2);\n } else if (value.length > 1) {\n value.splice(value.length - 1, 1);\n }\n value = value.join(',');\n }\n if (value) {\n if (multiWord) {\n parts = parts.concat(value.toLowerCase());\n } else {\n parts = parts.concat(\n value.toLowerCase().replace(/,/g, ' ').split(' '),\n );\n }\n }\n });\n for (let i = 0; i < parts.length; i++) {\n if (parts[i].indexOf(input) === 0) {\n // accept match only at word start\n return true;\n }\n }\n return false;\n });\n }\n\n return list;\n}\n","/**\n * Serializes objects\n *\n * @name serialize\n * @param {Object} obj Object to be serialized\n * @param {Any} prefix\n * @returns {String} Serialized object\n * @example\n * digitransit-search-util.serialize(param1, param2);\n * //=true\n */\nexport default function serialize(obj, prefix) {\n if (!obj) {\n return '';\n }\n return Object.keys(obj)\n .map(p => {\n const k = prefix || p;\n const v = obj[p];\n\n return typeof v === 'object'\n ? serialize(v, k)\n : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`;\n })\n .join('&');\n}\n","import serialize from '@digitransit-search-util/digitransit-search-util-serialize';\n/**\n * Return Promise for a url json get request\n *\n * @name getJson\n * @param {String} url\n * @param {Array} params\n * @returns {Object} response\n * @example\n * digitransit-search-util.getJson(param1, param2);\n * //=response\n */\nconst axios = require('axios').default;\n\nexport default function getJson(url, params) {\n return axios\n .get(\n encodeURI(url) +\n (params\n ? (url.search(/\\?/) === -1 ? '?' : '&') + serialize(params)\n : ''),\n {\n timeout: 10000,\n method: 'GET',\n\n headers: {\n Accept: 'application/json',\n },\n },\n )\n .then(res => {\n return res.data;\n });\n}\n","import getJson from '@digitransit-search-util/digitransit-search-util-get-json';\n\nconst DEFAULT_PELIAS_URL = 'https://api.digitransit.fi/geocoding/v1/search';\n/**\n * <DESCRIPTION>\n *\n * @name getGeocodingResults\n * @param {String} searchString\n * @param {String} searchParams (Optional) Parameters appended to url, basically box / polygon to restrict search area\n * @param {String} lang (Optional) search language\n * @param {Object} focusPoint (Optional) Own Position (PELIAS API)\n * @param {String} sources (Optional) search sources (e.g OSM, GTFS..)\n * @param {Object} minimalRegexp (Optional) Regexp for testing\n * @param {*} geocodingLayers (Optional) Array of strings that is used to determine which layers is searched, e.g. ['venue', 'address', 'stop']\n * @returns {String} Results in JSON form\n * @example\n * digitransit-search-util.getGeocodingResults(\"result\");\n * //= e.g. {text:\"result\"}\n */\nexport default function getGeocodingResults(\n searchString,\n searchParams,\n lang,\n focusPoint,\n sources,\n peliasUrl,\n minimalRegexp,\n geocodingLayers,\n) {\n const text = searchString ? searchString.trim() : null;\n if (\n text === undefined ||\n text === null ||\n text.length < 1 ||\n (minimalRegexp && !minimalRegexp.test(text))\n ) {\n return Promise.resolve([]);\n }\n const PELIAS_URL = peliasUrl || DEFAULT_PELIAS_URL;\n let opts = { text, ...searchParams, ...focusPoint, lang };\n if (sources) {\n opts = { ...opts, sources };\n }\n if (geocodingLayers) {\n const layers = geocodingLayers.toString();\n opts = { ...opts, layers };\n }\n return getJson(PELIAS_URL, opts).then(res => {\n return res.features;\n });\n}\n","import debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport take from 'lodash/take';\nimport {\n sortSearchResults,\n isStop,\n} from '@digitransit-search-util/digitransit-search-util-helpers';\nimport filterMatchingToInput from '@digitransit-search-util/digitransit-search-util-filter-matching-to-input';\nimport getGeocodingResults from '@digitransit-search-util/digitransit-search-util-get-geocoding-results';\nimport getJson from '@digitransit-search-util/digitransit-search-util-get-json';\n\nfunction getStopsFromGeocoding(stops, URL_PELIAS_PLACE) {\n if (!stops || stops.length < 1) {\n return Promise.resolve([]);\n }\n let gids = '';\n const stopsWithGids = stops.map(stop => {\n const type = stop.type === 'stop' ? 'stop' : 'station';\n let gid = `gtfs${stop.gtfsId.split(':')[0].toLowerCase()}:${type}:GTFS:${\n stop.gtfsId\n }`;\n if (stop.code) {\n gid += `#${stop.code}`;\n }\n gids += `${gid},`;\n return { ...stop, gid };\n });\n const stopStationMap = stopsWithGids.reduce(function redu(\n map,\n stopOrStation,\n ) {\n // eslint-disable-next-line no-param-reassign\n map[stopOrStation.gid] = stopOrStation;\n return map;\n }, {});\n return getJson(URL_PELIAS_PLACE, {\n ids: gids.slice(0, -1),\n // lang: context.getStore('PreferencesStore').getLanguage(), TODO enable this when OTP supports translations\n }).then(res => {\n return res.features.map(stop => {\n const favourite = {\n type: 'FavouriteStop',\n properties: {\n addendum: stop.properties.addendum,\n gid: stopStationMap[stop.properties.gid].gid,\n code: stopStationMap[stop.properties.gid].code,\n gtfsId: stopStationMap[stop.properties.gid].gtfsId,\n lastUpdated: stopStationMap[stop.properties.gid].lastUpdated,\n favouriteId: stopStationMap[stop.properties.gid].favouriteId,\n address: stop.properties.label,\n layer: isStop(stop.properties) ? 'favouriteStop' : 'favouriteStation',\n },\n geometry: stop.geometry,\n };\n return favourite;\n });\n });\n}\nfunction filterFavouriteLocations(favourites, input) {\n return Promise.resolve(\n filterMatchingToInput(favourites, input, ['address', 'name']).map(item => ({\n type: 'FavouritePlace',\n properties: {\n ...item,\n label: item.name,\n layer: 'favouritePlace',\n },\n geometry: { type: 'Point', coordinates: [item.lon, item.lat] },\n })),\n );\n}\nfunction selectPositionFomMap(input) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'SelectFromMap',\n address: 'SelectFromMap',\n lat: null,\n lon: null,\n properties: {\n labelId: 'select-from-map',\n layer: 'selectFromMap',\n address: 'SelectFromMap',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n }\n return Promise.resolve([]);\n}\n\nfunction getCurrentPositionIfEmpty(input, position) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'CurrentLocation',\n address: position.address,\n lat: position.lat,\n lon: position.lon,\n properties: {\n labelId: 'use-own-position',\n layer: 'currentPosition',\n address: position.address,\n lat: position.lat,\n lon: position.lon,\n },\n geometry: {\n type: 'Point',\n coordinates: [position.lon, position.lat],\n },\n },\n ]);\n }\n\n return Promise.resolve([]);\n}\n\nfunction selectFromOwnLocations(input) {\n if (typeof input !== 'string' || input.length === 0) {\n return Promise.resolve([\n {\n type: 'SelectFromOwnLocations',\n address: 'SelectFromOwnLocations',\n lat: null,\n lon: null,\n properties: {\n labelId: 'select-from-own-locations',\n layer: 'ownLocations',\n address: 'selectFromOwnLocations',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n }\n return Promise.resolve([]);\n}\n\nfunction getBackSuggestion() {\n return Promise.resolve([\n {\n type: 'back',\n address: 'back',\n lat: null,\n lon: null,\n properties: {\n labelId: 'back',\n layer: 'back',\n address: 'back',\n lat: null,\n lon: null,\n },\n geometry: {\n type: 'Point',\n coordinates: [],\n },\n },\n ]);\n}\n\nfunction filterFavouriteStops(stopsAndStations, input, useStops, useStations) {\n return stopsAndStations.then(stopsStations => {\n const candidates = stopsStations.filter(s =>\n s.type === 'stop' ? useStops : useStations,\n );\n return filterMatchingToInput(candidates, input, [\n 'properties.name',\n 'properties.name',\n 'properties.address',\n ]);\n });\n}\n\nfunction filterOldSearches(oldSearches, input, dropLayers) {\n let matchingOldSearches = filterMatchingToInput(oldSearches, input, [\n 'properties.name',\n 'properties.label',\n 'properties.address',\n 'properties.shortName',\n 'properties.longName',\n ]);\n if (dropLayers) {\n // don't want these\n matchingOldSearches = matchingOldSearches.filter(\n item => !dropLayers.includes(item.properties.layer),\n );\n }\n return Promise.resolve(\n take(matchingOldSearches, 10).map(item => {\n const newItem = {\n ...item,\n type: 'OldSearch',\n timetableClicked: false, // reset latest selection action\n arrowClicked: false,\n };\n delete newItem.properties.confidence;\n return newItem;\n }),\n );\n}\n\nfunction hasFavourites(searchContext) {\n const favouriteLocations = searchContext.getFavouriteLocations(\n searchContext.context,\n );\n if (favouriteLocations?.length > 0) {\n return true;\n }\n\n const favouriteVehicleRentalStations =\n searchContext.getFavouriteVehicleRentalStations(searchContext.context);\n if (favouriteVehicleRentalStations?.length > 0) {\n return true;\n }\n const favouriteStops = searchContext.getFavouriteStops(searchContext.context);\n return favouriteStops?.length > 0;\n}\n\nconst routeLayers = [\n 'route-TRAM',\n 'route-BUS',\n 'route-RAIL',\n 'route-FERRY',\n 'route-SUBWAY',\n 'route-AIRPLANE',\n 'route-FUNICULAR',\n];\nconst locationLayers = ['venue', 'address', 'street'];\nconst parkingLayers = ['carpark', 'bikepark'];\nconst stopLayers = ['stop', 'station'];\n\n/**\n * Executes the search\n *\n */\nexport function getSearchResults(\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n { input },\n callback,\n pathOpts,\n refPoint,\n) {\n const {\n getPositions,\n getFavouriteLocations,\n getOldSearches,\n getFavouriteStops,\n parkingAreaSources,\n getLanguage,\n getStopAndStationsQuery,\n getFavouriteVehicleRentalStationsQuery,\n getFavouriteVehicleRentalStations,\n getFavouriteRoutesQuery,\n getFavouriteRoutes,\n getRoutesQuery,\n context,\n isPeliasLocationAware: locationAware,\n minimalRegexp,\n lineRegexp,\n URL_PELIAS,\n URL_PELIAS_PLACE,\n feedIDs,\n geocodingSearchParams,\n geocodingSources,\n getFutureRoutes,\n cityBikeNetworks,\n } = searchContext;\n // if no targets are provided, search them all.\n const allTargets = !targets || targets.length === 0;\n // if no sources are provided, use them all.\n const allSources = !sources || sources.length === 0;\n const position = getPositions(context);\n const searchComponents = [];\n const searches = { type: 'all', term: input, results: [] };\n const language = getLanguage(context);\n const focusPoint =\n locationAware && refPoint?.lat && refPoint?.lon\n ? {\n // Round coordinates to approx 1 km, in order to improve caching\n 'focus.point.lat': refPoint.lat.toFixed(3),\n 'focus.point.lon': refPoint.lon.toFixed(3),\n }\n : {};\n const mode = transportMode ? transportMode.split('-')[1] : undefined;\n if (\n targets.includes('CurrentPosition') &&\n position.status !== 'geolocation-not-supported'\n ) {\n searchComponents.push(getCurrentPositionIfEmpty(input, position));\n }\n if (allTargets || targets.includes('MapPosition')) {\n searchComponents.push(selectPositionFomMap(input));\n }\n if (targets.includes('FutureRoutes')) {\n const items = getFutureRoutes(context);\n searchComponents.push(take(items, 3));\n }\n if (\n targets.includes('SelectFromOwnLocations') &&\n hasFavourites(searchContext)\n ) {\n searchComponents.push(selectFromOwnLocations(input));\n }\n if (allTargets || targets.includes('Locations')) {\n // eslint-disable-next-line prefer-destructuring\n const searchParams = geocodingSearchParams;\n if (sources.includes('Favourite')) {\n const favouriteLocations = getFavouriteLocations(context);\n searchComponents.push(\n filterFavouriteLocations(favouriteLocations, input),\n );\n if (sources.includes('Back')) {\n searchComponents.push(getBackSuggestion());\n }\n }\n\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = ['venue', 'address', 'street'];\n if (targets.includes('Stations')) {\n geocodingLayers.push('station'); // search stations from OSM\n }\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n geocodingSources.join(','),\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ),\n );\n }\n if (allSources || sources.includes('History')) {\n const locationHistory = getOldSearches(context, 'endpoint');\n const dropLayers = ['bikestation'];\n dropLayers.push(...stopLayers);\n dropLayers.push(...routeLayers);\n dropLayers.push(...parkingLayers);\n searchComponents.push(\n filterOldSearches(locationHistory, input, dropLayers),\n );\n }\n }\n if (allTargets || targets.includes('ParkingAreas')) {\n if (allSources || sources.includes('Datasource')) {\n const searchParams = geocodingSearchParams;\n if (geocodingSize && geocodingSize !== 10) {\n searchParams.size = geocodingSize;\n }\n const geocodingLayers = ['carpark', 'bikepark'];\n const feedIds = parkingAreaSources ? parkingAreaSources.join(',') : null;\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n feedIds,\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const history = getOldSearches(context);\n const dropLayers = ['bikestation'];\n dropLayers.push(...stopLayers);\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n searchComponents.push(filterOldSearches(history, input, dropLayers));\n }\n }\n\n const useStops = targets.includes('Stops');\n const useStations = targets.includes('Stations');\n\n if (allTargets || useStops || useStations) {\n if (sources.includes('Favourite')) {\n const favouriteStops = getFavouriteStops(context);\n let stopsAndStations;\n if (favouriteStops.every(stop => stop.type === 'station')) {\n stopsAndStations = getStopsFromGeocoding(\n favouriteStops,\n URL_PELIAS_PLACE,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n });\n } else {\n stopsAndStations = getStopAndStationsQuery(favouriteStops)\n .then(favourites =>\n getStopsFromGeocoding(favourites, URL_PELIAS_PLACE),\n )\n .then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n });\n }\n searchComponents.push(\n filterFavouriteStops(stopsAndStations, input, useStops, useStations),\n );\n }\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = [];\n if (useStops) {\n geocodingLayers.push('stop');\n }\n if (useStations) {\n geocodingLayers.push('station');\n }\n const searchParams =\n geocodingSize && geocodingSize !== 10 ? { size: geocodingSize } : {};\n if (geocodingSearchParams && geocodingSearchParams['boundary.country']) {\n searchParams['boundary.country'] =\n geocodingSearchParams['boundary.country'];\n }\n // a little hack: when searching location data, automatically dedupe stops\n // this could be a new explicit prop\n if (allTargets || targets.includes('Locations')) {\n searchParams.dedupestops = 1;\n }\n const feeds = feedIDs.map(v => `gtfs${v}`).join(',');\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n feeds,\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode);\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const stopHistory = getOldSearches(context).filter(item => {\n if (item.properties.gid) {\n return item.properties.gid.includes('GTFS:');\n }\n return true;\n });\n const dropLayers = ['bikestation'];\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n if (!useStops) {\n dropLayers.push('stop');\n }\n if (!useStations) {\n dropLayers.push('station');\n }\n if (transportMode) {\n searchComponents.push(\n filterOldSearches(stopHistory, input, dropLayers).then(result =>\n filterResults ? filterResults(result, mode) : result,\n ),\n );\n } else {\n searchComponents.push(\n filterOldSearches(stopHistory, input, dropLayers),\n );\n }\n }\n }\n if (allTargets || targets.includes('Routes')) {\n if (sources.includes('Favourite')) {\n const favouriteRoutes = getFavouriteRoutes(context);\n searchComponents.push(\n getFavouriteRoutesQuery(favouriteRoutes, input, mode, pathOpts).then(\n result =>\n filterResults ? filterResults(result, mode, 'Routes') : result,\n ),\n );\n }\n searchComponents.push(\n getRoutesQuery(input, feedIDs, transportMode, pathOpts).then(result =>\n filterResults ? filterResults(result, mode, 'Routes') : result,\n ),\n );\n if (allSources || sources.includes('History')) {\n const routeHistory = getOldSearches(context);\n const dropLayers = ['bikestation'];\n if (transportMode) {\n dropLayers.push(...routeLayers.filter(i => !(i === transportMode)));\n }\n dropLayers.push(...stopLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n\n searchComponents.push(\n filterOldSearches(routeHistory, input, dropLayers).then(results =>\n filterResults ? filterResults(results, mode, 'Routes') : results,\n ),\n );\n }\n }\n if (allTargets || targets.includes('VehicleRentalStations')) {\n if (sources.includes('Favourite')) {\n const favouriteVehicleRentalStation =\n getFavouriteVehicleRentalStations(context);\n searchComponents.push(\n getFavouriteVehicleRentalStationsQuery(\n favouriteVehicleRentalStation,\n input,\n ),\n );\n }\n if (allSources || sources.includes('Datasource')) {\n const geocodingLayers = ['bikestation'];\n const searchParams =\n geocodingSize && geocodingSize !== 10 ? { size: geocodingSize } : {};\n searchComponents.push(\n getGeocodingResults(\n input,\n searchParams,\n language,\n focusPoint,\n cityBikeNetworks.join(','),\n URL_PELIAS,\n minimalRegexp,\n geocodingLayers,\n ).then(results => {\n if (filterResults) {\n return filterResults(results, mode, 'VehicleRentalStations');\n }\n return results;\n }),\n );\n }\n if (allSources || sources.includes('History')) {\n const history = getOldSearches(context);\n const dropLayers = [...stopLayers];\n dropLayers.push(...routeLayers);\n dropLayers.push(...locationLayers);\n dropLayers.push(...parkingLayers);\n\n searchComponents.push(filterOldSearches(history, input, dropLayers));\n }\n }\n\n const searchResultsPromise = Promise.all(searchComponents)\n .then(flatten)\n .then(results => {\n searches.results = results;\n })\n .catch(err => {\n searches.error = err;\n });\n searchResultsPromise.then(() => {\n callback({\n ...searches,\n results: sortSearchResults(lineRegexp, searches.results, input),\n });\n });\n}\n\nconst debouncedSearch = debounce(getSearchResults, 300, {\n leading: true,\n});\n\nexport const executeSearch = (\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n data,\n callback,\n pathOpts,\n refPoint,\n) => {\n callback(null); // This means 'we are searching'\n debouncedSearch(\n targets,\n sources,\n transportMode,\n searchContext,\n filterResults,\n geocodingSize,\n data,\n callback,\n pathOpts,\n refPoint,\n );\n};\n","import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","const translations = {\n de: {\n address: 'Adresse',\n 'address-place-or-business': 'Adress, Ort or Geschäft',\n 'add-via-button-label': 'Füge Zwischenziel hinzu',\n 'add-via-duration-button-label': 'Set stop duration at via point {{index}}',\n 'add-via-duration-button-label-close':\n 'Close stop duration selector at via point {{index}}',\n 'add-via-duration-button-label-open':\n 'Open stop duration selector at via point {{index}}',\n airplane: 'Flug',\n arrival: 'Ankunft',\n back: 'Zurück',\n bikerentalstation: 'Leihrad-Station',\n bus: 'Bus',\n cancel: 'Abbrechen',\n 'clear-button-label': 'Löschen',\n 'clear-search-history': 'Suchhistorie löschen',\n currentposition: 'Aktuelle Position',\n delete: 'Löschen',\n 'delete-old-searches-header': 'Wollen Sie die Such-Historie löschen?',\n departure: 'Abfahrt',\n destination: 'Ziel',\n 'give-origin': 'Start eingeben.',\n 'give-destination': 'Ziel eingeben.',\n favourite: 'Favoriten',\n ferry: 'Fähre',\n 'future-route': 'Zukünftige Verbindung',\n origin: 'Start',\n 'origin-stop-near-you': 'Start',\n ownlocations: 'Eigene Favoriten',\n loading: 'Laden...',\n 'minute-short': 'min',\n rail: 'Zug',\n search: 'Suche',\n 'search-address-or-place': 'Suche anhand von Adresse oder Ortsangabe',\n 'search-button-label': 'Suche',\n 'search-destination': 'Suche Zielort, Linie or Haltestelle',\n 'search-destination-index': 'Zielort eingeben',\n 'search-destination-results-but-no-search':\n 'Ergebnisse in “Zielort”-Reiter anzeigen',\n 'search-no-results': 'Kein Ort gefunden.',\n 'search-origin': 'Suche Startort, Linie oder Haltestelle',\n 'search-origin-index': 'Startort eingeben',\n 'search-position': 'Standort ermitteln',\n 'search-autosuggest-label': 'Venue, place and stopsearch.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigate list with arrow keys and select with enter key.',\n 'search-autosuggest-label-instructions-mobile':\n 'Enter the location and navigate in the list by swiping.',\n 'search-autosuggest-label-move-to-destination':\n 'After selecting the starting location you are automatically moved to the destination field.',\n 'search-autosuggest-len': 'There is {{count}} suggestion available',\n 'search-autosuggest-len_plural':\n 'There are {{count}} suggestions available',\n 'search-current-suggestion': 'Aktuelle Auswahl: {{selection}}',\n street: 'Straße',\n subway: 'U-Bahn',\n station: 'Station',\n stop: 'Haltestelle',\n 'stop-near-you': 'Suche Haltestellen und Linien in der Nähe',\n 'stop-near-you-bus': 'Suche Buslinien or Haltestellen',\n 'stop-near-you-citybike': 'Suche Leihrad-Stationen',\n 'stop-near-you-rail': 'Suche Zugverbindungen oder Bahnhöfe',\n 'stop-near-you-subway': 'Suche U-Bahn-Linien oder Haltestellen',\n 'stop-near-you-tram': 'Suche Stadtbahn-Haltestellen-Suche',\n 'today-at': 'Heute um',\n 'tomorrow-at': 'Morgen um',\n tram: 'Straßenbahn',\n 'use-own-position': 'Benutze aktuellen Standort',\n 'select-from-map': 'Wähle Position anhand Karte',\n 'select-from-own-locations': 'Aus eigenen Favoriten auswählen',\n venue: 'Venue',\n 'via-point': 'Zwischenziel',\n where: 'Wohin?',\n place: 'Ort',\n },\n en: {\n address: 'Address',\n 'address-place-or-business': 'Address, place or business',\n 'add-via-button-label': 'Add via point',\n 'add-via-duration-button-label': 'Set stop duration at via point {{index}}',\n 'add-via-duration-button-label-close':\n 'Close stop duration selector at via point {{index}}',\n 'add-via-duration-button-label-open':\n 'Open stop duration selector at via point {{index}}',\n airplane: 'Flight',\n arrival: 'Arrival',\n back: 'Back',\n bikepark: 'Park & Ride for bikes',\n bikerentalstation: 'Bike station',\n bus: 'bus',\n cancel: 'Cancel',\n carpark: 'Park & Ride',\n 'clear-button-label': 'Clear',\n 'clear-search-history': 'Clear search history',\n currentposition: 'Current position',\n delete: 'Delete',\n 'delete-old-searches-header': 'Do you want to clear the search history?',\n departure: 'Departure',\n destination: 'Destination',\n 'give-origin': 'Enter your origin.',\n 'give-destination': 'Enter your destination',\n favourite: 'Favourite',\n ferry: 'Ferry',\n 'future-route': 'Future route',\n origin: 'Start',\n 'origin-stop-near-you': 'Start',\n ownlocations: 'Own locations',\n loading: 'Loading...',\n 'minute-short': 'm',\n platform: 'Platform',\n rail: 'Train',\n required: 'required field',\n search: 'Search',\n 'search-address-or-place': 'Search by address or place name',\n 'search-button-label': 'Search',\n 'search-destination': 'Search destination, route or stop',\n 'search-destination-index': 'Enter destination',\n 'search-destination-results-but-no-search':\n 'View results in the adjacent “Destination” tab',\n 'search-no-results': 'No location',\n 'search-origin': 'Search origin, route or stop',\n 'search-origin-index': 'Enter origin',\n 'search-position': 'Detect location',\n 'search-autosuggest-label': 'Venue, place and stopsearch.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigate list with arrow keys and select with enter key.',\n 'search-autosuggest-label-instructions-mobile':\n 'Enter the location and navigate in the list by swiping.',\n 'search-autosuggest-label-move-to-destination':\n 'After selecting the starting location you are automatically moved to the destination field.',\n 'search-autosuggest-len': 'There is {{count}} suggestion available',\n 'search-autosuggest-len_plural':\n 'There are {{count}} suggestions available',\n 'search-current-suggestion': 'Current selection: {{selection}}',\n street: 'Street',\n subway: 'Metro',\n station: 'Station',\n stop: 'Stop',\n 'stop-near-you': 'Search stops and routes',\n 'stop-near-you-airplane': 'Search flights or airports',\n 'stop-near-you-bus': 'Search bus routes or stops',\n 'stop-near-you-citybike': 'Search city bike stations',\n 'stop-near-you-rail': 'Search train routes or stations',\n 'stop-near-you-subway': 'Search metro routes or stations ',\n 'stop-near-you-tram': 'Search tram routes or stops',\n 'stop-route-station': 'Bus and stop search',\n 'today-at': 'today at',\n 'tomorrow-at': 'tomorrow at',\n tram: 'Tram',\n track: 'Track',\n 'use-own-position': 'Use current location',\n 'select-from-map': 'Select position from map',\n 'select-from-own-locations': 'Select from own locations',\n venue: 'Venue',\n 'via-point': 'Via point',\n where: 'Where to?',\n place: 'Location',\n },\n fi: {\n address: 'Osoite',\n 'address-place-or-business': 'Osoite, paikka tai yritys',\n 'add-via-button-label': 'Lisää välipiste',\n 'add-via-duration-button-label':\n 'Aseta välipisteelle {{index}} pysähdyksen kesto',\n 'add-via-duration-button-label-close':\n 'Avaa välipisteen {{index}} pysähdyksen kesto valitsin',\n 'add-via-duration-button-label-open':\n 'Sulje välipisteen {{index}} pysähdyksen kesto valitsin',\n airplane: 'Lentokone',\n arrival: 'Perillä',\n back: 'Takaisin',\n vehiclerentalstation: 'Pyöräasema',\n bikepark: 'Liityntäpysäköinti',\n bus: 'bussi',\n cancel: 'Peruuta',\n carpark: 'Liityntäpysäköinti',\n 'clear-button-label': 'Tyhjennä',\n 'clear-search-history': 'Tyhjennä hakuhistoria',\n currentposition: 'Tämänhetkinen sijainti',\n delete: 'Poista',\n 'delete-old-searches-header': 'Haluatko tyhjentää hakuhistorian?',\n departure: 'Lähtöaika',\n destination: 'Määränpää',\n favourite: 'Suosikki',\n ferry: 'Lautta',\n 'future-route': 'Tuleva reitti',\n 'give-origin': 'Lähtöpaikka',\n 'give-destination': 'Määränpää',\n origin: 'Lähtöpaikka',\n 'origin-stop-near-you': 'Lähtöpaikka',\n ownlocations: 'Omat paikat',\n loading: 'Ladataan...',\n 'minute-short': 'min',\n platform: 'Laituri',\n rail: 'Juna',\n required: 'pakollinen kenttä',\n search: 'Etsi',\n 'search-address-or-place': 'Hae osoitteella tai paikan nimellä',\n 'search-button-label': 'Hae',\n 'search-destination': 'Hae määränpäätä, linjaa tai pysäkkiä',\n 'search-destination-index': 'Syötä määränpää',\n 'search-destination-results-but-no-search':\n 'Katso tulokset viereiseltä Määränpää-välilehdeltä',\n 'search-no-results': 'Ei tuloksia',\n 'search-origin': 'Hae lähtöpaikkaa, linjaa tai pysäkkiä',\n 'search-origin-index': 'Syötä lähtöpaikka',\n 'search-autosuggest-label': 'Paikka, linja ja pysäkkihaku.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigoi listassa nuolinäppäimillä ja valitse enterillä.',\n 'search-autosuggest-label-instructions-mobile':\n 'Syötä sijainti ja navigoi listassa pyyhkäisemällä.',\n 'search-autosuggest-label-move-to-destination':\n 'Valittuasi lähtöpaikan siirrytään suoraan määränpää-kenttään.',\n 'search-autosuggest-len': ' Löydettiin {{count}} ehdotus',\n 'search-autosuggest-len_plural': ' Löydettiin {{count}} ehdotusta',\n 'search-current-suggestion': 'Tämänhetkinen valinta: {{selection}}',\n 'search-position': 'Paikanna',\n street: 'Katu',\n subway: 'Metro',\n station: 'Asema',\n stop: 'Pysäkki',\n 'stop-near-you': 'Linja, pysäkki tai asema',\n 'stop-near-you-airplane': 'Hae lentoja tai lentoasemaa',\n 'stop-near-you-bus': 'Hae bussilinjaa tai pysäkkiä',\n 'stop-near-you-citybike': 'Hae kaupunkipyöräasemaa',\n 'stop-near-you-rail': 'Hae lähijunaa tai asemaa',\n 'stop-near-you-subway': 'Hae metrolinjaa tai asemaa',\n 'stop-near-you-tram': 'Hae raitiolinjaa tai pysäkkiä',\n 'stop-route-station': 'Linja- ja pysäkkihaku',\n 'today-at': 'tänään klo',\n 'tomorrow-at': 'huomenna klo',\n tram: 'Raitiovaunu',\n track: 'Raide',\n 'use-own-position': 'Käytä nykyistä sijaintia',\n 'select-from-map': 'Valitse sijainti kartalta',\n 'select-from-own-locations': 'Valitse omista paikoista',\n venue: 'Paikka',\n 'via-point': 'Välipiste',\n where: 'Minne mennään?',\n place: 'Paikka',\n },\n pl: {\n address: 'Adres',\n 'address-place-or-business': 'Adres, miejsce lub firma',\n 'add-via-button-label': 'Dodaj punkt pośredni',\n 'add-via-duration-button-label':\n 'Wybierz czas postoju dla punktu {{index}}',\n 'add-via-duration-button-label-close':\n 'Zamknij wybornik czasu postoju w punkcie {{index}}',\n 'add-via-duration-button-label-open':\n 'Otwórz wybornik czasu postoju w punkcie {{index}}',\n airplane: 'Lot',\n arrival: 'Przyjazd',\n back: 'Wróć',\n bikepark: 'Parkuj i Jedź dla rowerów',\n bikerentalstation: 'Stacja rowerowa',\n bus: 'autobus',\n cancel: 'Anuluj',\n carpark: 'Parkuj i Jedź',\n 'clear-button-label': 'Wyczyść',\n 'clear-search-history': 'Wyczyść historię wyszukiwania',\n currentposition: 'Obecne położenie',\n delete: 'Usuń',\n 'delete-old-searches-header':\n 'Czy na pewno chcesz wyczyścić historię wyszukiwania?',\n departure: 'Odjazd',\n destination: 'Cel',\n 'give-origin': 'Wprowadź swój punkt początkowy.',\n 'give-destination': 'Wprowadź swój cel',\n favourite: 'Ulubione',\n ferry: 'Prom',\n 'future-route': 'Przyszła trasa',\n origin: 'Początek',\n 'origin-stop-near-you': 'Początek',\n ownlocations: 'Własne miejsca',\n loading: 'Ładowanie…',\n 'minute-short': 'min.',\n platform: 'Peron',\n rail: 'Pociąg',\n required: 'wymagane pole',\n search: 'Szukaj',\n 'search-address-or-place': 'Szukaj po adresie lub nazwie miejsca',\n 'search-button-label': 'Szukaj',\n 'search-destination': 'Szukaj celu, trasy lub przystanku',\n 'search-destination-index': 'Wprowadź punkt docelowy',\n 'search-destination-results-but-no-search':\n 'Wyświetl wyniki w sąsiedniej karcie „Cel”',\n 'search-no-results': 'Brak lokalizacji',\n 'search-origin': 'Wyszukaj początek, koniec lub punkt pośredni',\n 'search-origin-index': 'Wprowadź punkt początkowy',\n 'search-position': 'Wykryj lokalizację',\n 'search-autosuggest-label': 'Miejsce, lokalizacja i przystanek.',\n 'search-autosuggest-label-instructions-desktop':\n 'Nawiguj po liście używając strzałek i wybieraj klawiszem Enter.',\n 'search-autosuggest-label-instructions-mobile':\n 'Wprowadź lokalizację i nawiguj po liście gestami przesuwania.',\n 'search-autosuggest-label-move-to-destination':\n 'Po wybraniu lokalizacji początkowej, automatycznie przejdziesz do pola miejsca docelowego.',\n 'search-autosuggest-len': 'Dostępna jest {{count}} propozycja',\n 'search-autosuggest-len_few': 'Dostępne są {{count}} propozycje',\n 'search-autosuggest-len_other': 'Dostępne jest {{count}} propozycji',\n 'search-current-suggestion': 'Obecny wybór: {{selection}}',\n street: 'Ulica',\n subway: 'Metro',\n station: 'Stacja',\n stop: 'Przystanek',\n 'stop-near-you': 'Szukaj przystanków i tras',\n 'stop-near-you-airplane': 'Szukaj lotów i lotnisk',\n 'stop-near-you-bus': 'Szukaj tras autobusowych i przystanków',\n 'stop-near-you-citybike': 'Szukaj stacji rowerów miejskich',\n 'stop-near-you-rail': 'Szukaj tras kolejowych i przystanków',\n 'stop-near-you-subway': 'Szukaj tras metra i przystanków ',\n 'stop-near-you-tram': 'Szukaj tras tramwajowych i przystanków',\n 'stop-route-station': 'Wyszukiwanie autobusów i przystanków',\n 'today-at': 'dziś o',\n 'tomorrow-at': 'jutro o',\n tram: 'Tramwaj',\n track: 'Tor',\n 'use-own-position': 'Użyj obecnej lokalizacji',\n 'select-from-map': 'Wybierz miejsce na mapie',\n 'select-from-own-locations': 'Wybierz z własnych miejsc',\n venue: 'Miejsce',\n 'via-point': 'Przez punkt',\n where: 'Dokąd?',\n place: 'Miejsce',\n },\n sv: {\n address: 'Adress',\n 'address-place-or-business': 'Adress, plats eller företag',\n 'add-via-button-label': 'Lägg till viapunkt',\n 'add-via-duration-button-label':\n 'Ställ in varaktighet för viapunkten {{index}}',\n 'add-via-duration-button-label-close':\n 'Stäng väljaren för varaktighet vid via-punkten {{index}}',\n 'add-via-duration-button-label-open':\n 'Öppna väljaren för varaktighet vid via-punkten {{index}}',\n airplane: 'Flyg',\n arrival: 'Anländer',\n back: 'Tillbaka',\n bikerentalstation: 'Stadscykelstation',\n bikepark: 'Anslutningsparkering för cyklar',\n bus: 'Bussi',\n cancel: 'Avbryt',\n carpark: 'Infartsparkering',\n 'clear-button-label': 'Töm',\n 'clear-search-history': 'Töm sökhistoriken',\n currentposition: 'Nuvarande position',\n delete: 'Ta bort',\n 'delete-old-searches-header': 'Vill du tömma sökhistoriken?',\n departure: 'Avgångstid',\n destination: 'Destination',\n favourite: 'Favorit',\n ferry: 'Färja',\n 'future-route': 'Framtida rutt',\n 'give-destination': 'Skriv in din destination',\n 'give-origin': 'Skriv in din avfärdsplats',\n origin: 'Avfärdsplats',\n 'origin-stop-near-you': 'Avfärdsplats',\n ownlocations: 'Egna platser',\n loading: 'Laddar...',\n 'minute-short': 'min',\n platform: 'Plattform',\n rail: 'Tåg',\n required: 'obligatoriskt fält',\n search: 'Sök',\n 'search-address-or-place': 'Sök med adressen eller platsens namn',\n 'search-button-label': 'Sök',\n 'search-destination': 'Sök destination, linje eller hållplats',\n 'search-destination-index': 'Skriv destination',\n 'search-destination-results-but-no-search':\n 'Se resultaten under fliken Destination',\n 'search-no-results': 'Inga sökresultat',\n 'search-origin': 'Sök avfärdsplats, linje eller hållplats',\n 'search-origin-index': 'Skriv avfärdsplats',\n 'search-position': 'Sök position',\n 'search-autosuggest-label': 'Plats, linje och hållplatssökning.',\n 'search-autosuggest-label-instructions-desktop':\n 'Navigera listan med piltangenterna och välj med Enter-tangeten.',\n 'search-autosuggest-label-instructions-mobile':\n 'Ange platsen och navigera i listan genom att svepa.',\n 'search-autosuggest-label-move-to-destination':\n 'Efter att du valt avgångsplatsen tas du direkt till Destination-fältet.',\n 'search-autosuggest-len': 'Hittade {{count}} förslag',\n 'search-current-suggestion': 'Nuvarande val: {{selection}}',\n street: 'Gata',\n subway: 'Metro',\n station: 'Station',\n stop: 'Hållplats',\n 'stop-near-you': 'Sök hållplatser eller linjer',\n 'stop-near-you-airplane': 'Sök flyg eller flygplatser',\n 'stop-near-you-bus': 'Sök busslinjer eller hållplatser',\n 'stop-near-you-citybike': 'Sök stadscykelstationer',\n 'stop-near-you-rail': 'Sök närtåger eller stationer',\n 'stop-near-you-subway': 'Sök metrolinjer eller stationer',\n 'stop-near-you-tram': 'Sök spårvagnlinjer eller hållplatser',\n 'stop-route-station': 'Buss och stopp sökningen',\n 'today-at': 'i dag kl',\n 'tomorrow-at': 'i morgon',\n tram: 'Spårvagn',\n track: 'Spår',\n 'use-own-position': 'Använd min position',\n 'select-from-map': 'Välj position från kartan',\n 'select-from-own-locations': 'Välj från egna platser',\n venue: 'Mötesplats',\n 'via-point': 'Via punkt',\n where: 'Vart vill du åka?',\n place: 'Plats',\n },\n};\n\nexport default translations;\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import PropTypes from 'prop-types';\nimport React, { useState, useEffect, useCallback } from 'react';\nimport ReactModal from 'react-modal';\nimport cx from 'classnames';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport Autosuggest from 'react-autosuggest';\nimport mobileStyles from './MobileSearch.scss';\nimport mobileNoScrollStyles from './MobileNoScroll.scss';\n\nclass AutosuggestPatch extends Autosuggest {\n constructor(props) {\n super(props);\n const self = this;\n self.onSuggestionTouchMove = () => {\n self.justSelectedSuggestion = false;\n self.pressedSuggestion = null;\n };\n }\n}\n\nconst MobileSearch = ({\n appElement,\n id,\n closeHandle,\n clearInput,\n value,\n suggestions,\n inputProps,\n fetchFunction,\n renderSuggestion,\n getSuggestionValue,\n ariaLabel,\n label,\n onSuggestionSelected,\n clearOldSearches,\n dialogHeaderText,\n dialogPrimaryButtonText,\n dialogSecondaryButtonText,\n clearInputButtonText,\n focusInput,\n color,\n hoverColor,\n accessiblePrimaryColor,\n searchOpen,\n fontWeights,\n showScroll,\n}) => {\n const styles = showScroll ? mobileStyles : mobileNoScrollStyles;\n\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n\n const [isDialogOpen, setDialogOpen] = useState(false);\n const inputRef = React.useRef();\n\n useEffect(() => {\n ReactModal.setAppElement(appElement);\n }, []);\n\n const onClose = useCallback(() => {\n closeHandle();\n });\n\n const onSelect = (e, ref) => {\n if (ref.suggestion.type === 'clear-search-history') {\n setDialogOpen(true);\n } else if (!ref.suggestion.properties.arrowClicked) {\n // Select item if fill input button is not pressed (diagonal arrow in suggestion items)\n onSuggestionSelected(e, ref);\n }\n };\n\n const isKeyboardSelectionEvent = event => {\n const space = [13, ' ', 'Spacebar'];\n const enter = [32, 'Enter'];\n const key = (event && (event.key || event.which || event.keyCode)) || '';\n\n if (!key || !space.concat(enter).includes(key)) {\n return false;\n }\n event.preventDefault();\n return true;\n };\n\n const getValue = suggestion => {\n if (suggestion.type === 'clear-search-history') {\n return '';\n }\n return getSuggestionValue(suggestion);\n };\n\n const renderItem = item => {\n if (item.type === 'clear-search-history') {\n return (\n <button type=\"button\" className={styles['clear-search-history']}>\n {item.labelId}\n </button>\n );\n }\n return renderSuggestion(item);\n };\n\n const renderDialogModal = () => {\n return (\n <DialogModal\n appElement={appElement}\n isModalOpen={isDialogOpen}\n handleClose={() => setDialogOpen(false)}\n headerText={dialogHeaderText}\n primaryButtonText={dialogPrimaryButtonText}\n secondaryButtonText={dialogSecondaryButtonText}\n primaryButtonOnClick={() => {\n clearOldSearches();\n setDialogOpen(false);\n }}\n secondaryButtonOnClick={() => setDialogOpen(false)}\n color={color}\n hoverColor={hoverColor}\n fontWeights={fontWeights}\n />\n );\n };\n\n const clearButton = () => {\n return (\n <button\n type=\"button\"\n className={styles['clear-input']}\n onClick={clearInput}\n onKeyDown={e => isKeyboardSelectionEvent(e) && clearInput()}\n aria-label={clearInputButtonText}\n >\n <Icon img=\"close\" color={color} />\n </button>\n );\n };\n\n const renderContent = () => {\n return (\n <div className={styles['combobox-container']} htmlFor={inputId}>\n <button\n type=\"button\"\n className={styles['combobox-icon']}\n onClick={() => onClose()}\n onKeyDown={e => isKeyboardSelectionEvent(e) && onClose()}\n aria-label={dialogSecondaryButtonText}\n tabIndex={0}\n >\n <Icon img=\"arrow\" />\n </button>\n <span className={styles['right-column']}>\n <span className={styles['combobox-label']} id={labelId}>\n {label}\n </span>\n <AutosuggestPatch\n alwaysRenderSuggestions\n id={id}\n suggestions={suggestions}\n onSuggestionsFetchRequested={fetchFunction}\n getSuggestionValue={getValue}\n renderSuggestion={renderItem}\n // focusInputOnSuggestionClick must be set to true.\n // If set to false, input won't be focused when user clicks on\n // Fill input button in suggestion list. (diagonal arrow in street name items)\n focusInputOnSuggestionClick\n shouldRenderSuggestions={() => true}\n inputProps={{\n ...inputProps,\n className: cx(\n `${styles.input} ${styles[id] || ''} ${\n inputProps.value ? styles.hasValue : ''\n }`,\n ),\n autoFocus: true,\n }}\n renderInputComponent={p => (\n <>\n <input aria-label={ariaLabel} id={id} {...p} />\n {value && clearButton()}\n </>\n )}\n theme={styles}\n onSuggestionSelected={onSelect}\n ref={inputRef}\n />\n </span>\n </div>\n );\n };\n // This does not seem to do anything.\n // When doing quick testing on this it looked like inputRef.current is always undefined.\n if (focusInput && inputRef.current?.input) {\n inputRef.current.input.focus();\n }\n\n return (\n <ReactModal\n isOpen={searchOpen}\n className={styles['mobile-modal']}\n overlayClassName={styles['mobile-modal-overlay']}\n onAfterClose={onClose}\n shouldCloseOnEsc\n >\n <div\n className={styles['mobile-modal-content']}\n style={{\n '--color': `${color}`,\n '--accessible-primary-color': accessiblePrimaryColor,\n '--hover-color': `${hoverColor}`,\n '--font-weight-medium': fontWeights.medium,\n }}\n >\n {renderContent()}\n {renderDialogModal()}\n </div>\n </ReactModal>\n );\n};\n\nMobileSearch.propTypes = {\n appElement: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n closeHandle: PropTypes.func.isRequired,\n clearInput: PropTypes.func.isRequired,\n value: PropTypes.string,\n clearInputButtonText: PropTypes.string.isRequired,\n // eslint-disable-next-line\n suggestions: PropTypes.arrayOf(PropTypes.object).isRequired,\n inputProps: PropTypes.shape({\n onChange: PropTypes.func.isRequired,\n onBlur: PropTypes.func.isRequired,\n value: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n className: PropTypes.string.isRequired,\n }).isRequired,\n fetchFunction: PropTypes.func.isRequired,\n getSuggestionValue: PropTypes.func.isRequired,\n renderSuggestion: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n label: PropTypes.string.isRequired,\n clearOldSearches: PropTypes.func.isRequired,\n ariaLabel: PropTypes.string,\n dialogHeaderText: PropTypes.string,\n dialogPrimaryButtonText: PropTypes.string,\n dialogSecondaryButtonText: PropTypes.string,\n focusInput: PropTypes.bool,\n color: PropTypes.string,\n hoverColor: PropTypes.string,\n accessiblePrimaryColor: PropTypes.string.isRequired,\n searchOpen: PropTypes.bool.isRequired,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number.isRequired,\n }).isRequired,\n showScroll: PropTypes.bool,\n};\n\nMobileSearch.defaultProps = {\n value: undefined,\n ariaLabel: undefined,\n dialogHeaderText: undefined,\n dialogPrimaryButtonText: undefined,\n dialogSecondaryButtonText: undefined,\n focusInput: false,\n color: undefined,\n hoverColor: undefined,\n showScroll: undefined,\n};\n\nexport default MobileSearch;\n","/*! For license information please see index.js.LICENSE.txt */\n!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t(require(\"react\"));else if(\"function\"==typeof define&&define.amd)define([\"react\"],t);else{var n=\"object\"==typeof exports?t(require(\"react\")):t(e.react);for(var o in n)(\"object\"==typeof exports?exports:e)[o]=n[o]}}(\"undefined\"!=typeof self?self:this,(function(e){return function(){var t={888:function(e,t,n){var o,r;r=void 0!==n.g?n.g:\"undefined\"!=typeof window?window:this,o=function(){return function(e){\"use strict\";var t={ignore:\"[data-scroll-ignore]\",header:null,topOnEmptyHash:!0,speed:500,speedAsDuration:!1,durationMax:null,durationMin:null,clip:!0,offset:0,easing:\"easeInOutCubic\",customEasing:null,updateURL:!0,popstate:!0,emitEvents:!0},n=function(){var e={};return Array.prototype.forEach.call(arguments,(function(t){for(var n in t){if(!t.hasOwnProperty(n))return;e[n]=t[n]}})),e},o=function(e){\"#\"===e.charAt(0)&&(e=e.substr(1));for(var t,n=String(e),o=n.length,r=-1,u=\"\",i=n.charCodeAt(0);++r<o;){if(0===(t=n.charCodeAt(r)))throw new InvalidCharacterError(\"Invalid character: the input contains U+0000.\");u+=t>=1&&t<=31||127==t||0===r&&t>=48&&t<=57||1===r&&t>=48&&t<=57&&45===i?\"\\\\\"+t.toString(16)+\" \":t>=128||45===t||95===t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122?n.charAt(r):\"\\\\\"+n.charAt(r)}return\"#\"+u},r=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},u=function(t){return t?(n=t,parseInt(e.getComputedStyle(n).height,10)+t.offsetTop):0;var n},i=function(t,n,o){0===t&&document.body.focus(),o||(t.focus(),document.activeElement!==t&&(t.setAttribute(\"tabindex\",\"-1\"),t.focus(),t.style.outline=\"none\"),e.scrollTo(0,n))},s=function(t,n,o,r){if(n.emitEvents&&\"function\"==typeof e.CustomEvent){var u=new CustomEvent(t,{bubbles:!0,detail:{anchor:o,toggle:r}});document.dispatchEvent(u)}};return function(c,a){var l,f,d,v,p={cancelScroll:function(e){cancelAnimationFrame(v),v=null,e||s(\"scrollCancel\",l)},animateScroll:function(o,c,a){p.cancelScroll();var f=n(l||t,a||{}),h=\"[object Number]\"===Object.prototype.toString.call(o),m=h||!o.tagName?null:o;if(h||m){var y=e.pageYOffset;f.header&&!d&&(d=document.querySelector(f.header));var b,g,w,E=u(d),O=h?o:function(t,n,o,u){var i=0;if(t.offsetParent)do{i+=t.offsetTop,t=t.offsetParent}while(t);return i=Math.max(i-n-o,0),u&&(i=Math.min(i,r()-e.innerHeight)),i}(m,E,parseInt(\"function\"==typeof f.offset?f.offset(o,c):f.offset,10),f.clip),S=O-y,_=r(),I=0,M=function(e,t){var n=t.speedAsDuration?t.speed:Math.abs(e/1e3*t.speed);return t.durationMax&&n>t.durationMax?t.durationMax:t.durationMin&&n<t.durationMin?t.durationMin:parseInt(n,10)}(S,f),L=function(t){b||(b=t),I+=t-b,w=y+S*function(e,t){var n;return\"easeInQuad\"===e.easing&&(n=t*t),\"easeOutQuad\"===e.easing&&(n=t*(2-t)),\"easeInOutQuad\"===e.easing&&(n=t<.5?2*t*t:(4-2*t)*t-1),\"easeInCubic\"===e.easing&&(n=t*t*t),\"easeOutCubic\"===e.easing&&(n=--t*t*t+1),\"easeInOutCubic\"===e.easing&&(n=t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1),\"easeInQuart\"===e.easing&&(n=t*t*t*t),\"easeOutQuart\"===e.easing&&(n=1- --t*t*t*t),\"easeInOutQuart\"===e.easing&&(n=t<.5?8*t*t*t*t:1-8*--t*t*t*t),\"easeInQuint\"===e.easing&&(n=t*t*t*t*t),\"easeOutQuint\"===e.easing&&(n=1+--t*t*t*t*t),\"easeInOutQuint\"===e.easing&&(n=t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t),e.customEasing&&(n=e.customEasing(t)),n||t}(f,g=(g=0===M?0:I/M)>1?1:g),e.scrollTo(0,Math.floor(w)),function(t,n){var r=e.pageYOffset;if(t==n||r==n||(y<n&&e.innerHeight+r)>=_)return p.cancelScroll(!0),i(o,n,h),s(\"scrollStop\",f,o,c),b=null,v=null,!0}(w,O)||(v=e.requestAnimationFrame(L),b=t)};0===e.pageYOffset&&e.scrollTo(0,0),function(e,t,n){t||history.pushState&&n.updateURL&&history.pushState({smoothScroll:JSON.stringify(n),anchor:e.id},document.title,e===document.documentElement?\"#top\":\"#\"+e.id)}(o,h,f),\"matchMedia\"in e&&e.matchMedia(\"(prefers-reduced-motion)\").matches?i(o,Math.floor(O),!1):(s(\"scrollStart\",f,o,c),p.cancelScroll(!0),e.requestAnimationFrame(L))}}},h=function(t){if(!t.defaultPrevented&&!(0!==t.button||t.metaKey||t.ctrlKey||t.shiftKey)&&\"closest\"in t.target&&(f=t.target.closest(c))&&\"a\"===f.tagName.toLowerCase()&&!t.target.closest(l.ignore)&&f.hostname===e.location.hostname&&f.pathname===e.location.pathname&&/#/.test(f.href)){var n,r;try{n=o(decodeURIComponent(f.hash))}catch(e){n=o(f.hash)}if(\"#\"===n){if(!l.topOnEmptyHash)return;r=document.documentElement}else r=document.querySelector(n);(r=r||\"#top\"!==n?r:document.documentElement)&&(t.preventDefault(),function(t){if(history.replaceState&&t.updateURL&&!history.state){var n=e.location.hash;n=n||\"\",history.replaceState({smoothScroll:JSON.stringify(t),anchor:n||e.pageYOffset},document.title,n||e.location.href)}}(l),p.animateScroll(r,f))}},m=function(e){if(null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(l)){var t=history.state.anchor;\"string\"==typeof t&&t&&!(t=document.querySelector(o(history.state.anchor)))||p.animateScroll(t,null,{updateURL:!1})}};return p.destroy=function(){l&&(document.removeEventListener(\"click\",h,!1),e.removeEventListener(\"popstate\",m,!1),p.cancelScroll(),l=null,f=null,d=null,v=null)},function(){if(!(\"querySelector\"in document&&\"addEventListener\"in e&&\"requestAnimationFrame\"in e&&\"closest\"in e.Element.prototype))throw\"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.\";p.destroy(),l=n(t,a||{}),d=l.header?document.querySelector(l.header):null,document.addEventListener(\"click\",h,!1),l.updateURL&&l.popstate&&e.addEventListener(\"popstate\",m,!1)}(),p}}(r)}.apply(t,[]),void 0===o||(e.exports=o)},432:function(e,t,n){\"use strict\";var o=this&&this.__createBinding||(Object.create?function(e,t,n,o){void 0===o&&(o=n),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,o){void 0===o&&(o=n),e[o]=t[n]}),r=this&&this.__exportStar||function(e,t){for(var n in e)\"default\"===n||Object.prototype.hasOwnProperty.call(t,n)||o(t,e,n)};Object.defineProperty(t,\"__esModule\",{value:!0}),r(n(47),t),r(n(926),t),r(n(349),t),r(n(137),t),r(n(729),t),r(n(383),t),r(n(450),t),r(n(358),t),r(n(753),t),r(n(869),t),r(n(352),t),r(n(446),t),r(n(164),t),r(n(305),t),r(n(502),t)},349:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useArrowNavigation=void 0;var o=n(156);t.useArrowNavigation=function(e){var t=e.listItems,n=e.onArrowUpOrDown,r=(0,o.useState)(0),u=r[0],i=r[1],s=(0,o.useCallback)((function(e){i(e)}),[t]),c=function(e){var o=e.key;if(null==t?void 0:t.length)if(\"ArrowUp\"===o)n&&n(),e.preventDefault(),s(u>0?u-1:t.length-1);else{if(\"ArrowDown\"!==o)return;n&&n(),e.preventDefault(),u<t.length-1?s(u+1):s(0)}};return(0,o.useEffect)((function(){return window.addEventListener(\"keydown\",c),function(){return window.removeEventListener(\"keydown\",c)}})),(0,o.useEffect)((function(){s(0)}),[t]),{selectedIndex:u}}},446:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useDebounce=void 0;var o=n(156);t.useDebounce=function(e,t){void 0===t&&(t=300);var n=(0,o.useState)(e),r=n[0],u=n[1];return(0,o.useEffect)((function(){var n=setTimeout((function(){u(e)}),t);return function(){clearTimeout(n)}}),[e,t]),r}},164:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useElementSize=void 0;var o=n(156);t.useElementSize=function(){var e,t,n=(0,o.useRef)(null);return[n,{width:null===(e=null==n?void 0:n.current)||void 0===e?void 0:e.clientWidth,height:null===(t=null==n?void 0:n.current)||void 0===t?void 0:t.clientHeight}]},t.default=t.useElementSize},137:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIntersectionObserver=void 0;var o=n(156);t.useIntersectionObserver=function(e){var t=(0,o.useRef)(null),n=(0,o.useState)(!1),r=n[0],u=n[1],i=function(e){var t=e[0];u(t.isIntersecting)};return(0,o.useEffect)((function(){if(window&&window.IntersectionObserver){var n=new IntersectionObserver(i,e),o=t.current;return t.current&&n.observe(t.current),function(){o&&n.unobserve(o)}}u(!1)}),[t,e]),{containerRef:t,isVisible:r}},t.default=t.useIntersectionObserver},729:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsBreakpoint=void 0;var o=n(156),r=n(432),u={xs:1,mobileSmall:320,mobile:375,tablet:768,tabletLarge:920,desktopSmall:1024,desktop:1260,desktopLarge:1440};t.useIsBreakpoint=function(e){var t=\"string\"==typeof e?u[e]:e,n=(0,o.useState)(null),i=n[0],s=n[1],c=(0,o.useCallback)((function(){s(window.innerWidth)}),[]);return(0,o.useEffect)((function(){c()}),[]),(0,r.useOnResize)(c),i>=t},t.default=t.useIsBreakpoint},450:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsLoadingAfterError=void 0;var o=n(156);t.useIsLoadingAfterError=function(e,t){var n=(0,o.useState)(t),r=n[0],u=n[1];return(0,o.useEffect)((function(){e||u(t)}),[e,t]),e&&r}},305:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsMobile=void 0;var o=n(729);t.useIsMobile=function(){return!(0,o.useIsBreakpoint)(\"tablet\")},t.default=t.useIsMobile},383:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useIsomorphicLayoutEffect=void 0;var o=n(156);t.useIsomorphicLayoutEffect=\"undefined\"!=typeof window?o.useLayoutEffect:o.useEffect,t.default=t.useIsomorphicLayoutEffect},753:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnLoseFocusWithin=void 0;var o=n(156);t.useOnLoseFocusWithin=function(e){var t=e.ref,n=e.callback,r=e.watch;(0,o.useEffect)((function(){var e=function(){var e;if(r)return(null===(e=t.current)||void 0===e?void 0:e.matches(\":focus-within\"))?void 0:n()};return document.addEventListener(\"keyup\",e),function(){return document.removeEventListener(\"keyup\",e)}}),[n,t,r])},t.default=t.useOnLoseFocusWithin},502:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnResize=void 0;var o=n(156);t.useOnResize=function(e){(0,o.useEffect)((function(){var t=function(){e(window.innerWidth)};return window.addEventListener(\"resize\",t,{passive:!0}),function(){return window.removeEventListener(\"resize\",t)}}),[])},t.default=t.useOnResize},352:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOnWindowFocus=void 0;var o=n(156);t.useOnWindowFocus=function(e){(0,o.useEffect)((function(){var t=function(){e&&\"visible\"===document.visibilityState&&e()};return window.addEventListener(\"visibilitychange\",t,!1),function(){return window.removeEventListener(\"visibilitychange\",t)}}),[e])}},47:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useOutsideReacter=void 0;var o=n(156);t.useOutsideReacter=function(e,t){function n(n){e.current&&!e.current.contains(n.target)&&t()}(0,o.useEffect)((function(){return document.addEventListener(\"mousedown\",n),function(){document.removeEventListener(\"mousedown\",n)}}))}},869:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useRunAfterUpdate=void 0;var o=n(156);t.useRunAfterUpdate=function(){var e=(0,o.useRef)(null);return(0,o.useEffect)((function(){e.current&&(e.current(),e.current=null)})),function(t){e.current=t}},t.default=t.useRunAfterUpdate},926:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.useScrollLock=void 0;var o=n(156);t.useScrollLock=function(){return{lock:(0,o.useCallback)((function(){var e=window.scrollY+\"px\",t=document.body;t.style.position=\"fixed\",t.style.top=\"-\"+e}),[]),unlock:(0,o.useCallback)((function(){var e=document.body,t=e.style.top,n=-1*parseInt(t||\"0\");e.style.position=\"\",e.style.top=\"\",n&&window.scrollTo(0,-1*parseInt(t||\"0\"))}),[])}}},358:function(e,t,n){\"use strict\";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.useSmoothScroll=void 0;var r=n(156),u=o(n(888));t.useSmoothScroll=function(e){var t=(0,r.useRef)(null),n=e.ref,o=e.offset,i=void 0===o?0:o,s=e.speed,c=void 0===s?500:s;return(0,r.useEffect)((function(){t.current=new u.default(null,{speed:c,speedAsDuration:!0})}),[]),(0,r.useCallback)((function(){n&&t.current&&t.current.animateScroll(n.current,null,{offset:function(){return i},updateURL:!1})}),[i,n])}},156:function(t){\"use strict\";t.exports=e}},n={};function o(e){var r=n[e];if(void 0!==r)return r.exports;var u=n[e]={exports:{}};return t[e].call(u.exports,u,u.exports,o),u.exports}return o.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),o(432)}()}));\n//# sourceMappingURL=index.js.map","/* eslint-disable import/no-extraneous-dependencies */\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport i18next from 'i18next';\nimport cx from 'classnames';\nimport Autosuggest from 'react-autosuggest';\nimport { executeSearch } from '@digitransit-search-util/digitransit-search-util-execute-search-immidiate';\nimport SuggestionItem from '@digitransit-component/digitransit-component-suggestion-item';\nimport {\n getNameLabel,\n getStopCode,\n} from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport { getStopName } from '@digitransit-search-util/digitransit-search-util-helpers';\nimport getLabel from '@digitransit-search-util/digitransit-search-util-get-label';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { DateTime, Settings } from 'luxon';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport translations from './helpers/translations';\nimport styles from './helpers/styles.scss';\nimport MobileSearch from './helpers/MobileSearch';\nimport withScrollLock from './helpers/withScrollLock';\n\nSettings.defaultLocale = 'en';\n\ni18next.init({\n fallbackLng: 'fi',\n defaultNS: 'translation',\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n});\n\nconst Loading = props => (\n <div className={styles['spinner-loader']}>\n {(props && props.children) || (\n <span className={styles['sr-only']}>{i18next.t('loading')}</span>\n )}\n </div>\n);\n\nLoading.propTypes = {\n children: PropTypes.node,\n};\n\nLoading.defaultProps = {\n children: undefined,\n};\n\nconst getPlatform = addendum => {\n if (!addendum || !addendum.GTFS.platform) {\n return undefined;\n }\n const { modes, platform } = addendum.GTFS;\n const type =\n modes && modes[0] === 'RAIL' ? i18next.t('track') : i18next.t('platform');\n return [type, platform];\n};\n\nfunction getSuggestionContent(item) {\n if (item.type !== 'FutureRoute') {\n if (item.type === 'SelectFromMap') {\n return ['', i18next.t('select-from-map')];\n }\n if (item.type === 'CurrentLocation') {\n return ['', i18next.t('use-own-position')];\n }\n if (item.type === 'SelectFromOwnLocations') {\n return ['', i18next.t('select-from-own-locations')];\n }\n /* eslint-disable-next-line prefer-const */\n let [name, label] = getNameLabel(item.properties, true);\n let suggestionType;\n if (\n item.properties.layer.toLowerCase().includes('bikerental') ||\n item.properties.layer.toLowerCase().includes('bikestation')\n ) {\n suggestionType = i18next.t('vehiclerentalstation');\n const stopCode = item.properties.labelId;\n return [suggestionType, name, undefined, stopCode];\n }\n\n if (item.properties.layer === 'bikepark') {\n suggestionType = i18next.t('bikepark');\n return [suggestionType, name, undefined, undefined];\n }\n\n if (item.properties.layer === 'carpark') {\n suggestionType = i18next.t('carpark');\n return [suggestionType, name, undefined, undefined];\n }\n\n if (item.properties.mode) {\n suggestionType = i18next.t(\n item.properties.mode.toLowerCase().replace('favourite', ''),\n );\n } else {\n const layer = item.properties.layer\n .replace('route-', '')\n .toLowerCase()\n .replace('favourite', '');\n suggestionType = i18next.t(layer);\n }\n\n if (\n item.properties.id &&\n (item.properties.layer === 'stop' || item.properties.layer === 'station')\n ) {\n const stopCode = getStopCode(item.properties);\n const mode = item.properties.addendum?.GTFS.modes;\n const platform = getPlatform(item.properties.addendum);\n return [\n suggestionType,\n getStopName(name, stopCode),\n label,\n stopCode,\n mode,\n platform,\n ];\n }\n if (\n item.properties.layer === 'favouriteStop' ||\n item.properties.layer === 'favouriteStation'\n ) {\n const { address, code } = item.properties;\n const stoName = address ? getStopName(address.split(',')[0], code) : name;\n const platform = getPlatform(item.properties.addendum);\n return [suggestionType, stoName, label, code, undefined, platform];\n }\n return [suggestionType, name, label];\n }\n const { origin, destination } = item.properties;\n const tail1 = origin.locality ? `, ${origin.locality} foobar` : '';\n const tail2 = destination.locality ? `, ${destination.locality}` : '';\n const name1 = origin.name;\n const name2 = destination.name;\n return [\n i18next.t('future-route'),\n `${i18next.t('origin')} ${name1}${tail1} ${i18next.t(\n 'destination',\n )} ${name2}${tail2}`,\n item.translatedText,\n ];\n}\n\nfunction translateFutureRouteSuggestionTime(item) {\n const time = DateTime.fromSeconds(Number(item.properties.time));\n const now = DateTime.now();\n let str = item.properties.arriveBy\n ? i18next.t('arrival')\n : i18next.t('departure');\n if (time.hasSame(now, 'day')) {\n str = `${str} ${i18next.t('today-at')}`;\n } else if (time.hasSame(now.plus({ days: 1 }), 'day')) {\n str = `${str} ${i18next.t('tomorrow-at')}`;\n } else {\n str = `${str} ${time.toFormat('ccc d.L.')}`;\n }\n str = `${str} ${time.toFormat('HH:mm')}`;\n return str;\n}\n\nconst getSuggestionValue = suggestion => {\n if (\n suggestion.type === 'SelectFromOwnLocations' ||\n suggestion.type === 'back'\n ) {\n return '';\n }\n return getLabel(suggestion.properties);\n};\n/**\n * @example\n * const searchContext = {\n * isPeliasLocationAware: false // true / false does Let Pelias suggest based on current user location\n * minimalRegexp: undefined // used for testing min. regexp. For example: new RegExp('.{2,}'),\n * lineRegexp: undefined // identify searches for route numbers/labels: bus | train | metro. For example: new RegExp(\n * // '(^[0-9]+[a-z]?$|^[yuleapinkrtdz]$|(^m[12]?b?$))',\n * // 'i',\n * // ),\n * URL_PELIAS: '' // url for pelias searches\n * feedIDs: ['HSL', 'HSLLautta'] // FeedId's like [HSL, HSLLautta]\n * geocodingSources: ['oa','osm','nlsfi'] // sources for geocoding\n * geocodingSearchParams; {} // Searchparmas fro geocoding\n * getFavouriteLocations: () => ({}), // Function that returns array of favourite locations.\n * getFavouriteStops: () => ({}), // Function that returns array of favourite stops.\n * getLanguage: () => ({}), // Function that returns current language.\n * getFavouriteRoutes: () => ({}), // Function that returns array of favourite routes.\n * getPositions: () => ({}), // Function that returns user's geolocation.\n * getRoutesQuery: () => ({}), // Function that returns query for fetching routes.\n * getStopAndStationsQuery: () => ({}), // Function that fetches favourite stops and stations from graphql API.\n * getFavouriteRoutesQuery: () => ({}), // Function that returns query for fetching favourite routes.\n * getFavouriteVehicleRentalStations: () => ({}), // Function that returns favourite bike rental station.\n * getFavouriteVehicleRentalStationsQuery: () => ({}), // Function that returns query for fetching favourite bike rental stations.\n * startLocationWatch: () => ({}), // Function that locates users geolocation.\n * saveSearch: () => ({}), // Function that saves search to old searches store.\n * clearOldSearches: () => ({}), // Function that clears old searches store.\n * getFutureRoutes: () => ({}), // Function that return future routes\n * saveFutureRoute: () => ({}), // Function that saves a future route\n * clearFutureRoutes: () => ({}), // Function that clears future routes\n * };\n * const lang = 'fi'; // en, fi or sv\n * const onSelect = (item, id) => {\n * // Funtionality when user selects a suggesions. No default implementation is given.\n * return null;\n * };\n * const onClear = id => {\n * // Called when user clicks the clear search string button. No default implementation.\n * return null;\n * };\n * const getAutoSuggestIcons: {\n * // Called for every city bike station rendered as a search suggestion. Should return the icon and\n * // color used for that station. Two icons are available, 'citybike-stop-digitransit' anditybike-stop-digitransit-secondary'.\n * citybikes: station => {\n * return ['citybike-stop-digitransit', '#f2b62d'];\n * }\n * }\n * const transportMode = undefined;\n * const placeholder = \"stop-near-you\";\n * const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. Options are Locations, Stops, Stations, Routes, VehicleRentalStations, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets.\n * const sources = ['Favourite', 'History', 'Datasource'] // Defines where you are searching. all available are: Favourite, History (previously searched searches) and Datasource. Leave empty to use all sources.\n * return (\n * <DTAutosuggest\n * appElement={appElement} // Required. Root element's id. Needed for react-modal component.\n * searchContext={searchContext}\n * icon=\"origin\" // Optional String for icon that is shown left of searchfield. used with Icon library\n * id=\"origin\" // used for style props and info for component.\n * placeholder={placeholder} // String that is showns initally in search field\n * value=\"\" // e.g. user typed string that is shown in search field\n * onSelect={onSelect}\n * onClear={onClear}\n * autoFocus={false} // defines that should this field be automatically focused when page is loaded.\n * lang={lang}\n * getAutoSuggestIcons={getAutoSuggestIcons}\n * transportMode={transportMode} // transportmode with which we filter the routes, e.g. route-BUS\n * geocodingSize={10} // defines how many stops and stations to fetch from geocoding. Useful if you want to filter the results and still get a reasonable amount of suggestions.\n * filterResults={results => return results} // Optional filtering function for routes and stops\n * handelViaPoints={() => return null } // Optional Via point handling logic. This is currently managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * focusChange={() => return null} // When suggestion is selected, handle changing focus. This is currently managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * storeRef={() => return null} // Functionality to store refs. Currenlty managed with DTAutosuggestpanel by default, but if DTAutosuggest is used seperatelly own implementation must be provided.\n * sources={sources}\n * targets={targets}\n * isMobile // Optional. Defaults to false. Whether to use mobile search.\n * mobileLabel=\"Custom label\" // Optional. Custom label text for autosuggest field on mobile.\n * inputClassName=\"\" // Optional. Custom classname applied to the input element of the component for providing CSS styles.\n * translatedPlaceholder= // Optional. Custon translated placeholder text for autosuggest field.\n */\nclass DTAutosuggest extends React.Component {\n static propTypes = {\n appElement: PropTypes.string.isRequired,\n autoFocus: PropTypes.bool,\n className: PropTypes.string,\n icon: PropTypes.string,\n id: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n translatedPlaceholder: PropTypes.string,\n value: PropTypes.string,\n searchContext: PropTypes.shape({\n URL_PELIAS: PropTypes.string,\n // eslint-disable-next-line\n context: PropTypes.object,\n clearOldSearches: PropTypes.func,\n clearFutureRoutes: PropTypes.func,\n }).isRequired,\n ariaLabel: PropTypes.string,\n onSelect: PropTypes.func.isRequired,\n transportMode: PropTypes.string,\n filterResults: PropTypes.func,\n geocodingSize: PropTypes.number,\n onClear: PropTypes.func,\n storeRef: PropTypes.func,\n handleViaPoints: PropTypes.func,\n focusChange: PropTypes.func,\n lang: PropTypes.string,\n sources: PropTypes.arrayOf(PropTypes.string),\n targets: PropTypes.arrayOf(PropTypes.string),\n isMobile: PropTypes.bool,\n color: PropTypes.string,\n hoverColor: PropTypes.string,\n accessiblePrimaryColor: PropTypes.string,\n timeZone: PropTypes.string,\n pathOpts: PropTypes.shape({\n routesPrefix: PropTypes.string,\n stopsPrefix: PropTypes.string,\n }),\n mobileLabel: PropTypes.string,\n lock: PropTypes.func.isRequired,\n unlock: PropTypes.func.isRequired,\n refPoint: PropTypes.shape({\n address: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n }),\n inputClassName: PropTypes.string,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number,\n }),\n modeIconColors: PropTypes.objectOf(PropTypes.string),\n getAutoSuggestIcons: PropTypes.objectOf(PropTypes.func),\n required: PropTypes.bool,\n modeSet: PropTypes.string,\n showScroll: PropTypes.bool,\n isEmbedded: PropTypes.bool,\n };\n\n static defaultProps = {\n autoFocus: false,\n className: '',\n icon: undefined,\n value: '',\n transportMode: undefined,\n filterResults: undefined,\n onClear: undefined,\n lang: 'fi',\n storeRef: undefined,\n handleViaPoints: undefined,\n focusChange: undefined,\n getAutoSuggestIcons: undefined,\n sources: [],\n targets: undefined,\n isMobile: false,\n isEmbedded: false,\n geocodingSize: undefined,\n color: '#007ac9',\n hoverColor: '#0062a1',\n accessiblePrimaryColor: '#0074be',\n timeZone: 'Europe/Helsinki',\n pathOpts: {\n routesPrefix: 'linjat',\n stopsPrefix: 'pysakit',\n },\n ariaLabel: undefined,\n mobileLabel: undefined,\n inputClassName: '',\n translatedPlaceholder: undefined,\n fontWeights: {\n medium: 500,\n },\n modeIconColors: {\n 'mode-bus': '#007ac9',\n 'mode-rail': '#8c4799',\n 'mode-tram': '#008151',\n 'mode-metro': '#ed8c00',\n 'mode-ferry': '#007A97',\n 'mode-citybike': '#f2b62d',\n 'mode-funicular': '#ff00ff',\n },\n required: false,\n modeSet: undefined,\n showScroll: false,\n refPoint: {},\n };\n\n constructor(props) {\n super(props);\n Settings.defaultZone = props.timeZone;\n Settings.defaultLocale = props.lang;\n this.state = {\n value: props.value,\n suggestions: [],\n editing: false,\n valid: true,\n renderMobileSearch: false,\n sources: props.sources,\n ownPlaces: false,\n typingTimer: null,\n typing: false,\n pendingSelection: null,\n suggestionIndex: 0,\n cleanExecuted: false,\n scrollY: 0,\n };\n Object.keys(translations).forEach(lang => {\n i18next.addResourceBundle(lang, 'translation', translations[lang]);\n });\n }\n\n // DT-4074: When a user's location is updated DTAutosuggest would re-render causing suggestion list to reset.\n // This will prevent it.\n shouldComponentUpdate(nextProps, nextState) {\n return !isEqual(nextState, this.state) || !isEqual(nextProps, this.props);\n }\n\n componentDidUpdate() {\n if (i18next.language !== this.props.lang) {\n i18next.changeLanguage(this.props.lang);\n }\n }\n\n // eslint-disable-next-line camelcase\n UNSAFE_componentWillReceiveProps(nextProps) {\n // wait until address is set or geolocationing fails\n if (nextProps.value !== this.state.value && !this.state.editing) {\n this.setState({\n value: nextProps.value,\n });\n }\n }\n\n onChange = (event, { newValue, method }) => {\n const newState = {\n value: this.fInput || newValue || '',\n renderMobileSearch: this.props.isMobile,\n };\n // Remove filled input value so it wont be reused unnecessary\n this.fInput = null;\n if (!this.state.editing) {\n newState.editing = true;\n this.setState(newState, () =>\n this.fetchFunction({ value: newValue || '' }),\n );\n } else if (method !== 'enter' || this.state.valid) {\n // test above drops unnecessary update\n // when user hits enter but search is unfinished\n if (this.state.typingTimer) {\n clearTimeout(this.state.typingTimer);\n }\n if (method === 'type') {\n // after timeout runs, aria alert will announce current selection\n const timer = setTimeout(() => {\n this.setState({ typing: false });\n }, 1000);\n newState.typingTimer = timer;\n newState.typing = true;\n }\n this.setState(newState);\n }\n };\n\n onBlur = () => {\n if (this.state.editing) {\n this.input.focus();\n }\n this.setState({\n editing: false,\n renderMobileSearch: false,\n value: this.props.value,\n });\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n };\n\n onSelected = (e, ref) => {\n if (this.state.valid) {\n if (ref.suggestion.type === 'SelectFromOwnLocations') {\n this.setState(\n {\n sources: ['Favourite', 'Back'],\n ownPlaces: true,\n pendingSelection: ref.suggestion.type,\n value: '',\n },\n () => {\n this.fetchFunction({ value: '' });\n },\n );\n return;\n }\n if (\n ref.suggestion.type === 'back' ||\n ref.suggestion.type === 'FutureRoute'\n ) {\n this.setState(\n {\n sources: this.props.sources,\n ownPlaces: false,\n pendingSelection: ref.suggestion.type,\n suggestionIndex: ref.suggestionIndex,\n },\n () => {\n this.fetchFunction({ value: '' });\n },\n );\n return;\n }\n this.selectionDone = true; // selection done, do not let upcoming keyboard events confuse the flow\n this.setState(\n {\n editing: false,\n value: ref.suggestionValue,\n },\n () => {\n this.input.blur();\n if (this.props.handleViaPoints) {\n this.props.handleViaPoints(ref.suggestion, ref.suggestionIndex);\n } else {\n this.props.onSelect(ref.suggestion, this.props.id);\n }\n this.setState(\n {\n renderMobileSearch: false,\n sources: this.props.sources,\n ownPlaces: false,\n suggestions: [],\n },\n () => {\n this.selectionDone = false;\n },\n );\n if (\n this.props.focusChange &&\n (!this.props.isMobile || this.props.isEmbedded)\n ) {\n this.props.focusChange();\n }\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n },\n );\n } else {\n this.setState(\n prevState => ({\n pendingSelection: prevState.value,\n }),\n () => this.checkPendingSelection(), // search may finish during state change\n );\n }\n };\n\n onSuggestionsClearRequested = () => {\n this.setState({\n suggestions: [],\n sources: this.props.sources,\n ownPlaces: false,\n editing: false,\n });\n };\n\n checkPendingSelection = () => {\n if (\n (this.state.pendingSelection === 'SelectFromOwnLocations' ||\n this.state.pendingSelection === 'back') &&\n this.state.valid\n ) {\n this.setState(\n {\n pendingSelection: null,\n editing: true,\n },\n () => {\n this.input.focus();\n },\n );\n // accept after all ongoing searches have finished\n } else if (this.state.pendingSelection && this.state.valid) {\n // finish the selection by picking first = best match or with 'FutureRoute' by suggestionIndex\n this.setState(\n {\n pendingSelection: null,\n editing: false,\n },\n () => {\n if (this.state.suggestions.length) {\n this.input.blur();\n const item = this.state.suggestions[this.state.suggestionIndex];\n if (item.type !== 'back') {\n this.props.onSelect(\n this.state.suggestions[this.state.suggestionIndex],\n this.props.id,\n );\n }\n if (this.props.isMobile && this.state.renderMobileSearch) {\n this.closeMobileSearch();\n }\n if (\n this.props.focusChange &&\n (!this.props.isMobile || this.props.isEmbedded)\n ) {\n this.props.focusChange();\n }\n }\n },\n );\n }\n };\n\n clearButton = () => {\n return (\n <button\n type=\"button\"\n className={styles['clear-input']}\n onClick={this.clearInput}\n aria-label={i18next.t('clear-button-label')}\n >\n <Icon img=\"close\" color={this.props.color} />\n </button>\n );\n };\n\n fetchFunction = ({ value, cleanExecuted }) => {\n return this.setState(\n { valid: false, cleanExecuted: !cleanExecuted ? false : cleanExecuted },\n () => {\n if (this.selectionDone) {\n // do not let component cast unnecessary requests\n return;\n }\n const { targets } = this.props;\n const useAll = isEmpty(targets);\n const isLocationSearch =\n isEmpty(targets) || targets.includes('Locations');\n let newTargets;\n if (this.state.ownPlaces) {\n newTargets = ['Locations'];\n if (useAll || targets.includes('Stops')) {\n newTargets.push('Stops');\n }\n if (useAll || targets.includes('Stations')) {\n newTargets.push('Stations');\n }\n if (useAll || targets.includes('VehicleRentalStations')) {\n newTargets.push('VehicleRentalStations');\n }\n } else if (!useAll) {\n newTargets = [...targets];\n // in desktop, favorites are accessed via sub search\n if (\n isLocationSearch &&\n !this.props.isMobile &&\n (isEmpty(this.props.sources) ||\n this.props.sources.includes('Favourite'))\n ) {\n newTargets.push('SelectFromOwnLocations');\n }\n }\n // remove location favourites in desktop search (collection item replaces it in target array)\n const sources =\n this.state.sources &&\n this.state.sources.filter(\n s =>\n !(\n isLocationSearch &&\n s === 'Favourite' &&\n !this.state.ownPlaces &&\n !this.props.isMobile\n ),\n );\n\n executeSearch(\n newTargets,\n sources,\n this.props.transportMode,\n this.props.searchContext,\n this.props.filterResults,\n this.props.geocodingSize,\n {\n input: value || '',\n },\n searchResult => {\n if (searchResult == null) {\n return;\n }\n // XXX translates current location\n const suggestions = (searchResult.results || [])\n .filter(\n suggestion =>\n suggestion.type !== 'FutureRoute' ||\n (suggestion.type === 'FutureRoute' &&\n suggestion.properties.time >\n DateTime.now().toUnixInteger()),\n )\n .map(suggestion => {\n if (\n suggestion.type === 'CurrentLocation' ||\n suggestion.type === 'SelectFromMap' ||\n suggestion.type === 'SelectFromOwnLocations' ||\n suggestion.type === 'back'\n ) {\n const translated = { ...suggestion };\n translated.properties.labelId = i18next.t(\n suggestion.properties.labelId,\n );\n return translated;\n }\n return suggestion;\n });\n if (\n value === this.state.value ||\n value === this.state.pendingSelection ||\n this.state.pendingSelection === 'SelectFromOwnLocations' ||\n this.state.pendingSelection === 'back' ||\n this.state.pendingSelection === 'FutureRoute'\n ) {\n this.setState(\n {\n valid: true,\n suggestions,\n },\n () => this.checkPendingSelection(),\n );\n }\n },\n this.props.pathOpts,\n this.props.refPoint,\n );\n },\n );\n };\n\n clearInput = () => {\n const newState = {\n editing: true,\n value: '',\n sources: this.props.sources,\n ownPlaces: false,\n renderMobileSearch: this.props.isMobile,\n };\n // must update suggestions\n this.setState(newState, () =>\n this.fetchFunction({ value: '', cleanExecuted: true }),\n );\n if (this.props.onClear) {\n this.props.onClear(this.props.id);\n }\n this.input.focus();\n };\n\n inputClicked = inputValue => {\n this.input.focus();\n this.clearLocationText();\n if (this.props.isMobile) {\n this.props.lock();\n }\n if (!this.state.editing) {\n const newState = {\n editing: true,\n // reset at start, just in case we missed something\n pendingSelection: null,\n renderMobileSearch: this.props.isMobile,\n };\n\n // DT-3263: added stateKeyDown\n const stateKeyDown = {\n editing: true,\n pendingSelection: null,\n value: inputValue,\n };\n\n if (!this.state.suggestions.length) {\n // DT-3263: added if-else statement\n if (typeof inputValue === 'object' || !inputValue) {\n this.setState(newState, () =>\n this.fetchFunction({ value: this.state.value }),\n );\n } else {\n this.setState(stateKeyDown, () =>\n this.fetchFunction({ value: inputValue }),\n );\n }\n } else {\n this.fetchFunction({ value: this.state.value });\n this.setState(newState);\n }\n } else if (this.props.isMobile && !this.state.renderMobileSearch) {\n this.setState({ renderMobileSearch: true });\n }\n };\n\n storeInputReference = autosuggest => {\n if (autosuggest !== null) {\n this.input = autosuggest.input;\n if (this.props.storeRef) {\n this.props.storeRef(autosuggest.input);\n }\n }\n };\n\n // Fill input when user clicks fill input button in street suggestion item\n fillInput = newValue => {\n this.fInput = newValue.properties.name;\n const newState = {\n editing: true,\n value: newValue.properties.name,\n checkPendingSelection: newValue,\n valid: true,\n };\n // must update suggestions\n this.setState(newState);\n this.fetchFunction({ value: newValue.properties.name });\n this.input.focus();\n };\n\n renderItem = item => {\n const newItem =\n item.type === 'FutureRoute'\n ? {\n ...item,\n translatedText: translateFutureRouteSuggestionTime(item),\n }\n : item;\n const content = getSuggestionContent(item);\n return (\n <SuggestionItem\n item={newItem}\n content={content}\n loading={!this.state.valid}\n isMobile={this.props.isMobile}\n ariaFavouriteString={i18next.t('favourite')}\n color={this.props.color}\n accessiblePrimaryColor={this.props.accessiblePrimaryColor}\n fillInput={this.fillInput}\n fontWeights={this.props.fontWeights}\n getAutoSuggestIcons={this.props.getAutoSuggestIcons}\n modeIconColors={this.props.modeIconColors}\n modeSet={this.props.modeSet}\n />\n );\n };\n\n closeMobileSearch = () => {\n this.props.unlock();\n this.setState(\n {\n renderMobileSearch: false,\n value: this.props.value,\n },\n () => {\n window.scrollTo(0, this.state.scrollY);\n this.onSuggestionsClearRequested();\n },\n );\n this.input.focus();\n // This closes the mobile keyboard\n this.input.blur();\n };\n\n keyDown = event => {\n if (this.selectionDone) {\n return;\n }\n const keyCode = event.key;\n if (keyCode === 'Shift') {\n // This enables shift + tab to be used\n return;\n }\n if (keyCode === 'Escape') {\n // Using onBlur makes 'Escape' act similarly to using 'Tab'\n this.onBlur();\n }\n if (this.state.editing) {\n if (keyCode === 'Enter' && this.state.value !== '') {\n this.setState({ pendingSelection: true }, () => {\n this.fetchFunction({ value: this.state.value });\n });\n }\n this.inputClicked();\n return;\n }\n\n if (\n (keyCode === 'Enter' || keyCode === 'ArrowDown') &&\n this.state.value === ''\n ) {\n this.clearInput();\n return;\n }\n\n if (keyCode === 'ArrowDown' && this.state.value !== '') {\n const newState = {\n editing: true,\n value: this.state.value,\n };\n // must update suggestions\n this.setState(newState, () =>\n this.fetchFunction({ value: this.state.value }),\n );\n }\n if (!this.state.editing) {\n this.setState({ editing: true });\n this.clearLocationText();\n }\n\n if (keyCode === 'Tab') {\n this.onBlur();\n }\n };\n\n suggestionAsAriaContent = () => {\n let label = [];\n const firstSuggestion = this.state.suggestions[0];\n if (firstSuggestion) {\n if (firstSuggestion.type && firstSuggestion.type.includes('Favourite')) {\n label.push(i18next.t('favourite'));\n }\n label = label.concat(getSuggestionContent(this.state.suggestions[0]));\n }\n return [...new Set(label)].join(' - ');\n };\n\n clearOldSearches = () => {\n const { context, clearOldSearches, clearFutureRoutes } =\n this.props.searchContext;\n if (context && clearOldSearches) {\n clearOldSearches(context);\n if (clearFutureRoutes) {\n clearFutureRoutes(context);\n }\n this.fetchFunction({ value: this.state.value });\n }\n };\n\n isOriginDestinationOrViapoint = () =>\n this.props.id === 'origin' ||\n this.props.id === 'destination' ||\n this.props.id === 'via-point' ||\n this.props.id === 'origin-stop-near-you';\n\n clearLocationText = () => {\n const positions = [\n 'Valittu sijainti',\n 'Nykyinen sijaintisi',\n 'Current position',\n 'Selected location',\n 'Vald position',\n 'Använd min position',\n 'Min position',\n 'Käytä nykyistä sijaintia',\n 'Use current location',\n 'Your current location',\n 'Wybrane miejsce',\n ];\n if (positions.includes(this.state.value)) {\n this.clearInput();\n }\n };\n\n onFocus = () => {\n const scrollY = window.pageYOffset;\n return this.setState({ scrollY });\n };\n\n render() {\n if (i18next.language !== this.props.lang) {\n i18next.changeLanguage(this.props.lang);\n }\n const { value, suggestions, renderMobileSearch, cleanExecuted } =\n this.state;\n const inputProps = {\n placeholder: this.props.translatedPlaceholder\n ? this.props.translatedPlaceholder\n : i18next.t(this.props.placeholder),\n value,\n onChange: this.onChange,\n onBlur: this.onBlur,\n className: cx(\n `${styles.input} ${\n this.props.isMobile && this.props.transportMode ? styles.thin : ''\n } ${styles[this.props.id] || ''} ${\n this.state.value ? styles.hasValue : ''\n } ${this.props.inputClassName}`,\n ),\n onKeyDown: this.keyDown, // DT-3263\n required: this.props.required,\n };\n const ariaBarId = this.props.id.replace('searchfield-', '');\n let SearchBarId = this.props.ariaLabel || i18next.t(ariaBarId);\n SearchBarId = SearchBarId.replace('searchfield-', '').concat('.'); // Full stop makes screen reader speech clearer.\n const ariaRequiredText = this.props.required\n ? `${i18next.t('required')}.`\n : '';\n const ariaLabelInstructions = this.props.isMobile\n ? i18next.t('search-autosuggest-label-instructions-mobile')\n : i18next.t('search-autosuggest-label-instructions-desktop');\n const movingToDestinationFieldText =\n this.props.id === 'origin'\n ? i18next.t('search-autosuggest-label-move-to-destination')\n : '';\n const ariaLabelText = ariaLabelInstructions\n .concat(' ')\n .concat(movingToDestinationFieldText);\n\n const ariaSuggestionLen = i18next.t('search-autosuggest-len', {\n count: suggestions.length,\n });\n\n const ariaCurrentSuggestion = () => {\n if (this.suggestionAsAriaContent() || this.props.value) {\n return i18next.t('search-current-suggestion', {\n selection:\n this.suggestionAsAriaContent().toLowerCase() || this.props.value,\n });\n }\n return '';\n };\n\n return (\n <React.Fragment>\n <span className={styles['sr-only']} role=\"alert\">\n {!this.state.typing &&\n this.state.editing &&\n `${ariaSuggestionLen} ${ariaCurrentSuggestion()}`}\n </span>\n {this.props.isMobile && (\n <MobileSearch\n searchOpen={renderMobileSearch}\n appElement={this.props.appElement}\n clearOldSearches={this.clearOldSearches}\n id={this.props.id}\n clearInput={this.clearInput}\n value={this.state.value}\n suggestions={[\n ...suggestions,\n {\n type: 'clear-search-history',\n labelId: i18next.t('clear-search-history'),\n },\n ]}\n inputProps={{\n ...inputProps,\n placeholder: this.isOriginDestinationOrViapoint()\n ? i18next.t('address-place-or-business')\n : inputProps.placeholder,\n }}\n fetchFunction={this.fetchFunction}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={this.renderItem}\n closeHandle={this.closeMobileSearch}\n ariaLabel={ariaRequiredText\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaCurrentSuggestion())}\n label={\n this.props.mobileLabel\n ? this.props.mobileLabel\n : i18next.t(this.props.id)\n }\n onSuggestionSelected={this.onSelected}\n dialogHeaderText={i18next.t('delete-old-searches-header')}\n dialogPrimaryButtonText={i18next.t('delete')}\n dialogSecondaryButtonText={i18next.t('cancel')}\n clearInputButtonText={i18next.t('clear-button-label')}\n focusInput={cleanExecuted}\n color={this.props.color}\n hoverColor={this.props.hoverColor}\n accessiblePrimaryColor={this.props.accessiblePrimaryColor}\n fontWeights={this.props.fontWeights}\n showScroll={this.props.showScroll}\n />\n )}\n {!renderMobileSearch && (\n <div\n className={cx([\n styles['autosuggest-input-container'],\n styles[this.props.id],\n ])}\n style={{\n '--color': `${this.props.color}`,\n '--hover-color': `${this.props.hoverColor}`,\n }}\n >\n {this.props.icon && (\n <div\n className={cx([\n styles[`autosuggest-input-icon`],\n styles[this.props.id],\n this.props.inputClassName &&\n `${this.props.inputClassName}-input-icon`,\n ])}\n aria-label={ariaRequiredText\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(i18next.t('search-autosuggest-label'))}\n >\n <Icon img={`${this.props.icon}`} />\n </div>\n )}\n <Autosuggest\n alwaysRenderSuggestions={this.state.editing}\n id={this.props.id}\n suggestions={suggestions}\n onSuggestionsFetchRequested={this.fetchFunction}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={this.renderItem}\n inputProps={{\n ...inputProps,\n onFocus: this.onFocus,\n }}\n focusInputOnSuggestionClick\n shouldRenderSuggestions={() => this.state.editing}\n highlightFirstSuggestion={!this.state.ownPlaces}\n theme={styles}\n renderInputComponent={p => (\n <>\n <label className={styles['sr-only']} htmlFor={this.props.id}>\n {ariaCurrentSuggestion()\n .concat(' ')\n .concat(ariaRequiredText)\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaLabelText)}\n </label>\n <input\n aria-label={ariaCurrentSuggestion()\n .concat(' ')\n .concat(ariaRequiredText)\n .concat(' ')\n .concat(SearchBarId)\n .concat(' ')\n .concat(ariaLabelText)}\n id={this.props.id}\n onClick={this.inputClicked}\n onKeyDown={this.keyDown}\n {...p}\n />\n {this.state.value && this.clearButton()}\n </>\n )}\n onSuggestionSelected={this.onSelected}\n ref={this.storeInputReference}\n />\n </div>\n )}\n </React.Fragment>\n );\n }\n}\n\nconst DTAutosuggestWithScrollLock = withScrollLock(DTAutosuggest);\n\nexport default DTAutosuggestWithScrollLock;\n","import { getNameLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\n/**\n * Returns label for properties\n *\n * @name getLabel\n * @param {*} properties object\n * @returns {Boolean} true/false\n */\nexport default function getLabel(properties) {\n const parts = getNameLabel(properties, true);\n switch (properties.layer) {\n case 'selectFromMap':\n case 'currentPosition':\n case 'ownLocations':\n case 'back':\n return parts[1] || parts[0];\n case 'favouriteVehicleRentalStation':\n case 'favouritePlace':\n return parts[0];\n default:\n return parts.length > 1 && parts[1] !== ''\n ? parts.join(', ')\n : parts[1] || parts[0];\n }\n}\n","import React from 'react';\nimport hooks from '@hsl-fi/hooks';\n\nconst withScrollLock = Component => {\n return props => {\n const { lock, unlock } = hooks.useScrollLock();\n\n return <Component lock={lock} unlock={unlock} {...props} />;\n };\n};\n\nexport default withScrollLock;\n"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPropertyKey","t","i","r","e","toPrimitive","call","TypeError","String","Number","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","truEq","val1","val2","gtfsStopLayers","vehicleRentalLayers","labelIdToGid","id","parts","split","length","isDuplicate","item1","item2","props1","properties","props2","type","o1","origin","d1","destination","o2","d2","name","localadmin","includes","layer","gid","labelId","gtfsId","p1","geometry","coordinates","undefined","p2","Math","abs","label","address","normalize","str","isString","toLowerCase","LayerType","isStop","getLayerRank","source","indexOf","sortSearchResults","lineRegexp","results","term","Array","isArray","isLineIdentifier","test","normalizedTerm","isLineSearch","orderedResults","orderBy","result","shortName","confidence","match","resultProperties","map","filter","normalizedValue","reduce","previous","current","uniqWith","sortedSearchResults","orderedResultsWithLettersFirst","currentLength","letterArray","numberArray","_sortedSearchResults$","_sortedSearchResults$3","_sortedSearchResults$2","concat","isNaN","slice","push","orderResultsWithLettersFirst","getStopName","stopCode","lastIndexOf","substring","filterMatchingToInput","list","Input","fields","input","trim","multiWord","item","forEach","pName","get","splice","join","replace","serialize","obj","prefix","keys","p","k","v","encodeURIComponent","axios","require","default","getJson","url","params","encodeURI","search","timeout","method","headers","Accept","then","res","data","getGeocodingResults","searchString","searchParams","lang","focusPoint","sources","peliasUrl","minimalRegexp","geocodingLayers","text","Promise","resolve","PELIAS_URL","opts","_objectSpread","layers","toString","features","getStopsFromGeocoding","stops","URL_PELIAS_PLACE","gids","stopStationMap","stop","code","stopOrStation","ids","addendum","lastUpdated","favouriteId","filterOldSearches","oldSearches","dropLayers","matchingOldSearches","take","newItem","timetableClicked","arrowClicked","routeLayers","locationLayers","parkingLayers","stopLayers","debouncedSearch","debounce","targets","transportMode","searchContext","filterResults","geocodingSize","callback","pathOpts","refPoint","getPositions","getFavouriteLocations","getOldSearches","getFavouriteStops","parkingAreaSources","getLanguage","getStopAndStationsQuery","getFavouriteVehicleRentalStationsQuery","getFavouriteVehicleRentalStations","getFavouriteRoutesQuery","getFavouriteRoutes","getRoutesQuery","context","isPeliasLocationAware","locationAware","URL_PELIAS","feedIDs","geocodingSearchParams","geocodingSources","getFutureRoutes","cityBikeNetworks","allTargets","allSources","position","searchComponents","searches","language","lat","lon","toFixed","mode","status","getCurrentPositionIfEmpty","selectPositionFomMap","items","favouriteLocations","favouriteVehicleRentalStations","favouriteStops","hasFavourites","selectFromOwnLocations","favourites","filterFavouriteLocations","locationHistory","size","feedIds","history","useStops","useStations","stopsAndStations","every","stopsStations","s","filterFavouriteStops","dedupestops","feeds","stopHistory","favouriteRoutes","routeHistory","favouriteVehicleRentalStation","all","flatten","catch","err","error","leading","getLocaladmin","suggestion","getStopCode","getNameLabel","memoize","plain","RegExp","escapeRegExp","longName","agency","formatFavouritePlaceLabel","cloneDeep","translations","de","airplane","arrival","back","bikerentalstation","bus","cancel","currentposition","delete","departure","favourite","ferry","ownlocations","loading","rail","street","subway","station","tram","venue","where","place","en","bikepark","carpark","platform","required","track","fi","vehiclerentalstation","pl","sv","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","AutosuggestPatch","Autosuggest","props","super","self","this","onSuggestionTouchMove","justSelectedSuggestion","pressedSuggestion","MobileSearch","appElement","closeHandle","clearInput","suggestions","inputProps","fetchFunction","renderSuggestion","getSuggestionValue","ariaLabel","onSuggestionSelected","clearOldSearches","dialogHeaderText","dialogPrimaryButtonText","dialogSecondaryButtonText","clearInputButtonText","focusInput","color","hoverColor","accessiblePrimaryColor","searchOpen","fontWeights","showScroll","_inputRef$current","styles","mobileStyles","mobileNoScrollStyles","inputId","isDialogOpen","setDialogOpen","useState","inputRef","React","useRef","useEffect","ReactModal","setAppElement","onClose","useCallback","onSelect","isKeyboardSelectionEvent","event","key","which","keyCode","preventDefault","getValue","renderItem","className","focus","isOpen","overlayClassName","onAfterClose","shouldCloseOnEsc","medium","htmlFor","onClick","onKeyDown","tabIndex","Icon","img","alwaysRenderSuggestions","onSuggestionsFetchRequested","focusInputOnSuggestionClick","shouldRenderSuggestions","hasValue","autoFocus","renderInputComponent","Fragment","assign","theme","DialogModal","isModalOpen","handleClose","headerText","primaryButtonText","secondaryButtonText","primaryButtonOnClick","secondaryButtonOnClick","process","env","NODE_ENV","propTypes","PropTypes","string","isRequired","func","arrayOf","object","shape","onChange","onBlur","placeholder","bool","number","defaultProps","module","exports","require$$0","n","g","window","ignore","header","topOnEmptyHash","speed","speedAsDuration","durationMax","durationMin","clip","offset","easing","customEasing","updateURL","popstate","emitEvents","arguments","hasOwnProperty","charAt","substr","u","charCodeAt","InvalidCharacterError","max","body","scrollHeight","documentElement","offsetHeight","clientHeight","parseInt","getComputedStyle","height","offsetTop","activeElement","setAttribute","outline","scrollTo","CustomEvent","bubbles","detail","anchor","toggle","dispatchEvent","c","a","l","f","d","cancelScroll","cancelAnimationFrame","animateScroll","h","m","tagName","y","pageYOffset","querySelector","b","w","E","O","offsetParent","min","innerHeight","S","_","I","M","L","floor","requestAnimationFrame","pushState","smoothScroll","JSON","stringify","title","matchMedia","matches","defaultPrevented","button","metaKey","ctrlKey","shiftKey","target","closest","hostname","location","pathname","href","decodeURIComponent","hash","replaceState","state","destroy","removeEventListener","Element","addEventListener","apply","__createBinding","create","__exportStar","useArrowNavigation","listItems","onArrowUpOrDown","selectedIndex","useDebounce","setTimeout","clearTimeout","useElementSize","width","clientWidth","useIntersectionObserver","isIntersecting","IntersectionObserver","observe","unobserve","containerRef","isVisible","useIsBreakpoint","xs","mobileSmall","mobile","tablet","tabletLarge","desktopSmall","desktop","desktopLarge","innerWidth","useOnResize","useIsLoadingAfterError","useIsMobile","useIsomorphicLayoutEffect","useLayoutEffect","useOnLoseFocusWithin","watch","passive","useOnWindowFocus","visibilityState","useOutsideReacter","contains","useRunAfterUpdate","useScrollLock","lock","scrollY","top","unlock","__importDefault","__esModule","useSmoothScroll","globalThis","Function","Settings","defaultLocale","i18next__default","init","fallbackLng","defaultNS","interpolation","escapeValue","node","getPlatform","GTFS","modes","i18next","getSuggestionContent","suggestionType","_item$properties$adde","tail1","locality","tail2","name1","name2","translatedText","translateFutureRouteSuggestionTime","time","DateTime","fromSeconds","now","arriveBy","hasSame","plus","days","toFormat","getLabel","DTAutosuggest","Component","newValue","newState","fInput","renderMobileSearch","isMobile","editing","valid","typingTimer","timer","setState","typing","closeMobileSearch","ownPlaces","pendingSelection","suggestionIndex","selectionDone","suggestionValue","blur","handleViaPoints","focusChange","isEmbedded","prevState","checkPendingSelection","cleanExecuted","useAll","isEmpty","isLocationSearch","newTargets","executeSearch","searchResult","toUnixInteger","translated","onClear","inputValue","clearLocationText","stateKeyDown","autosuggest","storeRef","content","SuggestionItem","ariaFavouriteString","fillInput","getAutoSuggestIcons","modeIconColors","modeSet","onSuggestionsClearRequested","inputClicked","firstSuggestion","Set","clearFutureRoutes","defaultZone","timeZone","addResourceBundle","shouldComponentUpdate","nextProps","nextState","isEqual","componentDidUpdate","changeLanguage","UNSAFE_componentWillReceiveProps","render","translatedPlaceholder","thin","inputClassName","keyDown","ariaBarId","SearchBarId","ariaRequiredText","ariaLabelInstructions","movingToDestinationFieldText","ariaLabelText","ariaSuggestionLen","count","ariaCurrentSuggestion","suggestionAsAriaContent","selection","role","isOriginDestinationOrViapoint","mobileLabel","onSelected","cx","icon","onFocus","highlightFirstSuggestion","clearButton","storeInputReference","routesPrefix","stopsPrefix","objectOf","DTAutosuggestWithScrollLock","hooks"],"mappings":"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"}
|