maisonsport-common-ui
Version:
Suite of styled-components to be consumed by the React-Native App and by the Web (via React-Native for Web)
59 lines (46 loc) • 1.54 kB
JavaScript
/* eslint-disable import/prefer-default-export */
import emojiRegex from 'emoji-regex';
import emailValidator from 'email-validator';
import equals from 'validator/lib/equals';
import isMobilePhone from 'validator/lib/isMobilePhone';
import Theme from '../theme';
const defaultColors = [
Theme.colors.primary,
Theme.colors.darkPrimary,
Theme.colors.lightPrimary,
Theme.colors.darkGrey,
Theme.colors.dustyBlue,
Theme.colors.red,
Theme.colors.lightRed,
Theme.colors.green,
Theme.colors.darkGreen,
Theme.colors.lightGreen,
];
export const debounceDefaults = {
onChange: 300,
};
function stringAsciiPRNG(value, m) {
const charCodes = [...value].map((letter) => letter.charCodeAt(0));
const len = charCodes.length;
const a = (len % (m - 1)) + 1;
const c = charCodes.reduce((current, next) => current + next) % m;
let random = charCodes[0] % m;
// eslint-disable-next-line no-plusplus
for (let i = 0; i < len; i++) random = ((a * random) + c) % m;
return random;
}
export function getRandomColor(value, colors = defaultColors) {
if (!value) return 'primary';
const colorIndex = stringAsciiPRNG(value, colors.length);
return colors[colorIndex];
}
export function isSingleEmoji(content) {
if (typeof content !== 'string') return content;
const reg = new RegExp(`^(${emojiRegex().source})$`);
return content.trim().match(reg);
}
export const commonValidators = {
email: emailValidator.validate,
equals,
isMobilePhone: (value) => isMobilePhone(value, 'any', { strictMode: true }),
};