fix(ui): ensure the charging stations list re-rendered after UI server
[e-mobility-charging-stations-simulator.git] / ui / web / src / main.ts
CommitLineData
0344ad2b 1import { type App as AppType, createApp } from 'vue'
cea23fa0 2import ToastPlugin from 'vue-toast-notification'
53694372 3import type { ConfigurationData, ResponsePayload } from '@/types'
13c19b7b 4import { router } from '@/router'
0344ad2b 5import { UIClient, getFromLocalStorage, setToLocalStorage } from '@/composables'
9d76f5ec 6import App from '@/App.vue'
dd9a3329 7import 'vue-toast-notification/dist/theme-bootstrap.css'
32de5a57 8
0344ad2b
JB
9const app = createApp(App)
10
11const initializeApp = (app: AppType, config: ConfigurationData) => {
a64b9a64
JB
12 app.config.errorHandler = (error, instance, info) => {
13 console.error('Error:', error)
14 console.info('Vue instance:', instance)
15 console.info('Error info:', info)
c317ae3e 16 // TODO: add code for UI notifications or other error handling logic
a64b9a64 17 }
0344ad2b
JB
18 if (!Array.isArray(config.uiServer)) {
19 config.uiServer = [config.uiServer]
20 }
21 if (app.config.globalProperties.$configuration == null) {
22 app.config.globalProperties.$configuration = config
23 }
24 if (!Array.isArray(app.config.globalProperties.$chargingStations)) {
25 app.config.globalProperties.$chargingStations = []
26 }
27 if (
28 getFromLocalStorage<number | undefined>('uiServerConfigurationIndex', undefined) == null ||
29 getFromLocalStorage<number>('uiServerConfigurationIndex', 0) >
30 app.config.globalProperties.$configuration.uiServer.length - 1
31 ) {
32 setToLocalStorage<number>('uiServerConfigurationIndex', 0)
33 }
34 if (app.config.globalProperties.$uiClient == null) {
35 app.config.globalProperties.$uiClient = UIClient.getInstance(
36 app.config.globalProperties.$configuration.uiServer[
37 getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
38 ]
39 )
7e2e8c9b
JB
40 app.config.globalProperties.$uiClient.registerWSEventListener(
41 'open',
42 () => {
43 app.config.globalProperties.$uiClient
44 .listChargingStations()
45 .then((response: ResponsePayload) => {
46 app.config.globalProperties.$chargingStations = response.chargingStations
47 })
48 .catch((error: Error) => {
49 // TODO: add code for UI notifications or other error handling logic
50 console.error('Error at fetching charging stations:', error)
51 })
52 .finally(() => {
53 app.use(router).use(ToastPlugin).mount('#app')
54 })
55 },
56 { once: true }
57 )
0344ad2b 58 }
a64b9a64 59}
9d76f5ec
JB
60
61fetch('/config.json')
53694372
JB
62 .then(response => {
63 if (!response.ok) {
64 // TODO: add code for UI notifications or other error handling logic
65 console.error('Failed to fetch app configuration')
66 return
67 }
68 response
69 .json()
70 .then(config => {
bcb671db 71 try {
0344ad2b 72 initializeApp(app, config)
bcb671db
JB
73 } catch (error) {
74 // TODO: add code for UI notifications or other error handling logic
88d3e6ed 75 console.error('Error at initializing app:', error)
bcb671db 76 }
53694372
JB
77 })
78 .catch(error => {
79 // TODO: add code for UI notifications or other error handling logic
bcb671db 80 console.error('Error at deserializing JSON app configuration:', error)
53694372 81 })
a64b9a64
JB
82 })
83 .catch(error => {
53694372
JB
84 // TODO: add code for UI notifications or other error handling logic
85 console.error('Error at fetching app configuration:', error)
9d76f5ec 86 })