mirror of https://github.com/Squidex/squidex.git
committed by
GitHub
7 changed files with 132 additions and 55 deletions
@ -0,0 +1,58 @@ |
|||
/* |
|||
* Squidex Headless CMS |
|||
* |
|||
* @license |
|||
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
|||
*/ |
|||
|
|||
import { Injectable, OnDestroy } from '@angular/core'; |
|||
|
|||
import ResizeObserver from 'resize-observer-polyfill'; |
|||
|
|||
export interface ResizeListener { |
|||
onResize(rect: DOMRect, element: Element): void; |
|||
} |
|||
|
|||
export const ResizeServiceFactory = () => { |
|||
return new ResizeService(); |
|||
}; |
|||
|
|||
@Injectable() |
|||
export class ResizeService implements OnDestroy { |
|||
private readonly listeners = new WeakMap<Element, ResizeListener>(); |
|||
private observer: ResizeObserver; |
|||
|
|||
public ngOnDestroy() { |
|||
if (this.observer) { |
|||
this.observer.disconnect(); |
|||
} |
|||
} |
|||
|
|||
public listen(target: Element, listener: ResizeListener) { |
|||
if (!this.observer) { |
|||
this.observer = new ResizeObserver(entries => { |
|||
for (const entry of entries) { |
|||
if (this.listeners.has(entry.target)) { |
|||
const component = this.listeners.get(entry.target); |
|||
|
|||
if (component) { |
|||
component.onResize(entry.contentRect as any, entry.target); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
this.listeners.set(target, listener); |
|||
|
|||
this.observer.observe(target); |
|||
|
|||
return () => { |
|||
this.unlisten(target); |
|||
}; |
|||
} |
|||
|
|||
public unlisten(target: Element) { |
|||
this.observer.unobserve(target); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue