Projekt

Obecné

Profil

Stáhnout (7.33 KB) Statistiky
| Větev: | Tag: | Revize:
1 a7ae217f Vaclav Honzik
import { Fragment, FunctionComponent, useEffect, useState } from 'react'
2
import { useDispatch, useSelector } from 'react-redux'
3 812b9f90 Vaclav Honzik
import { RootState } from '../../redux/store'
4 c0b66eaf Vaclav Honzik
import { PathVariant, MapPoint, isMapPointDisplayable } from '../trackingToolUtils'
5 a7ae217f Vaclav Honzik
import TextPath from 'react-leaflet-textpath'
6 7d477849 Vaclav Honzik
import {
7
    setPrimaryIdx,
8
    updateMapMarker,
9
    updateMapMarkerWithId,
10
} from '../trackingToolSlice'
11 a7ae217f Vaclav Honzik
import MapMarker from './MapMarker'
12
import { LatLngTuple } from 'leaflet'
13
import { Popup, Tooltip } from 'react-leaflet'
14
import { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'
15 812b9f90 Vaclav Honzik
import { formatHtmlStringToReactDom } from '../../../utils/formatting/HtmlUtils'
16
import { DialogCatalogItemDetail as CatalogItemDetailDialog } from '../../Catalog/CatalogItemDetail'
17 b70813cb Vaclav Honzik
18
export interface MapPathProps {
19 de12c6be Vaclav Honzik
    idx: number // index of the path in the list
20 b70813cb Vaclav Honzik
}
21
22 de12c6be Vaclav Honzik
type EdgeElement = any
23
24 b70813cb Vaclav Honzik
// Blue
25 a7ae217f Vaclav Honzik
export const primaryPathColor = '#346eeb'
26 b70813cb Vaclav Honzik
27
// Grey
28 a7ae217f Vaclav Honzik
export const secondaryPathColor = '#878e9c'
29 b70813cb Vaclav Honzik
30 de12c6be Vaclav Honzik
const MapPath: FunctionComponent<MapPathProps> = ({ idx }) => {
31 dd270a41 Vaclav Honzik
    const dispatch = useDispatch()
32 8c57f958 Vaclav Honzik
33 de12c6be Vaclav Honzik
    // Get list of all paths from the store
34
    // And extract path from them
35
    const paths = useSelector(
36
        (state: RootState) => state.trackingTool.pathVariants
37 8c57f958 Vaclav Honzik
    )
38 de12c6be Vaclav Honzik
    const [path, setPath] = useState<PathVariant>([])
39
    useEffect(() => {
40
        // Either set the path if it exists or set it to an empty array
41
        setPath(paths && paths.length > idx ? paths[idx] : [])
42 7b864a5c Vaclav Honzik
    }, [idx, paths])
43 de12c6be Vaclav Honzik
44
    // Primary path index to set the correct color
45 8c57f958 Vaclav Honzik
    const primaryPathIdx = useSelector(
46
        (state: RootState) => state.trackingTool.primaryPathIdx
47
    )
48
49 de12c6be Vaclav Honzik
    // List of all active map points
50
    const [displayableMapPoints, setDisplayableMapPoints] = useState<
51
        MapPoint[]
52
    >([])
53 8c57f958 Vaclav Honzik
    useEffect(() => {
54 de12c6be Vaclav Honzik
        // Set all displayable vertices
55 a7ae217f Vaclav Honzik
        setDisplayableMapPoints(
56
            path.filter((mapPoint) => isMapPointDisplayable(mapPoint))
57
        )
58 de12c6be Vaclav Honzik
    }, [path])
59 b70813cb Vaclav Honzik
60 de12c6be Vaclav Honzik
    // List of all edges in the path
61
    const [edges, setEdges] = useState<EdgeElement[]>([])
62 dd270a41 Vaclav Honzik
    useEffect(() => {
63 de12c6be Vaclav Honzik
        // Get all active map points
64
        const activeMapPoints = displayableMapPoints.filter(
65 f41a4cd3 Vaclav Honzik
            (item) => item.addToPath && !item.hidden
66 dd270a41 Vaclav Honzik
        )
67 b70813cb Vaclav Honzik
        if (activeMapPoints.length < 2) {
68 7b864a5c Vaclav Honzik
            setEdges([])
69 de12c6be Vaclav Honzik
            return
70 b70813cb Vaclav Honzik
        }
71
72 de12c6be Vaclav Honzik
        // Build edges
73
        const edges = []
74 b70813cb Vaclav Honzik
        for (let i = 0; i < activeMapPoints.length - 1; i += 1) {
75 de12c6be Vaclav Honzik
            const [start, end] = [
76
                activeMapPoints[i].catalogItem,
77
                activeMapPoints[i + 1].catalogItem,
78
            ]
79 b70813cb Vaclav Honzik
            edges.push(
80
                <TextPath
81 de12c6be Vaclav Honzik
                    // Somehow this refuses to work so let it rerender everything ...
82 7d477849 Vaclav Honzik
                    key={`${activeMapPoints[i].id}-${
83
                        activeMapPoints[i + 1].id
84
                    }`}
85 b70813cb Vaclav Honzik
                    positions={[
86 de12c6be Vaclav Honzik
                        [start.latitude, start.longitude],
87
                        [end.latitude, end.longitude],
88 b70813cb Vaclav Honzik
                    ]}
89
                    text="►"
90 04fdedc6 Vaclav Honzik
                    // text=" > > > > "
91 b70813cb Vaclav Honzik
                    attributes={{
92 a7ae217f Vaclav Honzik
                        'font-size': 19,
93 b70813cb Vaclav Honzik
                        // Set to primaryPathColor if primary index in the tracking tool is equal to this index
94 8c57f958 Vaclav Honzik
                        fill:
95
                            primaryPathIdx === idx
96
                                ? primaryPathColor
97
                                : secondaryPathColor,
98 b70813cb Vaclav Honzik
                    }}
99 de12c6be Vaclav Honzik
                    onClick={() => dispatch(setPrimaryIdx(idx))}
100 b70813cb Vaclav Honzik
                    repeat
101
                    center
102 04fdedc6 Vaclav Honzik
                    weight={0}
103 b70813cb Vaclav Honzik
                />
104
            )
105
        }
106 de12c6be Vaclav Honzik
        setEdges(edges)
107
    }, [dispatch, displayableMapPoints, idx, primaryPathIdx])
108 b70813cb Vaclav Honzik
109 de12c6be Vaclav Honzik
    // List of vertices to display
110
    const [vertices, setVertices] = useState<JSX.Element[]>([])
111
    useEffect(() => {
112
        // Iterate over all displayable map points and map them to MapMarker
113
        setVertices(
114
            displayableMapPoints.map((item) => (
115
                <MapMarker
116 c0b66eaf Vaclav Honzik
                    key={item.id}
117 de12c6be Vaclav Honzik
                    position={[
118
                        item.catalogItem.latitude as number,
119
                        item.catalogItem.longitude as number,
120
                    ]}
121 c0b66eaf Vaclav Honzik
                    mapPoint={item}
122 de12c6be Vaclav Honzik
                    updatePositionCallbackFn={(position: LatLngTuple) => {
123
                        dispatch(
124 1e2f25c9 Vaclav Honzik
                            updateMapMarkerWithId({
125 a7ae217f Vaclav Honzik
                                item: {
126 812b9f90 Vaclav Honzik
                                    ...item,
127 a7ae217f Vaclav Honzik
                                    catalogItem: {
128
                                        ...item.catalogItem,
129
                                        latitude: position[0],
130
                                        longitude: position[1],
131
                                    },
132
                                },
133 1e2f25c9 Vaclav Honzik
                                id: item.id,
134 de12c6be Vaclav Honzik
                            })
135
                        )
136
                    }}
137
                >
138 11fca75a Vaclav Honzik
                    <Fragment>
139
                        <Tooltip>
140
                            {/* <Typography> */}
141 a7ae217f Vaclav Honzik
                            {item.catalogItem.name ?? ''}
142 11fca75a Vaclav Honzik
                            {/* </Typography> */}
143
                        </Tooltip>
144
                        <Popup>
145
                            <Fragment>
146
                                <Stack direction="column" sx={{ m: 0 }}>
147
                                    <Typography
148
                                        variant="h6"
149
                                        fontWeight="bold"
150
                                        fontSize={16}
151
                                    >
152
                                        {formatHtmlStringToReactDom(
153
                                            item.catalogItem.name as string
154
                                        )}
155
                                    </Typography>
156
                                    <FormControlLabel
157
                                        control={
158
                                            <Checkbox
159 f41a4cd3 Vaclav Honzik
                                                checked={item.addToPath}
160 11fca75a Vaclav Honzik
                                                onChange={() => {
161
                                                    dispatch(
162
                                                        updateMapMarker({
163 7d477849 Vaclav Honzik
                                                            ...item,
164 f41a4cd3 Vaclav Honzik
                                                            addToPath: !item.addToPath,
165 11fca75a Vaclav Honzik
                                                        })
166
                                                    )
167
                                                }}
168
                                            />
169
                                        }
170
                                        labelPlacement="end"
171
                                        label="Active"
172
                                    />
173
                                    <CatalogItemDetailDialog
174 a7ae217f Vaclav Honzik
                                        itemId={item.catalogItem.id ?? ''}
175 11fca75a Vaclav Honzik
                                    />
176
                                </Stack>
177
                            </Fragment>
178
                        </Popup>
179
                    </Fragment>
180 de12c6be Vaclav Honzik
                </MapMarker>
181
            ))
182
        )
183
    }, [dispatch, displayableMapPoints, idx])
184 b70813cb Vaclav Honzik
185
    return (
186
        <Fragment>
187 de12c6be Vaclav Honzik
            {vertices}
188
            {edges}
189 b70813cb Vaclav Honzik
        </Fragment>
190
    )
191
}
192
193
export default MapPath