mirror of
https://github.com/penpot/penpot.git
synced 2025-05-19 19:06:11 +02:00
✨ Improve error handling on onboarding questions form
This commit is contained in:
parent
ec53288b66
commit
21683be07b
3 changed files with 47 additions and 14 deletions
|
@ -21,7 +21,6 @@
|
||||||
|
|
||||||
(defmethod ptk/resolve :default
|
(defmethod ptk/resolve :default
|
||||||
[type data]
|
[type data]
|
||||||
(log/warn :hint "no implementation found for event" :event type)
|
|
||||||
(ptk/data-event type data))
|
(ptk/data-event type data))
|
||||||
|
|
||||||
(defonce state
|
(defonce state
|
||||||
|
|
|
@ -7,34 +7,63 @@
|
||||||
(ns app.main.ui.onboarding.questions
|
(ns app.main.ui.onboarding.questions
|
||||||
"External form for onboarding questions."
|
"External form for onboarding questions."
|
||||||
(:require
|
(:require
|
||||||
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.users :as du]
|
[app.main.data.users :as du]
|
||||||
[app.main.store :as st]
|
[app.main.store :as st]
|
||||||
[app.util.dom :as dom]
|
[app.util.dom :as dom]
|
||||||
[goog.events :as ev]
|
[goog.events :as gev]
|
||||||
|
[potok.core :as ptk]
|
||||||
[promesa.core :as p]
|
[promesa.core :as p]
|
||||||
[rumext.alpha :as mf]))
|
[rumext.alpha :as mf]))
|
||||||
|
|
||||||
(defn load-arengu-sdk
|
(defn load-arengu-sdk
|
||||||
[container-ref email form-id]
|
[container-ref email form-id]
|
||||||
(letfn [(on-init []
|
(letfn [(on-arengu-loaded [resolve reject]
|
||||||
(when-let [container (mf/ref-val container-ref)]
|
(let [container (mf/ref-val container-ref)]
|
||||||
(-> (.embed js/ArenguForms form-id container)
|
(-> (.embed js/ArenguForms form-id container)
|
||||||
(p/then (fn [form]
|
(p/then (fn [form]
|
||||||
(.setHiddenField ^js form "email" email))))))
|
(.setHiddenField ^js form "email" email)
|
||||||
|
(st/emit! (ptk/event ::ev/event {::ev/name "arengu-form-load-success"
|
||||||
|
::ev/origin "onboarding-questions"
|
||||||
|
::ev/type "fact"}))
|
||||||
|
|
||||||
(on-submit-success [_event]
|
(resolve)))
|
||||||
(st/emit! (du/mark-questions-as-answered)))]
|
(p/catch reject))))
|
||||||
|
|
||||||
(let [script (dom/create-element "script")
|
(mark-as-answered []
|
||||||
head (unchecked-get js/document "head")
|
(st/emit! (du/mark-questions-as-answered)))
|
||||||
lkey1 (ev/listen js/document "af-submitForm-success" on-submit-success)]
|
|
||||||
|
|
||||||
(unchecked-set script "src" "https://sdk.arengu.com/forms.js")
|
(initialize [cleaners resolve reject]
|
||||||
(unchecked-set script "onload" on-init)
|
(let [script (dom/create-element "script")
|
||||||
(dom/append-child! head script)
|
head (unchecked-get js/document "head")
|
||||||
|
lkey1 (gev/listen js/document "af-submitForm-success" mark-as-answered)
|
||||||
|
lkey2 (gev/listen js/document "af-getForm-error" reject)]
|
||||||
|
|
||||||
|
(unchecked-set script "src" "https://sdk.arengu.com/forms.js")
|
||||||
|
(unchecked-set script "onload" (partial on-arengu-loaded resolve reject))
|
||||||
|
(dom/append-child! head script)
|
||||||
|
|
||||||
|
(swap! cleaners conj
|
||||||
|
#(do (gev/unlistenByKey lkey1)
|
||||||
|
(gev/unlistenByKey lkey2)))
|
||||||
|
|
||||||
|
(swap! cleaners conj
|
||||||
|
#(dom/remove-child! head script))))
|
||||||
|
|
||||||
|
(on-error [_]
|
||||||
|
(st/emit! (ptk/event ::ev/event {::ev/name "arengu-form-load-error"
|
||||||
|
::ev/origin "onboarding-questions"
|
||||||
|
::ev/type "fact"}))
|
||||||
|
(mark-as-answered))
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
(let [cleaners (atom #{})]
|
||||||
|
(-> (p/create (partial initialize cleaners))
|
||||||
|
(p/timeout 5000)
|
||||||
|
(p/catch on-error))
|
||||||
(fn []
|
(fn []
|
||||||
(ev/unlistenByKey lkey1)))))
|
(run! (fn [clean-fn] (clean-fn)) @cleaners)))))
|
||||||
|
|
||||||
(mf/defc questions
|
(mf/defc questions
|
||||||
[{:keys [profile form-id]}]
|
[{:keys [profile form-id]}]
|
||||||
|
|
|
@ -262,6 +262,11 @@
|
||||||
(when (some? el)
|
(when (some? el)
|
||||||
(.appendChild ^js el child)))
|
(.appendChild ^js el child)))
|
||||||
|
|
||||||
|
(defn remove-child!
|
||||||
|
[^js el child]
|
||||||
|
(when (some? el)
|
||||||
|
(.removeChild ^js el child)))
|
||||||
|
|
||||||
(defn get-first-child
|
(defn get-first-child
|
||||||
[^js el]
|
[^js el]
|
||||||
(when (some? el)
|
(when (some? el)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue