{"version":3,"file":"LiveList-CPABb0tx.mjs","names":[],"sources":["../src/components/display/live/LiveItem.vue","../src/components/display/live/LiveItem.vue","../src/components/display/live/LiveList.vue","../src/components/display/live/LiveList.vue"],"sourcesContent":["<template>\n  <PodcastItem\n    v-if=\"live && 0 !== live.podcastId\"\n    :podcast=\"live\"\n    :fetch-conference=\"fetchConference\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport classicApi from \"../../../api/classicApi\";\nimport PodcastItem from \"../podcasts/PodcastItem.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport {onBeforeMount, onUnmounted, ref, Ref } from \"vue\";\nimport {\n  Conference,\n  ConferencePublicInfo,\n} from \"@/stores/class/conference/conference\";\n\n//Props \nconst props = defineProps({\n  fetchConference: { default: undefined, type: Object as () => Conference },\n})\n \n//Emits\nconst emit = defineEmits([\"deleteItem\", \"updateItem\"]);\n\n//Data \nconst live: Ref<Podcast | undefined> = ref(undefined);\nconst watchInterval: Ref<ReturnType<typeof setInterval> | undefined> = ref(undefined);\n\n\nonBeforeMount(()=>initLiveItem());\nonUnmounted(()=>clearWatchStatus())\n\n\n//Methods\nfunction clearWatchStatus() {\n  clearInterval(watchInterval.value as unknown as number);\n  watchInterval.value = undefined;\n}\nasync function initLiveItem(){\n  await fetchPodcastData();\n  watchInterval.value = setInterval(() => {\n    fetchStatus();\n  }, 5000);\n}\nasync function fetchPodcastData(): Promise<void> {\n  if (!props.fetchConference?.podcastId) return;\n  try {\n    live.value = await classicApi.fetchData<Podcast>({\n      api: 0,\n      path: \"podcast/\" + props.fetchConference.podcastId,\n    });\n  } catch {\n    emit(\"deleteItem\");\n    if (props.fetchConference.conferenceId) {\n      await classicApi.deleteData({\n        api: 9,\n        path: \"conference/\" + props.fetchConference.conferenceId,\n      });\n    }\n  }\n}\nasync function fetchStatus(): Promise<void> {\n  if (\n    !props.fetchConference ||\n    (\"PLANNED\" !== props.fetchConference.status &&\n      \"PENDING\" !== props.fetchConference.status &&\n      \"RECORDING\" !== props.fetchConference.status)\n  ) {\n    clearWatchStatus();\n    return;\n  }\n  const confInfo = await classicApi.fetchData<ConferencePublicInfo>({\n    api: 9,\n    path: \"conference/info/\" + props.fetchConference.conferenceId,\n  });\n  if (confInfo.status !== props.fetchConference.status) {\n    emit(\"updateItem\", {\n      ...props.fetchConference,\n      ...confInfo,\n    });\n  }\n}\n</script>\n","<template>\n  <PodcastItem\n    v-if=\"live && 0 !== live.podcastId\"\n    :podcast=\"live\"\n    :fetch-conference=\"fetchConference\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport classicApi from \"../../../api/classicApi\";\nimport PodcastItem from \"../podcasts/PodcastItem.vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport {onBeforeMount, onUnmounted, ref, Ref } from \"vue\";\nimport {\n  Conference,\n  ConferencePublicInfo,\n} from \"@/stores/class/conference/conference\";\n\n//Props \nconst props = defineProps({\n  fetchConference: { default: undefined, type: Object as () => Conference },\n})\n \n//Emits\nconst emit = defineEmits([\"deleteItem\", \"updateItem\"]);\n\n//Data \nconst live: Ref<Podcast | undefined> = ref(undefined);\nconst watchInterval: Ref<ReturnType<typeof setInterval> | undefined> = ref(undefined);\n\n\nonBeforeMount(()=>initLiveItem());\nonUnmounted(()=>clearWatchStatus())\n\n\n//Methods\nfunction clearWatchStatus() {\n  clearInterval(watchInterval.value as unknown as number);\n  watchInterval.value = undefined;\n}\nasync function initLiveItem(){\n  await fetchPodcastData();\n  watchInterval.value = setInterval(() => {\n    fetchStatus();\n  }, 5000);\n}\nasync function fetchPodcastData(): Promise<void> {\n  if (!props.fetchConference?.podcastId) return;\n  try {\n    live.value = await classicApi.fetchData<Podcast>({\n      api: 0,\n      path: \"podcast/\" + props.fetchConference.podcastId,\n    });\n  } catch {\n    emit(\"deleteItem\");\n    if (props.fetchConference.conferenceId) {\n      await classicApi.deleteData({\n        api: 9,\n        path: \"conference/\" + props.fetchConference.conferenceId,\n      });\n    }\n  }\n}\nasync function fetchStatus(): Promise<void> {\n  if (\n    !props.fetchConference ||\n    (\"PLANNED\" !== props.fetchConference.status &&\n      \"PENDING\" !== props.fetchConference.status &&\n      \"RECORDING\" !== props.fetchConference.status)\n  ) {\n    clearWatchStatus();\n    return;\n  }\n  const confInfo = await classicApi.fetchData<ConferencePublicInfo>({\n    api: 9,\n    path: \"conference/info/\" + props.fetchConference.conferenceId,\n  });\n  if (confInfo.status !== props.fetchConference.status) {\n    emit(\"updateItem\", {\n      ...props.fetchConference,\n      ...confInfo,\n    });\n  }\n}\n</script>\n","<template>\n  <section v-if=\"displayLiveList\" class=\"d-flex flex-column align-items-start mt-3\">\n    <div\n      class=\"d-flex justify-content-between flex-grow-1 mb-3 w-100 align-items-center\"\n    >\n      <h2 class=\"mb-0\">\n        {{ t(\"Live\") }}\n      </h2>\n      <router-link\n        v-if=\"liveRight && !isPodcastmaker\"\n        to=\"/main/priv/edit/live\"\n      >\n        <button class=\"btn btn-primary\">\n          {{ t(\"Launch a new live\") }}\n        </button>\n      </router-link>\n    </div>\n    <ClassicSelect\n      v-if=\"lives.length || 'ALL' !== selectedStatus\"\n      v-model:text-init=\"selectedStatus\"\n      id-select=\"status-live-chooser-select\"\n      :label=\"t('Selection by status')\"\n      :display-label=\"false\"\n      :options=\"statusArraySelect\"\n      class=\"mb-3\"\n    />\n    <ClassicLoading\n      :loading-text=\"loading ? t('Loading lives...') : undefined\"\n      :error-text=\"0 === lives.length ? t('No live currently') : undefined\"\n    />\n    <template v-if=\"lives.length\">\n      <SwiperList v-if=\"!loading\" :list-object=\"lives\">\n        <template #octopusSlide=\"{ option, index }\">\n          <LiveItem\n            :fetch-conference=\"option\"\n            @delete-item=\"deleteLive(index)\"\n            @update-item=\"updateLive($event, index)\"\n          />\n        </template>\n      </SwiperList>\n    </template>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport LiveItem from \"./LiveItem.vue\";\nimport ClassicSelect from \"../../form/ClassicSelect.vue\";\nimport SwiperList from \"../list/SwiperList.vue\";\nimport {useErrorHandler} from \"../../composable/useErrorHandler\";\nimport {useOrgaComputed} from \"../../composable/useOrgaComputed\";\nimport classicApi from \"../../../api/classicApi\";\nimport { useAuthStore } from \"../../../stores/AuthStore\";\nimport { useFilterStore } from \"../../../stores/FilterStore\";\nimport { Conference } from \"@/stores/class/conference/conference\";\nimport { computed, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useSaveFetchStore } from \"../../../stores/SaveFetchStore\";\nimport { useI18n } from \"vue-i18n\";\n\n//Props \nconst props = defineProps({\n  organisationId: { default: undefined, type: String },\n  hideIfEmpty: { default: false, type: Boolean },\n})\n\n//Data \nconst loading = ref(true);\nconst loaded = ref(true);\nconst lives: Ref<Array<Conference>> = ref([]);\nconst isLiveAuthorized = ref(false);\nconst statusClassic= ref([\"RECORDING\", \"PENDING\", \"PLANNED\"]);\nconst statusAdmin = ref([\"DEBRIEFING\", \"ERROR\", \"PUBLISHING\"]);\nconst selectedStatus = ref(\"ALL\");\n\n\n//Composables\nconst { t } = useI18n();\nconst { isPodcastmaker, isEditRights } = useOrgaComputed();\nconst {handle403} = useErrorHandler();\nconst authStore = useAuthStore();\nconst filterStore = useFilterStore();\nconst saveFetchStore = useSaveFetchStore();\n\n\n//Computed\nconst displayLiveList = computed(() => {\n  return (\n    (undefined !== filterStore.filterOrgaId ||\n      undefined !== props.organisationId) &&\n    (!props.hideIfEmpty || (props.hideIfEmpty && 0 !== lives.value.length))\n  );\n});\nconst filterOrgaUsed = computed(() => {\n  return filterStore.filterOrgaId ? filterStore.filterOrgaId : props.organisationId;\n});\nconst editRight = computed(() => {\n  return isEditRights(filterOrgaUsed.value);\n});\nconst liveRight = computed(() => {\n  return (\n    authStore.isRoleLive &&\n    \"true\" === authStore.authOrganisation.attributes?.[\"live.active\"]\n  );\n});\nconst statusArraySelect = computed(() => {\n  const statusArray = [{ title: t(\"All lives\"), value: \"ALL\" }];\n      for (const status of statusFetched.value) {\n        let title = \"\";\n        switch (status) {\n          case \"RECORDING\":\n            title = t(\"In live\");\n            break;\n          case \"PENDING\":\n            title = t(\"live upcoming\");\n            break;\n          case \"PLANNED\":\n            title = t(\"live in few time\");\n            break;\n          case \"DEBRIEFING\":\n            title = t(\"In debriefing\");\n            break;\n          case \"PUBLISHING\":\n            title = t(\"In the process of being published\");\n            break;\n          case \"ERROR\":\n            title = t(\"In error\");\n            break;\n          default:\n            break;\n        }\n        statusArray.push({ title: title, value: status });\n      }\n      return statusArray;\n});\nconst statusFetched = computed(() => {\n  if (editRight.value) {\n    return statusClassic.value.concat(statusAdmin.value);\n  }\n  return statusClassic.value;\n});\n\n\n//Watch\nwatch(filterOrgaUsed, async () => {\n  await checkIfLiveAuthorized();\n  fetchContent();\n}, {immediate: true});\nwatch(selectedStatus, () => fetchContent());\n\n\n//Methods\nasync function checkIfLiveAuthorized(): Promise<void> {\n  if (!filterOrgaUsed.value) {\n    return;\n  }\n  isLiveAuthorized.value = await saveFetchStore.getOrgaLiveEnabled(\n    filterOrgaUsed.value,\n  );\n}\nfunction endLoading(): void {\n  loading.value = false;\n  loaded.value = true;\n}\nfunction updateLive(live: Conference, index: number): void {\n  lives.value.splice(index, 1, live);\n}\nasync function fetchContent(): Promise<void> {\n  lives.value.length = 0;\n  if (!filterOrgaUsed.value || !isLiveAuthorized.value) {\n    endLoading();\n    return;\n  }\n  loading.value = true;\n  loaded.value = false;\n  try {\n    const dataLives = await classicApi.fetchData<Array<Conference>>({\n      api: 9,\n      path: \"conference/list\",\n      parameters: {\n        organisationId: filterOrgaUsed.value,\n        withPodcastId: true,\n        status:\n          \"ALL\" === selectedStatus.value\n            ? statusFetched.value\n            : selectedStatus.value,\n      },\n    });\n    lives.value = dataLives.filter((p: Conference | null) => {\n      return null !== p;\n    });\n  } catch (error) {\n    handle403(error as AxiosError);\n  }\n  endLoading();\n}\nfunction deleteLive(index: number): void {\n  lives.value.splice(index, 1);\n}\n</script>\n","<template>\n  <section v-if=\"displayLiveList\" class=\"d-flex flex-column align-items-start mt-3\">\n    <div\n      class=\"d-flex justify-content-between flex-grow-1 mb-3 w-100 align-items-center\"\n    >\n      <h2 class=\"mb-0\">\n        {{ t(\"Live\") }}\n      </h2>\n      <router-link\n        v-if=\"liveRight && !isPodcastmaker\"\n        to=\"/main/priv/edit/live\"\n      >\n        <button class=\"btn btn-primary\">\n          {{ t(\"Launch a new live\") }}\n        </button>\n      </router-link>\n    </div>\n    <ClassicSelect\n      v-if=\"lives.length || 'ALL' !== selectedStatus\"\n      v-model:text-init=\"selectedStatus\"\n      id-select=\"status-live-chooser-select\"\n      :label=\"t('Selection by status')\"\n      :display-label=\"false\"\n      :options=\"statusArraySelect\"\n      class=\"mb-3\"\n    />\n    <ClassicLoading\n      :loading-text=\"loading ? t('Loading lives...') : undefined\"\n      :error-text=\"0 === lives.length ? t('No live currently') : undefined\"\n    />\n    <template v-if=\"lives.length\">\n      <SwiperList v-if=\"!loading\" :list-object=\"lives\">\n        <template #octopusSlide=\"{ option, index }\">\n          <LiveItem\n            :fetch-conference=\"option\"\n            @delete-item=\"deleteLive(index)\"\n            @update-item=\"updateLive($event, index)\"\n          />\n        </template>\n      </SwiperList>\n    </template>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport LiveItem from \"./LiveItem.vue\";\nimport ClassicSelect from \"../../form/ClassicSelect.vue\";\nimport SwiperList from \"../list/SwiperList.vue\";\nimport {useErrorHandler} from \"../../composable/useErrorHandler\";\nimport {useOrgaComputed} from \"../../composable/useOrgaComputed\";\nimport classicApi from \"../../../api/classicApi\";\nimport { useAuthStore } from \"../../../stores/AuthStore\";\nimport { useFilterStore } from \"../../../stores/FilterStore\";\nimport { Conference } from \"@/stores/class/conference/conference\";\nimport { computed, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useSaveFetchStore } from \"../../../stores/SaveFetchStore\";\nimport { useI18n } from \"vue-i18n\";\n\n//Props \nconst props = defineProps({\n  organisationId: { default: undefined, type: String },\n  hideIfEmpty: { default: false, type: Boolean },\n})\n\n//Data \nconst loading = ref(true);\nconst loaded = ref(true);\nconst lives: Ref<Array<Conference>> = ref([]);\nconst isLiveAuthorized = ref(false);\nconst statusClassic= ref([\"RECORDING\", \"PENDING\", \"PLANNED\"]);\nconst statusAdmin = ref([\"DEBRIEFING\", \"ERROR\", \"PUBLISHING\"]);\nconst selectedStatus = ref(\"ALL\");\n\n\n//Composables\nconst { t } = useI18n();\nconst { isPodcastmaker, isEditRights } = useOrgaComputed();\nconst {handle403} = useErrorHandler();\nconst authStore = useAuthStore();\nconst filterStore = useFilterStore();\nconst saveFetchStore = useSaveFetchStore();\n\n\n//Computed\nconst displayLiveList = computed(() => {\n  return (\n    (undefined !== filterStore.filterOrgaId ||\n      undefined !== props.organisationId) &&\n    (!props.hideIfEmpty || (props.hideIfEmpty && 0 !== lives.value.length))\n  );\n});\nconst filterOrgaUsed = computed(() => {\n  return filterStore.filterOrgaId ? filterStore.filterOrgaId : props.organisationId;\n});\nconst editRight = computed(() => {\n  return isEditRights(filterOrgaUsed.value);\n});\nconst liveRight = computed(() => {\n  return (\n    authStore.isRoleLive &&\n    \"true\" === authStore.authOrganisation.attributes?.[\"live.active\"]\n  );\n});\nconst statusArraySelect = computed(() => {\n  const statusArray = [{ title: t(\"All lives\"), value: \"ALL\" }];\n      for (const status of statusFetched.value) {\n        let title = \"\";\n        switch (status) {\n          case \"RECORDING\":\n            title = t(\"In live\");\n            break;\n          case \"PENDING\":\n            title = t(\"live upcoming\");\n            break;\n          case \"PLANNED\":\n            title = t(\"live in few time\");\n            break;\n          case \"DEBRIEFING\":\n            title = t(\"In debriefing\");\n            break;\n          case \"PUBLISHING\":\n            title = t(\"In the process of being published\");\n            break;\n          case \"ERROR\":\n            title = t(\"In error\");\n            break;\n          default:\n            break;\n        }\n        statusArray.push({ title: title, value: status });\n      }\n      return statusArray;\n});\nconst statusFetched = computed(() => {\n  if (editRight.value) {\n    return statusClassic.value.concat(statusAdmin.value);\n  }\n  return statusClassic.value;\n});\n\n\n//Watch\nwatch(filterOrgaUsed, async () => {\n  await checkIfLiveAuthorized();\n  fetchContent();\n}, {immediate: true});\nwatch(selectedStatus, () => fetchContent());\n\n\n//Methods\nasync function checkIfLiveAuthorized(): Promise<void> {\n  if (!filterOrgaUsed.value) {\n    return;\n  }\n  isLiveAuthorized.value = await saveFetchStore.getOrgaLiveEnabled(\n    filterOrgaUsed.value,\n  );\n}\nfunction endLoading(): void {\n  loading.value = false;\n  loaded.value = true;\n}\nfunction updateLive(live: Conference, index: number): void {\n  lives.value.splice(index, 1, live);\n}\nasync function fetchContent(): Promise<void> {\n  lives.value.length = 0;\n  if (!filterOrgaUsed.value || !isLiveAuthorized.value) {\n    endLoading();\n    return;\n  }\n  loading.value = true;\n  loaded.value = false;\n  try {\n    const dataLives = await classicApi.fetchData<Array<Conference>>({\n      api: 9,\n      path: \"conference/list\",\n      parameters: {\n        organisationId: filterOrgaUsed.value,\n        withPodcastId: true,\n        status:\n          \"ALL\" === selectedStatus.value\n            ? statusFetched.value\n            : selectedStatus.value,\n      },\n    });\n    lives.value = dataLives.filter((p: Conference | null) => {\n      return null !== p;\n    });\n  } catch (error) {\n    handle403(error as AxiosError);\n  }\n  endLoading();\n}\nfunction deleteLive(index: number): void {\n  lives.value.splice(index, 1);\n}\n</script>\n"],"mappings":"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"}