Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | 2x 21x 17x 13x 2x 7x 4x 2x 6x 3x 2x 8x 4x 2x 10x 10x 5x 4x 4x 2x 8x 8x 4x 3x 3x 2x 8x 8x 4x 3x 3x 2x 7x 4x 2x 8x 8x 4x 3x 3x 2x 6x 6x 3x 2x | /**
* Payment Hooks
* React Query hooks for payment configuration management
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import * as paymentsApi from '../api/payments';
// ============================================================================
// Query Keys
// ============================================================================
export const paymentKeys = {
all: ['payments'] as const,
config: () => [...paymentKeys.all, 'config'] as const,
apiKeys: () => [...paymentKeys.all, 'apiKeys'] as const,
connectStatus: () => [...paymentKeys.all, 'connectStatus'] as const,
};
// ============================================================================
// Unified Configuration Hook
// ============================================================================
/**
* Get unified payment configuration status.
* Returns the complete payment setup for the business.
*/
export const usePaymentConfig = () => {
return useQuery({
queryKey: paymentKeys.config(),
queryFn: () => paymentsApi.getPaymentConfig().then(res => res.data),
staleTime: 30 * 1000, // 30 seconds
});
};
// ============================================================================
// API Keys Hooks (Free Tier)
// ============================================================================
/**
* Get current API key configuration (masked).
*/
export const useApiKeys = () => {
return useQuery({
queryKey: paymentKeys.apiKeys(),
queryFn: () => paymentsApi.getApiKeys().then(res => res.data),
staleTime: 30 * 1000,
});
};
/**
* Validate API keys without saving.
*/
export const useValidateApiKeys = () => {
return useMutation({
mutationFn: ({ secretKey, publishableKey }: { secretKey: string; publishableKey: string }) =>
paymentsApi.validateApiKeys(secretKey, publishableKey).then(res => res.data),
});
};
/**
* Save API keys.
*/
export const useSaveApiKeys = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ secretKey, publishableKey }: { secretKey: string; publishableKey: string }) =>
paymentsApi.saveApiKeys(secretKey, publishableKey).then(res => res.data),
onSuccess: () => {
// Invalidate payment config to refresh status
queryClient.invalidateQueries({ queryKey: paymentKeys.config() });
queryClient.invalidateQueries({ queryKey: paymentKeys.apiKeys() });
},
});
};
/**
* Re-validate stored API keys.
*/
export const useRevalidateApiKeys = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => paymentsApi.revalidateApiKeys().then(res => res.data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: paymentKeys.config() });
queryClient.invalidateQueries({ queryKey: paymentKeys.apiKeys() });
},
});
};
/**
* Delete stored API keys.
*/
export const useDeleteApiKeys = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => paymentsApi.deleteApiKeys().then(res => res.data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: paymentKeys.config() });
queryClient.invalidateQueries({ queryKey: paymentKeys.apiKeys() });
},
});
};
// ============================================================================
// Stripe Connect Hooks (Paid Tiers)
// ============================================================================
/**
* Get current Connect account status.
*/
export const useConnectStatus = () => {
return useQuery({
queryKey: paymentKeys.connectStatus(),
queryFn: () => paymentsApi.getConnectStatus().then(res => res.data),
staleTime: 30 * 1000,
// Only fetch if we might have a Connect account
enabled: true,
});
};
/**
* Initiate Connect account onboarding.
*/
export const useConnectOnboarding = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ refreshUrl, returnUrl }: { refreshUrl: string; returnUrl: string }) =>
paymentsApi.initiateConnectOnboarding(refreshUrl, returnUrl).then(res => res.data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: paymentKeys.config() });
queryClient.invalidateQueries({ queryKey: paymentKeys.connectStatus() });
},
});
};
/**
* Refresh Connect onboarding link.
*/
export const useRefreshConnectLink = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ refreshUrl, returnUrl }: { refreshUrl: string; returnUrl: string }) =>
paymentsApi.refreshConnectOnboardingLink(refreshUrl, returnUrl).then(res => res.data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: paymentKeys.connectStatus() });
},
});
};
|