rypi-scrapper/src/hooks/useOutsideClickEventHandler.ts
Walidoux d26b429ee8
refactor(components)
BREAKING CHANGES
- Refactored `App.tsx` to import `Component` from `solid-js`, and use a new component `TitleBar`.
- Added new component `AnimateView` under `src/components/design`, and renamed old `AnimateView` to `Loader`.
- Added new component `Button` under `src/components/design`.
- Added new component `Image` under `src/components/design`.
- Moved old `Image`, `Loader`, and `Button` components under `src/components/design`.
- Refactored `Downloader` component to use `Motion` from `@motionone/solid`, moved it under `Downloader` folder, and used it to create a slick hover effect.
- Removed `Downloaders/Button`.

Notes:
- Used `createSignal` instead of `useState` for SolidJS in `Downloaders.tsx`.
- Used `type` keyword to explicitly define the type of the component props or objects where it makes the code clearer.
2023-05-02 15:49:05 +01:00

42 lines
1.0 KiB
TypeScript

import type { RefObject } from 'react'
import { useEffect, useRef } from 'react'
export const useOutSideClickEventHandler = (callback: () => void): RefObject<HTMLDivElement> => {
const wrapper = useRef<HTMLDivElement>(null)
useEffect(() => {
const handleClickOutside = (event: KeyboardEvent | MouseEvent): void => {
const currentEvent = event as KeyboardEvent
if (
wrapper.current == null ||
Boolean(wrapper.current.contains(currentEvent.target as Node)) ||
currentEvent.key !== 'Escape'
)
return
return callback()
}
window.addEventListener('click', (event) => {
return handleClickOutside(event)
})
window.addEventListener('keydown', (event) => {
return handleClickOutside(event)
})
return () => {
window.removeEventListener('click', (event) => {
return handleClickOutside(event)
})
window.removeEventListener('keydown', (event) => {
return handleClickOutside(event)
})
}
}, [])
return wrapper
}