From 5e7e055539ce2176969ac949fabd9c957d2fef52 Mon Sep 17 00:00:00 2001 From: Eva Date: Tue, 22 Mar 2022 18:27:06 +0100 Subject: [PATCH] :tada: Add newsletter subscription modal --- CHANGES.md | 1 + backend/src/app/rpc/mutations/profile.clj | 17 ++++- frontend/resources/images/deco-news-left.png | Bin 0 -> 1265 bytes frontend/resources/images/deco-news-right.png | Bin 0 -> 1412 bytes frontend/resources/images/deco-newsletter.png | Bin 0 -> 25371 bytes .../main/partials/dashboard-settings.scss | 32 +++++++++ .../resources/styles/main/partials/modal.scss | 68 ++++++++++++++++++ frontend/src/app/main/data/users.cljs | 3 +- .../src/app/main/ui/components/forms.cljs | 21 +++--- frontend/src/app/main/ui/onboarding.cljs | 3 +- .../app/main/ui/onboarding/newsletter.cljs | 47 ++++++++++++ .../src/app/main/ui/settings/profile.cljs | 19 ++++- frontend/translations/en.po | 38 +++++++++- frontend/translations/es.po | 40 ++++++++++- 14 files changed, 270 insertions(+), 19 deletions(-) create mode 100644 frontend/resources/images/deco-news-left.png create mode 100644 frontend/resources/images/deco-news-right.png create mode 100644 frontend/resources/images/deco-newsletter.png create mode 100644 frontend/src/app/main/ui/onboarding/newsletter.cljs diff --git a/CHANGES.md b/CHANGES.md index 473c1adb6..a1381635d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ ### :arrow_up: Deps updates ### :heart: Community contributions by (Thank you!) + ## 1.13.0-beta ### :boom: Breaking changes diff --git a/backend/src/app/rpc/mutations/profile.clj b/backend/src/app/rpc/mutations/profile.clj index 5834b0588..2749c2b4a 100644 --- a/backend/src/app/rpc/mutations/profile.clj +++ b/backend/src/app/rpc/mutations/profile.clj @@ -342,13 +342,26 @@ ;; --- MUTATION: Update Profile (own) +(defn- update-profile-newsletter-subscribed + [conn profile-id newsletter-subscribed] + (let [profile (profile/retrieve-profile-data conn profile-id) + props (:props profile) + props (assoc props :newsletter-subscribed newsletter-subscribed) + ] + (db/update! conn :profile + {:props (db/tjson props)} + {:id profile-id}))) + (defn- update-profile - [conn {:keys [id fullname lang theme] :as params}] + [conn {:keys [id fullname lang theme newsletter-subscribed] :as params}] (let [profile (db/update! conn :profile {:fullname fullname :lang lang :theme theme} - {:id id})] + {:id id}) + profile (if (some? newsletter-subscribed) + (update-profile-newsletter-subscribed conn id newsletter-subscribed) + profile)] (-> profile (profile/decode-profile-row) (profile/strip-private-attrs)))) diff --git a/frontend/resources/images/deco-news-left.png b/frontend/resources/images/deco-news-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a705b264011338a3b3e6124d1d8b3b185a0b2769 GIT binary patch literal 1265 zcmbW1{Xf$Q0D!;SOf#|4nY@;lvfR99cRIA(G#d>&cgC$!n47oySYDFK%jUJTT29pM zNS7KzOEKApczLy_6HW`27f;YirVI{q<**})$vkjJ$8AZ64W za-+*oM>K%O#(^$DVa779Q^$TmUSHwUf+A~4pUY(UFgfJj@bJMW4~kcgmRuWJj;#E# zdY@a^cs`-QA6o(7fKD(D?gt45{2*Q+R{KUZedG;hh5RzG^!~ zL>VD=u%xLY6xysIS|G_4?NPcelH(OB`cWee2@l?hIwtT{GE+uman6}16e>c-RW&33 z79_8XOVfz%&0mJ{TC(c?MLnGbPlcHRxZ5XpfAU|M*`ZE@uB2YK z2!z=)w|yyiaYtG+U%YbdAIa|WzrNbF-^^=j2B1j5O9P`Xl8md*WID*K6QP;>f3$7h zx^!QaLwY5@TY0MK8k-SN?)}Eb+;Z>R$WpE2c) z{l4|eoz5)yxV(lc8vbbUwK-8-n8-4%&E6gxtDw8O_ris4bNQ6@)7eVL$^2{@ei(t* z>UOeIDJ9e}8k;8|9EHqa6 zYq`F<%i}P{uKe%ljAq4@&prz%%Y7GOEm-XS=(S-xT-4GucYb+V5OG4?(qw7vIS}t=Fs!`$9E)1AG3H^ByVgm(_o7Ty=a zO0h%~HF^akx9=H?e{CfkBP{XoQu^@OYec?X3vtlnr}1K2*LOTSflp463YS;EQJcu7 z4$e>5HkSGK%&hVjl)kbBX)(9KZ5Dj$8^IaN<}}aQ7a#C>qfG-s)9H?oxzPiO9P5^< z#T?|zCl`7!BRq257&c5RhkX%aoCN+ V^@oaGpKU%2AOw+c&4IB6{{xLJNbdju literal 0 HcmV?d00001 diff --git a/frontend/resources/images/deco-news-right.png b/frontend/resources/images/deco-news-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f8feec2614e2fbe157cdd95564c47eb1dd575617 GIT binary patch literal 1412 zcmcK3|3A|S90%~x<5IqaJc`Jchb5z8VX9CbrY^ z{d)Lz8q-m8%#@VW@}*6fZ>w(ZklC4Snqjy8h{>09c9Kp-RF zoF7V?2oOlecgJ?^M;#b@rwtt<%HIdX8rr`A0)68R_?-^VsFaNNMpywR{VT1HDIwEu z{bKj`x|v#Folmy>3^LX6&}}#U(e~RSkQ&;1#zWWL)MEF<%?jaKpya_pm*=)Op@#f* z4d>bAv-OKj%jMvmzyOCgT-6trWuwr`;W}aU0OoL|fZin6z{eW^8*x?NKY{bG2q-M^ z39{o&c@)OZ)pu5yv;3kucaO0TW!hO)0`0tVJQ0rwGIJ3hI^88?Jgk5-u|wtY15=JP z>wq5X_H|YB%DThLy!+fuF`ttrE=V?^?^F?dyB5kH+hNH`LC$lrF=3}X%Uz>G=a%*0 zQy$k;{`7nG6}3P$$Ob{d%WCD=`Pc*0;L3%HsU(?kEn-SX6YLyRTg_FO#H|Nm^JC|}w_))kXUL6hVK zlq~2qDKO<64JnOd6P&lyGYNt@C9W9a}R`Zh|kH?vv4DDMSYWZ?^3+ zwTo1#XVk-p<;6#KK>lP+cZWt-wMos*z|)ULC)PhlLgLsfzZs!5x9W4lQ{a(zjjfTQ zJUu6XnRzH+J&a$*v!dfXZaH45py7=YN5p%U%wN>oN2JnmzxT6LoT&FtBJ@X0+)wksv5RJ!X zjD99Z!Re;zYKi~nf0CD=ex*pYQ(ZzOpa1bJ!`0bRZ(Kwn4Fos6v)S zcR4TpOGU}`Se_eUA`GP~Qw+lDHab_@vZ>u8Zc92e zqUL^f@LK*_uWmgth)`+gJlHzSdsySpx$|(2!<3~{_}nEl$1szF$#Fec zwW~oHv@i-b$3JjzGMXKQzOG+YHz+*}+%uY%(#i5saMFW@oZf0A&$w*T;v*uf@EUs% R(!lu&4mcC+$MT8I{SU=}o=*S( literal 0 HcmV?d00001 diff --git a/frontend/resources/images/deco-newsletter.png b/frontend/resources/images/deco-newsletter.png new file mode 100644 index 0000000000000000000000000000000000000000..d322c62b82e8693c9265bcfd44384bee1564d8df GIT binary patch literal 25371 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 literal 0 HcmV?d00001 diff --git a/frontend/resources/styles/main/partials/dashboard-settings.scss b/frontend/resources/styles/main/partials/dashboard-settings.scss index c5c19597b..d45d1661e 100644 --- a/frontend/resources/styles/main/partials/dashboard-settings.scss +++ b/frontend/resources/styles/main/partials/dashboard-settings.scss @@ -109,6 +109,38 @@ flex-direction: column; max-width: 368px; width: 100%; + + .newsletter-subs { + border-bottom: 1px solid $color-gray-20; + border-top: 1px solid $color-gray-20; + padding: 30px 0; + margin-bottom: 31px; + + .newsletter-title { + font-family: "worksans", sans-serif; + color: $color-gray-30; + font-size: $fs14; + } + + label { + font-family: "worksans", sans-serif; + color: $color-gray-60; + font-size: $fs12; + margin-right: -17px; + margin-bottom: 13px; + } + + .info { + font-family: "worksans", sans-serif; + color: $color-gray-30; + font-size: $fs12; + margin-bottom: 8px; + } + + .input-checkbox label { + align-items: flex-start; + } + } } .options-form, diff --git a/frontend/resources/styles/main/partials/modal.scss b/frontend/resources/styles/main/partials/modal.scss index 26f352471..b5a8f3ce2 100644 --- a/frontend/resources/styles/main/partials/modal.scss +++ b/frontend/resources/styles/main/partials/modal.scss @@ -996,6 +996,57 @@ } } } + + &.newsletter { + padding: $size-5 0 0 0; + flex-direction: column; + min-width: 555px; + .modal-top { + padding: 87px 40px 0 40px; + color: $color-gray-60; + display: flex; + flex-direction: column; + + h1 { + font-family: sourcesanspro; + font-weight: bold; + font-size: $fs36; + margin-bottom: 0.75rem; + } + + p { + font-family: sourcesanspro; + font-weight: 500; + font-size: $fs16; + margin-bottom: 1.5rem; + } + } + + .modal-bottom { + margin: 0 32px; + padding: 32px 0; + color: $color-gray-60; + display: flex; + flex-direction: column; + border-top: 1px solid $color-gray-10; + + p { + font-family: "worksans", sans-serif; + text-align: left; + color: $color-gray-30; + } + } + + .modal-footer { + padding: 17px; + display: flex; + justify-content: flex-end; + + .btn-secondary { + margin-right: 16px; + } + } + } } .deco { @@ -1004,6 +1055,23 @@ top: -18px; width: 60px; + &.top { + width: 183px; + top: -106px; + left: 161px; + } + + &.newsletter-right { + left: 515px; + top: 50px; + } + + &.newsletter-left { + width: 26px; + left: -15px; + top: -15px; + } + &.right { left: 590px; top: 0; diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index cd5ca770e..4bc1355d2 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -304,7 +304,7 @@ (let [mdata (meta data) on-success (:on-success mdata identity) on-error (:on-error mdata #(rx/throw %))] - (->> (rp/mutation :update-profile data) + (->> (rp/mutation :update-profile (dissoc data :props)) (rx/catch on-error) (rx/mapcat (fn [_] @@ -392,7 +392,6 @@ (->> (rp/mutation :update-profile-props {:props props}) (rx/map (constantly (fetch-profile))))))))) - (defn mark-questions-as-answered [] (ptk/reify ::mark-questions-as-answered diff --git a/frontend/src/app/main/ui/components/forms.cljs b/frontend/src/app/main/ui/components/forms.cljs index 3c61dbce5..e7b2bab00 100644 --- a/frontend/src/app/main/ui/components/forms.cljs +++ b/frontend/src/app/main/ui/components/forms.cljs @@ -59,15 +59,15 @@ klass (str more-classes " " (dom/classnames - :focus @focus? - :valid (and touched? (not error)) - :invalid (and touched? error) - :disabled disabled - :empty (and is-text? (str/empty? value)) - :with-icon (not (nil? help-icon')) - :custom-input is-text? - :input-radio is-radio? - :input-checkbox is-checkbox?)) + :focus @focus? + :valid (and touched? (not error)) + :invalid (and touched? error) + :disabled disabled + :empty (and is-text? (str/empty? value)) + :with-icon (not (nil? help-icon')) + :custom-input is-text? + :input-radio is-radio? + :input-checkbox is-checkbox?)) swap-text-password (fn [] @@ -97,6 +97,7 @@ :placeholder label :on-change on-change :type @type') + (cond-> (and value is-checkbox?) (assoc :default-checked value)) (obj/clj->props))] [:div @@ -210,7 +211,7 @@ (let [form (or form (mf/use-ctx form-ctx))] [:input.btn-primary.btn-large {:name "submit" - :class (when-not (:valid @form) "btn-disabled") + :class (when (or (not (:valid @form)) (true? disabled)) "btn-disabled") :disabled (or (not (:valid @form)) (true? disabled)) :on-click on-click :value label diff --git a/frontend/src/app/main/ui/onboarding.cljs b/frontend/src/app/main/ui/onboarding.cljs index 76fb13755..c5caf63d6 100644 --- a/frontend/src/app/main/ui/onboarding.cljs +++ b/frontend/src/app/main/ui/onboarding.cljs @@ -10,6 +10,7 @@ [app.main.data.modal :as modal] [app.main.data.users :as du] [app.main.store :as st] + [app.main.ui.onboarding.newsletter] [app.main.ui.onboarding.questions] [app.main.ui.onboarding.team-choice] [app.main.ui.onboarding.templates] @@ -154,7 +155,7 @@ skip (mf/use-callback (st/emitf (modal/hide) - (modal/show {:type :onboarding-choice}) + (modal/show {:type :onboarding-newsletter-modal}) (du/mark-onboarding-as-viewed)))] (mf/use-layout-effect diff --git a/frontend/src/app/main/ui/onboarding/newsletter.cljs b/frontend/src/app/main/ui/onboarding/newsletter.cljs new file mode 100644 index 000000000..bf72d5639 --- /dev/null +++ b/frontend/src/app/main/ui/onboarding/newsletter.cljs @@ -0,0 +1,47 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) UXBOX Labs SL + +(ns app.main.ui.onboarding.newsletter + (:require + [app.main.data.messages :as dm] + [app.main.data.modal :as modal] + [app.main.data.users :as du] + [app.main.store :as st] + [app.util.i18n :as i18n :refer [tr]] + [rumext.alpha :as mf])) + +(mf/defc onboarding-newsletter-modal + {::mf/register modal/components + ::mf/register-as :onboarding-newsletter-modal} + [] + (let [message (tr "onboarding.newsletter.acceptance-message") + accept + (mf/use-callback + (fn [] + (st/emit! (dm/success message) + (modal/show {:type :onboarding-choice}) + (du/update-profile-props {:newsletter-subscribed true})))) + + decline + (mf/use-callback + (fn [] + (st/emit! (modal/show {:type :onboarding-choice}) + (du/update-profile-props {:newsletter-subscribed false}))))] + + [:div.modal-overlay + [:div.modal-container.onboarding.newsletter.animated.fadeInUp + [:div.modal-top + [:h1.newsletter-title {:data-test "onboarding-newsletter-title"} (tr "onboarding.newsletter.title")] + [:p (tr "onboarding.newsletter.desc")]] + [:div.modal-bottom + [:p (tr "onboarding.newsletter.privacy1") [:a {:target "_blank" :href "https://penpot.app/privacy.html"} (tr "onboarding.newsletter.policy")]] + [:p (tr "onboarding.newsletter.privacy2")]] + [:div.modal-footer + [:button.btn-secondary {:on-click decline} (tr "onboarding.newsletter.decline")] + [:button.btn-primary {:on-click accept} (tr "onboarding.newsletter.accept")]] + [:img.deco.top {:src "images/deco-newsletter.png" :border "0"}] + [:img.deco.newsletter-left {:src "images/deco-news-left.png" :border "0"}] + [:img.deco.newsletter-right {:src "images/deco-news-right.png" :border "0"}]]])) diff --git a/frontend/src/app/main/ui/settings/profile.cljs b/frontend/src/app/main/ui/settings/profile.cljs index e92a71eaa..2919180e3 100644 --- a/frontend/src/app/main/ui/settings/profile.cljs +++ b/frontend/src/app/main/ui/settings/profile.cljs @@ -43,13 +43,17 @@ [{:keys [locale] :as props}] (let [profile (mf/deref refs/profile) form (fm/use-form :spec ::profile-form - :initial profile)] + :initial profile) + disabled-button (mf/use-state true) + activate-btn #(reset! disabled-button false)] + [:& fm/form {:on-submit on-submit :form form :class "profile-form"} [:div.fields-row [:& fm/input {:type "text" + :on-key-down activate-btn :name :fullname :label (t locale "dashboard.your-name")}]] @@ -66,8 +70,19 @@ [:a {:on-click #(modal/show! :change-email {})} (t locale "dashboard.change-email")]]]] + [:div.newsletter-subs + [:p.newsletter-title (tr "dashboard.newsletter-title")] + [:& fm/input {:name :newsletter-subscribed + :class "check-primary" + :type "checkbox" + :label (tr "dashboard.newsletter-msg") + :on-click activate-btn}] + [:p.info (tr "onboarding.newsletter.privacy1") [:a {:target "_blank" :href "https://penpot.app/privacy.html"} (tr "onboarding.newsletter.policy")]] + [:p.info (tr "onboarding.newsletter.privacy2")]] + [:& fm/submit-button - {:label (t locale "dashboard.update-settings")}] + {:label (t locale "dashboard.save-settings") + :disabled @disabled-button}] [:div.links [:div.link-item diff --git a/frontend/translations/en.po b/frontend/translations/en.po index ce9150436..46081d3e3 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -581,7 +581,19 @@ msgstr "Search results" msgid "dashboard.type-something" msgstr "Type to search results" -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Save settings" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.newsletter-title" +msgstr "Newsletter subscription" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.newsletter-msg" +msgstr "Send me news, product updates and recommendations about Penpot." + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs msgid "dashboard.update-settings" msgstr "Update settings" @@ -1855,6 +1867,30 @@ msgstr "" msgid "onboarding.welcome.title" msgstr "Welcome to Penpot" +msgid "onboarding.newsletter.title" +msgstr "Want to receive Penpot news?" + +msgid "onboarding.newsletter.desc" +msgstr "Subscribe to our newsletter to stay up to date with product development progress and news." + +msgid "onboarding.newsletter.privacy1" +msgstr "Because we care about privacy, here's our " + +msgid "onboarding.newsletter.policy" +msgstr "Privacy Policy." + +msgid "onboarding.newsletter.privacy2" +msgstr "We will only send relevant emails to you. You can unsubscribe at any time in your user profile or via the unsubscribe link in any of our newsletters." + +msgid "onboarding.newsletter.accept" +msgstr "Yes, subscribe" + +msgid "onboarding.newsletter.decline" +msgstr "No, thanks" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "Your subscription request has been sent, we will send you an email to confirm it." + #: src/app/main/ui/auth/recovery.cljs msgid "profile.recovery.go-to-login" msgstr "Go to login" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index c09e0e91b..0aa4de77c 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -587,7 +587,20 @@ msgstr "Resultados de búsqueda" msgid "dashboard.type-something" msgstr "Escribe algo para buscar" -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Guardar opciones" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.newsletter-title" +msgstr "Suscripción a newsletter" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.newsletter-msg" +msgstr "Envíame noticias, actualizaciones de producto y recomendaciones sobre Penpot." + + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs msgid "dashboard.update-settings" msgstr "Actualizar opciones" @@ -1876,6 +1889,31 @@ msgstr "" msgid "onboarding.welcome.title" msgstr "Te damos la bienvenida a Penpot" +msgid "onboarding.newsletter.title" +msgstr "¿Quieres recibir noticias sobre Penpot?" + +msgid "onboarding.newsletter.desc" +msgstr "Suscríbete a nuestra newsletter para estar al día de los progresos del producto y noticias." + +msgid "onboarding.newsletter.privacy1" +msgstr "Porque nos importa la privacidad, aquí puedes ver nuestra " + +msgid "onboarding.newsletter.policy" +msgstr "Política de Privacidad." + +msgid "onboarding.newsletter.privacy2" +msgstr "Sólo te enviaremos emails relevantes para ti. Puedes desuscribirte en cualquier momento desde tu perfil o usando el vínculo de desuscripción en cualquiera de nuestras newsletters." + +msgid "onboarding.newsletter.accept" +msgstr "Si, suscribirme" + +msgid "onboarding.newsletter.decline" +msgstr "No, gracias" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "Tu solicitud de suscripción ha sido enviada, te haremos una confirmación a tu email" + + #: src/app/main/ui/auth/recovery.cljs msgid "profile.recovery.go-to-login" msgstr "Ir al login"