npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@msc24x/xobserver

v1.1.2

Published

Eliminates multiple instances of IntersectionObservers by providing a single instance and methods to manage it

Downloads

9

Readme

XObserver

Eliminates multiple instances of IntersectionObserver in your application and allows element level callbacks easily.

npm version

How does it work?

  1. XObserver simply maintains a global repository of the IntersectionObservers your application will use. Each global instance have a unique identifier called scope. Those instances can be ensured to be available by calling the .ping method under that particular scope.
  2. Unlike the traditional flow, the callback function of the observer is provided at the element level and not the instance level. This allows the application to assign separate callback for each element, This is done by .subscribe
  3. And yes, there an .unsubscribe method equivalent to the traditional .unobserve

Installation

yarn add @msc24x/xobserver

or

npm i @msc24x/xobserver

Methods

ping

XObserver.ping(scope: string, options?: IntersectionObserverInit, defCallback?: XObserverCallback)): void

Initialize/prepare one IntersectionObserver per given scope. A default callback for each subscriber can also be provided at the scope level, using defCallback. This can be called multiple times, only the first call will create an actual instance.

  • A new scope must be pinged if another set of options is required
  • defCallback for an element will be ignored if a callback was provided for that element during .subscribe

subscribe

XObserver.subscribe(scope: string, element: Element, callback?: XObserverCallback): void

Subscribe the element to the observer. Be aware that the callback provided is invoked only for given particular element.

  • The element must have a unique ID assigned to it

unsubscribe

XObserver.unsubscribe(scope: string, element: Element): void

Equivalent to calling .unobserve on IntersectionObserver.

Example (React)

A component that is being animated when in view and being hidden when out of view. The number of actual IntersectionObserver instances, in this case, will remain 2, no matter how many elements of this component is rendered.

export default function MyComponent(
	props: {id:string}
) {
	const [inView, setInView] = useState(false);
	const ref = useRef<HTMLDivElement>();

	useEffect(() => {
		XObserver.ping("appearance", { threshold: [0.3, 0] });

		const target = ref.current!;

		XObserver.subscribe("appearance", target, (entry) =>
			entry.isIntersecting && entry.intersectionRatio > 0.2
				? setInView(true)
				: setInView(false)
		);

		return () => {
			XObserver.unsubscribe("appearance", target);
		};
	}, []);

    return <div id={props.id} ref={ref as MutableRefObject<HTMLDivElement>}>In view : {inView}</div>
}