Switch branches/tags
with-view-layout-props@0.2.0 with-view-layout-props@0.1.3 with-view-layout-props@0.1.2 with-view-layout-props@0.1.1 with-view-layout-props@0.1.0 with-resize-observer-props@0.5.0 with-resize-observer-props@0.4.1 with-resize-observer-props@0.4.0 with-resize-observer-props@0.3.1 with-resize-observer-props@0.3.0 with-resize-observer-props@0.2.0 with-resize-observer-props@0.1.0 with-page-visibility-props@0.4.0 with-page-visibility-props@0.3.0 with-page-visibility-props@0.2.0 with-page-visibility-props@0.1.0 with-online-status-props@0.3.0 with-online-status-props@0.2.0 with-online-status-props@0.1.1 with-online-status-props@0.1.0 with-match-media-props@0.4.0 with-match-media-props@0.3.0 with-match-media-props@0.2.0 with-match-media-props@0.1.2 with-match-media-props@0.1.1 with-match-media-props@0.1.0 with-log@0.5.0 with-log@0.4.0 with-log@0.3.0 with-log@0.2.0 with-log@0.1.0 with-lifecycle@0.5.0 with-lifecycle@0.4.0 with-lifecycle@0.3.0 with-lifecycle@0.2.0 with-lifecycle@0.1.1 with-lifecycle@0.1.0 with-intersection-observer-props@0.5.0 with-intersection-observer-props@0.4.0 with-intersection-observer-props@0.3.0 with-intersection-observer-props@0.2.0 with-intersection-observer-props@0.1.0 with-debugger@0.4.0 with-debugger@0.3.0 with-debugger@0.2.0 with-debugger@0.1.0 with-callback-once@0.3.0 with-callback-once@0.2.0 with-callback-once@0.1.0 with-callback-on-change@0.3.0 with-callback-on-change@0.2.0 with-callback-on-change@0.1.0 with-callback-on-change-while@0.3.0 with-callback-on-change-while@0.2.0 with-callback-on-change-while@0.1.0 throttle-handler@0.5.0 throttle-handler@0.4.0 throttle-handler@0.3.0 throttle-handler@0.2.1 throttle-handler@0.1.1 throttle-handler@0.1.0 safe-timers@0.4.0 safe-timers@0.3.0 safe-timers@0.2.0 safe-timers@0.1.0 prevent-handlers-default@0.4.0 prevent-handlers-default@0.3.0 prevent-handlers-default@0.2.1 prevent-handlers-default@0.1.0 omit-props@0.4.0 omit-props@0.3.0 omit-props@0.2.1 omit-props@0.1.1 omit-props@0.1.0 debounce-handler@0.5.0 debounce-handler@0.4.1 debounce-handler@0.4.0 debounce-handler@0.3.0 debounce-handler@0.2.1 debounce-handler@0.1.1 debounce-handler@0.1.0
Nothing to show
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
demo
src
test
package.json
readme.md

readme.md

👀 with-intersection-observer-props

npm ci coverage deps

Part of a collection of Higher-Order Components for React, especially useful with Recompose.

Dynamically map visibility of a component to boolean props using Intersection Observer API (Can I use?).

Install

yarn add @hocs/with-intersection-observer-props

Usage

withIntersectionObserverProps(
  intersectionMatchers: {
    [propName: string]: number
  },
  options?: Object,
  onRefName?: string
): HigherOrderComponent

Where:

  • intersection matcher's value is a single threshold
  • options – object with root and rootMargin.
  • onRefName – in some cases you might want to change it. 'onRef' by default.

Basic wrapper to make Target component hidden behind scroll by default:

import React from 'react';

import Target from './Target';

const Demo = () => (
  <div style={{ height: '300px', overflow: 'scroll', fontSize: 32, border: '1px solid black' }}>
    <div style={{ height: '300px' }}>Scroll me down</div>
    <Target style={{ backgroundColor: 'RebeccaPurple', color: 'white' }}/>
    <div style={{ height: '300px' }}/>
  </div>
);

export default Demo;

Target component which is using Intersection Observer:

import React from 'react';
import 'intersection-observer';
import withIntersectionObserverProps from '@hocs/with-intersection-observer-props';

const Target = ({ isOnePixelVisible, isHalfVisible, isFullVisible, onRef }) => (
  <div ref={onRef} style={{ backgroundColor: 'RebeccaPurple', color: 'white' }}>
    <p>{JSON.stringify({ isOnePixelVisible })}</p>
    <p>{JSON.stringify({ isHalfVisible })}</p>
    <p>{JSON.stringify({ isFullVisible })}</p>
  </div>
);

export default withIntersectionObserverProps({
  isOnePixelVisible: 0.0,
  isHalfVisible: 0.5,
  isFullVisible: 1.0
})(Target);

📺 Check out live demo.

Notes

  • You might still need a polyfill.
  • It's impossible to avoid first render with undefined intersection props.
  • Target Component will be just passed through on unsupported platforms (i.e. global.IntersectionObserver is not a function) like JSDOM (so Jest as well) or with Server-Side Rendering. This means that there will be no boolean props (i.e. undefined) which might be expected, but you can take care of it using Recompose defaultProps HOC if it's really necessary.

Related