(ns re-frame.handlers (:require-macros [cljs.core.async.macros :refer [go-loop]]) (:require [re-frame.db :refer [app-db]] [re-frame.utils :refer [first-in-vector]] [cljs.core.async :refer [chan put! fn (atom {})) (defn register "register a handler for an event" [event-id handler-fn] (if (contains? @id->fn event-id) (println "Warning: overwritting an event-handler" event-id)) ;; TODO: more generic logging (swap! id->fn assoc event-id handler-fn)) ;; -- dispatching and routing --------------------------------------------------------------------- (def ^:private dispatch-chan (chan)) (defn dispatch "reagent components send events by calling this function. Usage example: (dispatch [:delete-item 42])" [event-v] (assert (some? event-v)) ;; nil would close the channel (put! dispatch-chan event-v)) (defn dispatch-sync "sync version of above that actually does the dispatch" [event-v] (let [event-id (first-in-vector event-v) handler-fn (get @id->fn event-id)] (assert (not (nil? handler-fn)) (str "No event handler registered for event: " event-id )) (handler-fn app-db event-v))) (defn- router "route an event, arriving on the dispatch channel, to the right handler" [] (go-loop [] (let [event-v ( @db (assoc :undo-description description) mutation-fn validation-fn))))