mirror of
https://github.com/penpot/penpot.git
synced 2025-05-25 09:26:11 +02:00
♻️ Ligtwheight refactor on view app (start new rumext facilities).
This commit is contained in:
parent
980d23c370
commit
140135317c
8 changed files with 138 additions and 123 deletions
|
@ -337,3 +337,17 @@
|
||||||
[id metadata]
|
[id metadata]
|
||||||
{:pre [(uuid? id) (us/valid? ::udp/metadata metadata)]}
|
{:pre [(uuid? id) (us/valid? ::udp/metadata metadata)]}
|
||||||
(UpdateMetadata. id metadata))
|
(UpdateMetadata. id metadata))
|
||||||
|
|
||||||
|
(defrecord OpenView [page-id]
|
||||||
|
ptk/WatchEvent
|
||||||
|
(watch [_ state s]
|
||||||
|
(let [page-id (get-in state [:workspace :page])]
|
||||||
|
(rx/of (udp/persist-page page-id))))
|
||||||
|
|
||||||
|
ptk/EffectEvent
|
||||||
|
(effect [_ state s]
|
||||||
|
(let [rval (rand-int 1000000)
|
||||||
|
page (get-in state [:pages page-id])
|
||||||
|
project (get-in state [:projects (:project page)])
|
||||||
|
url (str cfg/viewurl "?v=" rval "#/preview/" (:share-token project) "/" page-id)]
|
||||||
|
(js/open url "new tab" ""))))
|
||||||
|
|
|
@ -6,24 +6,23 @@
|
||||||
|
|
||||||
(ns ^:figwheel-hooks uxbox.view
|
(ns ^:figwheel-hooks uxbox.view
|
||||||
(:require
|
(:require
|
||||||
[rumext.core :as mx :include-macros true]
|
[rumext.core :as mx]
|
||||||
[uxbox.config]
|
[rumext.alpha :as mf]
|
||||||
[uxbox.util.dom :as dom]
|
[uxbox.util.dom :as dom]
|
||||||
[uxbox.util.html.history :as html-history]
|
[uxbox.util.html.history :as html-history]
|
||||||
[uxbox.util.i18n :as i18n :refer [tr]]
|
[uxbox.util.i18n :as i18n :refer [tr]]
|
||||||
[uxbox.util.messages :as uum]
|
|
||||||
[uxbox.util.router :as rt]
|
[uxbox.util.router :as rt]
|
||||||
[uxbox.view.locales.en :as en]
|
[uxbox.view.locales.en :as en]
|
||||||
[uxbox.view.locales.fr :as fr]
|
[uxbox.view.locales.fr :as fr]
|
||||||
[uxbox.view.store :as st]
|
[uxbox.view.store :as st]
|
||||||
[uxbox.view.ui :refer [app]]
|
[uxbox.view.ui :as ui]
|
||||||
[uxbox.view.ui.lightbox :refer [lightbox]]
|
[uxbox.view.ui.lightbox :refer [lightbox]]
|
||||||
[uxbox.view.ui.loader :refer [loader]]))
|
[uxbox.view.ui.loader :refer [loader]]))
|
||||||
|
|
||||||
(i18n/update-locales! (fn [locales]
|
(i18n/update-locales! (fn [locales]
|
||||||
(-> locales
|
(-> locales
|
||||||
(assoc :en en/locales)
|
(assoc "en" en/locales)
|
||||||
(assoc :fr fr/locales))))
|
(assoc "fr" fr/locales))))
|
||||||
|
|
||||||
(declare reinit)
|
(declare reinit)
|
||||||
|
|
||||||
|
@ -32,30 +31,6 @@
|
||||||
(println "Locale changed from" old " to " new)
|
(println "Locale changed from" old " to " new)
|
||||||
(reinit)))
|
(reinit)))
|
||||||
|
|
||||||
(defn- on-error
|
|
||||||
"A default error handler."
|
|
||||||
[error]
|
|
||||||
(cond
|
|
||||||
;; Network error
|
|
||||||
(= (:status error) 0)
|
|
||||||
(do
|
|
||||||
(st/emit! (uum/error (tr "errors.network")))
|
|
||||||
(js/console.error "Stack:" (.-stack error)))
|
|
||||||
|
|
||||||
;; Something else
|
|
||||||
:else
|
|
||||||
(do
|
|
||||||
(st/emit! (uum/error (tr "errors.generic")))
|
|
||||||
(js/console.error "Stack:" (.-stack error)))))
|
|
||||||
|
|
||||||
(set! st/*on-error* on-error)
|
|
||||||
|
|
||||||
;; --- Routes
|
|
||||||
|
|
||||||
(def routes
|
|
||||||
[["/preview/:token/:index" :view/viewer]
|
|
||||||
["/not-found" :view/notfound]])
|
|
||||||
|
|
||||||
(defn- on-navigate
|
(defn- on-navigate
|
||||||
[router path]
|
[router path]
|
||||||
(let [match (rt/match router path)]
|
(let [match (rt/match router path)]
|
||||||
|
@ -69,15 +44,15 @@
|
||||||
|
|
||||||
(defn init-ui
|
(defn init-ui
|
||||||
[]
|
[]
|
||||||
(let [router (rt/init routes)
|
(let [router (rt/init ui/routes)
|
||||||
cpath (deref html-history/path)]
|
cpath (deref html-history/path)]
|
||||||
|
|
||||||
(st/emit! #(assoc % :router router))
|
(st/emit! #(assoc % :router router))
|
||||||
(add-watch html-history/path ::view #(on-navigate router %4))
|
(add-watch html-history/path ::view #(on-navigate router %4))
|
||||||
|
|
||||||
(mx/mount (app) (dom/get-element "app"))
|
(mf/mount (mf/element ui/app) (dom/get-element "app"))
|
||||||
(mx/mount (lightbox) (dom/get-element "lightbox"))
|
(mf/mount (lightbox) (dom/get-element "lightbox"))
|
||||||
(mx/mount (loader) (dom/get-element "loader"))
|
(mf/mount (loader) (dom/get-element "loader"))
|
||||||
|
|
||||||
(on-navigate router cpath)))
|
(on-navigate router cpath)))
|
||||||
|
|
||||||
|
|
|
@ -73,23 +73,23 @@
|
||||||
|
|
||||||
;; --- Select Page
|
;; --- Select Page
|
||||||
|
|
||||||
(defrecord SelectPage [index]
|
(defrecord SelectPage [id]
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state stream]
|
(watch [_ state stream]
|
||||||
(let [token (get-in state [:route :params :path :token])]
|
(let [token (get-in state [:route :params :path :token])]
|
||||||
(rx/of (rt/nav :view/viewer {:token token :index index})))))
|
(rx/of (rt/nav :view/viewer {:token token :id id})))))
|
||||||
|
|
||||||
(defn select-page
|
(defn select-page
|
||||||
[index]
|
[id]
|
||||||
(SelectPage. index))
|
(SelectPage. id))
|
||||||
|
|
||||||
;; --- Go to Page
|
;; --- Go to Page
|
||||||
|
|
||||||
(defrecord GoToPage [id]
|
(defrecord GoToPage [id]
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state stream]
|
(watch [_ state stream]
|
||||||
(let [token (get-in state [:route :params :token])]
|
(let [token (get-in state [:route :params :path :token])]
|
||||||
(rx/of (rt/navigate :view/viewer {:token token :index nil :id id})))))
|
(rx/of (rt/nav :view/viewer {:token token :id id})))))
|
||||||
|
|
||||||
(defn go-to-page
|
(defn go-to-page
|
||||||
[id]
|
[id]
|
||||||
|
|
|
@ -5,35 +5,65 @@
|
||||||
;; Copyright (c) 2016-2017 Andrey Antukh <niwi@niwi.nz>
|
;; Copyright (c) 2016-2017 Andrey Antukh <niwi@niwi.nz>
|
||||||
|
|
||||||
(ns uxbox.view.ui
|
(ns uxbox.view.ui
|
||||||
(:require [lentes.core :as l]
|
(:require
|
||||||
[potok.core :as ptk]
|
[lentes.core :as l]
|
||||||
[uxbox.builtins.icons :as i]
|
[potok.core :as ptk]
|
||||||
[uxbox.view.store :as st]
|
[rumext.core :as mx]
|
||||||
[uxbox.view.ui.loader :refer [loader]]
|
[rumext.alpha :as mf]
|
||||||
[uxbox.view.ui.lightbox :refer [lightbox]]
|
[uxbox.builtins.icons :as i]
|
||||||
[uxbox.view.ui.notfound :refer [notfound-page]]
|
[uxbox.util.data :refer [parse-int]]
|
||||||
[uxbox.view.ui.viewer :refer [viewer-page]]
|
[uxbox.util.dom :as dom]
|
||||||
[uxbox.util.router :as rt]
|
[uxbox.util.i18n :refer [tr]]
|
||||||
[uxbox.util.i18n :refer [tr]]
|
[uxbox.util.messages :as uum]
|
||||||
[uxbox.util.data :refer [parse-int]]
|
[uxbox.util.router :as rt]
|
||||||
[uxbox.util.messages :as uum]
|
[uxbox.view.store :as st]
|
||||||
[rumext.core :as mx :include-macros true]
|
[uxbox.view.ui.lightbox :refer [lightbox]]
|
||||||
[uxbox.util.dom :as dom]))
|
[uxbox.view.ui.loader :refer [loader]]
|
||||||
|
[uxbox.view.ui.notfound :refer [notfound-page]]
|
||||||
|
[uxbox.view.ui.viewer :refer [viewer-page]]))
|
||||||
|
|
||||||
|
;; --- Error Handling
|
||||||
|
|
||||||
|
(defn- on-error
|
||||||
|
"A default error handler."
|
||||||
|
[error]
|
||||||
|
(cond
|
||||||
|
;; Network error
|
||||||
|
(= (:status error) 0)
|
||||||
|
(do
|
||||||
|
(st/emit! (uum/error (tr "errors.network")))
|
||||||
|
(js/console.error "Stack:" (.-stack error)))
|
||||||
|
|
||||||
|
;; Something else
|
||||||
|
:else
|
||||||
|
(do
|
||||||
|
(st/emit! (uum/error (tr "errors.generic")))
|
||||||
|
(js/console.error "Stack:" (.-stack error)))))
|
||||||
|
|
||||||
|
(set! st/*on-error* on-error)
|
||||||
|
|
||||||
|
|
||||||
|
;; --- Routes
|
||||||
|
|
||||||
|
(def routes
|
||||||
|
[["/preview/:token/:id" :view/viewer]
|
||||||
|
["/not-found" :view/notfound]])
|
||||||
|
|
||||||
|
;; --- Main App (Component)
|
||||||
|
|
||||||
(def route-ref
|
(def route-ref
|
||||||
(-> (l/key :route)
|
(-> (l/key :route)
|
||||||
(l/derive st/state)))
|
(l/derive st/state)))
|
||||||
|
|
||||||
;; --- Main App (Component)
|
(mf/defc app
|
||||||
|
{:wrap [mf/reactive*]}
|
||||||
(mx/defc app
|
|
||||||
{:mixins [mx/static mx/reactive]}
|
|
||||||
[]
|
[]
|
||||||
(let [route (mx/react route-ref)]
|
(let [route (mf/deref route-ref)]
|
||||||
(prn "view$app" route)
|
|
||||||
(case (get-in route [:data :name])
|
(case (get-in route [:data :name])
|
||||||
:view/notfound (notfound-page)
|
:view/notfound (notfound-page)
|
||||||
:view/viewer (let [{:keys [index token]} (get-in route [:params :path])]
|
:view/viewer (let [{:keys [token id]} (get-in route [:params :path])]
|
||||||
(viewer-page token (parse-int index 0)))
|
(mf/element viewer-page {:token token
|
||||||
|
:id (uuid id)
|
||||||
|
:key [token id]}))
|
||||||
nil)))
|
nil)))
|
||||||
|
|
||||||
|
|
|
@ -6,15 +6,17 @@
|
||||||
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||||
|
|
||||||
(ns uxbox.view.ui.viewer
|
(ns uxbox.view.ui.viewer
|
||||||
(:require [lentes.core :as l]
|
(:require
|
||||||
[uxbox.builtins.icons :as i]
|
[rumext.alpha :as mf]
|
||||||
[uxbox.util.i18n :refer [tr]]
|
[uxbox.builtins.icons :as i]
|
||||||
[rumext.core :as mx :include-macros true]
|
[uxbox.util.i18n :refer [tr]]
|
||||||
[uxbox.view.store :as st]
|
[uxbox.util.data :refer [seek]]
|
||||||
[uxbox.view.data.viewer :as dv]
|
[uxbox.view.data.viewer :as dv]
|
||||||
[uxbox.view.ui.viewer.nav :refer [nav]]
|
[uxbox.view.store :as st]
|
||||||
[uxbox.view.ui.viewer.canvas :refer [canvas]]
|
[uxbox.view.ui.viewer.canvas :refer [canvas]]
|
||||||
[uxbox.view.ui.viewer.sitemap :refer [sitemap]]))
|
[uxbox.view.ui.viewer.nav :refer [nav]]
|
||||||
|
[uxbox.view.ui.viewer.sitemap :refer [sitemap]]
|
||||||
|
[lentes.core :as l]))
|
||||||
|
|
||||||
;; --- Refs
|
;; --- Refs
|
||||||
|
|
||||||
|
@ -31,24 +33,17 @@
|
||||||
|
|
||||||
;; --- Component
|
;; --- Component
|
||||||
|
|
||||||
(defn- viewer-page-init
|
(mf/defc viewer-page
|
||||||
[own]
|
{:wrap [mf/reactive*]}
|
||||||
(let [[token] (::mx/args own)]
|
[{:keys [token id]}]
|
||||||
(st/emit! (dv/initialize token))
|
(let [{:keys [project pages flags]} (mf/deref state-ref)]
|
||||||
own))
|
(mf/use-effect
|
||||||
|
{:init #(st/emit! (dv/initialize token))})
|
||||||
(mx/defc viewer-page
|
|
||||||
{:mixins [mx/static mx/reactive]
|
|
||||||
:init viewer-page-init
|
|
||||||
:key-fn vector}
|
|
||||||
[token index id]
|
|
||||||
(let [{:keys [project pages flags]} (mx/react state-ref)
|
|
||||||
sitemap? (contains? flags :sitemap)]
|
|
||||||
(when (seq pages)
|
(when (seq pages)
|
||||||
[:section.view-content
|
[:section.view-content
|
||||||
(when sitemap?
|
(when (contains? flags :sitemap)
|
||||||
(sitemap project pages index))
|
[:& sitemap {:project project
|
||||||
(nav flags)
|
:pages pages
|
||||||
(canvas (if (nil? id)
|
:selected id}])
|
||||||
(nth pages index)
|
[:& nav {:flags flags}]
|
||||||
(some #(= id (:id %)) pages)))])))
|
[:& canvas {:page (seek #(= id (:id %)) pages)}]])))
|
||||||
|
|
|
@ -6,13 +6,14 @@
|
||||||
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||||
|
|
||||||
(ns uxbox.view.ui.viewer.canvas
|
(ns uxbox.view.ui.viewer.canvas
|
||||||
(:require [rumext.core :as mx :include-macros true]
|
(:require
|
||||||
[uxbox.view.ui.viewer.shapes :as shapes]))
|
[rumext.alpha :as mf]
|
||||||
|
[uxbox.view.ui.viewer.shapes :as shapes]))
|
||||||
|
|
||||||
;; --- Background (Component)
|
;; --- Background (Component)
|
||||||
|
|
||||||
(mx/defc background
|
(mf/defc background
|
||||||
{:mixins [mx/static]}
|
{:wrap [mf/memo*]}
|
||||||
[{:keys [background] :as metadata}]
|
[{:keys [background] :as metadata}]
|
||||||
[:rect
|
[:rect
|
||||||
{:x 0 :y 0
|
{:x 0 :y 0
|
||||||
|
@ -24,15 +25,16 @@
|
||||||
|
|
||||||
(declare shape)
|
(declare shape)
|
||||||
|
|
||||||
(mx/defc canvas
|
(mf/defc canvas
|
||||||
{:mixins [mx/static]}
|
{:wrap [mf/memo*]}
|
||||||
[{:keys [metadata id] :as page}]
|
[{:keys [page] :as props}]
|
||||||
(let [{:keys [width height]} metadata]
|
(let [{:keys [metadata id]} page
|
||||||
[:div.view-canvas {:ref (str "canvas" id)}
|
{:keys [width height]} metadata]
|
||||||
|
[:div.view-canvas
|
||||||
[:svg.page-layout {:width width
|
[:svg.page-layout {:width width
|
||||||
:height height}
|
:height height}
|
||||||
(background metadata)
|
[:& background metadata]
|
||||||
(for [id (reverse (:shapes page))]
|
(for [id (reverse (:shapes page))]
|
||||||
(-> (shapes/shape id)
|
(-> (shapes/shape id)
|
||||||
(mx/with-key (str id))))]]))
|
(mf/with-key (str id))))]]))
|
||||||
|
|
||||||
|
|
|
@ -6,16 +6,16 @@
|
||||||
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
;; Copyright (c) 2016-2017 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||||
|
|
||||||
(ns uxbox.view.ui.viewer.nav
|
(ns uxbox.view.ui.viewer.nav
|
||||||
(:require [potok.core :as ptk]
|
(:require
|
||||||
[uxbox.builtins.icons :as i]
|
[rumext.alpha :as mf]
|
||||||
[rumext.core :as mx :include-macros true]
|
[uxbox.builtins.icons :as i]
|
||||||
[uxbox.main.data.lightbox :as udl]
|
[uxbox.main.data.lightbox :as udl]
|
||||||
[uxbox.util.i18n :refer (tr)]
|
[uxbox.util.i18n :refer (tr)]
|
||||||
[uxbox.view.store :as st]
|
[uxbox.view.data.viewer :as dv]
|
||||||
[uxbox.view.data.viewer :as dv]))
|
[uxbox.view.store :as st]))
|
||||||
|
|
||||||
(mx/defc nav
|
(mf/defc nav
|
||||||
[flags]
|
[{:keys [flags] :as props}]
|
||||||
(let [toggle-sitemap #(st/emit! (dv/toggle-flag :sitemap))
|
(let [toggle-sitemap #(st/emit! (dv/toggle-flag :sitemap))
|
||||||
toggle-interactions #(st/emit! (dv/toggle-flag :interactions))
|
toggle-interactions #(st/emit! (dv/toggle-flag :interactions))
|
||||||
sitemap? (contains? flags :sitemap)
|
sitemap? (contains? flags :sitemap)
|
||||||
|
|
|
@ -8,25 +8,24 @@
|
||||||
(ns uxbox.view.ui.viewer.sitemap
|
(ns uxbox.view.ui.viewer.sitemap
|
||||||
(:require
|
(:require
|
||||||
[lentes.core :as l]
|
[lentes.core :as l]
|
||||||
[rumext.core :as mx :include-macros true]
|
[rumext.alpha :as mf]
|
||||||
[uxbox.builtins.icons :as i]
|
[uxbox.builtins.icons :as i]
|
||||||
[uxbox.view.data.viewer :as dv]
|
[uxbox.view.data.viewer :as dv]
|
||||||
[uxbox.view.store :as st]))
|
[uxbox.view.store :as st]))
|
||||||
|
|
||||||
(mx/defc sitemap
|
(mf/defc sitemap
|
||||||
{:mixins [mx/static mx/reactive]}
|
[{:keys [project pages selected] :as props}]
|
||||||
[project pages selected]
|
|
||||||
(let [project-name (:name project)
|
(let [project-name (:name project)
|
||||||
on-click #(st/emit! (dv/select-page %))]
|
on-click #(st/emit! (dv/select-page %))]
|
||||||
[:div.view-sitemap
|
[:div.view-sitemap
|
||||||
[:span.sitemap-title project-name]
|
[:span.sitemap-title project-name]
|
||||||
[:ul.sitemap-list
|
[:ul.sitemap-list
|
||||||
(for [[i page] (map-indexed vector pages)
|
(for [page pages]
|
||||||
:let [selected? (= i selected)
|
(let [selected? (= (:id page) selected)
|
||||||
id (:id page)]]
|
page-id (:id page)]
|
||||||
[:li {:class (when selected? "selected")
|
[:li {:class (when selected? "selected")
|
||||||
:on-click (partial on-click i)
|
:on-click (partial on-click page-id)
|
||||||
:id (str "page-" id)
|
:id (str "page-" page-id)
|
||||||
:key (str i)}
|
:key page-id}
|
||||||
[:div.page-icon i/page]
|
[:div.page-icon i/page]
|
||||||
[:span (:name page)]])]]))
|
[:span (:name page)]]))]]))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue