@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/CHANGELOG.md +16 -0
- package/index.js +58 -58
- package/package.json +1 -1
- package/src/RvfFeatureDetails/RvfSharedMobilityDetail/FloatingVehiclesDetails/FloatingVehiclesDetails.tsx +36 -13
- package/src/RvfSharedMobilityLayerGroup/RvfSharedMobilityLayerGroup.tsx +2 -2
- package/src/utils/constants.ts +19 -0
- package/src/utils/createFreeFloatMobilityLayer.ts +1 -0
- package/src/utils/createMobiDataBwWfsLayer.ts +2 -19
- package/src/utils/getLinkByDevice.ts +3 -3
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.
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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}
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
112
|
+
"cargo_bicycle",
|
|
113
113
|
),
|
|
114
114
|
],
|
|
115
115
|
name: RVF_LAYERS_NAMES.cargobike,
|
package/src/utils/constants.ts
CHANGED
|
@@ -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:
|
|
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
|
|
5
|
-
const androidLink = feature
|
|
6
|
-
const webLink = feature
|
|
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") ||
|