From f595e562eaf1ad063d55dc66dd3653048e24031d Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:16:19 -0700
Subject: [PATCH 01/10] Signup CTA first attempt
---
.../discourse/components/signup-cta.js.es6 | 56 ++++++++++++
.../discourse/initializers/signup-cta.js.es6 | 86 +++++++++++++++++++
.../discourse/lib/key-value-store.js.es6 | 8 ++
.../discourse/lib/screen-track.js.es6 | 70 ++++++++++-----
.../templates/components/signup-cta.hbs | 18 ++++
.../javascripts/discourse/templates/topic.hbs | 7 +-
app/assets/stylesheets/desktop/alert.scss | 7 ++
config/locales/client.en.yml | 16 ++++
config/site_settings.yml | 3 +
9 files changed, 248 insertions(+), 23 deletions(-)
create mode 100644 app/assets/javascripts/discourse/components/signup-cta.js.es6
create mode 100644 app/assets/javascripts/discourse/initializers/signup-cta.js.es6
create mode 100644 app/assets/javascripts/discourse/templates/components/signup-cta.hbs
diff --git a/app/assets/javascripts/discourse/components/signup-cta.js.es6 b/app/assets/javascripts/discourse/components/signup-cta.js.es6
new file mode 100644
index 00000000000..b1224306e89
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/signup-cta.js.es6
@@ -0,0 +1,56 @@
+export default Ember.Component.extend({
+ action: "showCreateAccount",
+
+ actions: {
+ neverShow() {
+ this.keyValueStore.setItem('anon-cta-never', 't');
+ this.session.set('showSignupCta', false);
+ },
+ hideForSession() {
+ this.session.set('hideSignupCta', true);
+ this.keyValueStore.setItem('anon-cta-hidden', new Date().getTime());
+ Em.run.later(() =>
+ this.session.set('showSignupCta', false),
+ 20 * 1000);
+ },
+ showCreateAccount() {
+ this.sendAction();
+ }
+ },
+
+ signupMethodsTranslated: function() {
+ const methods = Ember.get('Discourse.LoginMethod.all');
+ const loginWithEmail = this.siteSettings.enable_local_logins;
+ if (this.siteSettings.enable_sso) {
+ return I18n.t('signup_cta.methods.sso');
+ } else if (methods.length === 0) {
+ if (loginWithEmail) {
+ return I18n.t('signup_cta.methods.only_email');
+ } else {
+ return I18n.t('signup_cta.methods.unknown');
+ }
+ } else if (methods.length === 1) {
+ let providerName = methods[0].name.capitalize();
+ if (providerName === "Google_oauth2") {
+ providerName = "Google";
+ }
+ if (loginWithEmail) {
+ return I18n.t('signup_cta.methods.one_and_email', {provider: providerName});
+ } else {
+ return I18n.t('signup_cta.methods.only_other', {provider: providerName});
+ }
+ } else {
+ if (loginWithEmail) {
+ return I18n.t('signup_cta.methods.multiple', {count: methods.length});
+ } else {
+ return I18n.t('signup_cta.methods.multiple_no_email', {count: methods.length});
+ }
+ }
+ }.property(),
+
+ _turnOffIfHidden: function() {
+ if (this.session.get('hideSignupCta')) {
+ this.session.set('showSignupCta', false);
+ }
+ }.on('willDestroyElement')
+});
diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
new file mode 100644
index 00000000000..8b6011f3557
--- /dev/null
+++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
@@ -0,0 +1,86 @@
+import ScreenTrack from 'discourse/lib/screen-track';
+import Session from 'discourse/models/session';
+
+const ANON_TOPIC_IDS = 5,
+ ANON_PROMPT_READ_TIME = 15 * 60 * 1000,
+ ANON_PROMPT_VISIT_COUNT = 2,
+ ONE_DAY = 24 * 60 * 60 * 1000,
+ PROMPT_HIDE_DURATION = ONE_DAY;
+
+export default {
+ name: "signup-cta",
+
+ initialize(container) {
+ const screenTrack = ScreenTrack.current(),
+ session = Session.current(),
+ siteSettings = container.lookup('site-settings:main'),
+ keyValueStore = container.lookup('key-value-store:main'),
+ user = container.lookup('current-user:main');
+
+ // Preconditions
+
+ if (user) return; // must not be logged in
+ if (keyValueStore.get('anon-cta-never')) return; // "never show again"
+ if (!siteSettings.allow_new_registrations) return;
+ if (siteSettings.invite_only) return;
+ if (siteSettings.must_approve_users) return;
+ if (siteSettings.login_required) return;
+ if (!siteSettings.enable_signup_cta) return;
+
+ screenTrack.set('keyValueStore', keyValueStore);
+
+ function checkSignupCtaRequirements() {
+ if (session.get('showSignupCta')) {
+ return; // already shown
+ }
+
+ if (session.get('hideSignupCta')) {
+ return; // hidden for session
+ }
+
+ if (keyValueStore.get('anon-cta-never')) {
+ return; // hidden forever
+ }
+
+ const now = new Date().getTime();
+ const hiddenAt = keyValueStore.getInt('anon-cta-hidden', 0);
+ if (hiddenAt > (now - PROMPT_HIDE_DURATION)) {
+ return; // hidden in last 24 hours
+ }
+
+ const visitCount = keyValueStore.getInt('anon-visit-count');
+ if (visitCount < ANON_PROMPT_VISIT_COUNT) {
+ return;
+ }
+
+ const readTime = keyValueStore.getInt('anon-topic-time');
+ if (readTime < ANON_PROMPT_READ_TIME) {
+ return;
+ }
+
+ const topicIdsString = keyValueStore.get('anon-topic-ids');
+ if (!topicIdsString) { return; }
+ let topicIdsAry = topicIdsString.split(',');
+ if (topicIdsAry.length < ANON_TOPIC_IDS) {
+ return;
+ }
+
+ // Requirements met.
+ session.set('showSignupCta', true);
+ }
+
+ screenTrack.set('anonFlushCallback', checkSignupCtaRequirements);
+
+ // Record a visit
+ const nowVisit = new Date().getTime();
+ const lastVisit = keyValueStore.getInt('anon-last-visit', nowVisit);
+ if (nowVisit - lastVisit > ONE_DAY) {
+ // more than a day
+ const visitCount = keyValueStore.getInt('anon-visit-count', 1);
+ keyValueStore.setItem('anon-visit-count', visitCount + 1);
+ }
+ keyValueStore.setItem('anon-last-visit', nowVisit);
+
+ checkSignupCtaRequirements();
+ }
+};
diff --git a/app/assets/javascripts/discourse/lib/key-value-store.js.es6 b/app/assets/javascripts/discourse/lib/key-value-store.js.es6
index b5f13d024ca..8c1e13515cc 100644
--- a/app/assets/javascripts/discourse/lib/key-value-store.js.es6
+++ b/app/assets/javascripts/discourse/lib/key-value-store.js.es6
@@ -43,6 +43,14 @@ KeyValueStore.prototype = {
get(key) {
if (!safeLocalStorage) { return null; }
return safeLocalStorage[this.context + key];
+ },
+
+ getInt(key, def) {
+ if (!def) { def = 0; }
+ if (!safeLocalStorage) { return def; }
+ const result = parseInt(this.get(key));
+ if (!isFinite(result)) { return def; }
+ return result;
}
};
diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6
index 3d55418cfbf..345796ccc24 100644
--- a/app/assets/javascripts/discourse/lib/screen-track.js.es6
+++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6
@@ -3,12 +3,15 @@
import Singleton from 'discourse/mixins/singleton';
const PAUSE_UNLESS_SCROLLED = 1000 * 60 * 3,
- MAX_TRACKING_TIME = 1000 * 60 * 6;
+ MAX_TRACKING_TIME = 1000 * 60 * 6,
+ ANON_MAX_TOPIC_IDS = 5;
const ScreenTrack = Ember.Object.extend({
init() {
this.reset();
+ // TODO fix this
+ this.set('keyValueStore', Discourse.__container__.lookup('key-value-store:main'));
},
start(topicId, topicController) {
@@ -82,9 +85,6 @@ const ScreenTrack = Ember.Object.extend({
flush() {
if (this.get('cancelled')) { return; }
- // We don't log anything unless we're logged in
- if (!Discourse.User.current()) return;
-
const newTimings = {},
totalTimings = this.get('totalTimings'),
self = this;
@@ -115,26 +115,52 @@ const ScreenTrack = Ember.Object.extend({
Discourse.TopicTrackingState.current().updateSeen(topicId, highestSeen);
if (!$.isEmptyObject(newTimings)) {
- Discourse.ajax('/topics/timings', {
- data: {
- timings: newTimings,
- topic_time: this.get('topicTime'),
- topic_id: topicId
- },
- cache: false,
- type: 'POST',
- headers: {
- 'X-SILENCE-LOGGER': 'true'
+ if (Discourse.User.current()) {
+ Discourse.ajax('/topics/timings', {
+ data: {
+ timings: newTimings,
+ topic_time: this.get('topicTime'),
+ topic_id: topicId
+ },
+ cache: false,
+ type: 'POST',
+ headers: {
+ 'X-SILENCE-LOGGER': 'true'
+ }
+ }).then(function() {
+ const controller = self.get('topicController');
+ if (controller) {
+ const postNumbers = Object.keys(newTimings).map(function(v) {
+ return parseInt(v, 10);
+ });
+ controller.readPosts(topicId, postNumbers);
+ }
+ });
+ } else {
+ // Anonymous viewer - save to localStorage
+ const store = this.get('keyValueStore');
+
+ // Save total time
+ const existingTime = store.getInt('anon-topic-time');
+ store.setItem('anon-topic-time', existingTime + this.get('topicTime'));
+
+ // Save unique topic IDs up to a max
+ let topicIds = store.get('anon-topic-ids');
+ if (topicIds) {
+ topicIds = topicIds.split(',').map(e => parseInt(e));
+ } else {
+ topicIds = [];
}
- }).then(function(){
- const controller = self.get('topicController');
- if(controller){
- const postNumbers = Object.keys(newTimings).map(function(v){
- return parseInt(v,10);
- });
- controller.readPosts(topicId, postNumbers);
+ if (topicIds.indexOf(topicId) === -1 && topicIds.length < ANON_MAX_TOPIC_IDS) {
+ topicIds.push(topicId);
+ store.setItem('anon-topic-ids', topicIds.join(','));
}
- });
+
+ // Inform the observer
+ if (this.get('anonFlushCallback')) {
+ this.get('anonFlushCallback')();
+ }
+ }
this.set('topicTime', 0);
}
diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
new file mode 100644
index 00000000000..dee31249a80
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
@@ -0,0 +1,18 @@
+
+ {{#if session.hideSignupCta}}
+
{{i18n "signup_cta.hidden_for_session"}}
+
+ {{else}}
+
{{i18n "signup_cta.line_1"}}
+
{{i18n "signup_cta.line_2"}}
+
{{signupMethodsTranslated}}
+
+
+ {{/if}}
+
diff --git a/app/assets/javascripts/discourse/templates/topic.hbs b/app/assets/javascripts/discourse/templates/topic.hbs
index 0a38e3d5748..986b8321ad5 100644
--- a/app/assets/javascripts/discourse/templates/topic.hbs
+++ b/app/assets/javascripts/discourse/templates/topic.hbs
@@ -87,7 +87,12 @@
{{#if loadedAllPosts}}
{{view "topic-closing" topic=model}}
- {{view "topic-footer-buttons" topic=model}}
+ {{#if session.showSignupCta}}
+ {{! replace "Log In to Reply" with the infobox }}
+ {{signup-cta}}
+ {{else}}
+ {{view "topic-footer-buttons" topic=model}}
+ {{/if}}
{{#if model.pending_posts_count}}
diff --git a/app/assets/stylesheets/desktop/alert.scss b/app/assets/stylesheets/desktop/alert.scss
index eead66319aa..f019918a29b 100644
--- a/app/assets/stylesheets/desktop/alert.scss
+++ b/app/assets/stylesheets/desktop/alert.scss
@@ -1,3 +1,10 @@
.alert {
margin-bottom: 15px;
}
+.signup-cta {
+ margin-top: 15px;
+ a {
+ float: right;
+ text-decoration: underline;
+ }
+}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 7fe190f1573..cd3a3b2d265 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -712,6 +712,22 @@ en:
one: reply
other: replies
+ signup_cta:
+ sign_up: "Sounds great!"
+ hide_session: "Maybe later"
+ hide_forever: "Never show this again"
+ hidden_for_session: "OK, I'll ask you tomorrow. You can always click the 'Log In' button to create an account, too."
+ line_1: Hey there! Looks like you're enjoying the forum, but you're not signed up for an account.
+ line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and give likes to others' posts.
+ methods:
+ sso: "Use your account on the main site to log in."
+ only_email: "You just need a valid email account to sign up."
+ only_other: "Just use your %{provider} account to sign up."
+ one_and_email: "Juse use your %{provider} account or your email to sign up."
+ multiple_no_email: "Choose from any of the %{count} supported login providers to get started."
+ multiple: "Signing up couldn't be easier: use any of the %{count} available login providers, or sign up with an email and password."
+ unknown: "error getting supported login methods"
+
summary:
enabled_description: "You're viewing a summary of this topic: the most interesting posts as determined by the community."
description: "There are
{{count}} replies."
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 7400d216e01..950555724b1 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -199,6 +199,9 @@ login:
allow_new_registrations:
client: true
default: true
+ enable_signup_cta:
+ client: true
+ default: true
enable_google_oauth2_logins:
client: true
default: false
From 65192a09a681b5dc2e149155b60f8c62c7b8b770 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:20:24 -0700
Subject: [PATCH 02/10] copyedits
---
config/locales/client.en.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index cd3a3b2d265..7c436af9eea 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -721,9 +721,9 @@ en:
line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and give likes to others' posts.
methods:
sso: "Use your account on the main site to log in."
- only_email: "You just need a valid email account to sign up."
- only_other: "Just use your %{provider} account to sign up."
- one_and_email: "Juse use your %{provider} account or your email to sign up."
+ only_email: "Signing up is easy: you just need a valid email account and a password."
+ only_other: "Use your %{provider} account to sign up."
+ one_and_email: "Use your %{provider} account, or an email and password, to sign up."
multiple_no_email: "Choose from any of the %{count} supported login providers to get started."
multiple: "Signing up couldn't be easier: use any of the %{count} available login providers, or sign up with an email and password."
unknown: "error getting supported login methods"
From 118f8227f1ac1f6495459af4965f757c8cb05ebb Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:23:57 -0700
Subject: [PATCH 03/10] Fix never link after clicking maybe later
---
.../discourse/templates/components/signup-cta.hbs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
index dee31249a80..71e59c4a803 100644
--- a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
+++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
@@ -1,9 +1,9 @@
{{#if session.hideSignupCta}}
-
{{i18n "signup_cta.hidden_for_session"}}
-
+
{{else}}
{{i18n "signup_cta.line_1"}}
{{i18n "signup_cta.line_2"}}
From 940b79ed5b2c4666d50391d49f7812f8f1514313 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:40:25 -0700
Subject: [PATCH 04/10] more copyedits
---
config/locales/client.en.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 7c436af9eea..16940aaa2cf 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -713,12 +713,12 @@ en:
other: replies
signup_cta:
- sign_up: "Sounds great!"
- hide_session: "Maybe later"
+ sign_up: "Sign Up"
+ hide_session: "Remind me tomorrow"
hide_forever: "Never show this again"
hidden_for_session: "OK, I'll ask you tomorrow. You can always click the 'Log In' button to create an account, too."
- line_1: Hey there! Looks like you're enjoying the forum, but you're not signed up for an account.
- line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and give likes to others' posts.
+ line_1: Looks like you're enjoying the forum, but you're not signed up for an account.
+ line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and you can give likes to others' posts.
methods:
sso: "Use your account on the main site to log in."
only_email: "Signing up is easy: you just need a valid email account and a password."
From d7a79aeb8a7d356981ce927d3c2107c3895c7196 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:49:45 -0700
Subject: [PATCH 05/10] Fix mobile styling
---
.../discourse/templates/components/signup-cta.hbs | 1 +
app/assets/stylesheets/desktop/alert.scss | 7 -------
app/assets/stylesheets/desktop/topic-post.scss | 8 ++++++++
app/assets/stylesheets/mobile/topic-post.scss | 15 +++++++++++++++
4 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
index 71e59c4a803..defda14fab6 100644
--- a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
+++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
@@ -15,4 +15,5 @@
{{i18n "signup_cta.hide_forever"}}
{{/if}}
+
diff --git a/app/assets/stylesheets/desktop/alert.scss b/app/assets/stylesheets/desktop/alert.scss
index f019918a29b..eead66319aa 100644
--- a/app/assets/stylesheets/desktop/alert.scss
+++ b/app/assets/stylesheets/desktop/alert.scss
@@ -1,10 +1,3 @@
.alert {
margin-bottom: 15px;
}
-.signup-cta {
- margin-top: 15px;
- a {
- float: right;
- text-decoration: underline;
- }
-}
diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss
index 41409878ff5..df6a7d34503 100644
--- a/app/assets/stylesheets/desktop/topic-post.scss
+++ b/app/assets/stylesheets/desktop/topic-post.scss
@@ -971,6 +971,14 @@ span.highlighted {
transition: opacity ease-out 1s;
}
+.signup-cta {
+ margin-top: 15px;
+ width: $topic-body-width;
+ a {
+ float: right;
+ text-decoration: underline;
+ }
+}
/* Tablet (portrait) ----------- */
diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss
index ef1bbbe8b33..9c1c6a3dd57 100644
--- a/app/assets/stylesheets/mobile/topic-post.scss
+++ b/app/assets/stylesheets/mobile/topic-post.scss
@@ -509,6 +509,21 @@ span.highlighted {
display: none;
}
+.signup-cta {
+ margin-top: 15px;
+ margin-left: auto;
+ margin-right: auto;
+ width: calc(100% - 50px);
+ a {
+ float: right;
+ text-decoration: underline;
+ margin-top: 7px;
+ }
+ button {
+ margin-right: 7px;
+ }
+}
+
.small-action .small-action-desc {
p {
padding-top: 0;
From 8b37dadec77033c02d4f1b442481609b00a33825 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 1 Sep 2015 16:52:29 -0700
Subject: [PATCH 06/10] remove TODO
---
.../javascripts/discourse/initializers/signup-cta.js.es6 | 4 ++--
app/assets/javascripts/discourse/lib/screen-track.js.es6 | 2 --
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
index 8b6011f3557..cc25f64cb8d 100644
--- a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
+++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
@@ -17,6 +17,8 @@ export default {
keyValueStore = container.lookup('key-value-store:main'),
user = container.lookup('current-user:main');
+ screenTrack.set('keyValueStore', keyValueStore);
+
// Preconditions
if (user) return; // must not be logged in
@@ -27,8 +29,6 @@ export default {
if (siteSettings.login_required) return;
if (!siteSettings.enable_signup_cta) return;
- screenTrack.set('keyValueStore', keyValueStore);
-
function checkSignupCtaRequirements() {
if (session.get('showSignupCta')) {
return; // already shown
diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6
index 345796ccc24..26451f433cd 100644
--- a/app/assets/javascripts/discourse/lib/screen-track.js.es6
+++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6
@@ -10,8 +10,6 @@ const ScreenTrack = Ember.Object.extend({
init() {
this.reset();
- // TODO fix this
- this.set('keyValueStore', Discourse.__container__.lookup('key-value-store:main'));
},
start(topicId, topicController) {
From 62444b9a13aaa0441dc3716229786a0893147065 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 15 Sep 2015 12:25:12 -0700
Subject: [PATCH 07/10] Fix the visit tracking logic
---
.../discourse/initializers/signup-cta.js.es6 | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
index cc25f64cb8d..d83a6ecf5da 100644
--- a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
+++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6
@@ -73,13 +73,17 @@ export default {
// Record a visit
const nowVisit = new Date().getTime();
- const lastVisit = keyValueStore.getInt('anon-last-visit', nowVisit);
- if (nowVisit - lastVisit > ONE_DAY) {
- // more than a day
+ const lastVisit = keyValueStore.getInt('anon-last-visit', 0);
+ if (!lastVisit) {
+ // First visit
+ keyValueStore.setItem('anon-visit-count', 1);
+ keyValueStore.setItem('anon-last-visit', nowVisit);
+ } else if (nowVisit - lastVisit > ONE_DAY) {
+ // More than a day
const visitCount = keyValueStore.getInt('anon-visit-count', 1);
keyValueStore.setItem('anon-visit-count', visitCount + 1);
+ keyValueStore.setItem('anon-last-visit', nowVisit);
}
- keyValueStore.setItem('anon-last-visit', nowVisit);
checkSignupCtaRequirements();
}
From 41721b0898c521be5f23ff4def0bf206444a67cf Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 15 Sep 2015 12:25:29 -0700
Subject: [PATCH 08/10] Rename variables
---
.../javascripts/discourse/lib/screen-track.js.es6 | 12 +++++++-----
.../discourse/templates/components/signup-cta.hbs | 4 ++--
config/locales/client.en.yml | 4 ++--
3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6
index 26451f433cd..8fe233401b5 100644
--- a/app/assets/javascripts/discourse/lib/screen-track.js.es6
+++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6
@@ -136,14 +136,14 @@ const ScreenTrack = Ember.Object.extend({
});
} else {
// Anonymous viewer - save to localStorage
- const store = this.get('keyValueStore');
+ const storage = this.get('keyValueStore');
// Save total time
- const existingTime = store.getInt('anon-topic-time');
- store.setItem('anon-topic-time', existingTime + this.get('topicTime'));
+ const existingTime = storage.getInt('anon-topic-time');
+ storage.setItem('anon-topic-time', existingTime + this.get('topicTime'));
// Save unique topic IDs up to a max
- let topicIds = store.get('anon-topic-ids');
+ let topicIds = storage.get('anon-topic-ids');
if (topicIds) {
topicIds = topicIds.split(',').map(e => parseInt(e));
} else {
@@ -151,13 +151,15 @@ const ScreenTrack = Ember.Object.extend({
}
if (topicIds.indexOf(topicId) === -1 && topicIds.length < ANON_MAX_TOPIC_IDS) {
topicIds.push(topicId);
- store.setItem('anon-topic-ids', topicIds.join(','));
+ storage.setItem('anon-topic-ids', topicIds.join(','));
}
// Inform the observer
if (this.get('anonFlushCallback')) {
this.get('anonFlushCallback')();
}
+
+ // No need to call controller.readPosts()
}
this.set('topicTime', 0);
diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
index defda14fab6..818f66cd841 100644
--- a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
+++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs
@@ -5,8 +5,8 @@
{{i18n "signup_cta.hide_forever"}}
{{else}}
- {{i18n "signup_cta.line_1"}}
- {{i18n "signup_cta.line_2"}}
+ {{i18n "signup_cta.intro"}}
+ {{i18n "signup_cta.value_prop"}}
{{signupMethodsTranslated}}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 16940aaa2cf..283b9bdbd19 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -717,8 +717,8 @@ en:
hide_session: "Remind me tomorrow"
hide_forever: "Never show this again"
hidden_for_session: "OK, I'll ask you tomorrow. You can always click the 'Log In' button to create an account, too."
- line_1: Looks like you're enjoying the forum, but you're not signed up for an account.
- line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and you can give likes to others' posts.
+ intro: Hey there! Looks like you're enjoying the forum, but you're not signed up for an account.
+ value_prop: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and you can give likes to others' posts.
methods:
sso: "Use your account on the main site to log in."
only_email: "Signing up is easy: you just need a valid email account and a password."
From 2e2fa693f501b417f307e4b11e6f1c8b67443fc6 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 15 Sep 2015 12:42:14 -0700
Subject: [PATCH 09/10] You need to translate the site settings, dummy
---
config/locales/server.en.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 4c03b835c6f..2d48c8f5230 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -920,6 +920,7 @@ en:
enable_local_logins: "Enable local username and password login based accounts. (Note: this must be enabled for invites to work)"
allow_new_registrations: "Allow new user registrations. Uncheck this to prevent anyone from creating a new account."
+ enable_signup_cta: "Show a notice to returning anonymous users prompting them to sign up for an account."
enable_yahoo_logins: "Enable Yahoo authentication"
enable_google_oauth2_logins: "Enable Google Oauth2 authentication. This is the method of authentication that Google currently supports. Requires key and secret."
From 53c5c17625282bea7a577bd58bc73981b05bf186 Mon Sep 17 00:00:00 2001
From: Kane York
Date: Tue, 15 Sep 2015 13:14:50 -0700
Subject: [PATCH 10/10] Add ember-addons to eslintignore
---
.eslintignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.eslintignore b/.eslintignore
index 1ecda00738c..5b61bf6c51f 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -7,6 +7,7 @@ app/assets/javascripts/vendor.js
app/assets/javascripts/locales/i18n.js
app/assets/javascripts/defer/html-sanitizer-bundle.js
app/assets/javascripts/discourse/lib/Markdown.Editor.js
+app/assets/javascripts/ember-addons/
jsapp/lib/Markdown.Editor.js
lib/javascripts/locale/
lib/javascripts/messageformat.js