summaryrefslogtreecommitdiffstats
path: root/web/react/stores/suggestion_store.jsx
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2016-03-14 08:50:46 -0400
committerChristopher Speller <crspeller@gmail.com>2016-03-16 18:02:55 -0400
commit12896bd23eeba79884245c1c29fdc568cf21a7fa (patch)
tree4e7f83d3e2564b9b89d669e9f7905ff11768b11a /web/react/stores/suggestion_store.jsx
parent29fe6a3d13c9c7aa490fffebbe5d1b5fdf1e3090 (diff)
downloadchat-12896bd23eeba79884245c1c29fdc568cf21a7fa.tar.gz
chat-12896bd23eeba79884245c1c29fdc568cf21a7fa.tar.bz2
chat-12896bd23eeba79884245c1c29fdc568cf21a7fa.zip
Converting to Webpack. Stage 1.
Diffstat (limited to 'web/react/stores/suggestion_store.jsx')
-rw-r--r--web/react/stores/suggestion_store.jsx261
1 files changed, 0 insertions, 261 deletions
diff --git a/web/react/stores/suggestion_store.jsx b/web/react/stores/suggestion_store.jsx
deleted file mode 100644
index efd2b76ed..000000000
--- a/web/react/stores/suggestion_store.jsx
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
-import Constants from '../utils/constants.jsx';
-import EventEmitter from 'events';
-
-const ActionTypes = Constants.ActionTypes;
-
-const COMPLETE_WORD_EVENT = 'complete_word';
-const PRETEXT_CHANGED_EVENT = 'pretext_changed';
-const SUGGESTIONS_CHANGED_EVENT = 'suggestions_changed';
-
-class SuggestionStore extends EventEmitter {
- constructor() {
- super();
-
- this.addSuggestionsChangedListener = this.addSuggestionsChangedListener.bind(this);
- this.removeSuggestionsChangedListener = this.removeSuggestionsChangedListener.bind(this);
- this.emitSuggestionsChanged = this.emitSuggestionsChanged.bind(this);
-
- this.addPretextChangedListener = this.addPretextChangedListener.bind(this);
- this.removePretextChangedListener = this.removePretextChangedListener.bind(this);
- this.emitPretextChanged = this.emitPretextChanged.bind(this);
-
- this.addCompleteWordListener = this.addCompleteWordListener.bind(this);
- this.removeCompleteWordListener = this.removeCompleteWordListener.bind(this);
- this.emitCompleteWord = this.emitCompleteWord.bind(this);
-
- this.handleEventPayload = this.handleEventPayload.bind(this);
- this.dispatchToken = AppDispatcher.register(this.handleEventPayload);
-
- // this.suggestions stores the state of all SuggestionBoxes by mapping their unique identifier to an
- // object with the following fields:
- // pretext: the text before the cursor
- // matchedPretext: the text before the cursor that will be replaced if an autocomplete term is selected
- // terms: a list of strings which the previously typed text may be replaced by
- // items: a list of objects backing the terms which may be used in rendering
- // components: a list of react components that can be used to render their corresponding item
- // selection: the term currently selected by the keyboard
- this.suggestions = new Map();
- }
-
- addSuggestionsChangedListener(id, callback) {
- this.on(SUGGESTIONS_CHANGED_EVENT + id, callback);
- }
- removeSuggestionsChangedListener(id, callback) {
- this.removeListener(SUGGESTIONS_CHANGED_EVENT + id, callback);
- }
- emitSuggestionsChanged(id) {
- this.emit(SUGGESTIONS_CHANGED_EVENT + id);
- }
-
- addPretextChangedListener(id, callback) {
- this.on(PRETEXT_CHANGED_EVENT + id, callback);
- }
- removePretextChangedListener(id, callback) {
- this.removeListener(PRETEXT_CHANGED_EVENT + id, callback);
- }
- emitPretextChanged(id, pretext) {
- this.emit(PRETEXT_CHANGED_EVENT + id, pretext);
- }
-
- addCompleteWordListener(id, callback) {
- this.on(COMPLETE_WORD_EVENT + id, callback);
- }
- removeCompleteWordListener(id, callback) {
- this.removeListener(COMPLETE_WORD_EVENT + id, callback);
- }
- emitCompleteWord(id, term) {
- this.emit(COMPLETE_WORD_EVENT + id, term);
- }
-
- registerSuggestionBox(id) {
- this.suggestions.set(id, {
- pretext: '',
- matchedPretext: '',
- terms: [],
- items: [],
- components: [],
- selection: ''
- });
- }
-
- unregisterSuggestionBox(id) {
- this.suggestions.delete(id);
- }
-
- clearSuggestions(id) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.matchedPretext = '';
- suggestion.terms = [];
- suggestion.items = [];
- suggestion.components = [];
- }
-
- clearSelection(id) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.selection = '';
- }
-
- hasSuggestions(id) {
- return this.suggestions.get(id).terms.length > 0;
- }
-
- setPretext(id, pretext) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.pretext = pretext;
- }
-
- setMatchedPretext(id, matchedPretext) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.matchedPretext = matchedPretext;
- }
-
- addSuggestion(id, term, item, component) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.terms.push(term);
- suggestion.items.push(item);
- suggestion.components.push(component);
- }
-
- addSuggestions(id, terms, items, component) {
- const suggestion = this.suggestions.get(id);
-
- suggestion.terms.push(...terms);
- suggestion.items.push(...items);
-
- for (let i = 0; i < terms.length; i++) {
- suggestion.components.push(component);
- }
- }
-
- // make sure that if suggestions exist, then one of them is selected. return true if the selection changes.
- ensureSelectionExists(id) {
- const suggestion = this.suggestions.get(id);
-
- if (suggestion.terms.length > 0) {
- // if the current selection is no longer in the map, select the first term in the list
- if (!suggestion.selection || suggestion.terms.indexOf(suggestion.selection) === -1) {
- suggestion.selection = suggestion.terms[0];
-
- return true;
- }
- } else if (suggestion.selection) {
- suggestion.selection = '';
-
- return true;
- }
-
- return false;
- }
-
- getPretext(id) {
- return this.suggestions.get(id).pretext;
- }
-
- getMatchedPretext(id) {
- return this.suggestions.get(id).matchedPretext;
- }
-
- getItems(id) {
- return this.suggestions.get(id).items;
- }
-
- getTerms(id) {
- return this.suggestions.get(id).terms;
- }
-
- getComponents(id) {
- return this.suggestions.get(id).components;
- }
-
- getSelection(id) {
- return this.suggestions.get(id).selection;
- }
-
- selectNext(id) {
- this.setSelectionByDelta(id, 1);
- }
-
- selectPrevious(id) {
- this.setSelectionByDelta(id, -1);
- }
-
- setSelectionByDelta(id, delta) {
- const suggestion = this.suggestions.get(id);
-
- let selectionIndex = suggestion.terms.indexOf(suggestion.selection);
-
- if (selectionIndex === -1) {
- // this should never happen since selection should always be in terms
- throw new Error('selection is not in terms');
- }
-
- selectionIndex += delta;
-
- if (selectionIndex < 0) {
- selectionIndex = 0;
- } else if (selectionIndex > suggestion.terms.length - 1) {
- selectionIndex = suggestion.terms.length - 1;
- }
-
- suggestion.selection = suggestion.terms[selectionIndex];
- }
-
- handleEventPayload(payload) {
- const {type, id, ...other} = payload.action; // eslint-disable-line no-use-before-define
-
- switch (type) {
- case ActionTypes.SUGGESTION_PRETEXT_CHANGED:
- this.clearSuggestions(id);
-
- this.setPretext(id, other.pretext);
- this.emitPretextChanged(id, other.pretext);
-
- this.ensureSelectionExists(id);
- this.emitSuggestionsChanged(id);
- break;
- case ActionTypes.SUGGESTION_RECEIVED_SUGGESTIONS:
- if (this.getMatchedPretext(id) === '') {
- this.setMatchedPretext(id, other.matchedPretext);
-
- // ensure the matched pretext hasn't changed so that we don't receive suggestions for outdated pretext
- this.addSuggestions(id, other.terms, other.items, other.component);
-
- this.ensureSelectionExists(id);
- this.emitSuggestionsChanged(id);
- }
- break;
- case ActionTypes.SUGGESTION_CLEAR_SUGGESTIONS:
- this.clearSuggestions(id);
- this.clearSelection(id);
- this.emitSuggestionsChanged(id);
- break;
- case ActionTypes.SUGGESTION_SELECT_NEXT:
- this.selectNext(id);
- this.emitSuggestionsChanged(id);
- break;
- case ActionTypes.SUGGESTION_SELECT_PREVIOUS:
- this.selectPrevious(id);
- this.emitSuggestionsChanged(id);
- break;
- case ActionTypes.SUGGESTION_COMPLETE_WORD:
- this.emitCompleteWord(id, other.term || this.getSelection(id), this.getMatchedPretext(id));
-
- this.setPretext(id, '');
- this.clearSuggestions(id);
- this.clearSelection(id);
- this.emitSuggestionsChanged(id);
- break;
- }
- }
-}
-
-export default new SuggestionStore();