Skip to content
Snippets Groups Projects
websocket.ts 4.22 KiB
Newer Older
import { defineStore } from 'pinia';
import { useDataStore } from '@/app/stores/data';
import type { IEntity } from '@/app/interfaces/environment';
import { useInterfaceStore } from '@/app/stores/interface';
import { addUrlsToImageEntities } from '@/app/helpers';
import { useFilesWebsocketStore } from '@/app/stores/filesWebsocket';

export const useWebsocketStore = defineStore('websocketStore', () => {
  const socket = ref();
  const dataStore = useDataStore();
  const interfaceStore = useInterfaceStore();
  const filesWebsocketStore = useFilesWebsocketStore();
  const homeEntities = computed(() => dataStore.homeEntities);
  const file = ref();
  const filesBlobLength = computed(() => filesWebsocketStore.filesBlob.length);
  function setFileData(data: any) {
    file.value = data;
  }
  onMounted(() => {
    socket.value = new WebSocket('ws://localhost:5000');
    socket.value.onopen = () => {
      const getHomeEntitiesData = {
        event: 'getHomeEntities'
      };
      socket.value.send(JSON.stringify(getHomeEntitiesData));
      const getHomeBackgroundUrlData = {
        event: 'getHomeBackgroundUrl'
      };
      socket.value.send(JSON.stringify(getHomeBackgroundUrlData));
    };
    socket.value.onmessage = (event: any) => {
      console.log('event: ', event);
      const response = JSON.parse(event.data);
      console.log('response: ', response);
      switch (response.event) {
        case 'getHomeEntities': {
          const entities = response.data;
          if (filesBlobLength.value) {
            const entitiesAddedUrls = addUrlsToImageEntities(entities);
            dataStore.editHomeEntities(entitiesAddedUrls);
          } else {
            dataStore.editHomeEntities(entities);
          }
        case 'getHomeBackgroundUrl':
          interfaceStore.setHomeBackgroundUrlFromDB(response.data?.setting_value);
          break;
        case 'createHomeEntity': {
          const entities = [...homeEntities.value];
          entities.push(response.data);
          dataStore.editHomeEntities([...entities]);
          break;
        }
        case 'createImageHomeEntity': {
          const data = {
            event: 'createHomeEntity',
            body: {
              ...file.value
            }
          };
          console.log('send now:');
          sendData(data);
          console.log('sent!');
          break;
        }
        case 'editHomeEntity': {
          let entities = [...dataStore.homeEntities];
          entities = entities.map((entity: IEntity) => {
            if (entity.entity_uuid !== response.data.entity_uuid) return entity;
            return response.data;
          });
          dataStore.editHomeEntities(entities);
          break;
        }
        case 'deleteHomeEntity': {
          let newState = [...dataStore.homeEntities];
          newState = newState.filter(
            (entity: IEntity) => entity.entity_uuid !== response.data.entity_uuid
          );
          dataStore.editHomeEntities(newState);
          break;
        }
        case 'changeOrderHomeEntity': {
          const newState = dataStore.homeEntities;
          const entityIndex = newState.findIndex(
            (entity: IEntity) => entity.entity_uuid === response.data.entity_uuid
          );
          if (response.data.direction === 'up') {
            [newState[entityIndex], newState[entityIndex - 1]] = [
              newState[entityIndex - 1],
              newState[entityIndex]
            ];
          } else {
            [newState[entityIndex], newState[entityIndex + 1]] = [
              newState[entityIndex + 1],
              newState[entityIndex]
            ];
          }
          dataStore.editHomeEntities(newState);
        }
      }
    };
    socket.value.onclose = () => {
      console.log('Websocket connection closed');
    };
    socket.value.onerror = () => {
      console.log('Websocket caught an error');
    };
  });

  watch(filesBlobLength, () => {
    console.log('watch');
    const entitiesAddedUrls = addUrlsToImageEntities(homeEntities.value);
    console.log('entitiesAddedUrls', entitiesAddedUrls);
    dataStore.setHomeEntities(entitiesAddedUrls);
  });

  function sendData(data: any) {
    socket.value.send(JSON.stringify(data));
  }
  return { sendData, setFileData };