Voir tout
${répondre?.comment_author}${répondre?.eln_tier_label ? " : "}
•
${réponse?.comment_temps_relatif}
${répondre?.comment_content?.trimer()}
`;
}
function createComment(comment, replies, isLastComment) {
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);
si (!commentListDiv) {
retour;
}
const borderClasses = isLastComment ? ” : ‘tw:border-b tw:border-slate-200’;
const currentUser = window?.tp?.pianoId?.getUser() ?? null;
const currentUserInitials = currentUser
? getInitials(`${currentUser?.firstName ?? ”} ${currentUser?.lastName ?? ”}`)
: ”;
const repliesHTML = replies.length ? `
${replies.map(buildReplyHTML).join(”)}
` : ”;
const replyButtonHTML = allowsComments ? `
` : ”;
const replyFormHTML = allowsComments ? `
` : ”;
const commentDiv = `
${comment?.comment_author}${comment?.eln_tier_label ? " : "}
•
${commentaire?.commentaire_temps_relatif}
${comment?.comment_content?.trim()}
${replyButtonHTML}
${réponsesHTML}
${replyFormHTML}
`;
commentListDiv.innerHTML += commentDiv;
}
function displayComments() {
// Vider le conteneur de la liste des commentaires avant d'actualiser les commentaires.
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);
commentListDiv.innerHTML = ”;
const comments = state?.comments ?? [];
if (!comments.length) {
retour;
}
// Créer une structure hiérarchisée : séparer le niveau supérieur des réponses.
const repliesByParent = {};
const topLevelComments = [];
comments.forEach(comment => {
si (commentaire.commentaire_parent === 0) {
topLevelComments.push(comment);
} autre {
const parentId = comment.comment_parent;
si (!réponsesByParent[parentId]) {
réponsesParParent[parentId] = [];
}
repliesByParent[parentId].push(comment);
}
});
// Appliquer l'ordre de tri principal. Le serveur renvoie DESC ; inverser pour le tri du plus ancien au plus récent.
si (state.sortOrder === 'oldest') {
commentaires de niveau supérieur.inverser();
}
// Réponses àfaçons Afficher les plus anciens en premier au sein d'un même fil de discussion (le serveur renvoie DESC, donc inverser).
Object.keys(repliesByParent).forEach(parentId => {
répondParParent[parentId].inverse();
});
topLevelComments.forEach((comment, index) => {
const isLastComment = index === topLevelComments.length – 1;
const replies = repliesByParent[comment.comment_ID] ?? [];
créerCommentaire(commentaire, réponses, estDernierCommentaire);
});
créer des avatars de commentaires();
}
function updateCommentCount() {
const countDiv = document.getElementById(PublicCommentSelectors.COMMENT_COUNT);
const sortControls = document.getElementById(PublicCommentSelectors.SORT_CONTROLS);
si (!countDiv) {
retour;
}
const count = state?.comments?.length ?? 0;
// Ne pas afficher s'il n'y a pas de commentaires.
si (compteur === 0) {
retour;
}
countDiv.innerHTML = `${count} Comment${count > 1 ? 's' : ‘}`;
si (triContrôles) {
sortControls.classList.remove('tw:hidden');
sortControls.classList.add('tw:flex');
}
}
function displayLoader(show) {
const loader = document.getElementById(PublicCommentSelectors.BUTTON_LOADER);
const text = document.getElementById(PublicCommentSelectors.BUTTON_TEXT);
if (!loader || !text) {
retour;
}
// Afficher ou masquer le chargeur.
si (afficher) {
loader.classList.remove('tw:hidden');
texte.classList.add('tw:hidden');
} autre {
loader.classList.add('tw:hidden');
text.classList.remove('tw:hidden');
}
}
function displayError(error) {
const errorDiv = document.getElementById(PublicCommentSelectors.ERROR);
si (!errorDiv) {
retour;
}
si (erreur) {
errorDiv.classList.add('tw:block');
errorDiv.classList.remove('tw:hidden');
errorDiv.textContent = `Erreur de soumission de commentaire : ${error}` ;
} autre {
errorDiv.classList.remove('tw:block');
errorDiv.classList.add('tw:hidden');
errorDiv.textContent = ”;
}
}
function clearCommentInput() {
const commentField = document.getElementById(PublicCommentSelectors.INPUT);
si (!commentField) {
retour;
}
commentField.value = ”;
}
function updateComments(comments = []) {
état.commentaires = commentaires;
afficherCommentaires();
mettre à jour le nombre de commentaires();
}
function runCommentProcess(type) {
si (type === 'postComment') {
const comment = document.getElementById(PublicCommentSelectors.INPUT);
if (!comment || !comment?.value) {
retour;
}
// Masquer les erreurs, afficher le chargeur.
afficherErreur();
afficherChargeur(true);
}
const data = {
taper,
ID du message : 444865,
};
// Obtenez un nouveau nonce et récupérez les commentaires ou publiez un commentaire.
fetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
console.error('Erreur lors de la récupération du nonce : ', response?.data?.message);
retour;
}
const nonce = response?.data?.nonce;
// Obtenir des commentaires.
si (type === 'getComments') {
obtenirCommentaires(nonce);
retour;
}
// Publier un commentaire.
si (type === 'postComment') {
posterComment(nonce);
}
})
.catch((e) => {
afficherChargeur(false);
console.error(`Erreur lors de l'exécution du processus de commentaire ${type} : `, e);
});
}
function getComments(nonce) {
const data = {
nonce,
ID du message : 444865,
};
// Récupérer les commentaires.
fetch(`${adminAjaxUrl}?action=ep_get_public_comments`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
console.error('Erreur lors de la récupération des commentaires : ', response?.data?.message);
retour;
}
mettre à jour les commentaires(réponse?.données?.comments);
afficherChargeur(false);
})
.catch((e) => {
afficherChargeur(false);
console.error('Erreur lors de la récupération des commentaires : ', e);
});
}
function postComment(nonce) {
const user = window?.tp?.pianoId?.getUser() ?? null;
if (!user || !user?.uid) {
console.error('Erreur lors de la publication du commentaire : Non autorisé. Envoi annulé.');
retour;
}
const comment = document.getElementById(PublicCommentSelectors.INPUT);
if (!comment || !comment?.value) {
retour;
}
const data = {
nonce,
commentaire : comment.valeur,
Commentaire parent : 0,
ID du message : 444865,
uid : utilisateur?.uid,
};
// Publier le commentaire.
fetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
identifiants : ‘ inclure ’,
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
// Gérer les erreurs.
si (!response.success) {
afficherChargeur(false);
afficherErreur(réponse?.données?.message, vrai);
console.error('Erreur lors de la publication du commentaire : ', response?.data?.message);
retour;
}
// Gérer le succès.
effacerCommentaire();
exécuterCommentProcessus('getComments');
})
.catch((e) => {
afficherChargeur(false);
afficherErreur(e);
console.error('Erreur lors de la publication du commentaire : ', e);
});
}
function toggleReplyForm(commentId) {
// Fermez tous les autres formulaires de réponse ouverts.
document.querySelectorAll(‘.ep-reply-form’).forEach(function(form) {
si (form.dataset.parentId !== String(commentId)) {
form.classList.add('tw:hidden');
}
});
// Basculer le formulaire de réponse ciblé.
const targetForm = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + commentId + ‘”]’);
si (targetForm) {
targetForm.classList.toggle('tw:hidden');
si (!targetForm.classList.contains('tw:hidden')) {
targetForm.querySelector('.ep-reply-input')?.focus();
}
}
}
function setReplyLoading(formEl, isLoading) {
const btn = formEl.querySelector(‘.ep-reply-submit’);
const btnText = formEl.querySelector(‘.ep-reply-button-text’);
if (!btn || !btnText) {
retour;
}
si (isLoading) {
btnText.textContent = 'Publication…';
bouton.désactivé = vrai ;
} autre {
btnText.textContent = 'Publier la réponse';
bouton.désactivé = faux ;
}
}
function displayReplyError(formEl, error) {
const errorDiv = formEl.querySelector(‘.ep-reply-error’);
if (!errorDiv || !error) {
retour;
}
errorDiv.textContent = 'Erreur de réponse : ' + erreur ;
errorDiv.classList.remove('tw:hidden');
errorDiv.classList.add('tw:block');
}
function clearReplyError(formEl) {
const errorDiv = formEl.querySelector(‘.ep-reply-error’);
si (!errorDiv) {
retour;
}
errorDiv.textContent = ”;
errorDiv.classList.add('tw:hidden');
errorDiv.classList.remove('tw:block');
}
function postReply(nonce, parentId, replyText, formEl) {
const user = window?.tp?.pianoId?.getUser() ?? null;
if (!user || !user?.uid) {
setReplyLoading(formEl, false);
retour;
}
const data = {
nonce,
commentaire : texte de réponse,
commentParent : parentId,
ID du message : 444865,
uid : utilisateur?.uid,
};
fetch(`${adminAjaxUrl}?action=ep_create_public_comment`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
identifiants : ‘ inclure ’,
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
setReplyLoading(formEl, false);
si (!response.success) {
afficherErreurRéponse(formEl, réponse?.données?.message);
console.error('Erreur lors de l'envoi de la réponse : ', response?.data?.message);
retour;
}
formEl.querySelector('.ep-reply-input').value = ‘;
formEl.classList.add('tw:hidden');
exécuterCommentProcessus('getComments');
})
.catch((e) => {
setReplyLoading(formEl, false);
displayReplyError(formEl, 'Erreur réseau. Veuillez réessayer.');
console.error('Erreur lors de l\'envoi de la réponse : ', e);
});
}
function submitReply(parentId, formEl) {
const input = formEl.querySelector(‘.ep-reply-input’);
si (!input || !input.value.trim()) {
retour;
}
const user = window?.tp?.pianoId?.getUser() ?? null;
if (!user || !user?.uid) {
ouvrirLoginModal();
retour;
}
définirChargementDeLaRéponse(formEl, vrai);
effacerErreurDeRéponse(formEl);
const data = {
type: 'postComment',
ID du message : 444865,
};
fetch(`${adminAjaxUrl}?action=ep_get_public_comment_nonce`, {
méthode : 'POST',
en-têtes : {
‘'Type de contenu' : 'application/json',
},
corps : JSON.stringify(données),
})
.then((r) => r.json())
.then((réponse) => {
si (!response.success) {
setReplyLoading(formEl, false);
afficherErreurRéponse(formEl, réponse?.données?.message);
retour;
}
postReply(response?.data?.nonce, parseInt(parentId, 10), input.value.trim(), formEl);
})
.catch((e) => {
setReplyLoading(formEl, false);
displayReplyError(formEl, 'Erreur réseau. Veuillez réessayer.');
console.error('Erreur lors de la récupération du nonce pour la réponse : ', e);
});
}
function setupCommentListDelegation() {
const commentListDiv = document.getElementById(PublicCommentSelectors.LIST);
si (!commentListDiv) {
retour;
}
commentListDiv.addEventListener(‘click’, function(e) {
// Bouton Répondre : active/désactive le formulaire de réponse intégré.
const replyButton = e.target.closest(‘.’ + PublicCommentSelectors.REPLY_BUTTON);
si (bouton de réponse) {
const commentId = replyButton.dataset.commentId;
const user = window?.tp?.pianoId?.getUser() ?? null;
si (!utilisateur) {
ouvrirLoginModal();
retour;
}
basculerFormulaireDeRéponse(commentId);
retour;
}
// Annuler la réponse : masquer le formulaire de réponse.
const replyCancel = e.target.closest(‘.ep-reply-cancel’);
si (réponseAnnuler) {
const parentId = replyCancel.dataset.parentId;
const form = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + parentId + ‘”]’);
si (formulaire) {
form.classList.add('tw:hidden');
}
retour;
}
// Soumettre la réponse : publier la réponse.
const replySubmit = e.target.closest(‘.ep-reply-submit’);
si (replySubmit) {
const parentId = replySubmit.dataset.parentId;
const form = document.querySelector(‘.ep-reply-form[data-parent-id=”‘ + parentId + ‘”]’);
si (formulaire) {
soumettreRéponse(parentId, formulaire);
}
}
});
}
function setupUserAvatar() {
const usernameDiv = document.getElementById(PublicCommentSelectors.USERNAME);
const userAvatar = document.getElementById(PublicCommentSelectors.USER_AVATAR);
if (!usernameDiv || !userAvatar) {
retour;
}
const user = window?.tp?.pianoId?.getUser() ?? null;
si (!utilisateur) {
retour;
}
const fullName = `${user?.firstName ?? ”} ${user?.lastName ?? ”}`;
nom d'utilisateurDiv.innerHTML = fullName;
userAvatar.innerHTML = getInitials(fullName);
}
function openLoginModal() {
fenêtre?.tp?.pianoId?.afficher({ afficherMode: 'modal', écran : 'connexion' });
}
function setupCommentSubmitButton() {
const submitButton = document.getElementById(PublicCommentSelectors.SUBMIT);
if (!submitButton || state.submitCommentButtonRegistered) {
retour;
}
// Enregistrez un gestionnaire de clic unique qui vérifie l'état d'authentification au moment du clic.
submitButton.addEventListener(‘click’, function() {
const user = window?.tp?.pianoId?.getUser() ?? null;
si (!utilisateur) {
ouvrirLoginModal();
retour;
}
exécuterCommentProcess('postComment');
});
état.boutonSoumettreCommentaireEnregistré = vrai;
}
function setSortOrder(order) {
état.ordre_de_tri = ordre;
const newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);
const oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);
si (newestBtn && oldestBtn) {
const activeClasses = [‘tw:font-bold’, ‘tw:text-blue-800’];
const inactiveClasses = [‘tw:font-normal’, ‘tw:text-slate-500’];
si (ordre === 'plus récent') {
newestBtn.classList.add(…activeClasses);
newestBtn.classList.remove(…inactiveClasses);
oldestBtn.classList.add(…inactiveClasses);
oldestBtn.classList.remove(…activeClasses);
} autre {
oldestBtn.classList.add(…activeClasses);
oldestBtn.classList.remove(…inactiveClasses);
newestBtn.classList.add(…inactiveClasses);
newestBtn.classList.remove(…activeClasses);
}
}
afficherCommentaires();
}
function setupSortControls() {
const newestBtn = document.getElementById(PublicCommentSelectors.SORT_NEWEST);
const oldestBtn = document.getElementById(PublicCommentSelectors.SORT_OLDEST);
si (nouveaubouton) {
newestBtn.addEventListener(‘click’, function() {
définir l'ordre de tri('plus récent');
});
}
si (le plus vieux bouton) {
oldestBtn.addEventListener(‘click’, function() {
définir l'ordre de tri('plus ancien');
});
}
}
exécuterCommentProcessus('getComments');
écouterPourConnexionPiano();
configurerCommentSubmitButton();
configurerLaListeDeCommentairesDélégation();
configurerContrôlesDeTri();
});
Par Ashley Armstrong
Par Brendan Keegan
Par Charisma Glassman
Par Bhaskar Ahuja
Par Shawn P. Walchef
Par Alex Lefkowitz
En rapport:
Formation en automatisation numérique au Bénin : 5 compétences clés recherchées par les employeurs en 2026
<a href="https://yoursite.com/automation-africa/" title="WhatsApp Commercialisation Automation Africa : 6 erreurs dangereuses commises par les marques au Nigéria
Automatisation du marketing WhatsApp en Afrique : 6 erreurs dangereuses commises par les marques au Nigéria
Vous souhaitez apprendre cela de manière pratique ?
Rejoindre Justfine Infotech et développer de véritables compétences numériques en IA, automatisation, développement web, marketing digital, bureautique, e-commerce, travail indépendant et cybersécurité.
Programmes disponibles :
Certificat de 6 semaines • Certificat professionnel de 3 mois • Diplôme de 6 mois • Diplôme professionnel complet
WhatsApp :
+229 01 57 57 99 15
+229 01 66 68 11 60
Source: www.entrepreneur.com



