Skip to content

Commit 3bd9b02

Browse files
committed
added opt-in newsletter to checkout
1 parent d5b3c27 commit 3bd9b02

File tree

10 files changed

+59
-29
lines changed

10 files changed

+59
-29
lines changed

assets/js/androidkey.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22

33
// requires store.js
4+
// requires newsletter.js
45

56
class AndroidLicense {
67

@@ -46,7 +47,10 @@ class AndroidLicense {
4647
locale: locale,
4748
successCallback: data => {
4849
this.onCheckoutSucceeded();
49-
this.getPaddleOrderDetails(data.checkout.id)
50+
this.getPaddleOrderDetails(data.checkout.id);
51+
if (this._checkoutData.acceptNewsletter) {
52+
subscribeToNewsletter(data.user.email, 6);
53+
}
5054
},
5155
closeCallback: () => {
5256
this._checkoutData.inProgress = false;

assets/js/desktopkey.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22

33
// requires store.js
4+
// requires newsletter.js
45

56
class DesktopLicense {
67

@@ -56,13 +57,16 @@ class DesktopLicense {
5657
locale: locale,
5758
successCallback: data => {
5859
this.onCheckoutSucceeded();
59-
this.getPaddleOrderDetails(data.checkout.id)
60+
this.getPaddleOrderDetails(data.checkout.id);
61+
if (this._checkoutData.acceptNewsletter) {
62+
subscribeToNewsletter(data.user.email, 6);
63+
}
6064
},
6165
closeCallback: () => {
6266
this._checkoutData.inProgress = false;
6367
}
6468
});
65-
})
69+
});
6670
}
6771

6872
getPaddleOrderDetails(checkoutId) {

assets/js/newsletter.js

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
"use strict";
2+
13
const SUBSCRIBE_NEWSLETTER_URL = 'https://api.cryptomator.org/listmonk/subscribe.php';
24

35
class Newsletter {
@@ -17,28 +19,10 @@ class Newsletter {
1719
this._data.inProgress = true;
1820
this._data.errorMessage = '';
1921
this._data.success = false;
20-
$.ajax({
21-
url: SUBSCRIBE_NEWSLETTER_URL,
22-
type: 'GET',
23-
xhrFields: {
24-
withCredentials: true
25-
}
26-
}).done(_ => {
27-
$.ajax({
28-
url: SUBSCRIBE_NEWSLETTER_URL,
29-
type: 'POST',
30-
data: {
31-
email: this._data.email,
32-
listid: this._data.listId
33-
},
34-
xhrFields: {
35-
withCredentials: true
36-
}
37-
}).done(_ => {
38-
this.onSubscribeSucceeded();
39-
}).fail(xhr => {
40-
this.onSubscribeFailed(xhr.responseJSON?.message || 'Subscribing to newsletter failed.');
41-
});
22+
subscribeToNewsletter(
23+
this._data.email, this._data.listId
24+
).done(() => {
25+
this.onSubscribeSucceeded();
4226
}).fail(xhr => {
4327
this.onSubscribeFailed(xhr.responseJSON?.message || 'Subscribing to newsletter failed.');
4428
});
@@ -55,5 +39,26 @@ class Newsletter {
5539
this._data.errorMessage = '';
5640
this._data.inProgress = false;
5741
}
42+
}
5843

44+
function subscribeToNewsletter(email, listId) {
45+
return $.ajax({
46+
url: SUBSCRIBE_NEWSLETTER_URL,
47+
type: 'GET',
48+
xhrFields: {
49+
withCredentials: true
50+
}
51+
}).then(() => {
52+
return $.ajax({
53+
url: SUBSCRIBE_NEWSLETTER_URL,
54+
type: 'POST',
55+
data: {
56+
email: email,
57+
listid: listId
58+
},
59+
xhrFields: {
60+
withCredentials: true
61+
}
62+
});
63+
});
5964
}

i18n/de.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
translation: "Rechtliches"
2323
- id: accept_newsletter_privacy
2424
translation: "Ich bin damit einverstanden, Neuigkeiten von Cryptomator zu erhalten, und akzeptiere die <a class=\"text-primary no-underline hover:underline\" href=\"/de/privacy/\">Datenschutzerklärung</a>."
25+
- id: accept_newsletter_optional
26+
translation: "Ich bin damit einverstanden, Neuigkeiten von Cryptomator per E-Mail zu erhalten (optional)."
2527
- id: accept_privacy
2628
translation: "Ich akzeptiere die <a class=\"text-primary no-underline hover:underline\" href=\"/de/privacy/\">Datenschutzerklärung</a>."
2729
- id: accept_privacy_implicitly

i18n/en.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
translation: "Legal"
2323
- id: accept_newsletter_privacy
2424
translation: "I agree to get updates from Cryptomator and accept the <a class=\"text-primary no-underline hover:underline\" href=\"/privacy/\">Privacy Policy</a>."
25+
- id: accept_newsletter_optional
26+
translation: "I agree to get updates from Cryptomator via email (optional)."
2527
- id: accept_privacy
2628
translation: "I accept the <a class=\"text-primary no-underline hover:underline\" href=\"/privacy/\">Privacy Policy</a>."
2729
- id: accept_privacy_implicitly

layouts/android/single.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,17 @@ <h3 id="keyrecovery" class="font-headline text-xl md:text-2xl leading-relaxed mb
5050
{{ if hugo.IsDevelopment }}
5151
{{ $storeJs := resources.Get "js/store.js" }}
5252
<script type="text/javascript" src="{{ $storeJs.RelPermalink }}" defer></script>
53+
{{ $newsletterJs := resources.Get "js/newsletter.js" }}
54+
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
5355
{{ $keyRecoveryJs := resources.Get "js/keyrecovery.js" }}
5456
<script type="text/javascript" src="{{ $keyRecoveryJs.RelPermalink }}" defer></script>
5557
{{ $androidKeyJs := resources.Get "js/androidkey.js" }}
5658
<script type="text/javascript" src="{{ $androidKeyJs.RelPermalink }}" defer></script>
5759
{{ else }}
5860
{{ $storeJs := resources.Get "js/store.js" | minify | fingerprint }}
5961
<script type="text/javascript" src="{{ $storeJs.RelPermalink }}" integrity="{{ $storeJs.Data.Integrity }}" defer></script>
62+
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
63+
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
6064
{{ $keyRecoveryJs := resources.Get "js/keyrecovery.js" | minify | fingerprint }}
6165
<script type="text/javascript" src="{{ $keyRecoveryJs.RelPermalink }}" integrity="{{ $keyRecoveryJs.Data.Integrity }}" defer></script>
6266
{{ $androidKeyJs := resources.Get "js/androidkey.js" | minify | fingerprint }}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{ $unique_id := printf "id-%s" (delimit (shuffle (seq 1 9)) "") }}
2+
<input class="mr-1 rounded text-primary focus:ring-0 focus:ring-offset-0 focus:border-secondary" type="checkbox" id="{{ $unique_id }}" x-model="{{ .alpineVariable }}" />
3+
<label for="{{ $unique_id }}">{{ i18n "accept_newsletter_optional" . }}</label>

layouts/partials/android-getkey.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div x-data="{checkoutData: {price: null, email: '', errorMessage: '', success: false, inProgress: false, licenseKey: null}, acceptTerms: false, androidLicense: null}" x-init="androidLicense = new AndroidLicense($refs.form, checkoutData); androidLicense.loadPrice()" class="rounded-sm shadow-sm bg-white">
1+
<div x-data="{checkoutData: {price: null, email: '', errorMessage: '', success: false, inProgress: false, licenseKey: null, acceptNewsletter: false}, acceptTerms: false, androidLicense: null}" x-init="androidLicense = new AndroidLicense($refs.form, checkoutData); androidLicense.loadPrice()" class="rounded-sm shadow-sm bg-white">
22
<div class="prose prose-sm max-w-none md:max-w-none px-4 py-2 border-b border-primary text-center">
33
<h3>{{ i18n "android_getkey_title" }}</h3>
44
</div>
@@ -14,7 +14,8 @@ <h3>{{ i18n "android_getkey_title" }}</h3>
1414
</div>
1515
<div class="text-center mt-8">
1616
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ i18n "android_getkey_instruction" }}</p>
17-
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ partial "accept-terms-and-privacy.html" (dict "context" . "alpineVariable" "acceptTerms") }}</p>
17+
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-2">{{ partial "accept-terms-and-privacy.html" (dict "context" . "alpineVariable" "acceptTerms") }}</p>
18+
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ partial "accept-newsletter-optional.html" (dict "context" . "alpineVariable" "checkoutData.acceptNewsletter") }}</p>
1819
<button :disabled="checkoutData.inProgress || !acceptTerms" @click.prevent="androidLicense.checkout('{{ .Site.Language.Lang }}')" type="submit" class="btn btn-primary w-full md:w-64 plausible-event-name=android-getkey-checkout">
1920
<i x-show="!checkoutData.inProgress" class="fas fa-shopping-cart fa-fw" aria-hidden="true"></i><i x-show="checkoutData.inProgress" class="fas fa-spinner fa-spin fa-fw" aria-hidden="true"></i> {{ i18n "android_getkey_checkout" }}
2021
</button>

layouts/partials/supporter-cert-funder.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div x-data="{checkoutData: {prices: PADDLE_DESKTOP_PRODUCT_IDS.map(productId => { return {productId: productId} }), selectedPriceIndex: 1, quantity: 1, amount: 25, email: '', errorMessage: '', success: false, inProgress: false, licenseKey: null}, acceptTerms: false, desktopLicense: null}" x-init="desktopLicense = new DesktopLicense($refs.funderForm, checkoutData); desktopLicense.loadPrice()">
1+
<div x-data="{checkoutData: {prices: PADDLE_DESKTOP_PRODUCT_IDS.map(productId => { return {productId: productId} }), selectedPriceIndex: 1, quantity: 1, amount: 25, email: '', errorMessage: '', success: false, inProgress: false, licenseKey: null, acceptNewsletter: false}, acceptTerms: false, desktopLicense: null}" x-init="desktopLicense = new DesktopLicense($refs.funderForm, checkoutData); desktopLicense.loadPrice()">
22
<form x-show="!checkoutData.success" x-ref="funderForm">
33
<div class="flex flex-wrap md:flex-nowrap">
44
<fieldset class="w-full mb-4 md:w-1/2 md:pr-3">
@@ -25,7 +25,8 @@
2525
</div>
2626
<div class="text-center mt-8">
2727
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ i18n "supporter_cert_funder_instruction" }}</p>
28-
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ partial "accept-terms-and-privacy.html" (dict "context" . "alpineVariable" "acceptTerms") }}</p>
28+
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-2">{{ partial "accept-terms-and-privacy.html" (dict "context" . "alpineVariable" "acceptTerms") }}</p>
29+
<p class="text-sm md:text-base leading-relaxed text-gray-700 mb-4">{{ partial "accept-newsletter-optional.html" (dict "context" . "alpineVariable" "checkoutData.acceptNewsletter") }}</p>
2930
<button :disabled="checkoutData.inProgress || !acceptTerms" @click.prevent="desktopLicense.checkout(checkoutData.prices[checkoutData.selectedPriceIndex].productId, '{{ .Site.Language.Lang }}')" type="submit" class="btn btn-primary w-full md:w-64 plausible-event-name=supporter-cert-funder-checkout">
3031
<i :class="{'fa-shopping-cart': !checkoutData.inProgress, 'fa-spinner fa-spin': checkoutData.inProgress}" class="fas fa-fw" aria-hidden="true"></i> {{ i18n "supporter_cert_funder_checkout" }}
3132
</button>

layouts/supporter-cert/list.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ <h2 id="faq" class="font-headline font-medium text-xl md:text-2xl leading-snug m
8989
{{ if hugo.IsDevelopment }}
9090
{{ $storeJs := resources.Get "js/store.js" }}
9191
<script type="text/javascript" src="{{ $storeJs.RelPermalink }}" defer></script>
92+
{{ $newsletterJs := resources.Get "js/newsletter.js" }}
93+
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
9294
{{ $desktopKeyJs := resources.Get "js/desktopkey.js" }}
9395
<script type="text/javascript" src="{{ $desktopKeyJs.RelPermalink }}" defer></script>
9496
{{ $recaptchaJs := resources.Get "js/recaptcha.js" }}
@@ -100,6 +102,8 @@ <h2 id="faq" class="font-headline font-medium text-xl md:text-2xl leading-snug m
100102
{{ else }}
101103
{{ $storeJs := resources.Get "js/store.js" | minify | fingerprint }}
102104
<script type="text/javascript" src="{{ $storeJs.RelPermalink }}" integrity="{{ $storeJs.Data.Integrity }}" defer></script>
105+
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
106+
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
103107
{{ $desktopKeyJs := resources.Get "js/desktopkey.js" | minify | fingerprint }}
104108
<script type="text/javascript" src="{{ $desktopKeyJs.RelPermalink }}" integrity="{{ $desktopKeyJs.Data.Integrity }}" defer></script>
105109
{{ $recaptchaJs := resources.Get "js/recaptcha.js" | minify | fingerprint }}

0 commit comments

Comments
 (0)