import emojify from '../emoji';
import escapeTextContentForBrowser from 'escape-html';
import ImmutablePureComponent from 'react-immutable-pure-component';
+import scheduleIdleTask from '../features/ui/util/schedule_idle_task';
class Status extends ImmutablePureComponent {
const isIntersecting = entry.intersectionRatio > 0;
this.setState((prevState) => {
if (prevState.isIntersecting && !isIntersecting) {
- requestIdleCallback(this.hideIfNotIntersecting);
+ scheduleIdleTask(this.hideIfNotIntersecting);
}
return {
isIntersecting: isIntersecting,
--- /dev/null
+// Wrapper to call requestIdleCallback() to schedule low-priority work.
+// See https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API
+// for a good breakdown of the concepts behind this.
+
+import Queue from 'tiny-queue';
+
+const taskQueue = new Queue();
+let runningRequestIdleCallback = false;
+
+function runTasks(deadline) {
+ while (taskQueue.length && deadline.timeRemaining() > 0) {
+ taskQueue.shift()();
+ }
+ if (taskQueue.length) {
+ requestIdleCallback(runTasks);
+ } else {
+ runningRequestIdleCallback = false;
+ }
+}
+
+function scheduleIdleTask(task) {
+ taskQueue.push(task);
+ if (!runningRequestIdleCallback) {
+ runningRequestIdleCallback = true;
+ requestIdleCallback(runTasks);
+ }
+}
+
+export default scheduleIdleTask;
"stringz": "^0.2.0",
"style-loader": "^0.16.1",
"throng": "^4.0.0",
+ "tiny-queue": "^0.2.1",
"uuid": "^3.0.1",
"uws": "^0.14.5",
"webpack": "^2.5.1",
version "1.0.2"
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-1.0.2.tgz#8e49470d3f55f89e247210368a6bb9fb51aa1601"
+tiny-queue@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
+
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"