{"version":3,"file":"XFile.min.mjs","sources":["../../../../../src/shapes/canvasx/XFile/XFile.ts"],"sourcesContent":["import { TOriginX, TOriginY } from 'fabric';\nimport { classRegistry } from '../../../ClassRegistry';\nimport { Shadow } from '../../../Shadow';\nimport { getFabricWindow } from '../../../env';\nimport { loadImage } from '../../../util/misc/objectEnlive';\n\nimport { ImageProps } from '../../Image';\nimport { FabricObject } from '../../Object/FabricObject';\nimport { Rect } from '../../Rect';\n\nimport {\n  WidgetFileInterface,\n  WidgetFileClass,\n  FileObjectType,\n  FileEnum\n} from '../type/widget.entity.file';\nimport { WidgetType, WidgetFileType } from '../type/widget.type';\nimport { EntityKeys, } from \"../type/widget.entity.file\";\nimport { FileObject } from \"../type/file\";\n\n\n\nexport type XFileProps = ImageProps & WidgetFileClass;\nconst FILE_ICON_PATHS: Record<WidgetFileType, string> = {\n  XFileWord: '/boardxstatic/fileIcons/word.png',\n  XFileExcel: '/boardxstatic/fileIcons/excel.png',\n  XFilePPT: '/boardxstatic/fileIcons/ppt.png',\n  XFilePDF: '/boardxstatic/fileIcons/pdf.svg',\n  XFileZip: '/boardxstatic/fileIcons/zip.png',\n  XFileVideo: '/boardxstatic/fileIcons/mp4.png',\n  XFileAudio: '/boardxstatic/fileIcons/audio.png',\n  XFile: '/boardxstatic/fileIcons/file.png',\n};\n\nexport const FILE_TYPE_NAMES: Record<FileObjectType, string> = {\n  DOC: 'Word Document',\n  DOCX: 'Word Document',\n  XLS: 'Excel Document',\n  XLSX: 'Excel Document',\n  PPT: 'PPT Document',\n  PPTX: 'PPT Document',\n  PDF: 'PDF Document',\n  ZIP: 'ZIP File',\n  MP4: 'Video Document',\n  WEBM: 'Video Document',\n  MP3: 'Audio Document',\n  M4A: 'Audio Document',\n  WAV: 'Audio Document',\n  AAC: 'Audio Document',\n  FLAC: 'Audio Document',\n  OGG: 'Audio Document',\n  AIFF: 'Audio Document',\n  WMA: 'Audio Document',\n  APE: 'Audio Document',\n  UNKNOWN: 'Other Document',\n};\n\nexport function getWidgetFileType(fileName: string): WidgetFileType {\n  const extension = fileName.split('.').pop()?.toUpperCase() as FileObjectType;\n  switch (extension) {\n    case 'DOC':\n    case 'DOCX':\n      return 'XFileWord';\n    case 'XLS':\n    case 'XLSX':\n      return 'XFileExcel';\n    case 'PPT':\n    case 'PPTX':\n      return 'XFilePPT';\n    case 'PDF':\n      return 'XFilePDF';\n    case 'ZIP':\n      return 'XFileZip';\n    case 'MP4':\n    case 'WEBM':\n      return 'XFileVideo';\n    case 'MP3':\n    case 'M4A':\n    case 'WAV':\n    case 'AAC':\n    case 'FLAC':\n    case 'OGG':\n    case 'AIFF':\n    case 'WMA':\n    case 'APE':\n      return 'XFileAudio';\n    default:\n      return 'XFile';\n  }\n}\n\nconst VIDEO_FILE_EXTENSIONS = new Set([FileEnum.MP4, FileEnum.WEBM]);\n\nexport class XFile extends FabricObject implements WidgetFileInterface {\n  static objType: WidgetFileType = 'XFile';\n  static type: WidgetFileType = 'XFile';\n\n  // WidgetFile properties\n  id: string = '';\n  boardId: string = '';\n  backgroundColor: string = 'rgba(0,0,0,0)';\n  fill: string = 'rgba(0,0,0,0)';\n  width: number = 230;\n  height: number = 248;\n  left: number = 0;\n  locked: boolean = false;\n  objType: WidgetType = 'XFile';\n  originX: TOriginX = 'center';\n  originY: TOriginY = 'center';\n  scaleX: number = 1;\n  scaleY: number = 1;\n  selectable: boolean = true;\n  top: number = 0;\n  userId: string = '';\n  zIndex: number = 0;\n  version: string = '';\n  updatedAt: number = Date.now();\n  lastEditedBy: string = '';\n  createdAt: number = Date.now();\n  createdBy: string = '';\n  visible: boolean = true;\n\n  // WidgetFile specific properties\n  fileName: string = '';\n  fileSrc: FileObject = { tmpPath: '', id: '', path: '' };\n  vectorSrc: FileObject = { tmpPath: '', id: '', path: '' };\n  transcription: string = '';\n\n  previewImage: FileObject = { tmpPath: '', id: '', path: '' };\n\n  private _previewImage: HTMLImageElement | null = null;\n\n\n\n  constructor(options: Partial<XFileProps & { type: string }> = {}) {\n    super(options);\n    this.objType = 'XFile';\n    this.initializeVisuals();\n    Object.assign(this, options);\n    this.fileObjectType = XFile.getFileType(options.fileName || '');\n    this.fill = options.backgroundColor || this.backgroundColor;\n    this.loadPreviewImage(\n      this.getFileIconURL(options.objType as WidgetFileType),\n      options.fileName!\n    );\n    this.on(\"mousedblclick\", this.onDoubleClick.bind(this)); // Attach event listener\n  }\n\n  updatedBy: string;\n  updatedByName: string;\n\n  createdByName: string;\n  fileObjectType: FileObjectType;\n\n\n\n  private initializeVisuals() {\n    this.cornerColor = 'white';\n    this.cornerStrokeColor = 'gray';\n    this.cornerSize = 10;\n    this.cornerStyle = 'circle';\n    this.transparentCorners = false;\n    this.shadow = new Shadow({\n      color: 'rgba(217, 161, 177, 0.54)',\n      offsetX: 1,\n      offsetY: 2,\n      blur: 4,\n      id: 310,\n    });\n\n    this.clipPath = new Rect({\n      left: 0,\n      top: 0,\n      rx: 8,\n      ry: 8,\n      width: this.width,\n      height: this.height,\n      fill: '#000000',\n    });\n  }\n\n  toObject(propertiesToInclude: string[] = []): any {\n    return super.toObject([...EntityKeys, ...propertiesToInclude]);\n  }\n\n  getObject() {\n    const entityKeys: string[] = EntityKeys;\n    const result: Record<string, any> = {};\n\n    entityKeys.forEach((key) => {\n      if (key in this) {\n        result[key] = (this as any)[key];\n      }\n    });\n\n    return result;\n  }\n\n  onDoubleClick(): void {\n    getFabricWindow().open(this.fileSrc?.tmpPath, '_blank');\n  }\n\n  drawObject(ctx: CanvasRenderingContext2D): void {\n    this.drawBorder(ctx);\n    this.drawPreviewImage(ctx);\n    this.renderTitle(ctx, this.fileName);\n    this._renderStroke(ctx);\n  }\n\n  private drawBorder(ctx: CanvasRenderingContext2D): void {\n    ctx.beginPath();\n    ctx.fillStyle = 'rgba(255,255,255,0)';\n    ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n    ctx.lineWidth = 0;\n    ctx.strokeStyle = '#ffffff';\n    ctx.moveTo(-this.width / 2, -this.height / 2);\n    ctx.stroke();\n  }\n\n\n  private drawPreviewImage(ctx: CanvasRenderingContext2D): void {\n    if (this._previewImage) {\n      // Calculate the available height for the image to avoid overlapping the title\n      const titleHeight = 90; // Total height reserved for the title and background\n      const availableHeight = this.height - titleHeight;\n\n      // Calculate image dimensions while maintaining aspect ratio\n      const imageAspectRatio = this._previewImage.width / this._previewImage.height;\n      const drawWidth = this.width;\n      const drawHeight = drawWidth / imageAspectRatio;\n\n      // Adjust if the calculated height exceeds the available height\n      const finalDrawHeight = Math.min(drawHeight, availableHeight);\n\n      ctx.drawImage(\n        this._previewImage,\n        -this.width / 2,\n        -this.height / 2,\n        drawWidth,\n        finalDrawHeight\n      );\n    }\n  }\n\n  static getFileTypeName(fileName: string = ''): string {\n    const extension = fileName\n      .split('.')\n      .pop()\n      ?.toUpperCase() as FileObjectType;\n    return FILE_TYPE_NAMES[extension] || 'Other Document';\n  }\n\n  static getFileType(fileName: string = ''): FileObjectType {\n    const extension: FileObjectType = fileName\n      .split('.')\n      .pop()\n      ?.toUpperCase() as FileObjectType;\n\n    return extension;\n  }\n\n  isFileVideo(fileName: string): boolean {\n    const extension = fileName.split('.').pop()?.toUpperCase();\n    return VIDEO_FILE_EXTENSIONS.has(extension as FileEnum);\n  }\n\n  renderTitle(ctx: CanvasRenderingContext2D, title: string): void {\n    const maxWidth = this.width;\n    const x = -this.width / 2;\n    const y = this.height / 2 - 60;\n\n    ctx.font = '16px Inter';\n    ctx.fillStyle = 'rgba(255, 255, 255, 1)';\n    ctx.fillRect(x, y - 29, maxWidth, 90);\n    ctx.fillStyle = '#190FA1';\n\n    const sanitizedTitle = this.sanitizeTitle(title);\n    this.wrapText(ctx, sanitizedTitle, x + 15, y - 5, maxWidth - 20, 23);\n\n    // const newUrl = this.getShortenedUrl();\n    // ctx.font = '12px Inter';\n    // ctx.fillStyle = 'rgba(35, 41, 48, 0.65)';\n    // this.wrapText(ctx, newUrl, x + 15, y + 45, maxWidth - 20, 25);\n  }\n\n  private sanitizeTitle(title: string): string {\n    const unicodeTitle = this.toUnicode(title);\n    if (!title || unicodeTitle.includes('\\\\ufffd')) {\n      const parts = this.fileSrc.tmpPath.split('.');\n      return parts.length > 2 ? parts[1] : 'Untitled';\n    }\n    return title;\n  }\n\n  private toUnicode(str: string): string {\n    return escape(str).toLowerCase().replace(/%u/gi, '\\\\u');\n  }\n\n  private getShortenedUrl(): string {\n    if (!this.fileSrc.tmpPath) return '';\n    const parts = this.fileSrc.tmpPath.split('/');\n    return parts.length >= 3\n      ? `${parts[0]}/${parts[1]}/${parts[2]}`\n      : this.fileSrc.tmpPath;\n  }\n\n  private wrapText(\n    ctx: CanvasRenderingContext2D,\n    text: string,\n    x: number,\n    y: number,\n    maxWidth: number,\n    lineHeight: number\n  ): void {\n    const words = text.includes(' ') ? text.split(' ') : text.split('');\n    let line = '';\n    let lineCount = 1;\n    let tempLine = '';\n    let currentY = y;\n\n    for (let n = 0; n < words.length; n++) {\n      if (lineCount === 3) return;\n\n      const testLine = line + (words[n] + (words.length > 1 ? ' ' : ''));\n      const metrics = ctx.measureText(testLine);\n      const testWidth = metrics.width;\n\n      if (testWidth > maxWidth && n > 0) {\n        if (lineCount === 2) {\n          line = `${line.slice(0, -3)}...`;\n        }\n        ctx.fillText(line, x, currentY);\n        line = words[n] + ' ';\n        currentY += lineHeight;\n        lineCount++;\n      } else {\n        line = testLine;\n      }\n    }\n\n    if (lineCount < 3) {\n      ctx.fillText(line, x, currentY);\n    }\n  }\n\n  getFileIconURL(objType: WidgetFileType): string {\n    return FILE_ICON_PATHS[objType] || FILE_ICON_PATHS['XFile'];\n  }\n\n  async loadPreviewImage(\n    previewImage: string,\n    fileName: string\n  ): Promise<void> {\n    const url = previewImage || this.getFileIconURL(XFile.objType);\n    try {\n      this._previewImage = await loadImage(url, { crossOrigin: 'anonymous' });\n      this.dirty = true;\n      this.canvas?.requestRenderAll();\n    } catch (error) {\n      console.error('Failed to load preview image:', error);\n    }\n  }\n}\n\nclassRegistry.setClass(XFile);\n"],"names":["FILE_ICON_PATHS","XFileWord","XFileExcel","XFilePPT","XFilePDF","XFileZip","XFileVideo","XFileAudio","XFile","FILE_TYPE_NAMES","DOC","DOCX","XLS","XLSX","PPT","PPTX","PDF","ZIP","MP4","WEBM","MP3","M4A","WAV","AAC","FLAC","OGG","AIFF","WMA","APE","UNKNOWN","VIDEO_FILE_EXTENSIONS","Set","FileEnum","FabricObject","constructor","options","arguments","length","undefined","super","_defineProperty","Date","now","this","tmpPath","id","path","objType","initializeVisuals","Object","assign","fileObjectType","getFileType","fileName","fill","backgroundColor","loadPreviewImage","getFileIconURL","on","onDoubleClick","bind","cornerColor","cornerStrokeColor","cornerSize","cornerStyle","transparentCorners","shadow","Shadow","color","offsetX","offsetY","blur","clipPath","Rect","left","top","rx","ry","width","height","toObject","propertiesToInclude","EntityKeys","getObject","result","forEach","key","_this$fileSrc","getFabricWindow","open","fileSrc","drawObject","ctx","drawBorder","drawPreviewImage","renderTitle","_renderStroke","beginPath","fillStyle","fillRect","lineWidth","strokeStyle","moveTo","stroke","_previewImage","titleHeight","availableHeight","imageAspectRatio","drawWidth","drawHeight","finalDrawHeight","Math","min","drawImage","getFileTypeName","_fileName$split$pop2","extension","split","pop","toUpperCase","_fileName$split$pop3","isFileVideo","_fileName$split$pop4","has","title","maxWidth","x","y","font","sanitizedTitle","sanitizeTitle","wrapText","unicodeTitle","toUnicode","includes","parts","str","escape","toLowerCase","replace","getShortenedUrl","concat","text","lineHeight","words","line","lineCount","currentY","n","testLine","measureText","slice","fillText","previewImage","url","_this$canvas","loadImage","crossOrigin","dirty","canvas","requestRenderAll","error","console","classRegistry","setClass"],"mappings":"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"}