♻️ Ligtwheight refactor on view app (start new rumext facilities).

This commit is contained in:
Andrey Antukh 2019-07-24 11:37:04 +02:00
parent 980d23c370
commit 140135317c
8 changed files with 138 additions and 123 deletions

View file

@ -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" ""))))

View file

@ -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)))

View file

@ -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]

View file

@ -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)))

View file

@ -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)}]])))

View file

@ -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))))]]))

View file

@ -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)

View file

@ -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)]]))]]))