* Remove mattermost-redux * Move mm-redux files into app/redux * Add @redux path to tsconfig.json * Fix imports * Install missing dependencies * Fix tsc errors * Fix i18n_utils test * Fix more imports * Remove redux websocket * Fix tests * Rename @redux * Apply changes from mattermost-redux PR 1103 * Remove mattermost-redux mention in template * Add missing imports * Rename app/redux/ to app/mm-redux/ * Remove test file * Fix fetching Sidebar GM profiles Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
123 lines
4.3 KiB
TypeScript
123 lines
4.3 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
import * as reselect from 'reselect';
|
|
import shallowEqual from 'shallow-equals';
|
|
import {Dictionary} from '@mm-redux/types/utilities';
|
|
export function memoizeResult<F extends Function>(func: F): any {
|
|
let lastArgs: IArguments|null = null;
|
|
let lastResult: any = null;
|
|
|
|
// we reference arguments instead of spreading them for performance reasons
|
|
return function shallowCompare() {
|
|
if (!shallowEqual(lastArgs, arguments)) { //eslint-disable-line prefer-rest-params
|
|
//eslint-disable-line prefer-rest-params
|
|
// apply arguments instead of spreading for performance.
|
|
const result = Reflect.apply(func, null, arguments); //eslint-disable-line prefer-rest-params
|
|
if (!shallowEqual(lastResult, result)) {
|
|
lastResult = result;
|
|
}
|
|
}
|
|
|
|
lastArgs = arguments; //eslint-disable-line prefer-rest-params
|
|
return lastResult;
|
|
};
|
|
}
|
|
|
|
// Use this selector when you want a shallow comparison of the arguments and you want to memoize the result
|
|
// try and use this only when your selector returns an array of ids
|
|
export const createIdsSelector = reselect.createSelectorCreator(memoizeResult);
|
|
|
|
// Use this selector when you want a shallow comparison of the arguments and you don't need to memoize the result
|
|
export const createShallowSelector = reselect.createSelectorCreator(reselect.defaultMemoize, shallowEqual as any);
|
|
|
|
// isMinimumServerVersion will return true if currentVersion is equal to higher or than the
|
|
// the provided minimum version. A non-equal major version will ignore minor and dot
|
|
// versions, and a non-equal minor version will ignore dot version.
|
|
// currentVersion is a string, e.g '4.6.0'
|
|
// minMajorVersion, minMinorVersion, minDotVersion are integers
|
|
export const isMinimumServerVersion = (currentVersion: string, minMajorVersion = 0, minMinorVersion = 0, minDotVersion = 0): boolean => {
|
|
if (!currentVersion || typeof currentVersion !== 'string') {
|
|
return false;
|
|
}
|
|
|
|
const split = currentVersion.split('.');
|
|
|
|
const major = parseInt(split[0], 10);
|
|
const minor = parseInt(split[1] || '0', 10);
|
|
const dot = parseInt(split[2] || '0', 10);
|
|
|
|
if (major > minMajorVersion) {
|
|
return true;
|
|
}
|
|
if (major < minMajorVersion) {
|
|
return false;
|
|
}
|
|
|
|
// Major version is equal, check minor
|
|
if (minor > minMinorVersion) {
|
|
return true;
|
|
}
|
|
if (minor < minMinorVersion) {
|
|
return false;
|
|
}
|
|
|
|
// Minor version is equal, check dot
|
|
if (dot > minDotVersion) {
|
|
return true;
|
|
}
|
|
if (dot < minDotVersion) {
|
|
return false;
|
|
}
|
|
|
|
// Dot version is equal
|
|
return true;
|
|
};
|
|
|
|
// Generates a RFC-4122 version 4 compliant globally unique identifier.
|
|
export function generateId(): string {
|
|
// implementation taken from http://stackoverflow.com/a/2117523
|
|
let id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
|
|
id = id.replace(/[xy]/g, (c) => {
|
|
const r = Math.floor(Math.random() * 16);
|
|
let v;
|
|
|
|
if (c === 'x') {
|
|
v = r;
|
|
} else {
|
|
// eslint-disable-next-line no-mixed-operators
|
|
v = r & 0x3 | 0x8;
|
|
}
|
|
|
|
return v.toString(16);
|
|
});
|
|
return id;
|
|
}
|
|
|
|
export function isEmail(email: string): boolean {
|
|
// writing a regex to match all valid email addresses is really, really hard. (see http://stackoverflow.com/a/201378)
|
|
// this regex ensures:
|
|
// - at least one character that is not a space, comma, or @ symbol
|
|
// - followed by a single @ symbol
|
|
// - followed by at least one character that is not a space, comma, or @ symbol
|
|
// this prevents <Outlook Style> outlook.style@domain.com addresses and multiple comma-separated addresses from being accepted
|
|
return (/^[^ ,@]+@[^ ,@]+$/).test(email);
|
|
}
|
|
|
|
export function buildQueryString(parameters: Dictionary<any>): string {
|
|
const keys = Object.keys(parameters);
|
|
if (keys.length === 0) {
|
|
return '';
|
|
}
|
|
|
|
let query = '?';
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const key = keys[i];
|
|
query += key + '=' + encodeURIComponent(parameters[key]);
|
|
|
|
if (i < keys.length - 1) {
|
|
query += '&';
|
|
}
|
|
}
|
|
|
|
return query;
|
|
}
|