Browse Source

Merge pull request #721 from gre/analytics-2

cover more usecase for analytics
master
Thibaut 7 years ago
committed by GitHub
parent
commit
9ce41e3422
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      src/analytics/Track.js
  2. 4
      src/analytics/TrackPage.js
  3. 6
      src/components/AccountPage/index.js
  4. 4
      src/components/DashboardPage/index.js
  5. 2
      src/components/ExportLogsBtn.js
  6. 8
      src/components/OperationsList/index.js
  7. 9
      src/components/SettingsPage/sections/Profile.js
  8. 16
      src/components/base/Button/index.js

7
src/analytics/Track.js

@ -1,3 +1,4 @@
import logger from 'logger'
import { PureComponent } from 'react' import { PureComponent } from 'react'
import { track } from './segment' import { track } from './segment'
@ -6,9 +7,11 @@ class Track extends PureComponent<{
onUnmount?: boolean, onUnmount?: boolean,
onUpdate?: boolean, onUpdate?: boolean,
event: string, event: string,
properties?: Object,
}> { }> {
componentDidMount() { componentDidMount() {
if (typeof this.props.event !== 'string') {
logger.warn('analytics Track: invalid event=', this.props.event)
}
if (this.props.onMount) this.track() if (this.props.onMount) this.track()
} }
componentDidUpdate() { componentDidUpdate() {
@ -18,7 +21,7 @@ class Track extends PureComponent<{
if (this.props.onUnmount) this.track() if (this.props.onUnmount) this.track()
} }
track = () => { track = () => {
const { event, properties } = this.props const { event, onMount, onUnmount, onUpdate, ...properties } = this.props
track(event, properties) track(event, properties)
} }
render() { render() {

4
src/analytics/TrackPage.js

@ -1,9 +1,9 @@
import { PureComponent } from 'react' import { PureComponent } from 'react'
import { page } from './segment' import { page } from './segment'
class TrackPage extends PureComponent<{ category: string, name?: string, properties?: Object }> { class TrackPage extends PureComponent<{ category: string, name?: string }> {
componentDidMount() { componentDidMount() {
const { category, name, properties } = this.props const { category, name, ...properties } = this.props
page(category, name, properties) page(category, name, properties)
} }
render() { render() {

6
src/components/AccountPage/index.js

@ -109,10 +109,8 @@ class AccountPage extends PureComponent<Props> {
<Box key={account.id}> <Box key={account.id}>
<TrackPage <TrackPage
category="Account" category="Account"
properties={{ currency={account.currency.id}
currency: account.currency.id, operationsLength={account.operations.length}
operationsLength: account.operations.length,
}}
/> />
<SyncOneAccountOnMount priority={10} accountId={account.id} /> <SyncOneAccountOnMount priority={10} accountId={account.id} />
<Box horizontal mb={5} flow={4}> <Box horizontal mb={5} flow={4}>

4
src/components/DashboardPage/index.js

@ -104,7 +104,9 @@ class DashboardPage extends PureComponent<Props> {
<UpdateNotifier /> <UpdateNotifier />
<TrackPage <TrackPage
category="Portfolio" category="Portfolio"
properties={{ totalAccounts, totalOperations, totalCurrencies }} totalAccounts={totalAccounts}
totalOperations={totalOperations}
totalCurrencies={totalCurrencies}
/> />
<Box flow={7}> <Box flow={7}>
{totalAccounts > 0 ? ( {totalAccounts > 0 ? (

2
src/components/ExportLogsBtn.js

@ -71,7 +71,7 @@ class ExportLogsBtn extends Component<{
return hookToShortcut ? ( return hookToShortcut ? (
<KeyHandler keyValue="e" onKeyHandle={this.onKeyHandle} /> <KeyHandler keyValue="e" onKeyHandle={this.onKeyHandle} />
) : ( ) : (
<Button primary onClick={this.handleExportLogs}> <Button primary event="ExportLogs" onClick={this.handleExportLogs}>
{t('app:settings.exportLogs.btn')} {t('app:settings.exportLogs.btn')}
</Button> </Button>
) )

8
src/components/OperationsList/index.js

@ -134,13 +134,11 @@ export class OperationsList extends PureComponent<Props, State> {
<Track <Track
onMount onMount
event="OperationsListEndReached" event="OperationsListEndReached"
properties={{ totalSections={groupedOperations.sections.length}
totalSections: groupedOperations.sections.length, totalOperations={groupedOperations.sections.reduce(
totalOperations: groupedOperations.sections.reduce(
(sum, s) => sum + s.data.length, (sum, s) => sum + s.data.length,
0, 0,
), )}
}}
/> />
) : null} ) : null}
{!groupedOperations.completed ? ( {!groupedOperations.completed ? (

9
src/components/SettingsPage/sections/Profile.js

@ -15,6 +15,7 @@ import hardReset from 'helpers/hardReset'
import type { SettingsState } from 'reducers/settings' import type { SettingsState } from 'reducers/settings'
import type { T } from 'types/common' import type { T } from 'types/common'
import Track from 'analytics/Track'
import TrackPage from 'analytics/TrackPage' import TrackPage from 'analytics/TrackPage'
import ExportLogsBtn from 'components/ExportLogsBtn' import ExportLogsBtn from 'components/ExportLogsBtn'
import CheckBox from 'components/base/CheckBox' import CheckBox from 'components/base/CheckBox'
@ -157,6 +158,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.password')} title={t('app:settings.profile.password')}
desc={t('app:settings.profile.passwordDesc')} desc={t('app:settings.profile.passwordDesc')}
> >
<Track onUpdate event={isPasswordEnabled ? 'PasswordEnabled' : 'PasswordDisabled'} />
<Box horizontal flow={2} align="center"> <Box horizontal flow={2} align="center">
{isPasswordEnabled && ( {isPasswordEnabled && (
<Button onClick={this.handleOpenPasswordModal}> <Button onClick={this.handleOpenPasswordModal}>
@ -170,6 +172,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.developerMode')} title={t('app:settings.profile.developerMode')}
desc={t('app:settings.profile.developerModeDesc')} desc={t('app:settings.profile.developerModeDesc')}
> >
<Track onUpdate event={settings.developerMode ? 'DevModeEnabled' : 'DevModeDisabled'} />
<CheckBox <CheckBox
isChecked={settings.developerMode} isChecked={settings.developerMode}
onChange={developerMode => saveSettings({ developerMode })} onChange={developerMode => saveSettings({ developerMode })}
@ -179,6 +182,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.reportErrors')} title={t('app:settings.profile.reportErrors')}
desc={t('app:settings.profile.reportErrorsDesc')} desc={t('app:settings.profile.reportErrorsDesc')}
> >
<Track onUpdate event={settings.sentryLogs ? 'SentryEnabled' : 'SentryDisabled'} />
<CheckBox <CheckBox
isChecked={settings.sentryLogs} isChecked={settings.sentryLogs}
onChange={sentryLogs => saveSettings({ sentryLogs })} onChange={sentryLogs => saveSettings({ sentryLogs })}
@ -188,6 +192,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.analytics')} title={t('app:settings.profile.analytics')}
desc={t('app:settings.profile.analyticsDesc')} desc={t('app:settings.profile.analyticsDesc')}
> >
<Track onUpdate event={settings.sentryLogs ? 'SentryEnabled' : 'SentryDisabled'} />
<CheckBox <CheckBox
isChecked={settings.shareAnalytics} isChecked={settings.shareAnalytics}
onChange={shareAnalytics => saveSettings({ shareAnalytics })} onChange={shareAnalytics => saveSettings({ shareAnalytics })}
@ -197,7 +202,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.softResetTitle')} title={t('app:settings.profile.softResetTitle')}
desc={t('app:settings.profile.softResetDesc')} desc={t('app:settings.profile.softResetDesc')}
> >
<Button primary onClick={this.handleOpenSoftResetModal}> <Button primary onClick={this.handleOpenSoftResetModal} event="ClearCacheIntent">
{t('app:settings.profile.softReset')} {t('app:settings.profile.softReset')}
</Button> </Button>
</Row> </Row>
@ -205,7 +210,7 @@ class TabProfile extends PureComponent<Props, State> {
title={t('app:settings.profile.hardResetTitle')} title={t('app:settings.profile.hardResetTitle')}
desc={t('app:settings.profile.hardResetDesc')} desc={t('app:settings.profile.hardResetDesc')}
> >
<Button danger onClick={this.handleOpenHardResetModal}> <Button danger onClick={this.handleOpenHardResetModal} event="HardResetIntent">
{t('app:settings.profile.hardReset')} {t('app:settings.profile.hardReset')}
</Button> </Button>
</Row> </Row>

16
src/components/base/Button/index.js

@ -4,6 +4,7 @@ import React from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { space, fontSize, fontWeight, color } from 'styled-system' import { space, fontSize, fontWeight, color } from 'styled-system'
import noop from 'lodash/noop' import noop from 'lodash/noop'
import { track } from 'analytics/segment'
import { darken, lighten, rgba } from 'styles/helpers' import { darken, lighten, rgba } from 'styles/helpers'
import fontFamily from 'styles/styled/fontFamily' import fontFamily from 'styles/styled/fontFamily'
@ -171,13 +172,24 @@ type Props = {
small?: boolean, small?: boolean,
padded?: boolean, padded?: boolean,
isLoading?: boolean, isLoading?: boolean,
event?: string,
eventProperties?: Object,
} }
const Button = (props: Props) => { const Button = (props: Props) => {
const { onClick, children, disabled, isLoading } = props const { disabled } = props
const { onClick, children, isLoading, event, eventProperties, ...rest } = props
const isClickDisabled = disabled || isLoading const isClickDisabled = disabled || isLoading
const onClickHandler = e => {
if (onClick) {
if (event) {
track(event, eventProperties)
}
onClick(e)
}
}
return ( return (
<Base {...props} onClick={isClickDisabled ? undefined : onClick}> <Base {...rest} onClick={isClickDisabled ? undefined : onClickHandler}>
{isLoading ? <Spinner size={16} /> : children} {isLoading ? <Spinner size={16} /> : children}
</Base> </Base>
) )

Loading…
Cancel
Save