{ return ( - - - {({ mainContentRef }) => ( - - )} - - + + {({ ref, setRef }) => { + return ( + + ) + }} + ) } diff --git a/packages/web/src/components/artist-recommendations/ArtistRecommendationsPopup.tsx b/packages/web/src/components/artist-recommendations/ArtistRecommendationsPopup.tsx index 67168e778e3..73e6a88222e 100644 --- a/packages/web/src/components/artist-recommendations/ArtistRecommendationsPopup.tsx +++ b/packages/web/src/components/artist-recommendations/ArtistRecommendationsPopup.tsx @@ -1,11 +1,11 @@ -import { RefObject, useContext } from 'react' +import { RefObject } from 'react' import { ID, User } from '@audius/common/models' import { cacheUsersSelectors } from '@audius/common/store' import { Popup } from '@audius/harmony' import { useSelector } from 'react-redux' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { AppState } from 'store/types' import zIndex from 'utils/zIndex' @@ -22,7 +22,7 @@ type Props = { export const ArtistRecommendationsPopup = (props: Props) => { const { anchorRef, artistId, isVisible, onClose } = props - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() // Get the artist const user = useSelector((state) => diff --git a/packages/web/src/components/collectibles/components/CollectiblesPage.tsx b/packages/web/src/components/collectibles/components/CollectiblesPage.tsx index 96933d7987f..d48f6b63b60 100644 --- a/packages/web/src/components/collectibles/components/CollectiblesPage.tsx +++ b/packages/web/src/components/collectibles/components/CollectiblesPage.tsx @@ -53,7 +53,7 @@ import Toast from 'components/toast/Toast' import { ToastContext } from 'components/toast/ToastContext' import { ComponentPlacement, MountPlacement } from 'components/types' import UserBadges from 'components/user-badges/UserBadges' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { copyToClipboard, getCopyableLink } from 'utils/clipboardUtil' import { BASE_GA_URL, @@ -560,7 +560,7 @@ const CollectiblesPage = (props: CollectiblesPageProps) => { onClick: handleEditClick }) } - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() return (
{ - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() // Portal to the main content parent, which is the app (not body, to account for banners) const Portal = usePortal({ container: mainContentRef.current?.parentElement ?? undefined diff --git a/packages/web/src/components/image-selection/ImageSelectionPopup.jsx b/packages/web/src/components/image-selection/ImageSelectionPopup.jsx index cd47000ff64..85fe18bd38d 100644 --- a/packages/web/src/components/image-selection/ImageSelectionPopup.jsx +++ b/packages/web/src/components/image-selection/ImageSelectionPopup.jsx @@ -1,4 +1,4 @@ -import { useState, useCallback, useRef, useContext } from 'react' +import { useState, useCallback, useRef } from 'react' import { RandomImage } from '@audius/common/services' import { accountSelectors } from '@audius/common/store' @@ -11,7 +11,7 @@ import { useWindowSize } from 'react-use' import { Dropzone } from 'components/upload/Dropzone' import InvalidFileType from 'components/upload/InvalidFileType' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import zIndex from 'utils/zIndex' import styles from './ImageSelectionPopup.module.css' @@ -228,7 +228,7 @@ const ImageSelectionPopup = ({ onSelect, source }) => { - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const [page, setPage] = useState(messages.uploadYourOwn) const windowSize = useWindowSize() const { collectibles, collectibleList, solanaCollectibleList } = diff --git a/packages/web/src/components/menu/Menu.tsx b/packages/web/src/components/menu/Menu.tsx index 221f2f64e09..79d9f66f698 100644 --- a/packages/web/src/components/menu/Menu.tsx +++ b/packages/web/src/components/menu/Menu.tsx @@ -1,8 +1,8 @@ -import { forwardRef, useContext } from 'react' +import { forwardRef } from 'react' import { PopupMenu, PopupMenuItem, PopupMenuProps } from '@audius/harmony' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import CollectionMenu, { OwnProps as CollectionMenuProps @@ -24,8 +24,7 @@ export type MenuProps = { const Menu = forwardRef((props, ref) => { const { menu, onClose, zIndex, children, ...other } = props - - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const renderMenu = (items: PopupMenuItem[]) => ( + setRef: (() => {}) as (node: HTMLDivElement) => void, + ref: {} as MutableRefObject, + ready: false }) export const useMainContentRef = () => { - const { mainContentRef } = useContext(MainContentContext) - return mainContentRef + const { ref } = useContext(MainContentContext) + return ref } export const MainContentContextProvider = memo( (props: { children: JSX.Element }) => { - const mainContentRef = useRef() + const ref = useRef() + const [ready, setReady] = useState(false) return ( { + if (node && !ref.current) { + ref.current = node + setReady(true) + } + }, + ref, + ready }} > {props.children} diff --git a/packages/web/src/pages/audio-transactions-page/AudioTransactionsPage.tsx b/packages/web/src/pages/audio-transactions-page/AudioTransactionsPage.tsx index 5bab7892134..74e95e7190c 100644 --- a/packages/web/src/pages/audio-transactions-page/AudioTransactionsPage.tsx +++ b/packages/web/src/pages/audio-transactions-page/AudioTransactionsPage.tsx @@ -1,10 +1,4 @@ -import { - useCallback, - useEffect, - useState, - useContext, - useLayoutEffect -} from 'react' +import { useCallback, useEffect, useState, useLayoutEffect } from 'react' import { statusIsNotFinalized } from '@audius/common/models' import { @@ -23,7 +17,7 @@ import { AudioTransactionsTable } from 'components/audio-transactions-table' import Header from 'components/header/desktop/Header' import Page from 'components/page/Page' import EmptyTable from 'components/tracks-table/EmptyTable' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { useSelector } from 'utils/reducer' import styles from './AudioTransactionsPage.module.css' @@ -80,7 +74,7 @@ export const AudioTransactionsPage = () => { useState( full.GetAudioTransactionHistorySortDirectionEnum.Desc ) - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const dispatch = useDispatch() const setVisibility = useSetVisibility() diff --git a/packages/web/src/pages/pay-and-earn-page/components/PurchasesTab.tsx b/packages/web/src/pages/pay-and-earn-page/components/PurchasesTab.tsx index a4605c836d6..8ca3a3ab01a 100644 --- a/packages/web/src/pages/pay-and-earn-page/components/PurchasesTab.tsx +++ b/packages/web/src/pages/pay-and-earn-page/components/PurchasesTab.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useState } from 'react' +import { useCallback, useState } from 'react' import { useGetPurchases, useGetPurchasesCount, Id } from '@audius/common/api' import { useAllPaginatedQuery } from '@audius/common/audius-query' @@ -18,7 +18,7 @@ import { useDispatch } from 'react-redux' import { useErrorPageOnFailedStatus } from 'hooks/useErrorPageOnFailedStatus' import { useIsMobile } from 'hooks/useIsMobile' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { audiusSdk } from 'services/audius-sdk' import { formatToday } from 'utils/dateUtils' import { useSelector } from 'utils/reducer' @@ -181,7 +181,7 @@ export const PurchasesTab = ({ onClickRow, fetchMore }: Omit, 'downloadCSV'>) => { - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const isMobile = useIsMobile() const columns = isMobile diff --git a/packages/web/src/pages/pay-and-earn-page/components/SalesTab.tsx b/packages/web/src/pages/pay-and-earn-page/components/SalesTab.tsx index 3bf49383e58..d1630056113 100644 --- a/packages/web/src/pages/pay-and-earn-page/components/SalesTab.tsx +++ b/packages/web/src/pages/pay-and-earn-page/components/SalesTab.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useState } from 'react' +import { useCallback, useState } from 'react' import { useGetSales, useGetSalesCount, Id } from '@audius/common/api' import { useAllPaginatedQuery } from '@audius/common/audius-query' @@ -18,7 +18,7 @@ import { useDispatch } from 'react-redux' import { useErrorPageOnFailedStatus } from 'hooks/useErrorPageOnFailedStatus' import { useIsMobile } from 'hooks/useIsMobile' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { audiusSdk } from 'services/audius-sdk' import { formatToday } from 'utils/dateUtils' import { useSelector } from 'utils/reducer' @@ -174,7 +174,7 @@ export const SalesTab = ({ isLoading }: Omit, 'downloadCSV'>) => { const isMobile = useIsMobile() - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const columns = isMobile ? (['contentName', 'date', 'value'] as SalesTableColumn[]) diff --git a/packages/web/src/pages/pay-and-earn-page/components/WithdrawalsTab.tsx b/packages/web/src/pages/pay-and-earn-page/components/WithdrawalsTab.tsx index 0ead9030dbd..bd58c73036e 100644 --- a/packages/web/src/pages/pay-and-earn-page/components/WithdrawalsTab.tsx +++ b/packages/web/src/pages/pay-and-earn-page/components/WithdrawalsTab.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useEffect, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import { Id, @@ -35,7 +35,7 @@ import { ThunkDispatch } from 'redux-thunk' import { useErrorPageOnFailedStatus } from 'hooks/useErrorPageOnFailedStatus' import { useIsMobile } from 'hooks/useIsMobile' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { make, track } from 'services/analytics' import { audiusSdk } from 'services/audius-sdk' import { formatToday } from 'utils/dateUtils' @@ -308,7 +308,7 @@ export const WithdrawalsTab = ({ isLoading }: Omit, 'downloadCSV'>) => { const isMobile = useIsMobile() - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const columns = isMobile ? (['date', 'amount'] as WithdrawalsTableColumn[]) diff --git a/packages/web/src/pages/saved-page/components/desktop/SavedPage.tsx b/packages/web/src/pages/saved-page/components/desktop/SavedPage.tsx index d922d03040c..600d86325bd 100644 --- a/packages/web/src/pages/saved-page/components/desktop/SavedPage.tsx +++ b/packages/web/src/pages/saved-page/components/desktop/SavedPage.tsx @@ -1,5 +1,3 @@ -import { useContext } from 'react' - import { Kind, Status, ID, UID, Lineup, User } from '@audius/common/models' import { savedPageSelectors, @@ -28,7 +26,7 @@ import { dateSorter } from 'components/table' import { TracksTable, TracksTableColumn } from 'components/tracks-table' import EmptyTable from 'components/tracks-table/EmptyTable' import useTabs from 'hooks/useTabs/useTabs' -import { MainContentContext } from 'pages/MainContentContext' +import { useMainContentRef } from 'pages/MainContentContext' import { emptyStateMessages } from '../emptyStateMessages' @@ -120,7 +118,7 @@ const SavedPage = ({ onClickRepost, onSortTracks }: SavedPageProps) => { - const { mainContentRef } = useContext(MainContentContext) + const mainContentRef = useMainContentRef() const initFetch = useSelector(getInitialFetchStatus) const emptyTracksHeader = useSelector((state: CommonState) => {