diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js
index d9ac9de693..abb2eb92aa 100644
--- a/src/components/structures/LoggedInView.js
+++ b/src/components/structures/LoggedInView.js
@@ -266,6 +266,7 @@ const LoggedInView = React.createClass({
const GroupView = sdk.getComponent('structures.GroupView');
const MyGroups = sdk.getComponent('structures.MyGroups');
const MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
+ const CookieBar = sdk.getComponent('globals.CookieBar');
const NewVersionBar = sdk.getComponent('globals.NewVersionBar');
const UpdateCheckBar = sdk.getComponent('globals.UpdateCheckBar');
const PasswordNagBar = sdk.getComponent('globals.PasswordNagBar');
@@ -353,7 +354,9 @@ const LoggedInView = React.createClass({
let topBar;
const isGuest = this.props.matrixClient.isGuest();
- if (this.props.hasNewVersion) {
+ if (this.props.showCookieBar) {
+ topBar = ;
+ } else if (this.props.hasNewVersion) {
topBar = ;
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 3005bc86ad..051b9ed10b 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -165,6 +165,8 @@ export default React.createClass({
newVersionReleaseNotes: null,
checkingForUpdate: null,
+ showCookieBar: false,
+
// Parameters used in the registration dance with the IS
register_client_secret: null,
register_session_id: null,
@@ -227,8 +229,6 @@ export default React.createClass({
componentWillMount: function() {
SdkConfig.put(this.props.config);
- if (!SettingsStore.getValue("analyticsOptOut")) Analytics.enable();
-
// Used by _viewRoom before getting state from sync
this.firstSyncComplete = false;
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
// to try logging out.
});
+
+ if (SettingsStore.getValue("showCookieBar")) {
+ this.setState({
+ showCookieBar: true,
+ });
+ }
+
+ if (SettingsStore.getValue("analyticsOptIn")) {
+ Analytics.enable();
+ }
},
componentWillUnmount: function() {
@@ -673,6 +683,23 @@ export default React.createClass({
hideToSRUsers: false,
});
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}
currentRoomId={this.state.currentRoomId}
teamToken={this._teamToken}
+ showCookieBar={this.state.showCookieBar}
{...this.props}
{...this.state}
/>
diff --git a/src/components/views/globals/CookieBar.js b/src/components/views/globals/CookieBar.js
new file mode 100644
index 0000000000..f1fbbcc83a
--- /dev/null
+++ b/src/components/views/globals/CookieBar.js
@@ -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) =>
+
+ { sub }
+ ;
+
+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 (
+
+
+
+ { _t(
+ "Help us improve Riot by sending usage data. " +
+ "This will use a cookie " +
+ "(see our
cookie and " +
+ "
privacy policies)",
+ {},
+ {
+ // XXX: We need to link to the page that explains our cookies
+ 'CookieLink': PrivacyLink,
+ 'PrivacyLink': PrivacyLink,
+ },
+ ) }
+
+
+ { _t("Send usage data") }
+
+
+
+
+
+ );
+ },
+});
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 957deb35c5..8f7d1c36eb 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -209,7 +209,8 @@
"Mirror local video feed": "Mirror local video feed",
"Disable Community Filter Panel": "Disable Community Filter Panel",
"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 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",
@@ -634,6 +635,8 @@
"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.",
"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 cookie and privacy policies)": "Help us improve Riot by sending usage data. This will use a cookie (see our cookie and privacy policies)",
+ "Send usage data": "Send usage data",
"You are not receiving desktop notifications": "You are not receiving desktop notifications",
"Enable them now": "Enable them now",
"What's New": "What's New",
diff --git a/src/settings/Settings.js b/src/settings/Settings.js
index 663318f990..8f50885c14 100644
--- a/src/settings/Settings.js
+++ b/src/settings/Settings.js
@@ -213,11 +213,16 @@ export const SETTINGS = {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
default: "en",
},
- "analyticsOptOut": {
+ "analyticsOptIn": {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
- displayName: _td('Opt out of analytics'),
+ displayName: _td('Send analytics data'),
default: false,
},
+ "showCookieBar": {
+ supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
+ displayName: _td('Show cookie bar'),
+ default: true,
+ },
"autocompleteDelay": {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
default: 200,