0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-14 08:41:48 -05:00

Improve event registry.

This commit is contained in:
Andrey Antukh 2021-09-06 15:00:18 +02:00 committed by Andrés Moya
parent b5b97f7626
commit 926fa483b9
25 changed files with 245 additions and 93 deletions

View file

@ -72,7 +72,7 @@
(update :workspace-drawing dissoc :comment) (update :workspace-drawing dissoc :comment)
(update-in [:comments id] assoc (:id comment) comment)))] (update-in [:comments id] assoc (:id comment) comment)))]
(ptk/reify ::create-thread (ptk/reify ::create-comment-thread
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ _] (watch [_ _ _]
(->> (rp/mutation :create-comment-thread params) (->> (rp/mutation :create-comment-thread params)
@ -94,6 +94,8 @@
[{:keys [id is-resolved] :as thread}] [{:keys [id is-resolved] :as thread}]
(us/assert ::comment-thread thread) (us/assert ::comment-thread thread)
(ptk/reify ::update-comment-thread (ptk/reify ::update-comment-thread
IDeref
(-deref [_] {:is-resolved is-resolved})
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
@ -122,7 +124,7 @@
(defn update-comment (defn update-comment
[{:keys [id content thread-id] :as comment}] [{:keys [id content thread-id] :as comment}]
(us/assert ::comment comment) (us/assert ::comment comment)
(ptk/reify :update-comment (ptk/reify ::update-comment
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(d/update-in-when state [:comments thread-id id] assoc :content content)) (d/update-in-when state [:comments thread-id id] assoc :content content))
@ -135,7 +137,7 @@
(defn delete-comment-thread (defn delete-comment-thread
[{:keys [id] :as thread}] [{:keys [id] :as thread}]
(us/assert ::comment-thread thread) (us/assert ::comment-thread thread)
(ptk/reify :delete-comment-thread (ptk/reify ::delete-comment-thread
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(-> state (-> state
@ -150,7 +152,7 @@
(defn delete-comment (defn delete-comment
[{:keys [id thread-id] :as comment}] [{:keys [id thread-id] :as comment}]
(us/assert ::comment comment) (us/assert ::comment comment)
(ptk/reify :delete-comment (ptk/reify ::delete-comment
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(d/update-in-when state [:comments thread-id] dissoc id)) (d/update-in-when state [:comments thread-id] dissoc id))
@ -212,7 +214,7 @@
(defn open-thread (defn open-thread
[{:keys [id] :as thread}] [{:keys [id] :as thread}]
(us/assert ::comment-thread thread) (us/assert ::comment-thread thread)
(ptk/reify ::open-thread (ptk/reify ::open-comment-thread
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(-> state (-> state
@ -221,7 +223,7 @@
(defn close-thread (defn close-thread
[] []
(ptk/reify ::close-thread (ptk/reify ::close-comment-thread
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(-> state (-> state

View file

@ -9,6 +9,7 @@
[app.common.data :as d] [app.common.data :as d]
[app.common.spec :as us] [app.common.spec :as us]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.data.fonts :as df] [app.main.data.fonts :as df]
[app.main.data.media :as di] [app.main.data.media :as di]
[app.main.data.users :as du] [app.main.data.users :as du]
@ -386,6 +387,9 @@
(us/assert ::us/email email) (us/assert ::us/email email)
(us/assert ::us/keyword role) (us/assert ::us/keyword role)
(ptk/reify ::invite-team-member (ptk/reify ::invite-team-member
IDeref
(-deref [_] {:role role})
ptk/WatchEvent ptk/WatchEvent
(watch [_ state _] (watch [_ state _]
(let [{:keys [on-success on-error] (let [{:keys [on-success on-error]
@ -475,6 +479,10 @@
(us/assert ::us/uuid id) (us/assert ::us/uuid id)
(us/assert ::us/uuid team-id) (us/assert ::us/uuid team-id)
(ptk/reify ::move-project (ptk/reify ::move-project
IDeref
(-deref [_]
{:id id :team-id team-id})
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ _] (watch [_ _ _]
(let [{:keys [on-success on-error] (let [{:keys [on-success on-error]
@ -566,6 +574,10 @@
[{:keys [id name] :as params}] [{:keys [id name] :as params}]
(us/assert ::file params) (us/assert ::file params)
(ptk/reify ::rename-file (ptk/reify ::rename-file
IDeref
(-deref [_]
{::ev/origin "dashboard" :id id :name name})
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(-> state (-> state
@ -585,6 +597,10 @@
[{:keys [id is-shared] :as params}] [{:keys [id is-shared] :as params}]
(us/assert ::file params) (us/assert ::file params)
(ptk/reify ::set-file-shared (ptk/reify ::set-file-shared
IDeref
(-deref [_]
{::ev/origin "dashboard" :id id :shared is-shared})
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(-> state (-> state
@ -663,12 +679,16 @@
(us/assert ::set-of-uuid ids) (us/assert ::set-of-uuid ids)
(us/assert ::us/uuid project-id) (us/assert ::us/uuid project-id)
(ptk/reify ::move-files (ptk/reify ::move-files
IDeref
(-deref [_]
{:num-files (count ids)
:project-id project-id})
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ _] (watch [_ _ _]
(let [{:keys [on-success on-error] (let [{:keys [on-success on-error]
:or {on-success identity :or {on-success identity
on-error rx/throw}} (meta params)] on-error rx/throw}} (meta params)]
(->> (rp/mutation! :move-files {:ids ids :project-id project-id}) (->> (rp/mutation! :move-files {:ids ids :project-id project-id})
(rx/tap on-success) (rx/tap on-success)
(rx/catch on-error)))))) (rx/catch on-error))))))

View file

@ -71,18 +71,84 @@
;; --- EVENT TRANSLATION ;; --- EVENT TRANSLATION
(defmulti ^:private process-event ptk/type) (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/file-created ::generic-action)
(derive :app.main.data.dashboard/invite-team-member ::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/project-created ::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.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.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.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/create-page ::generic-action)
(derive :app.main.data.workspace/set-workspace-layout ::generic-action)
(defmulti process-event ptk/type)
(defmethod process-event :default [_] nil) (defmethod process-event :default [_] nil)
(defmethod process-event ::event (defmethod process-event ::event
[event] [event]
(let [data (deref event)] (let [data (deref event)
origin (::origin data)]
(when (::name data) (when (::name data)
(d/without-nils (d/without-nils
{:type (::type data "action") {:type (::type data "action")
:name (::name data) :name (::name data)
:context (::context data) :context (::context data)
:props (dissoc data ::name ::type ::context)})))) :props (-> data
(dissoc ::name)
(dissoc ::type)
(dissoc ::origin)
(dissoc ::context)
(cond-> origin (assoc :origin origin)))}))))
(defmethod process-event ::generic-action
[event]
(let [type (ptk/type event)
mdata (meta event)
data (if (satisfies? IDeref event)
(deref event)
{})
name (or (::name mdata)
(name type))]
{:type "action"
:name (name type)
:props (merge data (d/without-nils (::props mdata)))
:context (d/without-nils
{:event-origin (::origin mdata)
:event-namespace (namespace type)
:event-symbol (name type)})}))
(defmethod process-event :app.util.router/navigated (defmethod process-event :app.util.router/navigated
[event] [event]
@ -113,42 +179,6 @@
:profile-id (:id data) :profile-id (:id data)
:props (d/without-nils props)})) :props (d/without-nils props)}))
(defmethod process-event :app.main.data.dashboard/project-created
[event]
(let [data (deref event)]
{:type "action"
:name "create-project"
:props {:id (:id data)
:team-id (:team-id data)}}))
(defmethod process-event :app.main.data.dashboard/file-created
[event]
(let [data (deref event)]
{:type "action"
:name "create-file"
:props {:id (:id data)
:project-id (:project-id data)}}))
(defmethod process-event :app.main.data.workspace/create-page
[event]
(let [data (deref event)]
{:type "action"
:name "create-page"
:props {:id (:id data)
:file-id (:file-id data)
:project-id (:project-id data)}}))
(defn- event->generic-action
[_ name]
{:type "action"
:name name
:props {}})
(defmethod process-event :app.main.data.users/logout
[event]
(event->generic-action event "signout"))
;; --- MAIN LOOP ;; --- MAIN LOOP
(defn- append-to-buffer (defn- append-to-buffer
@ -203,8 +233,7 @@
ptk/EffectEvent ptk/EffectEvent
(effect [_ _ stream] (effect [_ _ stream]
(let [events (methods process-event) (let [session (atom nil)
session (atom nil)
profile (->> (rx/from-atom storage {:emit-current-value? true}) profile (->> (rx/from-atom storage {:emit-current-value? true})
(rx/map :profile) (rx/map :profile)
@ -215,12 +244,9 @@
(rx/with-latest-from profile) (rx/with-latest-from profile)
(rx/map (fn [result] (rx/map (fn [result]
(let [event (aget result 0) (let [event (aget result 0)
profile-id (aget result 1) profile-id (aget result 1)]
type (ptk/type event) (some-> (process-event event)
impl-fn (get events type)] (update :profile-id #(or % profile-id))))))
(when (fn? impl-fn)
(some-> (impl-fn event)
(update :profile-id #(or % profile-id)))))))
(rx/filter :profile-id) (rx/filter :profile-id)
(rx/map (fn [event] (rx/map (fn [event]
(let [session* (or @session (dt/now)) (let [session* (or @session (dt/now))

View file

@ -187,6 +187,9 @@
(defn add-font (defn add-font
[font] [font]
(ptk/reify ::add-font (ptk/reify ::add-font
IDeref
(-deref [_] (select-keys font [:font-family :font-style :font-weight]))
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(update state :dashboard-fonts assoc (:id font) font)))) (update state :dashboard-fonts assoc (:id font) font))))

View file

@ -20,6 +20,7 @@
[app.common.transit :as t] [app.common.transit :as t]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[app.config :as cfg] [app.config :as cfg]
[app.main.data.events :as ev]
[app.main.data.messages :as dm] [app.main.data.messages :as dm]
[app.main.data.workspace.changes :as dch] [app.main.data.workspace.changes :as dch]
[app.main.data.workspace.common :as dwc] [app.main.data.workspace.common :as dwc]
@ -373,6 +374,10 @@
[id name] [id name]
{:pre [(uuid? id) (string? name)]} {:pre [(uuid? id) (string? name)]}
(ptk/reify ::rename-file (ptk/reify ::rename-file
IDeref
(-deref [_]
{:ev/origin "workspace" :id id :name name})
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(assoc-in state [:workspace-file :name] name)) (assoc-in state [:workspace-file :name] name))
@ -1247,7 +1252,10 @@
(defn go-to-layout (defn go-to-layout
[layout] [layout]
(us/verify ::layout-flag layout) (us/verify ::layout-flag layout)
(ptk/reify ::go-to-layout (ptk/reify ::set-workspace-layout
IDeref
(-deref [_] {:layout layout})
ptk/WatchEvent ptk/WatchEvent
(watch [_ state _] (watch [_ state _]
(let [project-id (get-in state [:workspace-project :id]) (let [project-id (get-in state [:workspace-project :id])

View file

@ -9,6 +9,7 @@
[app.common.math :as mth] [app.common.math :as mth]
[app.common.spec :as us] [app.common.spec :as us]
[app.main.data.comments :as dcm] [app.main.data.comments :as dcm]
[app.main.data.events :as ev]
[app.main.data.workspace :as dw] [app.main.data.workspace :as dw]
[app.main.data.workspace.common :as dwc] [app.main.data.workspace.common :as dwc]
[app.main.streams :as ms] [app.main.streams :as ms]
@ -89,7 +90,7 @@
(defn navigate (defn navigate
[thread] [thread]
(us/assert ::dcm/comment-thread thread) (us/assert ::dcm/comment-thread thread)
(ptk/reify ::navigate (ptk/reify ::open-comment-thread
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ stream] (watch [_ _ stream]
(let [pparams {:project-id (:project-id thread) (let [pparams {:project-id (:project-id thread)

View file

@ -83,12 +83,15 @@
(defn add-color (defn add-color
[color] [color]
(let [id (uuid/next) (let [id (uuid/next)
color (assoc color color (-> color
:id id (assoc :id id)
:name (default-color-name color))] (assoc :name (default-color-name color)))]
(us/assert ::cp/color color) (us/assert ::cp/color color)
(ptk/reify ::add-color (ptk/reify ::add-color
IDeref
(-deref [_] color)
ptk/WatchEvent ptk/WatchEvent
(watch [it _ _] (watch [it _ _]
(let [rchg {:type :add-color (let [rchg {:type :add-color
@ -211,6 +214,9 @@
(let [typography (update typography :id #(or % (uuid/next)))] (let [typography (update typography :id #(or % (uuid/next)))]
(us/assert ::cp/typography typography) (us/assert ::cp/typography typography)
(ptk/reify ::add-typography (ptk/reify ::add-typography
IDeref
(-deref [_] typography)
ptk/WatchEvent ptk/WatchEvent
(watch [it _ _] (watch [it _ _]
(let [rchg {:type :add-typography (let [rchg {:type :add-typography
@ -258,17 +264,20 @@
:undo-changes [uchg] :undo-changes [uchg]
:origin it})))))) :origin it}))))))
(def add-component
"Add a new component to current file library, from the currently selected shapes." (defn- add-component2
(ptk/reify ::add-component "This is the second step of the component creation."
[selected]
(ptk/reify ::add-component2
IDeref
(-deref [_] {:num-shapes (count selected)})
ptk/WatchEvent ptk/WatchEvent
(watch [it state _] (watch [it state _]
(let [file-id (:current-file-id state) (let [file-id (:current-file-id state)
page-id (:current-page-id state) page-id (:current-page-id state)
objects (wsh/lookup-page-objects state page-id) objects (wsh/lookup-page-objects state page-id)
selected (wsh/lookup-selected state) shapes (dwg/shapes-for-grouping objects selected)]
selected (cp/clean-loops objects selected)
shapes (dwg/shapes-for-grouping objects selected)]
(when-not (empty? shapes) (when-not (empty? shapes)
(let [[group rchanges uchanges] (let [[group rchanges uchanges]
(dwlh/generate-add-component shapes objects page-id file-id)] (dwlh/generate-add-component shapes objects page-id file-id)]
@ -278,6 +287,20 @@
:origin it}) :origin it})
(dwc/select-shapes (d/ordered-set (:id group))))))))))) (dwc/select-shapes (d/ordered-set (:id group)))))))))))
(defn add-component
"Add a new component to current file library, from the currently selected shapes.
This operation is made in two steps, first one for calculate the
shapes that will be part of the component and the second one with
the component creation."
[]
(ptk/reify ::add-component
ptk/WatchEvent
(watch [it state _]
(let [objects (wsh/lookup-page-objects state)
selected (->> (wsh/lookup-selected state)
(cp/clean-loops objects))]
(rx/of (add-component2 selected))))))
(defn rename-component (defn rename-component
"Rename the component with the given id, in the current file library." "Rename the component with the given id, in the current file library."
[id new-name] [id new-name]

View file

@ -12,6 +12,7 @@
[app.common.spec :as us] [app.common.spec :as us]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[app.main.data.dashboard :as dd] [app.main.data.dashboard :as dd]
[app.main.data.events :as ev]
[app.main.data.fonts :as df] [app.main.data.fonts :as df]
[app.main.data.media :as di] [app.main.data.media :as di]
[app.main.data.messages :as dm] [app.main.data.messages :as dm]
@ -275,6 +276,10 @@
[id is-shared] [id is-shared]
{:pre [(uuid? id) (boolean? is-shared)]} {:pre [(uuid? id) (boolean? is-shared)]}
(ptk/reify ::set-file-shared (ptk/reify ::set-file-shared
IDeref
(-deref [_]
{::ev/origin "workspace" :id id :shared is-shared})
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(assoc-in state [:workspace-file :is-shared] is-shared)) (assoc-in state [:workspace-file :is-shared] is-shared))
@ -313,7 +318,7 @@
(defn link-file-to-library (defn link-file-to-library
[file-id library-id] [file-id library-id]
(ptk/reify ::link-file-to-library (ptk/reify ::attach-library
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ _] (watch [_ _ _]
(let [fetched #(assoc-in %2 [:workspace-libraries (:id %1)] %1) (let [fetched #(assoc-in %2 [:workspace-libraries (:id %1)] %1)
@ -325,7 +330,7 @@
(defn unlink-file-from-library (defn unlink-file-from-library
[file-id library-id] [file-id library-id]
(ptk/reify ::unlink-file-from-library (ptk/reify ::detach-library
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(d/dissoc-in state [:workspace-libraries library-id])) (d/dissoc-in state [:workspace-libraries library-id]))

View file

@ -91,7 +91,7 @@
:create-component {:tooltip (ds/meta "K") :create-component {:tooltip (ds/meta "K")
:command (ds/c-mod "k") :command (ds/c-mod "k")
:fn #(st/emit! dwl/add-component)} :fn #(st/emit! (dwl/add-component))}
:detach-component {:tooltip (ds/meta-shift "K") :detach-component {:tooltip (ds/meta-shift "K")
:command (ds/c-mod "shift+k") :command (ds/c-mod "shift+k")

View file

@ -12,12 +12,14 @@
[beicon.core :as rx] [beicon.core :as rx]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(mf/defc copy-button [{:keys [data]}] (mf/defc copy-button [{:keys [data on-copied]}]
(let [just-copied (mf/use-state false)] (let [just-copied (mf/use-state false)]
(mf/use-effect (mf/use-effect
(mf/deps @just-copied) (mf/deps @just-copied)
(fn [] (fn []
(when @just-copied (when @just-copied
(when (fn? on-copied)
(on-copied))
(let [sub (timers/schedule 1000 #(reset! just-copied false))] (let [sub (timers/schedule 1000 #(reset! just-copied false))]
;; On unmount we dispose the timer ;; On unmount we dispose the timer
#(rx/-dispose sub))))) #(rx/-dispose sub)))))

View file

@ -7,6 +7,7 @@
(ns app.main.ui.dashboard.comments (ns app.main.ui.dashboard.comments
(:require (:require
[app.main.data.comments :as dcm] [app.main.data.comments :as dcm]
[app.main.data.events :as ev]
[app.main.data.workspace.comments :as dwcm] [app.main.data.workspace.comments :as dwcm]
[app.main.refs :as refs] [app.main.refs :as refs]
[app.main.store :as st] [app.main.store :as st]
@ -15,13 +16,18 @@
[app.main.ui.icons :as i] [app.main.ui.icons :as i]
[app.util.dom :as dom] [app.util.dom :as dom]
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[potok.core :as ptk]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(mf/defc comments-section (mf/defc comments-section
[{:keys [profile team]}] [{:keys [profile team]}]
(mf/use-effect (mf/use-effect
(mf/deps team) (mf/deps team)
(st/emitf (dcm/retrieve-unread-comment-threads (:id team)))) (fn []
(st/emit! (dcm/retrieve-unread-comment-threads (:id team))
(ptk/event ::ev/event {::ev/name "open-comment-notifications"
::ev/origin "dashboard"}))))
(let [show-dropdown? (mf/use-state false) (let [show-dropdown? (mf/use-state false)
show-dropdown (mf/use-fn #(reset! show-dropdown? true)) show-dropdown (mf/use-fn #(reset! show-dropdown? true))
@ -38,7 +44,8 @@
on-navigate on-navigate
(mf/use-callback (mf/use-callback
(fn [thread] (fn [thread]
(st/emit! (dwcm/navigate thread))))] (st/emit! (-> (dwcm/navigate thread)
(with-meta {::ev/origin "dashboard"})))))]
[:div.dashboard-comments-section [:div.dashboard-comments-section
[:div.button [:div.button

View file

@ -7,6 +7,7 @@
(ns app.main.ui.dashboard.export (ns app.main.ui.dashboard.export
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.main.data.events :as ev]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.store :as st] [app.main.store :as st]
[app.main.ui.icons :as i] [app.main.ui.icons :as i]
@ -14,6 +15,7 @@
[app.util.dom :as dom] [app.util.dom :as dom]
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[beicon.core :as rx] [beicon.core :as rx]
[potok.core :as ptk]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(def ^:const options [:all :merge :detach]) (def ^:const options [:all :merge :detach])
@ -58,6 +60,10 @@
start-export start-export
(fn [] (fn []
(st/emit! (ptk/event ::ev/event {::ev/name "export-files"
:num-files (count (:files @state))
:option @selected-option}))
(swap! state assoc :status :exporting) (swap! state assoc :status :exporting)
(->> (uw/ask-many! (->> (uw/ask-many!
{:cmd :export-file {:cmd :export-file
@ -117,7 +123,7 @@
(let [selected? (= @selected-option type)] (let [selected? (= @selected-option type)]
[:div.export-option {:class (when selected? "selected")} [:div.export-option {:class (when selected? "selected")}
[:label.option-container [:label.option-container
[:h3 (tr (str "dashboard.export.options." (d/name type) ".title"))] [:h3 (tr (str "dashboard.export.options." (d/name type) ".title"))]
[:p (tr (str "dashboard.export.options." (d/name type) ".message"))] [:p (tr (str "dashboard.export.options." (d/name type) ".message"))]
[:input {:type "radio" [:input {:type "radio"
:checked selected? :checked selected?

View file

@ -8,6 +8,7 @@
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.main.data.dashboard :as dd] [app.main.data.dashboard :as dd]
[app.main.data.events :as ev]
[app.main.data.messages :as dm] [app.main.data.messages :as dm]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.repo :as rp] [app.main.repo :as rp]
@ -159,6 +160,8 @@
(mf/use-callback (mf/use-callback
(mf/deps files current-team-id) (mf/deps files current-team-id)
(fn [_] (fn [_]
(st/emit! (ptk/event ::ev/event {::ev/name "export-files"
:num-files (count files)}))
(->> (rx/from files) (->> (rx/from files)
(rx/flat-map (rx/flat-map
(fn [file] (fn [file]

View file

@ -7,6 +7,7 @@
(ns app.main.ui.dashboard.files (ns app.main.ui.dashboard.files
(:require (:require
[app.main.data.dashboard :as dd] [app.main.data.dashboard :as dd]
[app.main.data.events :as ev]
[app.main.refs :as refs] [app.main.refs :as refs]
[app.main.store :as st] [app.main.store :as st]
[app.main.ui.dashboard.grid :refer [grid]] [app.main.ui.dashboard.grid :refer [grid]]
@ -62,7 +63,8 @@
(if (:edition @local) (if (:edition @local)
[:& inline-edition {:content (:name project) [:& inline-edition {:content (:name project)
:on-end (fn [name] :on-end (fn [name]
(st/emit! (dd/rename-project (assoc project :name name))) (st/emit! (-> (dd/rename-project (assoc project :name name))
(with-meta {::ev/origin "project"})))
(swap! local assoc :edition false))}] (swap! local assoc :edition false))}]
[:div.dashboard-title [:div.dashboard-title
[:h1 {:on-double-click on-edit} [:h1 {:on-double-click on-edit}

View file

@ -7,6 +7,7 @@
(ns app.main.ui.dashboard.import (ns app.main.ui.dashboard.import
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.main.data.events :as ev]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.store :as st] [app.main.store :as st]
[app.main.ui.components.file-uploader :refer [file-uploader]] [app.main.ui.components.file-uploader :refer [file-uploader]]
@ -17,6 +18,7 @@
[app.util.keyboard :as kbd] [app.util.keyboard :as kbd]
[app.util.logging :as log] [app.util.logging :as log]
[beicon.core :as rx] [beicon.core :as rx]
[potok.core :as ptk]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(log/set-level! :debug) (log/set-level! :debug)
@ -214,6 +216,9 @@
import-files import-files
(mf/use-callback (mf/use-callback
(fn [project-id files] (fn [project-id files]
(st/emit! (ptk/event ::ev/event {::ev/name "import-files"
:num-files (count files)}))
(->> (uw/ask-many! (->> (uw/ask-many!
{:cmd :import-files {:cmd :import-files
:project-id project-id :project-id project-id

View file

@ -7,6 +7,7 @@
(ns app.main.ui.dashboard.projects (ns app.main.ui.dashboard.projects
(:require (:require
[app.main.data.dashboard :as dd] [app.main.data.dashboard :as dd]
[app.main.data.events :as ev]
[app.main.refs :as refs] [app.main.refs :as refs]
[app.main.store :as st] [app.main.store :as st]
[app.main.ui.dashboard.grid :refer [line-grid]] [app.main.ui.dashboard.grid :refer [line-grid]]
@ -74,7 +75,8 @@
(mf/use-callback (mf/use-callback
(mf/deps project) (mf/deps project)
(fn [name] (fn [name]
(st/emit! (dd/rename-project (assoc project :name name))) (st/emit! (-> (dd/rename-project (assoc project :name name))
(with-meta {::ev/origin "dashboard"})))
(swap! local assoc :edition? false))) (swap! local assoc :edition? false)))
on-file-created on-file-created

View file

@ -10,6 +10,7 @@
[app.common.spec :as us] [app.common.spec :as us]
[app.config :as cfg] [app.config :as cfg]
[app.main.data.dashboard :as dd] [app.main.data.dashboard :as dd]
[app.main.data.events :as ev]
[app.main.data.messages :as dm] [app.main.data.messages :as dm]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.refs :as refs] [app.main.refs :as refs]

View file

@ -8,6 +8,7 @@
(:require (:require
[app.common.spec :as us] [app.common.spec :as us]
[app.config :as cfg] [app.config :as cfg]
[app.main.data.events :as ev]
[app.main.data.messages :as dm] [app.main.data.messages :as dm]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.data.users :as du] [app.main.data.users :as du]

View file

@ -7,6 +7,7 @@
(ns app.main.ui.settings.sidebar (ns app.main.ui.settings.sidebar
(:require (:require
[app.config :as cf] [app.config :as cf]
[app.main.data.events :as ev]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.data.users :as du] [app.main.data.users :as du]
[app.main.store :as st] [app.main.store :as st]
@ -14,6 +15,7 @@
[app.main.ui.icons :as i] [app.main.ui.icons :as i]
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[app.util.router :as rt] [app.util.router :as rt]
[potok.core :as ptk]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(mf/defc sidebar-content (mf/defc sidebar-content
@ -52,6 +54,7 @@
(mf/use-callback (mf/use-callback
(fn [event] (fn [event]
(let [version (:main @cf/version)] (let [version (:main @cf/version)]
(st/emit! (ptk/event ::ev/event {::ev/name "show-release-notes" :version version}))
(if (and (.-ctrlKey ^js event) (if (and (.-ctrlKey ^js event)
(.-altKey ^js event)) (.-altKey ^js event))
(st/emit! (modal/show {:type :onboarding})) (st/emit! (modal/show {:type :onboarding}))

View file

@ -11,6 +11,7 @@
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.geom.shapes :as geom] [app.common.geom.shapes :as geom]
[app.main.data.comments :as dcm] [app.main.data.comments :as dcm]
[app.main.data.events :as ev]
[app.main.refs :as refs] [app.main.refs :as refs]
[app.main.store :as st] [app.main.store :as st]
[app.main.ui.comments :as cmt] [app.main.ui.comments :as cmt]
@ -21,7 +22,6 @@
[okulary.core :as l] [okulary.core :as l]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
(mf/defc comments-menu (mf/defc comments-menu
[] []
(let [{cmode :mode cshow :show} (mf/deref refs/comments-local) (let [{cmode :mode cshow :show} (mf/deref refs/comments-local)
@ -105,7 +105,8 @@
(fn [thread] (fn [thread]
(if (= (:open cstate) (:id thread)) (if (= (:open cstate) (:id thread))
(st/emit! (dcm/close-thread)) (st/emit! (dcm/close-thread))
(st/emit! (dcm/open-thread thread))))) (st/emit! (-> (dcm/open-thread thread)
(with-meta {::ev/origin "viewer"}))))))
on-click on-click
(mf/use-callback (mf/use-callback

View file

@ -7,10 +7,13 @@
(ns app.main.ui.viewer.handoff.code (ns app.main.ui.viewer.handoff.code
(:require (:require
["js-beautify" :as beautify] ["js-beautify" :as beautify]
[app.main.data.events :as ev]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.main.ui.components.code-block :refer [code-block]] [app.main.ui.components.code-block :refer [code-block]]
[app.main.ui.components.copy-button :refer [copy-button]] [app.main.ui.components.copy-button :refer [copy-button]]
[app.main.ui.icons :as i] [app.main.ui.icons :as i]
[app.main.store :as st]
[potok.core :as ptk]
[app.util.code-gen :as cg] [app.util.code-gen :as cg]
[app.util.dom :as dom] [app.util.dom :as dom]
[cuerdas.core :as str] [cuerdas.core :as str]
@ -48,7 +51,25 @@
(format-code "css")) (format-code "css"))
markup-code (-> (mf/use-memo (mf/deps shapes) #(generate-markup-code @markup-type shapes)) markup-code (-> (mf/use-memo (mf/deps shapes) #(generate-markup-code @markup-type shapes))
(format-code "svg"))] (format-code "svg"))
on-markup-copied
(mf/use-callback
(mf/deps @markup-type)
(fn []
(st/emit! (ptk/event ::ev/event
{::ev/name "copy-handoff-code"
:type @markup-type}))))
on-style-copied
(mf/use-callback
(mf/deps @style-type)
(fn []
(st/emit! (ptk/event ::ev/event
{::ev/name "copy-handoff-style"
:type @style-type}))))
]
[:div.element-options [:div.element-options
[:div.code-block [:div.code-block
[:div.code-row-lang [:div.code-row-lang
@ -62,7 +83,8 @@
{:on-click on-expand } {:on-click on-expand }
i/full-screen] i/full-screen]
[:& copy-button { :data style-code }]] [:& copy-button {:data style-code
:on-copied on-style-copied}]]
[:div.code-row-display [:div.code-row-display
[:& code-block {:type @style-type [:& code-block {:type @style-type
@ -78,8 +100,8 @@
{:on-click on-expand} {:on-click on-expand}
i/full-screen] i/full-screen]
[:& copy-button { :data markup-code }]] [:& copy-button {:data markup-code
:on-copied on-markup-copied}]]
[:div.code-row-display [:div.code-row-display
[:& code-block {:type @markup-type [:& code-block {:type @markup-type
:code markup-code}]]] :code markup-code}]]]

View file

@ -7,6 +7,7 @@
(ns app.main.ui.workspace.comments (ns app.main.ui.workspace.comments
(:require (:require
[app.main.data.comments :as dcm] [app.main.data.comments :as dcm]
[app.main.data.events :as ev]
[app.main.data.workspace :as dw] [app.main.data.workspace :as dw]
[app.main.data.workspace.comments :as dwcm] [app.main.data.workspace.comments :as dwcm]
[app.main.refs :as refs] [app.main.refs :as refs]
@ -77,8 +78,10 @@
(when (not= page-id (:page-id thread)) (when (not= page-id (:page-id thread))
(st/emit! (dw/go-to-page (:page-id thread)))) (st/emit! (dw/go-to-page (:page-id thread))))
(tm/schedule (tm/schedule
(st/emitf (dwcm/center-to-comment-thread thread) (fn []
(dcm/open-thread thread)))))] (st/emit! (dwcm/center-to-comment-thread thread)
(-> (dcm/open-thread thread)
(with-meta {::ev/origin "workspace"})))))))]
[:div.comments-section.comment-threads-section [:div.comments-section.comment-threads-section
[:div.workspace-comment-threads-sidebar-header [:div.workspace-comment-threads-sidebar-header

View file

@ -70,7 +70,7 @@
do-unmask-group (st/emitf dw/unmask-group) do-unmask-group (st/emitf dw/unmask-group)
do-flip-vertical (st/emitf (dw/flip-vertical-selected)) do-flip-vertical (st/emitf (dw/flip-vertical-selected))
do-flip-horizontal (st/emitf (dw/flip-horizontal-selected)) do-flip-horizontal (st/emitf (dw/flip-horizontal-selected))
do-add-component (st/emitf dwl/add-component) do-add-component (st/emitf (dwl/add-component))
do-detach-component (st/emitf (dwl/detach-component id)) do-detach-component (st/emitf (dwl/detach-component id))
do-reset-component (st/emitf (dwl/reset-component id)) do-reset-component (st/emitf (dwl/reset-component id))
do-start-editing (fn [] do-start-editing (fn []

View file

@ -15,7 +15,7 @@
[app.main.ui.icons :as i] [app.main.ui.icons :as i]
[app.util.data :refer [matches-search]] [app.util.data :refer [matches-search]]
[app.util.dom :as dom] [app.util.dom :as dom]
[app.util.i18n :as i18n :refer [t tr]] [app.util.i18n :as i18n :refer [tr]]
[cuerdas.core :as str] [cuerdas.core :as str]
[okulary.core :as l] [okulary.core :as l]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
@ -78,7 +78,7 @@
(mf/use-callback (mf/use-callback
(mf/deps file) (mf/deps file)
(fn [library-id] (fn [library-id]
(st/emit! (dw/unlink-file-from-library (:id file) library-id) (st/emit! (dw/unlink-file-from-library (:id file) library-id)
(dwl/sync-file (:id file) library-id))))] (dwl/sync-file (:id file) library-id))))]
[:* [:*
[:div.section [:div.section
@ -151,8 +151,6 @@
::mf/register-as :libraries-dialog} ::mf/register-as :libraries-dialog}
[{:keys [] :as ctx}] [{:keys [] :as ctx}]
(let [selected-tab (mf/use-state :libraries) (let [selected-tab (mf/use-state :libraries)
locale (mf/deref i18n/locale)
project (mf/deref refs/workspace-project) project (mf/deref refs/workspace-project)
file (mf/deref workspace-file) file (mf/deref workspace-file)
libraries (->> (mf/deref refs/workspace-libraries) libraries (->> (mf/deref refs/workspace-libraries)
@ -176,11 +174,11 @@
[:div.header-item [:div.header-item
{:class (dom/classnames :active (= @selected-tab :libraries)) {:class (dom/classnames :active (= @selected-tab :libraries))
:on-click #(change-tab :libraries)} :on-click #(change-tab :libraries)}
(t locale "workspace.libraries.libraries")] (tr "workspace.libraries.libraries")]
[:div.header-item [:div.header-item
{:class (dom/classnames :active (= @selected-tab :updates)) {:class (dom/classnames :active (= @selected-tab :updates))
:on-click #(change-tab :updates)} :on-click #(change-tab :updates)}
(t locale "workspace.libraries.updates")]] (tr "workspace.libraries.updates")]]
[:div.libraries-content [:div.libraries-content
(case @selected-tab (case @selected-tab
:libraries :libraries

View file

@ -12,6 +12,7 @@
[app.common.spec :as us] [app.common.spec :as us]
[app.common.text :as txt] [app.common.text :as txt]
[app.config :as cfg] [app.config :as cfg]
[app.main.data.events :as ev]
[app.main.data.modal :as modal] [app.main.data.modal :as modal]
[app.main.data.workspace :as dw] [app.main.data.workspace :as dw]
[app.main.data.workspace.colors :as dc] [app.main.data.workspace.colors :as dc]
@ -39,6 +40,7 @@
[cljs.spec.alpha :as s] [cljs.spec.alpha :as s]
[cuerdas.core :as str] [cuerdas.core :as str]
[okulary.core :as l] [okulary.core :as l]
[potok.core :as ptk]
[rumext.alpha :as mf])) [rumext.alpha :as mf]))
; TODO: refactor to remove duplicate code and less parameter passing. ; TODO: refactor to remove duplicate code and less parameter passing.
@ -621,7 +623,9 @@
(fn [blobs] (fn [blobs]
(let [params {:file-id file-id (let [params {:file-id file-id
:blobs (seq blobs)}] :blobs (seq blobs)}]
(st/emit! (dw/upload-media-asset params))))) (st/emit! (dw/upload-media-asset params)
(ptk/event ::ev/event {::ev/name "add-asset-to-library"
:asset-type "graphics"})))))
on-delete on-delete
(mf/use-callback (mf/use-callback
@ -977,7 +981,9 @@
(mf/use-callback (mf/use-callback
(mf/deps file-id) (mf/deps file-id)
(fn [event] (fn [event]
(st/emitf (dwl/set-assets-box-open file-id :colors true)) (st/emit! (dwl/set-assets-box-open file-id :colors true)
(ptk/event ::ev/event {::ev/name "add-asset-to-library"
:asset-type "color"}))
(modal/show! :colorpicker (modal/show! :colorpicker
{:x (.-clientX event) {:x (.-clientX event)
:y (.-clientY event) :y (.-clientY event)
@ -1150,7 +1156,9 @@
(mf/use-callback (mf/use-callback
(mf/deps file-id) (mf/deps file-id)
(fn [_] (fn [_]
(st/emit! (dwl/add-typography txt/default-typography)))) (st/emit! (dwl/add-typography txt/default-typography)
(ptk/event ::ev/event {::ev/name "add-asset-to-library"
:asset-type "typography"}))))
handle-change handle-change
(mf/use-callback (mf/use-callback