Projekt

Obecné

Profil

Stáhnout (4.68 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 11fca75a Vaclav Honzik
const calculateMapCenter = (pathVariant: PathVariant): LatLngTuple | undefined => {
35
    const displayableItems = pathVariant.filter((item) => item.displayable)
36
    if (displayableItems.length === 0) {
37
        return undefined
38
    }
39
40
    return [
41
        displayableItems
42
            .map((item) => item.catalogItem.latitude ?? 0)
43
            .reduce((a, b) => a + b, 0) / displayableItems.length,
44
        displayableItems
45
            .map((item) => item.catalogItem.longitude ?? 0)
46
            .reduce((a, b) => a + b, 0) / displayableItems.length,
47
    ]
48
}
49 8c57f958 Vaclav Honzik
50 04fdedc6 Vaclav Honzik
const persistConfig = {
51 de12c6be Vaclav Honzik
    key: "auth",
52 04fdedc6 Vaclav Honzik
    storage, // localStorage for browsers
53
}
54
55 8c57f958 Vaclav Honzik
export const trackingToolSlice = createSlice({
56 de12c6be Vaclav Honzik
    name: "trackingTool",
57 8c57f958 Vaclav Honzik
    initialState,
58
    reducers: {
59 de12c6be Vaclav Honzik
        consumeErr: (state: TrackingToolState) => ({
60
            ...state,
61
            lastErr: undefined,
62
        }),
63 c0cf1dbc Vaclav Honzik
        setPrimaryIdx: (state: TrackingToolState, action: any) => ({
64 8c57f958 Vaclav Honzik
            ...state,
65
            primaryPathIdx: action.payload,
66
        }),
67 c0cf1dbc Vaclav Honzik
        resetDialogApiCallSuccess: (state: TrackingToolState) => ({
68 8c57f958 Vaclav Honzik
            ...state,
69
            dialogApiCallSuccess: false,
70
        }),
71 de12c6be Vaclav Honzik
        setPage: (state: TrackingToolState, action: { payload: number }) => ({
72 81698b9a Vaclav Honzik
            ...state,
73
            currentPage: action.payload,
74
        }),
75 7b864a5c Vaclav Honzik
        updateMapMarker: (state: TrackingToolState, action: { payload: { idx: number, item: MapPoint } }) => {
76
            const { idx, item } = action.payload
77 de12c6be Vaclav Honzik
            if (!state.pathVariants || state.pathVariants.length <= idx) {
78
                return state
79
            }
80
81
            return {
82
                ...state,
83
                pathVariants: state.pathVariants.map((pathVariant, i) => {
84
                    if (i !== idx) {
85
                        return [...pathVariant]
86
                    }
87
88
                    return [
89 7b864a5c Vaclav Honzik
                        ...pathVariant.slice(0, item.idx),
90
                        item,
91
                        ...pathVariant.slice(item.idx + 1),
92 de12c6be Vaclav Honzik
                    ]
93
                })
94
            }
95
        },
96
        clear: () => ({ ...initialState }),
97 8c57f958 Vaclav Honzik
    },
98
    extraReducers: (builder) => {
99
        builder.addCase(sendTextForProcessing.fulfilled, (state, action) => {
100 04fdedc6 Vaclav Honzik
            const pathDto: PathDto = action.payload
101
            const pathVariants = buildPathVariants(pathDto)
102 11fca75a Vaclav Honzik
103
            const mapCenter = calculateMapCenter(pathVariants[state.primaryPathIdx])
104 8c57f958 Vaclav Honzik
            return {
105
                ...state,
106
                pathVariants,
107 04fdedc6 Vaclav Honzik
                pathDto,
108 11fca75a Vaclav Honzik
                mapCenter: mapCenter ?? state.mapCenter,
109 8c57f958 Vaclav Honzik
                isLoading: false,
110
                dialogApiCallSuccess: true,
111 81698b9a Vaclav Honzik
                currentPage: 0,
112 8c57f958 Vaclav Honzik
            }
113
        })
114 b45d0300 Vaclav Honzik
        builder.addCase(sendTextForProcessing.rejected, (_, action) => ({
115 8c57f958 Vaclav Honzik
            ...initialState,
116 dd270a41 Vaclav Honzik
            lastError: action.error.message,
117 8c57f958 Vaclav Honzik
            isLoading: false,
118
            dialogApiCallSuccess: false,
119 81698b9a Vaclav Honzik
            currentPage: 0,
120 8c57f958 Vaclav Honzik
        }))
121
        builder.addCase(sendTextForProcessing.pending, (state) => {
122
            return {
123
                ...state,
124
                isLoading: true,
125
                dialogApiCallSuccess: false,
126
            }
127
        })
128
    },
129
})
130
131 7b864a5c Vaclav Honzik
export const { consumeErr, setPrimaryIdx, resetDialogApiCallSuccess, clear, updateMapMarker } =
132 de12c6be Vaclav Honzik
    trackingToolSlice.actions
133 8c57f958 Vaclav Honzik
const trackingToolReducer = trackingToolSlice.reducer
134
export default trackingToolReducer