up
This commit is contained in:
+65
-11
@@ -455,6 +455,9 @@
|
||||
<div>Cargando conversaciones...</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="load-more-container" style="padding:10px; text-align:center; display:none;">
|
||||
<button id="load-more-btn" class="btn btn-sm btn-outline-primary">Cargar más</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Área principal del chat -->
|
||||
@@ -534,7 +537,11 @@
|
||||
this.currentConversationId = null;
|
||||
this.currentUserId = null;
|
||||
this.conversations = [];
|
||||
this.conversations = [];
|
||||
// Pagination state
|
||||
this.conversationsPage = 1;
|
||||
this.conversationsLimit = 50;
|
||||
this.hasMoreConversations = true;
|
||||
this.loadingConversations = false;
|
||||
|
||||
this.init();
|
||||
}
|
||||
@@ -671,6 +678,20 @@
|
||||
document.getElementById('file-input').addEventListener('change', (e) => {
|
||||
this.handleFileSelect(e);
|
||||
});
|
||||
|
||||
// Carga paginada: botón "Cargar más" y scroll infinito
|
||||
const loadMoreBtn = document.getElementById('load-more-btn');
|
||||
if (loadMoreBtn) {
|
||||
loadMoreBtn.addEventListener('click', () => this.loadMoreConversations());
|
||||
}
|
||||
const convList = document.getElementById('conversation-list');
|
||||
if (convList) {
|
||||
convList.addEventListener('scroll', () => {
|
||||
if (this.hasMoreConversations && !this.loadingConversations && (convList.scrollTop + convList.clientHeight >= convList.scrollHeight - 60)) {
|
||||
this.loadMoreConversations();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
setupAutoRefresh() {
|
||||
@@ -687,30 +708,63 @@
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
async loadConversations() {
|
||||
async loadConversations(page = 1, append = false) {
|
||||
if (this.loadingConversations) return;
|
||||
this.loadingConversations = true;
|
||||
const loadMoreContainer = document.getElementById('load-more-container');
|
||||
const loadMoreBtn = document.getElementById('load-more-btn');
|
||||
if (loadMoreBtn) loadMoreBtn.disabled = true;
|
||||
try {
|
||||
const response = await fetch('api/get_conversations.php');
|
||||
const data = await response.json();
|
||||
const url = `api/get_conversations.php?page=${page}&limit=${this.conversationsLimit}`;
|
||||
const resp = await fetch(url);
|
||||
const data = await resp.json();
|
||||
console.log('Respuesta get_conversations:', data); // Debug
|
||||
|
||||
// Manejar nuevo formato de respuesta de API
|
||||
|
||||
let items = [];
|
||||
let hasMore = false;
|
||||
if (data && data.success && Array.isArray(data.data)) {
|
||||
this.conversations = data.data;
|
||||
this.renderConversations();
|
||||
items = data.data;
|
||||
hasMore = !!data.has_more || (page * this.conversationsLimit) < (data.total || 0);
|
||||
} else if (Array.isArray(data)) {
|
||||
// Retrocompatibilidad con formato anterior
|
||||
this.conversations = data;
|
||||
this.renderConversations();
|
||||
items = data;
|
||||
hasMore = items.length === this.conversationsLimit;
|
||||
} else {
|
||||
console.error('Error cargando conversaciones: formato de datos inválido', data);
|
||||
alert('Error cargando conversaciones: ' + (data.error || 'formato de datos inválido'));
|
||||
this.loadingConversations = false;
|
||||
if (loadMoreBtn) loadMoreBtn.disabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (append) {
|
||||
this.conversations = this.conversations.concat(items);
|
||||
} else {
|
||||
this.conversations = items;
|
||||
}
|
||||
|
||||
this.hasMoreConversations = hasMore;
|
||||
this.conversationsPage = page;
|
||||
this.renderConversations();
|
||||
|
||||
if (loadMoreContainer) {
|
||||
loadMoreContainer.style.display = this.hasMoreConversations ? 'block' : 'none';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading conversations:', error);
|
||||
alert('Error cargando conversaciones: ' + error.message);
|
||||
} finally {
|
||||
this.loadingConversations = false;
|
||||
if (loadMoreBtn) loadMoreBtn.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
async loadMoreConversations() {
|
||||
if (!this.hasMoreConversations || this.loadingConversations) return;
|
||||
await this.loadConversations(this.conversationsPage + 1, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
renderConversations() {
|
||||
const container = document.getElementById('conversation-list');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user