Update a route based on the state of charge

A car is not always fully charged and in the same location. That's why the state of charge can be treated as a variable. By hooking it up to a slider the impact on a route becomes visible.

Requirements

Steps to take

  1. Plotting a route based on battery capacity starts by executing the newRoute mutation. This mutation requires information about the car, origin and destination. To support changing the battery capacity, the ev.battery.stateOfCharge argument needs to be treated as a variable. After the mutation is finished executing a route id will be returned.
  2. This id can be used to request route updates through the routeUpdatedById subscription. This subscription receives dynamic updates.
  3. After the subscription returns done as status, the polyline and legs fields will be available. These can be used to display the route and charge stations on the map. Additional data such as distance, duration and consumption are also available.
  4. Now the ev.battery.stateOfCharge will be tied to a slider in the UI. Every time the slider gets updated, a new route will be generated and displayed to show the impact.

Next steps

The last couple of examples explained most of the variables when it comes to routing. Next steps would be exploring the routing api reference to play around with occupants, different vehicles or even cargo.

  • client.js
  • index.js
  • interface.js
  • map.js
  • queries.js
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
          import { SubscriptionClient } from 'subscriptions-transport-ws';import { createClient, createRequest, defaultExchanges, subscriptionExchange } from '@urql/core';import { createRouteQuery, routeUpdateSubscription } from './queries';import { pipe, subscribe } from 'wonka'; /** * For the purpose of this example we use urgl - lightweights GraphQL client. * To establish a connection with Chargetrip GraphQL API you need to have an API key. * The key in this example is a public one and gives access only to a part of our extensive database. * You need a registered `x-client-id` to access the full database. * Read more about authorisation in our documentation (https://docs.chargetrip.com/#authorisation). */const headers = {  //Replace this x-client-id and app-id with your own to get access to more cars  'x-client-id': '5ed1175bad06853b3aa1e492',  'x-app-id': '623998b2c35130073829b2d2',}; const subscriptionClient = new SubscriptionClient('wss://api.chargetrip.io/graphql', {  reconnect: true,  connectionParams: headers,}); const client = createClient({  url: 'https://api.chargetrip.io/graphql',  fetchOptions: {    method: 'POST',    headers,  },  exchanges: [    ...defaultExchanges,    subscriptionExchange({      forwardSubscription(operation) {        return subscriptionClient.request(operation);      },    }),  ],}); /* * To create a route you need to: * * 1. create a new route and receive back its ID; * 2. subscribe to route updates in order to receive its details. */export const getRoute = (soc, callback) => {  client    .mutation(createRouteQuery, { soc: parseFloat(soc) })    .toPromise()    .then(response => {      const routeId = response.data.newRoute;       const { unsubscribe } = pipe(        client.executeSubscription(createRequest(routeUpdateSubscription, { id: routeId })),        subscribe(result => {          const { status, route } = result.data?.routeUpdatedById;          // You can keep listening to the route changes to update route information.          // For this example we want to only draw the initial route.          if (status === 'done' && route) {            unsubscribe();            callback(route);          } else if (status === 'not_found') {            callback();          }        }),      );    })    .catch(error => console.log(error));};