RN-288 Add analytics with segment.io (#828)

* Add analytics with segment.io

* Feedback review
This commit is contained in:
enahum 2017-08-08 12:43:41 -04:00 committed by GitHub
parent a0a1678939
commit d9b76386c0
7 changed files with 125 additions and 15 deletions

View file

@ -1123,3 +1123,34 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## analytics-react-native
This product contains 'analytics-react-native', A React Native client for Segment. The hassle-free way to integrate analytics into any application.
* HOMEPAGE:
* https://github.com/neiker/analytics-react-native
* LICENSE:
MIT License
Copyright (c) 2016 Javier Alvarez
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -16,9 +16,16 @@ import {markChannelAsRead, viewChannel} from 'mattermost-redux/actions/channels'
export function loadConfigAndLicense(serverVersion) {
return async (dispatch, getState) => {
getClientConfig()(dispatch, getState);
getLicenseConfig()(dispatch, getState);
setServerVersion(serverVersion)(dispatch, getState);
const [config, license] = await Promise.all([
getClientConfig()(dispatch, getState),
getLicenseConfig()(dispatch, getState)
]);
if (config && license) {
setServerVersion(serverVersion)(dispatch, getState);
}
return {config, license};
};
}

View file

@ -2,6 +2,7 @@
// See License.txt for license information.
import 'babel-polyfill';
import Analytics from 'analytics-react-native';
import Orientation from 'react-native-orientation';
import {Provider} from 'react-redux';
import {Navigation} from 'react-native-navigation';
@ -106,12 +107,45 @@ export default class Mattermost {
return intl;
};
configureAnalytics = (config) => {
if (config && config.DiagnosticsEnabled === 'true' && config.DiagnosticId && Config.SegmentApiKey) {
if (!global.analytics) {
global.analytics = new Analytics(Config.SegmentApiKey);
global.analytics.identify({
userId: config.DiagnosticId,
context: {
ip: '0.0.0.0'
},
page: {
path: '',
referrer: '',
search: '',
title: '',
url: ''
},
anonymousId: '00000000000000000000000000'
});
}
} else {
global.analytics = null;
}
};
configurePushNotifications = () => {
PushNotifications.configure({
onRegister: this.onRegisterDevice,
onNotification: this.onPushNotification,
popInitialNotification: true,
requestPermissions: true
});
};
handleAppStateChange = (appState) => {
const {dispatch, getState} = store;
setAppState(appState === 'active')(dispatch, getState);
};
handleConfigChanged = (serverVersion) => {
handleConfigChanged = async (serverVersion) => {
const {dispatch, getState} = store;
const version = serverVersion.match(/^[0-9]*.[0-9]*.[0-9]*(-[a-zA-Z0-9.-]*)?/g)[0];
const intl = this.getIntl();
@ -129,7 +163,8 @@ export default class Mattermost {
);
} else {
setServerVersion('')(dispatch, getState);
loadConfigAndLicense(serverVersion)(dispatch, getState);
const data = await loadConfigAndLicense(serverVersion)(dispatch, getState);
this.configureAnalytics(data.config);
}
}
};
@ -139,6 +174,7 @@ export default class Mattermost {
Client4.serverVersion = '';
Client.serverVersion = '';
Client.token = null;
Client4.userId = '';
PushNotifications.cancelAllLocalNotifications();
setServerVersion('')(dispatch, getState);
this.startApp('fade');
@ -174,15 +210,6 @@ export default class Mattermost {
}
};
configurePushNotifications = () => {
PushNotifications.configure({
onRegister: this.onRegisterDevice,
onNotification: this.onPushNotification,
popInitialNotification: true,
requestPermissions: true
});
};
onRegisterDevice = (data) => {
const {dispatch, getState} = store;
let prefix;

View file

@ -5,5 +5,6 @@
"ShowErrorsList": false,
"MinServerVersion": "3.10.0",
"PlatformNoticeURL": "https://about.mattermost.com/platform-notice-txt/",
"MobileNoticeURL": "https://about.mattermost.com/mobile-notice-txt/"
"MobileNoticeURL": "https://about.mattermost.com/mobile-notice-txt/",
"SegmentApiKey": "3MT7rAoC0OP7yy3ThzqFSAtKzmzqtUPX"
}

View file

@ -46,6 +46,14 @@ platform :ios do
lane :beta do
match(type: 'appstore', app_identifier: 'com.mattermost.rnbeta')
if ENV['SEGMENT_API_KEY']
find_replace_string(
path_to_file: './dist/assets/config.json',
old_string: '"SegmentApiKey": "3MT7rAoC0OP7yy3ThzqFSAtKzmzqtUPX"',
new_string: "\"SegmentApiKey\": \"#{ENV['SEGMENT_API_KEY']}\""
)
end
build_ios({
release: true,
increment_build: true,
@ -90,6 +98,14 @@ platform :ios do
lane :release do
match(type: 'appstore', app_identifier: 'com.mattermost.rn')
if ENV['SEGMENT_API_KEY']
find_replace_string(
path_to_file: './dist/assets/config.json',
old_string: '"SegmentApiKey": "3MT7rAoC0OP7yy3ThzqFSAtKzmzqtUPX"',
new_string: "\"SegmentApiKey\": \"#{ENV['SEGMENT_API_KEY']}\""
)
end
# snapshot
update_app_identifier(
@ -243,6 +259,14 @@ platform :android do
desc 'Submit a new Beta Build to Google Play'
lane :alpha do
if ENV['SEGMENT_API_KEY']
find_replace_string(
path_to_file: './dist/assets/config.json',
old_string: '"SegmentApiKey": "3MT7rAoC0OP7yy3ThzqFSAtKzmzqtUPX"',
new_string: "\"SegmentApiKey\": \"#{ENV['SEGMENT_API_KEY']}\""
)
end
build_android({
release: true,
increment_build: true,
@ -343,6 +367,14 @@ platform :android do
new_string: 'Mattermost;'
)
if ENV['SEGMENT_API_KEY']
find_replace_string(
path_to_file: './dist/assets/config.json',
old_string: '"SegmentApiKey": "3MT7rAoC0OP7yy3ThzqFSAtKzmzqtUPX"',
new_string: "\"SegmentApiKey\": \"#{ENV['SEGMENT_API_KEY']}\""
)
end
build_android({
release: true,
increment_build: false,

View file

@ -7,6 +7,7 @@
"license": "Apache 2.0",
"private": true,
"dependencies": {
"analytics-react-native": "1.1.0",
"babel-polyfill": "6.23.0",
"commonmark": "hmhealey/commonmark.js#3139568442da83c5520685dc033eaf417dada2c0",
"commonmark-react-renderer": "hmhealey/commonmark-react-renderer#c5d00343664c89da40d5a2ffa8b083e7cc1615d7",

View file

@ -75,6 +75,13 @@ amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
analytics-react-native@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/analytics-react-native/-/analytics-react-native-1.1.0.tgz#9e8a2552146568de94190ad911616416259e219b"
dependencies:
base-64 "0.1.0"
type-of "2.0.1"
ansi-escapes@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
@ -5742,6 +5749,10 @@ type-is@~1.6.14, type-is@~1.6.6:
media-typer "0.3.0"
mime-types "~2.1.15"
type-of@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972"
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"