mirror of
				https://github.com/stackblitz-labs/bolt.diy
				synced 2025-06-26 18:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { atom } from 'nanostores';
 | |
| import type { NetlifyConnection } from '~/types/netlify';
 | |
| import { logStore } from './logs';
 | |
| import { toast } from 'react-toastify';
 | |
| 
 | |
| // Initialize with stored connection or defaults
 | |
| 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);
 | |
| 
 | |
|   // 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);
 | |
|   }
 | |
| }
 |