@jk-core/hooks
Version:
hooks for jk
1 lines • 8.59 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/useIntersectionObserver/index.ts","../src/useInterectOutside/index.ts","../src/useMediaQuery/index.ts","../src/useHistory/index.ts","../src/useHistoryEvent/index.ts","../src/useDebounce/index.ts"],"sourcesContent":["import { useEffect } from 'react';\n\ninterface IntersectionObserverProps<T1 extends HTMLElement, T2 extends HTMLElement> {\n target: React.RefObject<T1 | null>;\n parent?: React.RefObject<T2 | null>;\n callback: () => void;\n options?: IntersectionObserverInit;\n}\n// 인피니티 스크롤 옵저버설정 훅\nconst useIntersectionObserver = <T1 extends HTMLElement, T2 extends HTMLElement>({\n target, parent, callback, options,\n}:IntersectionObserverProps<T1, T2>) => {\n useEffect(() => {\n const ref = target.current;\n const parentRef = parent?.current;\n\n if (!ref) return () => { };\n\n const observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) callback();\n }, {\n ...parentRef ? { root: parentRef } : {}, threshold: 1, ...options,\n });\n\n observer.observe(ref);\n\n return () => {\n observer.unobserve(ref);\n };\n }, [callback, options, parent, target]);\n};\n\nexport default useIntersectionObserver;\n","import { RefObject, useEffect } from 'react';\n\ninterface Props {\n targetRef: RefObject<HTMLElement | null>;\n eventList: Array<string>;\n handler: () => void;\n}\n// 설정한 컴포넌트 이외의 영역을 클릭할 경우 handler에 등록된 동작을 수행\nconst useInterectOutside = ({ targetRef, eventList = [], handler = () => {} }:Props) => {\n useEffect(() => {\n const handleClickOutside = (event:Event) => {\n if (targetRef.current && !targetRef.current.contains(event.target as Node)) {\n handler();\n }\n };\n\n if (Array.isArray(eventList)) {\n eventList.map((event) => window.addEventListener(event, handleClickOutside));\n }\n\n return () => {\n if (Array.isArray(eventList)) {\n eventList.map((event) => window.removeEventListener(event, handleClickOutside));\n }\n };\n }, [targetRef, handler, eventList]);\n};\n\nexport default useInterectOutside;\n","import { useEffect, useRef, useState } from 'react';\n\nconst useMediaQuery = (width:number) => {\n const [matches, setMatches] = useState(() => window.matchMedia(`(max-width: ${width}px)`).matches);\n const matchMediaRef = useRef<MediaQueryList | null>(null);\n\n useEffect(() => {\n const matchMedia = window.matchMedia(`(max-width: ${width}px)`);\n matchMediaRef.current = matchMedia;\n function handleChange() {\n setMatches(window.matchMedia(`(max-width: ${width}px)`).matches);\n }\n matchMediaRef.current.addEventListener('change', handleChange);\n\n return () => {\n matchMediaRef.current?.removeEventListener('change', handleChange);\n };\n }, [width]);\n\n return matches;\n};\n\nexport default useMediaQuery;\n","const useHistory = () => {\n const { history } = window;\n\n const push = (path: string) => {\n const currentUrl = new URL(window.location.href);\n const newUrl = `${currentUrl.origin}${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}/${path}`;\n history.pushState({}, '', newUrl);\n };\n\n const back = () => {\n history.back();\n };\n\n return {\n push, back,\n };\n};\n\nexport default useHistory;\n","import { useEffect } from 'react';\n\ninterface Update {\n action: 'POP' | 'PUSH' | 'REPLACE';\n location: Location;\n}\n\ninterface Listener {\n (update: Update): void;\n}\nconst useHistoryEvent = (listener: Listener) => {\n useEffect(() => {\n const handlePopState = () => {\n const action = 'POP';\n const { location } = window;\n listener({ action, location });\n };\n\n const handlePushState = () => {\n const action = 'PUSH';\n const { location } = window;\n listener({ action, location });\n };\n\n const handleReplaceState = () => {\n const action = 'REPLACE';\n const { location } = window;\n listener({ action, location });\n };\n\n window.addEventListener('popstate', handlePopState);\n window.addEventListener('pushstate', handlePushState);\n window.addEventListener('replacestate', handleReplaceState);\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.removeEventListener('pushstate', handlePushState);\n window.removeEventListener('replacestate', handleReplaceState);\n };\n }, [listener]);\n};\n\nexport default useHistoryEvent;\n","import { useCallback, useEffect, useRef } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Procedure = (...args: any[]) => void;\n\nconst useDebounce = (func: Procedure, delay: number): Procedure => {\n const funcRef = useRef(func);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // 매 렌더링마다 func가 바뀔 수 있으니 ref에 최신 함수 저장\n useEffect(() => {\n funcRef.current = func;\n return () => {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [func]);\n\n const debouncedFn = useCallback((...args: any[]) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n funcRef.current(...args);\n }, delay);\n }, [delay]);\n\n return debouncedFn;\n};\n\nexport default useDebounce;\n"],"names":["useIntersectionObserver","target","parent","callback","options","useEffect","ref","parentRef","observer","entry","useInterectOutside","targetRef","eventList","handler","handleClickOutside","event","useMediaQuery","width","matches","setMatches","useState","matchMediaRef","useRef","matchMedia","handleChange","_a","useHistory","history","path","currentUrl","newUrl","useHistoryEvent","listener","handlePopState","action","location","handlePushState","handleReplaceState","useDebounce","func","delay","funcRef","timeoutRef","useCallback","args"],"mappings":"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"}