Files
NapCatQQ/.pnpm-store/v3/files/31/bfc181e17daa452a9862c034399cb3602bfd0c7a21a930d84f68b7eb9eaba993a82cb00e970cc055a6e221ce20bbe3fae1d705a898be4f565b947239c94ec8
T
TanTan e311ca3275
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

1 line
95 KiB
Plaintext

{"version":3,"file":"react-photo-view.module.js","sources":["../src/hooks/useMethods.ts","../src/hooks/useSetState.ts","../src/photo-context.ts","../src/variables.ts","../src/utils/isTouchDevice.ts","../src/utils/limitTarget.ts","../src/hooks/useIsomorphicLayoutEffect.ts","../src/hooks/useEventListener.ts","../src/components/SlidePortal.tsx","../src/components/CloseIcon.tsx","../src/components/ArrowLeft.tsx","../src/components/ArrowRight.tsx","../src/components/PreventScroll.tsx","../src/utils/getMultipleTouchPosition.ts","../src/utils/edgeHandle.ts","../src/utils/getPositionOnMoveOrScale.ts","../src/utils/getRotateSize.ts","../src/utils/getSuitableImageSize.ts","../src/hooks/useDebounceCallback.ts","../src/hooks/useScrollPosition.ts","../src/hooks/useAnimationOrigin.tsx","../src/hooks/useMountedRef.ts","../src/components/Spinner.tsx","../src/Photo.tsx","../src/PhotoBox.tsx","../src/hooks/useContinuousTap.ts","../src/hooks/useAnimationPosition.ts","../src/hooks/useTargetScale.ts","../src/PhotoSlider.tsx","../src/hooks/useAnimationVisible.tsx","../src/hooks/useForkedVariable.ts","../src/hooks/useAdjacentImages.ts","../src/PhotoProvider.tsx","../src/PhotoView.tsx","../src/hooks/useInitial.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * Hook of persistent methods\n */\nexport default function useMethods<T extends Record<string, (...args: any[]) => any>>(fn: T) {\n const { current } = useRef({\n fn,\n curr: undefined as T | undefined,\n });\n current.fn = fn;\n\n if (!current.curr) {\n const curr = Object.create(null);\n Object.keys(fn).forEach((key) => {\n curr[key] = (...args: unknown[]) => current.fn[key].call(current.fn, ...args);\n });\n current.curr = curr;\n }\n\n return current.curr as T;\n}\n","import { useReducer } from 'react';\n\nexport default function useSetState<S extends Record<string, any>>(initialState: S) {\n return useReducer(\n (state: S, action: Partial<S> | ((state: S) => Partial<S>)) => ({\n ...state,\n ...(typeof action === 'function' ? action(state) : action),\n }),\n initialState,\n );\n}\n","import { createContext } from 'react';\nimport type { DataType } from './types';\n\nexport type UpdateItemType = (dataType: DataType) => void;\n\nexport interface PhotoContextType {\n show: (key: number) => void;\n update: UpdateItemType;\n remove: (key: number) => void;\n nextId: () => number;\n}\n\nexport default createContext<PhotoContextType>(undefined as unknown as PhotoContextType);\n","/**\n * 最大触摸时间\n */\nexport const maxTouchTime = 200;\n\n/**\n * 默认动画速度\n */\nexport const defaultSpeed = 400;\n\n/**\n * 默认动画函数\n */\nexport const defaultEasing = 'cubic-bezier(0.25, 0.8, 0.25, 1)';\n\n/**\n * 最大滑动切换图片距离\n */\nexport const maxMoveOffset = 40;\n\n/**\n * 图片的间隔\n */\nexport const horizontalOffset = 20;\n\n/**\n * 最小初始响应距离\n */\nexport const minStartTouchOffset = 20;\n\n/**\n * 默认背景透明度\n */\nexport const defaultOpacity = 1;\n\n/**\n * 最小缩放度\n */\nexport const minScale = 1;\n\n/**\n * 最大缩放度(若图片足够大,则会超出)\n */\nexport const maxScale = 6;\n\n/**\n * 最小长图模式比例\n */\nexport const longModeRatio = 3;\n\n/**\n * 缩放弹性缓冲\n */\nexport const scaleBuffer = 0.2;\n\n/**\n * 最大等待动画时间\n */\nexport const maxWaitAnimationTime = 250;\n","/**\n * 是否支持触摸设备\n */\nconst isTouchDevice = typeof window !== 'undefined' && 'ontouchstart' in window;\n\nexport default isTouchDevice;\n","import { maxScale, minScale } from '../variables';\n\nexport const limitNumber = (value: number, min: number, max: number) => {\n return Math.max(Math.min(value, max), min);\n};\n\n/**\n * 限制最大/最小缩放\n */\nexport const limitScale = (scale: number, max: number = 0, buffer: number = 0) => {\n return limitNumber(scale, minScale * (1 - buffer), Math.max(maxScale, max) * (1 + buffer));\n};\n","import { useEffect, useLayoutEffect } from 'react';\n\nconst isSSR = typeof window === 'undefined' || /ServerSideRendering/.test(navigator && navigator.userAgent);\n\nexport default isSSR ? useEffect : useLayoutEffect;\n","import { useEffect, useRef } from 'react';\n\nexport default function useEventListener<K extends keyof WindowEventMap>(\n type: K | undefined,\n fn: (evt: WindowEventMap[K]) => void,\n options?: AddEventListenerOptions,\n) {\n const latest = useRef(fn);\n latest.current = fn;\n\n useEffect(() => {\n function wrapper(evt: WindowEventMap[K]) {\n latest.current(evt);\n }\n if (type) {\n window.addEventListener(type, wrapper, options);\n }\n return () => {\n if (type) {\n window.removeEventListener(type, wrapper);\n }\n };\n }, [type]);\n}\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport './SlidePortal.less';\n\nexport interface ISliderPortalProps extends React.HTMLAttributes<HTMLDivElement> {\n container?: HTMLElement;\n}\n\nfunction SlidePortal({ container = document.body, ...rest }: ISliderPortalProps) {\n return createPortal(<div {...rest} />, container);\n}\n\nexport default SlidePortal;\n","import React from 'react';\n\nfunction CloseIcon(props: React.HTMLAttributes<SVGElement>) {\n return (\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 768 768\" {...props}>\n <path d=\"M607.5 205.5l-178.5 178.5 178.5 178.5-45 45-178.5-178.5-178.5 178.5-45-45 178.5-178.5-178.5-178.5 45-45 178.5 178.5 178.5-178.5z\" />\n </svg>\n );\n}\n\nexport default CloseIcon;\n","import React from 'react';\n\nfunction ArrowLeft(props: React.HTMLAttributes<SVGElement>) {\n return (\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 768 768\" {...props}>\n <path d=\"M640.5 352.5v63h-390l178.5 180-45 45-256.5-256.5 256.5-256.5 45 45-178.5 180h390z\" />\n </svg>\n );\n}\n\nexport default ArrowLeft;\n","import React from 'react';\n\nfunction ArrowRight(props: React.HTMLAttributes<SVGElement>) {\n return (\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 768 768\" {...props}>\n <path d=\"M384 127.5l256.5 256.5-256.5 256.5-45-45 178.5-180h-390v-63h390l-178.5-180z\" />\n </svg>\n );\n}\n\nexport default ArrowRight;\n","import { useEffect } from 'react';\n\nexport default function PreventScroll() {\n useEffect(() => {\n const { style } = document.body;\n const lastOverflow = style.overflow;\n style.overflow = 'hidden';\n\n return () => {\n style.overflow = lastOverflow;\n };\n }, []);\n\n return null;\n}\n","import type React from 'react';\n\n/**\n * 从 Touch 事件中获取两个触控中心位置\n */\nexport default function getMultipleTouchPosition(\n evt: TouchEvent | React.TouchEvent,\n): [clientX: number, clientY: number, touchLength: number] {\n const { clientX, clientY } = evt.touches[0];\n if (evt.touches.length >= 2) {\n const { clientX: nextClientX, clientY: nextClientY } = evt.touches[1];\n return [\n (clientX + nextClientX) / 2,\n (clientY + nextClientY) / 2,\n Math.sqrt((nextClientX - clientX) ** 2 + (nextClientY - clientY) ** 2),\n ];\n }\n return [clientX, clientY, 0];\n}\n","import type { CloseEdgeType, ReachType, TouchStartType } from '../types';\n\n/**\n * 获取接触边缘类型\n */\nexport const getReachType = (\n initialTouchState: TouchStartType,\n horizontalCloseEdge: CloseEdgeType,\n verticalCloseEdge: CloseEdgeType,\n reachPosition: ReachType,\n): ReachType => {\n if ((horizontalCloseEdge && initialTouchState === 1) || reachPosition === 'x') {\n return 'x';\n }\n if ((verticalCloseEdge && initialTouchState > 1) || reachPosition === 'y') {\n return 'y';\n }\n return undefined;\n};\n\n/**\n * 计算接触边缘位置\n * @param position - x/y\n * @param scale\n * @param size - width/height\n * @param innerSize - innerWidth/innerHeight\n * @return [CloseEdgeType, position]\n */\nexport const computePositionEdge = (position: number, scale: number, size: number, innerSize: number) => {\n const currentWidth = size * scale;\n // 图片超出的宽度\n const outOffset = (currentWidth - innerSize) / 2;\n let closedEdge: CloseEdgeType;\n\n let current = position;\n if (currentWidth <= innerSize) {\n closedEdge = 1;\n current = 0;\n } else if (position > 0 && outOffset - position <= 0) {\n closedEdge = 2;\n current = outOffset;\n } else if (position < 0 && outOffset + position <= 0) {\n closedEdge = 3;\n current = -outOffset;\n }\n\n return [closedEdge, current] as const;\n};\n","import { longModeRatio } from '../variables';\nimport { computePositionEdge } from './edgeHandle';\n\n/**\n * 获取移动或缩放之后的中心点\n */\nexport default function getPositionOnMoveOrScale(\n x: number,\n y: number,\n width: number,\n height: number,\n scale: number,\n toScale: number,\n clientX: number = innerWidth / 2,\n clientY: number = innerHeight / 2,\n offsetX: number = 0,\n offsetY: number = 0,\n) {\n // 是否接触边缘\n const [closedEdgeX] = computePositionEdge(x, toScale, width, innerWidth);\n const [closedEdgeY] = computePositionEdge(y, toScale, height, innerHeight);\n\n const centerClientX = innerWidth / 2;\n const centerClientY = innerHeight / 2;\n\n // 坐标偏移\n const lastPositionX = centerClientX + x;\n const lastPositionY = centerClientY + y;\n\n // 偏移位置\n const originX = clientX - (clientX - lastPositionX) * (toScale / scale) - centerClientX;\n const originY = clientY - (clientY - lastPositionY) * (toScale / scale) - centerClientY;\n // 长图模式无左右反馈\n const longModeEdge = height / width >= longModeRatio && width * toScale === innerWidth;\n // 超出边缘距离减半\n return {\n x: originX + (longModeEdge ? 0 : closedEdgeX ? offsetX / 2 : offsetX),\n y: originY + (closedEdgeY ? offsetY / 2 : offsetY),\n lastCX: clientX,\n lastCY: clientY,\n };\n}\n","/**\n * 获取旋转后的宽高\n */\nexport default function getRotateSize(rotate: number, width: number, height: number) {\n const isVertical = rotate % 180 !== 0;\n\n // 若图片不是水平则调换属性\n if (isVertical) {\n return [height, width, isVertical] as const;\n }\n\n return [width, height, isVertical] as const;\n}\n","import { longModeRatio } from '../variables';\nimport getRotateSize from './getRotateSize';\n\n/**\n * 获取图片合适的大小\n */\nexport default function getSuitableImageSize(naturalWidth: number, naturalHeight: number, rotate: number) {\n const [currentWidth, currentHeight, isVertical] = getRotateSize(rotate, innerWidth, innerHeight);\n\n let y = 0;\n let width = currentWidth;\n let height = currentHeight;\n\n // 自适应宽高\n const autoWidth = (naturalWidth / naturalHeight) * currentHeight;\n const autoHeight = (naturalHeight / naturalWidth) * currentWidth;\n\n if (naturalWidth < currentWidth && naturalHeight < currentHeight) {\n width = naturalWidth;\n height = naturalHeight;\n } else if (naturalWidth < currentWidth && naturalHeight >= currentHeight) {\n width = autoWidth;\n } else if (naturalWidth >= currentWidth && naturalHeight < currentHeight) {\n height = autoHeight;\n } else if (naturalWidth / naturalHeight > currentWidth / currentHeight) {\n height = autoHeight;\n }\n // 长图模式\n else if (naturalHeight / naturalWidth >= longModeRatio && !isVertical) {\n height = autoHeight;\n y = (height - currentHeight) / 2;\n } else {\n width = autoWidth;\n }\n return {\n width,\n height,\n x: 0,\n y,\n pause: true,\n };\n}\n","import { useCallback, useRef } from 'react';\n\ninterface DebounceCallback<CallbackArguments extends any[]> {\n (...args: CallbackArguments): void;\n cancel: () => void;\n}\n\nexport default function useDebounceCallback<CallbackArguments extends any[]>(\n callback: (...args: CallbackArguments) => void,\n {\n leading = false,\n maxWait,\n wait = maxWait || 0,\n }: {\n leading?: boolean;\n maxWait?: number;\n wait?: number;\n },\n): DebounceCallback<CallbackArguments> {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const prev = useRef(0);\n const trailingTimeout = useRef<ReturnType<typeof setTimeout>>();\n const clearTrailing = () => trailingTimeout.current && clearTimeout(trailingTimeout.current);\n\n const fn = useCallback(\n (...args: CallbackArguments) => {\n const now = Date.now();\n\n function call() {\n prev.current = now;\n clearTrailing();\n callbackRef.current.apply(null, args);\n }\n const last = prev.current;\n const offset = now - last;\n // leading\n if (last === 0) {\n if (leading) {\n call();\n }\n prev.current = now;\n }\n\n // body\n if (maxWait !== undefined) {\n if (offset > maxWait) {\n call();\n return;\n }\n } else if (offset < wait) {\n prev.current = now;\n }\n\n // trailing\n clearTrailing();\n trailingTimeout.current = setTimeout(() => {\n call();\n prev.current = 0;\n }, wait);\n },\n [wait, maxWait, leading],\n );\n (fn as DebounceCallback<CallbackArguments>).cancel = clearTrailing;\n\n return fn as DebounceCallback<CallbackArguments>;\n}\n","import { computePositionEdge } from '../utils/edgeHandle';\nimport getPositionOnMoveOrScale from '../utils/getPositionOnMoveOrScale';\nimport getRotateSize from '../utils/getRotateSize';\nimport { defaultSpeed, maxTouchTime } from '../variables';\nimport useMethods from './useMethods';\n\n// 触边运动反馈\nconst rebound = (start: number, bound: number, callback: (spatial: number) => boolean) =>\n easeOutMove(\n start,\n bound,\n callback,\n defaultSpeed / 4,\n (t) => t,\n () => easeOutMove(bound, start, callback),\n );\n\n/**\n * 物理滚动到具体位置\n */\nexport default function useScrollPosition<C extends (spatial: number) => boolean>(\n callbackX: C,\n callbackY: C,\n callbackS: C,\n) {\n const callback = useMethods({\n X: (spatial: number) => callbackX(spatial),\n Y: (spatial: number) => callbackY(spatial),\n S: (spatial: number) => callbackS(spatial),\n });\n\n return (\n x: number,\n y: number,\n lastX: number,\n lastY: number,\n width: number,\n height: number,\n scale: number,\n safeScale: number,\n lastScale: number,\n rotate: number,\n touchedTime: number,\n ) => {\n const [currentWidth, currentHeight] = getRotateSize(rotate, width, height);\n // 开始状态下边缘触发状态\n const [beginEdgeX, beginX] = computePositionEdge(x, safeScale, currentWidth, innerWidth);\n const [beginEdgeY, beginY] = computePositionEdge(y, safeScale, currentHeight, innerHeight);\n const moveTime = Date.now() - touchedTime;\n\n // 时间过长、超出安全范围的情况下不执行滚动逻辑,恢复安全范围\n if (moveTime >= maxTouchTime || safeScale !== scale || Math.abs(lastScale - scale) > 1) {\n // 计算中心缩放点\n const { x: nextX, y: nextY } = getPositionOnMoveOrScale(x, y, width, height, scale, safeScale);\n const targetX = beginEdgeX ? beginX : nextX !== x ? nextX : null;\n const targetY = beginEdgeY ? beginY : nextY !== y ? nextY : null;\n\n if (targetX !== null) {\n easeOutMove(x, targetX, callback.X);\n }\n if (targetY !== null) {\n easeOutMove(y, targetY, callback.Y);\n }\n if (safeScale !== scale) {\n easeOutMove(scale, safeScale, callback.S);\n }\n return;\n }\n\n // 初始速度\n const speedX = (x - lastX) / moveTime;\n const speedY = (y - lastY) / moveTime;\n const speedT = Math.sqrt(speedX ** 2 + speedY ** 2);\n // 是否接触到边缘\n let edgeX = false;\n let edgeY = false;\n\n scrollMove(speedT, (spatial) => {\n const nextX = x + spatial * (speedX / speedT);\n const nextY = y + spatial * (speedY / speedT);\n\n const [isEdgeX, currentX] = computePositionEdge(nextX, scale, currentWidth, innerWidth);\n const [isEdgeY, currentY] = computePositionEdge(nextY, scale, currentHeight, innerHeight);\n\n if (isEdgeX && !edgeX) {\n edgeX = true;\n if (beginEdgeX) {\n easeOutMove(nextX, currentX, callback.X);\n } else {\n rebound(currentX, nextX + (nextX - currentX), callback.X);\n }\n }\n\n if (isEdgeY && !edgeY) {\n edgeY = true;\n if (beginEdgeY) {\n easeOutMove(nextY, currentY, callback.Y);\n } else {\n rebound(currentY, nextY + (nextY - currentY), callback.Y);\n }\n }\n // 同时接触边缘的情况下停止滚动\n if (edgeX && edgeY) {\n return false;\n }\n\n const resultX = edgeX || callback.X(currentX);\n const resultY = edgeY || callback.Y(currentY);\n return resultX && resultY;\n });\n };\n}\n\n// 加速度\nconst acceleration = -0.001;\n// 阻力\nconst resistance = 0.0002;\n\n/**\n * 通过速度滚动到停止\n */\nfunction scrollMove(initialSpeed: number, callback: (spatial: number) => boolean) {\n let v = initialSpeed;\n let s = 0;\n let lastTime: number | undefined;\n let frameId = 0;\n\n const calcMove = (now: number) => {\n if (!lastTime) {\n lastTime = now;\n }\n const dt = now - lastTime;\n const direction = Math.sign(initialSpeed);\n const a = direction * acceleration;\n const f = Math.sign(-v) * v ** 2 * resistance;\n const ds = v * dt + ((a + f) * dt ** 2) / 2;\n v += (a + f) * dt;\n\n s += ds;\n // move to s\n lastTime = now;\n\n if (direction * v <= 0) {\n caf();\n return;\n }\n\n if (callback(s)) {\n raf();\n return;\n }\n caf();\n };\n raf();\n\n function raf() {\n frameId = requestAnimationFrame(calcMove);\n }\n function caf() {\n cancelAnimationFrame(frameId);\n }\n}\n\n/**\n * 缓动函数\n */\nconst easeOutQuart = (x: number) => 1 - (1 - x) ** 4;\n\n/**\n * 缓动回调\n */\nfunction easeOutMove(\n start: number,\n end: number,\n callback: (spatial: number) => boolean,\n speed = defaultSpeed,\n easing = easeOutQuart,\n complete?: () => void,\n) {\n const distance = end - start;\n if (distance === 0) {\n return;\n }\n\n const startTime = Date.now();\n let frameId = 0;\n\n const calcMove = () => {\n const time = Math.min(1, (Date.now() - startTime) / speed);\n const result = callback(start + easing(time) * distance);\n\n if (result && time < 1) {\n raf();\n return;\n }\n cancelAnimationFrame(frameId);\n if (time >= 1 && complete) {\n complete();\n }\n };\n raf();\n\n function raf() {\n frameId = requestAnimationFrame(calcMove);\n }\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from 'react';\nimport { useState, useEffect, useRef } from 'react';\nimport type { EasingMode, OriginRectType } from '../types';\nimport useMethods from './useMethods';\nimport { maxWaitAnimationTime } from '../variables';\n\nconst initialRect: OriginRectType = {\n T: 0,\n L: 0,\n W: 0,\n H: 0,\n // 图像填充方式\n FIT: undefined,\n};\n\nexport default function useAnimationOrigin(\n visible: boolean | undefined,\n originRef: MutableRefObject<HTMLElement | null> | undefined,\n loaded: boolean,\n speed: number,\n updateEasing: (pause: boolean) => void,\n): [\n // 动画状态\n easingMode: EasingMode,\n originRect: OriginRectType,\n] {\n const [originRect, updateOriginRect] = useState(initialRect);\n // 动画状态\n const [easingMode, updateEasingMode] = useState<EasingMode>(0);\n const initialTime = useRef<number>();\n\n const fn = useMethods({\n OK: () => visible && updateEasingMode(4),\n });\n\n useEffect(() => {\n // 记录初始打开的时间\n if (!initialTime.current) {\n initialTime.current = Date.now();\n }\n if (!loaded) {\n return;\n }\n handleUpdateOrigin(originRef, updateOriginRect);\n // 打开动画处理\n if (visible) {\n // 小于最大允许动画时间,则执行缩放动画\n if (Date.now() - initialTime.current < maxWaitAnimationTime) {\n updateEasingMode(1);\n // 延时执行动画,保持 transition 生效\n requestAnimationFrame(() => {\n updateEasingMode(2);\n requestAnimationFrame(() => handleToShape(3));\n });\n setTimeout(fn.OK, speed);\n return;\n }\n // 超出则不执行\n updateEasingMode(4);\n return;\n }\n // 关闭动画处理\n handleToShape(5);\n }, [visible, loaded]);\n\n function handleToShape(currentShape: EasingMode) {\n updateEasing(false);\n updateEasingMode(currentShape);\n }\n\n return [easingMode, originRect];\n}\n\n/**\n * 更新缩略图位置信息\n */\nfunction handleUpdateOrigin(\n originRef: MutableRefObject<HTMLElement | null> | undefined,\n updateOriginRect: Dispatch<SetStateAction<typeof initialRect>>,\n) {\n const element = originRef && originRef.current;\n\n if (element && element.nodeType === 1) {\n // 获取触发时节点位置\n const { top, left, width, height } = element.getBoundingClientRect();\n const isImage = element.tagName === 'IMG';\n updateOriginRect({\n T: top,\n L: left,\n W: width,\n H: height,\n FIT: isImage ? (getComputedStyle(element).objectFit as 'contain' | 'cover' | 'fill' | undefined) : undefined,\n });\n }\n}\n","import { useEffect, useRef } from 'react';\n\nconst useMountedRef = () => {\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n return mountedRef;\n};\n\nexport default useMountedRef;\n","import React from 'react';\nimport './Spinner.less';\n\n// eslint-disable-next-line react/prop-types\nfunction Spinner({ className = '', ...props }: React.HTMLAttributes<HTMLElement>) {\n return (\n <div className={`PhotoView__Spinner ${className}`} {...props}>\n <svg viewBox=\"0 0 32 32\" width=\"36\" height=\"36\" fill=\"white\">\n <path opacity=\".25\" d=\"M16 0 A16 16 0 0 0 16 32 A16 16 0 0 0 16 0 M16 4 A12 12 0 0 1 16 28 A12 12 0 0 1 16 4\" />\n <path d=\"M16 0 A16 16 0 0 1 32 16 L28 16 A12 12 0 0 0 16 4z\" />\n </svg>\n </div>\n );\n}\n\nexport default Spinner;\n","import React from 'react';\nimport Spinner from './components/Spinner';\nimport useMountedRef from './hooks/useMountedRef';\nimport type { BrokenElementParams } from './types';\nimport './Photo.less';\n\nexport interface IPhotoLoadedParams {\n loaded?: boolean;\n naturalWidth?: number;\n naturalHeight?: number;\n broken?: boolean;\n}\n\nexport interface IPhotoProps extends React.HTMLAttributes<HTMLElement> {\n src: string;\n loaded: boolean;\n broken: boolean;\n onPhotoLoad: (params: IPhotoLoadedParams) => void;\n loadingElement?: JSX.Element;\n brokenElement?: JSX.Element | ((photoProps: BrokenElementParams) => JSX.Element);\n}\n\nexport default function Photo({\n src,\n loaded,\n broken,\n className,\n onPhotoLoad,\n loadingElement,\n brokenElement,\n ...restProps\n}: IPhotoProps) {\n const mountedRef = useMountedRef();\n\n function handleImageLoaded(e: React.SyntheticEvent<HTMLImageElement>) {\n const { naturalWidth, naturalHeight } = e.target as HTMLImageElement;\n if (mountedRef.current) {\n onPhotoLoad({\n loaded: true,\n naturalWidth,\n naturalHeight,\n });\n }\n }\n\n function handleImageBroken() {\n if (mountedRef.current) {\n onPhotoLoad({\n broken: true,\n });\n }\n }\n\n if (src && !broken) {\n return (\n <>\n <img\n className={`PhotoView__Photo${className ? ` ${className}` : ''}`}\n src={src}\n onLoad={handleImageLoaded}\n onError={handleImageBroken}\n draggable={false}\n alt=\"\"\n {...restProps}\n />\n {!loaded &&\n (loadingElement ? (\n <span className=\"PhotoView__icon\">{loadingElement}</span>\n ) : (\n <Spinner className=\"PhotoView__icon\" />\n ))}\n </>\n );\n }\n\n if (brokenElement) {\n return (\n <span className=\"PhotoView__icon\">\n {typeof brokenElement === 'function' ? brokenElement({ src }) : brokenElement}\n </span>\n );\n }\n\n return null;\n}\n","import React, { useRef } from 'react';\nimport isTouchDevice from './utils/isTouchDevice';\nimport getMultipleTouchPosition from './utils/getMultipleTouchPosition';\nimport getPositionOnMoveOrScale from './utils/getPositionOnMoveOrScale';\nimport { getReachType, computePositionEdge } from './utils/edgeHandle';\nimport getRotateSize from './utils/getRotateSize';\nimport { limitScale } from './utils/limitTarget';\nimport getSuitableImageSize from './utils/getSuitableImageSize';\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect';\nimport { minStartTouchOffset, scaleBuffer } from './variables';\nimport type {\n DataType,\n ReachMoveFunction,\n ReachFunction,\n PhotoTapFunction,\n BrokenElementParams,\n ExposedProperties,\n ReachType,\n TouchStartType,\n} from './types';\nimport useSetState from './hooks/useSetState';\nimport useMethods from './hooks/useMethods';\nimport useDebounceCallback from './hooks/useDebounceCallback';\nimport useEventListener from './hooks/useEventListener';\nimport useContinuousTap from './hooks/useContinuousTap';\nimport useScrollPosition from './hooks/useScrollPosition';\nimport useAnimationPosition from './hooks/useAnimationPosition';\nimport useMountedRef from './hooks/useMountedRef';\nimport type { IPhotoLoadedParams } from './Photo';\nimport Photo from './Photo';\nimport './PhotoBox.less';\n\nexport interface PhotoBoxProps {\n // 图片信息\n item: DataType;\n // 是否可见\n visible: boolean;\n // 动画时间\n speed: number;\n // 动画函数\n easing: string;\n // 容器类名\n wrapClassName?: string;\n // 图片类名\n className?: string;\n // style\n style?: object;\n // 自定义 loading\n loadingElement?: JSX.Element;\n // 加载失败 Element\n brokenElement?: JSX.Element | ((photoProps: BrokenElementParams) => JSX.Element);\n\n // Photo 点击事件\n onPhotoTap: PhotoTapFunction;\n // Mask 点击事件\n onMaskTap: PhotoTapFunction;\n // 到达边缘滑动事件\n onReachMove: ReachMoveFunction;\n // 触摸解除事件\n onReachUp: ReachFunction;\n // Resize 事件\n onPhotoResize: () => void;\n // 向父组件导出属性\n expose: (state: ExposedProperties) => void;\n // 是否在当前操作中\n isActive: boolean;\n}\n\nconst initialState = {\n // 真实宽度\n naturalWidth: undefined as number | undefined,\n // 真实高度\n naturalHeight: undefined as number | undefined,\n // 宽度\n width: undefined as number | undefined,\n // 高度\n height: undefined as number | undefined,\n // 加载成功状态\n loaded: undefined as boolean | undefined,\n // 破碎状态\n broken: false,\n\n // 图片 X 偏移量\n x: 0,\n // 图片 y 偏移量\n y: 0,\n // 图片处于触摸的状态\n touched: false,\n // 背景处于触摸状态\n maskTouched: false,\n // 旋转状态\n rotate: 0,\n // 放大缩小\n scale: 1,\n\n // 触摸开始时 x 原始坐标\n CX: 0,\n // 触摸开始时 y 原始坐标\n CY: 0,\n\n // 触摸开始时图片 x 偏移量\n lastX: 0,\n // 触摸开始时图片 y 偏移量\n lastY: 0,\n // 上一个触摸状态 x 原始坐标\n lastCX: 0,\n // 上一个触摸状态 y 原始坐标\n lastCY: 0,\n // 上一个触摸状态的 scale\n lastScale: 1,\n\n // 触摸开始时时间\n touchTime: 0,\n // 多指触控间距\n touchLength: 0,\n // 是否暂停 transition\n pause: true,\n // 停止 Raf\n stopRaf: true,\n // 当前边缘触发状态\n reach: undefined as ReachType,\n};\n\nexport default function PhotoBox({\n item: { src, render, width: customWidth = 0, height: customHeight = 0, originRef },\n visible,\n speed,\n easing,\n wrapClassName,\n className,\n style,\n loadingElement,\n brokenElement,\n\n onPhotoTap,\n onMaskTap,\n onReachMove,\n onReachUp,\n onPhotoResize,\n isActive,\n expose,\n}: PhotoBoxProps) {\n const [state, updateState] = useSetState(initialState);\n const initialTouchRef = useRef<TouchStartType>(0);\n const mounted = useMountedRef();\n\n const {\n naturalWidth = customWidth,\n naturalHeight = customHeight,\n width = customWidth,\n height = customHeight,\n loaded = !src,\n broken,\n x,\n y,\n touched,\n stopRaf,\n maskTouched,\n rotate,\n scale,\n CX,\n CY,\n lastX,\n lastY,\n lastCX,\n lastCY,\n lastScale,\n touchTime,\n touchLength,\n pause,\n reach,\n } = state;\n\n const fn = useMethods({\n onScale: (current: number) => onScale(limitScale(current)),\n onRotate(current: number) {\n if (rotate !== current) {\n expose({ rotate: current });\n updateState({ rotate: current, ...getSuitableImageSize(naturalWidth, naturalHeight, current) });\n }\n },\n });\n\n // 默认为屏幕中心缩放\n function onScale(current: number, clientX?: number, clientY?: number) {\n if (scale !== current) {\n expose({ scale: current });\n updateState({\n scale: current,\n ...getPositionOnMoveOrScale(x, y, width, height, scale, current, clientX, clientY),\n ...(current <= 1 && { x: 0, y: 0 }),\n });\n }\n }\n\n const handleMove = useDebounceCallback(\n (nextClientX: number, nextClientY: number, currentTouchLength: number = 0) => {\n if ((touched || maskTouched) && isActive) {\n // 通过旋转调换宽高\n const [currentWidth, currentHeight] = getRotateSize(rotate, width, height);\n // 单指最小缩放下,以初始移动距离来判断意图\n if (currentTouchLength === 0 && initialTouchRef.current === 0) {\n const isStillX = Math.abs(nextClientX - CX) <= minStartTouchOffset;\n const isStillY = Math.abs(nextClientY - CY) <= minStartTouchOffset;\n // 初始移动距离不足\n if (isStillX && isStillY) {\n // 方向记录上次移动距离,以便平滑过渡\n updateState({ lastCX: nextClientX, lastCY: nextClientY });\n return;\n }\n // 设置响应状态\n initialTouchRef.current = !isStillX ? 1 : nextClientY > CY ? 3 : 2;\n }\n\n const offsetX = nextClientX - lastCX;\n const offsetY = nextClientY - lastCY;\n // 边缘触发状态\n let currentReach: ReachType;\n if (currentTouchLength === 0) {\n // 边缘超出状态\n const [horizontalCloseEdge] = computePositionEdge(offsetX + lastX, scale, currentWidth, innerWidth);\n const [verticalCloseEdge] = computePositionEdge(offsetY + lastY, scale, currentHeight, innerHeight);\n // 边缘触发检测\n currentReach = getReachType(initialTouchRef.current, horizontalCloseEdge, verticalCloseEdge, reach);\n\n // 接触边缘\n if (currentReach !== undefined) {\n onReachMove(currentReach, nextClientX, nextClientY, scale);\n }\n }\n // 横向边缘触发、背景触发禁用当前滑动\n if (currentReach === 'x' || maskTouched) {\n updateState({ reach: 'x' });\n return;\n }\n // 目标倍数\n const toScale = limitScale(\n scale + ((currentTouchLength - touchLength) / 100 / 2) * scale,\n naturalWidth / width,\n scaleBuffer,\n );\n // 导出变量\n expose({ scale: toScale });\n updateState({\n touchLength: currentTouchLength,\n reach: currentReach,\n scale: toScale,\n ...getPositionOnMoveOrScale(x, y, width, height, scale, toScale, nextClientX, nextClientY, offsetX, offsetY),\n });\n }\n },\n {\n maxWait: 8,\n },\n );\n\n function updateRaf(position: { x?: number; y?: number }) {\n if (stopRaf || touched) {\n return false;\n }\n if (mounted.current) {\n // 下拉关闭时可以有动画\n updateState({ ...position, pause: visible });\n }\n return mounted.current;\n }\n\n const slideToPosition = useScrollPosition(\n (nextX) => updateRaf({ x: nextX }),\n (nextY) => updateRaf({ y: nextY }),\n (nextScale) => {\n if (mounted.current) {\n expose({ scale: nextScale });\n updateState({ scale: nextScale });\n }\n return !touched && mounted.current;\n },\n );\n\n const handlePhotoTap = useContinuousTap(onPhotoTap, (currentClientX: number, currentClientY: number) => {\n if (!reach) {\n // 若图片足够大,则放大适应的倍数\n const endScale = scale !== 1 ? 1 : Math.max(2, naturalWidth / width);\n onScale(endScale, currentClientX, currentClientY);\n }\n });\n\n function handleUp(nextClientX: number, nextClientY: number) {\n // 重置响应状态\n initialTouchRef.current = 0;\n if ((touched || maskTouched) && isActive) {\n updateState({\n touched: false,\n maskTouched: false,\n pause: false,\n stopRaf: false,\n reach: undefined,\n });\n const safeScale = limitScale(scale, naturalWidth / width);\n // Go\n slideToPosition(x, y, lastX, lastY, width, height, scale, safeScale, lastScale, rotate, touchTime);\n\n onReachUp(nextClientX, nextClientY);\n // 触发 Tap 事件\n if (CX === nextClientX && CY === nextClientY) {\n if (touched) {\n handlePhotoTap(nextClientX, nextClientY);\n return;\n }\n if (maskTouched) {\n onMaskTap(nextClientX, nextClientY);\n }\n }\n }\n }\n\n useEventListener(isTouchDevice ? undefined : 'mousemove', (e) => {\n e.preventDefault();\n handleMove(e.clientX, e.clientY);\n });\n useEventListener(isTouchDevice ? undefined : 'mouseup', (e) => {\n handleUp(e.clientX, e.clientY);\n });\n useEventListener(\n isTouchDevice ? 'touchmove' : undefined,\n (e) => {\n e.preventDefault();\n const position = getMultipleTouchPosition(e);\n handleMove(...position);\n },\n { passive: false },\n );\n useEventListener(\n isTouchDevice ? 'touchend' : undefined,\n ({ changedTouches }) => {\n const touch = changedTouches[0];\n handleUp(touch.clientX, touch.clientY);\n },\n { passive: false },\n );\n useEventListener(\n 'resize',\n useDebounceCallback(\n () => {\n if (loaded && !touched) {\n updateState(getSuitableImageSize(naturalWidth, naturalHeight, rotate));\n onPhotoResize();\n }\n },\n { maxWait: 8 },\n ),\n );\n\n useIsomorphicLayoutEffect(() => {\n if (isActive) {\n expose({ scale, rotate, ...fn });\n }\n }, [isActive]);\n\n function handlePhotoLoad(params: IPhotoLoadedParams) {\n updateState({\n ...params,\n ...(params.loaded && getSuitableImageSize(params.naturalWidth || 0, params.naturalHeight || 0, rotate)),\n });\n }\n\n function handleStart(currentClientX: number, currentClientY: number, currentTouchLength: number = 0) {\n updateState({\n touched: true,\n CX: currentClientX,\n CY: currentClientY,\n lastCX: currentClientX,\n lastCY: currentClientY,\n lastX: x,\n lastY: y,\n lastScale: scale,\n touchLength: currentTouchLength,\n touchTime: Date.now(),\n });\n }\n\n function handleWheel(e: React.WheelEvent) {\n if (!reach) {\n // 限制最大倍数和最小倍数\n const toScale = limitScale(scale - e.deltaY / 100 / 2, naturalWidth / width);\n updateState({ stopRaf: true });\n onScale(toScale, e.clientX, e.clientY);\n }\n }\n\n function handleMaskStart(e: { clientX: number; clientY: number }) {\n updateState({\n maskTouched: true,\n CX: e.clientX,\n CY: e.clientY,\n lastX: x,\n lastY: y,\n });\n }\n\n function handleTouchStart(e: React.TouchEvent) {\n e.stopPropagation();\n handleStart(...getMultipleTouchPosition(e));\n }\n\n function handleMouseDown(e: React.MouseEvent) {\n e.stopPropagation();\n if (e.button === 0) {\n handleStart(e.clientX, e.clientY, 0);\n }\n }\n\n // 计算位置\n const [translateX, translateY, currentWidth, currentHeight, currentScale, opacity, easingMode, FIT] =\n useAnimationPosition(visible, originRef, loaded, x, y, width, height, scale, speed, (isPause: boolean) =>\n updateState({ pause: isPause }),\n );\n // 图片 objectFit 渐变时间\n const transitionLayoutTime = easingMode < 4 ? speed / 2 : easingMode > 4 ? speed : 0;\n const transitionCSS = `transform ${speed}ms ${easing}`;\n\n const attrs = {\n className,\n onMouseDown: isTouchDevice ? undefined : handleMouseDown,\n onTouchStart: isTouchDevice ? handleTouchStart : undefined,\n onWheel: handleWheel,\n style: {\n width: `${currentWidth}px`,\n height: `${currentHeight}px`,\n opacity,\n objectFit: easingMode === 4 ? undefined : FIT,\n transform: rotate ? `rotate(${rotate}deg)` : undefined,\n transition:\n // 初始状态无渐变\n easingMode > 2\n ? `${transitionCSS}, opacity ${speed}ms ease, height ${transitionLayoutTime}ms ${easing}`\n : undefined,\n },\n };\n\n return (\n <div\n className={`PhotoView__PhotoWrap${wrapClassName ? ` ${wrapClassName}` : ''}`}\n style={style}\n onMouseDown={!isTouchDevice && isActive ? handleMaskStart : undefined}\n onTouchStart={isTouchDevice && isActive ? (e) => handleMaskStart(e.touches[0]) : undefined}\n >\n <div\n className=\"PhotoView__PhotoBox\"\n style={{\n transform: `matrix(${currentScale}, 0, 0, ${currentScale}, ${translateX}, ${translateY})`,\n transition: touched || pause ? undefined : transitionCSS,\n willChange: isActive ? 'transform' : undefined,\n }}\n >\n {src ? (\n <Photo\n src={src}\n loaded={loaded}\n broken={broken}\n {...attrs}\n onPhotoLoad={handlePhotoLoad}\n loadingElement={loadingElement}\n brokenElement={brokenElement}\n />\n ) : (\n render && render({ attrs, scale: currentScale, rotate })\n )}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport useDebounceCallback from './useDebounceCallback';\n\nexport type TapFuncType<T> = (...args: T[]) => void;\n\n/**\n * 单击和双击事件处理\n * @param singleTap - 单击事件\n * @param doubleTap - 双击事件\n * @return invokeTap\n */\nexport default function useContinuousTap<T>(singleTap: TapFuncType<T>, doubleTap: TapFuncType<T>): TapFuncType<T> {\n // 当前连续点击次数\n const continuousClick = useRef(0);\n\n const debounceTap = useDebounceCallback(\n (...args) => {\n continuousClick.current = 0;\n singleTap(...args);\n },\n {\n wait: 300,\n },\n );\n\n return function invokeTap(...args) {\n continuousClick.current += 1;\n debounceTap(...args);\n // 双击\n if (continuousClick.current >= 2) {\n debounceTap.cancel();\n continuousClick.current = 0;\n doubleTap(...args);\n }\n };\n}\n","import type { MutableRefObject } from 'react';\nimport useAnimationOrigin from './useAnimationOrigin';\nimport useTargetScale from './useTargetScale';\n\nexport default function useAnimationPosition(\n visible: boolean | undefined,\n originRef: MutableRefObject<HTMLElement | null> | undefined,\n loaded: boolean,\n x: number,\n y: number,\n width: number,\n height: number,\n scale: number,\n speed: number,\n updateEasing: (pause: boolean) => void,\n) {\n // 延迟更新 width/height\n const [autoWidth, autoHeight, autoScale] = useTargetScale(width, height, scale, speed, updateEasing);\n // 动画源处理\n const [easingMode, originRect] = useAnimationOrigin(visible, originRef, loaded, speed, updateEasing);\n\n // 计算动画位置\n const { T, L, W, H, FIT } = originRect;\n // 偏移量,x: 0, y: 0 居中为初始\n const centerWidth = innerWidth / 2;\n const centerHeight = innerHeight / 2;\n const offsetX = centerWidth - (width * scale) / 2;\n const offsetY = centerHeight - (height * scale) / 2;\n // 缩略图状态\n const miniMode = easingMode < 3 || easingMode > 4;\n // 有缩略图时,则为缩略图的位置,否则居中\n const translateX = miniMode ? (W ? L : centerWidth) : x + offsetX;\n const translateY = miniMode ? (W ? T : centerHeight) : y + offsetY;\n\n // 最小值缩放\n const minScale = W / (width * scale) || 0.01;\n\n // 适应 objectFit 保持缩略图宽高比\n const currentHeight = miniMode && FIT ? autoWidth * (H / W) : autoHeight;\n // 初始加载情况无缩放\n const currentScale = easingMode === 0 ? autoScale : miniMode ? minScale : autoScale;\n const opacity = miniMode ? (FIT ? 1 : 0) : 1;\n\n return [translateX, translateY, autoWidth, currentHeight, currentScale, opacity, easingMode, FIT] as const;\n}\n","import { useRef } from 'react';\nimport useSetState from './useSetState';\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\nimport useDebounceCallback from './useDebounceCallback';\n\n/**\n * 目标缩放延迟处理\n */\nexport default function useTargetScale(\n realWidth: number,\n realHeight: number,\n realScale: number,\n speed: number,\n updateEasing: (pause: boolean) => void,\n) {\n const execRef = useRef(false);\n\n const [{ lead, scale }, updateState] = useSetState({ lead: true, scale: realScale });\n\n const moveScale = useDebounceCallback(\n async (current: number) => {\n updateEasing(true);\n updateState({ lead: false, scale: current });\n },\n { wait: speed },\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!execRef.current) {\n execRef.current = true;\n return;\n }\n updateEasing(false);\n updateState({ lead: true });\n\n moveScale(realScale);\n }, [realScale]);\n\n // 运动开始\n if (lead) {\n return [realWidth * scale, realHeight * scale, realScale / scale] as const;\n }\n\n // 运动结束\n return [realWidth * realScale, realHeight * realScale, 1] as const;\n}\n","import React, { useRef, useState } from 'react';\nimport type { DataType, PhotoProviderBase, OverlayRenderProps, ReachType } from './types';\nimport { defaultEasing, defaultSpeed, defaultOpacity, horizontalOffset, maxMoveOffset } from './variables';\nimport isTouchDevice from './utils/isTouchDevice';\nimport { limitNumber } from './utils/limitTarget';\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect';\nimport useAdjacentImages from './hooks/useAdjacentImages';\nimport useSetState from './hooks/useSetState';\nimport useEventListener from './hooks/useEventListener';\nimport useAnimationVisible from './hooks/useAnimationVisible';\nimport useMethods from './hooks/useMethods';\nimport SlidePortal from './components/SlidePortal';\nimport CloseIcon from './components/CloseIcon';\nimport ArrowLeft from './components/ArrowLeft';\nimport ArrowRight from './components/ArrowRight';\nimport PreventScroll from './components/PreventScroll';\nimport PhotoBox from './PhotoBox';\nimport './PhotoSlider.less';\n\nexport interface IPhotoSliderProps extends PhotoProviderBase {\n // 图片列表\n images: DataType[];\n // 图片当前索引\n index?: number;\n // 索引改变回调\n onIndexChange?: (index: number) => void;\n // 可见\n visible: boolean;\n // 关闭回调\n onClose: (evt?: React.MouseEvent | React.TouchEvent) => void;\n // 关闭动画结束后回调\n afterClose?: () => void;\n\n direction?: 'ltr' | 'rtl';\n}\n\ntype PhotoSliderState = {\n // 偏移量\n x: number;\n // 图片处于触摸的状态\n touched: boolean;\n // 是否暂停 transition\n pause: boolean;\n // Reach 开始时 x 坐标\n lastCX: number | undefined;\n // Reach 开始时 y 坐标\n lastCY: number | undefined;\n // 背景透明度\n bg: number | null | undefined;\n // 上次关闭的背景透明度\n lastBg: number | null | undefined;\n // 是否显示 overlay\n overlay: boolean;\n // 是否为最小状态,可下拉关闭\n minimal: boolean;\n // 缩放\n scale: number;\n // 旋转\n rotate: number;\n // 缩放回调\n onScale?: (scale: number) => void;\n // 旋转回调\n onRotate?: (rotate: number) => void;\n};\n\nconst initialState: PhotoSliderState = {\n x: 0,\n touched: false,\n pause: false,\n lastCX: undefined,\n lastCY: undefined,\n bg: undefined,\n lastBg: undefined,\n overlay: true,\n minimal: true,\n scale: 1,\n rotate: 0,\n};\n\nexport default function PhotoSlider(props: IPhotoSliderProps) {\n const {\n loop = 3,\n speed: speedFn,\n easing: easingFn,\n photoClosable,\n maskClosable = true,\n maskOpacity = defaultOpacity,\n pullClosable = true,\n bannerVisible = true,\n overlayRender,\n toolbarRender,\n className,\n maskClassName,\n photoClassName,\n photoWrapClassName,\n loadingElement,\n brokenElement,\n images,\n index: controlledIndex = 0,\n onIndexChange: controlledIndexChange,\n visible,\n onClose,\n afterClose,\n portalContainer,\n } = props;\n\n const [state, updateState] = useSetState(initialState);\n const [innerIndex, updateInnerIndex] = useState(0);\n\n const {\n x,\n touched,\n pause,\n\n lastCX,\n lastCY,\n\n bg = maskOpacity,\n lastBg,\n overlay,\n minimal,\n\n scale,\n rotate,\n onScale,\n onRotate,\n } = state;\n\n // 受控 index\n const isControlled = props.hasOwnProperty('index');\n const index = isControlled ? controlledIndex : innerIndex;\n const onIndexChange = isControlled ? controlledIndexChange : updateInnerIndex;\n // 内部虚拟 index\n const virtualIndexRef = useRef(index);\n\n // 当前图片\n const imageLength = images.length;\n const currentImage: DataType | undefined = images[index];\n\n // 是否开启\n // noinspection SuspiciousTypeOfGuard\n const enableLoop = typeof loop === 'boolean' ? loop : imageLength > loop;\n\n // 显示动画处理\n const [realVisible, activeAnimation, onAnimationEnd] = useAnimationVisible(visible, afterClose);\n\n useIsomorphicLayoutEffect(() => {\n // 显示弹出层,修正正确的指向\n if (realVisible) {\n updateState({\n pause: true,\n x: index * -(innerWidth + horizontalOffset),\n });\n virtualIndexRef.current = index;\n return;\n }\n // 关闭后清空状态\n updateState(initialState);\n }, [realVisible]);\n\n const { close, changeIndex } = useMethods({\n close(evt?: React.MouseEvent | React.TouchEvent) {\n if (onRotate) {\n onRotate(0);\n }\n updateState({\n overlay: true,\n // 记录当前关闭时的透明度\n lastBg: bg,\n });\n onClose(evt);\n },\n changeIndex(nextIndex: number, isPause: boolean = false) {\n // 当前索引\n const currentIndex = enableLoop ? virtualIndexRef.current + (nextIndex - index) : nextIndex;\n const max = imageLength - 1;\n // 虚拟 index\n // 非循环模式,限制区间\n const limitIndex = limitNumber(currentIndex, 0, max);\n const nextVirtualIndex = enableLoop ? currentIndex : limitIndex;\n // 单个屏幕宽度\n const singlePageWidth = innerWidth + horizontalOffset;\n\n updateState({\n touched: false,\n lastCX: undefined,\n lastCY: undefined,\n x: -singlePageWidth * nextVirtualIndex,\n pause: isPause,\n });\n\n virtualIndexRef.current = nextVirtualIndex;\n // 更新真实的 index\n const realLoopIndex = nextIndex < 0 ? max : nextIndex > max ? 0 : nextIndex;\n if (onIndexChange) {\n onIndexChange(enableLoop ? realLoopIndex : limitIndex);\n }\n },\n });\n\n useEventListener('keydown', (evt: KeyboardEvent) => {\n if (visible) {\n switch (evt.key) {\n case 'ArrowLeft':\n changeIndex(index - 1, true);\n break;\n case 'ArrowRight':\n changeIndex(index + 1, true);\n break;\n case 'Escape':\n close();\n break;\n default:\n }\n }\n });\n\n function handlePhotoTap(closeable: boolean | undefined) {\n return closeable ? close() : updateState({ overlay: !overlay });\n }\n\n function handleResize() {\n updateState({\n x: -(innerWidth + horizontalOffset) * index,\n lastCX: undefined,\n lastCY: undefined,\n pause: true,\n });\n virtualIndexRef.current = index;\n }\n\n function handleReachVerticalMove(clientY: number, nextScale?: number) {\n if (lastCY === undefined) {\n updateState({\n touched: true,\n lastCY: clientY,\n bg,\n minimal: true,\n });\n return;\n }\n const opacity =\n maskOpacity === null ? null : limitNumber(maskOpacity, 0.01, maskOpacity - Math.abs(clientY - lastCY) / 100 / 4);\n\n updateState({\n touched: true,\n lastCY,\n bg: nextScale === 1 ? opacity : maskOpacity,\n minimal: nextScale === 1,\n });\n }\n\n function handleReachHorizontalMove(clientX: number) {\n if (lastCX === undefined) {\n updateState({\n touched: true,\n lastCX: clientX,\n x,\n pause: false,\n });\n return;\n }\n const originOffsetClientX = clientX - lastCX;\n let offsetClientX = originOffsetClientX;\n\n // 第一张和最后一张超出距离减半\n if (\n !enableLoop &&\n ((index === 0 && originOffsetClientX > 0) || (index === imageLength - 1 && originOffsetClientX < 0))\n ) {\n offsetClientX = originOffsetClientX / 2;\n }\n\n updateState({\n touched: true,\n lastCX,\n x: -(innerWidth + horizontalOffset) * virtualIndexRef.current + offsetClientX,\n pause: false,\n });\n }\n\n function handleReachMove(reachPosition: ReachType, clientX: number, clientY: number, nextScale?: number) {\n if (reachPosition === 'x') {\n handleReachHorizontalMove(clientX);\n } else if (reachPosition === 'y') {\n handleReachVerticalMove(clientY, nextScale);\n }\n }\n\n function handleReachUp(clientX: number, clientY: number) {\n const offsetClientX = clientX - (lastCX ?? clientX);\n const offsetClientY = clientY - (lastCY ?? clientY);\n let willClose = false;\n // 下一张\n if (offsetClientX < -maxMoveOffset) {\n changeIndex(index + 1);\n return;\n }\n // 上一张\n if (offsetClientX > maxMoveOffset) {\n changeIndex(index - 1);\n return;\n }\n const singlePageWidth = innerWidth + horizontalOffset;\n // 当前偏移\n const currentTranslateX = -singlePageWidth * virtualIndexRef.current;\n\n if (Math.abs(offsetClientY) > 100 && minimal && pullClosable) {\n willClose = true;\n close();\n }\n updateState({\n touched: false,\n x: currentTranslateX,\n lastCX: undefined,\n lastCY: undefined,\n bg: maskOpacity,\n overlay: willClose ? true : overlay,\n });\n }\n // 截取相邻的图片\n const adjacentImages = useAdjacentImages(images, index, enableLoop);\n\n if (!realVisible) {\n return null;\n }\n\n const currentOverlayVisible = overlay && !activeAnimation;\n // 关闭过程中使用下拉保存的透明度\n const currentOpacity = visible ? bg : lastBg;\n // 覆盖物参数\n const overlayParams: OverlayRenderProps | undefined = onScale &&\n onRotate && {\n images,\n index,\n visible,\n onClose: close,\n onIndexChange: changeIndex,\n overlayVisible: currentOverlayVisible,\n overlay: currentImage && currentImage.overlay,\n scale,\n rotate,\n onScale,\n onRotate,\n };\n // 动画时间\n const currentSpeed = speedFn ? speedFn(activeAnimation) : defaultSpeed;\n const currentEasing = easingFn ? easingFn(activeAnimation) : defaultEasing;\n const slideSpeed = speedFn ? speedFn(3) : defaultSpeed + 200;\n const slideEasing = easingFn ? easingFn(3) : defaultEasing;\n\n return (\n <SlidePortal\n className={`PhotoView-Portal${!currentOverlayVisible ? ' PhotoView-Slider__clean' : ''}${\n !visible ? ' PhotoView-Slider__willClose' : ''\n }${className ? ` ${className}` : ''}`}\n role=\"dialog\"\n onClick={(e) => e.stopPropagation()}\n container={portalContainer}\n >\n {visible && <PreventScroll />}\n <div\n className={`PhotoView-Slider__Backdrop${maskClassName ? ` ${maskClassName}` : ''}${\n activeAnimation === 1\n ? ' PhotoView-Slider__fadeIn'\n : activeAnimation === 2\n ? ' PhotoView-Slider__fadeOut'\n : ''\n }`}\n style={{\n background: currentOpacity ? `rgba(0, 0, 0, ${currentOpacity})` : undefined,\n transitionTimingFunction: currentEasing,\n transitionDuration: `${touched ? 0 : currentSpeed}ms`,\n animationDuration: `${currentSpeed}ms`,\n }}\n onAnimationEnd={onAnimationEnd}\n />\n {bannerVisible && (\n <div className=\"PhotoView-Slider__BannerWrap\">\n <div className=\"PhotoView-Slider__Counter\">\n {index + 1} / {imageLength}\n </div>\n <div className=\"PhotoView-Slider__BannerRight\">\n {toolbarRender && overlayParams && toolbarRender(overlayParams)}\n <CloseIcon className=\"PhotoView-Slider__toolbarIcon\" onClick={close} />\n </div>\n </div>\n )}\n {adjacentImages.map((item: DataType, currentIndex) => {\n // 截取之前的索引位置\n const nextIndex =\n !enableLoop && index === 0 ? index + currentIndex : virtualIndexRef.current - 1 + currentIndex;\n\n return (\n <PhotoBox\n key={enableLoop ? `${item.key}/${item.src}/${nextIndex}` : item.key}\n item={item}\n speed={currentSpeed}\n easing={currentEasing}\n visible={visible}\n onReachMove={handleReachMove}\n onReachUp={handleReachUp}\n onPhotoTap={() => handlePhotoTap(photoClosable)}\n onMaskTap={() => handlePhotoTap(maskClosable)}\n wrapClassName={photoWrapClassName}\n className={photoClassName}\n style={{\n left: `${(innerWidth + horizontalOffset) * nextIndex}px`,\n transform: `translate3d(${x}px, 0px, 0)`,\n transition: touched || pause ? undefined : `transform ${slideSpeed}ms ${slideEasing}`,\n }}\n loadingElement={loadingElement}\n brokenElement={brokenElement}\n onPhotoResize={handleResize}\n isActive={virtualIndexRef.current === nextIndex}\n expose={updateState}\n />\n );\n })}\n {!isTouchDevice && bannerVisible && (\n <>\n {(enableLoop || index !== 0) && (\n <div className=\"PhotoView-Slider__ArrowLeft\" onClick={() => changeIndex(index - 1, true)}>\n <ArrowLeft />\n </div>\n )}\n {(enableLoop || index + 1 < imageLength) && (\n <div className=\"PhotoView-Slider__ArrowRight\" onClick={() => changeIndex(index + 1, true)}>\n <ArrowRight />\n </div>\n )}\n </>\n )}\n {overlayRender && overlayParams && (\n <div className=\"PhotoView-Slider__Overlay\">{overlayRender(overlayParams)}</div>\n )}\n </SlidePortal>\n );\n}\n","import { useReducer, useRef } from 'react';\nimport type { ActiveAnimationType } from '../types';\nimport useForkedVariable from './useForkedVariable';\n\n/**\n * 动画关闭处理真实关闭状态\n * 通过 onAnimationEnd 回调实现 leaveCallback\n */\nexport default function useAnimationVisible(\n visible: boolean | undefined,\n afterClose?: () => void,\n): [realVisible: boolean | undefined, activeAnimation: ActiveAnimationType, onAnimationEnd: () => void] {\n const [, handleRender] = useReducer((c) => !c, false);\n\n const activeAnimation = useRef<ActiveAnimationType>(0);\n\n // 可见状态分支\n const [realVisible, modifyRealVisible] = useForkedVariable(visible, (modify) => {\n // 可见状态:设置进入动画\n if (visible) {\n modify(visible);\n activeAnimation.current = 1;\n } else {\n activeAnimation.current = 2;\n }\n });\n\n function onAnimationEnd() {\n // 动画结束后触发渲染\n handleRender();\n // 结束动画:设置隐藏状态\n if (activeAnimation.current === 2) {\n modifyRealVisible(false);\n // 触发隐藏回调\n if (afterClose) {\n afterClose();\n }\n }\n // 重置状态\n activeAnimation.current = 0;\n }\n\n return [\n /**\n * 真实可见状态\n */\n realVisible,\n /**\n * 正在进行的动画\n */\n activeAnimation.current,\n /**\n * 动画结束后回调\n */\n onAnimationEnd,\n ];\n}\n","import { useRef, useMemo } from 'react';\n\n/**\n * 逻辑分叉变量处理\n * 此 hook 不触发额外渲染\n */\nexport default function useForkedVariable<T>(initial: T, updater: (modify: (variable: T) => void) => void) {\n // 初始分叉变量\n const forkedRef = useRef(initial);\n\n function modify(next: T) {\n forkedRef.current = next;\n }\n\n useMemo(() => {\n // 参数变化之后同步内部分叉变量\n updater(modify);\n }, [initial]);\n\n return [forkedRef.current, modify] as const;\n}\n","import { useMemo } from 'react';\nimport type { DataType } from '../types';\n\n/**\n * 截取相邻三张图片\n */\nexport default function useAdjacentImages(images: DataType[], index: number, loop: boolean) {\n return useMemo(() => {\n const imageLength = images.length;\n if (loop) {\n const connected = images.concat(images).concat(images);\n return connected.slice(imageLength + index - 1, imageLength + index + 2);\n }\n return images.slice(Math.max(index - 1, 0), Math.min(index + 2, imageLength + 1));\n }, [images, index, loop]);\n}\n","import React, { useMemo, useRef } from 'react';\nimport type { DataType, PhotoProviderBase } from './types';\nimport useMethods from './hooks/useMethods';\nimport useSetState from './hooks/useSetState';\nimport PhotoContext from './photo-context';\nimport PhotoSlider from './PhotoSlider';\n\nexport interface PhotoProviderProps extends PhotoProviderBase {\n children: React.ReactNode;\n onIndexChange?: (index: number, state: PhotoProviderState) => void;\n onVisibleChange?: (visible: boolean, index: number, state: PhotoProviderState) => void;\n}\n\ntype PhotoProviderState = {\n images: DataType[];\n visible: boolean;\n index: number;\n};\n\nconst initialState: PhotoProviderState = {\n images: [],\n visible: false,\n index: 0,\n};\n\nexport default function PhotoProvider({ children, onIndexChange, onVisibleChange, ...restProps }: PhotoProviderProps) {\n const [state, updateState] = useSetState(initialState);\n const uniqueIdRef = useRef(0);\n const { images, visible, index } = state;\n\n const methods = useMethods({\n nextId() {\n return (uniqueIdRef.current += 1);\n },\n update(imageItem: DataType) {\n const currentIndex = images.findIndex((n) => n.key === imageItem.key);\n if (currentIndex > -1) {\n const nextImages = images.slice();\n nextImages.splice(currentIndex, 1, imageItem);\n updateState({\n images: nextImages,\n });\n return;\n }\n updateState((prev) => ({\n images: prev.images.concat(imageItem),\n }));\n },\n remove(key: number) {\n updateState((prev) => {\n const nextImages = prev.images.filter((item) => item.key !== key);\n const nextEndIndex = nextImages.length - 1;\n return {\n images: nextImages,\n index: Math.min(nextEndIndex, index),\n };\n });\n },\n show(key: number) {\n const currentIndex = images.findIndex((item) => item.key === key);\n updateState({\n visible: true,\n index: currentIndex,\n });\n if (onVisibleChange) {\n onVisibleChange(true, currentIndex, state);\n }\n },\n });\n\n const fn = useMethods({\n close() {\n updateState({\n visible: false,\n });\n\n if (onVisibleChange) {\n onVisibleChange(false, index, state);\n }\n },\n changeIndex(nextIndex: number) {\n updateState({\n index: nextIndex,\n });\n\n if (onIndexChange) {\n onIndexChange(nextIndex, state);\n }\n },\n });\n\n const value = useMemo(() => ({ ...state, ...methods }), [state, methods]);\n\n return (\n <PhotoContext.Provider value={value}>\n {children}\n <PhotoSlider\n images={images}\n visible={visible}\n index={index}\n onIndexChange={fn.changeIndex}\n onClose={fn.close}\n {...restProps}\n />\n </PhotoContext.Provider>\n );\n}\n","import type React from 'react';\nimport { useImperativeHandle, Children, cloneElement, useContext, useEffect, useMemo, useRef } from 'react';\nimport useInitial from './hooks/useInitial';\nimport useMethods from './hooks/useMethods';\nimport type { PhotoContextType } from './photo-context';\nimport PhotoContext from './photo-context';\nimport type { PhotoRenderParams } from './types';\n\nexport interface PhotoViewProps {\n /**\n * 图片地址\n */\n src?: string;\n /**\n * 自定义渲染,优先级比 src 低\n */\n render?: (props: PhotoRenderParams) => React.ReactNode;\n /**\n * 自定义覆盖节点\n */\n overlay?: React.ReactNode;\n /**\n * 自定义渲染节点宽度\n */\n width?: number;\n /**\n * 自定义渲染节点高度\n */\n height?: number;\n /**\n * 子节点,一般为缩略图\n */\n children?: React.ReactElement;\n /**\n * 触发的事件\n */\n triggers?: ('onClick' | 'onDoubleClick')[];\n}\n\nconst PhotoView: React.FC<PhotoViewProps> = ({\n src,\n render,\n overlay,\n width,\n height,\n triggers = ['onClick'],\n children,\n}) => {\n const photoContext = useContext<PhotoContextType>(PhotoContext);\n const key = useInitial(() => photoContext.nextId());\n const originRef = useRef<HTMLElement>(null);\n\n useImperativeHandle((children as React.FunctionComponentElement<HTMLElement>)?.ref, () => originRef.current);\n\n useEffect(() => {\n return () => {\n photoContext.remove(key);\n };\n }, []);\n\n function invokeChildrenFn(eventName: string, e: React.SyntheticEvent) {\n if (children) {\n const eventFn = children.props[eventName];\n if (eventFn) {\n eventFn(e);\n }\n }\n }\n\n const fn = useMethods({\n render(props: PhotoRenderParams) {\n return render && render(props);\n },\n show(eventName: string, e: React.MouseEvent) {\n photoContext.show(key);\n invokeChildrenFn(eventName, e);\n },\n });\n\n const eventListeners = useMemo(() => {\n const listener = {};\n triggers.forEach((eventName) => {\n listener[eventName] = fn.show.bind(null, eventName);\n });\n return listener;\n }, []);\n\n useEffect(() => {\n photoContext.update({\n key,\n src,\n originRef,\n render: fn.render,\n overlay,\n width,\n height,\n });\n }, [src]);\n\n if (children) {\n return Children.only(cloneElement(children, { ...eventListeners, ref: originRef }));\n }\n return null;\n};\n\nexport default PhotoView;\n","import { useRef } from 'react';\n\nexport default function useInitial<T extends (...args: any) => any>(callback: T) {\n const { current } = useRef({ sign: false, fn: undefined as ReturnType<T> });\n if (!current.sign) {\n current.sign = true;\n current.fn = callback();\n }\n return current.fn;\n}\n"],"names":["useMethods","fn","current","useRef","curr","undefined","Object","create","keys","forEach","key","_current$fn$key","call","apply","concat","slice","arguments","useSetState","initialState","useReducer","state","action","_extends","createContext","defaultEasing","horizontalOffset","isTouchDevice","window","limitNumber","value","min","max","Math","limitScale","scale","buffer","test","navigator","userAgent","useEffect","useLayoutEffect","useEventListener","type","options","latest","wrapper","evt","addEventListener","removeEventListener","_excluded","SlidePortal","_ref","_ref$container","container","document","body","rest","_objectWithoutPropertiesLoose","createPortal","React","createElement","CloseIcon","props","width","height","viewBox","d","ArrowLeft","ArrowRight","PreventScroll","style","lastOverflow","overflow","getMultipleTouchPosition","_evt$touches$","touches","clientX","clientY","length","_evt$touches$2","nextClientX","nextClientY","sqrt","pow","computePositionEdge","position","size","innerSize","closedEdge","currentWidth","outOffset","getPositionOnMoveOrScale","x","y","toScale","offsetX","offsetY","innerWidth","innerHeight","closedEdgeX","_computePositionEdge2","centerClientX","centerClientY","lastCX","lastCY","getRotateSize","rotate","isVertical","getSuitableImageSize","naturalWidth","naturalHeight","_getRotateSize","currentHeight","autoWidth","autoHeight","pause","useDebounceCallback","callback","_ref$leading","leading","maxWait","_ref$wait","wait","callbackRef","prev","trailingTimeout","clearTrailing","clearTimeout","useCallback","args","now","Date","last","offset","setTimeout","cancel","rebound","start","bound","easeOutMove","defaultSpeed","t","easeOutQuart","end","speed","easing","complete","distance","startTime","frameId","calcMove","time","raf","cancelAnimationFrame","requestAnimationFrame","initialRect","T","L","W","H","FIT","useMountedRef","mountedRef","Spinner","_ref$className","className","fill","opacity","Photo","src","loaded","broken","onPhotoLoad","loadingElement","brokenElement","restProps","Fragment","onLoad","e","_e$target","target","onError","draggable","alt","touched","maskTouched","CX","CY","lastX","lastY","lastScale","touchTime","touchLength","stopRaf","reach","PhotoBox","_ref$item","item","render","_ref$item$width","customWidth","_ref$item$height","customHeight","originRef","visible","wrapClassName","onPhotoTap","onMaskTap","onReachMove","onReachUp","onPhotoResize","isActive","expose","_useSetState","updateState","initialTouchRef","mounted","_state$naturalWidth","_state$naturalHeight","_state$width","_state$height","_state$loaded","onScale","onRotate","handleMove","currentTouchLength","isStillX","abs","isStillY","currentReach","horizontalCloseEdge","initialTouchState","verticalCloseEdge","reachPosition","getReachType","updateRaf","singleTap","doubleTap","continuousClick","debounceTap","callbackX","callbackY","callbackS","slideToPosition","nextX","nextY","nextScale","X","spatial","Y","S","safeScale","touchedTime","_computePositionEdge","beginEdgeX","beginX","beginEdgeY","beginY","moveTime","_getPositionOnMoveOrS","targetX","targetY","speedX","speedY","speedT","edgeX","edgeY","initialSpeed","lastTime","v","s","dt","direction","sign","a","f","ds","caf","scrollMove","_computePositionEdge3","isEdgeX","currentX","_computePositionEdge4","isEdgeY","currentY","resultX","resultY","handlePhotoTap","currentClientX","currentClientY","handleUp","handleStart","handleMaskStart","preventDefault","passive","_ref2","touch","changedTouches","useIsomorphicLayoutEffect","_useAnimationPosition","updateEasing","_useTargetScale","realWidth","realHeight","realScale","execRef","lead","_useSetState$","moveScale","Promise","resolve","reject","useTargetScale","autoScale","_useAnimationOrigin","_useState","useState","originRect","updateOriginRect","_useState2","easingMode","updateEasingMode","initialTime","OK","handleToShape","currentShape","element","nodeType","_element$getBoundingC","getBoundingClientRect","top","left","tagName","getComputedStyle","objectFit","handleUpdateOrigin","useAnimationOrigin","centerWidth","centerHeight","miniMode","useAnimationPosition","isPause","currentScale","transitionCSS","attrs","onMouseDown","stopPropagation","button","onTouchStart","onWheel","deltaY","transform","transition","translateX","translateY","willChange","params","bg","lastBg","overlay","minimal","PhotoSlider","_props$loop","loop","speedFn","easingFn","photoClosable","_props$maskClosable","maskClosable","_props$maskOpacity","maskOpacity","defaultOpacity","_props$pullClosable","pullClosable","_props$bannerVisible","bannerVisible","overlayRender","toolbarRender","maskClassName","photoClassName","photoWrapClassName","images","_props$index","index","controlledIndex","controlledIndexChange","onIndexChange","onClose","afterClose","portalContainer","innerIndex","updateInnerIndex","_state$bg","isControlled","hasOwnProperty","virtualIndexRef","imageLength","currentImage","enableLoop","_useAnimationVisible","handleRender","c","activeAnimation","_useForkedVariable","initial","forkedRef","modify","next","useMemo","updater","useForkedVariable","modifyRealVisible","useAnimationVisible","realVisible","onAnimationEnd","_useMethods","close","changeIndex","nextIndex","currentIndex","limitIndex","nextVirtualIndex","singlePageWidth","closeable","handleResize","handleReachMove","originOffsetClientX","offsetClientX","handleReachHorizontalMove","handleReachVerticalMove","handleReachUp","offsetClientY","willClose","currentTranslateX","adjacentImages","useAdjacentImages","currentOverlayVisible","currentOpacity","overlayParams","overlayVisible","currentSpeed","currentEasing","slideSpeed","slideEasing","role","onClick","background","transitionTimingFunction","transitionDuration","animationDuration","map","PhotoProvider","children","onVisibleChange","uniqueIdRef","methods","nextId","update","imageItem","findIndex","n","nextImages","splice","remove","filter","show","PhotoContext","Provider","PhotoView","_ref$triggers","triggers","photoContext","useContext","useImperativeHandle","ref","eventName","eventFn","invokeChildrenFn","eventListeners","listener","bind","Children","only","cloneElement"],"mappings":"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"}