@opentripplanner/vehicle-rental-overlay 3.0.1-alpha.1 → 3.0.1-alpha.2

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/README.md CHANGED
@@ -4,3 +4,5 @@
4
4
 
5
5
  TBD
6
6
  ```
7
+
8
+ <!-- Updated for semantic release trigger -->
package/lib/index.js CHANGED
@@ -45,7 +45,7 @@ const VehicleRentalOverlay = ({
45
45
  const {
46
46
  current: map
47
47
  } = (0, _reactMapGl.useMap)();
48
- const [zoom, setZoom] = (0, _react.useState)(map?.getZoom());
48
+ const [zoom, setZoom] = (0, _react.useState)(map === null || map === void 0 ? void 0 : map.getZoom());
49
49
  const layerId = `rental-vehicles-${id}`;
50
50
  const [clickedVehicle, setClickedVehicle] = (0, _react.useState)(null);
51
51
  (0, _react.useEffect)(() => {
@@ -54,19 +54,20 @@ const VehicleRentalOverlay = ({
54
54
  return;
55
55
  }
56
56
  refreshVehicles();
57
- setInterval(refreshVehicles, 30_000);
57
+ setInterval(refreshVehicles, 30000);
58
58
  }, [refreshVehicles]);
59
59
  (0, _react.useEffect)(() => {
60
60
  const VEHICLE_LAYERS = [layerId];
61
61
  VEHICLE_LAYERS.forEach(stopLayer => {
62
- map?.on("mouseenter", stopLayer, () => {
62
+ map === null || map === void 0 || map.on("mouseenter", stopLayer, () => {
63
63
  map.getCanvas().style.cursor = "pointer";
64
64
  });
65
- map?.on("mouseleave", stopLayer, () => {
65
+ map === null || map === void 0 || map.on("mouseleave", stopLayer, () => {
66
66
  map.getCanvas().style.cursor = "";
67
67
  });
68
- map?.on("click", stopLayer, event => {
69
- setClickedVehicle(event.features?.[0].properties);
68
+ map === null || map === void 0 || map.on("click", stopLayer, event => {
69
+ var _event$features;
70
+ setClickedVehicle((_event$features = event.features) === null || _event$features === void 0 ? void 0 : _event$features[0].properties);
70
71
  });
71
72
  });
72
73
  map.on("zoom", e => {
@@ -130,7 +131,7 @@ const VehicleRentalOverlay = ({
130
131
  }),
131
132
  position: [station.y, station.x]
132
133
  }, station.bikesAvailable !== undefined && !station.isFloatingBike && !station.isFloatingVehicle && station.spacesAvailable !== undefined ? /*#__PURE__*/_react.default.createElement(_styled.BaseBikeRentalIcon, {
133
- percent: station?.bikesAvailable / (station?.bikesAvailable + station?.spacesAvailable)
134
+ percent: (station === null || station === void 0 ? void 0 : station.bikesAvailable) / ((station === null || station === void 0 ? void 0 : station.bikesAvailable) + (station === null || station === void 0 ? void 0 : station.spacesAvailable))
134
135
  }) : /*#__PURE__*/_react.default.createElement(_styled.StationMarker, {
135
136
  width: 12,
136
137
  color: getColorForStation(station)
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_baseMap","require","_react","_interopRequireWildcard","_reactMapGl","_mapPopup","_interopRequireDefault","_styled","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","DETAILED_MARKER_CUTOFF","getColorForStation","v","isFloatingCar","isFloatingVehicle","bikesAvailable","undefined","isFloatingBike","VehicleRentalOverlay","companies","configCompanies","getStationName","id","refreshVehicles","setLocation","stations","visible","current","map","useMap","zoom","setZoom","useState","getZoom","layerId","clickedVehicle","setClickedVehicle","useEffect","setInterval","VEHICLE_LAYERS","forEach","stopLayer","on","getCanvas","style","cursor","event","features","properties","newZoom","viewState","Math","floor","length","createElement","Fragment","vehiclesGeoJSON","type","filter","vehicle","networks","includes","geometry","coordinates","x","y","JSON","stringify","color","Source","data","Layer","paint","station","MarkerWithPopup","key","popupContents","location","getEntityName","s","cc","entity","position","spacesAvailable","BaseBikeRentalIcon","percent","StationMarker","width","Popup","latitude","longitude","maxWidth","onClose","parse","_default","exports"],"sources":["../src/index.tsx"],"sourcesContent":["import { MarkerWithPopup, Popup } from \"@opentripplanner/base-map\";\nimport {\n Company,\n ConfiguredCompany,\n MapLocationActionArg,\n Station\n} from \"@opentripplanner/types\";\nimport { EventData } from \"mapbox-gl\";\nimport React, { useEffect, useState } from \"react\";\nimport { Layer, Source, useMap } from \"react-map-gl\";\n\nimport StationPopup from \"@opentripplanner/map-popup\";\nimport { BaseBikeRentalIcon, StationMarker } from \"./styled\";\n\n// TODO: Make configurable?\nconst DETAILED_MARKER_CUTOFF = 16;\n\nconst getColorForStation = (v: Station) => {\n if (v.isFloatingCar) return \"#009cde\";\n if (v.isFloatingVehicle) return \"#f5a729\";\n // TODO: nicer color to match transitive\n if (v.bikesAvailable !== undefined || v.isFloatingBike) return \"#f00\";\n return \"gray\";\n};\n\ntype Props = {\n /**\n * A list of companies that are applicable to just this instance of the\n * overlay.\n */\n companies?: string[];\n /**\n * The entire companies config array.\n */\n configCompanies: ConfiguredCompany[];\n /**\n * An id, used to make this layer uniquely identifiable\n */\n id: string;\n /**\n * An optional custom function to create a string name of a particular vehicle\n * rental station. This function takes two arguments of the configCompanies\n * prop and a vehicle rental station. The function must return a string.\n */\n getStationName?: (configCompanies: Company[], station: Station) => string;\n /**\n * If specified, a function that will be triggered every 30 seconds whenever this layer is\n * visible.\n */\n refreshVehicles?: () => void;\n /**\n * A callback for when a user clicks on setting this stop as either the from\n * or to location of a new search.\n *\n * This will be dispatched with the following argument:\n *\n * ```js\n * {\n * location: {\n * lat: number,\n * lon: number,\n * name: string\n * },\n * locationType: \"from\" or \"to\"\n * }\n * ```\n */\n setLocation?: (arg: MapLocationActionArg) => void;\n /**\n * A list of the vehicle rental stations specific to this overlay instance.\n */\n stations: Station[];\n /**\n * Whether the overlay is currently visible.\n */\n visible?: boolean;\n /**\n * TODO: Add props for overriding symbols?\n */\n};\n\n/**\n * This vehicle rental overlay can be used to render vehicle rentals of various\n * types. This layer can be configured to show different styles of markers at\n * different zoom levels.\n */\nconst VehicleRentalOverlay = ({\n companies,\n configCompanies,\n getStationName,\n id,\n refreshVehicles,\n setLocation,\n stations,\n visible\n}: Props): JSX.Element => {\n const { current: map } = useMap();\n const [zoom, setZoom] = useState(map?.getZoom());\n\n const layerId = `rental-vehicles-${id}`;\n const [clickedVehicle, setClickedVehicle] = useState(null);\n\n useEffect(() => {\n // TODO: Make 30s configurable?\n if (!refreshVehicles || typeof refreshVehicles !== \"function\") {\n return;\n }\n\n refreshVehicles();\n setInterval(refreshVehicles, 30_000);\n }, [refreshVehicles]);\n\n useEffect(() => {\n const VEHICLE_LAYERS = [layerId];\n VEHICLE_LAYERS.forEach(stopLayer => {\n map?.on(\"mouseenter\", stopLayer, () => {\n map.getCanvas().style.cursor = \"pointer\";\n });\n map?.on(\"mouseleave\", stopLayer, () => {\n map.getCanvas().style.cursor = \"\";\n });\n map?.on(\"click\", stopLayer, (event: EventData) => {\n setClickedVehicle(event.features?.[0].properties);\n });\n });\n map.on(\"zoom\", e => {\n // Avoid too many re-renders by only updating state if we are a whole number value different\n const { zoom: newZoom } = e.viewState;\n if (Math.floor(zoom / 2) !== Math.floor(newZoom / 2)) {\n setZoom(newZoom);\n }\n });\n }, [map]);\n\n // Don't render if no map or no stops are defined.\n if (visible === false || !stations || stations.length === 0) {\n // Null can't be returned here -- react-map-gl dislikes null values as children\n return <></>;\n }\n\n const vehiclesGeoJSON: GeoJSON.FeatureCollection = {\n type: \"FeatureCollection\",\n features: stations\n .filter(\n vehicle =>\n // Include specified companies only if companies is specified and network info is available\n !companies ||\n !vehicle.networks ||\n companies.includes(vehicle.networks[0])\n )\n .map(vehicle => ({\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [vehicle.x, vehicle.y] },\n properties: {\n ...vehicle,\n networks: JSON.stringify(vehicle.networks),\n \"stroke-width\":\n vehicle.isFloatingBike || vehicle.isFloatingVehicle ? 1 : 2,\n color: getColorForStation(vehicle)\n }\n }))\n };\n\n return (\n <>\n {zoom < DETAILED_MARKER_CUTOFF && (\n <Source type=\"geojson\" data={vehiclesGeoJSON}>\n <Layer\n id={layerId}\n paint={{\n \"circle-color\": [\"get\", \"color\"],\n \"circle-opacity\": 0.9,\n \"circle-stroke-color\": \"#333\",\n \"circle-stroke-width\": [\"get\", \"stroke-width\"]\n }}\n type=\"circle\"\n />\n {/* this is where we add the symbols layer. add a second layer that gets swapped in and out dynamically */}\n </Source>\n )}\n {zoom >= DETAILED_MARKER_CUTOFF &&\n stations.map(station => (\n <MarkerWithPopup\n key={station.id}\n popupContents={\n <StationPopup\n configCompanies={configCompanies}\n setLocation={location => {\n setClickedVehicle(null);\n setLocation(location);\n }}\n getEntityName={\n // @ts-expect-error no stop support. Avoid a breaking change\n getStationName && ((s, cc) => getStationName(cc, s))\n }\n entity={station}\n />\n }\n position={[station.y, station.x]}\n >\n {station.bikesAvailable !== undefined &&\n !station.isFloatingBike &&\n !station.isFloatingVehicle &&\n station.spacesAvailable !== undefined ? (\n <BaseBikeRentalIcon\n percent={\n station?.bikesAvailable /\n (station?.bikesAvailable + station?.spacesAvailable)\n }\n />\n ) : (\n <StationMarker width={12} color={getColorForStation(station)} />\n )}\n </MarkerWithPopup>\n ))}\n {clickedVehicle && (\n <Popup\n latitude={clickedVehicle.y}\n longitude={clickedVehicle.x}\n maxWidth=\"100%\"\n onClose={() => {\n setClickedVehicle(null);\n }}\n >\n <StationPopup\n configCompanies={configCompanies}\n getEntityName={\n // @ts-expect-error no stop support. Avoid a breaking change\n getStationName && ((s, cc) => getStationName(cc, s))\n }\n setLocation={location => {\n setClickedVehicle(null);\n setLocation(location);\n }}\n entity={{\n ...clickedVehicle,\n networks: JSON.parse(clickedVehicle.networks)\n }}\n />\n </Popup>\n )}\n </>\n );\n};\nexport default VehicleRentalOverlay;\nexport { StationPopup };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_baseMap","require","_react","_interopRequireWildcard","_reactMapGl","_mapPopup","_interopRequireDefault","_styled","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","DETAILED_MARKER_CUTOFF","getColorForStation","v","isFloatingCar","isFloatingVehicle","bikesAvailable","undefined","isFloatingBike","VehicleRentalOverlay","companies","configCompanies","getStationName","id","refreshVehicles","setLocation","stations","visible","current","map","useMap","zoom","setZoom","useState","getZoom","layerId","clickedVehicle","setClickedVehicle","useEffect","setInterval","VEHICLE_LAYERS","forEach","stopLayer","on","getCanvas","style","cursor","event","_event$features","features","properties","newZoom","viewState","Math","floor","length","createElement","Fragment","vehiclesGeoJSON","type","filter","vehicle","networks","includes","geometry","coordinates","x","y","JSON","stringify","color","Source","data","Layer","paint","station","MarkerWithPopup","key","popupContents","location","getEntityName","s","cc","entity","position","spacesAvailable","BaseBikeRentalIcon","percent","StationMarker","width","Popup","latitude","longitude","maxWidth","onClose","parse","_default","exports"],"sources":["../src/index.tsx"],"sourcesContent":["import { MarkerWithPopup, Popup } from \"@opentripplanner/base-map\";\nimport {\n Company,\n ConfiguredCompany,\n MapLocationActionArg,\n Station\n} from \"@opentripplanner/types\";\nimport { EventData } from \"mapbox-gl\";\nimport React, { useEffect, useState } from \"react\";\nimport { Layer, Source, useMap } from \"react-map-gl\";\n\nimport StationPopup from \"@opentripplanner/map-popup\";\nimport { BaseBikeRentalIcon, StationMarker } from \"./styled\";\n\n// TODO: Make configurable?\nconst DETAILED_MARKER_CUTOFF = 16;\n\nconst getColorForStation = (v: Station) => {\n if (v.isFloatingCar) return \"#009cde\";\n if (v.isFloatingVehicle) return \"#f5a729\";\n // TODO: nicer color to match transitive\n if (v.bikesAvailable !== undefined || v.isFloatingBike) return \"#f00\";\n return \"gray\";\n};\n\ntype Props = {\n /**\n * A list of companies that are applicable to just this instance of the\n * overlay.\n */\n companies?: string[];\n /**\n * The entire companies config array.\n */\n configCompanies: ConfiguredCompany[];\n /**\n * An id, used to make this layer uniquely identifiable\n */\n id: string;\n /**\n * An optional custom function to create a string name of a particular vehicle\n * rental station. This function takes two arguments of the configCompanies\n * prop and a vehicle rental station. The function must return a string.\n */\n getStationName?: (configCompanies: Company[], station: Station) => string;\n /**\n * If specified, a function that will be triggered every 30 seconds whenever this layer is\n * visible.\n */\n refreshVehicles?: () => void;\n /**\n * A callback for when a user clicks on setting this stop as either the from\n * or to location of a new search.\n *\n * This will be dispatched with the following argument:\n *\n * ```js\n * {\n * location: {\n * lat: number,\n * lon: number,\n * name: string\n * },\n * locationType: \"from\" or \"to\"\n * }\n * ```\n */\n setLocation?: (arg: MapLocationActionArg) => void;\n /**\n * A list of the vehicle rental stations specific to this overlay instance.\n */\n stations: Station[];\n /**\n * Whether the overlay is currently visible.\n */\n visible?: boolean;\n /**\n * TODO: Add props for overriding symbols?\n */\n};\n\n/**\n * This vehicle rental overlay can be used to render vehicle rentals of various\n * types. This layer can be configured to show different styles of markers at\n * different zoom levels.\n */\nconst VehicleRentalOverlay = ({\n companies,\n configCompanies,\n getStationName,\n id,\n refreshVehicles,\n setLocation,\n stations,\n visible\n}: Props): JSX.Element => {\n const { current: map } = useMap();\n const [zoom, setZoom] = useState(map?.getZoom());\n\n const layerId = `rental-vehicles-${id}`;\n const [clickedVehicle, setClickedVehicle] = useState(null);\n\n useEffect(() => {\n // TODO: Make 30s configurable?\n if (!refreshVehicles || typeof refreshVehicles !== \"function\") {\n return;\n }\n\n refreshVehicles();\n setInterval(refreshVehicles, 30_000);\n }, [refreshVehicles]);\n\n useEffect(() => {\n const VEHICLE_LAYERS = [layerId];\n VEHICLE_LAYERS.forEach(stopLayer => {\n map?.on(\"mouseenter\", stopLayer, () => {\n map.getCanvas().style.cursor = \"pointer\";\n });\n map?.on(\"mouseleave\", stopLayer, () => {\n map.getCanvas().style.cursor = \"\";\n });\n map?.on(\"click\", stopLayer, (event: EventData) => {\n setClickedVehicle(event.features?.[0].properties);\n });\n });\n map.on(\"zoom\", e => {\n // Avoid too many re-renders by only updating state if we are a whole number value different\n const { zoom: newZoom } = e.viewState;\n if (Math.floor(zoom / 2) !== Math.floor(newZoom / 2)) {\n setZoom(newZoom);\n }\n });\n }, [map]);\n\n // Don't render if no map or no stops are defined.\n if (visible === false || !stations || stations.length === 0) {\n // Null can't be returned here -- react-map-gl dislikes null values as children\n return <></>;\n }\n\n const vehiclesGeoJSON: GeoJSON.FeatureCollection = {\n type: \"FeatureCollection\",\n features: stations\n .filter(\n vehicle =>\n // Include specified companies only if companies is specified and network info is available\n !companies ||\n !vehicle.networks ||\n companies.includes(vehicle.networks[0])\n )\n .map(vehicle => ({\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [vehicle.x, vehicle.y] },\n properties: {\n ...vehicle,\n networks: JSON.stringify(vehicle.networks),\n \"stroke-width\":\n vehicle.isFloatingBike || vehicle.isFloatingVehicle ? 1 : 2,\n color: getColorForStation(vehicle)\n }\n }))\n };\n\n return (\n <>\n {zoom < DETAILED_MARKER_CUTOFF && (\n <Source type=\"geojson\" data={vehiclesGeoJSON}>\n <Layer\n id={layerId}\n paint={{\n \"circle-color\": [\"get\", \"color\"],\n \"circle-opacity\": 0.9,\n \"circle-stroke-color\": \"#333\",\n \"circle-stroke-width\": [\"get\", \"stroke-width\"]\n }}\n type=\"circle\"\n />\n {/* this is where we add the symbols layer. add a second layer that gets swapped in and out dynamically */}\n </Source>\n )}\n {zoom >= DETAILED_MARKER_CUTOFF &&\n stations.map(station => (\n <MarkerWithPopup\n key={station.id}\n popupContents={\n <StationPopup\n configCompanies={configCompanies}\n setLocation={location => {\n setClickedVehicle(null);\n setLocation(location);\n }}\n getEntityName={\n // @ts-expect-error no stop support. Avoid a breaking change\n getStationName && ((s, cc) => getStationName(cc, s))\n }\n entity={station}\n />\n }\n position={[station.y, station.x]}\n >\n {station.bikesAvailable !== undefined &&\n !station.isFloatingBike &&\n !station.isFloatingVehicle &&\n station.spacesAvailable !== undefined ? (\n <BaseBikeRentalIcon\n percent={\n station?.bikesAvailable /\n (station?.bikesAvailable + station?.spacesAvailable)\n }\n />\n ) : (\n <StationMarker width={12} color={getColorForStation(station)} />\n )}\n </MarkerWithPopup>\n ))}\n {clickedVehicle && (\n <Popup\n latitude={clickedVehicle.y}\n longitude={clickedVehicle.x}\n maxWidth=\"100%\"\n onClose={() => {\n setClickedVehicle(null);\n }}\n >\n <StationPopup\n configCompanies={configCompanies}\n getEntityName={\n // @ts-expect-error no stop support. Avoid a breaking change\n getStationName && ((s, cc) => getStationName(cc, s))\n }\n setLocation={location => {\n setClickedVehicle(null);\n setLocation(location);\n }}\n entity={{\n ...clickedVehicle,\n networks: JSON.parse(clickedVehicle.networks)\n }}\n />\n </Popup>\n )}\n </>\n );\n};\nexport default VehicleRentalOverlay;\nexport { StationPopup };\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentripplanner/vehicle-rental-overlay",
3
- "version": "3.0.1-alpha.1",
3
+ "version": "3.0.1-alpha.2",
4
4
  "description": "A map overlay to show vehicle rentals from a specific company",
5
5
  "main": "lib/index.js",
6
6
  "module": "esm/index.js",
@@ -18,13 +18,13 @@
18
18
  "@styled-icons/fa-solid": "^10.34.0",
19
19
  "flat": "^5.0.2",
20
20
  "lodash.memoize": "^4.1.2",
21
- "@opentripplanner/base-map": "5.0.0-alpha.8",
22
- "@opentripplanner/from-to-location-picker": "3.0.2-alpha.1",
23
- "@opentripplanner/map-popup": "5.2.0-alpha.2",
24
- "@opentripplanner/core-utils": "13.0.0-alpha.2"
21
+ "@opentripplanner/base-map": "5.0.0-alpha.9",
22
+ "@opentripplanner/core-utils": "13.0.0-alpha.3",
23
+ "@opentripplanner/map-popup": "5.2.0-alpha.3",
24
+ "@opentripplanner/from-to-location-picker": "3.0.2-alpha.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@opentripplanner/types": "7.0.0-alpha.16"
27
+ "@opentripplanner/types": "7.0.0-alpha.17"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "react": "^18.2.0",