export const STORAGE_KEY_PREFIX = 'zip_ai_chat_'; export const PLAN_STATUS_CACHE_MS = 5 * 60 * 1000; export const INITIAL_MESSAGES_COUNT = 50; export const MESSAGES_PER_PAGE = 50; /** * Generate a storage key that includes domain and userId for proper isolation. * This ensures different WordPress sites and users have separate localStorage. */ export const getStorageKey = (key, config) => { const domain = config?.domain || 'unknown'; const userId = config?.userId || 'unknown'; return `${STORAGE_KEY_PREFIX}${domain}_${userId}_${key}`; }; /** * Format messages from API response to internal format * @param {Array} apiMessages - Messages from API * @returns {Array} Formatted messages */ export const formatMessagesFromApi = (apiMessages) => { const formattedMessages = []; apiMessages.forEach((msg, index) => { // Handle user_message/assistant_message format from Laravel (primary format) if (msg.user_message) { formattedMessages.push({ id: msg.id || Date.now() + index, role: 'user', content: msg.user_message, timestamp: msg.created_at || new Date().toISOString() }); } else if (msg.assistant_message || msg.assistant_content) { const content = Array.isArray(msg.assistant_content) && msg.assistant_content.length > 0 ? msg.assistant_content : msg.assistant_message; formattedMessages.push({ id: msg.id || Date.now() + index + 0.5, role: 'assistant', content, timestamp: msg.created_at || new Date().toISOString() }); } else if (msg.role && msg.content) { // Fallback: support role/content format for backwards compatibility formattedMessages.push({ id: msg.id || Date.now() + index, role: msg.role, content: msg.content, timestamp: msg.created_at || new Date().toISOString() }); } }); return formattedMessages; };