0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-10 14:51:37 -05:00

♻️ Replace lentes with okulary (performance).

This commit is contained in:
Andrey Antukh 2020-04-11 19:22:24 +02:00 committed by Alonso Torres
parent 9649d67883
commit cd61269cd5
28 changed files with 162 additions and 300 deletions

View file

@ -13,9 +13,11 @@
funcool/beicon {:mvn/version "2020.03.29-1"}
funcool/cuerdas {:mvn/version "2020.03.26-3"}
funcool/lentes {:mvn/version "1.4.0-SNAPSHOT"}
funcool/okulary {:mvn/version "2020.04.11-0"}
funcool/potok {:mvn/version "2.8.0-SNAPSHOT"}
funcool/promesa {:mvn/version "5.1.0"}
funcool/rumext {:mvn/version "2020.04.08-1"}
funcool/rumext {:mvn/version "2020.04.11-0"}
}
:aliases
{:dev

View file

@ -9,68 +9,61 @@
(ns uxbox.main.refs
"A collection of derived refs."
(:require [lentes.core :as l]
[beicon.core :as rx]
[uxbox.main.constants :as c]
[uxbox.main.store :as st]
[uxbox.main.data.helpers :as helpers]))
(:require
[okulary.core :as l]
[beicon.core :as rx]
[uxbox.main.constants :as c]
[uxbox.main.store :as st]
[uxbox.main.data.helpers :as helpers]))
(def route
(l/derived :route st/state))
(def router
(l/derived :router st/state))
(def message
(l/derived :message st/state))
(def profile
(-> (l/key :profile)
(l/derive st/state)))
(def workspace
(-> (l/key :workspace-local)
(l/derive st/state)))
(l/derived :profile st/state))
(def workspace-local
(-> (l/key :workspace-local)
(l/derive st/state)))
(l/derived :workspace-local st/state))
(def workspace-layout
(-> (l/key :workspace-layout)
(l/derive st/state)))
(l/derived :workspace-layout st/state))
(def workspace-page
(-> (l/key :workspace-page)
(l/derive st/state)))
(l/derived :workspace-page st/state))
(def workspace-file
(-> (l/key :workspace-file)
(l/derive st/state)))
(l/derived :workspace-file st/state))
(def workspace-project
(-> (l/key :workspace-project)
(l/derive st/state)))
(l/derived :workspace-project st/state))
(def workspace-images
(-> (l/key :workspace-images)
(l/derive st/state)))
(l/derived :workspace-images st/state))
(def workspace-users
(-> (l/key :workspace-users)
(l/derive st/state)))
(l/derived :workspace-users st/state))
(def workspace-data
(-> (l/lens #(let [page-id (get-in % [:workspace-page :id])]
(get-in % [:workspace-data page-id])))
(l/derive st/state)))
(def objects
(-> (l/lens #(let [page-id (get-in % [:workspace-page :id])]
(get-in % [:workspace-data page-id :objects])))
(l/derive st/state)))
(-> #(let [page-id (get-in % [:workspace-page :id])]
(get-in % [:workspace-data page-id]))
(l/derived st/state)))
(defn objects-by-id
[ids]
(-> (l/lens (fn [state]
(let [page-id (get-in state [:workspace-page :id])
objects (get-in state [:workspace-data page-id :objects])]
(->> (set ids)
(map #(get objects %))
(filter identity)
(vec)))))
(l/derive st/state {:equals? =})))
(letfn [(selector [state]
(let [page-id (get-in state [:workspace-page :id])
objects (get-in state [:workspace-data page-id :objects])]
(->> (set ids)
(map #(get objects %))
(filter identity)
(vec))))]
(l/derived selector st/state =)))
(defn is-child-selected?
[id]
@ -81,71 +74,20 @@
shape (get objects id)
children (helpers/get-children id objects)]
(some selected children)))]
(-> (l/lens selector)
(l/derive st/state))))
(l/derived selector st/state)))
(def selected-shapes
(-> (l/key :selected)
(l/derive workspace-local)))
(l/derived :selected workspace-local))
(defn make-selected
[id]
(-> (l/lens #(contains? % id))
(l/derive selected-shapes)))
(l/derived #(contains? % id) selected-shapes))
(def selected-frame
(-> (l/key :selected-frame)
(l/derive workspace-local)))
(def toolboxes
(-> (l/key :toolboxes)
(l/derive workspace-local)))
;; DEPRECATED
(def selected-zoom
(-> (l/key :zoom)
(l/derive workspace-local)))
(def selected-tooltip
(-> (l/key :tooltip)
(l/derive workspace-local)))
(def selected-drawing-shape
(-> (l/key :drawing)
(l/derive workspace-local)))
(l/derived :zoom workspace-local))
(def selected-drawing-tool
(-> (l/key :drawing-tool)
(l/derive workspace)))
(l/derived :drawing-tool workspace-local))
(def selected-edition
(-> (l/key :edition)
(l/derive workspace)))
(def history
(-> (l/key :history)
(l/derive workspace)))
(defn selected-modifiers
[id]
{:pre [(uuid? id)]}
(-> (l/in [:modifiers id])
(l/derive workspace)))
(defn alignment-activated?
[flags]
(and (contains? flags :grid-indexed)
(contains? flags :grid-snap)))
(def selected-alignment
(-> (comp (l/key :flags)
(l/lens alignment-activated?))
(l/derive workspace)))
(def shapes-by-id
(-> (l/key :shapes)
(l/derive st/state)))
(l/derived :edition workspace-local))

View file

@ -2,14 +2,15 @@
;; 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) 2015-2017 Andrey Antukh <niwi@niwi.nz>
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.store
(:require [beicon.core :as rx]
[lentes.core :as l]
[potok.core :as ptk]
[uxbox.common.uuid :as uuid]
[uxbox.util.storage :refer [storage]]))
(:require
[beicon.core :as rx]
[okulary.core :as l]
[potok.core :as ptk]
[uxbox.common.uuid :as uuid]
[uxbox.util.storage :refer [storage]]))
;; TODO: move outside uxbox.main
@ -17,8 +18,8 @@
(def ^:dynamic *on-error* identity)
(defonce state (atom {}))
(defonce loader (atom false))
(defonce state (l/atom {}))
(defonce loader (l/atom false))
(defonce store (ptk/store {:on-error #(*on-error* %)}))
(defonce stream (ptk/input-stream store))
@ -44,10 +45,6 @@
(rx/filter (fn [s] (deref *debug*)) $)
(rx/subscribe $ (fn [event]
(println "[stream]: " (repr-event event)))))))
(def auth-ref
(-> (l/key :auth)
(l/derive state)))
(defn emit!
([] nil)
([event]

View file

@ -11,33 +11,28 @@
(:require
[beicon.core :as rx]
[cuerdas.core :as str]
[lentes.core :as l]
[potok.core :as ptk]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.common.exceptions :as ex]
[uxbox.common.data :as d]
[uxbox.common.exceptions :as ex]
[uxbox.main.data.auth :refer [logout]]
[uxbox.main.data.messages :as dm]
[uxbox.main.refs :as refs]
[uxbox.main.store :as st]
[uxbox.main.ui.dashboard :refer [dashboard]]
[uxbox.main.ui.login :refer [login-page]]
[uxbox.main.ui.not-found :refer [not-found-page]]
[uxbox.main.ui.profile.recovery :refer [profile-recovery-page]]
[uxbox.main.ui.profile.recovery-request :refer [profile-recovery-request-page]]
[uxbox.main.ui.profile.register :refer [profile-register-page]]
[uxbox.main.ui.viewer :refer [viewer-page]]
[uxbox.main.ui.settings :as settings]
[uxbox.main.ui.not-found :refer [not-found-page]]
[uxbox.main.ui.shapes]
[uxbox.main.ui.viewer :refer [viewer-page]]
[uxbox.main.ui.workspace :as workspace]
[uxbox.util.i18n :refer [tr]]
[uxbox.util.timers :as ts]))
(def route-iref
(-> (l/key :route)
(l/derive st/state)))
;; --- Routes
(def routes
@ -142,7 +137,7 @@
(mf/defc app
[]
(let [route (mf/deref route-iref)]
(let [route (mf/deref refs/route)]
(when route
[:& app-container {:route route :key (get-in route [:data :name])}])))

View file

@ -6,7 +6,7 @@
(ns uxbox.main.ui.colorpicker
(:require
[lentes.core :as l]
[okulary.core :as l]
[uxbox.main.store :as st]
[goog.object :as gobj]
[rumext.alpha :as mf]
@ -15,7 +15,6 @@
(mf/defc colorpicker
[{:keys [on-change value colors] :as props}]
(let [local-value (mf/use-state value)
on-change-complete #(do
(reset! local-value %)
(on-change (gobj/get % "hex")))]
@ -26,18 +25,16 @@
:onChangeComplete on-change-complete
:style {:box-shadow "none"}}]))
(defn- lookup-colors
[state]
(as-> {} $
(reduce (fn [acc shape]
(-> acc
(update (:fill-color shape) (fnil inc 0))
(update (:stroke-color shape) (fnil inc 0))))
$ (vals (:shapes state)))
(reverse (sort-by second $))
(map first $)
(remove nil? $)))
(def most-used-colors
(-> (l/lens lookup-colors)
(l/derive st/state)))
(letfn [(selector [{:keys [objects]}]
(as-> {} $
(reduce (fn [acc shape]
(-> acc
(update (:fill-color shape) (fnil inc 0))
(update (:stroke-color shape) (fnil inc 0))))
$ (vals objects))
(reverse (sort-by second $))
(map first $)
(remove nil? $)))]
(l/derived selector st/state)))

View file

@ -10,7 +10,7 @@
(ns uxbox.main.ui.dashboard.library
(:require
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[cuerdas.core :as str]
[uxbox.util.router :as rt]
@ -302,16 +302,16 @@
:accept-text "Delete"}))]]}]]])))
(defn libraries-ref [section team-id]
(-> (comp (l/key :library) (l/key section) (l/key team-id))
(l/derive st/state)))
(-> (l/in [:library section team-id])
(l/derived st/state)))
(defn selected-items-ref [section library-id]
(-> (comp (l/key :library-items) (l/key section) (l/key library-id))
(l/derive st/state)))
(-> (l/in [:library-items section library-id])
(l/derived st/state)))
(def last-deleted-library-ref
(-> (comp (l/key :library) (l/key :last-deleted-library))
(l/derive st/state)))
(-> (l/in [:library :last-deleted-library])
(l/derived st/state)))
(mf/defc library-page
[{:keys [team-id library-id section]}]

View file

@ -9,7 +9,7 @@
(ns uxbox.main.ui.dashboard.project
(:require
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.util.i18n :as i18n :refer [t]]
@ -24,13 +24,11 @@
[uxbox.main.ui.dashboard.grid :refer [grid]]))
(def projects-ref
(-> (l/key :projects)
(l/derive st/state)))
(l/derived :projects st/state))
(def files-ref
(-> (comp (l/key :files)
(l/lens vals))
(l/derive st/state)))
(-> (comp vals :files)
(l/derived st/state)))
(mf/defc project-header
[{:keys [team-id project-id] :as props}]

View file

@ -9,7 +9,7 @@
(ns uxbox.main.ui.dashboard.recent-files
(:require
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.common.exceptions :as ex]
@ -31,16 +31,13 @@
;; --- Component: Content
(def projects-ref
(-> (l/key :projects)
(l/derive st/state)))
(l/derived :projects st/state))
(def recent-file-ids-ref
(-> (l/key :recent-file-ids)
(l/derive st/state)))
(l/derived :recent-file-ids st/state))
(def files-ref
(-> (l/key :files)
(l/derive st/state)))
(l/derived :files st/state))
;; --- Component: Recent files

View file

@ -10,7 +10,7 @@
(ns uxbox.main.ui.dashboard.search
(:require
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.main.store :as st]
[uxbox.main.data.dashboard :as dsh]
@ -20,8 +20,8 @@
;; --- Component: Search
(def search-result-ref
(-> (l/in [:dashboard-local :search-result])
(l/derive st/state)))
(-> #(get-in % [:dashboard-local :search-result])
(l/derived st/state)))
(mf/defc search-page
[{:keys [team-id search-term] :as props}]

View file

@ -11,7 +11,7 @@
(ns uxbox.main.ui.dashboard.sidebar
(:require
[cuerdas.core :as str]
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[goog.functions :as f]
[uxbox.builtins.icons :as i]
@ -65,8 +65,7 @@
[:span.element-title name]])]))
(def projects-iref
(-> (l/key :projects)
(l/derive st/state)))
(l/derived :projects st/state))
(mf/defc sidebar-projects
[{:keys [team-id selected-project-id] :as props}]

View file

@ -1,29 +1,22 @@
(ns uxbox.main.ui.messages
(:require
[lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.main.data.messages :as dm]
[uxbox.main.refs :as refs]
[uxbox.main.store :as st]
[uxbox.util.data :refer [classnames]]
[uxbox.util.dom :as dom]
[uxbox.util.timers :as ts]
[uxbox.util.i18n :as i18n :refer [t]]
[uxbox.util.data :refer [classnames]]))
[uxbox.util.timers :as ts]))
;; --- Main Component (entry point)
(declare notification)
(def ^:private message-iref
(-> (l/key :message)
(l/derive st/state)))
(mf/defc messages
[]
(let [message (mf/deref message-iref)
;; message {:type :error
;; :content "Hello world!"}
]
(let [message (mf/deref refs/message)]
(when message
[:& notification {:type (:type message)
:status (:status message)
@ -31,7 +24,7 @@
(mf/defc messages-widget
[]
(let [message (mf/deref message-iref)
(let [message (mf/deref refs/message)
message {:type :error
:content "Hello world!"}]

View file

@ -12,7 +12,7 @@
[beicon.core :as rx]
[goog.events :as events]
[goog.object :as gobj]
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.common.exceptions :as ex]
@ -93,12 +93,10 @@
;; --- Component: Viewer Page
(def viewer-data-ref
(-> (l/key :viewer-data)
(l/derive st/state)))
(l/derived :viewer-data st/state))
(def viewer-local-ref
(-> (l/key :viewer-local)
(l/derive st/state)))
(l/derived :viewer-local st/state))
(mf/defc viewer-page
[{:keys [page-id index token] :as props}]

View file

@ -65,7 +65,7 @@
[:& colorpalette {:left-sidebar? left-sidebar?}])
[:& messages]
[:& context-menu {}]
[:& context-menu]
[:section.workspace-content
{:class classes

View file

@ -2,42 +2,40 @@
;; 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) 2015-2017 Andrey Antukh <niwi@niwi.nz>
;; Copyright (c) 2015-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.colorpalette
(:require
[beicon.core :as rx]
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.main.data.colors :as udc]
[uxbox.main.data.workspace :as udw]
[uxbox.main.data.library :as dlib]
[uxbox.main.data.workspace :as udw]
[uxbox.main.refs :as refs]
[uxbox.main.store :as st]
[uxbox.main.ui.components.context-menu :refer [context-menu]]
[uxbox.main.ui.keyboard :as kbd]
[uxbox.util.color :refer [hex->rgb]]
[uxbox.util.data :refer [read-string seek]]
[uxbox.util.dom :as dom]
[uxbox.main.ui.components.context-menu :refer [context-menu]]))
[uxbox.util.dom :as dom]))
;; --- Refs
(def project-ref
(-> (l/key :workspace-project)
(l/derive st/state)))
(def libraries-ref
(-> (comp (l/key :library) (l/key :palettes))
(l/derive st/state)))
(l/derived #(get-in % [:library :palettes]) st/state))
(defn selected-items-ref [library-id]
(-> (comp (l/key :library-items) (l/key :palettes) (l/key library-id))
(l/derive st/state)))
(defn selected-items-ref
[library-id]
(->> #(get-in % [:library-items :palettes library-id])
(l/derived st/state)))
(def selected-library-ref
(-> (comp (l/key :library-selected) (l/key :palettes))
(l/derive st/state)))
(-> #(get-in % [:library-selected :palettes])
(l/derived st/state)))
;; --- Components
@ -64,7 +62,7 @@
(mf/use-effect
(mf/deps current-selection)
#(st/emit! (dlib/retrieve-library-data :palettes current-selection)))
(let [items (-> current-selection selected-items-ref mf/deref)
doc-width (.. js/document -documentElement -clientWidth)
width (:width @state (* doc-width 0.84))
@ -108,7 +106,7 @@
[:div.color-palette {:class (when left-sidebar? "left-sidebar-open")}
[:& context-menu {:selectable true
:selected (->> libraries (filter #(= (:id %) current-selection)) first :name)
:selected (->> libraries (filter #(= (:id %) current-selection)) first :name)
:show (:show-menu @state)
:on-close #(swap! state assoc :show-menu false)
:options (mapv #(vector (:name %) (partial handle-click %)) libraries)} ]
@ -130,7 +128,7 @@
(mf/defc colorpalette
[{:keys [left-sidebar?]}]
(let [team-id (-> project-ref mf/deref :team-id)
(let [team-id (-> refs/workspace-project mf/deref :team-id)
libraries (-> libraries-ref mf/deref vals flatten)]
(mf/use-effect #(st/emit! (dlib/retrieve-libraries :palettes)
(dlib/retrieve-libraries :palettes team-id)))

View file

@ -7,29 +7,10 @@
(ns uxbox.main.ui.workspace.colorpicker
(:require
[lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.store :as st]
[uxbox.main.ui.colorpicker :as cp]))
;; --- Recent Colors Calc. Algorithm
(defn- lookup-colors
[state]
(as-> {} $
(reduce (fn [acc shape]
(-> acc
(update (:fill-color shape) (fnil inc 0))
(update (:stroke-color shape) (fnil inc 0))))
$ (vals (:shapes state)))
(reverse (sort-by second $))
(map first $)
(remove nil? $)))
(def most-used-colors
(-> (l/lens lookup-colors)
(l/derive st/state)))
;; --- Color Picker Modal
(mf/defc colorpicker-modal
@ -38,7 +19,7 @@
{:style {:left (str (- x 260) "px")
:top (str (- y 50) "px")}}
[:& cp/colorpicker {:value (or value default)
:colors (into-array @most-used-colors)
:colors (into-array @cp/most-used-colors)
:on-change on-change}]])

View file

@ -11,7 +11,7 @@
"A workspace specific context menu (mouse right click)."
(:require
[beicon.core :as rx]
[lentes.core :as l]
[okulary.core :as l]
[potok.core :as ptk]
[rumext.alpha :as mf]
[uxbox.main.store :as st]
@ -24,8 +24,7 @@
[uxbox.main.ui.components.dropdown :refer [dropdown]]))
(def menu-ref
(-> (l/key :context-menu)
(l/derive refs/workspace-local)))
(l/derived :context-menu refs/workspace-local))
(defn- prevent-default
[event]
@ -102,8 +101,8 @@
[:& menu-entry {:title "Hide"
:on-click do-hide-shape}])
(if (:blocked shape)
[:& menu-entry {:title "Unlock"
:on-click do-unlock-shape}]

View file

@ -131,13 +131,10 @@
ptk/WatchEvent
(watch [_ state stream]
(let [{:keys [zoom flags]} (:workspace-local state)
align? (refs/alignment-activated? flags)
stoper? #(or (ms/mouse-up? %) (= % :interrupt))
stoper (rx/filter stoper? stream)
mouse (->> ms/mouse-position
;; (rx/mapcat #(conditional-align % align?))
(rx/map #(gpt/divide % (gpt/point zoom))))]
(rx/concat
(->> mouse
@ -181,14 +178,12 @@
(watch [_ state stream]
(let [{:keys [zoom flags]} (:workspace-local state)
align? (refs/alignment-activated? flags)
last-point (volatile! (gpt/divide @ms/mouse-position (gpt/point zoom)))
stoper (->> (rx/filter stoper-event? stream)
(rx/share))
mouse (->> (rx/sample 10 ms/mouse-position)
;; (rx/mapcat #(conditional-align % align?))
(rx/map #(gpt/divide % (gpt/point zoom))))
points (->> stream
@ -255,10 +250,8 @@
ptk/WatchEvent
(watch [_ state stream]
(let [{:keys [zoom flags]} (:workspace-local state)
align? (refs/alignment-activated? flags)
stoper (rx/filter stoper-event? stream)
mouse (->> (rx/sample 10 ms/mouse-position)
;; (rx/mapcat #(conditional-align % align?))
(rx/map #(gpt/divide % (gpt/point zoom))))]
(rx/concat
(rx/of initialize-drawing)
@ -350,8 +343,3 @@
:on-click on-click
:on-mouse-enter on-mouse-enter
:on-mouse-leave on-mouse-leave}])])))
;; (defn- conditional-align [point align?]
;; (if align?
;; (uwrk/align-point point)
;; (rx/of point)))

View file

@ -2,27 +2,27 @@
;; 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) 2015-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
;; Copyright (c) 2015-2019 Andrey Antukh <niwi@niwi.nz>
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.grid
(:require
[cuerdas.core :as str]
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.main.refs :as refs]
[uxbox.main.constants :as c]))
[uxbox.main.constants :as c]
[uxbox.main.refs :as refs]))
;; --- Grid (Component)
(def options-iref
(-> (l/key :options)
(l/derive refs/workspace-data)))
(l/derived :options refs/workspace-data))
(mf/defc grid
{:wrap [mf/memo]}
[props]
(prn "grid$render")
(let [options (mf/deref options-iref)
width (:grid-x options 10)
height (:grid-y options 10)

View file

@ -10,7 +10,6 @@
(ns uxbox.main.ui.workspace.header
(:require
[lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i :include-macros true]
[uxbox.config :as cfg]
@ -144,17 +143,13 @@
;; --- Header Component
(def router-ref
(-> (l/key :router)
(l/derive st/state)))
(mf/defc header
[{:keys [page file layout project] :as props}]
(let [locale (i18n/use-locale)
go-to-dashboard #(st/emit! (rt/nav :dashboard-team {:team-id "self"}))
zoom (mf/deref refs/selected-zoom)
locale (i18n/use-locale)
router (mf/deref router-ref)
router (mf/deref refs/router)
view-url (rt/resolve router :viewer {:page-id (:id page)} {:index 0})]
[:header.workspace-header
[:div.main-icon

View file

@ -21,6 +21,7 @@
[uxbox.common.uuid :as uuid]))
;; --- Refs
;; TODO: pending refactor
(def ^:private collections-iref
(-> (l/key :images-collections)

View file

@ -18,7 +18,9 @@
(mf/defc align-options
[]
(let [selected (mf/deref refs/selected-shapes)
objects (deref refs/objects) ; don't need to watch objects, only read the value
;; don't need to watch objects, only read the value
objects (:objects (deref refs/workspace-data))
disabled (cond
(empty? selected) true

View file

@ -73,7 +73,7 @@
(mf/defc history-toolbox
[props]
(let [history (mf/deref refs/history)
(let [history nil #_(mf/deref refs/history)
section (mf/use-state :main)
;; close #(st/emit! (dw/toggle-flag :history))
close (constantly nil)
@ -102,7 +102,7 @@
(mf/defc history-dialog
[props]
(let [history (mf/deref refs/history)
(let [history nil #_(mf/deref refs/history)
version (:selected history)
on-accept #(st/emit! udh/apply-selected)
on-cancel #(st/emit! udh/deselect)]

View file

@ -10,7 +10,6 @@
(ns uxbox.main.ui.workspace.sidebar.layers
(:require
[lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.common.data :as d]
[uxbox.builtins.icons :as i]
@ -26,10 +25,6 @@
[uxbox.common.uuid :as uuid]
[uxbox.util.i18n :as i18n :refer [t]]))
(def ^:private shapes-iref
(-> (l/key :shapes)
(l/derive st/state)))
;; --- Helpers
(mf/defc element-icon

View file

@ -9,7 +9,7 @@
(ns uxbox.main.ui.workspace.sidebar.libraries
(:require
[lentes.core :as l]
[okulary.core :as l]
[cuerdas.core :as str]
[rumext.alpha :as mf]
[uxbox.common.data :as d]
@ -31,25 +31,21 @@
;; --- Refs
(def project-ref
(-> (l/key :workspace-project)
(l/derive st/state)))
(defn libraries-ref [section]
(-> (comp (l/key :library) (l/key section))
(l/derive st/state)))
(-> (l/in [:library section])
(l/derived st/state)))
(defn selected-items-ref [section library-id]
(-> (comp (l/key :library-items) (l/key section) (l/key library-id))
(l/derive st/state)))
(-> (l/in [:library-items section library-id])
(l/derived st/state)))
(defn selected-library-ref [section]
(-> (comp (l/key :library-selected) (l/key section))
(l/derive st/state)))
(-> (l/in [:library-selected section])
(l/derived st/state)))
(defn selected-filter-ref [section]
(-> (comp (l/key :library-filter) (l/key section))
(l/derive st/state)))
(-> (l/in [:library-filter section])
(l/derived st/state)))
(defmulti shape-from-item (fn [type _] type))
@ -111,7 +107,7 @@
(if (= section :icons)
[:svg {:view-box (->> item :metadata :view-box (str/join " "))
:width (-> item :metadata :width)
:height (-> item :metadat :height)
:height (-> item :metadat :height)
:dangerouslySetInnerHTML {:__html (:content item)}}]
[:img {:draggable false
:src (:thumb-uri item)}])
@ -121,7 +117,7 @@
[{:keys [key]}]
(let [state (mf/use-state {:menu-open false})
selected-filter (fn [section] (or (mf/deref (selected-filter-ref section)) :all))
team-id (-> project-ref mf/deref :team-id)
team-id (-> refs/workspace-project mf/deref :team-id)
filter-to-str {:all (tr "workspace.library.all")
:own (tr "workspace.library.own")

View file

@ -2,12 +2,14 @@
;; 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) 2015-2016 Andrey Antukh <niwi@niwi.nz>
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.sidebar.options
(:require
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.main.data.workspace :as udw]
@ -46,8 +48,8 @@
[{:keys [shape-id page-id] :as props}]
(let [shape-iref (-> (mf/deps shape-id page-id)
(mf/use-memo
#(-> (l/in [:workspace-data page-id :objects shape-id])
(l/derive st/state))))
#(-> (l/in [:objects shape-id])
(l/derived refs/workspace-data))))
shape (mf/deref shape-iref)]
[:& shape-options {:shape shape}]))

View file

@ -10,7 +10,7 @@
(:require
[cuerdas.core :as str]
[rumext.alpha :as mf]
[lentes.core :as l]
[okulary.core :as l]
[uxbox.common.data :as d]
[uxbox.builtins.icons :as i]
[uxbox.main.constants :as c]
@ -66,8 +66,7 @@
:grid-color "#cccccc"})
(def options-iref
(-> (l/key :options)
(l/derive refs/workspace-data)))
(l/derived :options refs/workspace-data))
(mf/defc grid-options
{:wrap [mf/memo]}

View file

@ -8,7 +8,7 @@
(ns uxbox.main.ui.workspace.sidebar.sitemap
(:require
[cuerdas.core :as str]
[lentes.core :as l]
[okulary.core :as l]
[rumext.alpha :as mf]
[uxbox.builtins.icons :as i]
[uxbox.main.data.workspace :as dw]
@ -92,8 +92,7 @@
(defn- make-page-ref
[page-id]
(-> (l/in [:pages page-id])
(l/derive st/state)))
(l/derived #(get-in % [:pages page-id]) st/state))
(mf/defc page-item-wrapper
[{:keys [page-id index deletable? selected?] :as props}]

View file

@ -102,23 +102,12 @@
;; --- Viewport
(declare remote-user-cursors)
(declare frames)
(mf/defc frames-wrapper
{::mf/wrap-props false}
[props]
(let [page (unchecked-get props "page")
page-id (:id page)
data-ref (-> (mf/deps page-id)
(mf/use-memo #(-> (l/in [:workspace-data page-id])
(l/derive st/state))))
data (mf/deref data-ref)]
[:& frames {:data data}]))
(mf/defc frames
{:wrap [mf/memo]}
[{:keys [data] :as props}]
(let [objects (:objects data)
[]
(let [data (mf/deref refs/workspace-data)
objects (:objects data)
root (get objects uuid/zero)
shapes (->> (:shapes root)
(map #(get objects %)))]
@ -304,7 +293,7 @@
:on-drop on-drop}
[:g.zoom {:transform (str "scale(" zoom ", " zoom ")")}
;; [:& perf/profiler {:label "viewport-frames"}
[:& frames-wrapper {:page page}]
[:& frames]
(when (seq selected)
[:& selection-handlers {:selected selected