| 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); |
| } |
| } |
|
|