UNPKG

@instructure/quiz-interactions

Version:

A React UI component Library for quiz interaction types.

108 lines (89 loc) 2.68 kB
import React, {Component} from 'react' import '../ellipsePolyfill' import Canvas from '../Canvas' import canvasPropTypes, {pickProps, defaultProps} from '../Canvas/propTypes' export default class Oval extends Component { static propTypes = canvasPropTypes static defaultProps = defaultProps canvasRef = node => { this.canvas = node } __getOvalCoordinates(e) { const startPoint = this.canvas.getInitialCoordinate() const x2 = e.nativeEvent.offsetX const y2 = e.nativeEvent.offsetY return [startPoint, {x: x2, y: y2}] } // this type needs exactly 2 coordinates to draw a ellipsis drawShape = (coordinates = []) => { if (coordinates.length === 2) { const ctx = this.canvas.canvasElement.getContext('2d') const pointA = coordinates[0] const pointB = coordinates[1] const radiusX = (pointB.x - pointA.x) * 0.5 const radiusY = (pointB.y - pointA.y) * 0.5 const centerX = pointA.x + radiusX const centerY = pointA.y + radiusY this.canvas.setFillStyle() // content ctx.beginPath() ctx.ellipse(centerX, centerY, Math.abs(radiusX), Math.abs(radiusY), 0, 0, 2 * Math.PI) ctx.fill() this.canvas.setStrokeStyle() // border ctx.stroke() } } // =========== // ACTIONS // =========== onMouseMove = e => { if (this.canvas.isDrawing()) { const coordinates = this.__getOvalCoordinates(e) this.canvas.drawShape(coordinates) } } onMouseDown = e => { if (!this.canvas.isDrawing()) { this.canvas.startDrawing(e) } } onMouseUp = e => { if (this.canvas.isDrawing()) { const coordinates = this.__getOvalCoordinates(e) const c1 = coordinates[0] const c2 = coordinates[1] // if the release is not at the same position if (c1.x !== c2.x || c1.y !== c2.y) { this.canvas.stopDrawing(coordinates) } } } onTouchStart = e => { e.preventDefault() const evt = this.canvas.convertTouchCoordinates(e) this.onMouseDown(evt) } onTouchMove = e => { const evt = this.canvas.convertTouchCoordinates(e) this.onMouseMove(evt) } onTouchEnd = e => { e.preventDefault() const evt = this.canvas.convertTouchCoordinates(e) this.onMouseUp(evt) } render() { return ( <Canvas realRef={this.canvasRef} drawShape={this.drawShape} onMouseMove={this.onMouseMove} onMouseDown={this.onMouseDown} onMouseUp={this.onMouseUp} onTouchStart={this.onTouchStart} onTouchMove={this.onTouchMove} onTouchEnd={this.onTouchEnd} {...pickProps(this.props)} /> ) } }