Files
eveAI/integrations/Wordpress/eveai-chat/assets/js/eveai-sdk.js

167 lines
5.6 KiB
JavaScript

class EveAI {
constructor(config) {
// Required parameters
this.tenantId = config.tenantId;
// Chat configuration
this.language = config.language || 'en';
this.languages = config.languages?.split(',') || ['en'];
this.specialistId = config.specialistId;
// Server Configuration
this.socketUrl = config.socketUrl || 'https://chat.askeveai.com';
this.authUrl = config.authUrl || 'https://api.askeveai.com';
this.proxyUrl = config.proxyUrl; // URL for auth proxy (WP or standalone)
this.wpRestNamespace = 'eveai/v1'; // This should match the PHP constant
this.wpRestUrl = `${config.wpBaseUrl || '/wp-json'}/${this.wpRestNamespace}`;
// Initialize token management
this.tokenManager = new EveAITokenManager({
proxyUrl: this.proxyUrl,
onTokenChange: this.handleTokenChange.bind(this),
onError: this.handleAuthError.bind(this)
});
this.chatWidget = null;
}
async initialize(containerId) {
try {
if (!containerId) {
throw new Error('Container ID is required');
}
console.log('Starting initialization with settings:', {
tenantId: this.tenantId,
wpRestUrl: this.wpRestUrl
});
// Get the WordPress nonce
const wpNonce = window.eveaiWP?.nonce;
if (!wpNonce) {
throw new Error('WordPress nonce not found');
}
// Use WordPress REST API endpoint instead of direct API call
const response = await fetch(`${this.wpRestUrl}/token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': wpNonce,
},
credentials: 'same-origin', // Important for WP cookie handling
body: JSON.stringify({
tenant_id: this.tenantId
})
});
console.log('Token request response status:', response.status);
if (!response.ok) {
const errorText = await response.text();
console.error('Auth error response:', errorText);
throw new Error('Authentication failed');
}
const { access_token, expires_in } = await response.json();
console.log('Token received:', access_token);
console.log('Token Expiry:', expires_in);
// Store token and expiry
this.sessionToken = access_token;
this.tokenExpiry = Date.now() + (expires_in * 1000);
// Initialize token refresh timer
this.setupTokenRefresh(expires_in);
return this.initializeChat(containerId, access_token);
} catch (error) {
console.error('Full initialization error:', error);
throw error;
}
}
setupTokenRefresh(expiresIn) {
// Set up refresh 5 minutes before expiry
const refreshTime = (expiresIn - 300) * 1000; // Convert to milliseconds
setTimeout(() => this.refreshToken(), refreshTime);
}
async refreshToken() {
try {
const response = await fetch(`${this.wpRestUrl}/refresh`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.sessionToken}`
}
});
if (response.ok) {
const { access_token, expires_in } = await response.json();
this.sessionToken = access_token;
this.tokenExpiry = Date.now() + (expires_in * 1000);
// Update token in chat widget
if (this.chatWidget) {
this.chatWidget.setAttribute('session-token', access_token);
}
// Setup next refresh
this.setupTokenRefresh(expires_in);
} else {
console.error('Token refresh failed');
}
} catch (error) {
console.error('Token refresh error:', error);
}
}
async initializeChat(containerId) {
const container = document.getElementById(containerId);
if (!container) {
throw new Error('Container not found');
}
// Create chat widget with all necessary attributes
const chatWidget = document.createElement('eveai-chat-widget');
// Set all required attributes
const attributes = {
'tenant-id': this.tenantId,
'session-token': this.sessionToken,
'language': this.language,
'languages': this.languages.join(','),
'specialist-id': this.specialistId,
'server-url': this.socketUrl
};
console.log('Setting widget attributes:', attributes);
Object.entries(attributes).forEach(([attr, value]) => {
if (value === null || value === undefined) {
console.warn(`Warning: ${attr} is ${value}`);
}
chatWidget.setAttribute(attr, value);
});
container.appendChild(chatWidget);
this.chatWidget = chatWidget;
return chatWidget;
}
handleTokenChange(newToken) {
if (this.chatWidget) {
this.chatWidget.setAttribute('session-token', newToken);
}
}
handleAuthError(error) {
if (this.chatWidget) {
this.chatWidget.handleAuthError(error);
}
}
}
// Make available globally
// window.EveAI = EveAI;