Mailspring/internal_packages/composer-emoji/lib/emoji-store.jsx

70 lines
1.7 KiB
React
Raw Normal View History

import NylasStore from 'nylas-store';
import Rx from 'rx-lite';
import _ from 'underscore';
import {DatabaseStore} from 'nylas-exports';
import EmojiActions from './emoji-actions';
const EmojiJSONBlobKey = 'emoji';
class EmojiStore extends NylasStore {
constructor(props) {
super(props);
this._emoji = [];
}
activate = () => {
const query = DatabaseStore.findJSONBlob(EmojiJSONBlobKey);
this._subscription = Rx.Observable.fromQuery(query).subscribe((emoji) => {
this._emoji = emoji ? emoji : [];
this.trigger();
});
this.listenTo(EmojiActions.useEmoji, this._onUseEmoji);
}
frequentlyUsedEmoji = () => {
const sortedEmoji = this._emoji;
sortedEmoji.sort((a, b) => {
if (a.frequency < b.frequency) return 1;
return (b.frequency < a.frequency) ? -1 : 0;
});
const sortedEmojiNames = [];
for (const emoji of sortedEmoji) {
sortedEmojiNames.push(emoji.emojiName);
}
if (sortedEmojiNames.length > 32) {
return sortedEmojiNames.slice(0, 32);
}
return sortedEmojiNames;
}
_onUseEmoji = (emoji) => {
const savedEmoji = _.find(this._emoji, (curEmoji) => {
return curEmoji.emojiChar === emoji.emojiChar;
});
if (savedEmoji) {
for (const key in emoji) {
if (emoji.hasOwnProperty(key)) {
savedEmoji[key] = emoji[key];
}
}
savedEmoji.frequency++;
} else {
_.extend(emoji, {frequency: 1});
this._emoji.push(emoji);
}
this._saveEmoji();
this.trigger();
}
_saveEmoji = () => {
DatabaseStore.inTransaction((t) => {
return t.persistJSONBlob(EmojiJSONBlobKey, this._emoji);
});
}
}
export default new EmojiStore();