Projekt

Obecné

Profil

Stáhnout (4.61 KB) Statistiky
| Větev: | Tag: | Revize:
1 de12c6be Vaclav Honzik
import { createSlice } from "@reduxjs/toolkit"
2
import { LatLngTuple } from "leaflet"
3
import { persistReducer } from "redux-persist"
4
import mapConfig from "../../config/mapConfig"
5
import { PathDto } from "../../swagger/data-contracts"
6 7b864a5c Vaclav Honzik
import buildPathVariants, { MapPoint, PathVariant } from "./buildPathVariants"
7 de12c6be Vaclav Honzik
import { sendTextForProcessing } from "./trackingToolThunks"
8
import storage from "redux-persist/lib/storage"
9 8c57f958 Vaclav Honzik
10
export interface TrackingToolState {
11
    isLoading: boolean // whether the data is being loaded
12
    pathDto?: PathDto // the data
13
    pathVariants?: PathVariant[] // undefined signals that no path variants were yet fetched from the API
14 dd270a41 Vaclav Honzik
    lastError?: string // consumable for errors during thunks
15 8c57f958 Vaclav Honzik
    mapCenter: LatLngTuple // pair of latitude and longitude
16
    primaryPathIdx: number // index of the primary path
17
    // trigger to close the dialog when API call is finished
18
    dialogApiCallSuccess: boolean
19 81698b9a Vaclav Honzik
    pathsPerPage: number // max number of paths to show on the map at once
20
    currentPage: number // current page of paths - starts from 0
21 8c57f958 Vaclav Honzik
}
22
23 81698b9a Vaclav Honzik
const defaultPathsPerPage = 5
24
25 8c57f958 Vaclav Honzik
const initialState: TrackingToolState = {
26
    isLoading: false,
27 de12c6be Vaclav Honzik
    mapCenter: [mapConfig.defaultCoordinates[0], mapConfig.defaultCoordinates[1]],
28 8c57f958 Vaclav Honzik
    primaryPathIdx: 0,
29
    dialogApiCallSuccess: true,
30 81698b9a Vaclav Honzik
    pathsPerPage: defaultPathsPerPage,
31
    currentPage: 0,
32 8c57f958 Vaclav Honzik
}
33
34
// Returns tuple of average latitude and longitude
35
const calculateMapCenter = (pathVariant: PathVariant): LatLngTuple => [
36 de12c6be Vaclav Honzik
    pathVariant
37
        .map((item) => item.catalogItem.latitude ?? 0)
38
        .reduce((a, b) => a + b, 0) / pathVariant.length,
39
    pathVariant
40
        .map((item) => item.catalogItem.longitude ?? 0)
41
        .reduce((a, b) => a + b, 0) / pathVariant.length,
42 8c57f958 Vaclav Honzik
]
43
44 04fdedc6 Vaclav Honzik
const persistConfig = {
45 de12c6be Vaclav Honzik
    key: "auth",
46 04fdedc6 Vaclav Honzik
    storage, // localStorage for browsers
47
}
48
49 8c57f958 Vaclav Honzik
export const trackingToolSlice = createSlice({
50 de12c6be Vaclav Honzik
    name: "trackingTool",
51 8c57f958 Vaclav Honzik
    initialState,
52
    reducers: {
53 de12c6be Vaclav Honzik
        consumeErr: (state: TrackingToolState) => ({
54
            ...state,
55
            lastErr: undefined,
56
        }),
57 c0cf1dbc Vaclav Honzik
        setPrimaryIdx: (state: TrackingToolState, action: any) => ({
58 8c57f958 Vaclav Honzik
            ...state,
59
            primaryPathIdx: action.payload,
60
        }),
61 c0cf1dbc Vaclav Honzik
        resetDialogApiCallSuccess: (state: TrackingToolState) => ({
62 8c57f958 Vaclav Honzik
            ...state,
63
            dialogApiCallSuccess: false,
64
        }),
65 de12c6be Vaclav Honzik
        setPage: (state: TrackingToolState, action: { payload: number }) => ({
66 81698b9a Vaclav Honzik
            ...state,
67
            currentPage: action.payload,
68
        }),
69 7b864a5c Vaclav Honzik
        updateMapMarker: (state: TrackingToolState, action: { payload: { idx: number, item: MapPoint } }) => {
70
            const { idx, item } = action.payload
71 de12c6be Vaclav Honzik
            if (!state.pathVariants || state.pathVariants.length <= idx) {
72
                return state
73
            }
74
75
            return {
76
                ...state,
77
                pathVariants: state.pathVariants.map((pathVariant, i) => {
78
                    if (i !== idx) {
79
                        return [...pathVariant]
80
                    }
81
82
                    return [
83 7b864a5c Vaclav Honzik
                        ...pathVariant.slice(0, item.idx),
84
                        item,
85
                        ...pathVariant.slice(item.idx + 1),
86 de12c6be Vaclav Honzik
                    ]
87
                })
88
            }
89
        },
90
        clear: () => ({ ...initialState }),
91 8c57f958 Vaclav Honzik
    },
92
    extraReducers: (builder) => {
93
        builder.addCase(sendTextForProcessing.fulfilled, (state, action) => {
94 04fdedc6 Vaclav Honzik
            const pathDto: PathDto = action.payload
95
            const pathVariants = buildPathVariants(pathDto)
96 8c57f958 Vaclav Honzik
            return {
97
                ...state,
98
                pathVariants,
99 04fdedc6 Vaclav Honzik
                pathDto,
100 8c57f958 Vaclav Honzik
                // TODO calculate correctly
101
                mapCenter:
102
                    pathVariants.length > 0
103
                        ? calculateMapCenter(pathVariants[0])
104
                        : (state.mapCenter as LatLngTuple),
105
                isLoading: false,
106
                dialogApiCallSuccess: true,
107 81698b9a Vaclav Honzik
                currentPage: 0,
108 8c57f958 Vaclav Honzik
            }
109
        })
110 b45d0300 Vaclav Honzik
        builder.addCase(sendTextForProcessing.rejected, (_, action) => ({
111 8c57f958 Vaclav Honzik
            ...initialState,
112 dd270a41 Vaclav Honzik
            lastError: action.error.message,
113 8c57f958 Vaclav Honzik
            isLoading: false,
114
            dialogApiCallSuccess: false,
115 81698b9a Vaclav Honzik
            currentPage: 0,
116 8c57f958 Vaclav Honzik
        }))
117
        builder.addCase(sendTextForProcessing.pending, (state) => {
118
            return {
119
                ...state,
120
                isLoading: true,
121
                dialogApiCallSuccess: false,
122
            }
123
        })
124
    },
125
})
126
127 7b864a5c Vaclav Honzik
export const { consumeErr, setPrimaryIdx, resetDialogApiCallSuccess, clear, updateMapMarker } =
128 de12c6be Vaclav Honzik
    trackingToolSlice.actions
129 8c57f958 Vaclav Honzik
const trackingToolReducer = trackingToolSlice.reducer
130
export default trackingToolReducer