mirror of
https://github.com/penpot/penpot.git
synced 2025-05-18 15:26:10 +02:00
🎉 Add automatic complaint and bouncing handling.
This commit is contained in:
parent
17229228a3
commit
7708752ad9
26 changed files with 1073 additions and 73 deletions
|
@ -18,9 +18,9 @@
|
|||
[app.util.dom :as dom]
|
||||
[app.util.i18n :as i18n :refer [tr t]]
|
||||
[app.util.router :as rt]
|
||||
[beicon.core :as rx]
|
||||
[cljs.spec.alpha :as s]
|
||||
[cuerdas.core :as str]
|
||||
[beicon.core :as rx]
|
||||
[rumext.alpha :as mf]))
|
||||
|
||||
(s/def ::email ::us/email)
|
||||
|
@ -28,37 +28,41 @@
|
|||
|
||||
(mf/defc recovery-form
|
||||
[]
|
||||
(let [form (fm/use-form :spec ::recovery-request-form
|
||||
:initial {})
|
||||
|
||||
(let [form (fm/use-form :spec ::recovery-request-form :initial {})
|
||||
submitted (mf/use-state false)
|
||||
|
||||
on-error
|
||||
(mf/use-callback
|
||||
(fn [{:keys [code] :as error}]
|
||||
(reset! submitted false)
|
||||
(if (= code :profile-not-verified)
|
||||
(rx/of (dm/error (tr "auth.notifications.profile-not-verified")
|
||||
{:timeout nil}))
|
||||
|
||||
(rx/throw error))))
|
||||
|
||||
on-success
|
||||
(mf/use-callback
|
||||
(fn []
|
||||
(fn [data]
|
||||
(reset! submitted false)
|
||||
(st/emit! (dm/info (tr "auth.notifications.recovery-token-sent"))
|
||||
(rt/nav :auth-login))))
|
||||
|
||||
on-error
|
||||
(mf/use-callback
|
||||
(fn [data {:keys [code] :as error}]
|
||||
(reset! submitted false)
|
||||
(case code
|
||||
:profile-not-verified
|
||||
(rx/of (dm/error (tr "auth.notifications.profile-not-verified") {:timeout nil}))
|
||||
|
||||
:profile-is-muted
|
||||
(rx/of (dm/error (tr "errors.profile-is-muted")))
|
||||
|
||||
:email-has-permanent-bounces
|
||||
(rx/of (dm/error (tr "errors.email-has-permanent-bounces" (:email data))))
|
||||
|
||||
(rx/throw error))))
|
||||
|
||||
on-submit
|
||||
(mf/use-callback
|
||||
(fn []
|
||||
(reset! submitted true)
|
||||
(->> (with-meta (:clean-data @form)
|
||||
{:on-success on-success
|
||||
:on-error on-error})
|
||||
(uda/request-profile-recovery)
|
||||
(st/emit!))))]
|
||||
(let [cdata (:clean-data @form)
|
||||
params (with-meta cdata
|
||||
{:on-success #(on-success cdata %)
|
||||
:on-error #(on-error cdata %)})]
|
||||
(st/emit! (uda/request-profile-recovery params)))))]
|
||||
|
||||
[:& fm/form {:on-submit on-submit
|
||||
:form form}
|
||||
|
|
|
@ -64,13 +64,17 @@
|
|||
(reset! submitted? false)
|
||||
(case (:code error)
|
||||
:registration-disabled
|
||||
(st/emit! (dm/error (tr "errors.registration-disabled")))
|
||||
(rx/of (dm/error (tr "errors.registration-disabled")))
|
||||
|
||||
:email-has-permanent-bounces
|
||||
(let [email (get @form [:data :email])]
|
||||
(rx/of (dm/error (tr "errors.email-has-permanent-bounces" email))))
|
||||
|
||||
:email-already-exists
|
||||
(swap! form assoc-in [:errors :email]
|
||||
{:message "errors.email-already-exists"})
|
||||
|
||||
(st/emit! (dm/error (tr "errors.unexpected-error"))))))
|
||||
(rx/throw error))))
|
||||
|
||||
on-success
|
||||
(mf/use-callback
|
||||
|
|
|
@ -97,13 +97,34 @@
|
|||
(st/emitf (dm/success "Invitation sent successfully")
|
||||
(modal/hide)))
|
||||
|
||||
on-error
|
||||
(mf/use-callback
|
||||
(mf/deps team)
|
||||
(fn [form {:keys [type code] :as error}]
|
||||
(let [email (get @form [:data :email])]
|
||||
(cond
|
||||
(and (= :validation type)
|
||||
(= :profile-is-muted code))
|
||||
(dm/error (tr "errors.profile-is-muted"))
|
||||
|
||||
(and (= :validation type)
|
||||
(= :member-is-muted code))
|
||||
(dm/error (tr "errors.member-is-muted"))
|
||||
|
||||
(and (= :validation type)
|
||||
(= :email-has-permanent-bounces))
|
||||
(dm/error (tr "errors.email-has-permanent-bounces" email))
|
||||
|
||||
:else
|
||||
(dm/error (tr "errors.generic"))))))
|
||||
|
||||
on-submit
|
||||
(mf/use-callback
|
||||
(mf/deps team)
|
||||
(fn [form]
|
||||
(let [params (:clean-data @form)
|
||||
mdata {:on-success (partial on-success form)}]
|
||||
mdata {:on-success (partial on-success form)
|
||||
:on-error (partial on-error form)}]
|
||||
(st/emit! (dd/invite-team-member (with-meta params mdata))))))]
|
||||
|
||||
[:div.modal.dashboard-invite-modal.form-container
|
||||
|
|
|
@ -40,14 +40,20 @@
|
|||
(s/keys :req-un [::email-1 ::email-2]))
|
||||
|
||||
(defn- on-error
|
||||
[form error]
|
||||
(cond
|
||||
(= (:code error) :email-already-exists)
|
||||
[form {:keys [code] :as error}]
|
||||
(case code
|
||||
:email-already-exists
|
||||
(swap! form (fn [data]
|
||||
(let [error {:message (tr "errors.email-already-exists")}]
|
||||
(assoc-in data [:errors :email-1] error))))
|
||||
|
||||
:else
|
||||
:profile-is-muted
|
||||
(rx/of (dm/error (tr "errors.profile-is-muted")))
|
||||
|
||||
:email-has-permanent-bounces
|
||||
(let [email (get @form [:data email])]
|
||||
(rx/of (dm/error (tr "errors.email-has-permanent-bounces" email))))
|
||||
|
||||
(rx/throw error)))
|
||||
|
||||
(defn- on-success
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue