11"use client" ;
22
3+ import { generatePaypalOAuthUrl } from "@/lib/actions/partners/generate-paypal-oauth-url" ;
4+ import { generateStripeAccountLink } from "@/lib/actions/partners/generate-stripe-account-link" ;
5+ import { generateStripeRecipientAccountLink } from "@/lib/actions/partners/generate-stripe-recipient-account-link" ;
36import { hasPermission } from "@/lib/auth/partner-users/partner-user-permissions" ;
47import usePartnerProfile from "@/lib/swr/use-partner-profile" ;
8+ import { useBankAccountRequirementsModal } from "@/ui/partners/payouts/bank-account-requirements-modal" ;
59import { useSelectPayoutMethodModal } from "@/ui/partners/payouts/select-payout-method-modal" ;
10+ import { useStablecoinPayoutModal } from "@/ui/partners/payouts/stablecoin-payout-modal" ;
611import { PartnerPayoutMethod } from "@dub/prisma/client" ;
712import { Button , ButtonProps , TooltipContent } from "@dub/ui" ;
813import { COUNTRIES } from "@dub/utils" ;
9- import { useMemo } from "react" ;
14+ import { useAction } from "next-safe-action/hooks" ;
15+ import { useRouter } from "next/navigation" ;
16+ import { useCallback , useMemo } from "react" ;
17+ import { toast } from "sonner" ;
18+
19+ interface ConnectPayoutButtonProps extends ButtonProps {
20+ payoutMethod ?: PartnerPayoutMethod ;
21+ }
1022
1123export function ConnectPayoutButton ( {
12- payoutMethodType ,
24+ payoutMethod ,
1325 ...props
14- } : ButtonProps & { payoutMethodType ?: PartnerPayoutMethod } ) {
26+ } : ConnectPayoutButtonProps ) {
27+ const router = useRouter ( ) ;
1528 const { partner, availablePayoutMethods } = usePartnerProfile ( ) ;
1629
30+ const {
31+ executeAsync : executeStripeConnect ,
32+ isPending : isStripeConnectPending ,
33+ } = useAction ( generateStripeAccountLink , {
34+ onSuccess : ( { data } ) => {
35+ router . push ( data . url ) ;
36+ } ,
37+ onError : ( { error } ) => {
38+ toast . error ( error . serverError ) ;
39+ } ,
40+ } ) ;
41+
42+ const {
43+ executeAsync : executeStablecoinConnect ,
44+ isPending : isStablecoinConnectPending ,
45+ } = useAction ( generateStripeRecipientAccountLink , {
46+ onSuccess : ( { data } ) => {
47+ router . push ( data . url ) ;
48+ } ,
49+ onError : ( { error } ) => {
50+ toast . error ( error . serverError ) ;
51+ } ,
52+ } ) ;
53+
54+ const {
55+ executeAsync : executePaypalConnect ,
56+ isPending : isPaypalConnectPending ,
57+ } = useAction ( generatePaypalOAuthUrl , {
58+ onSuccess : ( { data } ) => {
59+ router . push ( data . url ) ;
60+ } ,
61+ onError : ( { error } ) => {
62+ toast . error ( error . serverError ) ;
63+ } ,
64+ } ) ;
65+
1766 const { setShowSelectPayoutMethodModal, SelectPayoutMethodModal } =
1867 useSelectPayoutMethodModal ( ) ;
1968
20- // const { executeAsync: executeStripeAsync, isPending: isStripePending } =
21- // useAction(generateStripeAccountLink, {
22- // onSuccess: ({ data }) => {
23- // if (!data?.url) {
24- // toast.error("Unable to create account link. Please contact support.");
25- // return;
26- // }
27- // router.push(data.url);
28- // },
29- // onError: ({ error }) => {
30- // toast.error(error.serverError);
31- // },
32- // });
33-
34- // const { executeAsync: executePaypalAsync, isPending: isPaypalPending } =
35- // useAction(generatePaypalOAuthUrl, {
36- // onSuccess: ({ data }) => {
37- // if (!data?.url) {
38- // toast.error("Unable to redirect to Paypal. Please contact support.");
39- // return;
40- // }
41- // router.push(data.url);
42- // },
43- // onError: ({ error }) => {
44- // toast.error(error.serverError);
45- // },
46- // });
47-
48- // const connectPayout = useCallback(async () => {
49- // if (!partner) {
50- // toast.error("Invalid partner profile. Please log out and log back in.");
51- // return;
52- // }
53-
54- // if (!partner.country) {
55- // toast.error(
56- // "You haven't set your country yet. Please go to partners.dub.co/settings to set your country.",
57- // );
58- // }
59-
60- // if (payoutMethod === "paypal") {
61- // await executePaypalAsync();
62- // } else if (payoutMethod === "stripe") {
63- // await executeStripeAsync();
64- // } else {
65- // toast.error(
66- // "Your country is not supported for payout. Please go to partners.dub.co/settings to update your country, or contact support.",
67- // );
68- // return;
69- // }
70- // }, [executeStripeAsync, executePaypalAsync, partner]);
71-
72- // const { setShowBankAccountRequirementsModal, BankAccountRequirementsModal } =
73- // useBankAccountRequirementsModal({
74- // onContinue: connectPayout,
75- // });
76-
77- // const { setShowSelectPayoutMethodModal, SelectPayoutMethodModal } =
78- // useSelectPayoutMethodModal();
79-
80- // const handleClick = useCallback(() => {
81- // if (payoutMethodType === "paypal") {
82- // executePaypalAsync();
83- // return;
84- // }
85-
86- // if (payoutMethod === "paypal" && !payoutMethodType) {
87- // connectPayout();
88- // return;
89- // }
90-
91- // if (
92- // payoutMethod === "stripe" ||
93- // availablePayoutMethods?.includes("crypto") ||
94- // availablePayoutMethods?.includes("bankAccount")
95- // ) {
96- // if (payoutMethodType === "crypto") {
97- // connectPayout();
98- // } else if (payoutMethodType === "bankAccount") {
99- // setShowBankAccountRequirementsModal(true);
100- // } else if (!payoutMethodType) {
101- // setShowSelectPayoutMethodModal(true);
102- // } else {
103- // connectPayout();
104- // }
105- // return;
106- // }
107-
108- // toast.error(
109- // "Your country is not supported for payout. Please go to partners.dub.co/settings to update your country, or contact support.",
110- // );
111- // }, [
112- // connectPayout,
113- // executePaypalAsync,
114- // // payoutMethod,
115- // // payoutMethodType,
116- // availablePayoutMethods,
117- // setShowBankAccountRequirementsModal,
118- // setShowSelectPayoutMethodModal,
119- // ]);
69+ const { setShowBankAccountRequirementsModal, BankAccountRequirementsModal } =
70+ useBankAccountRequirementsModal ( {
71+ onContinue : async ( ) => {
72+ await executeStripeConnect ( ) ;
73+ } ,
74+ } ) ;
75+
76+ const { setShowStablecoinPayoutModal, StablecoinPayoutModal } =
77+ useStablecoinPayoutModal ( {
78+ onContinue : async ( ) => {
79+ await executeStablecoinConnect ( ) ;
80+ } ,
81+ } ) ;
82+
83+ const handleClick = useCallback ( ( ) => {
84+ if ( payoutMethod === "connect" ) {
85+ setShowSelectPayoutMethodModal ( false ) ;
86+ setShowBankAccountRequirementsModal ( true ) ;
87+ return ;
88+ }
89+
90+ if ( payoutMethod === "stablecoin" ) {
91+ setShowSelectPayoutMethodModal ( false ) ;
92+ setShowStablecoinPayoutModal ( true ) ;
93+ return ;
94+ }
95+
96+ if ( payoutMethod === "paypal" ) {
97+ executePaypalConnect ( ) ;
98+ return ;
99+ }
100+
101+ setShowSelectPayoutMethodModal ( true ) ;
102+ } , [
103+ payoutMethod ,
104+ setShowSelectPayoutMethodModal ,
105+ setShowBankAccountRequirementsModal ,
106+ setShowStablecoinPayoutModal ,
107+ executePaypalConnect ,
108+ ] ) ;
109+
110+ const isPending = useMemo (
111+ ( ) =>
112+ isStripeConnectPending ||
113+ isStablecoinConnectPending ||
114+ isPaypalConnectPending ,
115+ [
116+ isStripeConnectPending ,
117+ isStablecoinConnectPending ,
118+ isPaypalConnectPending ,
119+ ] ,
120+ ) ;
120121
121122 const errorMessage = useMemo (
122123 ( ) =>
@@ -135,9 +136,12 @@ export function ConnectPayoutButton({
135136 return (
136137 < >
137138 { SelectPayoutMethodModal }
139+ { BankAccountRequirementsModal }
140+ { StablecoinPayoutModal }
138141 < Button
139- onClick = { ( ) => setShowSelectPayoutMethodModal ( true ) }
140- text = "Connect payout"
142+ onClick = { handleClick }
143+ text = { payoutMethod ? "Connect" : "Connect payout" }
144+ loading = { isPending }
141145 disabledTooltip = {
142146 errorMessage && (
143147 < TooltipContent
0 commit comments