@geops/rvf-mobility-web-component 0.1.17 → 0.1.19

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@geops/rvf-mobility-web-component",
3
3
  "license": "UNLICENSED",
4
4
  "description": "Web components for rvf in the domains of mobility and logistics.",
5
- "version": "0.1.17",
5
+ "version": "0.1.19",
6
6
  "homepage": "https://rvf-mobility-web-component-geops.vercel.app/",
7
7
  "type": "module",
8
8
  "main": "index.js",
@@ -1,5 +1,7 @@
1
1
  import { Feature } from "ol";
2
2
 
3
+ import RvfButton from "../../../RvfButton";
4
+ import { PROVIDER_BY_FEED_ID } from "../../../utils/constants";
3
5
  import getLinkByDevice from "../../../utils/getLinkByDevice";
4
6
 
5
7
  export interface FloatingVehiclesDetailsProps {
@@ -9,28 +11,45 @@ export interface FloatingVehiclesDetailsProps {
9
11
  function FloatingVehiclesDetails({ features }: FloatingVehiclesDetailsProps) {
10
12
  const renderedDetails = features.map((feature, idx) => {
11
13
  let vehicleNumber;
12
- if (feature.get("feed_id") === "yoio_freiburg") {
13
- vehicleNumber = feature.get("rental_uris_android").split("/").pop();
14
- } else if (feature.get("feed_id") === "zeus_freiburg") {
14
+ const { feed_id: feedId, rental_uris_android: androidLink } =
15
+ feature.getProperties();
16
+ if (/yoio/.test(feedId)) {
17
+ vehicleNumber = androidLink.split("/").pop();
18
+ } else if (/zeus/.test(feedId)) {
15
19
  const url = new URL(feature.get("rental_uris_web"));
16
20
  vehicleNumber = new URLSearchParams(url.search).get("vehicle");
21
+ } else if (/nextbike/.test(feedId)) {
22
+ const url = new URL(androidLink);
23
+ vehicleNumber = new URLSearchParams(url.search).get("id");
17
24
  }
18
25
 
19
26
  const scooterLink = getLinkByDevice(feature);
20
27
  const availableDistanceString = feature
21
28
  .get("current_range_meters")
22
- .toLocaleString()
29
+ ?.toLocaleString()
30
+ ?.replace(".", "'")
23
31
  .replace(",", "'");
24
32
 
33
+ const distance = availableDistanceString
34
+ ? ` (${availableDistanceString} m)`
35
+ : null;
36
+
37
+ if (!vehicleNumber || !scooterLink) {
38
+ return null;
39
+ }
25
40
  return (
26
41
  <li className="p-1" key={idx}>
27
42
  <a href={scooterLink} key={idx} rel="noreferrer" target="_blank">
28
- {`${vehicleNumber} (${availableDistanceString} m)`}
43
+ {`${vehicleNumber}`}
44
+ {distance}
29
45
  </a>
30
46
  </li>
31
47
  );
32
48
  });
33
49
 
50
+ const feedId = features?.[0].get("feed_id");
51
+ const link = getLinkByDevice(features?.[0]);
52
+
34
53
  return (
35
54
  <div className="flex flex-col overflow-scroll">
36
55
  {features.length} Fahrzeuge
@@ -38,14 +57,18 @@ function FloatingVehiclesDetails({ features }: FloatingVehiclesDetailsProps) {
38
57
  <ul className="h-screen list-disc overflow-scroll pl-4 underline underline-offset-2">
39
58
  {renderedDetails}
40
59
  </ul>
41
- <a
42
- className="mx-auto text-lg text-grey hover:text-red"
43
- href={getLinkByDevice(features[0])}
44
- rel="noreferrer"
45
- target="_blank"
46
- >
47
- Über {features[0].get("feed_id").split("_")[0].toUpperCase()}
48
- </a>
60
+ {feedId && link && (
61
+ <a
62
+ className="mx-auto text-grey hover:text-red"
63
+ href={link}
64
+ rel="noreferrer"
65
+ target="_blank"
66
+ >
67
+ <RvfButton className={"border-none"}>
68
+ Über {PROVIDER_BY_FEED_ID[feedId]}
69
+ </RvfButton>
70
+ </a>
71
+ )}
49
72
  </div>
50
73
  );
51
74
  }
@@ -51,7 +51,7 @@ function RvfSharedMobilityLayerGroup(props: GroupOptions) {
51
51
  createFreeFloatMobilityLayer(
52
52
  API_REQUEST_FEATURE_TYPE.freeFloat.bike,
53
53
  "green",
54
- "bike",
54
+ "bicycle",
55
55
  ),
56
56
  ],
57
57
  name: RVF_LAYERS_NAMES.fahrrad,
@@ -109,7 +109,7 @@ function RvfSharedMobilityLayerGroup(props: GroupOptions) {
109
109
  createFreeFloatMobilityLayer(
110
110
  API_REQUEST_FEATURE_TYPE.freeFloat.cargoBike,
111
111
  "green",
112
- "cargo_bike",
112
+ "cargo_bicycle",
113
113
  ),
114
114
  ],
115
115
  name: RVF_LAYERS_NAMES.cargobike,
@@ -72,3 +72,22 @@ export const TITLE_BY_CATEGORY = {
72
72
  "Car Sharing": RVF_LAYERS_TITLES.auto,
73
73
  "E-Scooter": RVF_LAYERS_TITLES.eroller,
74
74
  };
75
+
76
+ export const PROVIDER_BY_FEED_ID = {
77
+ callabike_ice: "Call a Bike",
78
+ flinkster_carsharing: "Flinkster",
79
+ gruene_flotte_freiburg: "Die Grüne\nFlotte",
80
+ lastenvelo_fr: "LastenVelo",
81
+ naturenergie_sharing: "naturenergie\nsharing",
82
+ nextbike_df: "Frelo",
83
+ yoio_freiburg: "Yoio",
84
+ zeus_freiburg: "ZEUS",
85
+ // "nextbike",
86
+ // "EinfachMobil",
87
+ // "Donkey Republic"
88
+ // "PubliBike",
89
+ // "Voi",
90
+ // "Velospot",
91
+ // "carvelo",
92
+ // "CarSharing"
93
+ };
@@ -79,6 +79,7 @@ function createFreeFloatMobilityLayer(
79
79
  }
80
80
  return true;
81
81
  });
82
+
82
83
  features?.forEach((feature) => {
83
84
  // The WFS returns everytime a different id for the same vehicle, so we set the vehicle_id as id.
84
85
  // and remove the previous feature with the same id.
@@ -14,7 +14,7 @@ import car from "../icons/Car/rvf_shared_car.svg";
14
14
  import cargo_bicycle from "../icons/CargoBike/rvf_shared_cargo_bike.svg";
15
15
  // @ts-expect-error - load svg as data url
16
16
  import scooter from "../icons/Scooter/rvf_shared_scooter.svg";
17
- import { LAYER_PROP_IS_EXPORTING } from "./constants";
17
+ import { LAYER_PROP_IS_EXPORTING, PROVIDER_BY_FEED_ID } from "./constants";
18
18
 
19
19
  const iconByFormFactor = {
20
20
  bicycle,
@@ -68,29 +68,12 @@ const getCompanyNameTextStyle = (feedId: string) => {
68
68
  font: "bold 12px/1.1 source-sans-pro",
69
69
  offsetY,
70
70
  stroke: new Stroke({ color: "white", width: 4 }),
71
- text: companyTextByFeedId[feedId] || feedId,
71
+ text: PROVIDER_BY_FEED_ID[feedId] || feedId,
72
72
  // textBaseline: "middle",
73
73
  }),
74
74
  });
75
75
  };
76
76
 
77
- const companyTextByFeedId = {
78
- callabike_ice: "Call a Bike",
79
- flinkster_carsharing: "Flinkster",
80
- gruene_flotte_freiburg: "Die Grüne\nFlotte",
81
- lastenvelo_fr: "LastenVelo",
82
- naturenergie_sharing: "naturenergie\nsharing",
83
- nextbike_df: "Frelo",
84
- // "nextbike",
85
- // "EinfachMobil",
86
- // "Donkey Republic"
87
- // "PubliBike",
88
- // "Voi",
89
- // "Velospot",
90
- // "carvelo",
91
- // "CarSharing"
92
- };
93
-
94
77
  function createMobiDataBwWfsLayer(
95
78
  name: string,
96
79
  color: string,
@@ -1,9 +1,9 @@
1
1
  import { Feature } from "ol";
2
2
 
3
3
  function getLinkByDevice(feature: Feature): string {
4
- const iosLink = feature.get("rental_uris_ios");
5
- const androidLink = feature.get("rental_uris_android");
6
- const webLink = feature.get("rental_uris_web");
4
+ const iosLink = feature?.get("rental_uris_ios");
5
+ const androidLink = feature?.get("rental_uris_android");
6
+ const webLink = feature?.get("rental_uris_web");
7
7
  if (
8
8
  iosLink &&
9
9
  (navigator.userAgent.includes("iPhone") ||