{"version":3,"file":"uofx-app-components-file-helper.mjs","sources":["../../../projects/uofx-app-pack/file-helper/src/file-download-helper.ts","../../../projects/uofx-app-pack/file-helper/src/file-upload.interface.ts","../../../projects/uofx-app-pack/file-helper/src/file-helper.module.ts","../../../projects/uofx-app-pack/file-helper/uofx-app-components-file-helper.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { UofxBrowserPlugin } from '@uofx/app-native';\r\nimport { UofxInterceptorLogic } from '@uofx/core/interceptor';\r\nimport { UofxSplitFileName } from './file-upload.interface';\r\nimport { saveAs } from 'file-saver';\r\n\r\n@Injectable()\r\nexport class UofxFileDownloadHelper {\r\n  /** 圖片副檔名 */\r\n  private _imgExtensions: Array<string> = ['jpg', 'jpeg', 'png', 'gif'];\r\n  private _videoExtensions: Array<string> = ['mp4', 'wmv', 'ogg', 'webm', 'mov'];\r\n\r\n  constructor(\r\n    private uofxBrowser: UofxBrowserPlugin,\r\n    private logic: UofxInterceptorLogic,\r\n    private http: HttpClient\r\n  ) {}\r\n\r\n  /**\r\n   * 取得圖片副檔名\r\n   * @returns {Array<string>}\r\n   * @memberof UofxFileDownloadHelper\r\n   */\r\n  imgExtensions() {\r\n    return this._imgExtensions;\r\n  }\r\n\r\n  /**\r\n   * [需先驗證身分]使用capacitor開啟in app browser，並可以下載檔案\r\n   * @param {boolean} isPdfUrl 是否為pdf檔案\r\n   * @param {string} downloadUrl 下載url(file:綁token的下載url、img:原始檔案url)\r\n   * @param {string} url 原始檔案url(24小時內有效)\r\n   * @return {*}\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  async downloadRawFileInAppBrowser(isPdfUrl: boolean, downloadUrl: string, url: string) {\r\n    if (isPdfUrl) {\r\n      return this.downloadFileInAppBrowser(url);\r\n    } else {\r\n      this.http\r\n        .post<Blob>('~/api/app/base/file/download/rawfile', { url: downloadUrl }, {\r\n          responseType: 'blob',\r\n        } as any)\r\n        .subscribe({\r\n          next: async () => {\r\n            // app 如果拿pdf的blob無法下載(其它檔案可以)，改成通過驗證後直接拿file/download這組url下載。\r\n            return this.downloadFileInAppBrowser(url);\r\n          },\r\n        });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 使用capacitor開啟in app browser，並可以下載檔案\r\n   * @param {string} url 下載url\r\n   * @return {*}\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  private async downloadFileInAppBrowser(url: string) {\r\n    const formaturl = this.formatUrl(url);\r\n    // 因為 ios16 使用舊版URL解析標準，所以統一 encode\r\n    const encodeUrl = encodeURI(formaturl);\r\n    return await this.uofxBrowser.openInAppByCapacitor(encodeUrl);\r\n  }\r\n\r\n  /**\r\n   * 格式化下載的網址列\r\n   * @param url 要被轉換的網址, 使用~/ 開頭\r\n   * @return {*}\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  formatUrl(url: string) {\r\n    if (!url?.startsWith('~/')) return url;\r\n    if (url.includes('~/api/file/')) {\r\n      url = url.replace('~/api/file/', '~/api/app/base/file/');\r\n    }\r\n    return this.logic.transApiUrl(url);\r\n  }\r\n\r\n  /**\r\n   * 網頁版下載檔案\r\n   * @param {string} downloadUrl 下載url(file:綁token的下載url、img:原始檔案url)\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  webModeDownloadFile(downloadUrl: string, fileName: string) {\r\n    this.http.get<Blob>(this.formatUrl(downloadUrl), { responseType: 'blob' } as any).subscribe({\r\n      next: (blob) => {\r\n        if (blob) {\r\n          saveAs(blob, fileName);\r\n        }\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 依照圖片或檔案取得相對應的下載url\r\n   * @param {string} fileName 檔案名稱\r\n   * @param {string} url 檔案url\r\n   * @param {string} rawUrl 綁token的下載url\r\n   * @return {*} {downloadUrl: string, isFileUrl: boolean}\r\n   * @memberof UofxFileDownloadHelper\r\n   */\r\n  getDownloadUrl(fileName: string, url: string, rawUrl: string) {\r\n    const fileExtensions = fileName.toLocaleLowerCase().split('.').pop();\r\n    const isFileUrl = this.imgExtensions().indexOf(fileExtensions) === -1;\r\n    const downloadUrl = isFileUrl ? rawUrl : this.formatUrl(url);\r\n\r\n    return {\r\n      downloadUrl,\r\n      isFileUrl,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 透過 a link 下載檔案\r\n   * @param {string} url 檔案url\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  downloadByALink(url: string) {\r\n    const linkEle = document.createElement('a');\r\n    linkEle.id = 'downloadPdf';\r\n    linkEle.setAttribute('href', this.formatUrl(url));\r\n    linkEle.setAttribute('target', '_blank');\r\n\r\n    document.querySelector('body').appendChild(linkEle);\r\n    const ele = document.getElementById('downloadPdf');\r\n    ele.click();\r\n    ele.remove();\r\n  }\r\n\r\n  /**\r\n   * 根據檔案副檔名，取得對應的 icon name\r\n   * @param {string} fileName 檔案名稱\r\n   * @param {string} isCAD 是否為CAD檔\r\n   * @return {*} icon name\r\n   * @memberof UofxCoreFileDownloadHelp\r\n   */\r\n  getFileIconName(fileName: string, isCAD = false) {\r\n    // CAD檔: 不管副檔名一律給相同icon\r\n    if (isCAD) {\r\n      return 'u-cad';\r\n    }\r\n\r\n    const extension = fileName.toLocaleLowerCase().split('.').pop();\r\n    // 圖片\r\n    if (this.imgExtensions().includes(extension)) {\r\n      return 'u-img';\r\n    }\r\n    // 影片\r\n    if (this._videoExtensions.includes(extension)) {\r\n      return 'u-video';\r\n    }\r\n\r\n    switch (extension) {\r\n      case 'doc':\r\n      case 'docx':\r\n        return 'u-doc';\r\n      case 'xls':\r\n      case 'xlsx':\r\n        return 'u-xlsx';\r\n      case 'ppt':\r\n      case 'pptx':\r\n        return 'u-ppt';\r\n      case 'pdf':\r\n        return 'u-pdf';\r\n      case 'rar':\r\n        return 'u-rar';\r\n      case 'zip':\r\n      case '7z':\r\n        return 'u-zip';\r\n      case 'txt':\r\n        return 'u-txt';\r\n      default:\r\n        return 'u-unknown-file';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 取得分割後的檔案名稱與副檔名\r\n   * @param {string} fileName 檔案名稱\r\n   * @return {*} { name: string, extension: string }\r\n   * @memberof UofxFileDownloadHelper\r\n   * @remarks 之後如果有檔案名稱特例，可以在這邊處理\r\n   */\r\n  splitFileName(fileName: string): UofxSplitFileName {\r\n    // if 參數不是字串\r\n    if (typeof fileName !== 'string') return;\r\n    const lastDotIndex = fileName.lastIndexOf('.');\r\n\r\n    // if 沒有副檔名 (或檔名以\".\"開頭ex: \".gitignore\")\r\n    if (lastDotIndex <= 0) {\r\n      return { name: fileName, extension: '' };\r\n    }\r\n\r\n    // else 有完整檔名(副檔名轉小寫)\r\n    return {\r\n      name: fileName.slice(0, lastDotIndex),\r\n      extension: fileName.slice(lastDotIndex + 1).toLocaleLowerCase(),\r\n    };\r\n  }\r\n\r\n  /** 開新視窗預覽圖片 */\r\n  previewImage(downloadUrl: string) {\r\n    const linkEle = document.createElement('a');\r\n    linkEle.setAttribute('href', downloadUrl);\r\n    linkEle.setAttribute('target', '_blank');\r\n    linkEle.click();\r\n    linkEle.remove();\r\n  }\r\n}\r\n","/** 檔案資訊 */\r\nexport interface UofxFileModel {\r\n  /** 檔案id */\r\n  id: string;\r\n  /** [圖片下載拿這個]下載url */\r\n  url: string;\r\n  /** [檔案下載拿這個]綁token的下載url */\r\n  rawUrl?: string;\r\n  /** 檔名 */\r\n  fileName: string;\r\n  /** 檔案大小 */\r\n  length: number;\r\n  /** 上傳的使用者資訊(補故事後調整) */\r\n  uploader?: any;\r\n  /** 錯誤訊息 */\r\n  errorMessage?: string;\r\n  /** contentType */\r\n  contentType?: string;\r\n  /** 開啟viewer預覽的url */\r\n  pdfUrl?: string;\r\n  /** 縮圖 */\r\n  screenShotUrl?: string;\r\n  /** 轉檔失敗的traceId */\r\n  traceId?: string;\r\n  /** 檔案轉檔狀態 */\r\n  viewStatus?: UofxFileViewStatus;\r\n  /** 開cad viewer需要的base64 */\r\n  cadUrl?: string;\r\n  /** cad檔案轉檔狀態 */\r\n  cadViewStatus?: UofxCADViewStatus;\r\n  /** cad檔案轉檔失敗後的traceId */\r\n  cadTraceId?: string;\r\n  /** 透過cad按鈕上傳的檔案 */\r\n  isFromCad?: boolean;\r\n}\r\n\r\n/** 檔案轉檔狀態 */\r\nexport enum UofxFileViewStatus {\r\n  /** 轉檔中 */\r\n  Converting = 0,\r\n  /** 轉檔成功 */\r\n  ConvertSuccess = 1,\r\n  /** 檔案轉檔失敗 */\r\n  ConvertFail = 2,\r\n  /** 超過頁數限制而無法進行轉檔 */\r\n  OverPageLimit = 3,\r\n  /** 不支援線上預覽的格式 */\r\n  NotSupport = 4,\r\n}\r\n\r\n/** cad檔案轉檔狀態 */\r\nexport enum UofxCADViewStatus {\r\n  /** 轉檔中 */\r\n  Converting = 0,\r\n  /** 轉檔成功 */\r\n  ConvertSuccess = 1,\r\n  /** 檔案轉檔失敗 */\r\n  ConvertFail = 2,\r\n  /** 不支援線上預覽的格式 */\r\n  NotSupport = 3,\r\n}\r\n\r\n/** 分割後的檔案名稱與副檔名 */\r\nexport interface UofxSplitFileName {\r\n  /** 檔案名稱 */\r\n  name: string;\r\n  /** 副檔名 */\r\n  extension: string;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { UofxFileDownloadHelper } from './file-download-helper';\r\n\r\n@NgModule({\r\n  declarations: [],\r\n  imports: [CommonModule],\r\n  exports: [],\r\n  providers: [UofxFileDownloadHelper],\r\n})\r\nexport class UofxFileHelperModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}