|
import { atom } from 'nanostores'; |
|
import type { NetlifyConnection } from '~/types/netlify'; |
|
import { logStore } from './logs'; |
|
import { toast } from 'react-toastify'; |
|
|
|
|
|
const storedConnection = typeof window !== 'undefined' ? localStorage.getItem('netlify_connection') : null; |
|
const initialConnection: NetlifyConnection = storedConnection |
|
? JSON.parse(storedConnection) |
|
: { |
|
user: null, |
|
token: '', |
|
stats: undefined, |
|
}; |
|
|
|
export const netlifyConnection = atom<NetlifyConnection>(initialConnection); |
|
export const isConnecting = atom<boolean>(false); |
|
export const isFetchingStats = atom<boolean>(false); |
|
|
|
export const updateNetlifyConnection = (updates: Partial<NetlifyConnection>) => { |
|
const currentState = netlifyConnection.get(); |
|
const newState = { ...currentState, ...updates }; |
|
netlifyConnection.set(newState); |
|
|
|
|
|
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); |
|
} |
|
} |
|
|