export class UIClient {
private static instance: UIClient | null = null
- private ws!: WebSocket
+ private ws?: WebSocket
private responseHandlers: Map<string, ResponseHandler>
private constructor(private uiServerConfiguration: UIServerConfigurationSection) {
}
public setConfiguration(uiServerConfiguration: UIServerConfigurationSection): void {
- this.ws.close()
+ if (this.ws?.readyState === WebSocket.OPEN) {
+ this.ws.close()
+ delete this.ws
+ }
this.uiServerConfiguration = uiServerConfiguration
this.openWS()
}
listener: (event: WebSocketEventMap[K]) => void,
options?: boolean | AddEventListenerOptions
) {
- this.ws.addEventListener(event, listener, options)
+ this.ws?.addEventListener(event, listener, options)
}
public async startSimulator(): Promise<ResponsePayload> {
payload: RequestPayload
): Promise<ResponsePayload> {
return new Promise<ResponsePayload>((resolve, reject) => {
- if (this.ws.readyState === WebSocket.OPEN) {
+ if (this.ws?.readyState === WebSocket.OPEN) {
const uuid = crypto.randomUUID()
const msg = JSON.stringify([uuid, procedureName, payload])
const sendTimeout = setTimeout(() => {
import { type App as AppType, createApp } from 'vue'
import ToastPlugin from 'vue-toast-notification'
-import type { ConfigurationData, ResponsePayload } from '@/types'
+import type { ConfigurationData } from '@/types'
import { router } from '@/router'
import { UIClient, getFromLocalStorage, setToLocalStorage } from '@/composables'
import App from '@/App.vue'
getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
]
)
- app.config.globalProperties.$uiClient.registerWSEventListener(
- 'open',
- () => {
- app.config.globalProperties.$uiClient
- .listChargingStations()
- .then((response: ResponsePayload) => {
- app.config.globalProperties.$chargingStations = response.chargingStations
- })
- .catch((error: Error) => {
- // TODO: add code for UI notifications or other error handling logic
- console.error('Error at fetching charging stations:', error)
- })
- .finally(() => {
- app.use(router).use(ToastPlugin).mount('#app')
- })
- },
- { once: true }
- )
}
+ app.use(router).use(ToastPlugin).mount('#app')
}
fetch('/config.json')
response
.json()
.then(config => {
- try {
- initializeApp(app, config)
- } catch (error) {
- // TODO: add code for UI notifications or other error handling logic
- console.error('Error at initializing app:', error)
- }
+ initializeApp(app, config)
})
.catch(error => {
// TODO: add code for UI notifications or other error handling logic
v-model="state.uiServerIndex"
@change="
() => {
- try {
- if (
- getFromLocalStorage<number>('uiServerConfigurationIndex', 0) !== state.uiServerIndex
- ) {
- setToLocalStorage<number>('uiServerConfigurationIndex', state.uiServerIndex)
- app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
- 'close',
- () => {
- app!.appContext.config.globalProperties.$chargingStations = []
- },
- { once: true }
- )
- app?.appContext.config.globalProperties.$uiClient.setConfiguration(
- app?.appContext.config.globalProperties.$configuration.uiServer[
- getFromLocalStorage<number>('uiServerConfigurationIndex', state.uiServerIndex)
- ]
- )
- app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
- 'open',
- () => {
- loadChargingStations(() => (state.renderChargingStationsList = randomUUID()))
- },
- { once: true }
- )
- }
- } catch (error) {
- $toast.error('Error at changing UI server configuration')
- console.error('Error at changing UI server configuration:', error)
+ if (
+ getFromLocalStorage<number>('uiServerConfigurationIndex', 0) !== state.uiServerIndex
+ ) {
+ app?.appContext.config.globalProperties.$uiClient.setConfiguration(
+ app?.appContext.config.globalProperties.$configuration.uiServer[state.uiServerIndex]
+ )
+ initializeWSEventListeners()
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'open',
+ () => {
+ setToLocalStorage<number>('uiServerConfigurationIndex', state.uiServerIndex)
+ },
+ { once: true }
+ )
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'error',
+ () => {
+ state.uiServerIndex = getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
+ app?.appContext.config.globalProperties.$uiClient.setConfiguration(
+ app?.appContext.config.globalProperties.$configuration.uiServer[
+ getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
+ ]
+ )
+ initializeWSEventListeners()
+ },
+ { once: true }
+ )
}
}
"
</template>
<script setup lang="ts">
-import { getCurrentInstance, reactive } from 'vue'
+import { getCurrentInstance, onMounted, reactive } from 'vue'
import { useToast } from 'vue-toast-notification'
import CSTable from '@/components/charging-stations/CSTable.vue'
import type { ResponsePayload, UIServerConfigurationSection } from '@/types'
return crypto.randomUUID()
}
+const app = getCurrentInstance()
+
+const initializeWSEventListeners = () => {
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('open', () => {
+ loadChargingStations(() => (state.renderChargingStationsList = randomUUID()))
+ })
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('error', () => {
+ app.appContext.config.globalProperties.$chargingStations = []
+ state.renderChargingStationsList = randomUUID()
+ })
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('close', () => {
+ app.appContext.config.globalProperties.$chargingStations = []
+ state.renderChargingStationsList = randomUUID()
+ })
+}
+
+onMounted(() => {
+ initializeWSEventListeners()
+})
+
const state = reactive({
renderChargingStationsList: randomUUID(),
loading: false,
uiServerIndex: getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
})
-const app = getCurrentInstance()
const uiClient = app?.appContext.config.globalProperties.$uiClient
const uiServerConfigurations: { configuration: UIServerConfigurationSection; index: number }[] =
app?.appContext.config.globalProperties.$configuration.uiServer.map(
}
})
.catch((error: Error) => {
+ if (app != null) {
+ app.appContext.config.globalProperties.$chargingStations = []
+ }
$toast.error('Error at fetching charging stations')
console.error('Error at fetching charging stations:', error)
})