@uiw/react-signature
Version:
A signature board component for react.
110 lines (109 loc) • 5.33 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.defaultStyle = exports.Signature = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _utils = require("../utils");
var _store = require("../store");
var _options = require("../options");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["className", "prefixCls", "style", "readonly", "onPointer", "options", "children"];
var defaultStyle = exports.defaultStyle = {
'--w-signature-background': '#fff',
touchAction: 'none',
position: 'relative',
backgroundColor: 'var(--w-signature-background)'
};
var Signature = exports.Signature = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
var className = props.className,
_props$prefixCls = props.prefixCls,
prefixCls = _props$prefixCls === void 0 ? 'w-signature' : _props$prefixCls,
style = props.style,
_props$readonly = props.readonly,
readonly = _props$readonly === void 0 ? false : _props$readonly,
onPointer = props.onPointer,
options = props.options,
children = props.children,
others = (0, _objectWithoutProperties2["default"])(props, _excluded);
var cls = [className, prefixCls].filter(Boolean).join(' ');
var $canvas = (0, _react.useRef)(null);
var $path = (0, _react.useRef)();
var pointsRef = (0, _react.useRef)();
var pointCount = (0, _react.useRef)(0);
var pointId = (0, _react.useId)();
var dispatch = (0, _store.useDispatch)();
var dispatchOption = (0, _options.useOptionDispatch)();
(0, _react.useImperativeHandle)(ref, function () {
return {
canvas: $canvas.current,
dispatch: dispatch,
clear: function clear() {
var _$canvas$current, _$canvas$current2, _$canvas$current3;
dispatch({});
var ctx = (_$canvas$current = $canvas.current) === null || _$canvas$current === void 0 ? void 0 : _$canvas$current.getContext('2d');
ctx === null || ctx === void 0 || ctx.clearRect(0, 0, ((_$canvas$current2 = $canvas.current) === null || _$canvas$current2 === void 0 ? void 0 : _$canvas$current2.width) || 0, ((_$canvas$current3 = $canvas.current) === null || _$canvas$current3 === void 0 ? void 0 : _$canvas$current3.height) || 0);
}
};
}, [$canvas.current, dispatch]);
var handlePointerDown = (0, _utils.useEvent)(function (e) {
if (readonly) return;
pointCount.current += 1;
var _getBoundingClientRec = (0, _utils.getBoundingClientRect)($canvas.current),
offsetY = _getBoundingClientRec.offsetY,
offsetX = _getBoundingClientRec.offsetX;
var clientX = e.clientX || e.nativeEvent.clientX;
var clientY = e.clientY || e.nativeEvent.clientY;
pointsRef.current = [[clientX - offsetX, clientY - offsetY]];
var pathElm = document.createElementNS('http://www.w3.org/2000/svg', 'path');
$path.current = pathElm;
$canvas.current.appendChild(pathElm);
dispatch((0, _defineProperty2["default"])({}, pointId + pointCount.current, pointsRef.current));
});
var handlePointerMove = (0, _utils.useEvent)(function (e) {
if ($path.current) {
var _getBoundingClientRec2 = (0, _utils.getBoundingClientRect)($canvas.current),
offsetY = _getBoundingClientRec2.offsetY,
offsetX = _getBoundingClientRec2.offsetX;
var _getClinetXY = (0, _utils.getClinetXY)(e),
clientX = _getClinetXY.clientX,
clientY = _getClinetXY.clientY;
pointsRef.current = [].concat((0, _toConsumableArray2["default"])(pointsRef.current), [[clientX - offsetX, clientY - offsetY]]);
dispatch((0, _defineProperty2["default"])({}, pointId + pointCount.current, pointsRef.current));
}
});
var handlePointerUp = (0, _utils.useEvent)(function () {
var result = pointsRef.current || [];
onPointer && props.onPointer(result);
$path.current = undefined;
pointsRef.current = undefined;
});
(0, _react.useEffect)(function () {
if ($canvas.current) {
dispatchOption({
container: $canvas.current
});
}
if (readonly) return;
document.addEventListener('pointermove', handlePointerMove);
document.addEventListener('pointerup', handlePointerUp);
return function () {
if (readonly) return;
document.removeEventListener('pointermove', handlePointerMove);
document.removeEventListener('pointerup', handlePointerUp);
};
}, []);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("canvas", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, others), {}, {
ref: $canvas,
className: cls,
onPointerDown: handlePointerDown,
style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, defaultStyle), style),
children: children
}));
});