4.0.23 • Published 3 years ago

@tl1/hooks v4.0.23

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

@tl1/hooks

npm version npm downloads npm bundle size npm license lerna

Collection of React hooks. Every hook supports TypeScript and Server-Side Rendering.

Installation

yarn add @tl1/hooks

Usage

Event listener

Example

import React from 'react';
import { useEventListener } from '@tl1/hooks';

const Component = () => {
  const ref = useRef(null);

  useEventListener({
    type: 'click',
    listener: (event) => console.log(event),
    element: ref,
    options: { passive: true }
  });

  return <div ref={ref} />;
};

export default Component;

Reference

Default value for element is window if isSSR returns false.

interface UseEventListener {
  type: keyof WindowEventMap;
  listener: EventListener;
  element?: RefObject<Element> | Document | Window | null;
  options?: AddEventListenerOptions;
}

const useEventListener = ({
  type,
  listener,
  element = isSSR ? undefined : window,
  options
}: UseEventListener): void => {};

Resize

Example

import React from 'react';
import { useResize } from '@tl1/hooks';

const Component = () => {
  useResize((event) => {
    console.log(event);
  }, 666);

  return null;
};

export default Component;

Reference

It uses useEventListener() to listen for resize. Will trigger callback on window resize. Passed wait parameter will debounce the callback parameter.

const useResize = (
  callback: (event: Event) => void,
  wait: number = 250
): void => {};

Window size

Example

import React, { useEffect } from 'react';
import { useWindowSize } from '@tl1/hooks';

const Component = () => {
  const { width, height } = useWindowSize(1337);

  useEffect(() => {
    console.log(width, height);
  }, [width, height]);

  return null;
};

export default Component;

Reference

It uses useResize() to listen for resize. Passed wait parameter will debounce the callback parameter.

const useWindowSize = (
  wait: number = 250
): {
  width?: number;
  height?: number;
} => {};

Click outside

Example

import React, { useRef } from 'react';
import { useClickOutside } from '@tl1/hooks';

const Component = () => {
  const ref = useRef(null);

  useClickOutside(ref, (event) => {
    console.log(event);
  });

  return <div ref={ref} />;
};

export default Component;

Reference

It uses useEventListener() to listen for click.

const useClickOutside = (
  element: RefObject<Element> | null,
  callback: (event: MouseEvent) => void
): void => {};

Scroll

Example

import React, { useEffect, useRef } from 'react';
import { useScroll } from '@tl1/hooks';

const Component = () => {
  const ref = useRef(null);
  const { y, x, direction } = useScroll({
    wait: 420,
    element: ref
  });

  useEffect(() => {
    console.log(y, x, direction);
  }, [y, x, direction]);

  return <div ref={ref} />;
};

export default Component;

Reference

It uses useEventListener() to listen for scroll, so default element is window. Passed wait parameter will throttle the callback parameter.

interface Scroll {
  y?: number;
  x?: number;
  direction?: 'up' | 'right' | 'down' | 'left';
}

interface UseScroll {
  wait?: number;
  element?: RefObject<Element> | Window | null;
}

export const useScroll = (options?: UseScroll): Scroll => {};

Trap focus

Example

import React, { useRef } from 'react';
import { useTrapFocus } from '@tl1/hooks';

const Component = () => {
  const initialFocusRef = useRef(null);
  const trapRef = useTrapFocus({
    includeContainer: true,
    initialFocus: initialFocusRef.current,
    returnFocus: true,
    updateNodes: false
  });

  return (
    <div ref={trapRef} tabIndex={0}>
      Lorem ipsum{' '}
      <button type="button" ref={initialFocusRef}>
        dolor
      </button>
    </div>
  );
};

export default Component;

Reference

It uses useEventListener() to listen for keydown.

Include container

Include container in the tabbable nodes. In the example above it would result in trapRef.
Default: false.

Initial focus

Set node or 'container' as initial focus. For 'container' to work you need to set includeContainer: true.
Default: null.

Return focus

Return focus to the element that had focus before trapped. This will be executed when component unmounts.
Default: true.

Update nodes

Update tabbable nodes on each tab, can be useful if nodes is rendered dynamically in some way.
Default: false.

type Node = HTMLDivElement | null;

interface UseTrapFocus {
  includeContainer?: boolean;
  initialFocus?: 'container' | Node;
  returnFocus?: boolean;
  updateNodes?: boolean;
}

const useTrapFocus = (
  options?: UseTrapFocus
): MutableRefObject<Node> => {};
4.0.23

3 years ago

4.0.22

3 years ago

4.0.21

3 years ago

4.0.20

3 years ago

4.0.19

3 years ago

4.0.18

3 years ago

4.0.17

3 years ago

4.0.16

3 years ago

4.0.15

3 years ago

4.0.14

3 years ago

4.0.13

3 years ago

4.0.9

3 years ago

4.0.8

3 years ago

4.0.5

3 years ago

4.0.10

3 years ago

4.0.7

3 years ago

4.0.6

3 years ago

4.0.12

3 years ago

4.0.11

3 years ago

4.0.1

3 years ago

4.0.0

3 years ago

3.0.1

3 years ago

3.0.0

3 years ago

2.4.10

3 years ago

2.4.12

3 years ago

2.4.11

3 years ago

2.4.7

3 years ago

2.4.6

3 years ago

2.4.9

3 years ago

2.4.8

3 years ago

2.4.0

3 years ago

2.2.0

3 years ago

2.1.0

3 years ago

2.0.2

3 years ago

2.0.1

3 years ago

2.0.0

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

0.1.0

4 years ago