Skip to content

Commit 7e18de0

Browse files
dylanjeffersclaude
andcommitted
Modals (Wave E batch 1): NiceModal-wrap 3 more global modals
Continues the Wave D migration to nice-modal-react for the remaining modals in web Modals.tsx commonModalsMap: - HostRemixContestModal (keeps useHostRemixContestModal data hook) - AddToCollectionModal - ChallengeRewardsModal Same shape as Wave D: NiceModal.create wrap, useModal() for visibility, registerNiceModalId opts each id into the bridge allowlist, side-effect import added to registerNiceModals.ts, removed from Modals.tsx commonModalsMap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent f54fca2 commit 7e18de0

5 files changed

Lines changed: 49 additions & 26 deletions

File tree

packages/web/src/app/registerNiceModals.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Add new NiceModal-managed modals here as they migrate.
1010
*/
1111
import 'components/add-cash-modal/AddCashModal'
12+
import 'components/add-to-collection/desktop/AddToCollectionModal'
1213
import 'components/album-track-remove-confirmation-modal/AlbumTrackRemoveConfirmationModal'
1314
import 'components/artist-pick-modal/ArtistPickModal'
1415
import 'components/buy-sell-modal/BuySellModal'
@@ -20,6 +21,7 @@ import 'components/early-release-confirmation-modal/EarlyReleaseConfirmationModa
2021
import 'components/edit-access-confirmation-modal/EditAccessConfirmationModal'
2122
import 'components/finalize-winners-confirmation-modal/FinalizeWinnersConfirmationModal'
2223
import 'components/hide-confirmation-modal/HideContentConfirmationModal'
24+
import 'components/host-remix-contest-modal/HostRemixContestModal'
2325
import 'components/inbox-unavailable-modal/InboxUnavailableModal'
2426
import 'components/leaving-audius-modal/LeavingAudiusModal'
2527
import 'components/locked-content-modal/LockedContentModal'
@@ -42,3 +44,4 @@ import 'pages/audio-page/components/modals/AudioBreakdownModal'
4244
import 'pages/audio-page/components/modals/ConnectedWalletsModal'
4345
import 'pages/chat-page/components/ChatBlastModal'
4446
import 'pages/fan-club-detail-page/components/ClaimVestedCoinsModal'
47+
import 'pages/rewards-page/components/modals/ChallengeRewardsModal/ChallengeRewardsModal'

packages/web/src/components/add-to-collection/desktop/AddToCollectionModal.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useMemo, useState } from 'react'
1+
import { useCallback, useMemo, useState } from 'react'
22

33
import {
44
useCurrentUserId,
@@ -12,6 +12,7 @@ import {
1212
SquareSizes,
1313
Collection
1414
} from '@audius/common/models'
15+
import { registerNiceModalId } from '@audius/common/services'
1516
import {
1617
cacheCollectionsActions,
1718
addToCollectionUISelectors,
@@ -27,12 +28,12 @@ import {
2728
Tooltip,
2829
Image
2930
} from '@audius/harmony'
31+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
3032
import cn from 'classnames'
3133
import { capitalize } from 'lodash'
3234
import InfiniteScroll from 'react-infinite-scroller'
3335
import { useDispatch, useSelector } from 'react-redux'
3436

35-
import { useModalState } from 'common/hooks/useModalState'
3637
import SearchBar from 'components/search-bar/SearchBar'
3738
import { useCollectionCoverArt } from 'hooks/useCollectionCoverArt'
3839

@@ -56,10 +57,11 @@ const getMessages = (collectionType: 'album' | 'playlist') => ({
5657
hiddenAdd: `You cannot add hidden tracks to a public ${collectionType}.`
5758
})
5859

59-
const AddToCollectionModal = () => {
60+
const AddToCollectionModal = NiceModal.create(() => {
6061
const dispatch = useDispatch()
6162

62-
const [isOpen, setIsOpen] = useModalState('AddToCollection')
63+
const modal = useModal()
64+
const handleClose = useCallback(() => modal.hide(), [modal])
6365
const collectionType = useSelector(getCollectionType)
6466
const trackId = useSelector(getTrackId)
6567
const trackTitle = useSelector(getTrackTitle)
@@ -135,7 +137,7 @@ const AddToCollectionModal = () => {
135137
}
136138
}
137139

138-
setIsOpen(false)
140+
handleClose()
139141
}
140142

141143
const handleCreateCollection = () => {
@@ -149,16 +151,16 @@ const AddToCollectionModal = () => {
149151
'toast'
150152
)
151153
)
152-
setIsOpen(false)
154+
handleClose()
153155
}
154156

155157
return (
156158
<Modal
157-
isOpen={isOpen === true}
159+
isOpen={modal.visible}
158160
showTitleHeader
159161
showDismissButton
160162
title={messages.title}
161-
onClose={() => setIsOpen(false)}
163+
onClose={handleClose}
162164
allowScroll={false}
163165
bodyClassName={styles.modalBody}
164166
headerContainerClassName={styles.modalHeader}
@@ -204,7 +206,7 @@ const AddToCollectionModal = () => {
204206
</Scrollbar>
205207
</Modal>
206208
)
207-
}
209+
})
208210

209211
type CollectionItemProps = {
210212
collectionType: 'album' | 'playlist'
@@ -244,4 +246,7 @@ const CollectionItem = ({
244246
)
245247
}
246248

249+
NiceModal.register('AddToCollection', AddToCollectionModal)
250+
registerNiceModalId('AddToCollection')
251+
247252
export default AddToCollectionModal

packages/web/src/components/host-remix-contest-modal/HostRemixContestModal.tsx

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
} from '@audius/common/api'
1111
import { remixMessages } from '@audius/common/messages'
1212
import { Name } from '@audius/common/models'
13+
import { registerNiceModalId } from '@audius/common/services'
1314
import { useHostRemixContestModal } from '@audius/common/store'
1415
import { dayjs } from '@audius/common/utils'
1516
import {
@@ -27,6 +28,7 @@ import {
2728
TextArea
2829
} from '@audius/harmony'
2930
import { EventEntityTypeEnum, EventEventTypeEnum } from '@audius/sdk'
31+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
3032

3133
import { DatePicker } from 'components/edit/fields/DatePickerField'
3234
import { mergeReleaseDateValues } from 'components/edit/fields/visibility/mergeReleaseDateValues'
@@ -37,8 +39,15 @@ import { TimeInput, parseTime } from './TimeInput'
3739
const contestHostingLink =
3840
'https://help.audius.co/artists/hosting-a-remix-contest'
3941

40-
export const HostRemixContestModal = () => {
41-
const { data, isOpen, onClose, onClosed } = useHostRemixContestModal()
42+
export const HostRemixContestModal = NiceModal.create(() => {
43+
// Visibility owned by NiceModal; payload (`trackId`) still flows through
44+
// the legacy createModal hook.
45+
const modal = useModal()
46+
const onClose = useCallback(() => {
47+
modal.hide()
48+
}, [modal])
49+
const onClosed = onClose
50+
const { data } = useHostRemixContestModal()
4251
const { trackId } = data
4352
const { mutate: createEvent } = useCreateEvent()
4453
const { mutate: updateEvent } = useUpdateEvent()
@@ -203,7 +212,12 @@ export const HostRemixContestModal = () => {
203212
}, [remixContest, userId, deleteEvent, onClose, trackId])
204213

205214
return (
206-
<Modal isOpen={isOpen} onClose={onClose} onClosed={onClosed} size='medium'>
215+
<Modal
216+
isOpen={modal.visible}
217+
onClose={onClose}
218+
onClosed={onClosed}
219+
size='medium'
220+
>
207221
<ModalHeader onClose={onClose}>
208222
<ModalTitle Icon={IconTrophy} title={remixMessages.modalTitle} />
209223
</ModalHeader>
@@ -322,4 +336,7 @@ export const HostRemixContestModal = () => {
322336
</ModalContent>
323337
</Modal>
324338
)
325-
}
339+
})
340+
341+
NiceModal.register('HostRemixContest', HostRemixContestModal)
342+
registerNiceModalId('HostRemixContest')

packages/web/src/pages/modals/Modals.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ import { ComponentType, lazy } from 'react'
33
import { Modals as ModalTypes } from '@audius/common/store'
44

55
import { CoinSuccessModal } from 'components/CoinSuccessModal'
6-
import AddToCollectionModal from 'components/add-to-collection/desktop/AddToCollectionModal'
76
import AppCTAModal from 'components/app-cta-modal/AppCTAModal'
87
import BrowserPushConfirmationModal from 'components/browser-push-confirmation-modal/BrowserPushConfirmationModal'
98
import CoinflowOnrampModal from 'components/coinflow-onramp-modal'
109
import ConfirmerPreview from 'components/confirmer-preview/ConfirmerPreview'
1110
import EmbedModal from 'components/embed-modal/EmbedModal'
1211
import { FeatureFlagOverrideModal } from 'components/feature-flag-override-modal'
1312
import FirstUploadModal from 'components/first-upload-modal/FirstUploadModal'
14-
import { HostRemixContestModal } from 'components/host-remix-contest-modal/HostRemixContestModal'
1513
import { PasswordResetModal } from 'components/password-reset/PasswordResetModal'
1614
import { PremiumContentPurchaseModal } from 'components/premium-content-purchase-modal/PremiumContentPurchaseModal'
1715
import { SendTokensModal } from 'components/send-tokens-modal'
@@ -23,7 +21,6 @@ import { WithdrawUSDCModal } from 'components/withdraw-usdc-modal/WithdrawUSDCMo
2321
import { CoinflowWithdrawModal } from 'components/withdraw-usdc-modal/components/CoinflowWithdrawModal'
2422
import { useIsMobile } from 'hooks/useIsMobile'
2523
import TransferAudioMobileDrawer from 'pages/audio-page/components/modals/TransferAudioMobileDrawer'
26-
import { ChallengeRewardsModal } from 'pages/rewards-page/components/modals/ChallengeRewardsModal'
2724

2825
import AppModal from './AppModal'
2926

@@ -42,11 +39,8 @@ const CommentSettingsModal = lazy(
4239
)
4340

4441
const commonModalsMap: { [Modal in ModalTypes]?: ComponentType } = {
45-
AddToCollection: AddToCollectionModal,
46-
HostRemixContest: HostRemixContestModal,
4742
InboxSettings: InboxSettingsModal,
4843
CommentSettings: CommentSettingsModal,
49-
ChallengeRewards: ChallengeRewardsModal,
5044
TransferAudioMobileWarning: TransferAudioMobileDrawer,
5145
BrowserPushPermissionConfirmation: BrowserPushConfirmationModal,
5246
PremiumContentPurchaseModal,

packages/web/src/pages/rewards-page/components/modals/ChallengeRewardsModal/ChallengeRewardsModal.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useCallback, useEffect, useContext } from 'react'
22

33
import { useCurrentAccountUser, useCurrentAccount } from '@audius/common/api'
44
import { ChallengeName } from '@audius/common/models'
5+
import { registerNiceModalId } from '@audius/common/services'
56
import {
67
challengesSelectors,
78
audioRewardsPageSelectors,
@@ -12,9 +13,9 @@ import {
1213
} from '@audius/common/store'
1314
import { getAAOErrorEmojis } from '@audius/common/utils'
1415
import { ModalContent, Text } from '@audius/harmony'
16+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
1517
import { useDispatch, useSelector } from 'react-redux'
1618

17-
import { useModalState } from 'common/hooks/useModalState'
1819
import ModalDrawer from 'components/modal-drawer/ModalDrawer'
1920
import { ToastContext } from 'components/toast/ToastContext'
2021
import { useWithMobileStyle } from 'hooks/useWithMobileStyle'
@@ -133,23 +134,23 @@ const ChallengeRewardsBody = ({ dismissModal }: BodyProps) => {
133134
)
134135
}
135136

136-
export const ChallengeRewardsModal = () => {
137+
export const ChallengeRewardsModal = NiceModal.create(() => {
137138
const modalType = useSelector(getChallengeRewardsModalType) as ChallengeName
138-
const [isOpen, setOpen] = useModalState('ChallengeRewards')
139+
const modal = useModal()
139140
const dispatch = useDispatch()
140141
const wm = useWithMobileStyle(styles.mobile)
141142
const onClose = useCallback(() => {
142-
setOpen(false)
143+
modal.hide()
143144
dispatch(resetAndCancelClaimReward())
144-
}, [dispatch, setOpen])
145+
}, [dispatch, modal])
145146

146147
const { title } = getChallengeConfig(modalType)
147148

148149
return (
149150
<ModalDrawer
150151
title={<>{title}</>}
151152
showTitleHeader
152-
isOpen={isOpen}
153+
isOpen={modal.visible}
153154
onClose={onClose}
154155
isFullscreen={true}
155156
titleClassName={wm(styles.title)}
@@ -162,4 +163,7 @@ export const ChallengeRewardsModal = () => {
162163
</ModalContent>
163164
</ModalDrawer>
164165
)
165-
}
166+
})
167+
168+
NiceModal.register('ChallengeRewards', ChallengeRewardsModal)
169+
registerNiceModalId('ChallengeRewards')

0 commit comments

Comments
 (0)