import { useState } from 'react';
import { supabase } from '@/lib/supabase';
export function usePortalSession() {
const [loading, setLoading] = useState(false);
const createPortalSession = async () => {
try {
setLoading(true);
// Get the current session to access the access token
const { data: { session } } = await supabase.auth.getSession();
if (!session?.access_token) {
throw new Error('Not authenticated');
}
// Create a portal session
const response = await fetch('/api/create-portal-session', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${session.access_token}`,
},
});
if (!response.ok) {
const errorText = await response.text();
console.error('API error response:', errorText);
throw new Error(`API request failed: ${response.status} ${errorText}`);
}
const data = await response.json();
if (data.error) {
throw new Error(data.error);
}
if (!data.url) {
throw new Error('No portal URL received');
}
// Try to redirect to the portal
// First try in same window
try {
window.location.href = data.url;
} catch (error) {
console.warn('Same-window redirect failed, trying new tab:', error);
// Fallback: open in new tab
window.open(data.url, '_blank');
}
} catch (error) {
console.error('Error creating portal session:', error);
// Handle specific error cases with user-friendly messages
let userMessage = 'Unable to open billing management. Please try again.';
if (error instanceof Error) {
if (error.message.includes('No subscription found')) {
userMessage = 'You need an active subscription to manage billing. Please upgrade your plan first.';
} else if (error.message.includes('Not authenticated')) {
userMessage = 'Please log in again to manage your billing.';
} else if (error.message.includes('API request failed')) {
userMessage = 'Connection error. Please check your internet connection and try again.';
}
}
// Show user-friendly error
alert(userMessage);
throw error;
} finally {
setLoading(false);
}
};
return {
createPortalSession,
loading,
};
}