Ott 156 language selector (#22)
parent
f503c7ec79
commit
1c7586e7a4
@ -0,0 +1,3 @@ |
|||||||
|
export const publicLexics = { |
||||||
|
authorization: 500, |
||||||
|
} |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
import { useEffect, useRef } from 'react' |
||||||
|
|
||||||
|
type TUseOutsideClickEffect = { |
||||||
|
onClick: Function, |
||||||
|
} |
||||||
|
|
||||||
|
export const useOutsideClickEffect = ({ |
||||||
|
onClick, |
||||||
|
}: TUseOutsideClickEffect) => { |
||||||
|
const wrapperRef = useRef<HTMLDivElement>(null) |
||||||
|
useEffect(() => { |
||||||
|
const handleOutsideClick = ({ target }: MouseEvent) => { |
||||||
|
const targetNode = target instanceof Node |
||||||
|
? target |
||||||
|
: null |
||||||
|
|
||||||
|
/** деструктуризация wrapperRef не сработает, ссылка на реф теряется */ |
||||||
|
if (wrapperRef.current && !wrapperRef.current.contains(targetNode)) { |
||||||
|
onClick() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
window.addEventListener('mousedown', handleOutsideClick) |
||||||
|
|
||||||
|
return () => { |
||||||
|
window.removeEventListener('mousedown', handleOutsideClick) |
||||||
|
} |
||||||
|
}, [onClick, wrapperRef]) |
||||||
|
return wrapperRef |
||||||
|
} |
||||||
@ -0,0 +1,28 @@ |
|||||||
|
import type { ReactNode } from 'react' |
||||||
|
import React from 'react' |
||||||
|
|
||||||
|
import styled from 'styled-components' |
||||||
|
|
||||||
|
import { useOutsideClickEffect } from './hooks' |
||||||
|
|
||||||
|
type Props = { |
||||||
|
/** элемент, которому необходим функционал `OutsideClick` */ |
||||||
|
children: ReactNode, |
||||||
|
/** функция-коллбек, отрабатывающая по клику вне области элемента */ |
||||||
|
onClick: () => void, |
||||||
|
} |
||||||
|
|
||||||
|
const OutsideClickWrapper = styled.div`` |
||||||
|
|
||||||
|
export const OutsideClick = ({ |
||||||
|
children, |
||||||
|
onClick, |
||||||
|
}: Props) => { |
||||||
|
const wrapperRef = useOutsideClickEffect({ onClick }) |
||||||
|
|
||||||
|
return ( |
||||||
|
<OutsideClickWrapper ref={wrapperRef}> |
||||||
|
{children} |
||||||
|
</OutsideClickWrapper> |
||||||
|
) |
||||||
|
} |
||||||
@ -1,2 +1,3 @@ |
|||||||
export * from './usePageId' |
export * from './usePageId' |
||||||
export * from './useCurrentLang' |
export * from './useCurrentLang' |
||||||
|
export * from './useToggle' |
||||||
|
|||||||
@ -0,0 +1,14 @@ |
|||||||
|
import { useState, useCallback } from 'react' |
||||||
|
|
||||||
|
export const useToggle = () => { |
||||||
|
const [isOpen, setIsOpen] = useState(false) |
||||||
|
const open = useCallback(() => setIsOpen(true), []) |
||||||
|
const close = useCallback(() => setIsOpen(false), []) |
||||||
|
const toggle = useCallback(() => setIsOpen((state) => !state), []) |
||||||
|
return { |
||||||
|
close, |
||||||
|
isOpen, |
||||||
|
open, |
||||||
|
toggle, |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue