{"version":3,"file":"CommentList-sC5dIU6M.mjs","names":[],"sources":["../src/components/display/comments/CommentList.vue","../src/components/display/comments/CommentList.vue"],"sourcesContent":["<template>\n  <div class=\"d-flex flex-column\">\n    <div\n      v-if=\"isNotAnAnswerList && 0 !== totalCount\"\n      class=\"d-flex align-items-center mb-2\"\n    >\n      <div class=\"text-secondary me-3\">\n        {{ t(\"Number comments\", { nb: totalCount }) }}\n      </div>\n      <button\n        id=\"sort-by-comments\"\n        class=\"btn btn-transparent d-flex align-items-center\"\n      >\n        <SortVariantIcon :size=\"30\" />\n        <p class=\"ms-1\">{{ t(\"Sort by\") }}</p>\n      </button>\n      <ClassicPopover target=\"sort-by-comments\" :only-click=\"true\">\n        <button\n          v-for=\"sortOption in sortChoice\"\n          :key=\"sortOption.value\"\n          class=\"me-3 octopus-dropdown-item\"\n          :disabled=\"sortOption.value === sortType\"\n          @mousedown=\"changeSort(sortOption.value)\"\n          @keydown.enter=\"changeSort(sortOption.value)\"\n        >\n          {{ sortOption.title }}\n        </button>\n      </ClassicPopover>\n    </div>\n    <div v-if=\"!loading && !error && 0 === totalCount\" class=\"text-center\">\n      {{ t(\"No comments\") }}\n    </div>\n    <div\n      ref=\"scrollComponent\"\n      :class=\"isNotAnAnswerList ? 'scrolling-comments' : ''\"\n    >\n      <CommentItem\n        v-for=\"(c, indexCom) in comments\"\n        :id=\"'comItem' + c.commentId\"\n        :key=\"c.commentId\"\n        v-model:comment=\"comments[indexCom]\"\n        :podcast=\"podcast\"\n        :is-flat-list=\"isFlatList\"\n        :config=\"config\"\n        :organisation-id=\"organisationId\"\n        @delete-comment=\"deleteComment(c.commentId)\"\n      />\n      <ClassicLoading\n        :loading-text=\"loading && !error ? t('Loading content ...') : undefined\"\n        :error-text=\"error ? t(`Comments loading error`) : undefined\"\n      />\n      <button\n        v-if=\"!isNotAnAnswerList && dfirst + dsize < totalCount\"\n        class=\"btn share-btn mx-2\"\n        :title=\"t('See more')\"\n      >\n        <PlusIcon />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport SortVariantIcon from \"vue-material-design-icons/SortVariant.vue\";\nimport PlusIcon from \"vue-material-design-icons/Plus.vue\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport classicApi from \"../../../api/classicApi\";\nimport { computed, defineAsyncComponent, onMounted, onUnmounted, Ref, ref, useTemplateRef, watch } from \"vue\";\nimport { CommentPodcast } from \"@/stores/class/general/comment\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport {\n  CommentMessage,\n  CommentsConfig,\n} from \"@/stores/class/config/commentsConfig\";\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\nimport { useI18n } from \"vue-i18n\";\n/* eslint-disable */\nconst CommentItem: any = defineAsyncComponent(() => import('./item/CommentItem.vue'));\n/* eslint-enable */\nconst ClassicPopover = defineAsyncComponent(\n  () => import(\"../../misc/ClassicPopover.vue\"),\n);\n\n//Props \nconst props = defineProps({\n  size: { default: 10, type: Number },\n  podcast: { default: undefined, type: Object as () => Podcast },\n  reload: { default: false, type: Boolean },\n  answerToComment: { default: undefined, type: Number },\n  isFlatList: { default: false, type: Boolean },\n  stateFilter: { default: \"\", type: String },\n  organisationId: { default: undefined, type: String },\n  nbComments: { default: 0, type: Number },\n  config: { default: undefined, type: Object as () => CommentsConfig },\n  eventToHandle: { default: undefined, type: Object as () => CommentMessage },\n})\n\n//Emits\nconst emit = defineEmits([\"update:nbComments\", \"commentDeleted\"]);\n\n//Data \nconst loading = ref(false);\nconst error = ref(false);\nconst dfirst = ref(0);\nconst dsize = ref(props.size);\nconst totalCount = ref(0);\nconst sortType = ref(\"DATE_DESC\");\nconst comments: Ref<Array<CommentPodcast>> = ref([]);\nconst scrollableSection: Ref<HTMLElement | undefined> = ref(undefined);\nconst scrollComponentRef = useTemplateRef('scrollComponent');\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst isNotAnAnswerList = computed(() =>  undefined === props.answerToComment);\nconst changed = computed(() => `${props.size}|${props.reload}|${dsize.value}|${props.stateFilter}|${props.podcast?.podcastId}|${props.organisationId}`);\nconst sortChoice = computed(() =>{\n  return [\n    { title: t(\"The most recent\"), value: \"DATE_DESC\" },\n    { title: t(\"Top comments\"), value: \"LIKE_DESC\" },\n  ];\n});\n\n//Watch\nwatch(totalCount, () => {emit(\"update:nbComments\", totalCount.value)});\nwatch(changed, () => {fetchContent(true);});\nwatch(()=>props.eventToHandle, async () => {\n  if (!props.eventToHandle) {\n    return;\n  }\n  if (props.answerToComment === props.eventToHandle.comment.answerTo) {\n    switch (props.eventToHandle.type) {\n      case \"CREATE\":\n        createComment(props.eventToHandle.comment);\n        break;\n      case \"UPDATE\":\n        updateComment(props.eventToHandle.comment);\n        break;\n      case \"DELETE\":\n        deleteComment(props.eventToHandle.comment.commentId);\n        break;\n      default:\n        break;\n    }\n    return;\n  }\n  if (undefined !== props.eventToHandle.comment.answerTo) {\n    const comItem = scrollComponentRef?.value?.querySelector('#comItem' + props.eventToHandle.comment.answerTo) as InstanceType<typeof CommentItem>;\n    comItem?.receiveEvent(props.eventToHandle);\n  }\n}, {deep: true});\n\n\nonMounted(()=>{\n  fetchContent(true);\n  if (isNotAnAnswerList.value) {\n    scrollableSection.value = scrollComponentRef?.value as HTMLElement;\n    scrollableSection.value.addEventListener(\"scroll\", handleScroll);\n  }\n})\n\nonUnmounted(()=>{\n  if (isNotAnAnswerList.value) {\n    scrollableSection.value?.removeEventListener(\"scroll\", handleScroll);\n  }\n})\n\n\n//Methods\nfunction changeSort(sortTypeUpdate: string) {\n  sortType.value = sortTypeUpdate;\n  fetchContent(true);\n}\nfunction handleScroll() {\n  if (\n    scrollableSection.value &&\n    totalCount.value > comments.value.length &&\n    scrollableSection.value.scrollTop +\n      scrollableSection.value.clientHeight >=\n      scrollableSection.value.scrollHeight\n  ) {\n    fetchContent(false);\n  }\n}\nfunction findCommentInCommentsLoaded(commentId: number) {\n  return comments.value.findIndex(\n    (element: CommentPodcast) => element.commentId === commentId,\n  );\n}\nfunction createComment(comment: CommentPodcast) {\n  comments.value.unshift(comment);\n  totalCount.value += 1;\n}\nfunction updateComment(comment: CommentPodcast) {\n  const commentIndex = findCommentInCommentsLoaded(comment.commentId);\n  if (-1 !== commentIndex) {\n    comments.value.splice(commentIndex, 1, comment);\n  }\n}\nfunction deleteComment(commentIdToDelete: number) {\n  const commentIndex = findCommentInCommentsLoaded(commentIdToDelete);\n  if (-1 !== commentIndex) {\n    comments.value.splice(commentIndex, 1);\n    totalCount.value -= 1;\n    emit(\"commentDeleted\", commentIdToDelete);\n  }\n}\nasync function fetchContent(reset: boolean): Promise<void> {\n  if (loading.value) {\n    return;\n  }\n  loading.value = true;\n  if (reset) {\n    dfirst.value = 0;\n    comments.value.length = 0;\n  }\n  const param = {\n    first: dfirst.value,\n    size: dsize.value,\n    podcastId: props.podcast?.podcastId,\n    sort: sortType.value,\n    answerTo: props.answerToComment,\n    hideAnswers: !props.isFlatList,\n    state: props.stateFilter.length ? props.stateFilter : undefined,\n    organisationId: props.organisationId,\n  };\n  try {\n    const data = await classicApi.fetchData<\n      ListClassicReturn<CommentPodcast>\n    >({\n      api: 2,\n      path: \"comment/list\",\n      parameters: param,\n    });\n    if (reset) {\n      comments.value.length = 0;\n    }\n    comments.value.push(...data.result);\n    totalCount.value = data.count;\n    dfirst.value += dsize.value;\n    loading.value = false;\n  } catch (errorWs) {\n    // Errors sometimes occur, and shouldn't trigger anything too drastic,\n    // so we only log it, instead of using handle403\n    console.error(errorWs);\n    error.value = true;\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-app {\n  .scrolling-comments {\n    max-height: 715px;\n    overflow-y: auto;\n  }\n}\n</style>\n","<template>\n  <div class=\"d-flex flex-column\">\n    <div\n      v-if=\"isNotAnAnswerList && 0 !== totalCount\"\n      class=\"d-flex align-items-center mb-2\"\n    >\n      <div class=\"text-secondary me-3\">\n        {{ t(\"Number comments\", { nb: totalCount }) }}\n      </div>\n      <button\n        id=\"sort-by-comments\"\n        class=\"btn btn-transparent d-flex align-items-center\"\n      >\n        <SortVariantIcon :size=\"30\" />\n        <p class=\"ms-1\">{{ t(\"Sort by\") }}</p>\n      </button>\n      <ClassicPopover target=\"sort-by-comments\" :only-click=\"true\">\n        <button\n          v-for=\"sortOption in sortChoice\"\n          :key=\"sortOption.value\"\n          class=\"me-3 octopus-dropdown-item\"\n          :disabled=\"sortOption.value === sortType\"\n          @mousedown=\"changeSort(sortOption.value)\"\n          @keydown.enter=\"changeSort(sortOption.value)\"\n        >\n          {{ sortOption.title }}\n        </button>\n      </ClassicPopover>\n    </div>\n    <div v-if=\"!loading && !error && 0 === totalCount\" class=\"text-center\">\n      {{ t(\"No comments\") }}\n    </div>\n    <div\n      ref=\"scrollComponent\"\n      :class=\"isNotAnAnswerList ? 'scrolling-comments' : ''\"\n    >\n      <CommentItem\n        v-for=\"(c, indexCom) in comments\"\n        :id=\"'comItem' + c.commentId\"\n        :key=\"c.commentId\"\n        v-model:comment=\"comments[indexCom]\"\n        :podcast=\"podcast\"\n        :is-flat-list=\"isFlatList\"\n        :config=\"config\"\n        :organisation-id=\"organisationId\"\n        @delete-comment=\"deleteComment(c.commentId)\"\n      />\n      <ClassicLoading\n        :loading-text=\"loading && !error ? t('Loading content ...') : undefined\"\n        :error-text=\"error ? t(`Comments loading error`) : undefined\"\n      />\n      <button\n        v-if=\"!isNotAnAnswerList && dfirst + dsize < totalCount\"\n        class=\"btn share-btn mx-2\"\n        :title=\"t('See more')\"\n      >\n        <PlusIcon />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport SortVariantIcon from \"vue-material-design-icons/SortVariant.vue\";\nimport PlusIcon from \"vue-material-design-icons/Plus.vue\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport classicApi from \"../../../api/classicApi\";\nimport { computed, defineAsyncComponent, onMounted, onUnmounted, Ref, ref, useTemplateRef, watch } from \"vue\";\nimport { CommentPodcast } from \"@/stores/class/general/comment\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport {\n  CommentMessage,\n  CommentsConfig,\n} from \"@/stores/class/config/commentsConfig\";\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\nimport { useI18n } from \"vue-i18n\";\n/* eslint-disable */\nconst CommentItem: any = defineAsyncComponent(() => import('./item/CommentItem.vue'));\n/* eslint-enable */\nconst ClassicPopover = defineAsyncComponent(\n  () => import(\"../../misc/ClassicPopover.vue\"),\n);\n\n//Props \nconst props = defineProps({\n  size: { default: 10, type: Number },\n  podcast: { default: undefined, type: Object as () => Podcast },\n  reload: { default: false, type: Boolean },\n  answerToComment: { default: undefined, type: Number },\n  isFlatList: { default: false, type: Boolean },\n  stateFilter: { default: \"\", type: String },\n  organisationId: { default: undefined, type: String },\n  nbComments: { default: 0, type: Number },\n  config: { default: undefined, type: Object as () => CommentsConfig },\n  eventToHandle: { default: undefined, type: Object as () => CommentMessage },\n})\n\n//Emits\nconst emit = defineEmits([\"update:nbComments\", \"commentDeleted\"]);\n\n//Data \nconst loading = ref(false);\nconst error = ref(false);\nconst dfirst = ref(0);\nconst dsize = ref(props.size);\nconst totalCount = ref(0);\nconst sortType = ref(\"DATE_DESC\");\nconst comments: Ref<Array<CommentPodcast>> = ref([]);\nconst scrollableSection: Ref<HTMLElement | undefined> = ref(undefined);\nconst scrollComponentRef = useTemplateRef('scrollComponent');\n\n//Composables\nconst { t } = useI18n();\n\n//Computed\nconst isNotAnAnswerList = computed(() =>  undefined === props.answerToComment);\nconst changed = computed(() => `${props.size}|${props.reload}|${dsize.value}|${props.stateFilter}|${props.podcast?.podcastId}|${props.organisationId}`);\nconst sortChoice = computed(() =>{\n  return [\n    { title: t(\"The most recent\"), value: \"DATE_DESC\" },\n    { title: t(\"Top comments\"), value: \"LIKE_DESC\" },\n  ];\n});\n\n//Watch\nwatch(totalCount, () => {emit(\"update:nbComments\", totalCount.value)});\nwatch(changed, () => {fetchContent(true);});\nwatch(()=>props.eventToHandle, async () => {\n  if (!props.eventToHandle) {\n    return;\n  }\n  if (props.answerToComment === props.eventToHandle.comment.answerTo) {\n    switch (props.eventToHandle.type) {\n      case \"CREATE\":\n        createComment(props.eventToHandle.comment);\n        break;\n      case \"UPDATE\":\n        updateComment(props.eventToHandle.comment);\n        break;\n      case \"DELETE\":\n        deleteComment(props.eventToHandle.comment.commentId);\n        break;\n      default:\n        break;\n    }\n    return;\n  }\n  if (undefined !== props.eventToHandle.comment.answerTo) {\n    const comItem = scrollComponentRef?.value?.querySelector('#comItem' + props.eventToHandle.comment.answerTo) as InstanceType<typeof CommentItem>;\n    comItem?.receiveEvent(props.eventToHandle);\n  }\n}, {deep: true});\n\n\nonMounted(()=>{\n  fetchContent(true);\n  if (isNotAnAnswerList.value) {\n    scrollableSection.value = scrollComponentRef?.value as HTMLElement;\n    scrollableSection.value.addEventListener(\"scroll\", handleScroll);\n  }\n})\n\nonUnmounted(()=>{\n  if (isNotAnAnswerList.value) {\n    scrollableSection.value?.removeEventListener(\"scroll\", handleScroll);\n  }\n})\n\n\n//Methods\nfunction changeSort(sortTypeUpdate: string) {\n  sortType.value = sortTypeUpdate;\n  fetchContent(true);\n}\nfunction handleScroll() {\n  if (\n    scrollableSection.value &&\n    totalCount.value > comments.value.length &&\n    scrollableSection.value.scrollTop +\n      scrollableSection.value.clientHeight >=\n      scrollableSection.value.scrollHeight\n  ) {\n    fetchContent(false);\n  }\n}\nfunction findCommentInCommentsLoaded(commentId: number) {\n  return comments.value.findIndex(\n    (element: CommentPodcast) => element.commentId === commentId,\n  );\n}\nfunction createComment(comment: CommentPodcast) {\n  comments.value.unshift(comment);\n  totalCount.value += 1;\n}\nfunction updateComment(comment: CommentPodcast) {\n  const commentIndex = findCommentInCommentsLoaded(comment.commentId);\n  if (-1 !== commentIndex) {\n    comments.value.splice(commentIndex, 1, comment);\n  }\n}\nfunction deleteComment(commentIdToDelete: number) {\n  const commentIndex = findCommentInCommentsLoaded(commentIdToDelete);\n  if (-1 !== commentIndex) {\n    comments.value.splice(commentIndex, 1);\n    totalCount.value -= 1;\n    emit(\"commentDeleted\", commentIdToDelete);\n  }\n}\nasync function fetchContent(reset: boolean): Promise<void> {\n  if (loading.value) {\n    return;\n  }\n  loading.value = true;\n  if (reset) {\n    dfirst.value = 0;\n    comments.value.length = 0;\n  }\n  const param = {\n    first: dfirst.value,\n    size: dsize.value,\n    podcastId: props.podcast?.podcastId,\n    sort: sortType.value,\n    answerTo: props.answerToComment,\n    hideAnswers: !props.isFlatList,\n    state: props.stateFilter.length ? props.stateFilter : undefined,\n    organisationId: props.organisationId,\n  };\n  try {\n    const data = await classicApi.fetchData<\n      ListClassicReturn<CommentPodcast>\n    >({\n      api: 2,\n      path: \"comment/list\",\n      parameters: param,\n    });\n    if (reset) {\n      comments.value.length = 0;\n    }\n    comments.value.push(...data.result);\n    totalCount.value = data.count;\n    dfirst.value += dsize.value;\n    loading.value = false;\n  } catch (errorWs) {\n    // Errors sometimes occur, and shouldn't trigger anything too drastic,\n    // so we only log it, instead of using handle403\n    console.error(errorWs);\n    error.value = true;\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-app {\n  .scrolling-comments {\n    max-height: 715px;\n    overflow-y: auto;\n  }\n}\n</style>\n"],"mappings":"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"}