2016-06-14 17:39:44 +03:00
|
|
|
(ns uxbox.main.ui.lightbox
|
2019-08-02 20:18:05 +02:00
|
|
|
"DEPRECATED: should be replaced by uxbox.main.ui.modal"
|
2019-07-18 14:27:42 +02:00
|
|
|
(:require
|
|
|
|
[goog.events :as events]
|
|
|
|
[lentes.core :as l]
|
|
|
|
[rumext.core :as mx]
|
2019-07-19 12:32:31 +02:00
|
|
|
[rumext.alpha :as mf]
|
2019-07-18 14:27:42 +02:00
|
|
|
[uxbox.main.data.lightbox :as udl]
|
|
|
|
[uxbox.main.store :as st]
|
|
|
|
[uxbox.main.ui.keyboard :as k]
|
|
|
|
[uxbox.util.data :refer [classnames]]
|
|
|
|
[uxbox.util.dom :as dom])
|
2015-12-14 09:50:19 +02:00
|
|
|
(:import goog.events.EventType))
|
|
|
|
|
2019-07-18 14:27:42 +02:00
|
|
|
;; --- Refs
|
2015-12-14 09:50:19 +02:00
|
|
|
|
2016-07-10 11:57:45 +03:00
|
|
|
(def ^:private lightbox-ref
|
2016-04-16 10:44:53 +03:00
|
|
|
(-> (l/key :lightbox)
|
2016-06-22 22:23:24 +03:00
|
|
|
(l/derive st/state)))
|
2015-12-14 09:50:19 +02:00
|
|
|
|
2016-04-16 10:44:53 +03:00
|
|
|
;; --- Lightbox (Component)
|
2015-12-14 09:50:19 +02:00
|
|
|
|
2015-12-24 19:36:15 +02:00
|
|
|
(defmulti render-lightbox :name)
|
2015-12-14 09:50:19 +02:00
|
|
|
(defmethod render-lightbox :default [_] nil)
|
|
|
|
|
|
|
|
(defn- on-esc-clicked
|
2016-05-18 21:46:13 +03:00
|
|
|
[event]
|
|
|
|
(when (k/esc? event)
|
|
|
|
(udl/close!)
|
|
|
|
(dom/stop-propagation event)))
|
|
|
|
|
|
|
|
(defn- on-out-clicked
|
|
|
|
[own event]
|
2019-07-19 12:32:31 +02:00
|
|
|
(let [parent (mf/ref-node (::parent own))
|
2016-05-18 21:46:13 +03:00
|
|
|
current (dom/get-target event)]
|
|
|
|
(when (dom/equals? parent current)
|
2019-07-18 14:27:42 +02:00
|
|
|
(st/emit! (udl/hide-lightbox)))))
|
|
|
|
|
2019-07-19 12:32:31 +02:00
|
|
|
(mf/def lightbox
|
|
|
|
:mixins #{mf/reactive}
|
2019-07-18 14:27:42 +02:00
|
|
|
|
|
|
|
:init
|
|
|
|
(fn [own props]
|
|
|
|
(let [key (events/listen js/document EventType.KEYDOWN on-esc-clicked)]
|
|
|
|
(assoc own
|
|
|
|
::key-listener key
|
2019-07-19 12:32:31 +02:00
|
|
|
::parent (mf/create-ref))))
|
2019-07-18 14:27:42 +02:00
|
|
|
|
|
|
|
:will-unmount
|
|
|
|
(fn [own]
|
|
|
|
(events/unlistenByKey (::key-listener own))
|
|
|
|
(dissoc own ::key-listener))
|
|
|
|
|
|
|
|
:render
|
|
|
|
(fn [own props]
|
2019-07-19 12:32:31 +02:00
|
|
|
(let [data (mf/react lightbox-ref)
|
2019-07-18 14:27:42 +02:00
|
|
|
classes (classnames
|
|
|
|
:hide (nil? data)
|
|
|
|
:transparent (:transparent? data))]
|
|
|
|
[:div.lightbox {:class classes
|
|
|
|
:ref (::parent own)
|
|
|
|
:on-click (partial on-out-clicked own)}
|
|
|
|
(render-lightbox data)])))
|