You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.7 KiB
120 lines
2.7 KiB
import React, { Component } from 'react'; |
|
import Pressure from 'pressure'; |
|
|
|
import './PressureHelper.css'; |
|
|
|
const THRESHOLD = 0.4; |
|
const MULTIPLIER = 25; |
|
const BORDER_WIDTH = 500; // also change css! |
|
|
|
export class PressureHelper extends Component { |
|
constructor(props) { |
|
super(props); |
|
this.state = { |
|
level: 0, |
|
fired: false, |
|
}; |
|
this.callback = props.callback; |
|
this.esc_interval = null; |
|
} |
|
|
|
do_fire() { |
|
if (this.esc_interval) { |
|
clearInterval(this.esc_interval); |
|
this.esc_interval = null; |
|
} |
|
this.setState({ |
|
level: 1, |
|
fired: true, |
|
}); |
|
this.callback(); |
|
window.setTimeout(() => { |
|
this.setState({ |
|
level: 0, |
|
fired: false, |
|
}); |
|
}, 300); |
|
} |
|
|
|
componentDidMount() { |
|
if (window.config.pressure) { |
|
Pressure.set( |
|
document.body, |
|
{ |
|
change: (force) => { |
|
if (!this.state.fired) { |
|
if (force >= 0.999) { |
|
this.do_fire(); |
|
} else |
|
this.setState({ |
|
level: force, |
|
}); |
|
} |
|
}, |
|
end: () => { |
|
this.setState({ |
|
level: 0, |
|
fired: false, |
|
}); |
|
}, |
|
}, |
|
{ |
|
polyfill: false, |
|
only: 'touch', |
|
preventSelect: false, |
|
}, |
|
); |
|
|
|
document.addEventListener('keydown', (e) => { |
|
if (!e.repeat && e.key === 'Escape') { |
|
if (this.esc_interval) clearInterval(this.esc_interval); |
|
this.setState( |
|
{ |
|
level: THRESHOLD / 2, |
|
}, |
|
() => { |
|
this.esc_interval = setInterval(() => { |
|
let new_level = this.state.level + 0.1; |
|
if (new_level >= 0.999) this.do_fire(); |
|
else |
|
this.setState({ |
|
level: new_level, |
|
}); |
|
}, 30); |
|
}, |
|
); |
|
} |
|
}); |
|
document.addEventListener('keyup', (e) => { |
|
if (e.key === 'Escape') { |
|
if (this.esc_interval) { |
|
clearInterval(this.esc_interval); |
|
this.esc_interval = null; |
|
} |
|
this.setState({ |
|
level: 0, |
|
}); |
|
} |
|
}); |
|
} |
|
} |
|
|
|
render() { |
|
const pad = MULTIPLIER * (this.state.level - THRESHOLD) - BORDER_WIDTH; |
|
return ( |
|
<div |
|
className={ |
|
'pressure-box' + |
|
(this.state.fired ? ' pressure-box-fired' : '') + |
|
(this.state.level <= 0.0001 ? ' pressure-box-empty' : '') |
|
} |
|
style={{ |
|
left: pad, |
|
right: pad, |
|
top: pad, |
|
bottom: pad, |
|
}} |
|
/> |
|
); |
|
} |
|
}
|
|
|