feat: Support photo size change

This commit is contained in:
zhangzhanwei 2025-12-09 17:13:10 +08:00 committed by zhanweizhang7
parent 666c379be9
commit 720cfc7f1e

View File

@ -134,6 +134,7 @@ import UserForm from '@/components/ai-chat/component/user-form/index.vue'
import Control from '@/components/ai-chat/component/control/index.vue'
import { t } from '@/locales'
import bus from '@/bus'
import { throttle } from 'lodash-es'
provide('upload', (file: any, loading?: Ref<boolean>) => {
return props.type === 'debug-ai-chat'
? applicationApi.postUploadFile(file, 'TEMPORARY_120_MINUTE', 'TEMPORARY_120_MINUTE', loading)
@ -658,6 +659,29 @@ onBeforeMount(() => {
return Promise.resolve(null)
}
})
function parseTransform(transformStr: string) {
const result = { scale: 1, translateX: 0, translateY: 0, translateZ: 0 }
if (!transformStr || transformStr === 'none') return result
// 使 scale translate3d
const scaleMatch = transformStr.match(/scale\(([^)]+)\)/)
const translateMatch = transformStr.match(/translate3d\(([^)]+)\)/)
if (scaleMatch) {
// scalescaleX, scaleY
const scaleValues = scaleMatch[1].split(',').map((v) => parseFloat(v.trim()))
result.scale = scaleValues[0]
}
if (translateMatch) {
const translateValues = translateMatch[1].split(',').map((v) => parseFloat(v.trim()))
;[result.translateX, result.translateY, result.translateZ] = translateValues
}
return result
}
onMounted(() => {
if (isUserInput.value && localStorage.getItem(`${accessToken}userForm`)) {
const userFormData = JSON.parse(localStorage.getItem(`${accessToken}userForm`) || '{}')
@ -667,6 +691,47 @@ onMounted(() => {
window.speechSynthesis.cancel()
}
const handleZoom = throttle((event: WheelEvent, target: HTMLElement) => {
// 2.
const currentTransform = target.style.transform
const transformValues = parseTransform(currentTransform)
let { scale, translateX, translateY } = transformValues
// scale
const currentScale = Array.isArray(scale) ? scale[0] : scale
// 3.
const zoomIntensity = 0.05 //
const zoomFactor = event.deltaY < 0 ? 1 + zoomIntensity : 1 - zoomIntensity
const newScale = Math.max(0.1, currentScale * zoomFactor) //
// 4.
const newTranslateX = (translateX * currentScale) / newScale
const newTranslateY = (translateY * currentScale) / newScale
// 5.
target.style.transform = `scale(${newScale}) translate3d(${newTranslateX}px, ${newTranslateY}px, 0px)`
}, 50) // 50ms
document.body.addEventListener(
'wheel',
(event) => {
// 1.
if (event.target) {
const target = event.target as HTMLElement
//
if (target.className && target.className.includes('medium-zoom-overlay')) {
event.preventDefault()
event.stopPropagation()
}
if (target.className && target.className.includes('medium-zoom-image--opened')) {
event.preventDefault()
event.stopPropagation()
handleZoom(event, target)
}
}
},
{ passive: false },
)
window.sendMessage = sendMessage
bus.on('on:transcribing', (status: boolean) => {
transcribing.value = status