0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-22 14:39:45 -05:00

♻️ Simplify audit events code

This commit is contained in:
Andrey Antukh 2024-03-14 12:53:26 +01:00
parent 91118bec70
commit 1a12e63027
15 changed files with 320 additions and 230 deletions

View file

@ -9,8 +9,8 @@
funcool/okulary {:mvn/version "2022.04.11-16"}
funcool/potok2
{:git/tag "v2.0"
:git/sha "2bb377b"
{:git/tag "v2.1"
:git/sha "84c97b9"
:git/url "https://github.com/funcool/potok.git"}
funcool/beicon2

View file

@ -12,6 +12,7 @@
[app.common.schema :as sm]
[app.common.types.shape-tree :as ctst]
[app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.data.workspace.state-helpers :as wsh]
[app.main.repo :as rp]
[beicon.v2.core :as rx]
@ -61,13 +62,23 @@
(ptk/reify ::created-thread-on-workspace
ptk/UpdateEvent
(update [_ state]
(-> state
(update :comment-threads assoc id (dissoc thread :comment))
(update-in [:workspace-data :pages-index page-id :options :comment-threads-position] assoc id (select-keys thread [:position :frame-id]))
(update :comments-local assoc :open id)
(update :comments-local dissoc :draft)
(update :workspace-drawing dissoc :comment)
(update-in [:comments id] assoc (:id comment) comment)))))
(let [position (select-keys thread [:position :frame-id])]
(-> state
(update :comment-threads assoc id (dissoc thread :comment))
(update-in [:workspace-data :pages-index page-id :options :comment-threads-position] assoc id position)
(update :comments-local assoc :open id)
(update :comments-local dissoc :draft)
(update :workspace-drawing dissoc :comment)
(update-in [:comments id] assoc (:id comment) comment))))
ptk/WatchEvent
(watch [_ _ _]
(rx/of (ptk/data-event ::ev/event
{::ev/name "create-comment-thread"
::ev/origin "workspace"
:id id
:content-size (count (:content comment))})))))
(def ^:private
@ -81,8 +92,7 @@
(defn create-thread-on-workspace
[params]
(dm/assert!
(sm/check! schema:create-thread-on-workspace params))
(dm/assert! (sm/check! schema:create-thread-on-workspace params))
(ptk/reify ::create-thread-on-workspace
ptk/WatchEvent
@ -105,13 +115,22 @@
(ptk/reify ::created-thread-on-viewer
ptk/UpdateEvent
(update [_ state]
(-> state
(update :comment-threads assoc id (dissoc thread :comment))
(update-in [:viewer :pages page-id :options :comment-threads-position] assoc id (select-keys thread [:position :frame-id]))
(update :comments-local assoc :open id)
(update :comments-local dissoc :draft)
(update :workspace-drawing dissoc :comment)
(update-in [:comments id] assoc (:id comment) comment)))))
(let [position (select-keys thread [:position :frame-id])]
(-> state
(update :comment-threads assoc id (dissoc thread :comment))
(update-in [:viewer :pages page-id :options :comment-threads-position] assoc id position)
(update :comments-local assoc :open id)
(update :comments-local dissoc :draft)
(update :workspace-drawing dissoc :comment)
(update-in [:comments id] assoc (:id comment) comment))))
ptk/WatchEvent
(watch [_ _ _]
(rx/of (ptk/data-event ::ev/event
{::ev/name "create-comment-thread"
::ev/origin "viewer"
:id id
:content-size (count (:content comment))})))))
(def ^:private
schema:create-thread-on-viewer
@ -191,21 +210,27 @@
"expected valid content"
(string? content))
(letfn [(created [comment state]
(update-in state [:comments (:id thread)] assoc (:id comment) comment))]
(ptk/reify ::create-comment
ptk/WatchEvent
(watch [_ state _]
(let [share-id (-> state :viewer-local :share-id)]
(rx/concat
(->> (rp/cmd! :create-comment {:thread-id (:id thread) :content content :share-id share-id})
(rx/map #(partial created %))
(rx/catch (fn [{:keys [type code] :as cause}]
(if (and (= type :restriction)
(= code :max-quote-reached))
(rx/throw cause)
(rx/throw {:type :comment-error})))))
(rx/of (refresh-comment-thread thread))))))))
(ptk/reify ::create-comment
ev/Event
(-data [_]
{:thread-id (:id thread)
:file-id (:file-id thread)
:content-size (count content)})
ptk/WatchEvent
(watch [_ state _]
(let [share-id (-> state :viewer-local :share-id)
created (fn [comment state]
(update-in state [:comments (:id thread)] assoc (:id comment) comment))]
(rx/concat
(->> (rp/cmd! :create-comment {:thread-id (:id thread) :content content :share-id share-id})
(rx/map (fn [comment] (partial created comment)))
(rx/catch (fn [{:keys [type code] :as cause}]
(if (and (= type :restriction)
(= code :max-quote-reached))
(rx/throw cause)
(rx/throw {:type :comment-error})))))
(rx/of (refresh-comment-thread thread)))))))
(defn update-comment
[{:keys [id content thread-id] :as comment}]
@ -214,6 +239,12 @@
(check-comment! comment))
(ptk/reify ::update-comment
ev/Event
(-data [_]
{:thread-id thread-id
:id id
:content-size (count content)})
ptk/UpdateEvent
(update [_ state]
(d/update-in-when state [:comments thread-id id] assoc :content content))
@ -241,9 +272,14 @@
ptk/WatchEvent
(watch [_ _ _]
(->> (rp/cmd! :delete-comment-thread {:id id})
(rx/catch #(rx/throw {:type :comment-error}))
(rx/ignore)))))
(rx/concat
(->> (rp/cmd! :delete-comment-thread {:id id})
(rx/catch #(rx/throw {:type :comment-error}))
(rx/ignore))
(rx/of (ptk/data-event ::ev/event
{::ev/name "delete-comment-thread"
::ev/origin "workspace"
:id id}))))))
(defn delete-comment-thread-on-viewer
[{:keys [id] :as thread}]
@ -262,16 +298,24 @@
ptk/WatchEvent
(watch [_ state _]
(let [share-id (-> state :viewer-local :share-id)]
(->> (rp/cmd! :delete-comment-thread {:id id :share-id share-id})
(rx/catch #(rx/throw {:type :comment-error}))
(rx/ignore))))))
(rx/concat
(->> (rp/cmd! :delete-comment-thread {:id id :share-id share-id})
(rx/catch #(rx/throw {:type :comment-error}))
(rx/ignore))
(rx/of (ptk/data-event ::ev/event
{::ev/name "delete-comment-thread"
::ev/origin "viewer"
:id id})))))))
(defn delete-comment
[{:keys [id thread-id] :as comment}]
(dm/assert!
"expected valid comment"
(check-comment! comment))
(ptk/reify ::delete-comment
ev/Event
(-data [_]
{:thread-id thread-id})
ptk/UpdateEvent
(update [_ state]
(-> state
@ -375,6 +419,10 @@
"expected valid comment thread"
(check-comment-thread! thread))
(ptk/reify ::open-comment-thread
ev/Event
(-data [_]
{:thread-id id})
ptk/UpdateEvent
(update [_ state]
(-> state

View file

@ -469,7 +469,11 @@
(rx/map prepare)
(rx/mapcat #(rp/cmd! :update-team-photo %))
(rx/tap on-success)
(rx/map du/fetch-teams)
(rx/mapcat (fn [_]
(rx/of (du/fetch-teams)
(ptk/data-event ::ev/event
{::ev/name "update-team-photo"
:team-id team-id}))))
(rx/catch on-error))))))
(defn update-team-member-role
@ -484,7 +488,12 @@
(->> (rp/cmd! :update-team-member-role params)
(rx/mapcat (fn [_]
(rx/of (fetch-team-members team-id)
(du/fetch-teams)))))))))
(du/fetch-teams)
(ptk/data-event ::ev/event
{::ev/name "update-team-member-role"
:team-id team-id
:role role
:member-id member-id})))))))))
(defn delete-team-member
[{:keys [member-id] :as params}]
@ -497,7 +506,11 @@
(->> (rp/cmd! :delete-team-member params)
(rx/mapcat (fn [_]
(rx/of (fetch-team-members team-id)
(du/fetch-teams)))))))))
(du/fetch-teams)
(ptk/data-event ::ev/event
{::ev/name "delete-team-member"
:team-id team-id
:member-id member-id})))))))))
(defn leave-team
[{:keys [reassign-to] :as params}]
@ -516,6 +529,11 @@
(assoc :reassign-to reassign-to))]
(->> (rp/cmd! :leave-team params)
(rx/tap #(tm/schedule on-success))
(rx/map (fn [_]
(ptk/data-event ::ev/event
{::ev/name "leave-team"
:reassign-to reassign-to
:team-id team-id})))
(rx/catch on-error))))))
(defn invite-team-members
@ -528,8 +546,11 @@
(sm/check-set-of-emails! emails))
(ptk/reify ::invite-team-members
IDeref
(-deref [_] {:role role :team-id team-id :resend? resend?})
ev/Event
(-data [_]
{:role role
:team-id team-id
:resend resend?})
ptk/WatchEvent
(watch [_ _ _]
@ -727,6 +748,11 @@
[{:keys [id name] :as params}]
(dm/assert! (uuid? id))
(ptk/reify ::duplicate-project
ev/Event
(-data [_]
{:project-id id
:name name})
ptk/WatchEvent
(watch [_ _ _]
(let [{:keys [on-success on-error]
@ -744,10 +770,12 @@
[{:keys [id team-id] :as params}]
(dm/assert! (uuid? id))
(dm/assert! (uuid? team-id))
(ptk/reify ::move-project
IDeref
(-deref [_]
{:id id :team-id team-id})
ev/Event
(-data [_]
{:id id
:team-id team-id})
ptk/WatchEvent
(watch [_ _ _]
@ -834,9 +862,11 @@
(defn rename-file
[{:keys [id name] :as params}]
(ptk/reify ::rename-file
IDeref
(-deref [_]
{::ev/origin "dashboard" :id id :name name})
ev/Event
(-data [_]
{::ev/origin "dashboard"
:id id
:name name})
ptk/UpdateEvent
(update [_ state]
@ -856,9 +886,11 @@
(defn set-file-shared
[{:keys [id is-shared] :as params}]
(ptk/reify ::set-file-shared
IDeref
(-deref [_]
{::ev/origin "dashboard" :id id :shared is-shared})
ev/Event
(-data [_]
{::ev/origin "dashboard"
:id id
:shared is-shared})
ptk/UpdateEvent
(update [_ state]
@ -912,9 +944,8 @@
[{:keys [project-id] :as params}]
(dm/assert! (uuid? project-id))
(ptk/reify ::create-file
IDeref
(-deref [_] {:project-id project-id})
ev/Event
(-data [_] {:project-id project-id})
ptk/WatchEvent
(watch [it state _]
@ -967,8 +998,8 @@
(sm/check-set-of-uuid! ids))
(ptk/reify ::move-files
IDeref
(-deref [_]
ev/Event
(-data [_]
{:num-files (count ids)
:project-id project-id})
@ -998,8 +1029,8 @@
[{:keys [template-id project-id] :as params}]
(dm/assert! (uuid? project-id))
(ptk/reify ::clone-template
IDeref
(-deref [_]
ev/Event
(-data [_]
{:template-id template-id
:project-id project-id})

View file

@ -75,71 +75,23 @@
;; --- EVENT TRANSLATION
(derive :app.main.data.comments/create-comment ::generic-action)
(derive :app.main.data.comments/create-comment-thread ::generic-action)
(derive :app.main.data.comments/delete-comment ::generic-action)
(derive :app.main.data.comments/delete-comment-thread ::generic-action)
(derive :app.main.data.comments/open-comment-thread ::generic-action)
(derive :app.main.data.comments/update-comment ::generic-action)
(derive :app.main.data.comments/update-comment-thread ::generic-action)
(derive :app.main.data.comments/update-comment-thread-status ::generic-action)
(derive :app.main.data.dashboard/delete-team-member ::generic-action)
(derive :app.main.data.dashboard/duplicate-project ::generic-action)
(derive :app.main.data.dashboard/create-file ::generic-action)
(derive :app.main.data.dashboard/invite-team-members ::generic-action)
(derive :app.main.data.dashboard/leave-team ::generic-action)
(derive :app.main.data.dashboard/move-files ::generic-action)
(derive :app.main.data.dashboard/move-project ::generic-action)
(derive :app.main.data.dashboard/rename-file ::generic-action)
(derive :app.main.data.dashboard/set-file-shared ::generic-action)
(derive :app.main.data.dashboard/update-team-member-role ::generic-action)
(derive :app.main.data.dashboard/update-team-photo ::generic-action)
(derive :app.main.data.dashboard/clone-template ::generic-action)
(derive :app.main.data.fonts/add-font ::generic-action)
(derive :app.main.data.fonts/delete-font ::generic-action)
(derive :app.main.data.fonts/delete-font-variant ::generic-action)
(derive :app.main.data.modal/show-modal ::generic-action)
(derive :app.main.data.users/logout ::generic-action)
(derive :app.main.data.users/request-email-change ::generic-action)
(derive :app.main.data.users/update-password ::generic-action)
(derive :app.main.data.users/update-photo ::generic-action)
(derive :app.main.data.workspace.comments/open-comment-thread ::generic-action)
(derive :app.main.data.workspace.guides/update-guides ::generic-action)
(derive :app.main.data.workspace.libraries/add-color ::generic-action)
(derive :app.main.data.workspace.libraries/add-media ::generic-action)
(derive :app.main.data.workspace.libraries/add-typography ::generic-action)
(derive :app.main.data.workspace.libraries/delete-color ::generic-action)
(derive :app.main.data.workspace.libraries/delete-media ::generic-action)
(derive :app.main.data.workspace.libraries/delete-typography ::generic-action)
(derive :app.main.data.workspace.persistence/attach-library ::generic-action)
(derive :app.main.data.workspace.persistence/detach-library ::generic-action)
(derive :app.main.data.workspace.persistence/set-file-shard ::generic-action)
(derive :app.main.data.workspace.selection/toggle-focus-mode ::generic-action)
(derive :app.main.data.workspace/create-page ::generic-action)
(derive :app.main.data.workspace/set-workspace-layout ::generic-action)
(derive :app.main.data.workspace/toggle-layout-flag ::generic-action)
(defprotocol Event
(-data [_] "Get event data"))
(defn- simplify-props
"Removes complex data types from props."
[data]
(into {}
(comp
(remove (fn [[_ v]] (nil? v)))
(map (fn [[k v :as kv]]
(cond
(map? v) [k :placeholder/map]
(vector? v) [k :placeholder/vec]
(set? v) [k :placeholder/set]
(coll? v) [k :placeholder/coll]
(fn? v) [k :placeholder/fn]
:else kv))))
data))
(defmulti process-event-by-type ptk/type)
(reduce-kv (fn [data k v]
(cond
(map? v) (assoc data k :placeholder/map)
(vector? v) (assoc data k :placeholder/vec)
(set? v) (assoc data k :placeholder/set)
(coll? v) (assoc data k :placeholder/coll)
(fn? v) (assoc data k :placeholder/fn)
(nil? v) (dissoc data k)
:else data))
data
data))
(defn- process-event-by-proto
[event]
@ -158,72 +110,30 @@
:context context
:props props}))
(defn- process-data-event
[event]
(let [data (deref event)
name (::name data)]
(when (string? name)
(let [type (::type data "action")
context (-> (::context data)
(assoc :event-origin (::origin data))
(d/without-nils))
props (-> data d/without-qualified simplify-props)]
{:type type
:name name
:context context
:props props}))))
(defn- process-event
[event]
(if (satisfies? Event event)
(cond
(satisfies? Event event)
(process-event-by-proto event)
(process-event-by-type event)))
(defmethod process-event-by-type :default [_] nil)
(defmethod process-event-by-type ::event
[event]
(let [data (deref event)
context (-> (::context data)
(assoc :event-origin (::origin data))
(d/without-nils))
props (-> data d/without-qualified simplify-props)]
{:type (::type data "action")
:name (::name data "unnamed")
:context context
:props props}))
(defmethod process-event-by-type ::generic-action
[event]
(let [type (ptk/type event)
data (if (satisfies? IDeref event)
(deref event)
{})
data (d/deep-merge data (meta event))]
{:type "action"
:name (or (::name data) (name type))
:props (-> (d/without-qualified data)
(simplify-props))
:context (d/without-nils
{:event-origin (::origin data)
:event-namespace (namespace type)
:event-symbol (name type)})}))
(defmethod process-event-by-type :app.util.router/navigated
[event]
(let [match (deref event)
route (get-in match [:data :name])
props {:route (name route)
:team-id (get-in match [:path-params :team-id])
:file-id (get-in match [:path-params :file-id])
:project-id (get-in match [:path-params :project-id])}]
{:name "navigate"
:type "action"
:props (simplify-props props)}))
(defmethod process-event-by-type :app.main.data.users/logged-in
[event]
(let [data (deref event)
mdata (meta data)
props {:signin-source (::source mdata)
:email (:email data)
:auth-backend (:auth-backend data)
:fullname (:fullname data)
:is-muted (:is-muted data)
:default-team-id (str (:default-team-id data))
:default-project-id (str (:default-project-id data))}]
{:name "signin"
:type "identify"
:profile-id (:id data)
:props (simplify-props props)}))
(ptk/data-event? event)
(process-data-event event)))
;; --- MAIN LOOP

View file

@ -12,6 +12,7 @@
[app.common.logging :as log]
[app.common.media :as cm]
[app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.data.messages :as msg]
[app.main.fonts :as fonts]
[app.main.repo :as rp]
@ -236,12 +237,19 @@
(defn add-font
[font]
(ptk/reify ::add-font
IDeref
(-deref [_] (select-keys font [:font-family :font-style :font-weight]))
ptk/UpdateEvent
(update [_ state]
(update state :dashboard-fonts assoc (:id font) font))))
(update state :dashboard-fonts assoc (:id font) font))
ptk/WatchEvent
(watch [_ state _]
(let [team-id (:current-team-id state)]
(rx/of (ptk/data-event ::ev/event {::ev/name "add-font"
:team-id team-id
:font-id (:id font)
:font-family (:font-family font)
:font-style (:font-style font)
:font-weight (:font-weight font)}))))))
(defn update-font
[{:keys [id name] :as params}]
@ -271,6 +279,10 @@
[font-id]
(dm/assert! (uuid? font-id))
(ptk/reify ::delete-font
ev/Event
(-data [_]
{:id font-id})
ptk/UpdateEvent
(update [_ state]
(update state :dashboard-fonts
@ -280,8 +292,12 @@
ptk/WatchEvent
(watch [_ state _]
(let [team-id (:current-team-id state)]
(->> (rp/cmd! :delete-font {:id font-id :team-id team-id})
(rx/ignore))))))
(rx/concat
(->> (rp/cmd! :delete-font {:id font-id :team-id team-id})
(rx/ignore))
(rx/of (ptk/data-event ::ev/event {::ev/name "delete-font"
:team-id team-id
:font-id font-id})))))))
(defn delete-font-variant
[id]
@ -297,8 +313,13 @@
ptk/WatchEvent
(watch [_ state _]
(let [team-id (:current-team-id state)]
(->> (rp/cmd! :delete-font-variant {:id id :team-id team-id})
(rx/ignore))))))
(rx/concat
(->> (rp/cmd! :delete-font-variant {:id id :team-id team-id})
(rx/ignore))
(rx/of (ptk/data-event ::ev/event {::ev/name "delete-font-variant"
:id id
:team-id team-id})))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Workspace related events

View file

@ -8,6 +8,7 @@
(:refer-clojure :exclude [update])
(:require
[app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.store :as st]
[cljs.core :as c]
[potok.v2.core :as ptk]))
@ -23,9 +24,11 @@
(show (uuid/next) type props))
([id type props]
(ptk/reify ::show-modal
IDeref
(-deref [_]
(merge (dissoc props :type) {:name type}))
ev/Event
(-data [_]
(-> props
(dissoc :type)
(assoc :name type)))
ptk/UpdateEvent
(update [_ state]

View file

@ -161,8 +161,16 @@
(rt/nav' :dashboard-projects {:team-id team-id}))))]
(ptk/reify ::logged-in
IDeref
(-deref [_] profile)
ev/Event
(-data [_]
{::ev/name "signing"
::ev/type "identify"
:email (:email profile)
:auth-backend (:auth-backend profile)
:fullname (:fullname profile)
:is-muted (:is-muted profile)
:default-team-id (:default-team-id profile)
:default-project-id (:default-project-id profile)})
ptk/WatchEvent
(watch [_ _ _]
@ -288,6 +296,9 @@
([] (logout {}))
([params]
(ptk/reify ::logout
ev/Event
(-data [_] {})
ptk/WatchEvent
(watch [_ _ _]
(->> (rp/cmd! :logout)
@ -360,6 +371,10 @@
[{:keys [email] :as data}]
(dm/assert! ::us/email email)
(ptk/reify ::request-email-change
ev/Event
(-data [_]
{:email email})
ptk/WatchEvent
(watch [_ _ _]
(let [{:keys [on-error on-success]
@ -395,6 +410,9 @@
(sm/check! schema:update-password data))
(ptk/reify ::update-password
ev/Event
(-data [_] {})
ptk/WatchEvent
(watch [_ _ _]
(let [{:keys [on-error on-success]
@ -458,6 +476,9 @@
(di/blob? file))
(ptk/reify ::update-photo
ev/Event
(-data [_] {})
ptk/WatchEvent
(watch [_ _ _]
(let [on-success di/notify-finished-loading

View file

@ -458,9 +458,10 @@
[{:keys [file-id]}]
(let [id (uuid/next)]
(ptk/reify ::create-page
IDeref
(-deref [_]
{:id id :file-id file-id})
ev/Event
(-data [_]
{:id id
:file-id file-id})
ptk/WatchEvent
(watch [it state _]

View file

@ -13,6 +13,7 @@
[app.common.schema :as sm]
[app.common.types.shape-tree :as ctst]
[app.main.data.comments :as dcm]
[app.main.data.events :as ev]
[app.main.data.workspace.changes :as dch]
[app.main.data.workspace.common :as dwco]
[app.main.data.workspace.drawing :as dwd]
@ -118,7 +119,8 @@
(rx/take 1)
(rx/mapcat #(rx/of (center-to-comment-thread thread)
(dwd/select-for-drawing :comments)
(dcm/open-thread thread)))))))))
(with-meta (dcm/open-thread thread)
{::ev/origin "workspace"})))))))))
(defn update-comment-thread-position
([thread [new-x new-y]]

View file

@ -11,23 +11,30 @@
[app.common.geom.point :as gpt]
[app.common.geom.shapes :as gsh]
[app.common.types.page :as ctp]
[app.main.data.events :as ev]
[app.main.data.workspace.changes :as dch]
[app.main.data.workspace.state-helpers :as wsh]
[beicon.v2.core :as rx]
[potok.v2.core :as ptk]))
(defn make-update-guide [guide]
(defn make-update-guide
[guide]
(fn [other]
(cond-> other
(= (:id other) (:id guide))
(merge guide))))
(defn update-guides [guide]
(defn update-guides
[guide]
(dm/assert!
"expected valid guide"
(ctp/check-page-guide! guide))
(ptk/reify ::update-guides
ev/Event
(-data [_]
(assoc guide ::ev/name "update-guide"))
ptk/WatchEvent
(watch [it state _]
(let [page (wsh/lookup-page state)
@ -37,17 +44,20 @@
(pcb/update-page-option :guides assoc (:id guide) guide))]
(rx/of (dch/commit-changes changes))))))
(defn remove-guide [guide]
(defn remove-guide
[guide]
(dm/assert!
"expected valid guide"
(ctp/check-page-guide! guide))
(ptk/reify ::remove-guide
ev/Event
(-data [_] guide)
ptk/UpdateEvent
(update [_ state]
(let [sdisj (fnil disj #{})]
(-> state
(update-in [:workspace-guides :hover] sdisj (:id guide)))))
(update-in state [:workspace-guides :hover] sdisj (:id guide))))
ptk/WatchEvent
(watch [it state _]

View file

@ -82,8 +82,8 @@
(defn toggle-layout-flag
[flag & {:keys [force?] :as opts}]
(ptk/reify ::toggle-layout-flag
IDeref
(-deref [_] {:name flag})
ev/Event
(-data [_] {:name flag})
ptk/UpdateEvent
(update [_ state]

View file

@ -108,8 +108,8 @@
(uc/gradient-type->string (get-in color [:gradient :type])))))]
(dm/assert! ::ctc/color color)
(ptk/reify ::add-color
IDeref
(-deref [_] color)
ev/Event
(-data [_] color)
ptk/WatchEvent
(watch [it _ _]
@ -185,6 +185,9 @@
[{:keys [id] :as params}]
(dm/assert! (uuid? id))
(ptk/reify ::delete-color
ev/Event
(-data [_] {:id id})
ptk/WatchEvent
(watch [it state _]
(let [data (get state :workspace-data)
@ -200,6 +203,9 @@
(ctf/check-media-object! media))
(ptk/reify ::add-media
ev/Event
(-data [_] media)
ptk/WatchEvent
(watch [it _ _]
(let [obj (select-keys media [:id :name :width :height :mtype])
@ -230,6 +236,9 @@
[{:keys [id] :as params}]
(dm/assert! (uuid? id))
(ptk/reify ::delete-media
ev/Event
(-data [_] {:id id})
ptk/WatchEvent
(watch [it state _]
(let [data (get state :workspace-data)
@ -247,8 +256,8 @@
(ctt/check-typography! typography))
(ptk/reify ::add-typography
IDeref
(-deref [_] typography)
ev/Event
(-data [_] typography)
ptk/WatchEvent
(watch [it _ _]
@ -291,6 +300,9 @@
(dm/assert! (uuid? id))
(dm/assert! (string? new-name))
(ptk/reify ::rename-typography
ev/Event
(-data [_] {:id id :name new-name})
ptk/WatchEvent
(watch [it state _]
(when (and (some? new-name) (not= "" new-name))
@ -304,6 +316,9 @@
[id]
(dm/assert! (uuid? id))
(ptk/reify ::delete-typography
ev/Event
(-data [_] {:id id})
ptk/WatchEvent
(watch [it state _]
(let [data (get state :workspace-data)
@ -316,8 +331,10 @@
"This is the second step of the component creation."
[selected components-v2]
(ptk/reify ::add-component2
IDeref
(-deref [_] {:num-shapes (count selected)})
ev/Event
(-data [_]
{::ev/name "add-component"
:shapes (count selected)})
ptk/WatchEvent
(watch [it state _]
@ -369,9 +386,10 @@
selected-objects (map #(get objects %) selected)
;; We don't want to change the structure of component copies
can-make-component (every? true? (map #(ctn/valid-shape-for-component? objects %) selected-objects))
added-components (map
#(add-component2 [%] components-v2)
selected)
added-components (map (fn [id]
(with-meta (add-component2 [id] components-v2)
{:multiple true}))
selected)
undo-id (js/Symbol)]
(when can-make-component
(rx/concat
@ -1266,9 +1284,11 @@
[id is-shared]
{:pre [(uuid? id) (boolean? is-shared)]}
(ptk/reify ::set-file-shared
IDeref
(-deref [_]
{::ev/origin "workspace" :id id :shared is-shared})
ev/Event
(-data [_]
{::ev/origin "workspace"
:id id
:shared is-shared})
ptk/UpdateEvent
(update [_ state]
@ -1302,6 +1322,12 @@
(defn link-file-to-library
[file-id library-id]
(ptk/reify ::attach-library
ev/Event
(-data [_]
{::ev/name "attach-library"
:file-id file-id
:library-id library-id})
;; NOTE: this event implements UpdateEvent protocol for perform an
;; optimistic update state for make the UI feel more responsive.
ptk/UpdateEvent
@ -1331,6 +1357,12 @@
(defn unlink-file-from-library
[file-id library-id]
(ptk/reify ::detach-library
ev/Event
(-data [_]
{::ev/name "detach-library"
:file-id file-id
:library-id library-id})
ptk/UpdateEvent
(update [_ state]
(d/dissoc-in state [:workspace-libraries library-id]))

View file

@ -24,6 +24,7 @@
[app.common.types.shape.interactions :as ctsi]
[app.common.types.shape.layout :as ctl]
[app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.data.modal :as md]
[app.main.data.workspace.changes :as dch]
[app.main.data.workspace.collapse :as dwc]
@ -791,6 +792,9 @@
(defn toggle-focus-mode
[]
(ptk/reify ::toggle-focus-mode
ev/Event
(-data [_] {})
ptk/UpdateEvent
(update [_ state]
(let [selected (wsh/lookup-selected state)]

View file

@ -385,24 +385,24 @@
(mf/use-fn
(fn []
(st/emit! (du/update-profile-props {:team-hero? false})
(ptk/event ::ev/event {::ev/name "dont-show-team-up-hero"
::ev/origin "dashboard"}))))
(ptk/data-event ::ev/event {::ev/name "dont-show-team-up-hero"
::ev/origin "dashboard"}))))
close-tutorial
(mf/use-fn
(fn []
(st/emit! (du/update-profile-props {:viewed-tutorial? true})
(ptk/event ::ev/event {::ev/name "dont-show"
::ev/origin "get-started-hero-block"
:type "tutorial"
:section "dashboard"}))))
(ptk/data-event ::ev/event {::ev/name "dont-show-tutorial"
::ev/origin "get-started-hero"
:type "tutorial"
:section "dashboard"}))))
close-walkthrough
(mf/use-fn
(fn []
(st/emit! (du/update-profile-props {:viewed-walkthrough? true})
(ptk/event ::ev/event {::ev/name "dont-show"
::ev/origin "get-started-hero-block"
:type "walkthrough"
:section "dashboard"}))))]
(ptk/data-event ::ev/event {::ev/name "dont-show-walkthrough"
::ev/origin "get-started-hero"
:type "walkthrough"
:section "dashboard"}))))]
(mf/with-effect [team]
(let [tname (if (:is-default team)

View file

@ -7,8 +7,10 @@
(ns app.util.router
(:refer-clojure :exclude [resolve])
(:require
[app.common.data.macros :as dm]
[app.common.uri :as u]
[app.config :as cf]
[app.main.data.events :as ev]
[app.util.browser-history :as bhistory]
[app.util.dom :as dom]
[app.util.timers :as ts]
@ -59,8 +61,13 @@
(defn navigated
[match]
(ptk/reify ::navigated
IDeref
(-deref [_] match)
ev/Event
(-data [_]
(let [route (dm/get-in match [:data :name])
params (get match :path-params)]
(assoc params
::ev/name "navigate"
:route (name route))))
ptk/UpdateEvent
(update [_ state]