2016-11-27 21:53:12 +01:00
|
|
|
;; 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/.
|
|
|
|
;;
|
2022-09-20 23:23:22 +02:00
|
|
|
;; Copyright (c) KALEIDOS INC
|
2016-11-27 21:53:12 +01:00
|
|
|
|
2020-08-18 19:26:37 +02:00
|
|
|
(ns app.main.store
|
2020-04-11 19:22:24 +02:00
|
|
|
(:require
|
2022-08-01 14:05:04 +02:00
|
|
|
[app.common.logging :as log]
|
2022-03-01 13:42:55 +01:00
|
|
|
[app.util.object :as obj]
|
2021-05-04 15:18:59 +02:00
|
|
|
[beicon.core :as rx]
|
|
|
|
[okulary.core :as l]
|
|
|
|
[potok.core :as ptk]))
|
2019-07-03 09:30:59 +02:00
|
|
|
|
2022-08-01 14:05:04 +02:00
|
|
|
(log/set-level! :info)
|
|
|
|
|
2016-11-27 21:53:12 +01:00
|
|
|
(enable-console-print!)
|
|
|
|
|
2020-04-14 17:00:52 +02:00
|
|
|
(defonce loader (l/atom false))
|
2021-09-30 13:56:07 +02:00
|
|
|
(defonce on-error (l/atom identity))
|
|
|
|
|
2022-08-01 14:05:04 +02:00
|
|
|
(defmethod ptk/resolve :default
|
|
|
|
[type data]
|
|
|
|
(ptk/data-event type data))
|
|
|
|
|
2023-01-11 11:34:30 +01:00
|
|
|
(def on-event identity)
|
|
|
|
|
|
|
|
(def ^:dynamic *debug-events* false)
|
|
|
|
|
|
|
|
;; Only created in development build
|
|
|
|
(when *assert*
|
|
|
|
(def debug-exclude-events
|
|
|
|
#{:app.main.data.workspace.notifications/handle-pointer-update
|
|
|
|
:app.main.data.workspace.notifications/handle-pointer-send
|
|
|
|
:app.main.data.workspace.persistence/update-persistence-status
|
|
|
|
:app.main.data.workspace.changes/update-indices
|
|
|
|
:app.main.data.websocket/send-message
|
|
|
|
:app.main.data.workspace.selection/change-hover-state})
|
|
|
|
|
|
|
|
(set! on-event (fn [e]
|
|
|
|
(when (and *debug-events*
|
|
|
|
(ptk/event? e)
|
|
|
|
(not (debug-exclude-events (ptk/type e))))
|
|
|
|
(.log js/console (str "[stream]: " (ptk/repr-event e)) )))))
|
2022-12-30 16:08:27 +01:00
|
|
|
|
2021-09-30 13:56:07 +02:00
|
|
|
(defonce state
|
|
|
|
(ptk/store {:resolve ptk/resolve
|
2023-01-11 11:34:30 +01:00
|
|
|
:on-event on-event
|
2023-03-02 16:57:28 +01:00
|
|
|
:on-error (fn [cause]
|
|
|
|
(when cause
|
2023-03-18 10:32:26 +01:00
|
|
|
#_(log/error :hint "unexpected exception on store" :cause cause)
|
2023-03-02 16:57:28 +01:00
|
|
|
(@on-error cause)))}))
|
2021-09-30 13:56:07 +02:00
|
|
|
|
|
|
|
(defonce stream
|
|
|
|
(ptk/input-stream state))
|
2016-11-27 21:53:12 +01:00
|
|
|
|
2021-05-08 14:59:58 +02:00
|
|
|
(defonce last-events
|
2021-12-09 16:50:15 +01:00
|
|
|
(let [buffer (atom [])
|
|
|
|
allowed #{:app.main.data.workspace/initialize-page
|
|
|
|
:app.main.data.workspace/finalize-page
|
|
|
|
:app.main.data.workspace/initialize-file
|
|
|
|
:app.main.data.workspace/finalize-file}]
|
|
|
|
(->> (rx/merge
|
|
|
|
(->> stream
|
|
|
|
(rx/filter (ptk/type? :app.main.data.workspace.changes/commit-changes))
|
|
|
|
(rx/map #(-> % deref :hint-origin str))
|
|
|
|
(rx/dedupe))
|
|
|
|
(->> stream
|
|
|
|
(rx/map ptk/type)
|
|
|
|
(rx/filter #(contains? allowed %))
|
|
|
|
(rx/map str)))
|
|
|
|
(rx/scan (fn [buffer event]
|
|
|
|
(cond-> (conj buffer event)
|
|
|
|
(> (count buffer) 20)
|
|
|
|
(pop)))
|
|
|
|
#queue [])
|
|
|
|
(rx/subs #(reset! buffer (vec %))))
|
2021-05-08 14:59:58 +02:00
|
|
|
buffer))
|
|
|
|
|
2016-11-27 21:53:12 +01:00
|
|
|
(defn emit!
|
2020-04-02 17:08:24 +02:00
|
|
|
([] nil)
|
2016-11-27 21:53:12 +01:00
|
|
|
([event]
|
2020-12-21 09:47:50 +01:00
|
|
|
(ptk/emit! state event)
|
2019-08-08 16:27:37 +02:00
|
|
|
nil)
|
2016-11-27 21:53:12 +01:00
|
|
|
([event & events]
|
2020-12-21 09:47:50 +01:00
|
|
|
(apply ptk/emit! state (cons event events))
|
2019-08-08 16:27:37 +02:00
|
|
|
nil))
|
2016-11-27 21:53:12 +01:00
|
|
|
|
2022-03-01 13:42:55 +01:00
|
|
|
(defonce ongoing-tasks (l/atom #{}))
|
2020-09-28 15:29:54 +02:00
|
|
|
|
2022-03-01 13:42:55 +01:00
|
|
|
(add-watch ongoing-tasks ::ongoing-tasks
|
|
|
|
(fn [_ _ _ events]
|
|
|
|
(if (empty? events)
|
|
|
|
(obj/set! js/window "onbeforeunload" nil)
|
|
|
|
(obj/set! js/window "onbeforeunload" (constantly false)))))
|