diff --git a/src/components/modals/gift/GiftModal.tsx b/src/components/modals/gift/GiftModal.tsx index ea76a343b..c950cd182 100644 --- a/src/components/modals/gift/GiftModal.tsx +++ b/src/components/modals/gift/GiftModal.tsx @@ -17,6 +17,7 @@ import { getPeerTitle, getUserFullName } from '../../../global/helpers'; import { isApiPeerChat, isApiPeerUser } from '../../../global/helpers/peers'; import { selectPeer } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; +import { throttle } from '../../../util/schedulers'; import useCurrentOrPrev from '../../../hooks/useCurrentOrPrev'; import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; @@ -56,6 +57,9 @@ type StateProps = { const AVATAR_SIZE = 100; const INTERSECTION_THROTTLE = 200; +const SCROLL_THROTTLE = 200; + +const runThrottledForScroll = throttle((cb) => cb(), SCROLL_THROTTLE, true); const PremiumGiftModal: FC = ({ modal, @@ -133,21 +137,25 @@ const PremiumGiftModal: FC = ({ if (!isOpen) { setIsHeaderHidden(true); setSelectedGift(undefined); + setSelectedCategory('all'); } }, [isOpen]); const handleScroll = useLastCallback((e: React.UIEvent) => { if (selectedGift) return; + const currentTarget = e.currentTarget; - const { scrollTop } = e.currentTarget; + runThrottledForScroll(() => { + const { scrollTop } = currentTarget; - setIsHeaderHidden(scrollTop <= 150); + setIsHeaderHidden(scrollTop <= 150); - if (transitionRef.current && giftHeaderRef.current) { - const { top: headerTop } = giftHeaderRef.current.getBoundingClientRect(); - const { top: transitionTop } = transitionRef.current.getBoundingClientRect(); - setIsHeaderForStarGifts(headerTop - transitionTop <= 0); - } + if (transitionRef.current && giftHeaderRef.current) { + const { top: headerTop } = giftHeaderRef.current.getBoundingClientRect(); + const { top: transitionTop } = transitionRef.current.getBoundingClientRect(); + setIsHeaderForStarGifts(headerTop - transitionTop <= 0); + } + }); }); const giftPremiumDescription = lang('GiftPremiumDescription', { diff --git a/src/global/selectors/peers.ts b/src/global/selectors/peers.ts index 7b9770872..8dff5571e 100644 --- a/src/global/selectors/peers.ts +++ b/src/global/selectors/peers.ts @@ -16,9 +16,8 @@ export function selectPeerPhotos(global: T, peerId: strin export function selectCanGift(global: T, peerId: string) { const bot = selectBot(global, peerId); const user = selectUser(global, peerId); - const chat = selectChat(global, peerId); - const areStarGiftsAvailable = chat ? selectChatFullInfo(global, peerId)?.areStarGiftsAvailable : user; + const areStarGiftsAvailable = selectChatFullInfo(global, peerId)?.areStarGiftsAvailable || user; return Boolean(!selectIsPremiumPurchaseBlocked(global) && !bot && peerId !== SERVICE_NOTIFICATIONS_USER_ID && areStarGiftsAvailable);