import snarkdown from 'snarkdown' import { createElement, useState, useEffect } from '@wordpress/element' import { dateI18n } from '@wordpress/date' import { __, sprintf } from 'ct-i18n' let changelog_cache = null const parseChangelog = changelog => changelog .replace(/(\r\n|\r|\n){3,}/g, '$1\n\n') .split('\n\n') .map(versionDescriptor => { let [version, date] = versionDescriptor.split('\n')[0].split(':') return { version, date: dateI18n('F j, Y', new Date(date)), descriptor: versionDescriptor } }) const SingleVersion = ({ versionDescriptor }) => { const [_, ...allReleaseChanges] = versionDescriptor.descriptor.split('\n') return (

Version: {versionDescriptor.version}{' '} Released on {versionDescriptor.date}

' ) .replace( /Improvement:/g, '' ) .replace( /Fix:/g, '' ) }} />
) } export default () => { const [isLoading, setIsLoading] = useState(!changelog_cache) const [changelog, setChangelog] = useState(changelog_cache) const syncChangelog = async (verbose = false) => { if (verbose) { setIsLoading(true) } const body = new FormData() body.append('action', 'get_latest_changelog') try { const response = await fetch(ctDashboardLocalizations.ajax_url, { method: 'POST', body }) if (response.status === 200) { const { success, data } = await response.json() if (success && data.changelog) { setChangelog(data.changelog) changelog_cache = data.changelog } } } catch (e) {} setIsLoading(false) } useEffect(() => { syncChangelog(!changelog_cache) }, []) return (
{isLoading ? __('Loading changelog...') : changelog ? parseChangelog(changelog).map(versionDescriptor => ( )) : __('No changelog present at the moment.')}
) }