debian-mirror-gitlab/app/assets/javascripts/emoji/index.js

135 lines
3.7 KiB
JavaScript
Raw Normal View History

2020-04-08 14:13:33 +05:30
import { uniq } from 'lodash';
2017-09-10 17:25:29 +05:30
import emojiAliases from 'emojis/aliases.json';
2020-07-28 23:09:34 +05:30
import axios from '../lib/utils/axios_utils';
2017-09-10 17:25:29 +05:30
2020-07-28 23:09:34 +05:30
import AccessorUtilities from '../lib/utils/accessor';
let emojiMap = null;
let emojiPromise = null;
let validEmojiNames = null;
export const EMOJI_VERSION = '1';
const isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();
export function initEmojiMap() {
emojiPromise =
emojiPromise ||
new Promise((resolve, reject) => {
if (emojiMap) {
resolve(emojiMap);
} else if (
isLocalStorageAvailable &&
window.localStorage.getItem('gl-emoji-map-version') === EMOJI_VERSION &&
window.localStorage.getItem('gl-emoji-map')
) {
emojiMap = JSON.parse(window.localStorage.getItem('gl-emoji-map'));
validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
resolve(emojiMap);
} else {
// We load the JSON file direct from the server
// because it can't be loaded from a CDN due to
// cross domain problems with JSON
axios
.get(`${gon.relative_url_root || ''}/-/emojis/${EMOJI_VERSION}/emojis.json`)
.then(({ data }) => {
emojiMap = data;
validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
resolve(emojiMap);
if (isLocalStorageAvailable) {
window.localStorage.setItem('gl-emoji-map-version', EMOJI_VERSION);
window.localStorage.setItem('gl-emoji-map', JSON.stringify(emojiMap));
}
})
.catch(err => {
reject(err);
});
}
});
return emojiPromise;
}
2017-09-10 17:25:29 +05:30
export function normalizeEmojiName(name) {
return Object.prototype.hasOwnProperty.call(emojiAliases, name) ? emojiAliases[name] : name;
}
2020-07-28 23:09:34 +05:30
export function getValidEmojiNames() {
return validEmojiNames;
}
2017-09-10 17:25:29 +05:30
export function isEmojiNameValid(name) {
return validEmojiNames.indexOf(name) >= 0;
}
export function filterEmojiNames(filter) {
const match = filter.toLowerCase();
return validEmojiNames.filter(name => name.indexOf(match) >= 0);
}
export function filterEmojiNamesByAlias(filter) {
2020-04-08 14:13:33 +05:30
return uniq(filterEmojiNames(filter).map(name => normalizeEmojiName(name)));
2017-09-10 17:25:29 +05:30
}
let emojiCategoryMap;
export function getEmojiCategoryMap() {
if (!emojiCategoryMap) {
emojiCategoryMap = {
activity: [],
people: [],
nature: [],
food: [],
travel: [],
objects: [],
symbols: [],
flags: [],
};
2018-10-15 14:42:47 +05:30
Object.keys(emojiMap).forEach(name => {
2017-09-10 17:25:29 +05:30
const emoji = emojiMap[name];
2020-07-28 23:09:34 +05:30
if (emojiCategoryMap[emoji.c]) {
emojiCategoryMap[emoji.c].push(name);
2017-09-10 17:25:29 +05:30
}
});
}
return emojiCategoryMap;
}
export function getEmojiInfo(query) {
let name = normalizeEmojiName(query);
let emojiInfo = emojiMap[name];
// Fallback to question mark for unknown emojis
if (!emojiInfo) {
name = 'grey_question';
emojiInfo = emojiMap[name];
}
return { ...emojiInfo, name };
}
export function emojiFallbackImageSrc(inputName) {
2020-07-28 23:09:34 +05:30
const { name } = getEmojiInfo(inputName);
return `${gon.asset_host || ''}${gon.relative_url_root ||
''}/-/emojis/${EMOJI_VERSION}/${name}.png`;
2017-09-10 17:25:29 +05:30
}
export function emojiImageTag(name, src) {
return `<img class="emoji" title=":${name}:" alt=":${name}:" src="${src}" width="20" height="20" align="absmiddle" />`;
}
export function glEmojiTag(inputName, options) {
2020-07-28 23:09:34 +05:30
const opts = { sprite: false, ...options };
const name = normalizeEmojiName(inputName);
2017-09-10 17:25:29 +05:30
const fallbackSpriteClass = `emoji-${name}`;
2018-10-15 14:42:47 +05:30
const fallbackSpriteAttribute = opts.sprite
? `data-fallback-sprite-class="${fallbackSpriteClass}"`
: '';
2017-09-10 17:25:29 +05:30
return `
<gl-emoji
${fallbackSpriteAttribute}
2020-07-28 23:09:34 +05:30
data-name="${name}"></gl-emoji>
2017-09-10 17:25:29 +05:30
`;
}