313 lines
11 KiB
TypeScript
313 lines
11 KiB
TypeScript
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<Workspace[]>([]);
|
|
const [asanaUsers, setAsanaUsers] = useState<User[]>([]);
|
|
const [loadingAsanaWorkspaces, setLoadingAsanaWorkspaces] = useState(false);
|
|
const [loadingAsanaUsers, setLoadingAsanaUsers] = useState(false);
|
|
const [asanaToken, setAsanaToken] = useState<string>("");
|
|
const [asanaApiKey, setAsanaApiKey] = useState<string>("");
|
|
const [selectedWorkspaceId, setSelectedWorkspaceId] = useState<string>("");
|
|
const [selectedUserId, setSelectedUserId] = useState<string>("");
|
|
const [loadingIntegration, setLoadingIntegration] = useState(true);
|
|
const [hasIntegration, setHasIntegration] = useState(false);
|
|
const [integrationId, setIntegrationId] = useState<string>("");
|
|
const [userId, setUserId] = useState<string>("");
|
|
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 (
|
|
<div className="space-y-8">
|
|
{/* Header */}
|
|
<div>
|
|
<h1 className="text-2xl font-semibold text-foreground mb-1">
|
|
Integrações
|
|
</h1>
|
|
<p className="text-muted-foreground">
|
|
Configure as conexões do seu agente com serviços externos
|
|
</p>
|
|
</div>
|
|
|
|
{/* Integrations Grid */}
|
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
|
|
<GoogleCalendarCard />
|
|
|
|
<GoogleSheetsCard />
|
|
|
|
<AsanaCard
|
|
apiKey={asanaApiKey}
|
|
workspaces={asanaWorkspaces}
|
|
users={asanaUsers}
|
|
selectedWorkspaceId={selectedWorkspaceId}
|
|
selectedUserId={selectedUserId}
|
|
onSave={handleAsanaSave}
|
|
onConfirmApiKey={handleAsanaApiKeyConfirm}
|
|
onWorkspaceChange={handleAsanaWorkspaceChange}
|
|
loadingWorkspaces={loadingAsanaWorkspaces}
|
|
loadingUsers={loadingAsanaUsers}
|
|
loadingIntegration={loadingIntegration}
|
|
hasIntegration={hasIntegration}
|
|
saving={saving}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|