Eastern Africa ramps up cross-border disease preparedness after regional simulation exercise

Eastern Africa ramps up cross-border disease preparedness after regional simulation exercise

Officials from East African countries during a four-day regional emergency response workshop and simulation exercise held in Mombasa by the Africa Centres for Disease Control and Prevention (Africa CDC). (Photo: Courtesy)

Read this story aloud

Listen to the clean text version of this article

Ready
4 min listen
Audio reading is not supported on this browser.

The workshop comes as Uganda continues to respond to an outbreak of Bundibugyo Virus Disease (BVD), prompting renewed calls for stronger regional surveillance and cooperation to prevent the disease from spreading across borders

Eastern African countries have intensified efforts to strengthen preparedness for cross-border disease outbreaks following a four-day regional emergency response workshop and simulation exercise held in Mombasa by the Africa Centres for Disease Control and Prevention (Africa CDC).
The exercise brought together public health experts and emergency response officials from Kenya, Ethiopia, South Sudan, Sudan, Djibouti and Zanzibar, alongside representatives from regional organisations and international health partners, to improve coordination during public health emergencies.
The workshop comes as Uganda continues to respond to an outbreak of Bundibugyo Virus Disease (BVD), prompting renewed calls for stronger regional surveillance and cooperation to prevent the disease from spreading across borders.

More To Read

  • Africa CDC chief warns DRC Ebola outbreak remains “very serious” as clinical trial begins
  • WHO reports 17 deaths among medics in ongoing DRC Ebola outbreak
  • Ebola death toll tops 200 as Africa CDC warns of critical gaps in regional response
  • ‘Some question if Ebola is real’: How trust is central in fighting DRC outbreak
  • ‘Rare, untreatable strain’: Ebola toll mounts in eastern DR Congo
  • Africa CDC, WHO launch Sh67 billion Ebola response plan

According to Africa CDC, participants assessed the region’s ability to detect, report and respond to disease outbreaks through a simulation that tested emergency coordination, information sharing and operational readiness during the critical first 72 hours after an outbreak is confirmed.
The exercise also focused on improving integrated disease surveillance systems, strengthening data interoperability and enhancing collaboration among neighbouring countries that face similar public health risks due to frequent cross-border movement.
“The ongoing Bundibugyo Virus Disease outbreak underscores the need for stronger surveillance, cross-border collaboration and emergency preparedness across Eastern Africa,” Africa CDC said in a statement.

Latest Stories

  • CS Duale, Attorney General Oduor face contempt case over failure to implement KNDI court order
  • Police recruitment dispute heads to Court of Appeal as NPS challenges NPSC powers
  • New study links childhood abuse to permanent changes in brain’s emotional processing
  • Online abuse, harassment driving women out of African politics – Report

The Mombasa workshop forms part of wider continental efforts to reinforce Africa’s capacity to respond to infectious disease outbreaks.
Last month, Africa CDC and the World Health Organisation Regional Office for Africa launched the Joint Continental Incident Management Support Team (IMST) in Kampala, Uganda, to provide technical support for Uganda’s outbreak response while strengthening preparedness in neighbouring countries, including the Democratic Republic of the Congo.
Speaking during the launch of the continental response platform, Africa CDC Director General Dr Jean Kaseya, through the agency’s Director of the Centre for Public Health Emergencies Management, Dr Tolbert Nyenswah, said the initiative reflects Africa’s commitment to leading its own emergency response mechanisms.
“The Continental IMST represents Africa’s commitment to stronger institutions, coordinated action and country-led emergency response,” Nyenswah said.
Uganda’s Minister of Health, Dr Chris Baryomunsi, said hosting the continental platform demonstrates the value of regional cooperation in tackling public health threats.
“Uganda is proud to host the Continental IMST as a demonstration of what countries, regional institutions and partners can achieve by working together. This platform strengthens our response to the current Bundibugyo Virus Disease outbreak while reinforcing preparedness for future public health emergencies,” he said.
Bundibugyo Virus Disease is caused by the Bundibugyo ebolavirus, one of the viruses responsible for Ebola virus disease.
The infection spreads through direct contact with infected bodily fluids or contaminated materials, making rapid detection, contact tracing and coordinated public health measures essential to limiting transmission.
Health experts say the increasing movement of people and goods across East Africa has heightened the need for harmonised surveillance systems, timely exchange of health information and joint emergency response plans to minimise the risk of future epidemics.
The Mombasa meeting concluded with participating countries reaffirming their commitment to strengthening regional cooperation and building resilient health systems capable of responding swiftly to emerging public health threats.

Other Topics To Read

Top Stories Today

  • Duale, Oduor accused of defying High Court order on KNDI appointments
  • NPS tells court to reject NPSC appeal over police recruitment powers
  • Supreme Court rules public pension schemes are not government entities
  • Study reveals how childhood abuse rewires the brain based on age
  • Women in African politics targeted by online violence, report warns
  • Opposition unity tested as leaders split over 2027 flagbearer plan

`;
}

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

Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killingsNews
|Lucy Mumbi
|1 day ago
Burkina Faso tightens grip on NGOs with new ban on exploitative humanitarian imagesAfrica
|Rachael Mutabasi
|11 hours ago
New study links childhood abuse to permanent changes in brain’s emotional processingHealth
|Charity Kilei
|1 hour ago
KRA removes excise duty on bottled water effective July 1Business
|Lucy Mumbi
|6 hours ago

EACC to recover Sh1.5 billion after Court of Appeal declares Ruaraka school land compensation illegalNews
|Lucy Mumbi
|7 hours ago
Haaland’s heroics send Norway into historic first World Cup quarter-final as Brazil crash outSports
|Erick Kariuki
|13 hours ago

Kenya’s civic space downgraded to ‘repressed’ amid surge in rights violations – reportNews
|Lucy Mumbi
|10 hours ago

Study reveals how deep sleep and growth hormone work together to boost healthHealth
|Charity Kilei
|2 hours ago
National Youth Council denies backing calls for PS Fikirini’s resignation over Ouma shootingNews
|Lucy Mumbi
|8 hours ago
Faith Kipyegon reveals hamstring injury after rare defeat as focus shifts to second half of seasonAthletics
|Erick Kariuki
|1 day ago

Share.
Leave A Reply

Exit mobile version