diff --git a/src/components/Modtools.jsx b/src/components/Modtools.jsx index 0eec28c..8d94c09 100644 --- a/src/components/Modtools.jsx +++ b/src/components/Modtools.jsx @@ -7,6 +7,7 @@ import React, { useState, useEffect } from 'react'; import { useSelector, shallowEqual } from 'react-redux'; import { t } from 'ttag'; +import useInterval from './hooks/useInterval'; import { getToday, dateToString } from '../core/utils'; const keptState = { @@ -277,6 +278,12 @@ function Modtools() { } }, []); + useInterval(() => { + if (userlvl > 0) { + getCleanerStats((stats) => setCleanerStats(stats)); + } + }, 10000); + const cleanerStatusString = (!cleanerstats.running) ? t`Status: Not running` // eslint-disable-next-line max-len @@ -625,6 +632,14 @@ function Modtools() { tlccoords, brccoords, (ret) => { + setCleanerStats({ + running: true, + percent: 'N/A', + method: cleanAction, + tl: tlccoords, + br: brccoords, + canvasId: selectedCanvas, + }); setSubmitting(false); setResp(ret); }, diff --git a/src/components/hooks/useInterval.js b/src/components/hooks/useInterval.js new file mode 100644 index 0000000..6fe50f6 --- /dev/null +++ b/src/components/hooks/useInterval.js @@ -0,0 +1,24 @@ +import { useEffect, useRef } from 'react'; + +function useInterval(callback, delay) { + const savedCallback = useRef(); + + // Remember the latest callback. + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + // eslint-disable-next-line consistent-return + useEffect(() => { + function tick() { + savedCallback.current(); + } + if (delay !== null) { + const id = setInterval(tick, delay); + return () => clearInterval(id); + } + }, [delay]); +} + +export default useInterval; diff --git a/src/core/CanvasCleaner.js b/src/core/CanvasCleaner.js index 87f75de..b53ac1a 100644 --- a/src/core/CanvasCleaner.js +++ b/src/core/CanvasCleaner.js @@ -28,24 +28,24 @@ const METHODS = { * of chunk area */ spare: (xc, yc, clrIgnore, canvasCleaner) => { + let pxl = canvasCleaner.getPixelInChunkArea(xc, yc); + if (pxl === null || pxl < clrIgnore) { + return null; + } let rplPxl = null; for (let u = -1; u <= 1; u += 1) { for (let v = -1; v <= 1; v += 1) { - const pxl = canvasCleaner.getPixelInChunkArea(xc + u, yc + v); - if (pxl === null) { + pxl = canvasCleaner.getPixelInChunkArea(xc + u, yc + v); + if (pxl === null + || (u === 0 && v === 0) + ) { continue; } - if (u === 0 && v === 0) { - if (pxl < clrIgnore) { - return null; - } - } else { - if (pxl >= clrIgnore) { - return null; - } - if (rplPxl === null) { - rplPxl = pxl; - } + if (pxl >= clrIgnore) { + return null; + } + if (rplPxl === null) { + rplPxl = pxl; } } } @@ -53,32 +53,33 @@ const METHODS = { }, spareext: (xc, yc, clrIgnore, canvasCleaner) => { + let pxl = canvasCleaner.getPixelInChunkArea(xc, yc); + if (pxl === null || pxl < clrIgnore) { + return null; + } let rplPxl = null; - let origPxl = null; + const origPxl = pxl; for (let u = -1; u <= 1; u += 1) { for (let v = -1; v <= 1; v += 1) { - const pxl = canvasCleaner.getPixelInChunkArea(xc + u, yc + v); - if (pxl === null) { + pxl = canvasCleaner.getPixelInChunkArea(xc + u, yc + v); + if (pxl === null + || (u === 0 && v === 0) + ) { continue; } - if (u === 0 && v === 0) { - if (pxl < clrIgnore || pxl === rplPxl) { - return null; - } - origPxl = pxl; - } else { - if (rplPxl === null) { - rplPxl = pxl; - } - if (pxl >= clrIgnore) { - if (rplPxl < clrIgnore) { - rplPxl = pxl; - continue; - } - if (pxl !== rplPxl) { - return null; - } - } + if (rplPxl === null) { + rplPxl = pxl; + continue; + } + if (pxl < clrIgnore) { + continue; + } + if (rplPxl < clrIgnore) { + rplPxl = pxl; + continue; + } + if (pxl !== rplPxl) { + return null; } } }