/*
 * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */
import type { DependencyList, EffectCallback } from 'react'
import { useEffect, useState } from 'react'

/**
 * Executes a side effects but catches any thrown error.
 *
 * @param effect The side effect to execute
 * @param deps The dependencies of the effect
 * @return The produced error (if occurred)
 */
export const useEffectWithCatch = (effect: EffectCallback, deps: DependencyList = []): Error | undefined => {
  const [error, setError] = useState<Error | undefined>(undefined)

  // oxlint-disable-next-line exhaustive-deps
  useEffect(() => {
    try {
      return effect()
    } catch (error) {
      setError(error as Error)
    }
    // oxlint-disable-next-line exhaustive-deps
  }, deps)

  return error
}
