Files
react/components/utils/use-portal.ts
2020-08-24 18:40:07 +08:00

37 lines
975 B
TypeScript

import { useEffect, useState } from 'react'
import useSSR from '../utils/use-ssr'
import { getId } from './collections'
const createElement = (id: string): HTMLElement => {
const el = document.createElement('div')
el.setAttribute('id', id)
return el
}
const usePortal = (
selectId: string = getId(),
getContainer?: () => HTMLElement | null,
): HTMLElement | null => {
const id = `geist-ui-${selectId}`
const { isBrowser } = useSSR()
const [elSnapshot, setElSnapshot] = useState<HTMLElement | null>(
isBrowser ? createElement(id) : null,
)
useEffect(() => {
const customContainer = getContainer ? getContainer() : null
const parentElement = customContainer || document.body
const hasElement = parentElement.querySelector<HTMLElement>(`#${id}`)
const el = hasElement || createElement(id)
if (!hasElement) {
parentElement.appendChild(el)
}
setElSnapshot(el)
}, [])
return elSnapshot
}
export default usePortal