@navigoo/map-components 1.0.2 → 1.0.4
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/dist/components/Dashboard.d.ts +1 -0
- package/dist/components/Dashboard.js +2 -8
- package/dist/components/DetourRouteSearch.d.ts +9 -0
- package/dist/components/DetourRouteSearch.js +5 -9
- package/dist/components/RouteSearch.d.ts +9 -0
- package/dist/components/RouteSearch.js +4 -8
- package/dist/components/SearchBar.d.ts +6 -0
- package/dist/components/SearchBar.js +2 -6
- package/dist/components/TransportOptions.d.ts +12 -1
- package/dist/components/TransportOptions.js +3 -7
- package/dist/components/TripType.d.ts +12 -1
- package/dist/components/TripType.js +3 -7
- package/package.json +1 -1
- package/src/components/Dashboard.tsx +52 -116
- package/src/components/DetourRouteSearch.tsx +42 -21
- package/src/components/MapView.tsx +100 -10
- package/src/components/RouteSearch.tsx +37 -16
- package/src/components/SearchBar.tsx +25 -10
- package/src/components/TransportOptions.tsx +31 -13
- package/src/components/TripType.tsx +31 -12
- package/src/components/styles.module.css +0 -207
@@ -11,15 +11,9 @@ const RouteSearch_1 = __importDefault(require("./RouteSearch"));
|
|
11
11
|
const DetourRouteSearch_1 = __importDefault(require("./DetourRouteSearch"));
|
12
12
|
const TransportOptions_1 = __importDefault(require("./TransportOptions"));
|
13
13
|
const TripType_1 = __importDefault(require("./TripType"));
|
14
|
-
const
|
15
|
-
const lucide_react_1 = require("lucide-react");
|
16
|
-
const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking, setRoutes, setSelectedRouteIndex, isTracking, }) => {
|
17
|
-
const [activeSection, setActiveSection] = (0, react_1.useState)(null);
|
14
|
+
const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking, setRoutes, setSelectedRouteIndex, isTracking, className, }) => {
|
18
15
|
const [geoLoading, setGeoLoading] = (0, react_1.useState)(false);
|
19
16
|
const [geoError, setGeoError] = (0, react_1.useState)(null);
|
20
|
-
const toggleSection = (section) => {
|
21
|
-
setActiveSection(activeSection === section ? null : section);
|
22
|
-
};
|
23
17
|
const handleToggleTracking = () => {
|
24
18
|
setIsTracking(!isTracking);
|
25
19
|
if (isTracking) {
|
@@ -47,6 +41,6 @@ const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking
|
|
47
41
|
setGeoLoading(false);
|
48
42
|
}
|
49
43
|
}, [geoLoading, isTracking, setUserLocation, setRoutes, setSelectedRouteIndex]);
|
50
|
-
return ((0, jsx_runtime_1.jsxs)("div", {
|
44
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("label", { children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: isTracking, onChange: handleToggleTracking }), "Suivi: ", isTracking ? 'Activé' : 'Désactivé'] }) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleGeolocation, disabled: geoLoading || isTracking, children: geoLoading ? 'Chargement...' : 'Ma position' }), geoError && (0, jsx_runtime_1.jsx)("div", { children: geoError })] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SearchBar_1.default, { apiClient: apiClient, setUserLocation: setUserLocation, setSearchedPlace: setSearchedPlace }) }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(RouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(DetourRouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] })] }));
|
51
45
|
};
|
52
46
|
exports.default = Dashboard;
|
@@ -5,6 +5,15 @@ interface DetourRouteSearchProps {
|
|
5
5
|
apiClient: ApiClient;
|
6
6
|
setRoutes: (routes: Route[]) => void;
|
7
7
|
setSelectedRouteIndex: (index: number) => void;
|
8
|
+
className?: string;
|
9
|
+
searchGroupClassName?: string;
|
10
|
+
labelClassName?: string;
|
11
|
+
inputClassName?: string;
|
12
|
+
resultsClassName?: string;
|
13
|
+
resultItemClassName?: string;
|
14
|
+
errorClassName?: string;
|
15
|
+
buttonClassName?: string;
|
16
|
+
disabledButtonClassName?: string;
|
8
17
|
}
|
9
18
|
declare const DetourRouteSearch: React.FC<DetourRouteSearchProps>;
|
10
19
|
export default DetourRouteSearch;
|
@@ -1,12 +1,8 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
4
|
const react_1 = require("react");
|
8
|
-
const
|
9
|
-
const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
|
5
|
+
const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex, className, searchGroupClassName, labelClassName, inputClassName, resultsClassName, resultItemClassName, errorClassName, buttonClassName, disabledButtonClassName, }) => {
|
10
6
|
const [startQuery, setStartQuery] = (0, react_1.useState)('');
|
11
7
|
const [detourQuery, setDetourQuery] = (0, react_1.useState)('');
|
12
8
|
const [endQuery, setEndQuery] = (0, react_1.useState)('');
|
@@ -105,15 +101,15 @@ const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
|
|
105
101
|
setLoading(false);
|
106
102
|
}
|
107
103
|
};
|
108
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className:
|
104
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: labelClassName, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
|
109
105
|
setStartQuery(e.target.value);
|
110
106
|
handleSearch(e.target.value, setStartResults);
|
111
|
-
}, placeholder: "Point de d\u00E9part", className:
|
107
|
+
}, placeholder: "Point de d\u00E9part", className: inputClassName }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "detour", className: labelClassName, children: "D\u00E9tour" }), (0, jsx_runtime_1.jsx)("input", { id: "detour", type: "text", value: detourQuery, onChange: (e) => {
|
112
108
|
setDetourQuery(e.target.value);
|
113
109
|
handleSearch(e.target.value, setDetourResults);
|
114
|
-
}, placeholder: "Point de d\u00E9tour", className:
|
110
|
+
}, placeholder: "Point de d\u00E9tour", className: inputClassName }), detourResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: detourResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectDetour(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: labelClassName, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
|
115
111
|
setEndQuery(e.target.value);
|
116
112
|
handleSearch(e.target.value, setEndResults);
|
117
|
-
}, placeholder: "Point d'arriv\u00E9e", className:
|
113
|
+
}, placeholder: "Point d'arriv\u00E9e", className: inputClassName }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedDetour || !selectedEnd, className: loading || !selectedStart || !selectedDetour || !selectedEnd ? disabledButtonClassName : buttonClassName, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
|
118
114
|
};
|
119
115
|
exports.default = DetourRouteSearch;
|
@@ -5,6 +5,15 @@ interface RouteSearchProps {
|
|
5
5
|
apiClient: ApiClient;
|
6
6
|
setRoutes: (routes: Route[]) => void;
|
7
7
|
setSelectedRouteIndex: (index: number) => void;
|
8
|
+
className?: string;
|
9
|
+
searchGroupClassName?: string;
|
10
|
+
labelClassName?: string;
|
11
|
+
inputClassName?: string;
|
12
|
+
resultsClassName?: string;
|
13
|
+
resultItemClassName?: string;
|
14
|
+
errorClassName?: string;
|
15
|
+
buttonClassName?: string;
|
16
|
+
disabledButtonClassName?: string;
|
8
17
|
}
|
9
18
|
declare const RouteSearch: React.FC<RouteSearchProps>;
|
10
19
|
export default RouteSearch;
|
@@ -1,12 +1,8 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
4
|
const react_1 = require("react");
|
8
|
-
const
|
9
|
-
const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
|
5
|
+
const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex, className, searchGroupClassName, labelClassName, inputClassName, resultsClassName, resultItemClassName, errorClassName, buttonClassName, disabledButtonClassName, }) => {
|
10
6
|
const [startQuery, setStartQuery] = (0, react_1.useState)('');
|
11
7
|
const [endQuery, setEndQuery] = (0, react_1.useState)('');
|
12
8
|
const [startResults, setStartResults] = (0, react_1.useState)([]);
|
@@ -84,12 +80,12 @@ const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
|
|
84
80
|
setLoading(false);
|
85
81
|
}
|
86
82
|
};
|
87
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className:
|
83
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: labelClassName, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
|
88
84
|
setStartQuery(e.target.value);
|
89
85
|
handleSearch(e.target.value, setStartResults);
|
90
|
-
}, placeholder: "Point de d\u00E9part", className:
|
86
|
+
}, placeholder: "Point de d\u00E9part", className: inputClassName }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: labelClassName, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
|
91
87
|
setEndQuery(e.target.value);
|
92
88
|
handleSearch(e.target.value, setEndResults);
|
93
|
-
}, placeholder: "Point d'arriv\u00E9e", className:
|
89
|
+
}, placeholder: "Point d'arriv\u00E9e", className: inputClassName }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedEnd, className: loading || !selectedStart || !selectedEnd ? disabledButtonClassName : buttonClassName, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
|
94
90
|
};
|
95
91
|
exports.default = RouteSearch;
|
@@ -5,6 +5,12 @@ interface SearchBarProps {
|
|
5
5
|
apiClient: ApiClient;
|
6
6
|
setUserLocation: (location: GeolocationResult | null) => void;
|
7
7
|
setSearchedPlace: (place: Place | null) => void;
|
8
|
+
className?: string;
|
9
|
+
inputClassName?: string;
|
10
|
+
buttonClassName?: string;
|
11
|
+
errorClassName?: string;
|
12
|
+
resultsClassName?: string;
|
13
|
+
resultItemClassName?: string;
|
8
14
|
}
|
9
15
|
declare const SearchBar: React.FC<SearchBarProps>;
|
10
16
|
export default SearchBar;
|
@@ -1,12 +1,8 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
4
|
const react_1 = require("react");
|
8
|
-
const
|
9
|
-
const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace }) => {
|
5
|
+
const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace, className, inputClassName, buttonClassName, errorClassName, resultsClassName, resultItemClassName, }) => {
|
10
6
|
const [query, setQuery] = (0, react_1.useState)('');
|
11
7
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
12
8
|
const [results, setResults] = (0, react_1.useState)([]);
|
@@ -43,6 +39,6 @@ const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace }) => {
|
|
43
39
|
}
|
44
40
|
setResults([]);
|
45
41
|
};
|
46
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className:
|
42
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "search", children: "Nom du lieu" }), (0, jsx_runtime_1.jsx)("input", { id: "search", type: "text", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Rechercher un lieu", className: inputClassName })] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), results.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: results.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelect(place), className: resultItemClassName, children: place.name }, place.id))) })), (0, jsx_runtime_1.jsx)("button", { onClick: handleSearch, disabled: loading || !query, className: buttonClassName, children: loading ? 'Recherche...' : 'Rechercher' })] }));
|
47
43
|
};
|
48
44
|
exports.default = SearchBar;
|
@@ -1,3 +1,14 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
|
2
|
+
interface TransportOptionsProps {
|
3
|
+
className?: string;
|
4
|
+
headerClassName?: string;
|
5
|
+
titleClassName?: string;
|
6
|
+
toggleButtonClassName?: string;
|
7
|
+
optionsClassName?: string;
|
8
|
+
optionClassName?: string;
|
9
|
+
selectedOptionClassName?: string;
|
10
|
+
iconClassName?: string;
|
11
|
+
nameClassName?: string;
|
12
|
+
}
|
13
|
+
declare const TransportOptions: React.FC<TransportOptionsProps>;
|
3
14
|
export default TransportOptions;
|
@@ -1,12 +1,8 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
4
|
const react_1 = require("react");
|
8
|
-
const
|
9
|
-
const TransportOptions = () => {
|
5
|
+
const TransportOptions = ({ className, headerClassName, titleClassName, toggleButtonClassName, optionsClassName, optionClassName, selectedOptionClassName, iconClassName, nameClassName, }) => {
|
10
6
|
const [showOptions, setShowOptions] = (0, react_1.useState)(false);
|
11
7
|
const [selectedTransport, setSelectedTransport] = (0, react_1.useState)('taxi');
|
12
8
|
const transportOptions = [
|
@@ -17,8 +13,8 @@ const TransportOptions = () => {
|
|
17
13
|
(0, react_1.useEffect)(() => {
|
18
14
|
window.dispatchEvent(new CustomEvent('transportChange', { detail: selectedTransport }));
|
19
15
|
}, [selectedTransport]);
|
20
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className:
|
16
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: headerClassName, children: [(0, jsx_runtime_1.jsx)("h3", { className: titleClassName, children: "Moyen de transport" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: toggleButtonClassName, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: optionsClassName, children: transportOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTransport(option.id), className: `${optionClassName} ${selectedTransport === option.id ? selectedOptionClassName : ''}`, style: {
|
21
17
|
backgroundColor: selectedTransport === option.id ? option.color : undefined,
|
22
|
-
}, children: [(0, jsx_runtime_1.jsx)("span", { className:
|
18
|
+
}, children: [(0, jsx_runtime_1.jsx)("span", { className: iconClassName, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: nameClassName, children: option.name })] }, option.id))) }))] }));
|
23
19
|
};
|
24
20
|
exports.default = TransportOptions;
|
@@ -1,3 +1,14 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
|
2
|
+
interface TripTypeProps {
|
3
|
+
className?: string;
|
4
|
+
headerClassName?: string;
|
5
|
+
titleClassName?: string;
|
6
|
+
toggleButtonClassName?: string;
|
7
|
+
optionsClassName?: string;
|
8
|
+
optionClassName?: string;
|
9
|
+
selectedOptionClassName?: string;
|
10
|
+
iconClassName?: string;
|
11
|
+
nameClassName?: string;
|
12
|
+
}
|
13
|
+
declare const TripType: React.FC<TripTypeProps>;
|
3
14
|
export default TripType;
|
@@ -1,20 +1,16 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
4
|
const react_1 = require("react");
|
8
|
-
const
|
9
|
-
const TripType = () => {
|
5
|
+
const TripType = ({ className, headerClassName, titleClassName, toggleButtonClassName, optionsClassName, optionClassName, selectedOptionClassName, iconClassName, nameClassName, }) => {
|
10
6
|
const [showOptions, setShowOptions] = (0, react_1.useState)(false);
|
11
7
|
const [selectedTripType, setSelectedTripType] = (0, react_1.useState)('individuel');
|
12
8
|
const tripTypeOptions = [
|
13
9
|
{ id: 'individuel', name: 'Individuel', icon: '👤', color: '#3498db' },
|
14
10
|
{ id: 'ramassage', name: 'Ramassage', icon: '👥', color: '#9b59b6' },
|
15
11
|
];
|
16
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className:
|
12
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: headerClassName, children: [(0, jsx_runtime_1.jsx)("h3", { className: titleClassName, children: "Type de trajet" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: toggleButtonClassName, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: optionsClassName, children: tripTypeOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTripType(option.id), className: `${optionClassName} ${selectedTripType === option.id ? selectedOptionClassName : ''}`, style: {
|
17
13
|
backgroundColor: selectedTripType === option.id ? option.color : undefined,
|
18
|
-
}, children: [(0, jsx_runtime_1.jsx)("span", { className:
|
14
|
+
}, children: [(0, jsx_runtime_1.jsx)("span", { className: iconClassName, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: nameClassName, children: option.name })] }, option.id))) }))] }));
|
19
15
|
};
|
20
16
|
exports.default = TripType;
|
package/package.json
CHANGED
@@ -6,8 +6,6 @@ import RouteSearch from './RouteSearch';
|
|
6
6
|
import DetourRouteSearch from './DetourRouteSearch';
|
7
7
|
import TransportOptions from './TransportOptions';
|
8
8
|
import TripType from './TripType';
|
9
|
-
import styles from './styles.module.css';
|
10
|
-
import { Footprints, Search, ArrowRight, RefreshCcw, MapPin } from 'lucide-react';
|
11
9
|
import { ApiClient } from '../lib/api';
|
12
10
|
|
13
11
|
interface DashboardProps {
|
@@ -18,6 +16,7 @@ interface DashboardProps {
|
|
18
16
|
setRoutes: (routes: Route[]) => void;
|
19
17
|
setSelectedRouteIndex: (index: number) => void;
|
20
18
|
isTracking: boolean;
|
19
|
+
className?: string; // Allow custom styling
|
21
20
|
}
|
22
21
|
|
23
22
|
const Dashboard: React.FC<DashboardProps> = ({
|
@@ -28,15 +27,11 @@ const Dashboard: React.FC<DashboardProps> = ({
|
|
28
27
|
setRoutes,
|
29
28
|
setSelectedRouteIndex,
|
30
29
|
isTracking,
|
30
|
+
className,
|
31
31
|
}) => {
|
32
|
-
const [activeSection, setActiveSection] = useState<string | null>(null);
|
33
32
|
const [geoLoading, setGeoLoading] = useState(false);
|
34
33
|
const [geoError, setGeoError] = useState<string | null>(null);
|
35
34
|
|
36
|
-
const toggleSection = (section: string) => {
|
37
|
-
setActiveSection(activeSection === section ? null : section);
|
38
|
-
};
|
39
|
-
|
40
35
|
const handleToggleTracking = () => {
|
41
36
|
setIsTracking(!isTracking);
|
42
37
|
if (isTracking) {
|
@@ -65,116 +60,57 @@ const Dashboard: React.FC<DashboardProps> = ({
|
|
65
60
|
}, [geoLoading, isTracking, setUserLocation, setRoutes, setSelectedRouteIndex]);
|
66
61
|
|
67
62
|
return (
|
68
|
-
<div>
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
>
|
81
|
-
<Footprints size={24} color="#000" />
|
82
|
-
</button>
|
83
|
-
<button
|
84
|
-
onClick={() => toggleSection('search')}
|
85
|
-
className={`${styles.sidebarButton} ${activeSection === 'search' ? styles.active : ''}`}
|
86
|
-
title="Recherche de lieu"
|
87
|
-
>
|
88
|
-
<Search size={24} color="#000" />
|
89
|
-
</button>
|
90
|
-
<button
|
91
|
-
onClick={() => toggleSection('route')}
|
92
|
-
className={`${styles.sidebarButton} ${activeSection === 'route' ? styles.active : ''}`}
|
93
|
-
title="Tracé d'itinéraire"
|
94
|
-
>
|
95
|
-
<ArrowRight size={24} color="#000" />
|
96
|
-
</button>
|
97
|
-
<button
|
98
|
-
onClick={() => toggleSection('routeWithDetour')}
|
99
|
-
className={`${styles.sidebarButton} ${activeSection === 'routeWithDetour' ? styles.active : ''}`}
|
100
|
-
title="Tracé d'itinéraire avec détour"
|
101
|
-
>
|
102
|
-
<RefreshCcw size={24} color="#000" />
|
103
|
-
</button>
|
104
|
-
</div>
|
105
|
-
<div className={`${styles.contentPanel} ${activeSection ? styles.open : ''}`}>
|
106
|
-
{activeSection === 'geolocation' && (
|
107
|
-
<div className={styles.sectionContainer}>
|
108
|
-
<h2 className={styles.sectionTitle}>
|
109
|
-
<span className={styles.titleAccent}>Géo</span>localisation
|
110
|
-
</h2>
|
111
|
-
<div className={styles.toggleContainer}>
|
112
|
-
<label className={styles.switch}>
|
113
|
-
<input type="checkbox" checked={isTracking} onChange={handleToggleTracking} />
|
114
|
-
<span className={styles.slider}></span>
|
115
|
-
</label>
|
116
|
-
<span className={styles.toggleLabel}>
|
117
|
-
Suivi: {isTracking ? 'Activé' : 'Désactivé'}
|
118
|
-
</span>
|
119
|
-
</div>
|
120
|
-
<button
|
121
|
-
onClick={handleGeolocation}
|
122
|
-
className={styles.locationButton}
|
123
|
-
disabled={geoLoading || isTracking}
|
124
|
-
>
|
125
|
-
{geoLoading ? (
|
126
|
-
'Chargement...'
|
127
|
-
) : (
|
128
|
-
<>
|
129
|
-
<MapPin size={18} color="#000" style={{ marginRight: '8px' }} />
|
130
|
-
Ma position
|
131
|
-
</>
|
132
|
-
)}
|
133
|
-
</button>
|
134
|
-
{geoError && <div className={styles.error}>{geoError}</div>}
|
135
|
-
</div>
|
136
|
-
)}
|
137
|
-
{activeSection === 'search' && (
|
138
|
-
<div className={styles.sectionContainer}>
|
139
|
-
<h2 className={styles.sectionTitle}>
|
140
|
-
<span className={styles.titleAccent}>Re</span>cherche
|
141
|
-
</h2>
|
142
|
-
<SearchBar
|
143
|
-
apiClient={apiClient}
|
144
|
-
setUserLocation={setUserLocation}
|
145
|
-
setSearchedPlace={setSearchedPlace}
|
146
|
-
/>
|
147
|
-
</div>
|
148
|
-
)}
|
149
|
-
{activeSection === 'route' && (
|
150
|
-
<div className={styles.sectionContainer}>
|
151
|
-
<h2 className={styles.sectionTitle}>
|
152
|
-
<span className={styles.titleAccent}>Itiné</span>raire
|
153
|
-
</h2>
|
154
|
-
<RouteSearch
|
155
|
-
apiClient={apiClient}
|
156
|
-
setRoutes={setRoutes}
|
157
|
-
setSelectedRouteIndex={setSelectedRouteIndex}
|
158
|
-
/>
|
159
|
-
<TransportOptions />
|
160
|
-
<TripType />
|
161
|
-
</div>
|
162
|
-
)}
|
163
|
-
{activeSection === 'routeWithDetour' && (
|
164
|
-
<div className={styles.sectionContainer}>
|
165
|
-
<h2 className={styles.sectionTitle}>
|
166
|
-
<span className={styles.titleAccent}>Itiné</span>raire avec détour
|
167
|
-
</h2>
|
168
|
-
<DetourRouteSearch
|
169
|
-
apiClient={apiClient}
|
170
|
-
setRoutes={setRoutes}
|
171
|
-
setSelectedRouteIndex={setSelectedRouteIndex}
|
172
|
-
/>
|
173
|
-
<TransportOptions />
|
174
|
-
<TripType />
|
175
|
-
</div>
|
176
|
-
)}
|
63
|
+
<div className={className}>
|
64
|
+
{/* Geolocation Section */}
|
65
|
+
<div>
|
66
|
+
<div>
|
67
|
+
<label>
|
68
|
+
<input
|
69
|
+
type="checkbox"
|
70
|
+
checked={isTracking}
|
71
|
+
onChange={handleToggleTracking}
|
72
|
+
/>
|
73
|
+
Suivi: {isTracking ? 'Activé' : 'Désactivé'}
|
74
|
+
</label>
|
177
75
|
</div>
|
76
|
+
<button
|
77
|
+
onClick={handleGeolocation}
|
78
|
+
disabled={geoLoading || isTracking}
|
79
|
+
>
|
80
|
+
{geoLoading ? 'Chargement...' : 'Ma position'}
|
81
|
+
</button>
|
82
|
+
{geoError && <div>{geoError}</div>}
|
83
|
+
</div>
|
84
|
+
|
85
|
+
{/* Search Section */}
|
86
|
+
<div>
|
87
|
+
<SearchBar
|
88
|
+
apiClient={apiClient}
|
89
|
+
setUserLocation={setUserLocation}
|
90
|
+
setSearchedPlace={setSearchedPlace}
|
91
|
+
/>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
{/* Route Search Section */}
|
95
|
+
<div>
|
96
|
+
<RouteSearch
|
97
|
+
apiClient={apiClient}
|
98
|
+
setRoutes={setRoutes}
|
99
|
+
setSelectedRouteIndex={setSelectedRouteIndex}
|
100
|
+
/>
|
101
|
+
<TransportOptions />
|
102
|
+
<TripType />
|
103
|
+
</div>
|
104
|
+
|
105
|
+
{/* Detour Route Search Section */}
|
106
|
+
<div>
|
107
|
+
<DetourRouteSearch
|
108
|
+
apiClient={apiClient}
|
109
|
+
setRoutes={setRoutes}
|
110
|
+
setSelectedRouteIndex={setSelectedRouteIndex}
|
111
|
+
/>
|
112
|
+
<TransportOptions />
|
113
|
+
<TripType />
|
178
114
|
</div>
|
179
115
|
</div>
|
180
116
|
);
|