import { atom } from 'nanostores'; import type { NetlifyConnection, NetlifyUser } from '~/types/netlify'; import { logStore } from './logs'; import { toast } from 'react-toastify'; // Initialize with stored connection or environment variable const storedConnection = typeof window !== 'undefined' ? localStorage.getItem('netlify_connection') : null; const envToken = import.meta.env.VITE_NETLIFY_ACCESS_TOKEN; // If we have an environment token but no stored connection, initialize with the env token const initialConnection: NetlifyConnection = storedConnection ? JSON.parse(storedConnection) : { user: null, token: envToken || '', stats: undefined, }; export const netlifyConnection = atom(initialConnection); export const isConnecting = atom(false); export const isFetchingStats = atom(false); // Function to initialize Netlify connection with environment token export async function initializeNetlifyConnection() { const currentState = netlifyConnection.get(); // If we already have a connection, don't override it if (currentState.user || !envToken) { return; } try { isConnecting.set(true); const response = await fetch('https://api.netlify.com/api/v1/user', { headers: { Authorization: `Bearer ${envToken}`, }, }); if (!response.ok) { throw new Error(`Failed to connect to Netlify: ${response.statusText}`); } const userData = await response.json(); // Update the connection state const connectionData: Partial = { user: userData as NetlifyUser, token: envToken, }; // Store in localStorage for persistence localStorage.setItem('netlify_connection', JSON.stringify(connectionData)); // Update the store updateNetlifyConnection(connectionData); // Fetch initial stats await fetchNetlifyStats(envToken); } catch (error) { console.error('Error initializing Netlify connection:', error); logStore.logError('Failed to initialize Netlify connection', { error }); } finally { isConnecting.set(false); } } export const updateNetlifyConnection = (updates: Partial) => { const currentState = netlifyConnection.get(); const newState = { ...currentState, ...updates }; netlifyConnection.set(newState); // Persist to localStorage if (typeof window !== 'undefined') { localStorage.setItem('netlify_connection', JSON.stringify(newState)); } }; export async function fetchNetlifyStats(token: string) { try { isFetchingStats.set(true); const sitesResponse = await fetch('https://api.netlify.com/api/v1/sites', { headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', }, }); if (!sitesResponse.ok) { throw new Error(`Failed to fetch sites: ${sitesResponse.status}`); } const sites = (await sitesResponse.json()) as any; const currentState = netlifyConnection.get(); updateNetlifyConnection({ ...currentState, stats: { sites, totalSites: sites.length, }, }); } catch (error) { console.error('Netlify API Error:', error); logStore.logError('Failed to fetch Netlify stats', { error }); toast.error('Failed to fetch Netlify statistics'); } finally { isFetchingStats.set(false); } }