1.0.1 • Published 1 year ago

useless-hook v1.0.1

Weekly downloads
-
License
-
Repository
-
Last release
1 year ago

use-less

Simpler React hooks

Usage:

  import { useLess } from '../useLess';

  it('works', async () => {
    const fn = jest.fn();

    const initial = {
      name: '',
      comp: null as any,
    };

    const { result } = renderHook(() => useLess(initial));

    expect(result.current.state).toBe(initial);

    expect(result.current.ref).not.toBe(initial);
    expect(result.current.ref).toEqual(initial);

    act(() => {
      result.current.ref.name = 'updated';
    });

    expect(result.current.state).toEqual({
      name: 'updated',
      comp: null,
    });

    act(() => {
      result.current.ref.comp = fn;
    });

    expect(result.current.state).toEqual({
      name: 'updated',
      comp: fn,
    });

    expect(result.current.ref.comp).toBe(fn);

    expect(fn).toBeCalledTimes(0);
  });

  it('should update ref when deps change', () => {
    const initial = {
      name: 'INITIAL',
      comp: null as any,
    };

    let updateDeps: any;
    const { result } = renderHook(() => {
      const [deps, _setDeps] = React.useState([0]);
      updateDeps = _setDeps;
      return useLess(initial, deps);
    });

    expect(result.current.state).toBe(initial);

    expect(result.current.ref).not.toBe(initial);
    expect(result.current.ref).toEqual(initial);

    initial.name = 'batata';

    expect(result.current.ref).toEqual({
      name: 'INITIAL',
      comp: null,
    });

    act(() => {
      updateDeps([1]);
    });

    expect(result.current.state).toEqual({
      name: 'batata',
      comp: null,
    });

    expect(result.current.ref).toEqual({
      name: 'batata',
      comp: null,
    });
  });

  it('should setState', () => {
    const initial = {
      name: 'INITIAL',
      comp: null as any,
    };

    const { result } = renderHook(() => {
      return useLess(initial, []);
    });

    expect(result.current.state).toBe(initial);

    const spySetState = jest.spyOn(result.current, 'setState');

    act(() => {
      result.current.setState({ name: 'changed' });
    });

    expect(spySetState).toBeCalledTimes(1);

    expect(result.current.ref.name).toBe('changed');

    expect(result.current.state).toEqual({
      comp: null,
      name: 'changed',
    });
  });