Kenya, Tanzania agree to resolve KQ flight ban within three days

Kenya, Tanzania agree to resolve KQ flight ban within three days

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.

Tanzania’s Foreign Affairs Minister said they had agreed that air travel restrictions between the two countries shouldn’t stand

Kenya and Tanzania have committed to resolving the restrictions on passenger flights by Kenya Airways (KQ) between the two countries within 72 hours.
This follows discussions on Monday between Kenya’s Prime Cabinet Secretary and Cabinet Secretary for Foreign and Diaspora Affairs Musalia Mudavadi and Tanzania’s Minister for Foreign Affairs and East African Cooperation January Makamba.
Earlier on Monday, The Tanzania Civil Aviation Authority (TCAA) suspended passenger flights from Nairobi to Dar es Salaam, effective January 22, 2024.

More To Read

  • Kenya Airways director Christopher Buckley resigns as shareholders approve board changes
  • Taxpayers to shoulder Kenya Airways debt as airline fails to pay Sh8.5 billion interest
  • Passengers safe as Kenya Airways flight returns to Entebbe following bird strike emergency
  • Kenya Airways warns proposed strategic goods Bill could disrupt flight operations
  • Kenya Airways resumes Dubai flights after two-month suspension
  • Flights diverted at JKIA as fog disrupts operations, Kenya Airways confirms

According to TCAA, the decision was “to reciprocate the decision by the aeronautical authorities of Kenya to refuse the Tanzania request for all cargo flight operations by Air Tanzania Company Limited (ATCL) under the Fifth Freedom Traffic Rights between Nairobi and Third countries”.
TCAA Director-General Hamza Johari, in a statement, explained further, saying, “This decision is based on the principle of reciprocity, following the refusal by the Kenyan authorities to grant approval for ATCL’s cargo flights despite the clear provisions of the MoU.”
No cause for alarm

Latest Stories

  • DP Kindiki hails cooperatives as key to Kenya’s economic transformation
  • SHA seeks Treasury funds to clear NHIF claims above Sh10 million
  • Eight arrested in Marsabit over Sh1.2 million SIM swap fraud
  • What the World Cup hydration breaks reveal about who governs men’s football

But Mudavadi assured there was no cause for alarm after he held discussions with his Tanzanian counterpart.
“We have jointly agreed that our respective Civil Aviation Authorities will work together to have the matter resolved amicably within the next three days,” Mudavadi said.
Makamba said that they had agreed that air travel restrictions between the two countries shouldn’t stand.
“With relevant authorities, we’ve resolved to settle this issue, per existing agreements, within three days,” he added.
Kenya’s Transport and Roads Cabinet Secretary Kipchumba Murkomen said he is also in discussions with his Tanzanian counterpart Prof Makame Mbarawa in a bid to resolve the matter.


KQ had also issued a statement earlier saying it was aware of the TCAA’s public notice and was taking action to resolve the issue.
“Kenya Airways is engaging the civil aviation authorities and relevant government agencies in Kenya and Tanzania to find a solution that will ensure there are no flight disruptions between Nairobi and Dar es Salaam,” it said.

Other Topics To Read

  • tanzania civil aviation authority
  • Kenya Airways
  • tanzania bans kenya airways

Top Stories Today

  • Government reaffirms commitment to inclusive development across all regions
  • DP Kindiki hails cooperatives as key to Kenya’s economic transformation
  • SHA seeks Treasury funds to clear NHIF claims above Sh10 million
  • 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

`;
}

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


DP Kindiki hails cooperatives as key to Kenya’s economic transformationNews
|Rachael Mutabasi
|20 minutes ago

Government reaffirms commitment to inclusive development across all regionsNews
|Mary Wambui
|3 hours ago

UK, France agree with Oman on multinational military mission to secure Strait of HormuzNews
|Mary Wambui
|5 hours ago

CAF opens bidding for 2028, 2032 and 2036 AFCON tournamentsNews
|Erick Kariuki
|7 hours ago

Manufacturers call for reforms to cut cost of doing business in KenyaNews
|Rachael Mutabasi
|7 hours ago

Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highwayNews
|Rachael Mutabasi
|9 hours ago

Iran begins six-day funeral for late Supreme Leader Ali KhameneiWorld
|DW News
|8 hours ago

60 more Kenyans arrive home from South Africa as government steps up evacuationsNews
|Mary Wambui
|5 hours ago

Colombia beats Ghana to complete World Cup round of 16 lineupSports
|XINHUA
|8 hours ago

What Kenya’s record Sh1.82 trillion forex reserves mean for the economyBusiness
|Alfred Onyango
|6 hours ago

Share.
Leave A Reply

Exit mobile version