diff --git a/src/components/whatsapp/CreateInstanceForm.tsx b/src/components/whatsapp/CreateInstanceForm.tsx index 3e3eeb3..1ba7af9 100644 --- a/src/components/whatsapp/CreateInstanceForm.tsx +++ b/src/components/whatsapp/CreateInstanceForm.tsx @@ -56,6 +56,7 @@ const CreateInstanceForm = ({ onInstanceCreated }: CreateInstanceFormProps) => { setLoading(true); try { + console.log(`Creating instance with name ${instanceName} and number ${phoneNumber}`); const data = await createWhatsAppInstance(instanceName, phoneNumber); console.log('API response for create instance:', data); @@ -63,7 +64,7 @@ const CreateInstanceForm = ({ onInstanceCreated }: CreateInstanceFormProps) => { // Create new instance object with user ID const newInstance: WhatsAppInstance = { instanceName, - instanceId: data.instance?.instanceId || instanceName, // Use instanceName as fallback ID + instanceId: instanceName, // Use instanceName as the ID for consistency phoneNumber, userId: currentUserId, // Associate with current user status: data.instance?.status || 'created', diff --git a/src/components/whatsapp/InstanceCard.tsx b/src/components/whatsapp/InstanceCard.tsx index c6ae9b3..bca7224 100644 --- a/src/components/whatsapp/InstanceCard.tsx +++ b/src/components/whatsapp/InstanceCard.tsx @@ -141,6 +141,27 @@ const InstanceCard = ({ ); }; + // Determina o estado de conexão a ser exibido + const getConnectionStatus = () => { + // Se o status é 'disconnected', 'error', 'destroyed', ou não está definido, consideramos como desconectado + if (instance.status === 'disconnected' || + instance.status === 'error' || + instance.status === 'destroyed' || + !instance.status) { + return 'closed'; + } + + // Se o connectionState já está definido como 'open', manter + if (instance.connectionState === 'open') { + return 'open'; + } + + // Em outros casos, usar o valor atual do connectionState + return instance.connectionState || 'closed'; + }; + + const connectionStatus = getConnectionStatus(); + return ( <> @@ -154,11 +175,16 @@ const InstanceCard = ({ {instance.phoneNumber}
- {instance.connectionState === 'open' ? ( + {connectionStatus === 'open' ? ( Status: Conectado + ) : connectionStatus === 'connecting' ? ( + + + Status: Conectando + ) : ( diff --git a/src/components/whatsapp/InstanceStats.tsx b/src/components/whatsapp/InstanceStats.tsx index 8b61206..2922c95 100644 --- a/src/components/whatsapp/InstanceStats.tsx +++ b/src/components/whatsapp/InstanceStats.tsx @@ -8,7 +8,7 @@ interface InstanceStatsProps { const InstanceStats = ({ instances }: InstanceStatsProps) => { const totalInstances = instances.length; const connectedInstances = instances.filter(i => i.connectionState === 'open').length; - const disconnectedInstances = instances.filter(i => i.connectionState === 'closed').length; + const disconnectedInstances = instances.filter(i => i.connectionState === 'closed' || i.status === 'disconnected').length; const connectingInstances = instances.filter(i => i.connectionState === 'connecting').length; if (totalInstances === 0) { diff --git a/src/hooks/useWhatsAppActions.ts b/src/hooks/useWhatsAppActions.ts index 45c9269..f1126ae 100644 --- a/src/hooks/useWhatsAppActions.ts +++ b/src/hooks/useWhatsAppActions.ts @@ -22,6 +22,7 @@ export const useWhatsAppActions = ( // Handler for quando uma instância é reiniciada const handleRestartInstance = async (instance: WhatsAppInstance) => { try { + console.log(`Attempting to restart instance ${instance.instanceName}`); await restartInstance(instance.instanceName); // Atualiza o estado da instância para "connecting" @@ -29,6 +30,7 @@ export const useWhatsAppActions = ( ...instance, connectionState: 'connecting' as const }; + console.log(`Instance ${instance.instanceName} restart initiated, setting state to connecting`, updatedInstance); updateInstance(updatedInstance); toast({ @@ -52,13 +54,16 @@ export const useWhatsAppActions = ( // Handler for quando uma instância é desconectada const handleLogoutInstance = async (instance: WhatsAppInstance) => { try { + console.log(`Attempting to logout instance ${instance.instanceName}`); await logoutInstance(instance.instanceName); // Atualiza o estado da instância para "closed" const updatedInstance = { ...instance, - connectionState: 'closed' as const + connectionState: 'closed' as const, + status: 'disconnected' }; + console.log(`Instance ${instance.instanceName} logout successful, updating instance state`, updatedInstance); updateInstance(updatedInstance); toast({ @@ -79,15 +84,21 @@ export const useWhatsAppActions = ( // Handler for quando a presença é alterada const handleSetPresence = async (instance: WhatsAppInstance, presence: 'online' | 'offline') => { try { + console.log(`Setting presence to ${presence} for instance ${instance.instanceName}`); await setInstancePresence(instance.instanceName, presence); + const updatedInstance = { + ...instance, + presence: presence + }; + console.log(`Updated instance with new presence status`, updatedInstance); + updateInstance(updatedInstance); + toast({ title: "Sucesso", description: `Instância ${instance.instanceName} agora está ${presence === 'online' ? 'Online' : 'Offline'}` }); - // Não precisamos alterar o estado da instância aqui, pois isso não afeta o connectionState - } catch (error) { console.error(`Error setting presence to ${presence} for instance ${instance.instanceName}:`, error); toast({ @@ -100,11 +111,12 @@ export const useWhatsAppActions = ( // Handler for when an instance is deleted const handleDeleteInstance = async (instanceId: string, instanceName: string) => { - console.log(`Deleting instance with ID: ${instanceId}`); + console.log(`Deleting instance with ID: ${instanceId}, name: ${instanceName}`); try { // Call API to delete instance - await deleteInstance(instanceName); + const response = await deleteInstance(instanceName); + console.log(`Deletion API response for instance ${instanceName}:`, response); // Remove from local state removeInstance(instanceId); @@ -112,6 +124,7 @@ export const useWhatsAppActions = ( // If we're viewing QR code for this instance, close the dialog if (activeInstance?.instanceId === instanceId) { setQrDialogOpen(false); + setActiveInstance(null); } toast({ @@ -120,9 +133,19 @@ export const useWhatsAppActions = ( }); } catch (error) { console.error(`Error deleting instance with ID ${instanceId}:`, error); + + // Even if the API call fails, we still want to remove the instance from local storage + // This handles the case when instances are in inconsistent state with the server + removeInstance(instanceId); + + if (activeInstance?.instanceId === instanceId) { + setQrDialogOpen(false); + setActiveInstance(null); + } + toast({ - title: "Erro", - description: "Falha ao excluir a instância. Tente novamente.", + title: "Aviso", + description: "Instância removida localmente, mas pode haver falha na comunicação com o servidor.", variant: "destructive", }); } @@ -130,6 +153,7 @@ export const useWhatsAppActions = ( // Handler for when QR code dialog is requested const handleViewQrCode = async (instance: WhatsAppInstance) => { + console.log(`Opening QR code dialog for instance: ${instance.instanceName}`); setActiveInstance(instance); setQrDialogOpen(true); diff --git a/src/hooks/useWhatsAppInstances.ts b/src/hooks/useWhatsAppInstances.ts index cedae41..ac3860f 100644 --- a/src/hooks/useWhatsAppInstances.ts +++ b/src/hooks/useWhatsAppInstances.ts @@ -1,5 +1,4 @@ - -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import { useToast } from '@/hooks/use-toast'; import { WhatsAppInstance } from '@/types/whatsAppTypes'; import { @@ -37,26 +36,50 @@ export const useWhatsAppInstances = () => { }, [instances, currentUserId]); // Function to check connection status for all instances - const checkAllInstancesStatus = async () => { + const checkAllInstancesStatus = useCallback(async () => { if (instances.length === 0) return; + console.log(`Checking connection status for ${instances.length} instances`); + try { const updatedInstances = await Promise.all( instances.map(async (instance) => { try { + console.log(`Checking status for ${instance.instanceName}`); const state = await fetchConnectionState(instance.instanceName); - return { ...instance, connectionState: state }; + console.log(`Status for ${instance.instanceName}: ${state}`); + + // Only update connectionState if it's different + if (instance.connectionState !== state) { + return { ...instance, connectionState: state }; + } + return instance; } catch (error) { console.error(`Error checking status for ${instance.instanceName}:`, error); - return { ...instance, connectionState: 'closed' as const }; + + // If the instance doesn't exist on the server, mark it as closed + if (error instanceof Error && error.message.includes("does not exist")) { + return { ...instance, connectionState: 'closed', status: 'disconnected' }; + } + + // Keep the current state in case of other errors + return instance; } }) ); - setInstances(updatedInstances); + + // Only update state if there are actual changes + const hasChanges = JSON.stringify(updatedInstances) !== JSON.stringify(instances); + if (hasChanges) { + console.log('Updated instances after status check:', updatedInstances); + setInstances(updatedInstances); + } else { + console.log('No changes in instance status'); + } } catch (error) { console.error("Error checking instances status:", error); } - }; + }, [instances]); // Handler para atualizar a lista de instâncias do servidor const refreshInstances = async () => { @@ -71,35 +94,47 @@ export const useWhatsAppInstances = () => { setIsRefreshing(true); try { + console.log("Fetching instances from server..."); const response = await fetchAllInstances(); console.log("Fetched instances from server:", response); if (response.instances && Array.isArray(response.instances)) { - // Filtra instâncias para mostrar apenas as do usuário atual - // E mapeia para o formato correto com userId + // Mapeia as instâncias do servidor para o formato correto com userId const serverInstances: WhatsAppInstance[] = response.instances - .filter(serverInstance => { - // Implemente sua lógica de filtro para o usuário atual (se necessário) - // Por padrão, vamos assumir que todas as instâncias são do usuário atual - return true; - }) .map(serverInstance => ({ instanceName: serverInstance.instanceName, - instanceId: serverInstance.instanceName, + instanceId: serverInstance.instanceName, // Using instanceName as the ID for consistency phoneNumber: serverInstance.number || 'Desconhecido', userId: currentUserId, connectionState: serverInstance.state || 'closed', status: serverInstance.status || 'unknown' })); - // Mesclando instâncias do servidor com as locais (para não perder dados locais) - const localInstanceIds = new Set(instances.map(i => i.instanceId)); - const newInstances = [ - ...instances, - ...serverInstances.filter(i => !localInstanceIds.has(i.instanceId)) - ]; + console.log("Mapped server instances:", serverInstances); + + // Identifica instâncias novas que não existem localmente + const localInstanceIds = new Set(instances.map(i => i.instanceId)); + const newServerInstances = serverInstances.filter(i => !localInstanceIds.has(i.instanceId)); + + // Atualiza instâncias existentes com dados do servidor + const updatedExistingInstances = instances.map(localInstance => { + const serverMatch = serverInstances.find(si => si.instanceId === localInstance.instanceId); + if (serverMatch) { + return { + ...localInstance, + connectionState: serverMatch.connectionState, + status: serverMatch.status + }; + } + return localInstance; + }); + + // Combina tudo + const allInstances = [...updatedExistingInstances, ...newServerInstances]; + + console.log("Combined instances after refresh:", allInstances); + setInstances(allInstances); - setInstances(newInstances); toast({ title: "Sucesso", description: `${serverInstances.length} instâncias encontradas no servidor`, @@ -120,18 +155,34 @@ export const useWhatsAppInstances = () => { } finally { setIsRefreshing(false); // Verificar status após atualizar a lista - checkAllInstancesStatus(); + await checkAllInstancesStatus(); } }; // Add a new instance const addInstance = (newInstance: WhatsAppInstance) => { console.log("New instance created, adding to instances list:", newInstance); - setInstances(prevInstances => [...prevInstances, newInstance]); + + // Verifica se já existe uma instância com o mesmo ID + const existingIndex = instances.findIndex(inst => inst.instanceId === newInstance.instanceId); + + if (existingIndex >= 0) { + // Atualiza a instância existente + console.log(`Instance with ID ${newInstance.instanceId} already exists, updating it`); + setInstances(prevInstances => + prevInstances.map((instance, index) => + index === existingIndex ? newInstance : instance + ) + ); + } else { + // Adiciona nova instância + setInstances(prevInstances => [...prevInstances, newInstance]); + } }; // Remove an instance const removeInstance = (instanceId: string) => { + console.log(`Removing instance with ID: ${instanceId}`); setInstances(prevInstances => { const filtered = prevInstances.filter(instance => instance.instanceId !== instanceId); console.log("Updated instances after deletion:", filtered); @@ -141,13 +192,17 @@ export const useWhatsAppInstances = () => { // Update an instance const updateInstance = (updatedInstance: WhatsAppInstance) => { - setInstances(prevInstances => - prevInstances.map(instance => + console.log(`Updating instance: ${updatedInstance.instanceName}`, updatedInstance); + setInstances(prevInstances => { + const newInstances = prevInstances.map(instance => instance.instanceId === updatedInstance.instanceId ? updatedInstance : instance - ) - ); + ); + + console.log("Updated instances:", newInstances); + return newInstances; + }); }; return { diff --git a/src/pages/WhatsApp.tsx b/src/pages/WhatsApp.tsx index 9ff47b9..383189f 100644 --- a/src/pages/WhatsApp.tsx +++ b/src/pages/WhatsApp.tsx @@ -8,8 +8,10 @@ import InstanceStats from '@/components/whatsapp/InstanceStats'; import QrCodeDialog from '@/components/whatsapp/QrCodeDialog'; import { useWhatsAppInstances } from '@/hooks/useWhatsAppInstances'; import { useWhatsAppActions } from '@/hooks/useWhatsAppActions'; +import { useToast } from '@/hooks/use-toast'; const WhatsApp = () => { + const { toast } = useToast(); const { instances, isRefreshing, @@ -33,17 +35,20 @@ const WhatsApp = () => { // Set up periodic status checks useEffect(() => { + console.log("Setting up periodic status checks, current instances:", instances.length); + // Check status initially if (instances.length > 0) { checkAllInstancesStatus(); } - // Set up interval for periodic checks (every 60 seconds) + // Set up interval for periodic checks (every 30 seconds) const interval = setInterval(() => { if (instances.length > 0) { + console.log("Running periodic status check"); checkAllInstancesStatus(); } - }, 60000); // 60 seconds + }, 30000); // 30 seconds // Clean up interval when component unmounts return () => { @@ -53,6 +58,21 @@ const WhatsApp = () => { }; }, [instances.length, checkAllInstancesStatus]); + // Run refresh instances on initial load to get server instances + useEffect(() => { + const initialLoad = async () => { + if (instances.length === 0) { + try { + await refreshInstances(); + } catch (error) { + console.error("Error on initial instance refresh:", error); + } + } + }; + + initialLoad(); + }, []); + // Handler for when a new instance is created const handleInstanceCreated = async (newInstance: WhatsAppInstance) => { console.log('New instance to be added:', newInstance); @@ -64,14 +84,31 @@ const WhatsApp = () => { } // Trigger a status check for all instances - await checkAllInstancesStatus(); + try { + await checkAllInstancesStatus(); + } catch (error) { + console.error("Error checking status after instance creation:", error); + toast({ + title: "Aviso", + description: "Instância criada, mas não foi possível verificar o status. Tente atualizar a lista manualmente.", + variant: "default", + }); + } }; // Handler for when an instance is deleted const handleDeleteInstanceWrapper = (instanceId: string) => { + console.log(`Instance deletion requested for ID: ${instanceId}`); const instanceToDelete = instances.find(i => i.instanceId === instanceId); if (instanceToDelete) { handleDeleteInstance(instanceId, instanceToDelete.instanceName); + } else { + console.error(`Instance with ID ${instanceId} not found for deletion`); + toast({ + title: "Erro", + description: "Instância não encontrada para exclusão", + variant: "destructive", + }); } }; diff --git a/src/services/whatsAppService.ts b/src/services/whatsAppService.ts index b073abb..55c5556 100644 --- a/src/services/whatsAppService.ts +++ b/src/services/whatsAppService.ts @@ -11,6 +11,7 @@ export const createWhatsAppInstance = async ( instanceName: string, phoneNumber: string ): Promise => { + console.log(`Creating new WhatsApp instance: ${instanceName}, ${phoneNumber}`); const response = await fetch(`https://${SERVER_URL}/instance/create`, { method: 'POST', headers: { @@ -27,13 +28,17 @@ export const createWhatsAppInstance = async ( if (!response.ok) { const errorData = await response.json(); + console.error('Error creating instance:', errorData); throw new Error(errorData.message || 'Erro ao criar instância'); } - return response.json(); + const data = await response.json(); + console.log('Create instance API response:', data); + return data; }; export const fetchQrCode = async (instanceName: string): Promise => { + console.log(`Fetching QR code for instance: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/connect/${encodeURIComponent(instanceName)}`, { method: 'GET', headers: { @@ -44,14 +49,18 @@ export const fetchQrCode = async (instanceName: string): Promise => { if (!response.ok) { const errorData = await response.json(); + console.error('Error fetching QR code:', errorData); throw new Error(errorData.message || 'Erro ao obter QR Code'); } - return response.json(); + const data = await response.json(); + console.log('QR code fetch response:', data); + return data; }; export const fetchConnectionState = async (instanceName: string): Promise<'open' | 'closed' | 'connecting'> => { try { + console.log(`Fetching connection state for: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/connectionState/${encodeURIComponent(instanceName)}`, { method: 'GET', headers: { @@ -61,13 +70,25 @@ export const fetchConnectionState = async (instanceName: string): Promise<'open' }); if (!response.ok) { + const errorData = await response.json(); + console.error(`Connection state error for ${instanceName}:`, errorData); + + // If instance doesn't exist, throw a specific error + if (response.status === 404) { + throw new Error(`The "${instanceName}" instance does not exist`); + } + return 'closed'; } const data = await response.json(); + console.log(`Connection state for ${instanceName}:`, data); return data.instance?.state || 'closed'; } catch (error) { - console.error("Error fetching connection state:", error); + console.error(`Error fetching connection state for ${instanceName}:`, error); + if (error instanceof Error && error.message.includes("does not exist")) { + throw error; // Rethrow specific "does not exist" errors + } return 'closed'; } }; @@ -75,6 +96,7 @@ export const fetchConnectionState = async (instanceName: string): Promise<'open' // Nova função para listar todas as instâncias export const fetchAllInstances = async (): Promise => { try { + console.log('Fetching all instances'); const response = await fetch(`https://${SERVER_URL}/fetch-instances`, { method: 'GET', headers: { @@ -84,10 +106,14 @@ export const fetchAllInstances = async (): Promise => { }); if (!response.ok) { - throw new Error('Erro ao buscar instâncias'); + const errorData = await response.json(); + console.error('Error fetching instances:', errorData); + throw new Error(errorData.message || 'Erro ao buscar instâncias'); } - return response.json(); + const data = await response.json(); + console.log('All instances response:', data); + return data; } catch (error) { console.error("Error fetching all instances:", error); throw error; @@ -97,6 +123,7 @@ export const fetchAllInstances = async (): Promise => { // Função para reiniciar uma instância export const restartInstance = async (instanceName: string): Promise => { try { + console.log(`Restarting instance: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/restart/${encodeURIComponent(instanceName)}`, { method: 'PUT', headers: { @@ -107,10 +134,13 @@ export const restartInstance = async (instanceName: string): Promise => { if (!response.ok) { const errorData = await response.json(); + console.error(`Error restarting instance ${instanceName}:`, errorData); throw new Error(errorData.message || 'Erro ao reiniciar instância'); } - return response.json(); + const data = await response.json(); + console.log(`Restart response for ${instanceName}:`, data); + return data; } catch (error) { console.error(`Error restarting instance ${instanceName}:`, error); throw error; @@ -120,6 +150,7 @@ export const restartInstance = async (instanceName: string): Promise => { // Função para desconectar (logout) uma instância export const logoutInstance = async (instanceName: string): Promise => { try { + console.log(`Logging out instance: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/logout/${encodeURIComponent(instanceName)}`, { method: 'DELETE', headers: { @@ -130,10 +161,13 @@ export const logoutInstance = async (instanceName: string): Promise => { if (!response.ok) { const errorData = await response.json(); + console.error(`Error logging out instance ${instanceName}:`, errorData); throw new Error(errorData.message || 'Erro ao desconectar instância'); } - return response.json(); + const data = await response.json(); + console.log(`Logout response for ${instanceName}:`, data); + return data; } catch (error) { console.error(`Error logging out instance ${instanceName}:`, error); throw error; @@ -143,6 +177,7 @@ export const logoutInstance = async (instanceName: string): Promise => { // Função para excluir uma instância export const deleteInstance = async (instanceName: string): Promise => { try { + console.log(`Deleting instance: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/${encodeURIComponent(instanceName)}`, { method: 'DELETE', headers: { @@ -153,10 +188,13 @@ export const deleteInstance = async (instanceName: string): Promise => { if (!response.ok) { const errorData = await response.json(); + console.error(`Error deleting instance ${instanceName}:`, errorData); throw new Error(errorData.message || 'Erro ao excluir instância'); } - return response.json(); + const data = await response.json(); + console.log(`Delete response for ${instanceName}:`, data); + return data; } catch (error) { console.error(`Error deleting instance ${instanceName}:`, error); throw error; @@ -166,6 +204,7 @@ export const deleteInstance = async (instanceName: string): Promise => { // Função para definir presença online/offline export const setInstancePresence = async (instanceName: string, presence: 'online' | 'offline'): Promise => { try { + console.log(`Setting presence to ${presence} for: ${instanceName}`); const response = await fetch(`https://${SERVER_URL}/instance/setPresence/${encodeURIComponent(instanceName)}`, { method: 'POST', headers: { @@ -177,10 +216,13 @@ export const setInstancePresence = async (instanceName: string, presence: 'onlin if (!response.ok) { const errorData = await response.json(); + console.error(`Error setting presence for ${instanceName}:`, errorData); throw new Error(errorData.message || `Erro ao definir presença para ${presence}`); } - return response.json(); + const data = await response.json(); + console.log(`Set presence response for ${instanceName}:`, data); + return data; } catch (error) { console.error(`Error setting presence to ${presence} for instance ${instanceName}:`, error); throw error; @@ -192,19 +234,24 @@ export const saveInstancesToLocalStorage = ( currentUserId: string ): void => { try { + console.log(`Saving ${instances.length} instances for user ${currentUserId}`); // Get existing instances from localStorage const savedInstancesStr = localStorage.getItem(STORAGE_KEY); let allInstances: WhatsAppInstance[] = []; if (savedInstancesStr) { - // Parse saved instances - const savedInstances = JSON.parse(savedInstancesStr); - - // If it's an array, filter out current user's old instances - if (Array.isArray(savedInstances)) { - allInstances = savedInstances.filter( - (instance: WhatsAppInstance) => instance.userId !== currentUserId - ); + try { + // Parse saved instances + const savedInstances = JSON.parse(savedInstancesStr); + + // If it's an array, filter out current user's old instances + if (Array.isArray(savedInstances)) { + allInstances = savedInstances.filter( + (instance: WhatsAppInstance) => instance.userId !== currentUserId + ); + } + } catch (parseError) { + console.error('Error parsing stored instances, resetting:', parseError); } } @@ -223,21 +270,26 @@ export const loadInstancesFromLocalStorage = ( userId: string ): WhatsAppInstance[] => { try { + console.log(`Loading instances for user: ${userId}`); const savedInstancesStr = localStorage.getItem(STORAGE_KEY); console.log('Raw saved instances from localStorage:', savedInstancesStr); if (savedInstancesStr && userId) { - // Parse saved instances - const allInstances = JSON.parse(savedInstancesStr); - - // If it's an array, filter by user ID - if (Array.isArray(allInstances)) { - // Filter instances to only show those belonging to the current user - const userInstances = allInstances.filter( - (instance: WhatsAppInstance) => instance.userId === userId - ); - console.log(`Found ${userInstances.length} instances for user ${userId}:`, userInstances); - return userInstances; + try { + // Parse saved instances + const allInstances = JSON.parse(savedInstancesStr); + + // If it's an array, filter by user ID + if (Array.isArray(allInstances)) { + // Filter instances to only show those belonging to the current user + const userInstances = allInstances.filter( + (instance: WhatsAppInstance) => instance.userId === userId + ); + console.log(`Found ${userInstances.length} instances for user ${userId}:`, userInstances); + return userInstances; + } + } catch (parseError) { + console.error('Error parsing stored instances:', parseError); } } console.log(`No instances found for user ${userId}`);