Skip to content

Commit c230a9f

Browse files
dylanjeffersclaude
andcommitted
Modals (Wave E batch 2): NiceModal-wrap 6 createModal-based modals
Migrates the remaining createModal-driven modals from Modals.tsx to nice-modal-react now that the generalized bridge handles `modals/{id}/open` actions: - TransferAudioMobileDrawer (TransferAudioMobileWarning) - WithdrawUSDCModal - CoinflowOnrampModal (CoinflowOnramp) - CoinflowWithdrawModal (CoinflowWithdraw) - SendTokensModal - PremiumContentPurchaseModal Same shape as Wave D/E batch 1: 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. Modals.tsx is now down to the lazy-loaded set (InboxSettings, CommentSettings, CreateChatModal, StripeOnRamp) plus BrowserPushPermissionConfirmation; those need a separate plan to preserve their lazy-load semantics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6a96ab8 commit c230a9f

8 files changed

Lines changed: 81 additions & 45 deletions

File tree

packages/web/src/app/registerNiceModals.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'components/add-to-collection/desktop/AddToCollectionModal'
1313
import 'components/album-track-remove-confirmation-modal/AlbumTrackRemoveConfirmationModal'
1414
import 'components/artist-pick-modal/ArtistPickModal'
1515
import 'components/buy-sell-modal/BuySellModal'
16+
import 'components/coinflow-onramp-modal/CoinflowOnrampModal'
1617
import 'components/delete-playlist-confirmation-modal/DeletePlaylistConfirmationModal'
1718
import 'components/delete-track-confirmation-modal/DeleteTrackConfirmationModal'
1819
import 'components/download-track-archive-modal/DownloadTrackArchiveModal'
@@ -26,12 +27,14 @@ import 'components/inbox-unavailable-modal/InboxUnavailableModal'
2627
import 'components/leaving-audius-modal/LeavingAudiusModal'
2728
import 'components/locked-content-modal/LockedContentModal'
2829
import 'components/payout-wallet-modal/PayoutWalletModal'
30+
import 'components/premium-content-purchase-modal/PremiumContentPurchaseModal'
2931
import 'components/publish-confirmation-modal/PublishConfirmationModal'
3032
import 'components/receive-tokens-modal/ReceiveTokensModal'
3133
import 'components/replace-track-confirmation-modal/ReplaceTrackConfirmationModal'
3234
import 'components/replace-track-progress-modal/ReplaceTrackProgressModal'
3335
import 'components/rewards/modals/ClaimAllRewardsModal'
3436
import 'components/rewards/modals/TopAPI'
37+
import 'components/send-tokens-modal/SendTokensModal'
3538
import 'components/share-modal/ShareModal'
3639
import 'components/transaction-details-modal/TransactionDetailsModal'
3740
import 'components/upload-confirmation-modal/UploadConfirmationModal'
@@ -40,8 +43,11 @@ import 'components/usdc-transaction-details-modal/USDCTransactionDetailsModal'
4043
import 'components/user-badges/TierExplainerModal'
4144
import 'components/wait-for-download-modal/WaitForDownloadModal'
4245
import 'components/welcome-modal/WelcomeModal'
46+
import 'components/withdraw-usdc-modal/WithdrawUSDCModal'
47+
import 'components/withdraw-usdc-modal/components/CoinflowWithdrawModal'
4348
import 'pages/audio-page/components/modals/AudioBreakdownModal'
4449
import 'pages/audio-page/components/modals/ConnectedWalletsModal'
50+
import 'pages/audio-page/components/modals/TransferAudioMobileDrawer'
4551
import 'pages/chat-page/components/ChatBlastModal'
4652
import 'pages/fan-club-detail-page/components/ClaimVestedCoinsModal'
4753
import 'pages/rewards-page/components/modals/ChallengeRewardsModal/ChallengeRewardsModal'

packages/web/src/components/coinflow-onramp-modal/CoinflowOnrampModal.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { useCallback, useEffect, useState } from 'react'
22

33
import { useCoinflowAdapter } from '@audius/common/hooks'
4+
import { registerNiceModalId } from '@audius/common/services'
45
import {
56
coinflowModalUIActions,
67
useCoinflowOnrampModal
78
} from '@audius/common/store'
89
import { CoinflowPurchase, Currency } from '@coinflowlabs/react'
10+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
911
import { VersionedTransaction } from '@solana/web3.js'
1012
import { useDispatch } from 'react-redux'
1113

@@ -21,12 +23,13 @@ const { transactionSucceeded, transactionCanceled } = coinflowModalUIActions
2123
const MERCHANT_ID = env.COINFLOW_MERCHANT_ID
2224
const IS_PRODUCTION = env.ENVIRONMENT === 'production'
2325

24-
export const CoinflowOnrampModal = () => {
26+
export const CoinflowOnrampModal = NiceModal.create(() => {
27+
const modal = useModal()
28+
const onClose = useCallback(() => modal.hide(), [modal])
29+
const onClosed = onClose
30+
const isOpen = modal.visible
2531
const {
26-
data: { amount, serializedTransaction, purchaseMetadata, guestEmail },
27-
isOpen,
28-
onClose,
29-
onClosed
32+
data: { amount, serializedTransaction, purchaseMetadata, guestEmail }
3033
} = useCoinflowOnrampModal()
3134
const dispatch = useDispatch()
3235
const [transaction, setTransaction] = useState<
@@ -92,4 +95,7 @@ export const CoinflowOnrampModal = () => {
9295
) : null}
9396
</ModalDrawer>
9497
)
95-
}
98+
})
99+
100+
NiceModal.register('CoinflowOnramp', CoinflowOnrampModal)
101+
registerNiceModalId('CoinflowOnramp')

packages/web/src/components/premium-content-purchase-modal/PremiumContentPurchaseModal.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
PurchaseVendor,
2525
USDCPurchaseConditions
2626
} from '@audius/common/models'
27-
import { FeatureFlags } from '@audius/common/services'
27+
import { FeatureFlags, registerNiceModalId } from '@audius/common/services'
2828
import {
2929
buyUSDCActions,
3030
usePremiumContentPurchaseModal,
@@ -43,6 +43,7 @@ import {
4343
IconCart,
4444
ModalTitle
4545
} from '@audius/harmony'
46+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
4647
import cn from 'classnames'
4748
import { Formik, useField, useFormikContext } from 'formik'
4849
import { useDispatch, useSelector } from 'react-redux'
@@ -203,13 +204,13 @@ const PremiumContentPurchaseForm = (props: PremiumContentPurchaseFormProps) => {
203204
)
204205
}
205206

206-
export const PremiumContentPurchaseModal = () => {
207+
export const PremiumContentPurchaseModal = NiceModal.create(() => {
207208
const dispatch = useDispatch()
208209
const isMobile = useIsMobile()
210+
const modal = useModal()
211+
const isOpen = modal.visible
212+
const onClose = useCallback(() => modal.hide(), [modal])
209213
const {
210-
isOpen,
211-
onClose,
212-
onClosed,
213214
data: { contentId, contentType }
214215
} = usePremiumContentPurchaseModal()
215216
const { isEnabled: isCoinflowEnabled, isLoaded: isCoinflowEnabledLoaded } =
@@ -305,10 +306,9 @@ export const PremiumContentPurchaseModal = () => {
305306
}, [isUnlocking, stage, onClose])
306307

307308
const handleClosed = useCallback(() => {
308-
onClosed()
309309
dispatch(cleanup())
310310
dispatch(cleanupUSDCRecovery())
311-
}, [onClosed, dispatch])
311+
}, [dispatch])
312312

313313
useManagedAccountNotAllowedCallback({
314314
trigger: isOpen,
@@ -354,4 +354,7 @@ export const PremiumContentPurchaseModal = () => {
354354
) : null}
355355
</ModalDrawer>
356356
)
357-
}
357+
})
358+
359+
NiceModal.register('PremiumContentPurchaseModal', PremiumContentPurchaseModal)
360+
registerNiceModalId('PremiumContentPurchaseModal')

packages/web/src/components/send-tokens-modal/SendTokensModal.tsx

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

33
import { useSendCoins } from '@audius/common/api'
44
import { walletMessages } from '@audius/common/messages'
@@ -8,7 +8,9 @@ import {
88
SolanaWalletAddress,
99
User
1010
} from '@audius/common/models'
11+
import { registerNiceModalId } from '@audius/common/services'
1112
import { useSendTokensModal } from '@audius/common/store'
13+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
1214

1315
import ResponsiveModal from 'components/modal/ResponsiveModal'
1416
import { reportToSentry } from 'store/errors/reportToSentry'
@@ -32,8 +34,11 @@ type SendTokensState = {
3234
signature: string
3335
}
3436

35-
const SendTokensModal = () => {
36-
const { isOpen, onClose: closeModal, data } = useSendTokensModal()
37+
const SendTokensModal = NiceModal.create(() => {
38+
const modal = useModal()
39+
const isOpen = modal.visible
40+
const closeModal = useCallback(() => modal.hide(), [modal])
41+
const { data } = useSendTokensModal()
3742
const { mint, user: prePopulatedUser } = data ?? {}
3843
const isAppKitModalOpenRef = useRef(false)
3944

@@ -288,6 +293,9 @@ const SendTokensModal = () => {
288293
) : null}
289294
</ResponsiveModal>
290295
)
291-
}
296+
})
297+
298+
NiceModal.register('SendTokensModal', SendTokensModal)
299+
registerNiceModalId('SendTokensModal')
292300

293301
export default SendTokensModal

packages/web/src/components/withdraw-usdc-modal/WithdrawUSDCModal.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { useUSDCBalance } from '@audius/common/api'
44
import { useFeatureFlag, useRemoteVar } from '@audius/common/hooks'
55
import { walletMessages } from '@audius/common/messages'
66
import { Name, Status } from '@audius/common/models'
7-
import { IntKeys, FeatureFlags } from '@audius/common/services'
7+
import {
8+
IntKeys,
9+
FeatureFlags,
10+
registerNiceModalId
11+
} from '@audius/common/services'
812
import {
913
withdrawUSDCActions,
1014
withdrawUSDCSelectors,
@@ -21,6 +25,7 @@ import {
2125
IconTransaction,
2226
ModalTitle
2327
} from '@audius/harmony'
28+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
2429
import { Formik, FormikProps, useFormikContext } from 'formik'
2530
import { useDispatch, useSelector } from 'react-redux'
2631
import { toFormikValidationSchema } from 'zod-formik-adapter'
@@ -77,9 +82,12 @@ const TrackFormErrors = ({ currentBalance }: { currentBalance: number }) => {
7782
return null
7883
}
7984

80-
export const WithdrawUSDCModal = () => {
85+
export const WithdrawUSDCModal = NiceModal.create(() => {
8186
const dispatch = useDispatch()
82-
const { isOpen, onClose, onClosed, data, setData } = useWithdrawUSDCModal()
87+
const modal = useModal()
88+
const onClose = useCallback(() => modal.hide(), [modal])
89+
const onClosed = onClose
90+
const { data, setData } = useWithdrawUSDCModal()
8391
const { isEnabled: isCoinflowEnabled } = useFeatureFlag(
8492
FeatureFlags.COINFLOW_OFFRAMP_ENABLED
8593
)
@@ -163,7 +171,7 @@ export const WithdrawUSDCModal = () => {
163171
return (
164172
<Modal
165173
size='medium'
166-
isOpen={isOpen}
174+
isOpen={modal.visible}
167175
onClose={onClose}
168176
onClosed={handleOnClosed}
169177
dismissOnClickOutside={!DISABLE_MODAL_CLOSE_PAGES.has(page)}
@@ -208,4 +216,7 @@ export const WithdrawUSDCModal = () => {
208216
</ModalContent>
209217
</Modal>
210218
)
211-
}
219+
})
220+
221+
NiceModal.register('WithdrawUSDCModal', WithdrawUSDCModal)
222+
registerNiceModalId('WithdrawUSDCModal')

packages/web/src/components/withdraw-usdc-modal/components/CoinflowWithdrawModal.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { useCallback } from 'react'
22

33
import { useCoinflowWithdrawalAdapter } from '@audius/common/hooks'
4+
import { registerNiceModalId } from '@audius/common/services'
45
import {
5-
useCoinflowWithdrawModal,
66
withdrawUSDCActions,
77
withdrawUSDCSelectors
88
} from '@audius/common/store'
99
import { CoinflowWithdraw, OnSuccessMethod } from '@coinflowlabs/react'
10+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
1011
import { useDispatch, useSelector } from 'react-redux'
1112

1213
import ModalDrawer from 'components/modal-drawer/ModalDrawer'
@@ -34,8 +35,11 @@ const parseTransactionFromSuccessParams = (params: string) => {
3435
const MERCHANT_ID = env.COINFLOW_MERCHANT_ID
3536
const IS_PRODUCTION = env.ENVIRONMENT === 'production'
3637

37-
export const CoinflowWithdrawModal = () => {
38-
const { isOpen, onClose, onClosed } = useCoinflowWithdrawModal()
38+
export const CoinflowWithdrawModal = NiceModal.create(() => {
39+
const modal = useModal()
40+
const onClose = useCallback(() => modal.hide(), [modal])
41+
const onClosed = onClose
42+
const isOpen = modal.visible
3943
const amount = useSelector(getWithdrawAmount)
4044

4145
const adapter = useCoinflowWithdrawalAdapter()
@@ -85,4 +89,7 @@ export const CoinflowWithdrawModal = () => {
8589
) : null}
8690
</ModalDrawer>
8791
)
88-
}
92+
})
93+
94+
NiceModal.register('CoinflowWithdraw', CoinflowWithdrawModal)
95+
registerNiceModalId('CoinflowWithdraw')
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import { useCallback } from 'react'
2+
3+
import { registerNiceModalId } from '@audius/common/services'
14
import { IconTokenGold as IconGold } from '@audius/harmony'
5+
import NiceModal, { useModal } from '@ebay/nice-modal-react'
26

3-
import { useModalState } from 'common/hooks/useModalState'
47
import Drawer from 'components/drawer/Drawer'
58

69
import styles from './TransferAudioMobileDrawer.module.css'
@@ -10,18 +13,22 @@ const messages = {
1013
subtitle: 'To transfer AUDIO please visit audius.co from a desktop browser'
1114
}
1215

13-
const TransferAudioMobileDrawer = () => {
14-
const [isOpen, setOpen] = useModalState('TransferAudioMobileWarning')
16+
const TransferAudioMobileDrawer = NiceModal.create(() => {
17+
const modal = useModal()
18+
const handleClose = useCallback(() => modal.hide(), [modal])
1519

1620
return (
17-
<Drawer isOpen={isOpen} onClose={() => setOpen(false)}>
21+
<Drawer isOpen={modal.visible} onClose={handleClose}>
1822
<div className={styles.container}>
1923
<IconGold />
2024
<span className={styles.title}>{messages.title}</span>
2125
<span className={styles.subtitle}>{messages.subtitle}</span>
2226
</div>
2327
</Drawer>
2428
)
25-
}
29+
})
30+
31+
NiceModal.register('TransferAudioMobileWarning', TransferAudioMobileDrawer)
32+
registerNiceModalId('TransferAudioMobileWarning')
2633

2734
export default TransferAudioMobileDrawer

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,16 @@ import { Modals as ModalTypes } from '@audius/common/store'
55
import { CoinSuccessModal } from 'components/CoinSuccessModal'
66
import AppCTAModal from 'components/app-cta-modal/AppCTAModal'
77
import BrowserPushConfirmationModal from 'components/browser-push-confirmation-modal/BrowserPushConfirmationModal'
8-
import CoinflowOnrampModal from 'components/coinflow-onramp-modal'
98
import ConfirmerPreview from 'components/confirmer-preview/ConfirmerPreview'
109
import EmbedModal from 'components/embed-modal/EmbedModal'
1110
import { FeatureFlagOverrideModal } from 'components/feature-flag-override-modal'
1211
import FirstUploadModal from 'components/first-upload-modal/FirstUploadModal'
1312
import { PasswordResetModal } from 'components/password-reset/PasswordResetModal'
14-
import { PremiumContentPurchaseModal } from 'components/premium-content-purchase-modal/PremiumContentPurchaseModal'
15-
import { SendTokensModal } from 'components/send-tokens-modal'
1613
import ConnectedMobileOverflowModal from 'components/track-overflow-modal/ConnectedMobileOverflowModal'
1714
import UnfollowConfirmationModal from 'components/unfollow-confirmation-modal/UnfollowConfirmationModal'
1815
import { UnsavedChangesDialog } from 'components/unsaved-changes-dialog/UnsavedChangesDialog'
1916
import { UserListModal } from 'components/user-list-modal/UserListModal'
20-
import { WithdrawUSDCModal } from 'components/withdraw-usdc-modal/WithdrawUSDCModal'
21-
import { CoinflowWithdrawModal } from 'components/withdraw-usdc-modal/components/CoinflowWithdrawModal'
2217
import { useIsMobile } from 'hooks/useIsMobile'
23-
import TransferAudioMobileDrawer from 'pages/audio-page/components/modals/TransferAudioMobileDrawer'
2418

2519
import AppModal from './AppModal'
2620

@@ -41,15 +35,9 @@ const CommentSettingsModal = lazy(
4135
const commonModalsMap: { [Modal in ModalTypes]?: ComponentType } = {
4236
InboxSettings: InboxSettingsModal,
4337
CommentSettings: CommentSettingsModal,
44-
TransferAudioMobileWarning: TransferAudioMobileDrawer,
4538
BrowserPushPermissionConfirmation: BrowserPushConfirmationModal,
46-
PremiumContentPurchaseModal,
4739
CreateChatModal,
48-
WithdrawUSDCModal,
49-
CoinflowOnramp: CoinflowOnrampModal,
50-
StripeOnRamp: StripeOnRampModal,
51-
CoinflowWithdraw: CoinflowWithdrawModal,
52-
SendTokensModal
40+
StripeOnRamp: StripeOnRampModal
5341
}
5442

5543
const commonModals = Object.entries(commonModalsMap) as [

0 commit comments

Comments
 (0)