mirror of
https://github.com/penpot/penpot.git
synced 2026-05-04 15:49:34 +00:00
112 lines
2.5 KiB
Clojure
112 lines
2.5 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; 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) 2016 Andrey Antukh <niwi@niwi.nz>
|
|
|
|
(ns uxbox.data.messages
|
|
(:require [cuerdas.core :as str]
|
|
[promesa.core :as p]
|
|
[beicon.core :as rx]
|
|
[lentes.core :as l]
|
|
[uxbox.rstore :as rs]))
|
|
|
|
;; --- Constants
|
|
|
|
(def ^:const +animation-timeout+ 600)
|
|
|
|
;; --- Message Event
|
|
|
|
(declare hide-message)
|
|
(declare show-message?)
|
|
|
|
(defrecord ShowMessage [data]
|
|
rs/UpdateEvent
|
|
(-apply-update [_ state]
|
|
(let [message (assoc data :state :visible)]
|
|
(assoc state :message message)))
|
|
|
|
rs/WatchEvent
|
|
(-apply-watch [_ state s]
|
|
(let [stoper (->> (rx/filter show-message? s)
|
|
(rx/take 1))]
|
|
(->> (rx/of (hide-message))
|
|
(rx/delay (:timeout data))
|
|
(rx/take-until stoper)))))
|
|
|
|
(defn show-message
|
|
[message]
|
|
(ShowMessage. message))
|
|
|
|
(defn show-message?
|
|
[v]
|
|
(instance? ShowMessage v))
|
|
|
|
(defn show-error
|
|
[message & {:keys [timeout] :or {timeout 3000}}]
|
|
(show-message {:content message
|
|
:type :error
|
|
:timeout timeout}))
|
|
|
|
(defn show-info
|
|
[message & {:keys [timeout] :or {timeout 3000}}]
|
|
(show-message {:content message
|
|
:type :info
|
|
:timeout timeout}))
|
|
|
|
(defn show-dialog
|
|
[message & {:keys [on-accept on-cancel]}]
|
|
(show-message {:content message
|
|
:on-accept on-accept
|
|
:on-cancel on-cancel
|
|
:timeout js/Number.MAX_SAFE_INTEGER
|
|
:type :dialog}))
|
|
|
|
;; --- Hide Message
|
|
|
|
(defrecord HideMessage [^:mutable canceled?]
|
|
rs/UpdateEvent
|
|
(-apply-update [_ state]
|
|
(update state :message
|
|
(fn [v]
|
|
(if (nil? v)
|
|
(do (set! canceled? true) nil)
|
|
(assoc v :state :hide)))))
|
|
|
|
rs/WatchEvent
|
|
(-apply-watch [_ state s]
|
|
(if canceled?
|
|
(rx/empty)
|
|
(->> (rx/of #(dissoc state :message))
|
|
(rx/delay +animation-timeout+)))))
|
|
|
|
(defn hide-message
|
|
[]
|
|
(HideMessage. false))
|
|
|
|
;; --- Direct Call Api
|
|
|
|
(defn error!
|
|
[& args]
|
|
(rs/emit! (apply show-error args)))
|
|
|
|
(defn info!
|
|
[& args]
|
|
(rs/emit! (apply show-info args)))
|
|
|
|
(defn dialog!
|
|
[& args]
|
|
(rs/emit! (apply show-dialog args)))
|
|
|
|
(defn close!
|
|
[]
|
|
(rs/emit! (hide-message)))
|
|
|
|
(defn error
|
|
[& args]
|
|
(rx/of (apply show-error args)))
|
|
|
|
(defn info
|
|
[& args]
|
|
(rx/of (apply show-info args)))
|