{"version":3,"file":"index.vue2.mjs","sources":["../../../../../../packages/preview/supports/epub-preview/index.vue"],"sourcesContent":["<script lang='ts' setup>\nimport {ref, watch} from 'vue'\nimport ePub from 'epubjs'\nimport type {PreviewProps} from '../../preview.interface'\nimport {getFileRenderByFile, getFileRenderByUrl} from '../../utils/utils'\n\nconst props = withDefaults(\n  defineProps<PreviewProps & {\n    width?: string\n    height?: string\n  }>(),\n  {\n    url: () => null,\n    file: () => null,\n    width: () => '100%',\n    height: () => '100%',\n  },\n)\n\nconst emit = defineEmits<{\n  rendered: []\n  error: [error: Error]\n}>()\n\nconst navigation = ref()\nconst locations = ref()\nconst currentPage = ref(1)\nconst totalPages = ref()\nconst bookAvailable = ref(false)\nconst book = ref()\nconst rendition = ref()\n\nfunction renderEpub(content: ArrayBuffer | string): void {\n  book.value = ePub(content as ArrayBuffer)\n  rendition.value = book.value.renderTo('epub-viewer', {\n    width: '100%',\n    height: 'calc(100vh - 80px)',\n    flow: 'scrolled',\n    allowScriptedContent: true,\n  })\n  book.value.ready.then(() => {\n    navigation.value = book.value.navigation\n    locations.value = book.value.locations\n    bookAvailable.value = true\n    totalPages.value = locations.value.length()\n    rendition.value.display()\n    emit('rendered')\n  }).catch((e: Error) => {\n    emit('error', e)\n  })\n}\n\nwatch(\n  () => props.file,\n  (file) => {\n    if (file) {\n      getFileRenderByFile(file).then((render) => {\n        renderEpub(render)\n      }).catch((e: Error) => {\n        emit('error', e)\n      })\n    }\n  },\n  {immediate: true},\n)\n\nwatch(\n  () => props.url,\n  (url) => {\n    if (url && !props.file) {\n      getFileRenderByUrl(url).then((render) => {\n        renderEpub(render)\n      }).catch((e: Error) => {\n        emit('error', e)\n      })\n    }\n  },\n  {immediate: true},\n)\n\n// epub\nfunction prevPage(): void {\n  if (rendition.value) {\n    rendition.value.prev()\n    // Update when page forward currentPage\n    currentPage.value--\n    if (currentPage.value < 1) {\n      currentPage.value = 1\n    }\n  }\n}\n\nfunction nextPage(): void {\n  if (rendition.value) {\n    rendition.value.next()\n    // Update when turning back page currentPage\n    currentPage.value++\n    if (currentPage.value > totalPages.value) {\n      currentPage.value = totalPages.value\n    }\n  }\n}\n\nfunction prevKeyDown(e): void {\n  e.preventDefault()\n}\n\nfunction downKeyDown(e): void {\n  e.preventDefault()\n}\n\nonKeyStroke('ArrowLeft', () => {\n  prevPage()\n})\n\nonKeyStroke('ArrowRight', () => {\n  nextPage()\n})\n</script>\n\n<template>\n  <div class=\"epub-preview epub-box\" :style=\"{ width, height }\">\n    <button class=\"btn\" style=\"display: none\" @keydown=\"prevKeyDown\">\n      Prev\n    </button>\n    <div id=\"epub-viewer\" class=\"epub-viewer\"/>\n    <button class=\"btn\" style=\"display: none\" @keydown=\"downKeyDown\">\n      Next\n    </button>\n  </div>\n</template>\n\n<style scoped lang=\"scss\">\n.epub-box {\n  height: 100vh;\n  width: 100%;\n}\n\n.epub-viewer {\n  padding: 10px;\n  min-height: calc(100vh - 80px);\n  max-height: calc(100vh - 80px);\n  overflow: auto;\n}\n\n.footer {\n  height: 24px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 10px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","navigation","ref","locations","currentPage","totalPages","bookAvailable","book","rendition","renderEpub","content","ePub","e","watch","file","getFileRenderByFile","render","url","getFileRenderByUrl","prevPage","nextPage","prevKeyDown","downKeyDown","onKeyStroke","_createElementBlock","_normalizeStyle","_createElementVNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMA,UAAMA,IAAQC,GAaRC,IAAOC,GAKPC,IAAaC,EAAA,GACbC,IAAYD,EAAA,GACZE,IAAcF,EAAI,CAAC,GACnBG,IAAaH,EAAA,GACbI,IAAgBJ,EAAI,EAAK,GACzBK,IAAOL,EAAA,GACPM,IAAYN,EAAA;AAElB,aAASO,EAAWC,GAAqC;AACvD,MAAAH,EAAK,QAAQI,EAAKD,CAAsB,GACxCF,EAAU,QAAQD,EAAK,MAAM,SAAS,eAAe;AAAA,QACnD,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,sBAAsB;AAAA,MAAA,CACvB,GACDA,EAAK,MAAM,MAAM,KAAK,MAAM;AAC1B,QAAAN,EAAW,QAAQM,EAAK,MAAM,YAC9BJ,EAAU,QAAQI,EAAK,MAAM,WAC7BD,EAAc,QAAQ,IACtBD,EAAW,QAAQF,EAAU,MAAM,OAAA,GACnCK,EAAU,MAAM,QAAA,GAChBT,EAAK,UAAU;AAAA,MACjB,CAAC,EAAE,MAAM,CAACa,MAAa;AACrB,QAAAb,EAAK,SAASa,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,IAAAC;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,CAACiB,MAAS;AACR,QAAIA,KACFC,EAAoBD,CAAI,EAAE,KAAK,CAACE,MAAW;AACzC,UAAAP,EAAWO,CAAM;AAAA,QACnB,CAAC,EAAE,MAAM,CAACJ,MAAa;AACrB,UAAAb,EAAK,SAASa,CAAC;AAAA,QACjB,CAAC;AAAA,MAEL;AAAA,MACA,EAAC,WAAW,GAAA;AAAA,IAAI,GAGlBC;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,CAACoB,MAAQ;AACP,QAAIA,KAAO,CAACpB,EAAM,QAChBqB,EAAmBD,CAAG,EAAE,KAAK,CAACD,MAAW;AACvC,UAAAP,EAAWO,CAAM;AAAA,QACnB,CAAC,EAAE,MAAM,CAACJ,MAAa;AACrB,UAAAb,EAAK,SAASa,CAAC;AAAA,QACjB,CAAC;AAAA,MAEL;AAAA,MACA,EAAC,WAAW,GAAA;AAAA,IAAI;AAIlB,aAASO,IAAiB;AACxB,MAAIX,EAAU,UACZA,EAAU,MAAM,KAAA,GAEhBJ,EAAY,SACRA,EAAY,QAAQ,MACtBA,EAAY,QAAQ;AAAA,IAG1B;AAEA,aAASgB,IAAiB;AACxB,MAAIZ,EAAU,UACZA,EAAU,MAAM,KAAA,GAEhBJ,EAAY,SACRA,EAAY,QAAQC,EAAW,UACjCD,EAAY,QAAQC,EAAW;AAAA,IAGrC;AAEA,aAASgB,EAAY,GAAS;AAC5B,QAAE,eAAA;AAAA,IACJ;AAEA,aAASC,EAAY,GAAS;AAC5B,QAAE,eAAA;AAAA,IACJ;AAEA,WAAAC,EAAY,aAAa,MAAM;AAC7B,MAAAJ,EAAA;AAAA,IACF,CAAC,GAEDI,EAAY,cAAc,MAAM;AAC9B,MAAAH,EAAA;AAAA,IACF,CAAC,mBAICI,EAQM,OAAA;AAAA,MARD,OAAM;AAAA,MAAyB,OAAKC,EAAA,EAAA,OAAI3B,EAAA,OAAK,QAAEA,EAAA,OAAA,CAAM;AAAA,IAAA;MACxD4B,EAES,UAAA;AAAA,QAFD,OAAM;AAAA,QAAM,OAAA,EAAA,SAAA,OAAA;AAAA,QAAuB,WAASL;AAAA,MAAA,GAAa,UAEjE,EAAA;AAAA,sBACAK,EAA2C,OAAA;AAAA,QAAtC,IAAG;AAAA,QAAc,OAAM;AAAA,MAAA;MAC5BA,EAES,UAAA;AAAA,QAFD,OAAM;AAAA,QAAM,OAAA,EAAA,SAAA,OAAA;AAAA,QAAuB,WAASJ;AAAA,MAAA,GAAa,UAEjE,EAAA;AAAA,IAAA;;;"}