import { useState, useEffect } from "react"; import { toast } from "sonner"; import { GoogleCalendarCard } from "@/modules/intelligence-ia/components/integrations/GoogleCalendarCard"; import { GoogleSheetsCard } from "@/modules/intelligence-ia/components/integrations/GoogleSheetsCard"; import { AsanaCard } from "@/modules/intelligence-ia/components/integrations/AsanaCard"; import { asanaService } from "@/services/asana"; import { userProfileService } from "@/services/userProfile"; import { GlobalFunctions, TransferAreaProperties } from "@/GlobalFunctions"; interface Workspace { id: string; name: string; } interface User { id: string; name: string; } export default function Integrations() { const [asanaWorkspaces, setAsanaWorkspaces] = useState([]); const [asanaUsers, setAsanaUsers] = useState([]); const [loadingAsanaWorkspaces, setLoadingAsanaWorkspaces] = useState(false); const [loadingAsanaUsers, setLoadingAsanaUsers] = useState(false); const [asanaToken, setAsanaToken] = useState(""); const [asanaApiKey, setAsanaApiKey] = useState(""); const [selectedWorkspaceId, setSelectedWorkspaceId] = useState(""); const [selectedUserId, setSelectedUserId] = useState(""); const [loadingIntegration, setLoadingIntegration] = useState(true); const [hasIntegration, setHasIntegration] = useState(false); const [integrationId, setIntegrationId] = useState(""); const [userId, setUserId] = useState(""); const [saving, setSaving] = useState(false); const handleAsanaSave = async (apiKey: string, workspaceId: string, usuarioAsanaId: string) => { if (!apiKey || !workspaceId || !usuarioAsanaId) { toast.error("Preencha todos os campos obrigatórios"); return; } // Encontra o nome do workspace e do usuário selecionado const workspace = asanaWorkspaces.find(w => w.id === workspaceId); const user = asanaUsers.find(u => u.id === usuarioAsanaId); if (!workspace || !user) { toast.error("Workspace ou usuário não encontrado"); return; } try { setSaving(true); if (hasIntegration && integrationId) { // Atualiza integração existente await asanaService.updateIntegration(integrationId, { api_key: apiKey, workspace_gid: workspaceId, workspace_nome: workspace.name, usuario_asana_gid: usuarioAsanaId, usuario_asana_nome: user.name, }); toast.success("Integração do Asana atualizada com sucesso!"); } else { // Cria nova integração if (!userId) { toast.error("ID do usuário não encontrado"); return; } const response = await asanaService.createIntegration({ user_id: userId, api_key: apiKey, workspace_gid: workspaceId, workspace_nome: workspace.name, usuario_asana_gid: usuarioAsanaId, usuario_asana_nome: user.name, }); if (response.success && response.integracao_id) { setIntegrationId(response.integracao_id); setHasIntegration(true); } toast.success("Integração do Asana criada com sucesso!"); } } catch (error: unknown) { console.error("Erro ao salvar integração do Asana:", error); const errorMessage = error && typeof error === 'object' && 'message' in error ? (error as { message: string }).message : "Erro ao salvar integração do Asana"; toast.error(errorMessage); } finally { setSaving(false); } }; const handleAsanaApiKeyConfirm = async (apiKey: string) => { if (!apiKey || apiKey.trim().length === 0) { toast.error("Insira um token válido do Asana"); return; } try { setLoadingAsanaWorkspaces(true); // Busca workspaces da API do Asana const workspaces = await asanaService.getWorkspaces(apiKey); if (workspaces && workspaces.length > 0) { setAsanaWorkspaces(workspaces); setAsanaUsers([]); setAsanaToken(apiKey); // Armazena o token para usar na busca de usuários toast.success(`${workspaces.length} workspace(s) encontrado(s)`); } else { setAsanaWorkspaces([]); setAsanaUsers([]); setAsanaToken(""); toast.warning("Nenhum workspace encontrado para este token"); } } catch (error: unknown) { console.error("Erro ao buscar workspaces do Asana:", error); const errorMessage = error && typeof error === 'object' && 'message' in error ? (error as { message: string }).message : "Erro ao buscar workspaces do Asana. Verifique se o token está correto."; toast.error(errorMessage); setAsanaWorkspaces([]); setAsanaUsers([]); setAsanaToken(""); // Limpa o token em caso de erro } finally { setLoadingAsanaWorkspaces(false); } }; const handleAsanaWorkspaceChange = async (workspaceId: string) => { setSelectedWorkspaceId(workspaceId); if (!workspaceId || !asanaToken) { setAsanaUsers([]); setSelectedUserId(""); return; } try { setLoadingAsanaUsers(true); // Busca usuários do workspace da API do Asana const users = await asanaService.getUsers(asanaToken, workspaceId); if (users && users.length > 0) { setAsanaUsers(users); // Não mostra toast ao selecionar workspace (só quando confirmar token) } else { setAsanaUsers([]); setSelectedUserId(""); } } catch (error: unknown) { console.error("Erro ao buscar usuários do Asana:", error); const errorMessage = error && typeof error === 'object' && 'message' in error ? (error as { message: string }).message : "Erro ao buscar usuários do Asana. Verifique se o token está correto."; toast.error(errorMessage); setAsanaUsers([]); setSelectedUserId(""); } finally { setLoadingAsanaUsers(false); } }; // Carrega a integração do Asana ao montar o componente useEffect(() => { const loadAsanaIntegration = async () => { try { setLoadingIntegration(true); // Obtém o ID do usuário do perfil let userEmail = GlobalFunctions.getUsuarioLogado().email; // Se não tem email, tenta obter do Transfer Area como fallback if (!userEmail) { const transferEmail = GlobalFunctions.getTransferProperty( TransferAreaProperties.UsuarioEmail ); if (transferEmail) { userEmail = transferEmail as string; } } // Se ainda não tem email, tenta obter do token novamente após refresh if (!userEmail) { try { await GlobalFunctions.getToken(); await new Promise(resolve => setTimeout(resolve, 500)); userEmail = GlobalFunctions.getUsuarioLogado().email; } catch (error) { console.error("Erro ao fazer refresh do token:", error); } } if (!userEmail) { console.log("Integrations: Não foi possível obter email do usuário"); setLoadingIntegration(false); return; } // Busca o perfil do usuário para obter o ID const userProfile = await userProfileService.getUserProfile(userEmail); if (!userProfile.success || !userProfile.id) { console.log("Integrations: Usuário não encontrado ou sem ID"); setLoadingIntegration(false); return; } // Armazena o ID do usuário para usar ao criar integração setUserId(userProfile.id); // Busca a integração do Asana const integration = await asanaService.getIntegration(userProfile.id); if (integration && integration.success) { // Marca que há integração existente setHasIntegration(true); // Armazena o ID da integração (pode vir como integracao_id ou id) if (integration.integracao_id) { setIntegrationId(integration.integracao_id); } else if (integration.id) { setIntegrationId(integration.id); } // Preenche os dados da integração if (integration.api_key) { setAsanaApiKey(integration.api_key); setAsanaToken(integration.api_key); // Busca workspaces com o token try { const workspaces = await asanaService.getWorkspaces(integration.api_key); setAsanaWorkspaces(workspaces); // Se tem workspace_gid, seleciona e busca usuários if (integration.workspace_gid) { setSelectedWorkspaceId(integration.workspace_gid); // Busca usuários do workspace const users = await asanaService.getUsers(integration.api_key, integration.workspace_gid); setAsanaUsers(users); // Se tem usuario_asana_gid, seleciona if (integration.usuario_asana_gid) { setSelectedUserId(integration.usuario_asana_gid); } } } catch (error) { console.error("Erro ao carregar workspaces/usuários:", error); // Continua mesmo se não conseguir carregar workspaces } } } else { // Não há integração, marca como false setHasIntegration(false); } } catch (error: unknown) { console.error("Erro ao carregar integração do Asana:", error); // Não mostra erro para o usuário, apenas deixa os campos vazios } finally { setLoadingIntegration(false); } }; loadAsanaIntegration(); }, []); return (
{/* Header */}

Integrações

Configure as conexões do seu agente com serviços externos

{/* Integrations Grid */}
); }