/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import {useEffect} from 'react';
import {useLocation} from '@docusaurus/router';
import {useEvent, usePrevious} from './reactUtils';
import type {Location} from 'history';

/**
 * Fires an effect when the location changes (which includes hash, query, etc.).
 * Importantly, doesn't fire when there's no previous location: see
 * https://github.com/facebook/docusaurus/pull/6696
 */
export function useLocationChange(
  onLocationChange: (locationChangeEvent: {
    location: Location;
    previousLocation: Location | undefined;
  }) => void,
): void {
  const location = useLocation();
  const previousLocation = usePrevious(location);

  const onLocationChangeDynamic = useEvent(onLocationChange);

  useEffect(() => {
    if (!previousLocation) {
      return;
    }

    if (location !== previousLocation) {
      onLocationChangeDynamic({
        location,
        previousLocation,
      });
    }
  }, [onLocationChangeDynamic, location, previousLocation]);
}
