From bbd1536c18da9202c55644a7e885b45dbf588725 Mon Sep 17 00:00:00 2001 From: Art Date: Thu, 25 May 2023 11:37:13 +0200 Subject: [PATCH] chore(trading): upgrade banner semver comparison (#3919) --- .../components/banner/upgrade-banner.tsx | 67 ++++++++++--------- libs/environment/src/hooks/use-releases.ts | 2 +- package.json | 2 + yarn.lock | 12 ++++ 4 files changed, 51 insertions(+), 32 deletions(-) diff --git a/apps/trading/components/banner/upgrade-banner.tsx b/apps/trading/components/banner/upgrade-banner.tsx index 086bd6356..0e4cca865 100644 --- a/apps/trading/components/banner/upgrade-banner.tsx +++ b/apps/trading/components/banner/upgrade-banner.tsx @@ -1,4 +1,5 @@ import { useMemo, useState } from 'react'; +import { gt, prerelease } from 'semver'; import { ReleasesFeed, useEnvironment, @@ -15,7 +16,10 @@ import { VegaIconNames, } from '@vegaprotocol/ui-toolkit'; -const CANONICAL_URL = 'https://vega.trading'; +// v0.20.12-core-0.71.4 -> v0.20.12 +// we need to strip the "core" suffix in order to determine whether a release +// is a pre-release (candidate); example: v.0.21.0-beta.1-core-0.71.4 +const parseTagName = (tagName: string) => tagName.replace(/-core-[\d.]+$/i, ''); type UpgradeBannerProps = { showVersionChange: boolean; @@ -23,34 +27,24 @@ type UpgradeBannerProps = { export const UpgradeBanner = ({ showVersionChange }: UpgradeBannerProps) => { const [visible, setVisible] = useState(true); const { data } = useReleases(ReleasesFeed.FrontEnd); - const { APP_VERSION, VEGA_ENV } = useEnvironment(); - /** - * Filtering out the release candidates. - */ - const latest = useMemo(() => { + const { APP_VERSION, VEGA_ENV, VEGA_NETWORKS } = useEnvironment(); + + const CANONICAL_URL = VEGA_NETWORKS[VEGA_ENV] || 'https://vega.trading'; + + const newest = useMemo(() => { + if (!APP_VERSION || !data) return undefined; + const newer = data.filter((r) => gt(r.tagName, APP_VERSION)); const valid = + // filter pre-releases on mainnet VEGA_ENV === Networks.MAINNET - ? data?.filter((r) => !/-rc$/i.test(r.tagName)) - : data; + ? newer?.filter((r) => !prerelease(parseTagName(r.tagName))) + : newer; + return valid.sort((a, b) => (gt(a.tagName, b.tagName) ? -1 : 1))[0]; + }, [APP_VERSION, VEGA_ENV, data]); - return valid && valid.length > 0 ? valid[0] : undefined; - }, [VEGA_ENV, data]); - - if (!APP_VERSION) return null; - - if (!visible || !latest || latest.tagName === APP_VERSION) return null; - - const versionChange = ( - - - {APP_VERSION} - {' '} - {' '} - - {latest.tagName} - - - ); + if (!visible || !newest) { + return null; + } return ( { setVisible(false); }} > -
- {t('Upgrade to the latest version of Console')}{' '} - {showVersionChange && versionChange} +
+ + {t('Upgrade to the latest version of Console')} +
- {t('Bookmark')}{' '} - {t('vega.trading')} + + {t("View what's changed")} + {' '} + {t(' or bookmark')}{' '} + + {t('vega.trading')} + {' '}