mirror of
https://github.com/element-hq/element-web
synced 2024-11-28 20:38:55 +03:00
Implement opt-in analytics with cookie bar
This commit is contained in:
parent
6bfd7fca9c
commit
272ba5b004
5 changed files with 118 additions and 6 deletions
|
@ -266,6 +266,7 @@ const LoggedInView = React.createClass({
|
||||||
const GroupView = sdk.getComponent('structures.GroupView');
|
const GroupView = sdk.getComponent('structures.GroupView');
|
||||||
const MyGroups = sdk.getComponent('structures.MyGroups');
|
const MyGroups = sdk.getComponent('structures.MyGroups');
|
||||||
const MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
|
const MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
|
||||||
|
const CookieBar = sdk.getComponent('globals.CookieBar');
|
||||||
const NewVersionBar = sdk.getComponent('globals.NewVersionBar');
|
const NewVersionBar = sdk.getComponent('globals.NewVersionBar');
|
||||||
const UpdateCheckBar = sdk.getComponent('globals.UpdateCheckBar');
|
const UpdateCheckBar = sdk.getComponent('globals.UpdateCheckBar');
|
||||||
const PasswordNagBar = sdk.getComponent('globals.PasswordNagBar');
|
const PasswordNagBar = sdk.getComponent('globals.PasswordNagBar');
|
||||||
|
@ -353,7 +354,9 @@ const LoggedInView = React.createClass({
|
||||||
|
|
||||||
let topBar;
|
let topBar;
|
||||||
const isGuest = this.props.matrixClient.isGuest();
|
const isGuest = this.props.matrixClient.isGuest();
|
||||||
if (this.props.hasNewVersion) {
|
if (this.props.showCookieBar) {
|
||||||
|
topBar = <CookieBar />;
|
||||||
|
} else if (this.props.hasNewVersion) {
|
||||||
topBar = <NewVersionBar version={this.props.version} newVersion={this.props.newVersion}
|
topBar = <NewVersionBar version={this.props.version} newVersion={this.props.newVersion}
|
||||||
releaseNotes={this.props.newVersionReleaseNotes}
|
releaseNotes={this.props.newVersionReleaseNotes}
|
||||||
/>;
|
/>;
|
||||||
|
|
|
@ -165,6 +165,8 @@ export default React.createClass({
|
||||||
newVersionReleaseNotes: null,
|
newVersionReleaseNotes: null,
|
||||||
checkingForUpdate: null,
|
checkingForUpdate: null,
|
||||||
|
|
||||||
|
showCookieBar: false,
|
||||||
|
|
||||||
// Parameters used in the registration dance with the IS
|
// Parameters used in the registration dance with the IS
|
||||||
register_client_secret: null,
|
register_client_secret: null,
|
||||||
register_session_id: null,
|
register_session_id: null,
|
||||||
|
@ -227,8 +229,6 @@ export default React.createClass({
|
||||||
componentWillMount: function() {
|
componentWillMount: function() {
|
||||||
SdkConfig.put(this.props.config);
|
SdkConfig.put(this.props.config);
|
||||||
|
|
||||||
if (!SettingsStore.getValue("analyticsOptOut")) Analytics.enable();
|
|
||||||
|
|
||||||
// Used by _viewRoom before getting state from sync
|
// Used by _viewRoom before getting state from sync
|
||||||
this.firstSyncComplete = false;
|
this.firstSyncComplete = false;
|
||||||
this.firstSyncPromise = Promise.defer();
|
this.firstSyncPromise = Promise.defer();
|
||||||
|
@ -361,6 +361,16 @@ export default React.createClass({
|
||||||
// loadSession as there's logic there to ask the user if they want
|
// loadSession as there's logic there to ask the user if they want
|
||||||
// to try logging out.
|
// to try logging out.
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (SettingsStore.getValue("showCookieBar")) {
|
||||||
|
this.setState({
|
||||||
|
showCookieBar: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SettingsStore.getValue("analyticsOptIn")) {
|
||||||
|
Analytics.enable();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
componentWillUnmount: function() {
|
componentWillUnmount: function() {
|
||||||
|
@ -673,6 +683,23 @@ export default React.createClass({
|
||||||
hideToSRUsers: false,
|
hideToSRUsers: false,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case 'accept_cookies':
|
||||||
|
SettingsStore.setValue("analyticsOptIn", null, SettingLevel.DEVICE, true);
|
||||||
|
SettingsStore.setValue("showCookieBar", null, SettingLevel.DEVICE, false);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
showCookieBar: false,
|
||||||
|
});
|
||||||
|
Analytics.enable();
|
||||||
|
break;
|
||||||
|
case 'reject_cookies':
|
||||||
|
SettingsStore.setValue("analyticsOptIn", null, SettingLevel.DEVICE, false);
|
||||||
|
SettingsStore.setValue("showCookieBar", null, SettingLevel.DEVICE, false);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
showCookieBar: false,
|
||||||
|
});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1621,6 +1648,7 @@ export default React.createClass({
|
||||||
onRegistered={this.onRegistered}
|
onRegistered={this.onRegistered}
|
||||||
currentRoomId={this.state.currentRoomId}
|
currentRoomId={this.state.currentRoomId}
|
||||||
teamToken={this._teamToken}
|
teamToken={this._teamToken}
|
||||||
|
showCookieBar={this.state.showCookieBar}
|
||||||
{...this.props}
|
{...this.props}
|
||||||
{...this.state}
|
{...this.state}
|
||||||
/>
|
/>
|
||||||
|
|
73
src/components/views/globals/CookieBar.js
Normal file
73
src/components/views/globals/CookieBar.js
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 New Vector Ltd.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import dis from '../../../dispatcher';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
import sdk from '../../../index';
|
||||||
|
|
||||||
|
const PrivacyLink = (sub) =>
|
||||||
|
<a
|
||||||
|
className="mx_MatrixToolbar_link"
|
||||||
|
target="_blank"
|
||||||
|
href="https://riot.im/privacy"
|
||||||
|
>
|
||||||
|
{ sub }
|
||||||
|
</a>;
|
||||||
|
|
||||||
|
export default React.createClass({
|
||||||
|
onAccept: function() {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'accept_cookies',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onReject: function() {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'reject_cookies',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function() {
|
||||||
|
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||||
|
const toolbarClasses = "mx_MatrixToolbar";
|
||||||
|
return (
|
||||||
|
<div className={toolbarClasses}>
|
||||||
|
<img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="Warning" />
|
||||||
|
<div className="mx_MatrixToolbar_content">
|
||||||
|
{ _t(
|
||||||
|
"Help us improve Riot by sending usage data. " +
|
||||||
|
"This will use a cookie " +
|
||||||
|
"(see our <CookieLink>cookie</CookieLink> and " +
|
||||||
|
"<PrivacyLink>privacy</PrivacyLink> policies)",
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
// XXX: We need to link to the page that explains our cookies
|
||||||
|
'CookieLink': PrivacyLink,
|
||||||
|
'PrivacyLink': PrivacyLink,
|
||||||
|
},
|
||||||
|
) }
|
||||||
|
</div>
|
||||||
|
<AccessibleButton element='button' className="mx_MatrixToolbar_action" onClick={this.onAccept}>
|
||||||
|
{ _t("Send usage data") }
|
||||||
|
</AccessibleButton>
|
||||||
|
<AccessibleButton className="mx_MatrixToolbar_close" onClick={this.onReject}>
|
||||||
|
<img src="img/cancel.svg" width="18" height="18" />
|
||||||
|
</AccessibleButton>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
|
@ -210,7 +210,8 @@
|
||||||
"Mirror local video feed": "Mirror local video feed",
|
"Mirror local video feed": "Mirror local video feed",
|
||||||
"Disable Community Filter Panel": "Disable Community Filter Panel",
|
"Disable Community Filter Panel": "Disable Community Filter Panel",
|
||||||
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
|
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
|
||||||
"Opt out of analytics": "Opt out of analytics",
|
"Send analytics data": "Send analytics data",
|
||||||
|
"Show cookie bar": "Show cookie bar",
|
||||||
"Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
|
"Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
|
||||||
"Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device",
|
"Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device",
|
||||||
"Enable inline URL previews by default": "Enable inline URL previews by default",
|
"Enable inline URL previews by default": "Enable inline URL previews by default",
|
||||||
|
@ -637,6 +638,8 @@
|
||||||
"Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.",
|
"Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.",
|
||||||
"Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.",
|
"Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.",
|
||||||
"You're not currently a member of any communities.": "You're not currently a member of any communities.",
|
"You're not currently a member of any communities.": "You're not currently a member of any communities.",
|
||||||
|
"Help us improve Riot by sending usage data. This will use a cookie (see our <CookieLink>cookie</CookieLink> and <PrivacyLink>privacy</PrivacyLink> policies)": "Help us improve Riot by sending usage data. This will use a cookie (see our <CookieLink>cookie</CookieLink> and <PrivacyLink>privacy</PrivacyLink> policies)",
|
||||||
|
"Send usage data": "Send usage data",
|
||||||
"You are not receiving desktop notifications": "You are not receiving desktop notifications",
|
"You are not receiving desktop notifications": "You are not receiving desktop notifications",
|
||||||
"Enable them now": "Enable them now",
|
"Enable them now": "Enable them now",
|
||||||
"What's New": "What's New",
|
"What's New": "What's New",
|
||||||
|
|
|
@ -213,11 +213,16 @@ export const SETTINGS = {
|
||||||
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
||||||
default: "en",
|
default: "en",
|
||||||
},
|
},
|
||||||
"analyticsOptOut": {
|
"analyticsOptIn": {
|
||||||
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
||||||
displayName: _td('Opt out of analytics'),
|
displayName: _td('Send analytics data'),
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
"showCookieBar": {
|
||||||
|
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
||||||
|
displayName: _td('Show cookie bar'),
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
"autocompleteDelay": {
|
"autocompleteDelay": {
|
||||||
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
|
||||||
default: 200,
|
default: 200,
|
||||||
|
|
Loading…
Reference in a new issue