@uiw/react-signature
Version:
A signature board component for react.
89 lines • 3.17 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
var _excluded = ["className", "prefixCls", "style", "readonly", "onPointer", "children"];
import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react';
import { getBoundingClientRect, getClinetXY, defaultStyle, useEvent } from "./utils.js";
import { useDispatch } from "./store.js";
import { jsx as _jsx } from "react/jsx-runtime";
export var Signature = /*#__PURE__*/forwardRef((props, ref) => {
var {
className,
prefixCls = 'w-signature',
style,
readonly = false,
onPointer,
children
} = props,
others = _objectWithoutPropertiesLoose(props, _excluded);
var cls = [className, prefixCls].filter(Boolean).join(' ');
var $svg = useRef(null);
var $path = useRef();
var pointsRef = useRef();
var pointCount = useRef(0);
var pointId = useId();
var dispatch = useDispatch();
useImperativeHandle(ref, () => ({
svg: $svg.current,
dispatch,
clear: () => dispatch({})
}), [$svg.current, dispatch]);
var handlePointerDown = useEvent(e => {
if (readonly) return;
pointCount.current += 1;
var {
offsetY,
offsetX
} = getBoundingClientRect($svg.current);
var evn = e;
var clientX = evn.clientX || evn.nativeEvent.clientX;
var clientY = evn.clientY || evn.nativeEvent.clientY;
pointsRef.current = [[clientX - offsetX, clientY - offsetY]];
var pathElm = document.createElementNS('http://www.w3.org/2000/svg', 'path');
$path.current = pathElm;
$svg.current.appendChild(pathElm);
dispatch({
[pointId + pointCount.current]: pointsRef.current
});
document.addEventListener('pointermove', handlePointerMove);
});
var handlePointerMove = useEvent(e => {
if ($path.current) {
var {
offsetY,
offsetX
} = getBoundingClientRect($svg.current);
var {
clientX,
clientY
} = getClinetXY(e);
pointsRef.current = [...pointsRef.current, [clientX - offsetX, clientY - offsetY]];
dispatch({
[pointId + pointCount.current]: pointsRef.current
});
}
});
var handlePointerUp = useEvent(() => {
var result = pointsRef.current || [];
onPointer && props.onPointer(result);
$path.current = undefined;
pointsRef.current = undefined;
document.removeEventListener('pointermove', handlePointerMove);
});
useEffect(() => {
var _$svg$current;
document.addEventListener('pointerup', handlePointerUp);
(_$svg$current = $svg.current) == null || _$svg$current.addEventListener('pointerdown', handlePointerDown);
return () => {
var _$svg$current2;
document.removeEventListener('pointerup', handlePointerUp);
(_$svg$current2 = $svg.current) == null || _$svg$current2.removeEventListener('pointerdown', handlePointerDown);
};
}, []);
var svgStyle = _extends({}, defaultStyle, style);
return /*#__PURE__*/_jsx("svg", _extends({}, others, {
ref: $svg,
className: cls,
style: svgStyle,
children: children
}));
});