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 './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