refactor(ui): factor out app initialization
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 29 Feb 2024 10:54:05 +0000 (11:54 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 29 Feb 2024 10:54:05 +0000 (11:54 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
ui/web/src/components/actions/AddChargingStations.vue
ui/web/src/components/actions/SetSupervisionUrl.vue
ui/web/src/components/actions/StartTransaction.vue
ui/web/src/components/buttons/ReloadButton.vue
ui/web/src/main.ts
ui/web/src/views/ChargingStationsView.vue

index 51e8a83093f1f2591e74bf32957318edf595f132..ff9f5f61472a5c988a7183baab9c728b6edcf10a 100644 (file)
@@ -2,7 +2,13 @@
   <h1 id="action">Action</h1>
   <h2>Add Charging Stations</h2>
   <p>Template:</p>
-  <select v-show="state.ready" v-model="state.template">
+  <select
+    v-show="
+      Array.isArray(app?.appContext.config.globalProperties.$templates) &&
+      app?.appContext.config.globalProperties.$templates.length > 0
+    "
+    v-model="state.template"
+  >
     <option disabled value="">Please select a template</option>
     <option v-for="template in app?.appContext.config.globalProperties.$templates">
       {{ template }}
 </template>
 
 <script setup lang="ts">
-import { getCurrentInstance, onMounted, reactive } from 'vue'
+import { getCurrentInstance, ref } from 'vue'
 import { useToast } from 'vue-toast-notification'
 import Button from '@/components/buttons/Button.vue'
-import type { ResponsePayload } from '@/types'
 import { convertToBoolean } from '@/composables'
 
-const state = reactive({
-  ready: false,
+const state = ref({
   template: '',
   numberOfStations: 1,
   supervisionUrl: '',
@@ -114,23 +118,6 @@ const app = getCurrentInstance()
 const uiClient = app?.appContext.config.globalProperties.$uiClient
 
 const $toast = useToast()
-
-onMounted(() => {
-  uiClient
-    .listTemplates()
-    .then((response: ResponsePayload) => {
-      if (app != null && app.appContext.config.globalProperties.$templates == null) {
-        app.appContext.config.globalProperties.$templates = response.templates
-      }
-    })
-    .catch((error: Error) => {
-      $toast.error('Error at fetching charging station templates')
-      console.error('Error at fetching charging station templates:', error)
-    })
-    .finally(() => {
-      state.ready = true
-    })
-})
 </script>
 
 <style>
index e50316bf844f57775adb8712865f78adcae997ea..ff2a4b809b446cb61e5d1b3118dcf4b931abe2bc 100644 (file)
@@ -36,7 +36,7 @@
 </template>
 
 <script setup lang="ts">
-import { getCurrentInstance, reactive } from 'vue'
+import { getCurrentInstance, ref } from 'vue'
 import Button from '@/components/buttons/Button.vue'
 
 const props = defineProps<{
@@ -44,7 +44,7 @@ const props = defineProps<{
   chargingStationId: string
 }>()
 
-const state = reactive({
+const state = ref({
   supervisionUrl: ''
 })
 
index fed7d3beabef1f9bac06940bd9fd996d72e40c53..22acbef3ed9fcab693e4b8e876776588c6b452ef 100644 (file)
@@ -30,7 +30,7 @@
 </template>
 
 <script setup lang="ts">
-import { getCurrentInstance, reactive } from 'vue'
+import { getCurrentInstance, ref } from 'vue'
 import Button from '@/components/buttons/Button.vue'
 import { convertToInt } from '@/composables'
 
@@ -40,7 +40,7 @@ const props = defineProps<{
   connectorId: string
 }>()
 
-const state = reactive({
+const state = ref({
   idTag: ''
 })
 
index 2fa291af8ae536ceaf4adcfb486482bda08f637e..bf74ec9a330b738f9a00825aa757ed95879287b2 100644 (file)
@@ -1,6 +1,6 @@
 <template>
   <FlatButton>
-    <span style="display: inline-block" :class="{ spin: loading }"> &#8635; </span>
+    <span :class="{ spin: loading }"> &#8635; </span>
   </FlatButton>
 </template>
 
index 8c16f4a7fefe0fadd3d157cea469e9e0d3ba5fba..5d34ae912e8ecb44f36c276b9542e6c0dc2c6bdc 100644 (file)
@@ -21,6 +21,9 @@ const initializeApp = (app: AppType, config: ConfigurationData) => {
   if (app.config.globalProperties.$configuration == null) {
     app.config.globalProperties.$configuration = config
   }
+  if (!Array.isArray(app.config.globalProperties.$templates)) {
+    app.config.globalProperties.$templates = []
+  }
   if (!Array.isArray(app.config.globalProperties.$chargingStations)) {
     app.config.globalProperties.$chargingStations = []
   }
index 90433782b17a68b413e94cefb92776a3e333cbb2..a19c14c32283c7d35591552b9486c6a8f048b85a 100644 (file)
@@ -20,7 +20,6 @@
                 'open',
                 () => {
                   setToLocalStorage<number>('uiServerConfigurationIndex', state.uiServerIndex)
-                  delete app?.appContext.config.globalProperties.$templates
                   $router.currentRoute.value.name !== 'charging-stations' &&
                     $router.push({ name: 'charging-stations' })
                 },
@@ -75,7 +74,7 @@
 </template>
 
 <script setup lang="ts">
-import { getCurrentInstance, onMounted, reactive } from 'vue'
+import { getCurrentInstance, onMounted, ref } from 'vue'
 import { useToast } from 'vue-toast-notification'
 import CSTable from '@/components/charging-stations/CSTable.vue'
 import type { ResponsePayload, UIServerConfigurationSection } from '@/types'
@@ -92,15 +91,29 @@ const app = getCurrentInstance()
 
 const initializeWSEventListeners = () => {
   app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('open', () => {
-    loadChargingStations(() => (state.renderChargingStationsList = randomUUID()))
+    uiClient
+      .listTemplates()
+      .then((response: ResponsePayload) => {
+        if (app != null) {
+          app.appContext.config.globalProperties.$templates = response.templates
+        }
+      })
+      .catch((error: Error) => {
+        if (app != null) {
+          app.appContext.config.globalProperties.$templates = []
+        }
+        $toast.error('Error at fetching charging station templates')
+        console.error('Error at fetching charging station templates:', error)
+      })
+    loadChargingStations(() => (state.value.renderChargingStationsList = randomUUID()))
   })
   app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('error', () => {
     app.appContext.config.globalProperties.$chargingStations = []
-    state.renderChargingStationsList = randomUUID()
+    state.value.renderChargingStationsList = randomUUID()
   })
   app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('close', () => {
     app.appContext.config.globalProperties.$chargingStations = []
-    state.renderChargingStationsList = randomUUID()
+    state.value.renderChargingStationsList = randomUUID()
   })
 }
 
@@ -108,7 +121,7 @@ onMounted(() => {
   initializeWSEventListeners()
 })
 
-const state = reactive({
+const state = ref({
   renderChargingStationsList: randomUUID(),
   loading: false,
   uiServerIndex: getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
@@ -126,8 +139,8 @@ const uiServerConfigurations: { configuration: UIServerConfigurationSection; ind
 const $toast = useToast()
 
 const loadChargingStations = (renderCallback?: () => void): void => {
-  if (state.loading === false) {
-    state.loading = true
+  if (state.value.loading === false) {
+    state.value.loading = true
     uiClient
       .listChargingStations()
       .then((response: ResponsePayload) => {
@@ -146,7 +159,7 @@ const loadChargingStations = (renderCallback?: () => void): void => {
         if (renderCallback != null) {
           renderCallback()
         }
-        state.loading = false
+        state.value.loading = false
       })
   }
 }