Skip to content
Snippets Groups Projects
MyResourcesView.vue 5.15 KiB
<script setup lang="ts">
import { onMounted, reactive } from "vue";
import { useResourceStore } from "@/stores/resources";
import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue";
import ResourceCard from "@/components/resources/ResourceCard.vue";
import CreateResourceModal from "@/components/resources/modals/CreateResourceModal.vue";
import UploadResourceInfoModal from "@/components/resources/modals/UploadResourceInfoModal.vue";
import { useS3KeyStore } from "@/stores/s3keys";
import type { ResourceVersionOut, ResourceOut } from "@/client/resource";
import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
import UpdateResourceModal from "@/components/resources/modals/UpdateResourceModal.vue";
import ReasonModal from "@/components/modals/ReasonModal.vue";
import BootstrapToast from "@/components/BootstrapToast.vue";
import { Modal, Toast } from "bootstrap";

const resourceRepository = useResourceStore();
const s3KeyRepository = useS3KeyStore();
let requestReasonModal: Modal | null = null;
let syncRequestSuccessToast: Toast | null = null;

const resourceState = reactive<{
  loading: boolean;
  resourceVersionInfo?: ResourceVersionOut;
  updateResource: ResourceOut;
  syncResourceVersion?: ResourceVersionOut;
}>({
  loading: true,
  resourceVersionInfo: undefined,
  syncResourceVersion: undefined,
  updateResource: {
    name: "",
    description: "",
    source: "",
    resource_id: "",
    versions: [],
    maintainer_id: "",
  },
});

function setResourceVersionInfo(resourceVersionInfo?: ResourceVersionOut) {
  resourceState.resourceVersionInfo = resourceVersionInfo;
}

function setResourceUpdate(resource: ResourceOut) {
  resourceState.updateResource = resource;
}

function setResourceSync(version: ResourceVersionOut) {
  resourceState.syncResourceVersion = version;
}

function requestResourceSync(
  reason: string,
  resourceVersion?: ResourceVersionOut,
) {
  if (resourceVersion != undefined) {
    resourceRepository
      .requestSynchronization(resourceVersion, {
        reason: reason,
      })
      .then(() => {
        requestReasonModal?.hide();
        syncRequestSuccessToast?.show();
      });
  }
}

onMounted(() => {
  let fetchedResources = false;
  requestReasonModal = new Modal("#request-synchronization-modal");
  syncRequestSuccessToast = new Toast("#request-sync-toast");
  s3KeyRepository.fetchS3Keys(() => {
    if (!fetchedResources) {
      fetchedResources = true;
      resourceRepository.fetchOwnResources(() => {
        resourceState.loading = false;
      });
    }
  });
});
</script>

<template>
  <bootstrap-toast toast-id="request-sync-toast" color-class="success">
    Requested resource synchronization
  </bootstrap-toast>
  <reason-modal
    modal-id="request-synchronization-modal"
    modal-label=""
    :loading="false"
    purpose="request"
    @save="
      (reason) => requestResourceSync(reason, resourceState.syncResourceVersion)
    "
  >
    <template #header> Request resource synchronization</template>
  </reason-modal>
  <create-resource-modal modal-id="createResourceModal" />
  <upload-resource-info-modal
    modal-id="uploadResourceInfoModal"
    :resource-version="resourceState.resourceVersionInfo"
  />
  <update-resource-modal
    :resource="resourceState.updateResource"
    modal-id="updateResourceModal"
  />
  <div
    class="row border-bottom mb-4 justify-content-between align-items-center pb-2"
  >
    <h2 class="w-fit">My Resources</h2>
    <div class="w-fit">
      <button
        type="button"
        class="btn btn-info btn-lg w-fit me-3"
        data-bs-toggle="modal"
        data-bs-target="#uploadResourceInfoModal"
        @click="setResourceVersionInfo(undefined)"
      >
        Tutorial
      </button>
      <button
        class="btn btn-lg btn-primary w-fit"
        data-bs-toggle="modal"
        data-bs-target="#createResourceModal"
      >
        Create Resource
      </button>
    </div>
  </div>
  <div v-if="!resourceState.loading">
    <div
      v-if="resourceRepository.ownResources.length === 0"
      class="text-center fs-2 mt-5"
    >
      <font-awesome-icon
        icon="fa-solid fa-x"
        class="my-5 fs-0"
        style="color: var(--bs-secondary)"
      />
      <p>You don't have any resources registered in the system.</p>
    </div>
    <CardTransitionGroup
      v-else
      class="d-flex flex-wrap align-items-center justify-content-between"
    >
      <resource-card
        v-for="resource in resourceRepository.ownResources"
        :key="resource.resource_id"
        :resource="resource"
        :loading="false"
        style="width: 48%"
        extended
        @click-info="setResourceVersionInfo"
        @click-update="setResourceUpdate"
        @click-request-sync="setResourceSync"
      />
    </CardTransitionGroup>
  </div>
  <div
    v-else
    class="d-flex flex-wrap align-items-center justify-content-between"
  >
    <resource-card
      v-for="resource in 4"
      :key="resource"
      :resource="{
        name: '',
        description: '',
        source: '',
        resource_id: '',
        versions: [],
        maintainer_id: '',
      }"
      style="min-width: 48%"
      loading
      extended
    />
  </div>
</template>

<style scoped></style>