@polar/plugin-routing
Version:
Routing plugin for POLAR that adds routing UI for routing services to the client.
82 lines (79 loc) • 2.54 kB
text/typescript
import { type PolarModule } from '@polar/lib-custom-types'
import {
generateSimpleGetters,
generateSimpleMutations,
} from '@repositoryname/vuex-generators'
import { type Coordinate } from 'ol/coordinate'
import { RoutingGetters, RoutingState } from '../types'
import { transformCoordinateToWGS84 } from '../utils/routingServiceUtils'
import { getInitialState } from './state'
import actions from './actions'
interface SetRoutePayload {
index: number
remove?: boolean
}
/**
* Creates and returns a Vuex store module with namespacing enabled.
*
* The module is initialized with a predefined state, actions, getters, and mutations.
*
* @returns A Vuex store module configured with state, actions, getters, and mutations.
*/
export const makeStoreModule = (): PolarModule<
RoutingState,
RoutingGetters
> => ({
namespaced: true,
state: getInitialState(),
actions,
getters: {
...generateSimpleGetters(getInitialState()),
configuration: (_, __, ___, rootGetters) =>
rootGetters.configuration.routing,
displayPreferences: (_, { configuration }) =>
configuration.displayPreferences || false,
displayRouteTypesToAvoid: (_, { configuration }) =>
configuration.displayRouteTypesToAvoid || false,
routeAsWGS84: (_, getters, __, rootGetters) =>
getters.route.map((coordinate) =>
transformCoordinateToWGS84(
coordinate,
rootGetters.map.getView().getProjection().getCode()
)
),
/* searchConfiguration: (_, getters) =>
getters.configuration.searchConfiguration || null, */
selectableTravelModes: (_, { configuration }) =>
configuration.selectableTravelModes || [
'driving-car',
'cycling-regular',
'foot-walking',
],
url: (_, getters) =>
getters.configuration.url +
getters.selectedTravelMode +
'/' +
getters.configuration.format,
},
mutations: {
...generateSimpleMutations(getInitialState()),
addCoordinateToRoute(state, coordinate: Coordinate) {
const currentRoute = [...state.route]
currentRoute[state.currentlyFocusedInput] = coordinate
state.route = currentRoute
},
resetRoute(state) {
state.route = [[], []]
},
setRoute(state, { index, remove }: SetRoutePayload) {
if (remove) {
state.route = state.route.toSpliced(index, 1)
return
}
state.route = state.route.toSpliced(index, 0, [])
},
updateShowSteps(state) {
state.showSteps = !state.showSteps
},
},
})