DEV: Use resize observer (#25)
This commit is contained in:
@@ -2,42 +2,25 @@ import Component from "@glimmer/component";
|
|||||||
import { tracked } from "@glimmer/tracking";
|
import { tracked } from "@glimmer/tracking";
|
||||||
import { action } from "@ember/object";
|
import { action } from "@ember/object";
|
||||||
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
|
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
|
||||||
import { cancel, throttle } from "@ember/runloop";
|
|
||||||
import { htmlSafe } from "@ember/template";
|
import { htmlSafe } from "@ember/template";
|
||||||
import { bind } from "discourse/lib/decorators";
|
import { bind } from "discourse/lib/decorators";
|
||||||
|
|
||||||
export default class ExperimentalScreen extends Component {
|
export default class ExperimentalScreen extends Component {
|
||||||
@tracked left = 0;
|
@tracked left = 0;
|
||||||
@tracked right = 0;
|
@tracked right = 0;
|
||||||
|
resizeObserver;
|
||||||
|
|
||||||
willDestroy() {
|
willDestroy() {
|
||||||
super.willDestroy(...arguments);
|
super.willDestroy(...arguments);
|
||||||
cancel(this._throttledCalculateDistanceHandler);
|
this.resizeObserver.disconnect();
|
||||||
}
|
|
||||||
|
|
||||||
getDistance(element) {
|
|
||||||
const rect = element.getBoundingClientRect();
|
|
||||||
return rect;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@bind
|
@bind
|
||||||
calculateDistance() {
|
calculateDistance(element) {
|
||||||
this._throttledCalculateDistanceHandler = throttle(
|
const distance = element.getBoundingClientRect();
|
||||||
this,
|
|
||||||
this._throttledCalculateDistance,
|
|
||||||
50
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_throttledCalculateDistance() {
|
|
||||||
const element = document.getElementById("main-outlet");
|
|
||||||
|
|
||||||
if (element) {
|
|
||||||
const distance = this.getDistance(element);
|
|
||||||
this.left = distance.left;
|
this.left = distance.left;
|
||||||
this.right = distance.right;
|
this.right = distance.right;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
get distanceStyles() {
|
get distanceStyles() {
|
||||||
return htmlSafe(
|
return htmlSafe(
|
||||||
@@ -46,9 +29,16 @@ export default class ExperimentalScreen extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
onInsert() {
|
onInsert(element) {
|
||||||
this.calculateDistance();
|
this.calculateDistance(element);
|
||||||
window.addEventListener("resize", this.calculateDistance);
|
|
||||||
|
this.resizeObserver = new ResizeObserver((entries) => {
|
||||||
|
for (const entry of entries) {
|
||||||
|
this.calculateDistance(entry.target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.resizeObserver.observe(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
Reference in New Issue
Block a user