0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-09 16:30:37 -05:00

Implement page persistence.

This commit is contained in:
Andrey Antukh 2016-03-19 17:47:31 +02:00
parent a90ef042d5
commit a17b79da77
3 changed files with 116 additions and 64 deletions

View file

@ -25,7 +25,7 @@
(defrecord PagesFetched [pages]
rs/UpdateEvent
(-apply-update [_ state]
(reduce stpr/assoc-page state pages)))
(reduce stpr/unpack-page state pages)))
(defn pages-fetched?
[v]
@ -70,7 +70,6 @@
:layout [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:project [sc/required sc/uuid]})
(defn create-page
@ -106,7 +105,6 @@
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:layout [sc/required sc/string]})
(defn update-page
@ -132,7 +130,6 @@
rs/WatchEvent
(-apply-watch [this state s]
(println "UpdatePageMetadata" "-apply-watch")
(letfn [(on-success [{page :payload}]
(println "on-success")
#(assoc-in % [:pages-by-id id :version] (:version page)))
@ -144,12 +141,9 @@
(rx/map on-success)
(rx/catch on-failure)))))
(def ^:static +update-page-metadata-schema+
(dissoc +update-page-schema+ :data))
(defn update-page-metadata
[data]
(sc/validate! +update-page-metadata-schema+ data)
(sc/validate! +update-page-schema+ data)
(map->UpdatePageMetadata (dissoc data :data)))

View file

@ -30,6 +30,31 @@
acc))
shapes
shapes))))
(defn pack-page
"Return a packed version of page object ready
for send to remore storage service."
[state id]
(let [page (get-in state [:pages-by-id id])
xf (filter #(= (:page (second %)) id))
shapes (into {} xf (:shapes-by-id state))]
(-> page
(assoc-in [:data :shapes] (into [] (:shapes page)))
(assoc-in [:data :shapes-by-id] shapes)
(update-in [:data] dissoc :items)
(dissoc :shapes))))
(defn unpack-page
"Unpacks packed page object and assocs it to the
provided state."
[state page]
(let [shapes (get-in page [:data :shapes])
shapes-by-id (get-in page [:data :shapes-by-id])
page (-> page
(dissoc page :data)
(assoc :shapes shapes))]
(-> state
(update :shapes-by-id merge shapes-by-id)
(assoc-page page))))
(defn dissoc-page
"Remove page and all related stuff from the state."

View file

@ -1,13 +1,16 @@
(ns uxbox.ui.workspace
(:refer-clojure :exclude [dedupe])
(:require [sablono.core :as html :refer-macros [html]]
[rum.core :as rum]
[beicon.core :as rx]
[lentes.core :as l]
[uxbox.rstore :as rs]
[uxbox.state :as st]
[uxbox.state.project :as stpr]
[uxbox.data.workspace :as dw]
[uxbox.data.projects :as dp]
[uxbox.data.pages :as udp]
[uxbox.util.lens :as ul]
[uxbox.util.geom.point :as gpt]
[uxbox.util.data :refer (classnames)]
[uxbox.ui.core :as uuc]
@ -25,6 +28,92 @@
;; Workspace
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn focus-page
[id]
(as-> (ul/getter #(stpr/pack-page % id)) $
(l/focus-atom $ st/state)))
(defn on-page-change
[page]
(rs/emit! (udp/update-page page)))
(defn subscribe-to-page-changes
[pageid]
(as-> (focus-page pageid) $
(rx/from-atom $)
(rx/skip 1 $)
(rx/dedupe #(dissoc % :version) $)
(rx/debounce 1000 $)
(rx/subscribe $ on-page-change #(throw %))))
(defn- workspace-will-mount
[own]
(let [[projectid pageid] (:rum/props own)]
(rs/emit! (dw/initialize projectid pageid)
(dp/fetch-projects)
(udp/fetch-pages projectid))
own))
(defn- workspace-did-mount
[own]
(letfn [(handle-scroll-interaction []
(let [stoper (->> uuc/actions-s
(rx/map :type)
(rx/filter #(not= % :scroll/viewport))
(rx/take 1))
local (:rum/local own)
initial @uuwb/mouse-viewport-a]
(swap! local assoc :scrolling true)
(as-> uuwb/mouse-viewport-s $
(rx/take-until stoper $)
(rx/subscribe $ #(on-scroll % initial) nil on-scroll-end))))
(on-scroll-end []
(let [local (:rum/local own)]
(swap! local assoc :scrolling false)))
(on-scroll [pt initial]
(let [{:keys [x y]} (gpt/subtract pt initial)
el (mx/get-ref-dom own "workspace-canvas")
cx (.-scrollLeft el)
cy (.-scrollTop el)]
(set! (.-scrollLeft el) (- cx x))
(set! (.-scrollTop el) (- cy y))))]
(let [[projectid pageid] (:rum/props own)
el (mx/get-ref-dom own "workspace-canvas")
sub1 (as-> uuc/actions-s $
(rx/map :type $)
(rx/dedupe $)
(rx/filter #(= :scroll/viewport %) $)
(rx/on-value $ handle-scroll-interaction))
sub2 (subscribe-to-page-changes pageid)]
(set! (.-scrollLeft el) uuwb/canvas-start-scroll-x)
(set! (.-scrollTop el) uuwb/canvas-start-scroll-y)
(assoc own ::sub1 sub1 ::sub2 sub2))))
(defn- workspace-will-unmount
[own]
(let [sub1 (::sub1 own)
sub2 (::sub2 own)]
(.close sub1)
(.close sub2)
(dissoc own ::sub1 ::sub2)))
(defn- workspace-transfer-state
[old-state state]
(let [[projectid pageid] (:rum/props state)
[oldprojectid oldpageid] (:rum/props old-state)]
(if (not= pageid oldpageid)
(do
(rs/emit! (dw/initialize projectid pageid))
(.close (::sub2 old-state))
(assoc state
::sub1 (::sub1 old-state)
::sub2 (subscribe-to-page-changes pageid)))
(assoc state
::sub1 (::sub1 old-state)
::sub2 (::sub2 old-state)))))
(defn- on-scroll
[event]
(let [target (.-target event)
@ -66,62 +155,6 @@
(right-sidebar))
]])))
(defn- workspace-will-mount
[own]
(let [[projectid pageid] (:rum/props own)]
(rs/emit! (dw/initialize projectid pageid)
(dp/fetch-projects)
(udp/fetch-pages projectid))
own))
(defn- workspace-did-mount
[own]
(letfn [(handle-scroll-interaction []
(let [stoper (->> uuc/actions-s
(rx/map :type)
(rx/filter #(not= % :scroll/viewport))
(rx/take 1))
local (:rum/local own)
initial @uuwb/mouse-viewport-a]
(swap! local assoc :scrolling true)
(as-> uuwb/mouse-viewport-s $
(rx/take-until stoper $)
(rx/subscribe $ #(on-scroll % initial) nil on-scroll-end))))
(on-scroll-end []
(let [local (:rum/local own)]
(swap! local assoc :scrolling false)))
(on-scroll [pt initial]
(let [{:keys [x y]} (gpt/subtract pt initial)
el (mx/get-ref-dom own "workspace-canvas")
cx (.-scrollLeft el)
cy (.-scrollTop el)]
(set! (.-scrollLeft el) (- cx x))
(set! (.-scrollTop el) (- cy y))))]
(let [el (mx/get-ref-dom own "workspace-canvas")
sub (as-> uuc/actions-s $
(rx/map :type $)
(rx/dedupe $)
(rx/filter #(= :scroll/viewport %) $)
(rx/on-value $ handle-scroll-interaction))]
(set! (.-scrollLeft el) uuwb/canvas-start-scroll-x)
(set! (.-scrollTop el) uuwb/canvas-start-scroll-y)
(assoc own ::sub sub))))
(defn- workspace-will-unmount
[own]
(let [unsub (::sub own)]
(unsub)
(dissoc own ::sub)))
(defn- workspace-transfer-state
[old-state state]
(let [[projectid pageid] (:rum/props state)]
(rs/emit! (dw/initialize projectid pageid))
(assoc state ::sub (::sub old-state))))
(def ^:static workspace
(mx/component
{:render workspace-render