diff --git a/src/Components/Portal/Portal.jsx b/src/Components/Portal/Portal.jsx index 585f0f8..54e6f61 100644 --- a/src/Components/Portal/Portal.jsx +++ b/src/Components/Portal/Portal.jsx @@ -1,17 +1,17 @@ -import React from "react"; +import React, { useMemo } from "react"; import ReactDOM from "react-dom"; -export const Portal = ({ children, className = "root-portal", el = "div" }) => { - const [container] = React.useState(document.createElement(el)); +const getContainer = (id) => { + const el = document.getElementById(id); + if (el) return el; - container.classList.add(className); + const newEl = document.createElement("div"); + newEl.id = id; + document.body.appendChild(newEl); +}; - React.useEffect(() => { - document.body.appendChild(container); - return () => { - document.body.removeChild(container); - }; - }, [container]); +export const Portal = ({ children, id = "root-id" }) => { + const container = useMemo(() => getContainer(id), [id]); return ReactDOM.createPortal(children, container); }; diff --git a/src/Components/VoteButton/VoteButton.tsx b/src/Components/VoteButton/VoteButton.tsx index 761c58b..4b4e888 100644 --- a/src/Components/VoteButton/VoteButton.tsx +++ b/src/Components/VoteButton/VoteButton.tsx @@ -4,8 +4,9 @@ import { useAppSelector, usePressHolder } from 'src/utils/hooks' import { ComponentProps, useRef, useState } from 'react' import styles from './styles.module.scss' import { random, randomItem, numberFormatter } from 'src/utils/helperFunctions' -import { useDebouncedCallback, useThrottledCallback } from '@react-hookz/web' +import { useDebouncedCallback, useMountEffect, useThrottledCallback } from '@react-hookz/web' import { UnionToObjectKeys } from 'src/utils/types/utils' +import { Portal } from '../Portal/Portal' @@ -62,11 +63,10 @@ export default function VoteButton({ const [incrementsCount, setIncrementsCount] = useState(0); const totalIncrementsCountRef = useRef(0) const currentIncrementsCountRef = useRef(0); - const [increments, setIncrements] = useState>([]) + const [increments, setIncrements] = useState>([]); + const [btnBoundingRect, setBtnBoundingRect] = useState() const isMobileScreen = useAppSelector(s => s.ui.isMobileScreen); - - const resetCounterOnRelease = resetCounterOnReleaseProp; const doVote = useDebouncedCallback(() => { @@ -77,8 +77,6 @@ export default function VoteButton({ }, [], 2000) const clickIncrement = () => { - - if (!disableShake) setBtnShakeClass(s => s === styles.clicked_2 ? styles.clicked_1 : styles.clicked_2) @@ -154,6 +152,10 @@ export default function VoteButton({ currentIncrementsCountRef.current = 0, 150) } + useMountEffect(() => { + setBtnBoundingRect(btnContainerRef.current.getBoundingClientRect()) + }) + return (