Move remaining actions over to use redux and v4 endpoints (#6720)

Этот коммит содержится в:
Joram Wilander
2017-06-26 08:16:57 -04:00
коммит произвёл GitHub
родитель fe7e9d95b3
Коммит 23ccfc845c
76 изменённых файлов: 686 добавлений и 6975 удалений

Просмотреть файл

@@ -3,8 +3,6 @@
import {clientLogout} from 'actions/global_actions.jsx';
import Client from 'client/web_client.jsx';
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
@@ -267,31 +265,26 @@ export function uploadBrandImage(brandImage, success, error) {
}
export function uploadLicenseFile(file, success, error) {
Client.uploadLicenseFile(
file,
() => {
if (success) {
success();
}
},
(err) => {
if (error) {
error(err);
AdminActions.uploadLicense(file)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
} else if (data == null && error) {
const serverError = getState().requests.admin.uploadLicense.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
}
export function removeLicenseFile(success, error) {
Client.removeLicenseFile(
() => {
if (success) {
success();
}
},
(err) => {
if (error) {
error(err);
AdminActions.removeLicense()(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
} else if (data == null && error) {
const serverError = getState().requests.admin.removeLicense.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
@@ -374,3 +367,19 @@ export function removeIdpSamlCertificate(success, error) {
}
);
}
export function getStandardAnalytics(teamId) {
AdminActions.getStandardAnalytics(teamId)(dispatch, getState);
}
export function getAdvancedAnalytics(teamId) {
AdminActions.getAdvancedAnalytics(teamId)(dispatch, getState);
}
export function getPostsPerDayAnalytics(teamId) {
AdminActions.getPostsPerDayAnalytics(teamId)(dispatch, getState);
}
export function getUsersPerDayAnalytics(teamId) {
AdminActions.getUsersPerDayAnalytics(teamId)(dispatch, getState);
}

Просмотреть файл

@@ -1,8 +1,6 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import TeamStore from 'stores/team_store.jsx';
import UserStore from 'stores/user_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
@@ -14,36 +12,19 @@ import * as GlobalActions from 'actions/global_actions.jsx';
import {loadProfilesForSidebar, loadNewDMIfNeeded, loadNewGMIfNeeded} from 'actions/user_actions.jsx';
import {trackEvent} from 'actions/diagnostics_actions.jsx';
import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as UserAgent from 'utils/user_agent.jsx';
import * as Utils from 'utils/utils.jsx';
import {Constants, Preferences, ActionTypes} from 'utils/constants.jsx';
import {Constants, Preferences} from 'utils/constants.jsx';
import {browserHistory} from 'react-router/es6';
// Redux actions
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {
viewChannel,
addChannelMember,
removeChannelMember,
updateChannelMemberRoles,
createDirectChannel,
fetchMyChannelsAndMembers,
joinChannel as joinChannelRedux,
leaveChannel as leaveChannelRedux,
updateChannel as updateChannelRedux,
searchChannels,
updateChannelNotifyProps as updateChannelNotifyPropsRedux,
createChannel as createChannelRedux,
patchChannel,
getChannelMembersByIds,
deleteChannel as deleteChannelRedux
} from 'mattermost-redux/actions/channels';
import * as ChannelActions from 'mattermost-redux/actions/channels';
import {savePreferences, deletePreferences} from 'mattermost-redux/actions/preferences';
import {Client4} from 'mattermost-redux/client';
import {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/channels';
@@ -92,10 +73,8 @@ export function executeCommand(message, args, success, error) {
return;
}
Client.executeCommand(msg, args, success,
Client4.executeCommand(msg, args).then(success).catch(
(err) => {
AsyncClient.dispatchError(err, 'executeCommand');
if (error) {
error(err);
}
@@ -105,7 +84,7 @@ export function executeCommand(message, args, success, error) {
export function setChannelAsRead(channelIdParam) {
const channelId = channelIdParam || ChannelStore.getCurrentId();
viewChannel(channelId)(dispatch, getState);
ChannelActions.viewChannel(channelId)(dispatch, getState);
ChannelStore.resetCounts([channelId]);
ChannelStore.emitChange();
if (channelId === ChannelStore.getCurrentId()) {
@@ -114,7 +93,7 @@ export function setChannelAsRead(channelIdParam) {
}
export function addUserToChannel(channelId, userId, success, error) {
addChannelMember(channelId, userId)(dispatch, getState).then(
ChannelActions.addChannelMember(channelId, userId)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -127,7 +106,7 @@ export function addUserToChannel(channelId, userId, success, error) {
}
export function removeUserFromChannel(channelId, userId, success, error) {
removeChannelMember(channelId, userId)(dispatch, getState).then(
ChannelActions.removeChannelMember(channelId, userId)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -140,7 +119,7 @@ export function removeUserFromChannel(channelId, userId, success, error) {
}
export function makeUserChannelAdmin(channelId, userId, success, error) {
updateChannelMemberRoles(channelId, userId, 'channel_user channel_admin')(dispatch, getState).then(
ChannelActions.updateChannelMemberRoles(channelId, userId, 'channel_user channel_admin')(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -153,7 +132,7 @@ export function makeUserChannelAdmin(channelId, userId, success, error) {
}
export function makeUserChannelMember(channelId, userId, success, error) {
updateChannelMemberRoles(channelId, userId, 'channel_user')(dispatch, getState).then(
ChannelActions.updateChannelMemberRoles(channelId, userId, 'channel_user')(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -174,11 +153,8 @@ export function openDirectChannelToUser(userId, success, error) {
PreferenceStore.setPreference(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, userId, 'true');
loadProfilesForSidebar();
AsyncClient.savePreference(
Preferences.CATEGORY_DIRECT_CHANNEL_SHOW,
userId,
'true'
);
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, name: userId, value: 'true'}])(dispatch, getState);
if (success) {
success(channel, true);
@@ -187,7 +163,7 @@ export function openDirectChannelToUser(userId, success, error) {
return;
}
createDirectChannel(UserStore.getCurrentId(), userId)(dispatch, getState).then(
ChannelActions.createDirectChannel(UserStore.getCurrentId(), userId)(dispatch, getState).then(
(data) => {
loadProfilesForSidebar();
if (data && success) {
@@ -202,37 +178,15 @@ export function openDirectChannelToUser(userId, success, error) {
}
export function openGroupChannelToUsers(userIds, success, error) {
Client.createGroupChannel(
userIds,
ChannelActions.createGroupChannel(userIds)(dispatch, getState).then(
(data) => {
Client.getChannelMember(
data.id,
UserStore.getCurrentId(),
(data2) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_CHANNEL,
channel: data,
member: data2
});
PreferenceStore.setPreference(Preferences.CATEGORY_GROUP_CHANNEL_SHOW, data.id, 'true');
loadProfilesForSidebar();
AsyncClient.savePreference(
Preferences.CATEGORY_GROUP_CHANNEL_SHOW,
data.id,
'true'
);
if (success) {
success(data);
}
}
);
},
() => {
if (error) {
error();
loadProfilesForSidebar();
if (data && success) {
success(data, false);
} else if (data == null && error) {
browserHistory.push(TeamStore.getCurrentTeamUrl());
const serverError = getState().requests.channels.createChannel.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
@@ -240,22 +194,25 @@ export function openGroupChannelToUsers(userIds, success, error) {
export function markFavorite(channelId) {
trackEvent('api', 'api_channels_favorited');
AsyncClient.savePreference(Preferences.CATEGORY_FAVORITE_CHANNEL, channelId, 'true');
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_FAVORITE_CHANNEL, name: channelId, value: 'true'}])(dispatch, getState);
}
export function unmarkFavorite(channelId) {
trackEvent('api', 'api_channels_unfavorited');
const currentUserId = UserStore.getCurrentId();
const pref = {
user_id: UserStore.getCurrentId(),
user_id: currentUserId,
category: Preferences.CATEGORY_FAVORITE_CHANNEL,
name: channelId
};
AsyncClient.deletePreferences([pref]);
deletePreferences(currentUserId, [pref])(dispatch, getState);
}
export function loadChannelsForCurrentUser() {
fetchMyChannelsAndMembers(TeamStore.getCurrentId())(dispatch, getState).then(
ChannelActions.fetchMyChannelsAndMembers(TeamStore.getCurrentId())(dispatch, getState).then(
() => {
loadDMsAndGMsForUnreads();
}
@@ -281,7 +238,7 @@ export function loadDMsAndGMsForUnreads() {
}
export function joinChannel(channel, success, error) {
joinChannelRedux(UserStore.getCurrentId(), null, channel.id)(dispatch, getState).then(
ChannelActions.joinChannel(UserStore.getCurrentId(), null, channel.id)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -294,7 +251,7 @@ export function joinChannel(channel, success, error) {
}
export function updateChannel(channel, success, error) {
updateChannelRedux(channel)(dispatch, getState).then(
ChannelActions.updateChannel(channel)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -307,7 +264,7 @@ export function updateChannel(channel, success, error) {
}
export function searchMoreChannels(term, success, error) {
searchChannels(TeamStore.getCurrentId(), term)(dispatch, getState).then(
ChannelActions.searchChannels(TeamStore.getCurrentId(), term)(dispatch, getState).then(
(data) => {
if (data && success) {
const myMembers = getMyChannelMemberships(getState());
@@ -322,7 +279,7 @@ export function searchMoreChannels(term, success, error) {
}
export function autocompleteChannels(term, success, error) {
searchChannels(TeamStore.getCurrentId(), term)(dispatch, getState).then(
ChannelActions.searchChannels(TeamStore.getCurrentId(), term)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -335,7 +292,7 @@ export function autocompleteChannels(term, success, error) {
}
export function updateChannelNotifyProps(data, options, success, error) {
updateChannelNotifyPropsRedux(data.user_id, data.channel_id, Object.assign({}, data, options))(dispatch, getState).then(
ChannelActions.updateChannelNotifyProps(data.user_id, data.channel_id, Object.assign({}, data, options))(dispatch, getState).then(
(result) => {
if (result && success) {
success(result);
@@ -348,7 +305,7 @@ export function updateChannelNotifyProps(data, options, success, error) {
}
export function createChannel(channel, success, error) {
createChannelRedux(channel)(dispatch, getState).then(
ChannelActions.createChannel(channel)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -361,7 +318,7 @@ export function createChannel(channel, success, error) {
}
export function updateChannelPurpose(channelId, purpose, success, error) {
patchChannel(channelId, {purpose})(dispatch, getState).then(
ChannelActions.patchChannel(channelId, {purpose})(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -374,7 +331,7 @@ export function updateChannelPurpose(channelId, purpose, success, error) {
}
export function updateChannelHeader(channelId, header, success, error) {
patchChannel(channelId, {header})(dispatch, getState).then(
ChannelActions.patchChannel(channelId, {header})(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -387,7 +344,7 @@ export function updateChannelHeader(channelId, header, success, error) {
}
export function getChannelMembersForUserIds(channelId, userIds, success, error) {
getChannelMembersByIds(channelId, userIds)(dispatch, getState).then(
ChannelActions.getChannelMembersByIds(channelId, userIds)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
@@ -400,7 +357,7 @@ export function getChannelMembersForUserIds(channelId, userIds, success, error)
}
export function leaveChannel(channelId, success) {
leaveChannelRedux(channelId)(dispatch, getState).then(
ChannelActions.leaveChannel(channelId)(dispatch, getState).then(
() => {
if (ChannelUtils.isFavoriteChannelId(channelId)) {
unmarkFavorite(channelId);
@@ -417,7 +374,7 @@ export function leaveChannel(channelId, success) {
}
export function deleteChannel(channelId, success, error) {
deleteChannelRedux(channelId)(dispatch, getState).then(
ChannelActions.deleteChannel(channelId)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);

Просмотреть файл

@@ -1,8 +1,24 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import Client from 'client/web_client.jsx';
import UserStore from 'stores/user_store.jsx';
export function trackEvent(category, event, properties) {
Client.trackEvent(category, event, properties);
export function trackEvent(category, event, props) {
if (global.window && global.window.analytics) {
const properties = Object.assign({category, type: event, user_actual_id: UserStore.getCurrentId()}, props);
const options = {
context: {
ip: '0.0.0.0'
},
page: {
path: '',
referrer: '',
search: '',
title: '',
url: ''
},
anonymousId: '00000000000000000000000000'
};
global.window.analytics.track('event', properties, options);
}
}

Просмотреть файл

@@ -3,20 +3,21 @@
import UserStore from 'stores/user_store.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import {ActionTypes} from 'utils/constants.jsx';
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {getProfilesByIds} from 'mattermost-redux/actions/users';
import {getAllCustomEmojis} from 'mattermost-redux/actions/emojis';
import * as EmojiActions from 'mattermost-redux/actions/emojis';
export function loadEmoji(getProfiles = true) {
getAllCustomEmojis(10000)(dispatch, getState).then(
(data) => {
if (getProfiles) {
loadProfilesForEmoji(data);
}
}
);
export async function loadEmoji(getProfiles = true) {
const data = await EmojiActions.getAllCustomEmojis(10000)(dispatch, getState);
if (data && getProfiles) {
loadProfilesForEmoji(data);
}
}
function loadProfilesForEmoji(emojiList) {
@@ -35,3 +36,37 @@ function loadProfilesForEmoji(emojiList) {
getProfilesByIds(list)(dispatch, getState);
}
export function addEmoji(emoji, image, success, error) {
EmojiActions.createCustomEmoji(emoji, image)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
} else if (data == null && error) {
const serverError = getState().requests.emojis.createCustomEmoji.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
}
export function deleteEmoji(emojiId, success, error) {
EmojiActions.deleteCustomEmoji(emojiId)(dispatch, getState).then(
(data) => {
if (data) {
// Needed to remove recently used emoji
AppDispatcher.handleServerAction({
type: ActionTypes.REMOVED_CUSTOM_EMOJI,
id: emojiId
});
if (success) {
success(data);
}
} else if (data == null && error) {
const serverError = getState().requests.emojis.deleteCustomEmoji.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
}

Просмотреть файл

@@ -5,6 +5,7 @@ import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {uploadFile as uploadFileRedux} from 'mattermost-redux/actions/files';
import {Client4} from 'mattermost-redux/client';
export function uploadFile(file, name, channelId, clientId, success, error) {
const fileFormData = new FormData();
@@ -23,3 +24,15 @@ export function uploadFile(file, name, channelId, clientId, success, error) {
}
);
}
export async function getPublicLink(fileId, success) {
Client4.getFilePublicLink(fileId).then(
(data) => {
if (data && success) {
success(data.link);
}
}
).catch(
() => {} //eslint-disable-line no-empty-function
);
}

Просмотреть файл

@@ -21,8 +21,6 @@ import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
import EventTypes from 'utils/event_types.jsx';
import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import WebSocketClient from 'client/web_websocket_client.jsx';
import {sortTeamsByDisplayName} from 'utils/team_utils.jsx';
import * as Utils from 'utils/utils.jsx';
@@ -35,20 +33,24 @@ import {browserHistory} from 'react-router/es6';
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {Client4} from 'mattermost-redux/client';
import {removeUserFromTeam} from 'mattermost-redux/actions/teams';
import {viewChannel, getChannelStats, getMyChannelMember, getChannelAndMyMember} from 'mattermost-redux/actions/channels';
import {viewChannel, getChannelStats, getMyChannelMember, getChannelAndMyMember, createDirectChannel} from 'mattermost-redux/actions/channels';
import {getPostThread} from 'mattermost-redux/actions/posts';
export function emitChannelClickEvent(channel) {
function userVisitedFakeChannel(chan, success, fail) {
const currentUserId = UserStore.getCurrentId();
const otherUserId = Utils.getUserIdFromChannelName(chan);
Client.createDirectChannel(
otherUserId,
createDirectChannel(currentUserId, otherUserId)(dispatch, getState).then(
(data) => {
success(data);
},
() => {
fail();
if (data) {
success(data);
} else {
fail();
}
}
);
}
@@ -119,32 +121,29 @@ export function doFocusPost(channelId, postId, data) {
export function emitPostFocusEvent(postId, onSuccess) {
loadChannelsForCurrentUser();
Client.getPermalinkTmp(
postId,
getPostThread(postId)(dispatch, getState).then(
(data) => {
if (!data) {
return;
}
const channelId = data.posts[data.order[0]].channel_id;
doFocusPost(channelId, postId, data);
if (data) {
const channelId = data.posts[data.order[0]].channel_id;
doFocusPost(channelId, postId, data);
if (onSuccess) {
onSuccess();
}
},
() => {
let link = `${TeamStore.getCurrentTeamRelativeUrl()}/channels/`;
const channel = ChannelStore.getCurrent();
if (channel) {
link += channel.name;
if (onSuccess) {
onSuccess();
}
} else {
link += 'town-square';
let link = `${TeamStore.getCurrentTeamRelativeUrl()}/channels/`;
const channel = ChannelStore.getCurrent();
if (channel) {
link += channel.name;
} else {
link += 'town-square';
}
const message = encodeURIComponent(Utils.localizeMessage('permalink.error.access', 'Permalink belongs to a deleted message or to a channel to which you do not have access.'));
const title = encodeURIComponent(Utils.localizeMessage('permalink.error.title', 'Message Not Found'));
browserHistory.push('/error?message=' + message + '&title=' + title + '&link=' + encodeURIComponent(link));
}
const message = encodeURIComponent(Utils.localizeMessage('permalink.error.access', 'Permalink belongs to a deleted message or to a channel to which you do not have access.'));
const title = encodeURIComponent(Utils.localizeMessage('permalink.error.title', 'Message Not Found'));
browserHistory.push('/error?message=' + message + '&title=' + title + '&link=' + encodeURIComponent(link));
}
);
}
@@ -353,8 +352,7 @@ export function newLocalizationSelected(locale) {
} else {
const localeInfo = I18n.getLanguageInfo(locale);
Client.getTranslations(
localeInfo.url,
Client4.getTranslations(localeInfo.url).then(
(data, res) => {
let translations = data;
if (!data && res.text) {
@@ -365,10 +363,9 @@ export function newLocalizationSelected(locale) {
locale,
translations
});
},
(err) => {
AsyncClient.dispatchError(err, 'getTranslations');
}
).catch(
() => {} //eslint-disable-line no-empty-function
);
}
}
@@ -414,14 +411,15 @@ export function emitRemoteUserTypingEvent(channelId, userId, postParentId) {
}
export function emitUserLoggedOutEvent(redirectTo = '/', shouldSignalLogout = true) {
Client.logout(
Client4.logout().then(
() => {
if (shouldSignalLogout) {
BrowserStore.signalLogout();
}
clientLogout(redirectTo);
},
}
).catch(
() => {
browserHistory.push(redirectTo);
}
@@ -523,7 +521,6 @@ export function redirectUserToDefaultTeam() {
if (channel) {
redirect(teams[teamId].name, channel);
} else if (channelId) {
Client.setTeamId(teamId);
getChannelAndMyMember(channelId)(dispatch, getState).then(
(data) => {
if (data) {
@@ -541,34 +538,6 @@ export function redirectUserToDefaultTeam() {
}
}
requestOpenGraphMetadata.openGraphMetadataOnGoingRequests = {}; // Format: {<url>: true}
export function requestOpenGraphMetadata(url) {
if (global.mm_config.EnableLinkPreviews !== 'true') {
return;
}
const onself = requestOpenGraphMetadata;
if (!onself.openGraphMetadataOnGoingRequests[url]) {
onself.openGraphMetadataOnGoingRequests[url] = true;
Client.getOpenGraphMetadata(url,
(data) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECIVED_OPEN_GRAPH_METADATA,
url,
data
});
delete onself.openGraphMetadataOnGoingRequests[url];
},
(err) => {
AsyncClient.dispatchError(err, 'getOpenGraphMetadata');
delete onself.openGraphMetadataOnGoingRequests[url];
}
);
}
}
export function postListScrollChange() {
AppDispatcher.handleViewAction({
type: EventTypes.POST_LIST_SCROLL_CHANGE

Просмотреть файл

@@ -4,13 +4,21 @@
import UserStore from 'stores/user_store.jsx';
import TeamStore from 'stores/team_store.jsx';
// Redux actions
import * as UserAgent from 'utils/user_agent.jsx';
import {ActionTypes} from 'utils/constants.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {Client4} from 'mattermost-redux/client';
import {getProfilesByIds} from 'mattermost-redux/actions/users';
import * as IntegrationActions from 'mattermost-redux/actions/integrations';
import request from 'superagent';
export function loadIncomingHooks(complete) {
IntegrationActions.getIncomingHooks('', 0, 10000)(dispatch, getState).then(
(data) => {
@@ -201,3 +209,61 @@ export function deleteCommand(id) {
export function regenCommandToken(id) {
IntegrationActions.regenCommandToken(id)(dispatch, getState);
}
export function getSuggestedCommands(command, suggestionId, component) {
Client4.getCommandsList(TeamStore.getCurrentId()).then(
(data) => {
var matches = [];
data.forEach((cmd) => {
if (cmd.trigger !== 'shortcuts' || !UserAgent.isMobile()) {
if (('/' + cmd.trigger).indexOf(command) === 0) {
const s = '/' + cmd.trigger;
let hint = '';
if (cmd.auto_complete_hint && cmd.auto_complete_hint.length !== 0) {
hint = cmd.auto_complete_hint;
}
matches.push({
suggestion: s,
hint,
description: cmd.auto_complete_desc
});
}
}
});
matches = matches.sort((a, b) => a.suggestion.localeCompare(b.suggestion));
// pull out the suggested commands from the returned data
const terms = matches.map((suggestion) => suggestion.suggestion);
if (terms.length > 0) {
AppDispatcher.handleServerAction({
type: ActionTypes.SUGGESTION_RECEIVED_SUGGESTIONS,
id: suggestionId,
matchedPretext: command,
terms,
items: matches,
component
});
}
}
).catch(
() => {} //eslint-disable-line no-empty-function
);
}
export function getYoutubeVideoInfo(googleKey, videoId, success, error) {
request.get('https://www.googleapis.com/youtube/v3/videos').
query({part: 'snippet', id: videoId, key: googleKey}).
end((err, res) => {
if (err) {
return error(err);
}
if (!res.body) {
console.error('Missing response body for getYoutubeVideoInfo'); // eslint-disable-line no-console
}
return success(res.body);
});
}

Просмотреть файл

@@ -6,34 +6,25 @@ import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import UserStore from 'stores/user_store.jsx';
import PostStore from 'stores/post_store.jsx';
import TeamStore from 'stores/team_store.jsx';
import {loadNewDMIfNeeded, loadNewGMIfNeeded} from 'actions/user_actions.jsx';
import {trackEvent} from 'actions/diagnostics_actions.jsx';
import {sendDesktopNotification} from 'actions/notification_actions.jsx';
import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
const Preferences = Constants.Preferences;
// Redux actions
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {getProfilesByIds} from 'mattermost-redux/actions/users';
import {
createPost as createPostRedux,
getPostThread,
editPost,
deletePost as deletePostRedux,
getPosts,
getPostsBefore,
addReaction as addReactionRedux,
removeReaction as removeReactionRedux
} from 'mattermost-redux/actions/posts';
import * as PostActions from 'mattermost-redux/actions/posts';
import {getMyChannelMember} from 'mattermost-redux/actions/channels';
import {Client4} from 'mattermost-redux/client';
import {PostTypes} from 'mattermost-redux/action_types';
import * as Selectors from 'mattermost-redux/selectors/entities/posts';
import {batchActions} from 'redux-batched-actions';
@@ -47,11 +38,6 @@ export function handleNewPost(post, msg) {
if (ChannelStore.getMyMember(post.channel_id)) {
completePostReceive(post, websocketMessageProps);
} else {
// This API call requires any real team id in API v3, so set one if we don't already have one
if (!Client.teamId && msg && msg.data) {
Client.setTeamId(msg.data.team_id);
}
getMyChannelMember(post.channel_id)(dispatch, getState).then(() => completePostReceive(post, websocketMessageProps));
}
@@ -66,7 +52,7 @@ export function handleNewPost(post, msg) {
function completePostReceive(post, websocketMessageProps) {
if (post.root_id && Selectors.getPost(getState(), post.root_id) == null) {
getPostThread(post.root_id)(dispatch, getState).then(
PostActions.getPostThread(post.root_id)(dispatch, getState).then(
(data) => {
// Need manual dispatch to remove pending post
dispatch({
@@ -116,31 +102,16 @@ function completePostReceive(post, websocketMessageProps) {
sendDesktopNotification(post, websocketMessageProps);
}
export function pinPost(channelId, postId) {
AsyncClient.pinPost(channelId, postId);
}
export function unpinPost(channelId, postId) {
AsyncClient.unpinPost(channelId, postId);
}
export function flagPost(postId) {
trackEvent('api', 'api_posts_flagged');
AsyncClient.savePreference(Preferences.CATEGORY_FLAGGED_POST, postId, 'true');
PostActions.flagPost(postId)(dispatch, getState);
}
export function unflagPost(postId, success) {
trackEvent('api', 'api_posts_unflagged');
const pref = {
user_id: UserStore.getCurrentId(),
category: Preferences.CATEGORY_FLAGGED_POST,
name: postId
};
AsyncClient.deletePreferences([pref], success);
export function unflagPost(postId) {
PostActions.unflagPost(postId)(dispatch, getState);
}
export function getFlaggedPosts() {
Client.getFlaggedPosts(0, Constants.POST_CHUNK_SIZE,
Client4.getFlaggedPosts(UserStore.getCurrentId(), '', TeamStore.getCurrentId()).then(
(data) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_SEARCH_TERM,
@@ -157,15 +128,14 @@ export function getFlaggedPosts() {
});
loadProfilesForPosts(data.posts);
},
(err) => {
AsyncClient.dispatchError(err, 'getFlaggedPosts');
}
).catch(
() => {} //eslint-disable-line no-empty-function
);
}
export function getPinnedPosts(channelId = ChannelStore.getCurrentId()) {
Client.getPinnedPosts(channelId,
Client4.getPinnedPosts(channelId).then(
(data) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_SEARCH_TERM,
@@ -182,10 +152,9 @@ export function getPinnedPosts(channelId = ChannelStore.getCurrentId()) {
});
loadProfilesForPosts(data.posts);
},
(err) => {
AsyncClient.dispatchError(err, 'getPinnedPosts');
}
).catch(
() => {} //eslint-disable-line no-empty-function
);
}
@@ -211,15 +180,15 @@ export function loadProfilesForPosts(posts) {
}
export function addReaction(channelId, postId, emojiName) {
addReactionRedux(postId, emojiName)(dispatch, getState);
PostActions.addReaction(postId, emojiName)(dispatch, getState);
}
export function removeReaction(channelId, postId, emojiName) {
removeReactionRedux(postId, emojiName)(dispatch, getState);
PostActions.removeReaction(postId, emojiName)(dispatch, getState);
}
export function createPost(post, files, success) {
createPostRedux(post, files)(dispatch, getState).then(() => {
PostActions.createPost(post, files)(dispatch, getState).then(() => {
if (post.root_id) {
PostStore.storeCommentDraft(post.root_id, null);
} else {
@@ -233,7 +202,7 @@ export function createPost(post, files, success) {
}
export function updatePost(post, success) {
editPost(post)(dispatch, getState).then(
PostActions.editPost(post)(dispatch, getState).then(
(data) => {
if (data && success) {
success();
@@ -257,7 +226,7 @@ export function deletePost(channelId, post, success) {
hardDelete = true;
}
deletePostRedux(post, hardDelete)(dispatch, getState).then(
PostActions.deletePost(post, hardDelete)(dispatch, getState).then(
() => {
if (post.id === getState().views.rhs.selectedPostId) {
dispatch({
@@ -279,9 +248,7 @@ export function deletePost(channelId, post, success) {
}
export function performSearch(terms, isMentionSearch, success, error) {
Client.search(
terms,
isMentionSearch,
Client4.searchPosts(TeamStore.getCurrentId(), terms, isMentionSearch).then(
(data) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_SEARCH,
@@ -294,10 +261,9 @@ export function performSearch(terms, isMentionSearch, success, error) {
if (success) {
success(data);
}
},
}
).catch(
(err) => {
AsyncClient.dispatchError(err, 'search');
if (error) {
error(err);
}
@@ -337,9 +303,9 @@ export function increasePostVisibility(channelId, focusedPostId) {
let posts;
if (focusedPostId) {
posts = await getPostsBefore(channelId, focusedPostId, page, POST_INCREASE_AMOUNT)(dispatch, getState);
posts = await PostActions.getPostsBefore(channelId, focusedPostId, page, POST_INCREASE_AMOUNT)(dispatch, getState);
} else {
posts = await getPosts(channelId, page, POST_INCREASE_AMOUNT)(doDispatch, doGetState);
posts = await PostActions.getPosts(channelId, page, POST_INCREASE_AMOUNT)(doDispatch, doGetState);
}
doDispatch({

Просмотреть файл

@@ -4,8 +4,6 @@
import TeamStore from 'stores/team_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import Client from 'client/web_client.jsx';
import {browserHistory} from 'react-router/es6';
// Redux actions
@@ -13,26 +11,17 @@ import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {Client4} from 'mattermost-redux/client';
import {getUser} from 'mattermost-redux/actions/users';
import {viewChannel} from 'mattermost-redux/actions/channels';
import {
createTeam as createTeamRedux,
updateTeam as updateTeamRedux,
removeUserFromTeam as removeUserFromTeamRedux,
getTeamStats,
checkIfTeamExists as checkIfTeamExistsRedux,
updateTeamMemberRoles as updateTeamMemberRolesRedux,
addUsersToTeam as addUsersToTeamRedux,
sendEmailInvitesToTeam,
getTeamsForUser as getTeamsForUserRedux,
getTeamMembersForUser as getTeamMembersForUserRedux
} from 'mattermost-redux/actions/teams';
import * as TeamActions from 'mattermost-redux/actions/teams';
import {TeamTypes} from 'mattermost-redux/action_types';
import {batchActions} from 'redux-batched-actions';
export function checkIfTeamExists(teamName, onSuccess, onError) {
checkIfTeamExistsRedux(teamName)(dispatch, getState).then(
TeamActions.checkIfTeamExists(teamName)(dispatch, getState).then(
(exists) => {
if (exists != null && onSuccess) {
onSuccess(exists);
@@ -45,7 +34,7 @@ export function checkIfTeamExists(teamName, onSuccess, onError) {
}
export function createTeam(team, onSuccess, onError) {
createTeamRedux(team)(dispatch, getState).then(
TeamActions.createTeam(team)(dispatch, getState).then(
(rteam) => {
if (rteam && onSuccess) {
browserHistory.push('/' + rteam.name + '/channels/town-square');
@@ -59,7 +48,7 @@ export function createTeam(team, onSuccess, onError) {
}
export function updateTeam(team, onSuccess, onError) {
updateTeamRedux(team)(dispatch, getState).then(
TeamActions.updateTeam(team)(dispatch, getState).then(
(rteam) => {
if (rteam && onSuccess) {
browserHistory.push('/' + rteam.name + '/channels/town-square');
@@ -73,10 +62,10 @@ export function updateTeam(team, onSuccess, onError) {
}
export function removeUserFromTeam(teamId, userId, success, error) {
removeUserFromTeamRedux(teamId, userId)(dispatch, getState).then(
TeamActions.removeUserFromTeam(teamId, userId)(dispatch, getState).then(
(data) => {
getUser(userId)(dispatch, getState);
getTeamStats(teamId)(dispatch, getState);
TeamActions.getTeamStats(teamId)(dispatch, getState);
if (data && success) {
success();
@@ -89,7 +78,7 @@ export function removeUserFromTeam(teamId, userId, success, error) {
}
export function updateTeamMemberRoles(teamId, userId, newRoles, success, error) {
updateTeamMemberRolesRedux(teamId, userId, newRoles)(dispatch, getState).then(
TeamActions.updateTeamMemberRoles(teamId, userId, newRoles)(dispatch, getState).then(
(data) => {
if (data && success) {
success();
@@ -102,10 +91,7 @@ export function updateTeamMemberRoles(teamId, userId, newRoles, success, error)
}
export function addUserToTeamFromInvite(data, hash, inviteId, success, error) {
Client.addUserToTeamFromInvite(
data,
hash,
inviteId,
Client4.addToTeamFromInvite(hash, data, inviteId).then(
(team) => {
const member = {
team_id: team.id,
@@ -131,6 +117,7 @@ export function addUserToTeamFromInvite(data, hash, inviteId, success, error) {
success(team);
}
},
).catch(
(err) => {
if (error) {
error(err);
@@ -140,7 +127,7 @@ export function addUserToTeamFromInvite(data, hash, inviteId, success, error) {
}
export function addUsersToTeam(teamId, userIds, success, error) {
addUsersToTeamRedux(teamId, userIds)(dispatch, getState).then(
TeamActions.addUsersToTeam(teamId, userIds)(dispatch, getState).then(
(teamMembers) => {
if (teamMembers && success) {
success(teamMembers);
@@ -153,13 +140,13 @@ export function addUsersToTeam(teamId, userIds, success, error) {
}
export function getInviteInfo(inviteId, success, error) {
Client.getInviteInfo(
inviteId,
Client4.getTeamInviteInfo(inviteId).then(
(inviteData) => {
if (success) {
success(inviteData);
}
},
}
).catch(
(err) => {
if (error) {
error(err);
@@ -176,7 +163,7 @@ export function inviteMembers(data, success, error) {
data.invites.forEach((i) => {
emails.push(i.email);
});
sendEmailInvitesToTeam(TeamStore.getCurrentId(), emails)(dispatch, getState).then(
TeamActions.sendEmailInvitesToTeam(TeamStore.getCurrentId(), emails)(dispatch, getState).then(
(result) => {
if (result && success) {
success();
@@ -194,7 +181,7 @@ export function switchTeams(url) {
}
export function getTeamsForUser(userId, success, error) {
getTeamsForUserRedux(userId)(dispatch, getState).then(
TeamActions.getTeamsForUser(userId)(dispatch, getState).then(
(result) => {
if (result && success) {
success(result);
@@ -207,7 +194,7 @@ export function getTeamsForUser(userId, success, error) {
}
export function getTeamMembersForUser(userId, success, error) {
getTeamMembersForUserRedux(userId)(dispatch, getState).then(
TeamActions.getTeamMembersForUser(userId)(dispatch, getState).then(
(result) => {
if (result && success) {
success(result);

Просмотреть файл

@@ -15,7 +15,6 @@ import {getDirectChannelName, getUserIdFromChannelName} from 'utils/utils.jsx';
import {Constants, ActionTypes, Preferences} from 'utils/constants.jsx';
import {browserHistory} from 'react-router/es6';
// Redux actions
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
@@ -29,7 +28,7 @@ import {Client4} from 'mattermost-redux/client';
import {getClientConfig, getLicenseConfig} from 'mattermost-redux/actions/general';
import {getTeamMembersByIds, getMyTeamMembers, getMyTeamUnreads} from 'mattermost-redux/actions/teams';
import {getChannelAndMyMember} from 'mattermost-redux/actions/channels';
import {savePreferences, deletePreferences} from 'mattermost-redux/actions/preferences';
import {savePreferences as savePreferencesRedux, deletePreferences} from 'mattermost-redux/actions/preferences';
import {Preferences as PreferencesRedux} from 'mattermost-redux/constants';
@@ -242,7 +241,7 @@ export function loadNewDMIfNeeded(channelId) {
if (pref === false) {
PreferenceStore.setPreference(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, userId, 'true');
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, name: userId, value: 'true'}])(dispatch, getState);
savePreferencesRedux(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, name: userId, value: 'true'}])(dispatch, getState);
loadProfilesForDM();
}
}
@@ -267,7 +266,7 @@ export function loadNewGMIfNeeded(channelId) {
if (pref === false) {
PreferenceStore.setPreference(Preferences.CATEGORY_GROUP_CHANNEL_SHOW, channelId, 'true');
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_GROUP_CHANNEL_SHOW, name: channelId, value: 'true'}])(dispatch, getState);
savePreferencesRedux(currentUserId, [{user_id: currentUserId, category: Preferences.CATEGORY_GROUP_CHANNEL_SHOW, name: channelId, value: 'true'}])(dispatch, getState);
loadProfilesForGM();
}
}
@@ -328,7 +327,7 @@ export function loadProfilesForGM() {
if (newPreferences.length > 0) {
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, newPreferences)(dispatch, getState);
savePreferencesRedux(currentUserId, newPreferences)(dispatch, getState);
}
}
@@ -369,7 +368,7 @@ export function loadProfilesForDM() {
if (newPreferences.length > 0) {
const currentUserId = UserStore.getCurrentId();
savePreferences(currentUserId, newPreferences)(dispatch, getState);
savePreferencesRedux(currentUserId, newPreferences)(dispatch, getState);
}
if (profilesToLoad.length > 0) {
@@ -794,6 +793,25 @@ export function loadMyTeamMembers() {
);
}
export function savePreferences(prefs, success, error) {
const currentUserId = UserStore.getCurrentId();
savePreferencesRedux(currentUserId, prefs)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
} else if (data == null && error) {
const serverError = getState().requests.preferences.savePreferences.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
}
export async function savePreference(category, name, value) {
const currentUserId = UserStore.getCurrentId();
return savePreferencesRedux(currentUserId, [{user_id: currentUserId, category, name, value}])(dispatch, getState);
}
export function autoResetStatus() {
return async (doDispatch, doGetState) => {
const {currentUserId} = getState().entities.users;
@@ -813,3 +831,16 @@ export function autoResetStatus() {
return userStatus;
};
}
export function sendPasswordResetEmail(email, success, error) {
UserActions.sendPasswordResetEmail(email)(dispatch, getState).then(
(data) => {
if (data && success) {
success(data);
} else if (data == null && error) {
const serverError = getState().requests.users.passwordReset.error;
error({id: serverError.server_error_id, ...serverError});
}
}
);
}

Просмотреть файл

@@ -4,7 +4,7 @@
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import {WebrtcActionTypes} from 'utils/constants.jsx';
import Client from 'client/web_client.jsx';
import {Client4} from 'mattermost-redux/client';
export function initWebrtc(userId, isCalling) {
AppDispatcher.handleServerAction({
@@ -22,15 +22,17 @@ export function handle(message) {
}
export function webrtcToken(success, error) {
Client.webrtcToken(
Client4.webrtcToken().then(
(data) => {
if (success) {
success(data);
}
},
}
).catch(
() => {
if (error) {
error();
}
});
}
);
}

Просмотреть файл

@@ -11,13 +11,9 @@ import BrowserStore from 'stores/browser_store.jsx';
import ErrorStore from 'stores/error_store.jsx';
import NotificationStore from 'stores/notification_store.jsx'; //eslint-disable-line no-unused-vars
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import Client from 'client/web_client.jsx';
import WebSocketClient from 'client/web_websocket_client.jsx';
import * as WebrtcActions from './webrtc_actions.jsx';
import * as Utils from 'utils/utils.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import {getSiteURL} from 'utils/url.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import {handleNewPost, loadProfilesForPosts} from 'actions/post_actions.jsx';
@@ -25,19 +21,22 @@ import {loadProfilesForSidebar} from 'actions/user_actions.jsx';
import {loadChannelsForCurrentUser} from 'actions/channel_actions.jsx';
import * as StatusActions from 'actions/status_actions.jsx';
import {ActionTypes, Constants, Preferences, SocketEvents, UserStatuses} from 'utils/constants.jsx';
import {Constants, Preferences, SocketEvents, UserStatuses} from 'utils/constants.jsx';
import {browserHistory} from 'react-router/es6';
// Redux actions
import store from 'stores/redux_store.jsx';
const dispatch = store.dispatch;
const getState = store.getState;
import {batchActions} from 'redux-batched-actions';
import {Client4} from 'mattermost-redux/client';
import * as TeamActions from 'mattermost-redux/actions/teams';
import {viewChannel, getChannelAndMyMember, getChannelStats} from 'mattermost-redux/actions/channels';
import {getPosts} from 'mattermost-redux/actions/posts';
import {setServerVersion} from 'mattermost-redux/actions/general';
import {ChannelTypes, TeamTypes, UserTypes, PostTypes} from 'mattermost-redux/action_types';
import {ChannelTypes, TeamTypes, UserTypes, PostTypes, EmojiTypes} from 'mattermost-redux/action_types';
const MAX_WEBSOCKET_FAILS = 7;
@@ -47,7 +46,7 @@ export function initialize() {
return;
}
let connUrl = getSiteURL();
let connUrl = Client4.getWebSocketUrl();
// replace the protocol with a websocket one
if (connUrl.startsWith('https:')) {
@@ -57,7 +56,7 @@ export function initialize() {
}
// append a port number if one isn't already specified
if (!(/:\d+$/).test(connUrl)) {
if (!(/:\d+/).test(connUrl)) {
if (connUrl.startsWith('wss:')) {
connUrl += ':' + global.window.mm_config.WebsocketSecurePort;
} else {
@@ -65,18 +64,10 @@ export function initialize() {
}
}
// append the websocket api path
connUrl += Client.getUsersRoute() + '/websocket';
WebSocketClient.setEventCallback(handleEvent);
WebSocketClient.setFirstConnectCallback(handleFirstConnect);
WebSocketClient.setReconnectCallback(() => reconnect(false));
WebSocketClient.setMissedEventCallback(() => {
if (global.window.mm_config.EnableDeveloper === 'true') {
Client.logClientError('missed websocket event seq=' + WebSocketClient.eventSequence);
}
reconnect(false);
});
WebSocketClient.setMissedEventCallback(() => reconnect(false));
WebSocketClient.setCloseCallback(handleClose);
WebSocketClient.initialize(connUrl);
}
@@ -95,11 +86,9 @@ export function reconnect(includeWebSocket = true) {
reconnectWebSocket();
}
if (Client.teamId) {
loadChannelsForCurrentUser();
getPosts(ChannelStore.getCurrentId())(dispatch, getState);
StatusActions.loadStatusesForChannelAndSidebar();
}
loadChannelsForCurrentUser();
getPosts(ChannelStore.getCurrentId())(dispatch, getState);
StatusActions.loadStatusesForChannelAndSidebar();
ErrorStore.clearLastError();
ErrorStore.emitChange();
@@ -269,25 +258,10 @@ function handlePostDeleteEvent(msg) {
dispatch({type: PostTypes.POST_DELETED, data: post});
}
function handleTeamAddedEvent(msg) {
Client.getTeam(msg.data.team_id, (team) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_TEAM,
team
});
Client.getMyTeamMembers((data) => {
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_MY_TEAM_MEMBERS,
team_members: data
});
AsyncClient.getMyTeamsUnread();
}, (err) => {
AsyncClient.dispatchError(err, 'getMyTeamMembers');
});
}, (err) => {
AsyncClient.dispatchError(err, 'getTeam');
});
async function handleTeamAddedEvent(msg) {
await TeamActions.getTeam(msg.data.team_id)(dispatch, getState);
await TeamActions.getMyTeamMembers()(dispatch, getState);
await TeamActions.getMyTeamUnreads()(dispatch, getState);
}
function handleLeaveTeamEvent(msg) {
@@ -296,7 +270,6 @@ function handleLeaveTeamEvent(msg) {
// if they are on the team being removed redirect them to default team
if (TeamStore.getCurrentId() === msg.data.team_id) {
Client.setTeamId('');
BrowserStore.removeGlobalItem('team');
BrowserStore.removeGlobalItem(msg.data.team_id);
@@ -424,7 +397,6 @@ function handleStatusChangedEvent(msg) {
}
function handleHelloEvent(msg) {
Client.serverVersion = msg.data.server_version;
setServerVersion(msg.data.server_version)(dispatch, getState);
}
@@ -445,9 +417,9 @@ function handleReactionAddedEvent(msg) {
function handleAddEmoji(msg) {
const data = JSON.parse(msg.data.emoji);
AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_CUSTOM_EMOJI,
emoji: data
dispatch({
type: EmojiTypes.RECEIVED_CUSTOM_EMOJI,
data
});
}