@6thquake/react-material
Version:
React components that implement Google's Material Design.
278 lines (241 loc) • 7.28 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
var _classnames = _interopRequireDefault(require("classnames"));
var styles = function styles(theme) {
return {
root: {
pointerEvents: 'none',
position: 'fixed',
zIndex: theme.zIndex.tooltip + 1,
top: 0,
left: 0,
right: 0,
bottom: 0,
width: '100%',
height: '100%',
background: 'transparent'
},
canvas: {
display: 'none'
},
mark: {
position: 'fixed',
width: '100%',
height: '100%',
backgroundRepeat: 'no-repeat'
},
text: {
fontFamily: theme.typography.fontFamily,
visibility: 'hidden'
},
stretch: {
backgroundRepeat: 'repeat'
},
'bottom-end': {
backgroundPosition: 'bottom 0px right 0px'
},
'bottom-start': {
backgroundPosition: 'bottom 0px left 0px'
},
bottom: {
backgroundPosition: 'bottom'
},
'left-end': {
backgroundPosition: 'bottom 0px left 0px'
},
'left-start': {
backgroundPosition: 'top 0px left 0px'
},
left: {
backgroundPosition: 'left'
},
'right-end': {
backgroundPosition: 'bottom 0px right 0px'
},
'right-start': {
backgroundPosition: 'top 0px right 0px'
},
right: {
backgroundPosition: 'right'
},
'top-end': {
backgroundPosition: 'top 0px right 0px'
},
'top-start': {
backgroundPosition: 'top 0px left 0px'
},
top: {
backgroundPosition: 'top'
},
center: {
backgroundPosition: 'center'
}
};
};
var Watermark =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(Watermark, _React$Component);
function Watermark() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, Watermark);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Watermark)).call.apply(_getPrototypeOf2, [this].concat(args)));
_this.state = {
mark: ''
};
_this.canvas = null;
return _this;
}
(0, _createClass2.default)(Watermark, [{
key: "componentDidMount",
value: function componentDidMount() {
this.ctx = this.canvas.getContext('2d');
this.draw();
}
}, {
key: "draw",
value: function draw() {
var ctx = this.ctx;
if (!ctx) {
return;
}
var _this$props = this.props,
placement = _this$props.placement,
text = _this$props.text,
fontSize = _this$props.fontSize,
fontColor = _this$props.fontColor,
spacing = _this$props.spacing,
theme = _this$props.theme;
var degree = this.props.degree;
if (Math.abs(degree) >= 180) {
degree %= 180;
}
if (placement !== 'stretch') {
degree = 0;
}
var deg = degree * Math.PI / 180;
var _this$textDom$getBoun = this.textDom.getBoundingClientRect(),
width = _this$textDom$getBoun.width,
height = _this$textDom$getBoun.height;
var width2 = Math.cos(deg) * width + Math.sin(deg) * height + Math.sin(deg) * spacing;
var height2 = Math.sin(deg) * width + Math.cos(deg) * height + Math.cos(deg) * spacing;
this.canvas.width = width2;
this.canvas.height = height2;
ctx.rotate(deg);
ctx.font = "".concat(fontSize, "px ").concat(theme.typography.fontFamily);
ctx.fillStyle = fontColor;
ctx.fillText(text, Math.sin(deg) * spacing, Math.cos(deg) * spacing);
var mark = this.canvas.toDataURL('image/png', 1);
this.setState({
mark: mark
});
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var mark = this.state.mark;
var _this$props2 = this.props,
placement = _this$props2.placement,
container = _this$props2.container,
text = _this$props2.text,
fontSize = _this$props2.fontSize,
spacing = _this$props2.spacing,
classes = _this$props2.classes;
var position = container === 'window' ? 'fixed' : 'absolute';
var positionStyle = {
position: position
};
var style = (0, _extends2.default)({}, positionStyle);
var canvasStyle = {// width: size,
// height: size,
};
var imgStyle = (0, _extends2.default)({}, positionStyle, {
'background-image': "url(".concat(mark, ")")
});
return _react.default.createElement("div", {
className: classes.root,
style: style
}, mark && _react.default.createElement("div", {
className: (0, _classnames.default)(classes.mark, classes[placement]),
style: imgStyle
}), _react.default.createElement("canvas", {
ref: function ref(e) {
_this2.canvas = e;
},
className: classes.canvas,
style: canvasStyle
}), _react.default.createElement("span", {
ref: function ref(e) {
_this2.textDom = e;
},
className: classes.text,
style: {
fontSize: fontSize,
margin: spacing
}
}, text));
}
}]);
return Watermark;
}(_react.default.Component);
Watermark.defaultProps = {
text: '',
placement: 'stretch',
container: 'window',
fontSize: 14,
fontColor: 'rgba(0, 0, 0, 0.12)',
degree: 45,
spacing: 8
};
Watermark.propTypes = {
/**
* relative placement of text
*/
container: _propTypes.default.oneOf(['parent', 'window']),
/**
* tilt angle of text
*/
degree: _propTypes.default.number,
/**
* font color
*/
fontColor: _propTypes.default.string,
/**
* font size
*/
fontSize: _propTypes.default.number,
/**
* Where the text is placed
*/
placement: _propTypes.default.oneOf(['stretch', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
/**
* spacing among text
*/
spacing: _propTypes.default.number,
/**
* the text
*/
text: _propTypes.default.string
};
var _default = (0, _withStyles.default)(styles, {
withTheme: true
})(Watermark);
exports.default = _default;