Listen to article
2 min listen
Audio reading is not supported on this browser.
Ready
Thanks for listening. Continue with a related story, or tap the speaker icon on the next page to listen.
How CS Aden Dualeβs evasive responses leave the Health Ministry facing more questions than answers
Lucy Mumbi
Β Β·Β
1 day agoRead nextOpens a fresh page.
Religious leaders call for national unity, parents urged to safeguard children during the August holiday, Wajir politics gathers pace, pressure mounts over Aden Duale’s remarks, and NTSA steps up road safety enforcement in Nairobi.
Religious leaders warn against tribal politics ahead of 2027
Religious and cultural leaders have urged politicians to stop using ethnic and religious rhetoric, warning that divisive remarks could threaten national unity ahead of the 2027 General Election.
Parents told to shield children from peer pressure
More To Read
- How CS Aden Dualeβs evasive responses leave the Health Ministry facing more questions than answers
- Karua warns against ethnic politics as Duale’s controversial remarks trigger national backlash
- OPINION: We must reject the dangerous politics of dehumanisation
- Defiant Health CS Duale says he won’t apologise over remarks drawing uproar
- President Ruto directs Nairobi community health promoters to be covered under SHA
- North Eastern professionals condemn Duale’s remarks, say he does not speak for region
Parents have been urged to closely monitor and guide their children during the August school holiday to protect them from peer pressure, drug abuse and other risky behaviour.
Fai community backs Hassan Mohamed for Wajir governor
The Fai community has endorsed Hassan Mohamed for the Wajir governor seat in the 2027 General Election, pledging to rally support behind his candidature.
Latest Stories
- KNH murder suspect pleads not guilty after court finds him fit to stand trial
- Sugar production rises to 348,143 tonnes in five months as reforms boost Kenyaβs industry
- High prices and funding cuts stall HIV prevention revolution
- Lopes Cabral’s stunner against Argentina wins Goal of 2026 World Cup
Mount Kenya youth demand Ruto sack Duale
A section of Mount Kenya youth has called on President William Ruto to dismiss Health CS Aden Duale, accusing him of making divisive tribal remarks that undermine national cohesion.
ACA urges shoppers to verify products before buying
The Anti-Counterfeit Authority is urging consumers to verify the authenticity of products before making purchases to protect themselves from counterfeit goods.
NTSA arrests pedestrians for ignoring footbridges
The National Transport and Safety Authority has arrested 35 pedestrians in Nairobi for failing to use designated footbridges as part of efforts to improve road safety.
Other Topics To Read
Top Stories Today
- IEBC begins search for new CEO to replace Marjan Hussein Marjan, applications close August 11
- KNH murder suspect pleads not guilty after court finds him fit to stand trial
- Sugar production rises to 348,143 tonnes in five months as reforms boost Kenyaβs industry
- End of the road for historic Grogon garage as Nairobi plans 1,200-vehicle modern auto hub
- High prices and funding cuts stall HIV prevention revolution
- Counties face new spending rules amid concerns salaries are eating into development budgets
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
High prices and funding cuts stall HIV prevention revolutionHealth
|UN News
|39 minutes ago
Inside agreement that eased as ago
<img src="https://publish.eastleighvoice.co.ke/mugera_lock/uploads/2025/12/Rehema-Jaldesa.jpg" alt="Health facilities warned against denying SGBV survivors treatment over lack of SHA, fees” loading=”lazy”>
Health facilities warned against denying SGBV survivors treatment over lack of SHA, feesNews
|Lucy Mumbi
|1 hour ago
Delayed KNEC payments to teachers risk disrupting 2026 national examinations, KNUT warnsEducation
|Lucy Mumbi
|1 day ago
DPP approves bribery charges against Kangema magistrate, probation officer over Sh150,000 bribeNews
|Lucy Mumbi
|1 hour ago
Sugar production rises to 348,143 tonnes in five months as reforms boost Kenyaβs industryNews
|Lucy Mumbi
|23 minutes ago

IEBC begins search for new CEO to replace Marjan Hussein Marjan, applications close August 11News
|Lucy Mumbi
|2 hours ago
Kenya to integrate mangrove conservation into national development, boosting blue economyNews
|Rachael Mutabasi
|1 day ago
Three found guilty of killing Nairobi businessman lured to Kilifi with fake Sh23 million tenderCoast
|Farhiya Hussein
|1 day ago
Ruto faces running mate dilemma as ODM demands DP slot in fresh challenge to KindikiPolitics
|Barack Oduor
|20 hours ago
