Also added fronmatter for interactive: true to turn on React on a file by file basis and prevent slowing down the builds for non-react files
57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
const React = require('react')
|
|
const ReactDOM = require('react-dom')
|
|
const { useState, useEffect } = require('react')
|
|
|
|
const Timer = () => {
|
|
const [seconds, setSeconds] = useState(0);
|
|
const [isActive, setIsActive] = useState(false);
|
|
|
|
function toggle() {
|
|
setIsActive(!isActive);
|
|
}
|
|
|
|
function reset() {
|
|
setSeconds(0);
|
|
setIsActive(false);
|
|
}
|
|
|
|
useEffect(() => {
|
|
let interval = null;
|
|
if (isActive) {
|
|
interval = setInterval(() => {
|
|
setSeconds(seconds => seconds + 1);
|
|
}, 1000);
|
|
} else if (!isActive && seconds !== 0) {
|
|
clearInterval(interval);
|
|
}
|
|
return () => clearInterval(interval);
|
|
}, [isActive, seconds]);
|
|
|
|
return (
|
|
<div className="app">
|
|
<div className="time">
|
|
{seconds}s
|
|
</div>
|
|
<div className="row">
|
|
<button className={`button button-primary button-primary-${isActive ? 'active' : 'inactive'}`} onClick={toggle}>
|
|
{isActive ? 'Pause' : 'Start'}
|
|
</button>
|
|
<button className="button" onClick={reset}>
|
|
Reset
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
if (typeof window === 'undefined') {
|
|
} else {
|
|
const componentContainers = document.querySelectorAll('.react-component-Timer')
|
|
|
|
for (const componentContainer of componentContainers) {
|
|
ReactDOM.render(React.createElement(Timer, {}, componentContainer.children[0].innerText), componentContainer)
|
|
}
|
|
}
|
|
|
|
module.exports = Timer
|