President Ruto returns from Kazakhstan, begins five-day coast development tour
President Ruto returns from Kazakhstan, begins five-day coast development tour
Read this story aloud
Listen to the clean text version of this article
Ready
3 min listen
Audio reading is not supported on this browser.
State House said the tour will focus on the inspection, commissioning and launch of infrastructure, electricity and housing projects across the six coastal counties
President William Ruto has embarked on a five-day development tour of the coast region immediately after returning from a two-day State visit to Kazakhstan.
President Ruto began the tour in Mombasa, where land ownership is expected to dominate part of his agenda through the launch of an accelerated title deeds issuance programme targeting residents across the Coast region.
State House said the tour will focus on the inspection, commissioning and launch of infrastructure, electricity and housing projects across the six coastal counties.
More To Read
- Civil society groups warn Kenya’s Sh13 trillion debt hurting essential services
- Court grants DCI three more days to hold woman over alleged posts tracking President Ruto’s flights
- Construction of Naivasha–Kisumu–Malaba SGR begins in Narok
- How the new Ngong Road flyover is fueling growth at Dagoretti Corner
- Ruto told to fix Cabinet gender imbalance after court ruling, not reshuffle
- Kenya secures Sh162 billion World Bank funding for governance, social protection reforms
While in Mombasa, Ruto is also expected to inspect the Nyali Affordable Housing project before proceeding to Kilifi, where he will commission the Mariakani Power Sub-Station in Kaloleni Constituency and launch several last-mile electricity connectivity projects in Malindi, Ganze, Mariakani and Mjanaheri.
In Kilifi, the President is also scheduled to break ground for the Tezo–Kakanjuni road project in Kilifi North and the upgrading of the Mjanaheri–Ngomeni road in Magarini.
He will further preside over the laying of foundation stones for markets in Kaloleni and Ganze, as well as the proposed Kilifi Stadium.
Latest Stories
- Eight arrested in Marsabit over Sh1.2 million SIM swap fraud
- What the World Cup hydration breaks reveal about who governs men’s football
- Hope for patients as implant shows lasting benefits for treatment-resistant depression
- Sudanese army intensify offensive to retake strategic city of Kurmuk on Ethiopia border
The President is further expected to hand over fishing boats to groups in Malindi in efforts aimed at boosting the blue economy sector along the Coast.
Ruto will then head to Garsen in Tana River County, where he is expected to launch the construction of the Garsen Teachers Training College and preside over the groundbreaking of the Minjila Affordable Housing project.
The President’s itinerary will later take him to Lamu, where he is set to commission the completed Kizingitini Fish Market in Lamu East and inspect the Hindi Modern Market in Lamu West.
He is also expected to launch electricity connectivity projects and break ground for the A7 Junction Safirisi–Ndeu road.
Ruto will also tour Kwale, where he is scheduled to launch last-mile electricity projects in Kinango, Lunga Lunga and Diani in Msambweni Constituency.
The President will also commission the Diani Modern Market and preside over the groundbreaking of student hostels at Lunga Lunga Technical and Vocational College.
Other Topics To Read
Top Stories Today
- Government reaffirms commitment to inclusive development across all regions
- Sudanese army intensify offensive to retake strategic city of Kurmuk on Ethiopia border
- Weight-loss drug Wegovy approved in UK for MASH-related liver fibrosis
- Hope for patients as implant shows lasting benefits for treatment-resistant depression
- What the World Cup hydration breaks reveal about who governs men’s football
- Families of Ethiopians on Saudi death row gripped by fear as executions loom
`;
}
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
What the World Cup hydration breaks reveal about who governs men’s footballSports
|The Conversation
|48 minutes ago
What Kenya’s record Sh1.82 trillion forex reserves mean for the economyBusiness
|Alfred Onyango
|5 hours ago
Cape Verde vows to provide stern test for Argentina in round of 32Sports
|XINHUA
|1 day ago
UK, France agree with Oman on multinational military mission to secure Strait of HormuzNews
|Mary Wambui
|4 hours ago
Google to ban chrome extensions that ‘jailbreak’ AI chatbotsNews
|Margaret Wanjiru
|2 hours ago
South Africa, Egypt and Morocco emerge as Africa’s leading hubs for the super richBusiness
|Alfred Onyango
|3 hours ago
Colombia beats Ghana to complete World Cup round of 16 lineupSports
|XINHUA
|7 hours ago
Messi makes history as Argentina survive Cape Verde’s unforgettable World Cup fightNews
|Erick Kariuki
|9 hours ago
Portugal edge Croatia in dramatic finish to book last-16 spotSports
|The New Times
|1 day ago
151 Kenyans evacuated from South Africa amid xenophobic violence, intimidationNews
|Rachael Mutabasi
|1 day ago
