mirror of https://github.com/rancher/dashboard.git
129 lines
3.1 KiB
JavaScript
129 lines
3.1 KiB
JavaScript
import { sortableNumericSuffix } from '@shell/utils/sort';
|
|
import semver from 'semver';
|
|
import { MANAGEMENT } from '@shell/config/types';
|
|
import { READ_WHATS_NEW, SEEN_WHATS_NEW } from '@shell/store/prefs';
|
|
import { SETTING } from '@shell/config/settings';
|
|
|
|
export function parse(str) {
|
|
str = `${ str }`;
|
|
|
|
// Trim off leading 'v'
|
|
if ( str.substr(0, 1).toLowerCase() === 'v' ) {
|
|
str = str.substr(1);
|
|
}
|
|
|
|
const parts = str.split(/[.+-]/);
|
|
|
|
return parts;
|
|
}
|
|
|
|
export function sortable(str) {
|
|
return parse(str).map((x) => sortableNumericSuffix(x)).join('.');
|
|
}
|
|
|
|
export function compare(in1, in2) {
|
|
if ( !in1 ) {
|
|
return 1;
|
|
}
|
|
|
|
if ( !in2 ) {
|
|
return -1;
|
|
}
|
|
|
|
const p1 = parse(in1);
|
|
const p2 = parse(in2);
|
|
|
|
const minLen = Math.min(p1.length, p2.length);
|
|
|
|
for ( let i = 0 ; i < minLen ; i++ ) {
|
|
const res = comparePart(p1[i], p2[i]);
|
|
|
|
if ( res !== 0 ) {
|
|
return res;
|
|
}
|
|
}
|
|
|
|
return p1.length - p2.length;
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
return (`${ str }`).match(/^([0-9]+\.)?[0-9]*$/);
|
|
}
|
|
|
|
function comparePart(in1, in2) {
|
|
in1 = (`${ in1 }`).toLowerCase();
|
|
in2 = (`${ in2 }`).toLowerCase();
|
|
|
|
if ( isNumeric(in1) && isNumeric(in2) ) {
|
|
const num1 = parseInt(in1, 10);
|
|
const num2 = parseInt(in2, 10);
|
|
|
|
if ( !isNaN(num1) && !isNaN(num2) ) {
|
|
return num1 - num2;
|
|
}
|
|
}
|
|
|
|
return in1.localeCompare(in2);
|
|
}
|
|
|
|
export function isPrerelease(version = '') {
|
|
if (!semver.valid(version)) {
|
|
version = semver.clean(version, { loose: true });
|
|
}
|
|
|
|
return !!semver.prerelease(version);
|
|
}
|
|
|
|
export function isDevBuild(version) {
|
|
if ( ['dev', 'master', 'head'].includes(version) || version.endsWith('-head') || version.match(/-rc\d+$/) || version.match(/-alpha\d+$/) ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export function getVersionInfo(store) {
|
|
const setting = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.VERSION_RANCHER);
|
|
const fullVersion = setting?.value || 'unknown';
|
|
let displayVersion = fullVersion;
|
|
|
|
const match = fullVersion.match(/^(.*)-([0-9a-f]{40})-(.*)$/);
|
|
|
|
if ( match ) {
|
|
displayVersion = match[2].substr(0, 7);
|
|
}
|
|
|
|
return {
|
|
displayVersion,
|
|
fullVersion
|
|
};
|
|
}
|
|
|
|
export function seenReleaseNotes(store) {
|
|
const lastSeenNew = store.getters['prefs/get'](SEEN_WHATS_NEW) ;
|
|
const fullVersion = getVersionInfo(store).fullVersion;
|
|
|
|
return compare(lastSeenNew, fullVersion) >= 0 && !!lastSeenNew;
|
|
}
|
|
|
|
// Mark that the user has seen the release notes for this version if not already done
|
|
export async function markSeenReleaseNotes(store) {
|
|
if (!seenReleaseNotes(store)) {
|
|
await store.dispatch('prefs/set', { key: SEEN_WHATS_NEW, value: getVersionInfo(store).fullVersion });
|
|
}
|
|
}
|
|
|
|
export function readReleaseNotes(store) {
|
|
const lastSeenNew = store.getters['prefs/get'](READ_WHATS_NEW) ;
|
|
const fullVersion = getVersionInfo(store).fullVersion;
|
|
|
|
return compare(lastSeenNew, fullVersion) >= 0 && !!lastSeenNew;
|
|
}
|
|
|
|
// Mark that the user has read the release notes for this version if not already done
|
|
export async function markReadReleaseNotes(store) {
|
|
if (!readReleaseNotes(store)) {
|
|
await store.dispatch('prefs/set', { key: READ_WHATS_NEW, value: getVersionInfo(store).fullVersion });
|
|
}
|
|
}
|