From ab7c911ae3f01908281b2bea6236a66c1d5b9293 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 21:04:26 -0300 Subject: [PATCH 01/11] Create method to track user event to isolate the logic to improve future refactoring --- app/utils/log.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/utils/log.js b/app/utils/log.js index 47b2ddc4f45..b10d6cc97f5 100644 --- a/app/utils/log.js +++ b/app/utils/log.js @@ -10,6 +10,10 @@ export const { leaveBreadcrumb } = bugsnag; let metadata = {}; +export const trackUserEvent = ({ eventName, screen, payload }) => { + analytics().logEvent(eventName, { ...screen, ...payload }); +}; + export const logServerVersion = (serverVersion) => { metadata = { serverVersion From 2f820ff8ad31085c890fba446af23dcfea007a9f Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 21:49:43 -0300 Subject: [PATCH 02/11] Track Onboarding view --- app/utils/trackableEvents.js | 2 ++ app/views/OnboardingView/index.js | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 app/utils/trackableEvents.js diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js new file mode 100644 index 00000000000..261a357ccf9 --- /dev/null +++ b/app/utils/trackableEvents.js @@ -0,0 +1,2 @@ +export const ENTER_WORKSPACE = 'enter_workspace'; +export const CREATE_NEW_WORKSPACE = 'create_new_workspace'; diff --git a/app/views/OnboardingView/index.js b/app/views/OnboardingView/index.js index 3db267505a3..c5330940259 100644 --- a/app/views/OnboardingView/index.js +++ b/app/views/OnboardingView/index.js @@ -14,6 +14,8 @@ import { isTablet } from '../../utils/deviceInfo'; import { themes } from '../../constants/colors'; import { withTheme } from '../../theme'; import FormContainer, { FormContainerInner } from '../../containers/FormContainer'; +import { trackUserEvent } from '../../utils/log'; +import { ENTER_WORKSPACE, CREATE_NEW_WORKSPACE } from '../../utils/trackableEvents'; class OnboardingView extends React.Component { static navigationOptions = () => ({ @@ -55,11 +57,13 @@ class OnboardingView extends React.Component { connectServer = () => { const { navigation } = this.props; navigation.navigate('NewServerView'); + trackUserEvent({ eventName: ENTER_WORKSPACE, screen: 'Onboarding' }); } createWorkspace = async() => { try { await Linking.openURL('https://cloud.rocket.chat/trial'); + trackUserEvent({ eventName: CREATE_NEW_WORKSPACE, screen: 'Onboarding' }); } catch { // do nothing } From 80d0d20c4a06b7715de802066aa7a8cceadb14ec Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 22:13:40 -0300 Subject: [PATCH 03/11] Track NewServer view --- app/utils/log.js | 2 +- app/utils/trackableEvents.js | 2 ++ app/views/NewServerView.js | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/utils/log.js b/app/utils/log.js index b10d6cc97f5..4fd200e759d 100644 --- a/app/utils/log.js +++ b/app/utils/log.js @@ -11,7 +11,7 @@ export const { leaveBreadcrumb } = bugsnag; let metadata = {}; export const trackUserEvent = ({ eventName, screen, payload }) => { - analytics().logEvent(eventName, { ...screen, ...payload }); + analytics().logEvent(eventName, { screen, ...payload }); }; export const logServerVersion = (serverVersion) => { diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js index 261a357ccf9..bba25be1e29 100644 --- a/app/utils/trackableEvents.js +++ b/app/utils/trackableEvents.js @@ -1,2 +1,4 @@ export const ENTER_WORKSPACE = 'enter_workspace'; export const CREATE_NEW_WORKSPACE = 'create_new_workspace'; +export const CONNECT_TO_WORKSPACE = 'connect_to_workspace'; +export const CONNECT_TO_OPEN_WORKSPACE = 'connect_to_open_workspace'; diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index cb82c58df12..4175f6cc075 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -24,12 +24,13 @@ import FormContainer, { FormContainerInner } from '../containers/FormContainer'; import I18n from '../i18n'; import { isIOS } from '../utils/deviceInfo'; import { themes } from '../constants/colors'; -import log from '../utils/log'; +import log, { trackUserEvent } from '../utils/log'; import { animateNextTransition } from '../utils/layoutAnimation'; import { withTheme } from '../theme'; import { setBasicAuth, BASIC_AUTH_KEY } from '../utils/fetch'; import { themedHeader } from '../utils/navigation'; import { CloseModalButton } from '../containers/HeaderButton'; +import { CONNECT_TO_WORKSPACE, CONNECT_TO_OPEN_WORKSPACE } from '../utils/trackableEvents'; const styles = StyleSheet.create({ title: { @@ -175,12 +176,15 @@ class NewServerView extends React.Component { await this.basicAuth(server, text); connectServer(server, cert); } + + trackUserEvent({ eventName: CONNECT_TO_WORKSPACE, screen: 'NewServer' }); } connectOpen = () => { this.setState({ connectingOpen: true }); const { connectServer } = this.props; connectServer('https://open.rocket.chat'); + trackUserEvent({ eventName: CONNECT_TO_OPEN_WORKSPACE, screen: 'NewServer' }); } basicAuth = async(server, text) => { From e4fec18262935e01f31de57707453d15666d0756 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 22:32:03 -0300 Subject: [PATCH 04/11] Refactor track method due to firebase already send the current screen --- app/utils/log.js | 4 ++-- app/views/NewServerView.js | 4 ++-- app/views/OnboardingView/index.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/utils/log.js b/app/utils/log.js index 4fd200e759d..33f90064a0b 100644 --- a/app/utils/log.js +++ b/app/utils/log.js @@ -10,8 +10,8 @@ export const { leaveBreadcrumb } = bugsnag; let metadata = {}; -export const trackUserEvent = ({ eventName, screen, payload }) => { - analytics().logEvent(eventName, { screen, ...payload }); +export const trackUserEvent = ({ eventName, payload }) => { + analytics().logEvent(eventName, { ...payload }); }; export const logServerVersion = (serverVersion) => { diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index 4175f6cc075..8e6db6e49dc 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -177,14 +177,14 @@ class NewServerView extends React.Component { connectServer(server, cert); } - trackUserEvent({ eventName: CONNECT_TO_WORKSPACE, screen: 'NewServer' }); + trackUserEvent({ eventName: CONNECT_TO_WORKSPACE }); } connectOpen = () => { this.setState({ connectingOpen: true }); const { connectServer } = this.props; connectServer('https://open.rocket.chat'); - trackUserEvent({ eventName: CONNECT_TO_OPEN_WORKSPACE, screen: 'NewServer' }); + trackUserEvent({ eventName: CONNECT_TO_OPEN_WORKSPACE }); } basicAuth = async(server, text) => { diff --git a/app/views/OnboardingView/index.js b/app/views/OnboardingView/index.js index c5330940259..f1cbfaecb21 100644 --- a/app/views/OnboardingView/index.js +++ b/app/views/OnboardingView/index.js @@ -57,13 +57,13 @@ class OnboardingView extends React.Component { connectServer = () => { const { navigation } = this.props; navigation.navigate('NewServerView'); - trackUserEvent({ eventName: ENTER_WORKSPACE, screen: 'Onboarding' }); + trackUserEvent({ eventName: ENTER_WORKSPACE }); } createWorkspace = async() => { try { await Linking.openURL('https://cloud.rocket.chat/trial'); - trackUserEvent({ eventName: CREATE_NEW_WORKSPACE, screen: 'Onboarding' }); + trackUserEvent({ eventName: CREATE_NEW_WORKSPACE }); } catch { // do nothing } From 2671bd8eaddcfc9c568bd4186e8bc720f1fd8c7f Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 23:12:11 -0300 Subject: [PATCH 05/11] Track default login and all the oAuth options --- app/containers/LoginServices.js | 11 +++++++++++ app/utils/trackableEvents.js | 10 ++++++++++ app/views/LoginView.js | 6 ++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index 2cf06d3274f..fd516d1ab3a 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -16,6 +16,10 @@ import OrSeparator from './OrSeparator'; import Touch from '../utils/touch'; import I18n from '../i18n'; import random from '../utils/random'; +import { trackUserEvent } from '../utils/log'; +import { + LOGIN_WITH_GITHUB, LOGIN_WITH_GITLAB, LOGIN_WITH_GOOGLE, LOGIN_WITH_FACEBOOK, LOGIN_WITH_METEOR, LOGIN_WITH_LINKEDIN, LOGIN_WITH_TWITTER +} from '../utils/trackableEvents'; const SERVICE_HEIGHT = 58; const SERVICES_COLLAPSED_HEIGHT = 174; @@ -83,6 +87,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&display=touch`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent({ eventName: LOGIN_WITH_FACEBOOK }); } onPressGithub = () => { @@ -94,6 +99,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }`; this.openOAuth({ url: `${ endpoint }${ encodeURIComponent(params) }` }); + trackUserEvent({ eventName: LOGIN_WITH_GITHUB }); } onPressGitlab = () => { @@ -106,6 +112,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent({ eventName: LOGIN_WITH_GITLAB }); } onPressGoogle = () => { @@ -117,6 +124,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent({ eventName: LOGIN_WITH_GOOGLE }); } onPressLinkedin = () => { @@ -128,6 +136,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent({ eventName: LOGIN_WITH_LINKEDIN }); } onPressMeteor = () => { @@ -138,6 +147,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent({ eventName: LOGIN_WITH_METEOR }); } onPressTwitter = () => { @@ -145,6 +155,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const url = `${ server }/_oauth/twitter/?requestTokenAndRedirect=true&state=${ state }`; this.openOAuth({ url }); + trackUserEvent({ eventName: LOGIN_WITH_TWITTER }); } onPressWordpress = () => { diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js index bba25be1e29..14254963c87 100644 --- a/app/utils/trackableEvents.js +++ b/app/utils/trackableEvents.js @@ -2,3 +2,13 @@ export const ENTER_WORKSPACE = 'enter_workspace'; export const CREATE_NEW_WORKSPACE = 'create_new_workspace'; export const CONNECT_TO_WORKSPACE = 'connect_to_workspace'; export const CONNECT_TO_OPEN_WORKSPACE = 'connect_to_open_workspace'; +export const DEFAULT_LOGIN = 'default_login'; +export const FORGOT_PASSWORD = 'forgot_password'; +export const LOGIN_WITH_FACEBOOK = 'login_with_facebook'; +export const LOGIN_WITH_GITHUB = 'login_with_github'; +export const LOGIN_WITH_GITLAB = 'login_with_gitlab'; +export const LOGIN_WITH_LINKEDIN = 'login_with_linkedin'; +export const LOGIN_WITH_GOOGLE = 'login_with_google'; +export const LOGIN_WITH_METEOR = 'login_with_meteor'; +export const LOGIN_WITH_TWITTER = 'login_with_twitter'; +export const LOGIN_WITH_WORDPRESS = 'login_with_wordpress'; diff --git a/app/views/LoginView.js b/app/views/LoginView.js index 67cee69cf60..f10abe60b58 100644 --- a/app/views/LoginView.js +++ b/app/views/LoginView.js @@ -6,7 +6,7 @@ import { import { connect } from 'react-redux'; import equal from 'deep-equal'; -import { analytics } from '../utils/log'; +import { trackUserEvent } from '../utils/log'; import sharedStyles from './Styles'; import Button from '../containers/Button'; import I18n from '../i18n'; @@ -18,6 +18,7 @@ import FormContainer, { FormContainerInner } from '../containers/FormContainer'; import TextInput from '../containers/TextInput'; import { loginRequest as loginRequestAction } from '../actions/login'; import LoginServices from '../containers/LoginServices'; +import { DEFAULT_LOGIN, FORGOT_PASSWORD } from '../utils/trackableEvents'; const styles = StyleSheet.create({ registerDisabled: { @@ -104,6 +105,7 @@ class LoginView extends React.Component { forgotPassword = () => { const { navigation, Site_Name } = this.props; navigation.navigate('ForgotPasswordView', { title: Site_Name }); + trackUserEvent({ eventName: FORGOT_PASSWORD }); } valid = () => { @@ -120,7 +122,7 @@ class LoginView extends React.Component { const { loginRequest } = this.props; Keyboard.dismiss(); loginRequest({ user, password }); - analytics().logEvent('login'); + trackUserEvent({ eventName: DEFAULT_LOGIN }); } renderUserForm = () => { From 1b06f50ae096ec1fd8844a977943c3c2496bf9e3 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Sun, 7 Jun 2020 23:41:53 -0300 Subject: [PATCH 06/11] Track default sign up in RegisterView --- app/utils/trackableEvents.js | 1 + app/views/RegisterView.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js index 14254963c87..f4eb6a152fb 100644 --- a/app/utils/trackableEvents.js +++ b/app/utils/trackableEvents.js @@ -3,6 +3,7 @@ export const CREATE_NEW_WORKSPACE = 'create_new_workspace'; export const CONNECT_TO_WORKSPACE = 'connect_to_workspace'; export const CONNECT_TO_OPEN_WORKSPACE = 'connect_to_open_workspace'; export const DEFAULT_LOGIN = 'default_login'; +export const DEFAULT_SIGN_UP = 'default_sign_up'; export const FORGOT_PASSWORD = 'forgot_password'; export const LOGIN_WITH_FACEBOOK = 'login_with_facebook'; export const LOGIN_WITH_GITHUB = 'login_with_github'; diff --git a/app/views/RegisterView.js b/app/views/RegisterView.js index e27e9bfe4c6..c2f71b791ac 100644 --- a/app/views/RegisterView.js +++ b/app/views/RegisterView.js @@ -6,7 +6,7 @@ import { import { connect } from 'react-redux'; import RNPickerSelect from 'react-native-picker-select'; -import log from '../utils/log'; +import log, { trackUserEvent } from '../utils/log'; import sharedStyles from './Styles'; import Button from '../containers/Button'; import I18n from '../i18n'; @@ -23,6 +23,7 @@ import { loginRequest as loginRequestAction } from '../actions/login'; import openLink from '../utils/openLink'; import LoginServices from '../containers/LoginServices'; import { getShowLoginButton } from '../selectors/login'; +import { DEFAULT_SIGN_UP } from '../utils/trackableEvents'; const styles = StyleSheet.create({ title: { @@ -156,6 +157,7 @@ class RegisterView extends React.Component { showErrorAlert(e.data.error, I18n.t('Oops')); } this.setState({ saving: false }); + trackUserEvent({ eventName: DEFAULT_SIGN_UP }); } openContract = (route) => { From 5d3c35c4be4d023332c86ee1b15fa04836a68e92 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Mon, 8 Jun 2020 12:25:35 -0300 Subject: [PATCH 07/11] Change trackUserEvent signature and update all the files --- app/containers/LoginServices.js | 14 +++++++------- app/utils/log.js | 4 ++-- app/views/LoginView.js | 4 ++-- app/views/NewServerView.js | 4 ++-- app/views/OnboardingView/index.js | 4 ++-- app/views/RegisterView.js | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index fd516d1ab3a..502e1606fa8 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -87,7 +87,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&display=touch`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent({ eventName: LOGIN_WITH_FACEBOOK }); + trackUserEvent(LOGIN_WITH_FACEBOOK); } onPressGithub = () => { @@ -99,7 +99,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }`; this.openOAuth({ url: `${ endpoint }${ encodeURIComponent(params) }` }); - trackUserEvent({ eventName: LOGIN_WITH_GITHUB }); + trackUserEvent(LOGIN_WITH_GITHUB); } onPressGitlab = () => { @@ -112,7 +112,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent({ eventName: LOGIN_WITH_GITLAB }); + trackUserEvent(LOGIN_WITH_GITLAB); } onPressGoogle = () => { @@ -124,7 +124,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent({ eventName: LOGIN_WITH_GOOGLE }); + trackUserEvent(LOGIN_WITH_GOOGLE); } onPressLinkedin = () => { @@ -136,7 +136,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent({ eventName: LOGIN_WITH_LINKEDIN }); + trackUserEvent(LOGIN_WITH_LINKEDIN); } onPressMeteor = () => { @@ -147,7 +147,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent({ eventName: LOGIN_WITH_METEOR }); + trackUserEvent(LOGIN_WITH_METEOR); } onPressTwitter = () => { @@ -155,7 +155,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const url = `${ server }/_oauth/twitter/?requestTokenAndRedirect=true&state=${ state }`; this.openOAuth({ url }); - trackUserEvent({ eventName: LOGIN_WITH_TWITTER }); + trackUserEvent(LOGIN_WITH_TWITTER); } onPressWordpress = () => { diff --git a/app/utils/log.js b/app/utils/log.js index 33f90064a0b..6b06d2b8cfd 100644 --- a/app/utils/log.js +++ b/app/utils/log.js @@ -10,8 +10,8 @@ export const { leaveBreadcrumb } = bugsnag; let metadata = {}; -export const trackUserEvent = ({ eventName, payload }) => { - analytics().logEvent(eventName, { ...payload }); +export const trackUserEvent = (eventName, payload) => { + analytics().logEvent(eventName, payload); }; export const logServerVersion = (serverVersion) => { diff --git a/app/views/LoginView.js b/app/views/LoginView.js index f10abe60b58..1d7811c30a9 100644 --- a/app/views/LoginView.js +++ b/app/views/LoginView.js @@ -105,7 +105,7 @@ class LoginView extends React.Component { forgotPassword = () => { const { navigation, Site_Name } = this.props; navigation.navigate('ForgotPasswordView', { title: Site_Name }); - trackUserEvent({ eventName: FORGOT_PASSWORD }); + trackUserEvent(FORGOT_PASSWORD); } valid = () => { @@ -122,7 +122,7 @@ class LoginView extends React.Component { const { loginRequest } = this.props; Keyboard.dismiss(); loginRequest({ user, password }); - trackUserEvent({ eventName: DEFAULT_LOGIN }); + trackUserEvent(DEFAULT_LOGIN); } renderUserForm = () => { diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index e708802a57e..2f82d9437fe 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -177,14 +177,14 @@ class NewServerView extends React.Component { connectServer(server, cert); } - trackUserEvent({ eventName: CONNECT_TO_WORKSPACE }); + trackUserEvent(CONNECT_TO_WORKSPACE); } connectOpen = () => { this.setState({ connectingOpen: true }); const { connectServer } = this.props; connectServer('https://open.rocket.chat'); - trackUserEvent({ eventName: JOIN_OPEN_WORKSPACE }); + trackUserEvent(JOIN_OPEN_WORKSPACE); } basicAuth = async(server, text) => { diff --git a/app/views/OnboardingView/index.js b/app/views/OnboardingView/index.js index 4c9ff3d233c..9ae956b6f49 100644 --- a/app/views/OnboardingView/index.js +++ b/app/views/OnboardingView/index.js @@ -57,13 +57,13 @@ class OnboardingView extends React.Component { connectServer = () => { const { navigation } = this.props; navigation.navigate('NewServerView'); - trackUserEvent({ eventName: JOIN_A_WORKSPACE }); + trackUserEvent(JOIN_A_WORKSPACE); } createWorkspace = async() => { try { await Linking.openURL('https://cloud.rocket.chat/trial'); - trackUserEvent({ eventName: CREATE_NEW_WORKSPACE }); + trackUserEvent(CREATE_NEW_WORKSPACE); } catch { // do nothing } diff --git a/app/views/RegisterView.js b/app/views/RegisterView.js index c2f71b791ac..83d22d74d74 100644 --- a/app/views/RegisterView.js +++ b/app/views/RegisterView.js @@ -157,7 +157,7 @@ class RegisterView extends React.Component { showErrorAlert(e.data.error, I18n.t('Oops')); } this.setState({ saving: false }); - trackUserEvent({ eventName: DEFAULT_SIGN_UP }); + trackUserEvent(DEFAULT_SIGN_UP); } openContract = (route) => { From 3b9d7ebf14dc1af2949a9d90c4176ce46b2069f1 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Mon, 8 Jun 2020 12:34:42 -0300 Subject: [PATCH 08/11] Track the remaining login services --- app/containers/LoginServices.js | 6 +++++- app/utils/trackableEvents.js | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index 502e1606fa8..55bcecfc747 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -18,7 +18,7 @@ import I18n from '../i18n'; import random from '../utils/random'; import { trackUserEvent } from '../utils/log'; import { - LOGIN_WITH_GITHUB, LOGIN_WITH_GITLAB, LOGIN_WITH_GOOGLE, LOGIN_WITH_FACEBOOK, LOGIN_WITH_METEOR, LOGIN_WITH_LINKEDIN, LOGIN_WITH_TWITTER + LOGIN_WITH_GITHUB, LOGIN_WITH_GITLAB, LOGIN_WITH_GOOGLE, LOGIN_WITH_FACEBOOK, LOGIN_WITH_METEOR, LOGIN_WITH_LINKEDIN, LOGIN_WITH_TWITTER, LOGIN_WITH_WORDPRESS, LOGIN_WITH_CUSTOM_OAUTH, LOGIN_WITH_SAML, LOGIN_WITH_CAS } from '../utils/trackableEvents'; const SERVICE_HEIGHT = 58; @@ -167,6 +167,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); + trackUserEvent(LOGIN_WITH_WORDPRESS); } onPressCustomOAuth = (loginService) => { @@ -181,6 +182,7 @@ class LoginServices extends React.PureComponent { const absolutePath = `${ authorizePath }${ params }`; const url = absolutePath.includes(domain) ? absolutePath : domain + absolutePath; this.openOAuth({ url }); + trackUserEvent(LOGIN_WITH_CUSTOM_OAUTH); } onPressSaml = (loginService) => { @@ -190,6 +192,7 @@ class LoginServices extends React.PureComponent { const ssoToken = random(17); const url = `${ server }/_saml/authorize/${ provider }/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'saml' }); + trackUserEvent(LOGIN_WITH_SAML); } onPressCas = () => { @@ -197,6 +200,7 @@ class LoginServices extends React.PureComponent { const ssoToken = random(17); const url = `${ CAS_login_url }?service=${ server }/_cas/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'cas' }); + trackUserEvent(LOGIN_WITH_CAS); } getOAuthState = () => { diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js index 323e58be58a..f043b0d061e 100644 --- a/app/utils/trackableEvents.js +++ b/app/utils/trackableEvents.js @@ -13,3 +13,6 @@ export const LOGIN_WITH_GOOGLE = 'login_with_google'; export const LOGIN_WITH_METEOR = 'login_with_meteor'; export const LOGIN_WITH_TWITTER = 'login_with_twitter'; export const LOGIN_WITH_WORDPRESS = 'login_with_wordpress'; +export const LOGIN_WITH_CUSTOM_OAUTH = 'login_with_custom_oauth'; +export const LOGIN_WITH_SAML = 'login_with_saml'; +export const LOGIN_WITH_CAS = 'login_with_cas'; From 22f5b6c8e1218d183d412044ca92e933366f0565 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Thu, 18 Jun 2020 01:28:55 -0300 Subject: [PATCH 09/11] Resolve requests to improve the importing logs and events --- app/containers/LoginServices.js | 28 +++++++++++++--------------- app/utils/log/events.js | 20 ++++++++++++++++++++ app/utils/{log.js => log/index.js} | 12 +++++++----- app/utils/trackableEvents.js | 18 ------------------ app/views/LoginView.js | 7 +++---- app/views/NewServerView.js | 7 +++---- app/views/OnboardingView/index.js | 7 +++---- app/views/RegisterView.js | 5 ++--- 8 files changed, 51 insertions(+), 53 deletions(-) create mode 100644 app/utils/log/events.js rename app/utils/{log.js => log/index.js} (82%) delete mode 100644 app/utils/trackableEvents.js diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index 55bcecfc747..155c024cb37 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -16,10 +16,8 @@ import OrSeparator from './OrSeparator'; import Touch from '../utils/touch'; import I18n from '../i18n'; import random from '../utils/random'; -import { trackUserEvent } from '../utils/log'; -import { - LOGIN_WITH_GITHUB, LOGIN_WITH_GITLAB, LOGIN_WITH_GOOGLE, LOGIN_WITH_FACEBOOK, LOGIN_WITH_METEOR, LOGIN_WITH_LINKEDIN, LOGIN_WITH_TWITTER, LOGIN_WITH_WORDPRESS, LOGIN_WITH_CUSTOM_OAUTH, LOGIN_WITH_SAML, LOGIN_WITH_CAS -} from '../utils/trackableEvents'; +import { logEvent, events } from '../utils/log'; + const SERVICE_HEIGHT = 58; const SERVICES_COLLAPSED_HEIGHT = 174; @@ -87,7 +85,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&display=touch`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_FACEBOOK); + logEvent(events.LOGIN_WITH_FACEBOOK); } onPressGithub = () => { @@ -99,7 +97,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }`; this.openOAuth({ url: `${ endpoint }${ encodeURIComponent(params) }` }); - trackUserEvent(LOGIN_WITH_GITHUB); + logEvent(events.LOGIN_WITH_GITHUB); } onPressGitlab = () => { @@ -112,7 +110,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_GITLAB); + logEvent(events.LOGIN_WITH_GITLAB); } onPressGoogle = () => { @@ -124,7 +122,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_GOOGLE); + logEvent(events.LOGIN_WITH_GOOGLE); } onPressLinkedin = () => { @@ -136,7 +134,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_LINKEDIN); + logEvent(events.LOGIN_WITH_LINKEDIN); } onPressMeteor = () => { @@ -147,7 +145,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_METEOR); + logEvent(events.LOGIN_WITH_METEOR); } onPressTwitter = () => { @@ -155,7 +153,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const url = `${ server }/_oauth/twitter/?requestTokenAndRedirect=true&state=${ state }`; this.openOAuth({ url }); - trackUserEvent(LOGIN_WITH_TWITTER); + logEvent(events.LOGIN_WITH_TWITTER); } onPressWordpress = () => { @@ -167,7 +165,7 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - trackUserEvent(LOGIN_WITH_WORDPRESS); + logEvent(events.LOGIN_WITH_WORDPRESS); } onPressCustomOAuth = (loginService) => { @@ -182,7 +180,7 @@ class LoginServices extends React.PureComponent { const absolutePath = `${ authorizePath }${ params }`; const url = absolutePath.includes(domain) ? absolutePath : domain + absolutePath; this.openOAuth({ url }); - trackUserEvent(LOGIN_WITH_CUSTOM_OAUTH); + logEvent(events.LOGIN_WITH_CUSTOM_OAUTH); } onPressSaml = (loginService) => { @@ -192,7 +190,7 @@ class LoginServices extends React.PureComponent { const ssoToken = random(17); const url = `${ server }/_saml/authorize/${ provider }/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'saml' }); - trackUserEvent(LOGIN_WITH_SAML); + logEvent(events.LOGIN_WITH_SAML); } onPressCas = () => { @@ -200,7 +198,7 @@ class LoginServices extends React.PureComponent { const ssoToken = random(17); const url = `${ CAS_login_url }?service=${ server }/_cas/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'cas' }); - trackUserEvent(LOGIN_WITH_CAS); + logEvent(events.LOGIN_WITH_CAS); } getOAuthState = () => { diff --git a/app/utils/log/events.js b/app/utils/log/events.js new file mode 100644 index 00000000000..8a0dbc405b8 --- /dev/null +++ b/app/utils/log/events.js @@ -0,0 +1,20 @@ +export default { + JOIN_A_WORKSPACE: 'join_a_workspace', + CREATE_NEW_WORKSPACE: 'create_new_workspace', + CONNECT_TO_WORKSPACE: 'connect_to_workspace', + JOIN_OPEN_WORKSPACE: 'join_open_workspace', + DEFAULT_LOGIN: 'default_login', + DEFAULT_SIGN_UP: 'default_sign_up', + FORGOT_PASSWORD: 'forgot_password', + LOGIN_WITH_FACEBOOK: 'login_with_facebook', + LOGIN_WITH_GITHUB: 'login_with_github', + LOGIN_WITH_GITLAB: 'login_with_gitlab', + LOGIN_WITH_LINKEDIN: 'login_with_linkedin', + LOGIN_WITH_GOOGLE: 'login_with_google', + LOGIN_WITH_METEOR: 'login_with_meteor', + LOGIN_WITH_TWITTER: 'login_with_twitter', + LOGIN_WITH_WORDPRESS: 'login_with_wordpress', + LOGIN_WITH_CUSTOM_OAUTH: 'login_with_custom_oauth', + LOGIN_WITH_SAML: 'login_with_saml', + LOGIN_WITH_CAS: 'login_with_cas' +}; diff --git a/app/utils/log.js b/app/utils/log/index.js similarity index 82% rename from app/utils/log.js rename to app/utils/log/index.js index 6b06d2b8cfd..e052d2e44ad 100644 --- a/app/utils/log.js +++ b/app/utils/log/index.js @@ -1,25 +1,27 @@ import { Client } from 'bugsnag-react-native'; import firebase from 'react-native-firebase'; -import config from '../../config'; +import config from '../../../config'; +import events from './events'; const bugsnag = new Client(config.BUGSNAG_API_KEY); export const { analytics } = firebase; export const loggerConfig = bugsnag.config; export const { leaveBreadcrumb } = bugsnag; +export { events }; let metadata = {}; -export const trackUserEvent = (eventName, payload) => { - analytics().logEvent(eventName, payload); -}; - export const logServerVersion = (serverVersion) => { metadata = { serverVersion }; }; +export const logEvent = (eventName, payload) => { + analytics().logEvent(eventName, payload); +}; + export default (e) => { if (e instanceof Error && e.message !== 'Aborted' && !__DEV__) { bugsnag.notify(e, (report) => { diff --git a/app/utils/trackableEvents.js b/app/utils/trackableEvents.js deleted file mode 100644 index f043b0d061e..00000000000 --- a/app/utils/trackableEvents.js +++ /dev/null @@ -1,18 +0,0 @@ -export const JOIN_A_WORKSPACE = 'join_a_workspace'; -export const CREATE_NEW_WORKSPACE = 'create_new_workspace'; -export const CONNECT_TO_WORKSPACE = 'connect_to_workspace'; -export const JOIN_OPEN_WORKSPACE = 'join_open_workspace'; -export const DEFAULT_LOGIN = 'default_login'; -export const DEFAULT_SIGN_UP = 'default_sign_up'; -export const FORGOT_PASSWORD = 'forgot_password'; -export const LOGIN_WITH_FACEBOOK = 'login_with_facebook'; -export const LOGIN_WITH_GITHUB = 'login_with_github'; -export const LOGIN_WITH_GITLAB = 'login_with_gitlab'; -export const LOGIN_WITH_LINKEDIN = 'login_with_linkedin'; -export const LOGIN_WITH_GOOGLE = 'login_with_google'; -export const LOGIN_WITH_METEOR = 'login_with_meteor'; -export const LOGIN_WITH_TWITTER = 'login_with_twitter'; -export const LOGIN_WITH_WORDPRESS = 'login_with_wordpress'; -export const LOGIN_WITH_CUSTOM_OAUTH = 'login_with_custom_oauth'; -export const LOGIN_WITH_SAML = 'login_with_saml'; -export const LOGIN_WITH_CAS = 'login_with_cas'; diff --git a/app/views/LoginView.js b/app/views/LoginView.js index 1d7811c30a9..7ce2d3c5d59 100644 --- a/app/views/LoginView.js +++ b/app/views/LoginView.js @@ -6,7 +6,7 @@ import { import { connect } from 'react-redux'; import equal from 'deep-equal'; -import { trackUserEvent } from '../utils/log'; +import { logEvent, events } from '../utils/log'; import sharedStyles from './Styles'; import Button from '../containers/Button'; import I18n from '../i18n'; @@ -18,7 +18,6 @@ import FormContainer, { FormContainerInner } from '../containers/FormContainer'; import TextInput from '../containers/TextInput'; import { loginRequest as loginRequestAction } from '../actions/login'; import LoginServices from '../containers/LoginServices'; -import { DEFAULT_LOGIN, FORGOT_PASSWORD } from '../utils/trackableEvents'; const styles = StyleSheet.create({ registerDisabled: { @@ -105,7 +104,7 @@ class LoginView extends React.Component { forgotPassword = () => { const { navigation, Site_Name } = this.props; navigation.navigate('ForgotPasswordView', { title: Site_Name }); - trackUserEvent(FORGOT_PASSWORD); + logEvent(events.FORGOT_PASSWORD); } valid = () => { @@ -122,7 +121,7 @@ class LoginView extends React.Component { const { loginRequest } = this.props; Keyboard.dismiss(); loginRequest({ user, password }); - trackUserEvent(DEFAULT_LOGIN); + logEvent(events.DEFAULT_LOGIN); } renderUserForm = () => { diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index 2f82d9437fe..c3616f187b5 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -24,13 +24,12 @@ import FormContainer, { FormContainerInner } from '../containers/FormContainer'; import I18n from '../i18n'; import { isIOS } from '../utils/deviceInfo'; import { themes } from '../constants/colors'; -import log, { trackUserEvent } from '../utils/log'; +import log, { logEvent, events } from '../utils/log'; import { animateNextTransition } from '../utils/layoutAnimation'; import { withTheme } from '../theme'; import { setBasicAuth, BASIC_AUTH_KEY } from '../utils/fetch'; import { themedHeader } from '../utils/navigation'; import { CloseModalButton } from '../containers/HeaderButton'; -import { CONNECT_TO_WORKSPACE, JOIN_OPEN_WORKSPACE } from '../utils/trackableEvents'; const styles = StyleSheet.create({ title: { @@ -177,14 +176,14 @@ class NewServerView extends React.Component { connectServer(server, cert); } - trackUserEvent(CONNECT_TO_WORKSPACE); + logEvent(events.CONNECT_TO_WORKSPACE); } connectOpen = () => { this.setState({ connectingOpen: true }); const { connectServer } = this.props; connectServer('https://open.rocket.chat'); - trackUserEvent(JOIN_OPEN_WORKSPACE); + logEvent(events.JOIN_OPEN_WORKSPACE); } basicAuth = async(server, text) => { diff --git a/app/views/OnboardingView/index.js b/app/views/OnboardingView/index.js index 9ae956b6f49..a785f176dc9 100644 --- a/app/views/OnboardingView/index.js +++ b/app/views/OnboardingView/index.js @@ -14,8 +14,7 @@ import { isTablet } from '../../utils/deviceInfo'; import { themes } from '../../constants/colors'; import { withTheme } from '../../theme'; import FormContainer, { FormContainerInner } from '../../containers/FormContainer'; -import { trackUserEvent } from '../../utils/log'; -import { JOIN_A_WORKSPACE, CREATE_NEW_WORKSPACE } from '../../utils/trackableEvents'; +import { logEvent, events } from '../../utils/log'; class OnboardingView extends React.Component { static navigationOptions = () => ({ @@ -57,13 +56,13 @@ class OnboardingView extends React.Component { connectServer = () => { const { navigation } = this.props; navigation.navigate('NewServerView'); - trackUserEvent(JOIN_A_WORKSPACE); + logEvent(events.JOIN_A_WORKSPACE); } createWorkspace = async() => { try { await Linking.openURL('https://cloud.rocket.chat/trial'); - trackUserEvent(CREATE_NEW_WORKSPACE); + logEvent(events.CREATE_NEW_WORKSPACE); } catch { // do nothing } diff --git a/app/views/RegisterView.js b/app/views/RegisterView.js index 83d22d74d74..d58d3f2b18e 100644 --- a/app/views/RegisterView.js +++ b/app/views/RegisterView.js @@ -6,7 +6,7 @@ import { import { connect } from 'react-redux'; import RNPickerSelect from 'react-native-picker-select'; -import log, { trackUserEvent } from '../utils/log'; +import log, { logEvent, events } from '../utils/log'; import sharedStyles from './Styles'; import Button from '../containers/Button'; import I18n from '../i18n'; @@ -23,7 +23,6 @@ import { loginRequest as loginRequestAction } from '../actions/login'; import openLink from '../utils/openLink'; import LoginServices from '../containers/LoginServices'; import { getShowLoginButton } from '../selectors/login'; -import { DEFAULT_SIGN_UP } from '../utils/trackableEvents'; const styles = StyleSheet.create({ title: { @@ -157,7 +156,7 @@ class RegisterView extends React.Component { showErrorAlert(e.data.error, I18n.t('Oops')); } this.setState({ saving: false }); - trackUserEvent(DEFAULT_SIGN_UP); + logEvent(events.DEFAULT_SIGN_UP); } openContract = (route) => { From a05dd586a3debf7ca23a10764841339591afdacf Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Wed, 8 Jul 2020 22:17:05 -0300 Subject: [PATCH 10/11] Leave a bugsnag breadcrumb when logging an event --- app/utils/log/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/utils/log/index.js b/app/utils/log/index.js index a514d9e9dec..2a8b6720ee6 100644 --- a/app/utils/log/index.js +++ b/app/utils/log/index.js @@ -20,6 +20,7 @@ export const logServerVersion = (serverVersion) => { export const logEvent = (eventName, payload) => { analytics().logEvent(eventName, payload); + leaveBreadcrumb(eventName, payload); }; export const setCurrentScreen = (currentScreen) => { From a2ee740968754f51496ad78ad538fa7207628f73 Mon Sep 17 00:00:00 2001 From: Youssef Muhamad Date: Wed, 8 Jul 2020 22:39:42 -0300 Subject: [PATCH 11/11] Move all logEvent to the top of code block and log remaining fail events --- app/containers/LoginServices.js | 22 +++++++++++----------- app/sagas/login.js | 4 +++- app/utils/log/events.js | 4 ++++ app/views/LoginView.js | 3 +-- app/views/NewServerView.js | 6 +++--- app/views/OnboardingView/index.js | 6 +++--- app/views/RegisterView.js | 3 ++- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index a33e43854a6..68d69698efc 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -76,6 +76,7 @@ class LoginServices extends React.PureComponent { } onPressFacebook = () => { + logEvent(events.LOGIN_WITH_FACEBOOK); const { services, server } = this.props; const { clientId } = services.facebook; const endpoint = 'https://m.facebook.com/v2.9/dialog/oauth'; @@ -84,10 +85,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&display=touch`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_FACEBOOK); } onPressGithub = () => { + logEvent(events.LOGIN_WITH_GITHUB); const { services, server } = this.props; const { clientId } = services.github; const endpoint = `https://github.com/login?client_id=${ clientId }&return_to=${ encodeURIComponent('/login/oauth/authorize') }`; @@ -96,10 +97,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }`; this.openOAuth({ url: `${ endpoint }${ encodeURIComponent(params) }` }); - logEvent(events.LOGIN_WITH_GITHUB); } onPressGitlab = () => { + logEvent(events.LOGIN_WITH_GITLAB); const { services, server, Gitlab_URL } = this.props; const { clientId } = services.gitlab; const baseURL = Gitlab_URL ? Gitlab_URL.trim().replace(/\/*$/, '') : 'https://gitlab.com'; @@ -109,10 +110,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_GITLAB); } onPressGoogle = () => { + logEvent(events.LOGIN_WITH_GOOGLE); const { services, server } = this.props; const { clientId } = services.google; const endpoint = 'https://accounts.google.com/o/oauth2/auth'; @@ -121,10 +122,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_GOOGLE); } onPressLinkedin = () => { + logEvent(events.LOGIN_WITH_LINKEDIN); const { services, server } = this.props; const { clientId } = services.linkedin; const endpoint = 'https://www.linkedin.com/oauth/v2/authorization'; @@ -133,10 +134,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_LINKEDIN); } onPressMeteor = () => { + logEvent(events.LOGIN_WITH_METEOR); const { services, server } = this.props; const { clientId } = services['meteor-developer']; const endpoint = 'https://www.meteor.com/oauth2/authorize'; @@ -144,18 +145,18 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_METEOR); } onPressTwitter = () => { + logEvent(events.LOGIN_WITH_TWITTER); const { server } = this.props; const state = this.getOAuthState(); const url = `${ server }/_oauth/twitter/?requestTokenAndRedirect=true&state=${ state }`; this.openOAuth({ url }); - logEvent(events.LOGIN_WITH_TWITTER); } onPressWordpress = () => { + logEvent(events.LOGIN_WITH_WORDPRESS); const { services, server } = this.props; const { clientId, serverURL } = services.wordpress; const endpoint = `${ serverURL }/oauth/authorize`; @@ -164,10 +165,10 @@ class LoginServices extends React.PureComponent { const state = this.getOAuthState(); const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`; this.openOAuth({ url: `${ endpoint }${ params }` }); - logEvent(events.LOGIN_WITH_WORDPRESS); } onPressCustomOAuth = (loginService) => { + logEvent(events.LOGIN_WITH_CUSTOM_OAUTH); const { server } = this.props; const { serverURL, authorizePath, clientId, scope, service @@ -179,25 +180,24 @@ class LoginServices extends React.PureComponent { const absolutePath = `${ authorizePath }${ params }`; const url = absolutePath.includes(domain) ? absolutePath : domain + absolutePath; this.openOAuth({ url }); - logEvent(events.LOGIN_WITH_CUSTOM_OAUTH); } onPressSaml = (loginService) => { + logEvent(events.LOGIN_WITH_SAML); const { server } = this.props; const { clientConfig } = loginService; const { provider } = clientConfig; const ssoToken = random(17); const url = `${ server }/_saml/authorize/${ provider }/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'saml' }); - logEvent(events.LOGIN_WITH_SAML); } onPressCas = () => { + logEvent(events.LOGIN_WITH_CAS); const { server, CAS_login_url } = this.props; const ssoToken = random(17); const url = `${ CAS_login_url }?service=${ server }/_cas/${ ssoToken }`; this.openOAuth({ url, ssoToken, authType: 'cas' }); - logEvent(events.LOGIN_WITH_CAS); } getOAuthState = () => { diff --git a/app/sagas/login.js b/app/sagas/login.js index 587b9b7bab7..199952190db 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -17,7 +17,7 @@ import { import { roomsRequest } from '../actions/rooms'; import { toMomentLocale } from '../utils/moment'; import RocketChat from '../lib/rocketchat'; -import log from '../utils/log'; +import log, { logEvent, events } from '../utils/log'; import I18n from '../i18n'; import database from '../lib/database'; import EventEmitter from '../utils/events'; @@ -32,6 +32,7 @@ const loginCall = args => RocketChat.login(args); const logoutCall = args => RocketChat.logout(args); const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnError = false }) { + logEvent(events.DEFAULT_LOGIN); try { let result; if (credentials.resume) { @@ -52,6 +53,7 @@ const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnE if (logoutOnError && (e.data && e.data.message && /you've been logged out by the server/i.test(e.data.message))) { yield put(logout(true)); } else { + logEvent(events.DEFAULT_LOGIN_FAIL); yield put(loginFailure(e)); } } diff --git a/app/utils/log/events.js b/app/utils/log/events.js index 8a0dbc405b8..01297cd2a29 100644 --- a/app/utils/log/events.js +++ b/app/utils/log/events.js @@ -1,10 +1,14 @@ export default { JOIN_A_WORKSPACE: 'join_a_workspace', CREATE_NEW_WORKSPACE: 'create_new_workspace', + CREATE_NEW_WORKSPACE_FAIL: 'create_new_workspace_fail', CONNECT_TO_WORKSPACE: 'connect_to_workspace', + CONNECT_TO_WORKSPACE_FAIL: 'connect_to_workspace_fail', JOIN_OPEN_WORKSPACE: 'join_open_workspace', DEFAULT_LOGIN: 'default_login', + DEFAULT_LOGIN_FAIL: 'default_login_fail', DEFAULT_SIGN_UP: 'default_sign_up', + DEFAULT_SIGN_UP_FAIL: 'default_sign_up_fail', FORGOT_PASSWORD: 'forgot_password', LOGIN_WITH_FACEBOOK: 'login_with_facebook', LOGIN_WITH_GITHUB: 'login_with_github', diff --git a/app/views/LoginView.js b/app/views/LoginView.js index a7cedfe782b..9e566b5be8b 100644 --- a/app/views/LoginView.js +++ b/app/views/LoginView.js @@ -103,9 +103,9 @@ class LoginView extends React.Component { } forgotPassword = () => { + logEvent(events.FORGOT_PASSWORD); const { navigation, Site_Name } = this.props; navigation.navigate('ForgotPasswordView', { title: Site_Name }); - logEvent(events.FORGOT_PASSWORD); } valid = () => { @@ -122,7 +122,6 @@ class LoginView extends React.Component { const { loginRequest } = this.props; Keyboard.dismiss(); loginRequest({ user, password }); - logEvent(events.DEFAULT_LOGIN); } renderUserForm = () => { diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index 71da33887cf..4f66d3c1565 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -124,6 +124,7 @@ class NewServerView extends React.Component { } submit = async() => { + logEvent(events.CONNECT_TO_WORKSPACE); const { text, certificate } = this.state; const { connectServer } = this.props; let cert = null; @@ -135,6 +136,7 @@ class NewServerView extends React.Component { try { await FileSystem.copyAsync({ from: certificate.path, to: certificatePath }); } catch (e) { + logEvent(events.CONNECT_TO_WORKSPACE_FAIL); log(e); } cert = { @@ -149,15 +151,13 @@ class NewServerView extends React.Component { await this.basicAuth(server, text); connectServer(server, cert); } - - logEvent(events.CONNECT_TO_WORKSPACE); } connectOpen = () => { + logEvent(events.JOIN_OPEN_WORKSPACE); this.setState({ connectingOpen: true }); const { connectServer } = this.props; connectServer('https://open.rocket.chat'); - logEvent(events.JOIN_OPEN_WORKSPACE); } basicAuth = async(server, text) => { diff --git a/app/views/OnboardingView/index.js b/app/views/OnboardingView/index.js index 40e2e97e057..0d509e0d4ac 100644 --- a/app/views/OnboardingView/index.js +++ b/app/views/OnboardingView/index.js @@ -70,17 +70,17 @@ class OnboardingView extends React.Component { } connectServer = () => { + logEvent(events.JOIN_A_WORKSPACE); const { navigation } = this.props; navigation.navigate('NewServerView'); - logEvent(events.JOIN_A_WORKSPACE); } createWorkspace = async() => { + logEvent(events.CREATE_NEW_WORKSPACE); try { await Linking.openURL('https://cloud.rocket.chat/trial'); - logEvent(events.CREATE_NEW_WORKSPACE); } catch { - // do nothing + logEvent(events.CREATE_NEW_WORKSPACE_FAIL); } } diff --git a/app/views/RegisterView.js b/app/views/RegisterView.js index 1b59c7bb761..d95fb7938cc 100644 --- a/app/views/RegisterView.js +++ b/app/views/RegisterView.js @@ -114,6 +114,7 @@ class RegisterView extends React.Component { } submit = async() => { + logEvent(events.DEFAULT_SIGN_UP); if (!this.valid()) { return; } @@ -149,11 +150,11 @@ class RegisterView extends React.Component { return loginRequest({ user: email, password }); } if (e.data?.error) { + logEvent(events.DEFAULT_SIGN_UP_FAIL); showErrorAlert(e.data.error, I18n.t('Oops')); } } this.setState({ saving: false }); - logEvent(events.DEFAULT_SIGN_UP); } openContract = (route) => {