import React, { Component } from 'react' import { Route } from 'react-router-dom' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' import { session } from '../../../session' import actions from '../../../actions' import * as graphActions from '../graph.actions' import { Loader } from '../../../common' import { clamp } from '../../../util' const defaultState = { dragging: false, bounds: null, mouseX: 0, mouseY: 0, box: { x: 0, y: 0, w: 0, h: 0, }, page: null, } class GraphEditor extends Component { state = { ...defaultState, } constructor() { super() // bind these events in the constructor, so we can remove event listeners later this.handleMouseDown = this.handleMouseDown.bind(this) this.handleMouseMove = this.handleMouseMove.bind(this) this.handleMouseUp = this.handleMouseUp.bind(this) this.handleWindowResize = this.handleWindowResize.bind(this) this.graphRef = React.createRef() } getBoundingClientRect() { if (!this.graphRef.current) return null const rect = this.graphRef.current.getBoundingClientRect() const scrollTop = document.body.scrollTop || document.body.parentNode.scrollTop const scrollLeft = document.body.scrollLeft || document.body.parentNode.scrollLeft const bounds = { top: rect.top + scrollTop, left: rect.left + scrollLeft, width: rect.width, height: rect.height, } // console.log(bounds) return bounds } componentDidMount() { document.body.addEventListener('mousemove', this.handleMouseMove) document.body.addEventListener('mouseup', this.handleMouseUp) window.addEventListener('resize', this.handleWindowResize) this.setState({ bounds: this.getBoundingClientRect() }) } componentDidUpdate(prevProps) { if (!this.state.bounds) { this.setState({ bounds: this.getBoundingClientRect() }) } } handleWindowResize() { this.setState({ bounds: this.getBoundingClientRect() }) } handleMouseDown(e, page) { const bounds = this.getBoundingClientRect() const mouseX = e.pageX const mouseY = e.pageY let w = 128 / bounds.width let h = 16 / bounds.height let { x, y } = page.settings x = clamp(x, 0, 1) y = clamp(y, 0, 1) this.setState({ page, draggingBox: true, bounds, mouseX, mouseY, box: { x, y, w, h, }, initialBox: { x, y, w, h, } }) } handleMouseMove(e) { const { dragging, draggingBox, bounds, mouseX, mouseY, initialBox, box } = this.state if (draggingBox) { e.preventDefault() let { x, y, w, h } = initialBox let dx = (e.pageX - mouseX) / bounds.width let dy = (e.pageY - mouseY) / bounds.height this.setState({ box: { x: clamp(x + dx, 0, 1.0 - w), y: clamp(y + dy, 0, 1.0 - h), w, h, } }) } } handleMouseUp(e) { // const { actions } = this.props const { dragging, draggingBox, bounds, box, page } = this.state if (!dragging && !draggingBox) return e.preventDefault() const { x, y, w, h } = box let url = window.location.pathname this.setState({ page: null, box: null, initialBox: null, dragging: false, draggingBox: false, }) // console.log(page) const updatedPage = { ...page, settings: { ...page.settings, x, y, } } this.props.graphActions.updateGraphPage(updatedPage) actions.page.update(updatedPage) } render(){ // console.log(this.props.graph.show.res) const currentPage = this.state.page const currentBox = this.state.box const { res } = this.props.graph.show // console.log(res.pages) return (
{this.state.bounds && res.pages.map(page => ( this.handleMouseDown(e, page)} /> ))}
) } } const PageHandle = ({ page, bounds, box, onMouseDown }) => { let style; if (box) { style = { top: (bounds.height) * box.y, left: (bounds.width) * box.x, } } else { style = { top: (bounds.height) * Math.min(page.settings.y, 0.95), left: (bounds.width) * Math.min(page.settings.x, 0.95), } } // console.log(style) return (
{page.title}
) } const mapStateToProps = state => ({ graph: state.graph, }) const mapDispatchToProps = dispatch => ({ graphActions: bindActionCreators({ ...graphActions }, dispatch), }) export default connect(mapStateToProps, mapDispatchToProps)(GraphEditor)