COP29 climate agenda clouded by trade tensions ahead of summit
COP29 climate agenda clouded by trade tensions ahead of summit
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.
The COP29 talks begin on November 11, 2024, in Baku, Azerbaijan
China has put trade talks onto the proposed agenda for the COP29 summit, a UN document showed, raising the prospect that the issue could disrupt the start of global climate talks.
The draft agenda for this year’s climate summit, published on Friday, includes a Chinese proposal, previously reported by Reuters, for talks on carbon border taxes and other “restrictive trade measures” that Beijing says hurt developing countries.
Delegates at the conference must adopt the summit agenda by consensus as their first task when the COP29 talks begin on November 11, 2024, in Baku, Azerbaijan.
More To Read
- A Super El Niño is coming: Five hard‑won lessons the world can learn from Africa
- Slum residents urged to adopt ‘localised solutions’ to mitigate climate change effects
- How the cocoa price crash is crushing West African farmers
- Nearly 60 people killed in Ivory Coast floods since May
- EU, IOM launch regional programme to tackle climate displacement, response
- Uganda arrests Danish wildlife journalist Klaus Thymann amid press freedom concerns
But some diplomats said the European Union is likely to oppose the Chinese proposal, which Beijing submitted on behalf of the BASIC group that also includes Brazil, India and South Africa.
Failure to approve the agenda could delay the start of negotiations – cutting into the time left for the main task of approving potentially hundreds of billions of dollars in new funding to address climate change.
“We will speak about it, relentlessly,” South Africa’s Environment Minister Dion George told Reuters.
Latest Stories
- Taita Taveta County unveils cooperative fund to boost rural access to credit
- Lilian Odira targets personal best and Diamond League final after dream victory in Eugene
- Karua, Matiang’i demand arrest and resignation of PS Fikirini over Cecil Ouma shooting
- A Super El Niño is coming: Five hard‑won lessons the world can learn from Africa
Carbon border policy
BASIC countries have been strong critics of the EU carbon border policy, which from 2026 will impose fees on imports of high-carbon goods, including steel and cement.
“We are displeased about it and we don’t think it’s good for our economy,” George said, adding that South Africa and China are having “intense conversations” with the EU.
EU Climate Commissioner Wopke Hoekstra said he took countries’ concerns seriously. But he dismissed Beijing’s opposition to the EU carbon border levy.
“Given all the interactions we’ve had, and knowing the Chinese for always being very well-prepared and knowing the exact workings of the system, I don’t find that a very credible strategy to pursue,” Hoekstra told Reuters in a joint interview with other media outlets.
The EU says its carbon border levy is not a trade measure, but rather a climate policy to prevent European industries from being undercut by cheap imports from countries with lax environmental rules.
The EU has previously said trade disputes should be addressed at the World Trade Organisation.
One European climate negotiator expressed concern that the BASIC proposal was intended to prevent discussions at COP29 on cutting CO2 emissions and finance from moving forward.
A fight over the agenda at a round of UN climate negotiations in 2023 was not resolved for more than a week, killing off progress at the talks.
Other Topics To Read
Top Stories Today
- Karua, Matiang’i demand arrest of PS Fikirini over Cecil Ouma shooting
- Taita Taveta to launch cooperative fund to boost rural credit access
- World Champion Lilian Odira beats Keely Hodgkinson in Eugene thriller
- Coast leaders rally support for 10-point agenda, reject divisive politics
- A Super El Niño is coming: Five lessons Africa can teach the world
- Faith Kipyegon reveals hamstring injury after rare defeat in Eugene
`;
}
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
Eight arrested in Marsabit over Sh1.2 million SIM swap fraudNorthern Kenya
|Bashir Mbuthia
|1 day ago
Faith Kipyegon reveals hamstring injury after rare defeat as focus shifts to second half of seasonAthletics
|Erick Kariuki
|3 hours ago
Somali Embassy hosts Kenya leaders, diplomats for 66th Independence Day celebrationsSomalia
|Abdirahman Khalif
|7 hours ago
Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highwayNews
|Rachael Mutabasi
|1 day ago
Court declares Ruaraka School land public, rules Sh1.5 billion payout illegalNews
|Carolyne Kubwa
|1 day ago
Mbappé fires France past Paraguay into World Cup quarter-finalsSports
|Erick Kariuki
|12 hours ago
Taita Taveta County unveils cooperative fund to boost rural access to creditCoast
|Farhiya Hussein
|18 minutes ago
Lilian Odira targets personal best and Diamond League final after dream victory in EugeneAthletics
|Erick Kariuki
|1 hour ago
Pakistan to host next round of US-Iran talks on July 11Middle-East
|XINHUA
|7 hours ago
Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killingsNews
|Lucy Mumbi
|10 hours ago