{"version":3,"file":"WeatherPlayBack.mjs","sources":["../../../../../../packages/sdk/plugins/Trackplayer/WeatherPlayBack.ts"],"sourcesContent":["import L from 'leaflet'\n\nexport class WeatherPlayBack {\n  options: {\n    container: any\n    playSpeed: number\n    playCallBack?: (...params: any) => void\n    clearLayer?: (...params: any) => void\n    close?: (...params: any) => void\n    data: any[]\n  }\n  hash: Record<string, any>\n  playSate: boolean\n  currentTimePosition: number\n  playSpeed: number\n  minTime: number\n  maxTime: number\n  playItems: Record<string, any>\n  frequency: number\n  _timer_move: any\n  areaLayer: any\n  area_arr: undefined\n  // 新增属性\n  playerOptionDiv!: HTMLDivElement\n  playBtn!: HTMLInputElement\n  playerTiao!: HTMLDivElement\n  playerYuan!: HTMLDivElement\n  playerJindu!: HTMLDivElement\n  playerCloseDiv!: HTMLDivElement\n  playerCloseImg!: HTMLElement\n  playerTiaoW!: number\n  playerPercentage!: number\n  playerMinValue!: number\n  playerMaxValue!: number\n  isMousedown!: boolean\n  playerDiv!: HTMLElement\n  clientX: any\n\n  constructor(opts: any) {\n    this.options = {\n      container: '',\n      playSpeed: 60,\n      data: [],\n    }\n    this.hash = {}\n    this.playSate = false\n    this.currentTimePosition = 0\n    this.playSpeed = 60\n    this.minTime = 0\n    this.maxTime = 0\n    this.playItems = {}\n    this.frequency = 1\n    this._timer_move = undefined\n    this.areaLayer = undefined\n    this.area_arr = undefined\n    if (opts) {\n      L.Util.extend(this.options, opts)\n    }\n    this.setTimeRange()\n    this.playSate = false\n    this._createPlayerHtml()\n    this.initPlayItem()\n    return this\n  }\n\n  setTimeRange() {\n    let minTime = 0\n    let maxTime = 0\n    this.options.data.forEach((item, i) => {\n      this.hash[item.playtime] = item\n      if (i == 0) minTime = item.playtime\n      if (i == this.options.data.length - 1) maxTime = item.playtime\n    })\n    this.minTime = minTime\n    this.maxTime = maxTime\n    this.currentTimePosition = this.minTime\n  }\n  initPlayItem() {\n    this._resetMinMaxTime()\n    this.setPlayerDisplay()\n    this.playStart(0, false, true)\n    this.options.clearLayer && this.options.clearLayer()\n  }\n  removeAll() {\n    this.currentTimePosition = 0\n    this.playStop()\n    this.areaLayer && this.areaLayer.remove()\n    L.DomUtil.remove(this.playerDiv)\n  }\n\n  /**\n   *\n   *\n   * @param {number} explicitTime 播放到的具体时间点\n   * @param {boolean} isImmediate 控制是否立即播放\n   * @param {boolean} skipCheck 是否跳过初始化设置\n   * @memberof WeatherPlayBack\n   */\n  playStart(explicitTime = 0, isImmediate = false, skipCheck = false) {\n    // 如果跳过检查参数为真，则直接返回。\n    if (skipCheck) {\n      return\n    }\n\n    // 定义当前时间位置的变量\n    let currentTime = this.currentTimePosition\n\n    // 如果提供了明确的时间（explicitTime），则使用该时间，并确保其在最小和最大时间范围内。\n    if (explicitTime != null) {\n      currentTime = Math.max(this.minTime, explicitTime)\n      currentTime = Math.min(currentTime, this.maxTime)\n    } else {\n      // 如果没有提供明确的时间，则调整当前时间位置，确保其在有效范围内。\n      currentTime = Math.max(currentTime, this.minTime)\n      currentTime = Math.min(currentTime, this.maxTime)\n    }\n\n    // 更新currentTimePosition状态\n    this.currentTimePosition = currentTime\n\n    // 如果当前时间位置超出最大时间，则循环回到最小时间。\n    if (this.currentTimePosition >= this.maxTime) {\n      this.currentTimePosition = this.minTime\n    }\n\n    // 如果当前时间位置低于最小时间，则循环回到最大时间。\n    if (this.currentTimePosition <= this.minTime) {\n      this.currentTimePosition = this.minTime\n    }\n\n    // 如果立即播放参数（isImmediate）未定义，则默认为false。\n    isImmediate = isImmediate == null ? false : isImmediate\n\n    // 如果播放状态为停止（0），则根据当前时间位置开始播放。\n    if (!this.playSate) {\n      this.playSate = true // 设置播放状态为播放中\n      this._setPlayBtnClass() // 更新播放按钮的类\n      this._playByPosition(isImmediate) // 根据当前位置开始播放\n    }\n  }\n  playStop() {\n    this.playSate = !1\n    this._setPlayBtnClass()\n  }\n  playStartOrStop() {\n    // 检查播放状态\n    if (this.playSate) {\n      // 如果当前正在播放，调用 playStop 方法停止播放\n      return this.playStop()\n    } else {\n      // 如果当前没有播放，首先初始化播放项\n      this.initPlayItem()\n\n      // 设置一个定时器，在一定延迟后开始播放\n      // 使用 this.frequency 乘以 1000 来获取延迟的时间（单位：毫秒）\n      setTimeout(() => {\n        this.playStart()\n      }, 1000 * this.frequency)\n    }\n  }\n  _playByPosition(isImmediate = false) {\n    // 如果播放状态为活动状态\n    if (this.playSate) {\n      // 如果当前时间位置小于最大时间，则执行以下操作\n\n      if (this.currentTimePosition < this.maxTime) {\n        // 如果需要立即更新时间位置，并且当前时间位置不为0，则更新\n        if (!isImmediate) {\n          this.currentTimePosition = this.getcurrentTime()\n        }\n\n        // 如果当前时间位置大于等于最大时间，则重置为最大时间\n\n        this.currentTimePosition = Math.min(\n          this.currentTimePosition,\n          this.maxTime\n        )\n        // 设置播放器的位置\n        this._setPlayerPosition()\n\n        // 如果存在回调函数，则调用它\n        if (this.options.playCallBack) {\n          this.options.playCallBack(this.currentTimePosition)\n        }\n\n        // 如果播放状态仍然为活动状态，并且isImmediate参数为0，则设置定时器继续播放\n        if (this.playSate && !isImmediate) {\n          setTimeout(() => {\n            this._playByPosition()\n          }, 1000 * this.frequency)\n        } else {\n          // 否则，停止播放，更新播放按钮状态\n          this.playSate = false\n          this._setPlayBtnClass()\n        }\n      } else {\n        // 如果播放完成，记录日志，停止播放，更新播放按钮状态，并设置当前时间位置为最大时间\n        console.log('播放完成!')\n        // 更新播放状态和播放按钮类\n        this.playSate = false\n        this._setPlayBtnClass()\n        // 设置当前播放时间为最大时间并更新播放器位置\n        this.currentTimePosition = this.maxTime\n        this._setPlayerPosition()\n\n        // 如果存在回调函数，则调用它\n        if (this.options.playCallBack) {\n          this.options.playCallBack(this.currentTimePosition)\n        }\n      }\n    }\n  }\n  getcurrentTime() {\n    let lastIndex = 0\n    const playbackData = this.options.data\n    for (const [i, playbackDatum] of playbackData.entries()) {\n      const currentPlayTime = playbackDatum.playtime\n      if (currentPlayTime > this.currentTimePosition) {\n        lastIndex = i\n        break\n      }\n    }\n\n    return playbackData[lastIndex].playtime || playbackData[0].playtime\n  }\n  _resetMinMaxTime() {\n    0 == this.minTime || 0 == this.maxTime\n      ? (this.currentTimePosition = this.minTime)\n      : this.currentTimePosition < this.minTime &&\n        (this.currentTimePosition = this.minTime)\n  }\n  _createPlayerHtml() {\n    // 创建播放器容器并添加到选项中指定的容器\n    this.playerDiv = L.DomUtil.create(\n      'div',\n      'castboxplayer areaplayer',\n      this.options.container\n    )\n    L.DomEvent.disableClickPropagation(this.playerDiv) // 阻止点击事件冒泡\n\n    // 创建播放器操作区\n    this.playerOptionDiv = L.DomUtil.create(\n      'div',\n      'areaplayer-option',\n      this.playerDiv\n    )\n\n    // 创建播放按钮并设置其样式\n    this.playBtn = L.DomUtil.create(\n      'input',\n      'areaplayer-play start float-left',\n      this.playerOptionDiv\n    )\n    this.playBtn.type = 'button' // 明确按钮类型为按钮\n\n    // 创建播放器轨道和手柄\n    this.playerTiao = L.DomUtil.create('div', 'areaplayer-tiao', this.playerDiv)\n    this.playerYuan = L.DomUtil.create(\n      'div',\n      'areaplayer-yuan',\n      this.playerTiao\n    ) // 轨道手柄\n    this.playerJindu = L.DomUtil.create(\n      'div',\n      'areaplayer-jindu',\n      this.playerTiao\n    ) // 轨道进度条\n\n    // 创建播放器关闭按钮\n    this.playerCloseDiv = L.DomUtil.create(\n      'div',\n      'areaplayer-close',\n      this.playerDiv\n    )\n    this.playerCloseImg = L.DomUtil.create('Img', '', this.playerCloseDiv)\n    this.playerCloseImg.setAttribute(\n      'src',\n      'https://cdn.xplusship.com/img/images/white_close_btn.png'\n    ) // 设置关闭按钮图片\n\n    // 计算轨道的宽度\n    this.playerTiaoW = this.playerTiao.offsetWidth - this.playerYuan.offsetWidth\n\n    // 初始化播放器状态变量\n    this.playerPercentage = 0\n    this.playerMinValue = 0\n    this.playerMaxValue = 100\n\n    // 构建播放器的交互逻辑\n    this._buildPlayer()\n  }\n  _setPlayBtnClass(isPlaying?: boolean) {\n    // 移除现有的开始和停止类\n    L.DomUtil.removeClass(this.playBtn, 'start')\n    L.DomUtil.removeClass(this.playBtn, 'stop')\n\n    // 如果isPlaying参数不是null，则更新播放状态\n    if (isPlaying) {\n      this.playSate = isPlaying\n    }\n\n    // 根据播放状态添加相应的类\n    if (this.playSate) {\n      // 如果播放状态为真，则添加停止类的样式\n      L.DomUtil.addClass(this.playBtn, 'stop')\n    } else {\n      // 否则，添加开始类的样式\n      L.DomUtil.addClass(this.playBtn, 'start')\n    }\n  }\n  _buildPlayer() {\n    const body = document.body // 更清晰的变量名\n\n    // 初始化 mousedown 状态为 false\n    this.isMousedown = false\n\n    // 为播放按钮添加点击事件处理器\n    this.playBtn.onclick = () => {\n      this.playStartOrStop()\n    }\n\n    // 为 playerYuan 添加 mousedown 事件处理器\n    this.playerYuan.onmousedown = () => {\n      this.isMousedown = true\n      // 为 document.body 添加 mousemove 事件处理器\n      body.onmousemove = (event) => {\n        this._setYuanPosition(event)\n      }\n    }\n\n    // 为 document.body 添加 mouseup 事件处理器\n    body.onmouseup = () => {\n      this.isMousedown = false\n      // 清除 mousemove 事件处理器\n      body.onmousemove = null\n    }\n\n    // 为 playerTiao 添加 click 事件处理器\n    this.playerTiao.onclick = (event) => {\n      this.isMousedown = true\n      this._setYuanPosition(event)\n      this.isMousedown = false\n    }\n\n    // 为 playerCloseDiv 添加 click 事件处理器\n    this.playerCloseDiv.onclick = () => {\n      // 隐藏播放器容器\n      this.options.container.style.display = 'none'\n      // 如果提供了关闭回调函数，则执行它\n      if (this.options.close) {\n        this.options.close()\n      }\n    }\n  }\n  _setYuanPosition(event: MouseEvent) {\n    // 如果鼠标按钮未被按下（即没有进行拖动操作），则不执行任何操作\n    if (!this.isMousedown) {\n      return\n    }\n\n    // 停止当前的播放\n    this.playStop()\n\n    // 清除任何存在的定时器\n    if (this._timer_move) {\n      clearTimeout(this._timer_move)\n    }\n\n    // 计算手柄的当前位置和宽度\n    // const handleCurrentLeft = this.playerYuan.offsetLeft\n    const handleWidth = this.playerYuan.offsetWidth\n\n    // 计算轨道的总宽度以及手柄中心点的偏移量\n    const trackWidth = this.playerTiaoW + Math.round(handleWidth / 2)\n\n    // 计算鼠标相对于播放器控件的位置\n    const mouseOffset =\n      event.clientX -\n      this.playerDiv.offsetLeft -\n      this.playerTiao.offsetLeft -\n      Math.round(handleWidth / 2)\n\n    // 计算手柄新的水平位置偏移量，并限制在轨道宽度内\n    const newHandleLeft = Math.min(trackWidth, Math.max(0, mouseOffset))\n\n    // 更新手柄的样式位置\n    this.playerYuan.style.marginLeft = `${newHandleLeft}px`\n\n    // 更新进度条的宽度\n    this.playerJindu.style.width = `${newHandleLeft}px`\n\n    // 计算新的播放时间百分比\n    this.playerPercentage =\n      Math.round((newHandleLeft / trackWidth) * 10000) / 10000\n\n    // 计算新的播放时间点\n    const newTime =\n      this.minTime +\n      Math.round(this.playerPercentage * (this.maxTime - this.minTime))\n\n    // 将时间转换为分钟，并保留整数分钟\n    const timeInMinutes = 60 * Math.round(newTime / 60)\n\n    // 设置一个新的定时器，以更新播放位置\n    this._timer_move = setTimeout(() => {\n      this.playStart(timeInMinutes, true)\n    }, 500)\n  }\n  _setPlayerPosition() {\n    // 计算当前时间位置相对于最小时间的偏移量，并确保其不小于0\n    const timeOffset = Math.max(0, this.currentTimePosition - this.minTime)\n\n    // 设置播放器的最小和最大值\n    this.playerMinValue = 0\n    this.playerMaxValue = Math.max(0, this.maxTime - this.minTime)\n\n    // 如果当前时间位置等于最大时间，则暂停播放，并更新播放按钮的状态\n    if (this.currentTimePosition === this.maxTime) {\n      this._setPlayBtnClass(false)\n    }\n\n    // 计算当前时间位置的百分比，并四舍五入到小数点后四位\n    this.playerPercentage =\n      Math.round((timeOffset / this.playerMaxValue) * 1e4) / 1e4\n\n    // 获取播放器手柄的宽度\n    const handleWidth = this.playerYuan.offsetWidth\n    // 计算轨道的可用宽度\n    this.playerTiaoW = this.playerTiao.offsetWidth - handleWidth\n\n    // 计算手柄的新位置，并确保百分比在0到1之间\n    const trackWidth = this.playerTiaoW + Math.round(handleWidth / 2)\n    this.playerPercentage = Math.max(0, Math.min(this.playerPercentage, 1))\n\n    // 计算手柄偏移量，并更新手柄和进度条的样式\n    const handleOffset = this.playerPercentage * trackWidth\n    this.playerYuan.style.marginLeft = `${handleOffset}px`\n    this.playerJindu.style.width = `${handleOffset}px`\n  }\n  // 如果 shouldDisplay 未定义，则根据时间范围是否有效来决定\n  setPlayerDisplay(shouldDisplay = this.maxTime - this.minTime > 0) {\n    // 移除隐藏和显示的类，以便根据条件重新设置\n    L.DomUtil.removeClass(this.playerDiv, 'areaplayer-display-none')\n    L.DomUtil.removeClass(this.playerDiv, 'areaplayer-display-block')\n\n    if (shouldDisplay) {\n      // 如果应该显示播放器控件\n      L.DomUtil.addClass(this.playerDiv, 'areaplayer-display-block') // 添加显示类的样式\n      this.playerTiaoW =\n        this.playerTiao.offsetWidth - this.playerYuan.offsetWidth // 计算轨道宽度\n      this.playStart(0, true) // 开始播放\n    } else {\n      // 如果不应该显示播放器控件\n      L.DomUtil.addClass(this.playerDiv, 'areaplayer-display-none') // 添加隐藏类的样式\n    }\n  }\n}\n\n// 使用 WeatherPlayBack 类\n// const weatherPlayBack = new WeatherPlayBack({\n//   container: '#containerId',\n//   playSpeed: 60,\n//   playCallBack: (time) => console.log('Playing at time:', time),\n//   data: []\n// })\n"],"names":["WeatherPlayBack","constructor","t","this","options","container","playSpeed","data","hash","playSate","currentTimePosition","minTime","maxTime","playItems","frequency","_timer_move","areaLayer","area_arr","e","Util","extend","setTimeRange","_createPlayerHtml","initPlayItem","i","forEach","s","a","playtime","length","_resetMinMaxTime","setPlayerDisplay","playStart","clearLayer","removeAll","playStop","remove","DomUtil","playerDiv","Math","max","min","_setPlayBtnClass","_playByPosition","playStartOrStop","setTimeout","getcurrentTime","_setPlayerPosition","playCallBack","entries","create","DomEvent","disableClickPropagation","playerOptionDiv","playBtn","type","playerTiao","playerYuan","playerJindu","playerCloseDiv","playerCloseImg","setAttribute","playerTiaoW","offsetWidth","playerPercentage","playerMinValue","playerMaxValue","_buildPlayer","removeClass","addClass","document","body","isMousedown","onclick","onmousedown","onmousemove","_setYuanPosition","onmouseup","style","display","close","clearTimeout","round","clientX","offsetLeft","l","marginLeft","width","n","r"],"mappings":"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"}