{"version":3,"file":"useCaptchaImg.mjs","sources":["../../../../../../../packages/components/captcha/src/hooks/useCaptchaImg.ts"],"sourcesContent":["import { computed, nextTick, reactive, ref, shallowRef, toRaw } from 'vue'\nimport { isClient } from '@lit-element/utils'\nimport { nextFrameOnce } from './performance'\nimport { randomHardColor } from './color'\nimport { heartPath, puzzlePath, shieldPath, squarePath } from './hollow-paths'\n\nexport default function useCaptchaImg({\n  failFn,\n  successFn,\n  slider,\n  isSuccess,\n  props = {},\n  currentTarget,\n}: any) {\n  const pointers = reactive<number[][]>([])\n  const testLoading = ref(false)\n  const canvas = ref<HTMLCanvasElement>()\n  const subCanvas = ref<HTMLCanvasElement>()\n  const imageLoading = ref(false)\n  const imagePromise = shallowRef(Promise.resolve())\n\n  const pointerTargets: number[][] = []\n  const fontRate = 0.108\n  let imageLoaded = false\n  let imgEle: HTMLImageElement | undefined\n  let memoryCanvas: HTMLCanvasElement | undefined\n\n  const track = computed(() => slider.value?.track)\n  const isLoading = computed(() => {\n    return props.loading || imageLoading.value || testLoading.value\n  })\n\n  const subCanvasStyle = computed(() => {\n    return {\n      left: `${slider.value?.currentLeft || 0}%`,\n      transition: slider.value?.resetting ? 'left 250ms ease' : undefined,\n    }\n  })\n\n  const actionLocked = computed(\n    () => props.disabled || isSuccess.value || isLoading.value\n  )\n\n  // 避免多次触发时发生竞态问题\n  let loadFlag: string\n\n  async function loadImage() {\n    if (imgEle) return\n\n    imageLoading.value = true\n    loadFlag = `${Date.now()}${Math.round(Math.random() * 10e6)}`\n\n    const flag = loadFlag\n    const src =\n      typeof props.image === 'function' ? await props.image() : props.image\n\n    await new Promise<void>((resolve) => {\n      if (!isClient || flag !== loadFlag || !src) {\n        resolve()\n        return\n      }\n\n      imgEle = new Image()\n      imageLoaded = false\n      // imgEle.alt = '加载失败'\n      imgEle.src = src\n\n      if (src.trim().startsWith('data:image')) {\n        imageLoaded = true\n        resolve()\n      } else {\n        imgEle.onload = () => {\n          imageLoaded = true\n          resolve()\n        }\n        imgEle.onabort = () => {\n          imageLoaded = true\n          resolve()\n        }\n        imgEle.onerror = () => {\n          imageLoaded = true\n          resolve()\n        }\n      }\n    }).finally(() => {\n      imageLoading.value = false\n    })\n  }\n\n  async function updateImgPromise(clear = false) {\n    if (clear) {\n      imgEle = undefined\n    }\n    await (imagePromise.value = loadImage())\n  }\n\n  function drawImageWithTexts() {\n    const canvasEl = canvas.value\n    const ctx = canvasEl?.getContext?.('2d')\n\n    if (!imgEle || !canvasEl || !ctx) return\n\n    const { width, height } = canvasEl\n\n    ctx.drawImage(imgEle, 0, 0, width, height)\n\n    if (!props.texts.length || props.remotePoint) return\n\n    pointerTargets.length = 0\n\n    const fontSize = Math.max(width, height) * fontRate\n\n    ctx.textBaseline = 'middle'\n    ctx.textAlign = 'center'\n    ctx.font = `bold ${fontSize}px sans-serif`\n    ctx.lineWidth = 2\n    ctx.strokeStyle = '#fff'\n\n    const drawText = (\n      text: string,\n      x: number,\n      y: number,\n      radian = 0,\n      color = randomHardColor()\n    ) => {\n      ctx.save()\n      ctx.translate(x, y)\n      radian && ctx.rotate(radian * Math.PI)\n      ctx.fillStyle = color\n      ctx.fillText(text, 0, 0)\n      ctx.strokeText(text, 0, 0)\n      ctx.restore()\n    }\n\n    const metrics = ctx.measureText(String(props.texts[0]))\n    const xLimit = Math.max(fontSize, metrics.width) * 1.2\n    const yLimit =\n      Math.max(\n        fontSize,\n        metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent\n      ) * 1.2\n\n    let prevX = -2 * fontSize\n    let prevY = -2 * fontSize\n\n    for (const text of props.texts) {\n      let x = prevX\n      let y = prevY\n\n      while (Math.abs(x - prevX) < xLimit && Math.abs(y - prevY) < yLimit) {\n        x = width * 0.1 + Math.random() * width * 0.8\n        y = height * 0.1 + Math.random() * height * 0.8\n      }\n\n      prevX = x\n      prevY = y\n\n      pointerTargets.push([(x / width) * 100, (y / height) * 100])\n      drawText(String(text), x, y, Math.random() * 2)\n    }\n  }\n\n  function getHollowProcess() {\n    if (typeof props.hollowShape === 'function') return props.hollowShape\n\n    switch (props.hollowShape) {\n      case 'puzzle':\n        return puzzlePath\n      case 'shield':\n        return shieldPath\n      case 'heart':\n        return heartPath\n      default:\n        return squarePath\n    }\n  }\n\n  function drawImage() {\n    const canvasEl = canvas.value\n    const ctx = canvasEl?.getContext?.('2d')\n    const subCanvasEl = subCanvas.value\n    const subCtx = subCanvasEl?.getContext?.('2d')\n\n    if (!imgEle || !imageLoaded || !canvasEl || !ctx || !props.image) return\n\n    if (props.type === 'point') {\n      drawImageWithTexts()\n      return\n    }\n\n    if (!subCanvasEl || !subCtx || !track.value) return\n\n    if (!memoryCanvas) {\n      if (!isClient) return\n      memoryCanvas = document.createElement('canvas')\n    }\n    memoryCanvas.width = canvasEl.width\n    memoryCanvas.height = canvasEl.height\n\n    const pathCtx = memoryCanvas.getContext('2d')\n\n    if (!pathCtx) return\n\n    ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)\n    subCtx.clearRect(0, 0, subCanvasEl.width, subCanvasEl.height)\n    pathCtx.clearRect(0, 0, memoryCanvas.width, memoryCanvas.height)\n\n    const canvasRect = canvasEl.getBoundingClientRect()\n\n    const trackRect = track.value?.getBoundingClientRect()\n    // 滑动时以轨道为准，所以需要补正 canvas 宽度和 track 宽度的差值\n    const widthFix =\n      ((canvasRect.width - trackRect.width) / canvasRect.width) * canvasEl.width\n\n    const cu = currentTarget?.value\n    const targetX =\n      widthFix / 2 + Number(cu?.[0] || 0) * (canvasEl.width - widthFix) * 0.01\n    const targetY = Number(cu?.[1] || 0) * canvasEl.height * 0.01\n\n    const hollowProcess = getHollowProcess()\n\n    pathCtx.beginPath()\n    pathCtx.strokeStyle = 'rgba(255, 255, 255, 0.5)'\n    pathCtx.lineWidth = 4\n\n    const [clipX, clipY, clipWidth, clipHeight] = hollowProcess({\n      ctx: pathCtx,\n      x: targetX,\n      y: targetY,\n      width: props.canvasSize?.[0],\n      height: props.canvasSize?.[1],\n    })\n\n    pathCtx.stroke()\n    pathCtx.clip()\n    pathCtx.drawImage(imgEle, 0, 0, canvasEl.width, canvasEl.height)\n\n    // 中心点偏移修正\n    const xLeftWidth = targetX - clipX\n    const translateFix = ((clipWidth * 0.5 - xLeftWidth) / clipWidth) * 100\n\n    subCanvasEl.style.transform = `translate3d(${translateFix - 50}%, 0, 0)`\n    subCanvasEl.width = clipWidth\n\n    subCtx.drawImage(\n      memoryCanvas,\n      clipX,\n      clipY,\n      clipWidth,\n      clipHeight,\n      0,\n      clipY,\n      clipWidth,\n      clipHeight\n    )\n\n    ctx.save()\n    ctx.beginPath()\n    ctx.fillStyle = 'rgba(255, 255, 255, 0.75)'\n    ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)'\n    ctx.lineWidth = 10\n\n    hollowProcess({\n      ctx,\n      x: targetX,\n      y: targetY,\n      width: props.canvasSize[0],\n      height: props.canvasSize[1],\n    })\n\n    ctx.stroke()\n    ctx.fill()\n    ctx.restore()\n    ctx.globalCompositeOperation = 'destination-over'\n    ctx.drawImage(imgEle, 0, 0, canvasEl.width, canvasEl.height)\n  }\n\n  function drawImageNextFrame() {\n    nextFrameOnce(drawImage)\n  }\n\n  function stopPropagation(event: Event) {\n    event.stopPropagation()\n  }\n\n  async function verifyPointers() {\n    if (isLoading.value) return\n\n    pointers.length = props.texts.length\n\n    let result = props.remotePoint\n    let customResult: unknown\n\n    if (!props.remotePoint && canvas.value) {\n      const { width, height } = canvas.value\n      const fontSize = Math.max(width, height) * fontRate\n      const xTolerance = (fontSize / width) * 50 + props.tolerance\n      const yTolerance = (fontSize / height) * 50 + props.tolerance\n\n      result = true\n\n      for (let i = 0, len = pointers.length; i < len; ++i) {\n        const [x, y] = pointers[i]\n        const [targetX, targetY] = pointerTargets[i]\n\n        if (\n          Math.abs(x - targetX) > xTolerance ||\n          Math.abs(y - targetY) > yTolerance\n        ) {\n          result = false\n          break\n        }\n      }\n    }\n\n    if (typeof props.onBeforeTest === 'function') {\n      nextTick(() => {\n        testLoading.value = true\n      })\n      customResult = await (props.onBeforeTest as any)(toRaw(pointers))\n      nextTick(() => {\n        testLoading.value = false\n      })\n    }\n\n    if (!result || customResult === false) {\n      pointers.length = 0\n      failFn?.()\n    } else {\n      successFn?.(toRaw(pointers))\n    }\n  }\n\n  function handleImageClick(event: MouseEvent) {\n    if (props.type !== 'point' || actionLocked.value || !canvas.value) return\n\n    const { clientWidth: canvasWidth, clientHeight: canvasHeight } =\n      canvas.value\n    const { offsetX, offsetY } = event\n\n    pointers.push([\n      (offsetX / canvasWidth) * 100,\n      (offsetY / canvasHeight) * 100,\n    ])\n\n    if (pointers.length >= props.texts.length) {\n      nextTick(verifyPointers)\n    }\n  }\n\n  function cancelPointer(index: number, event: Event) {\n    event.stopPropagation()\n\n    if (actionLocked.value || index !== pointers.length - 1) return\n\n    pointers.pop()\n  }\n\n  async function imgReset(newImage?: string | (() => Promise<string>)) {\n    if (newImage) {\n      await updateImgPromise(true)\n      drawImage()\n    }\n    pointers.length = 0\n    props.type === 'point' && drawImageWithTexts()\n  }\n\n  return {\n    canvas,\n    subCanvas,\n    actionLocked,\n    handleImageClick,\n    subCanvasStyle,\n    pointers,\n    cancelPointer,\n    stopPropagation,\n    isLoading,\n    getImgEle: () => imgEle,\n    // imagePromise,\n    updateImgPromise,\n    drawImageNextFrame,\n    drawImage,\n    imgReset,\n  }\n}\n"],"names":[],"mappings":"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"}