Skip to content

Instantly share code, notes, and snippets.

@not-in-stock
Last active August 10, 2021 14:26
Show Gist options
  • Save not-in-stock/e0613848f7938444f756b4064cfeae77 to your computer and use it in GitHub Desktop.
Save not-in-stock/e0613848f7938444f756b4064cfeae77 to your computer and use it in GitHub Desktop.
(ns not-in-stock.macro.events
(:require [clojure.spec.alpha :as s]
[medley.core :as medley]
[re-frame.core :as re-frame]))
(defn- prepend-if-absent [xs x]
(cond->> xs
(nil? (medley/find-first #(= x %) xs)) (into [x])))
(defn- default-reg-event [reg-event-fn]
(fn inner-reg-event
([id handler]
(inner-reg-event id nil handler))
([id interceptors handler]
(reg-event-fn id (prepend-if-absent interceptors re-frame/trim-v) handler))))
(def trimmed-reg-event-db
(default-reg-event re-frame/reg-event-db))
(def trimmed-reg-event-fx
(default-reg-event re-frame/reg-event-fx))
(defn- defevent-helper [event-register-fn event-name bindings & interceptors+handler]
(let [event-kw (keyword (str *ns*) (name event-name))
input-sym (gensym "input__")
handler (last interceptors+handler)
interceptors (first (butlast interceptors+handler))]
(with-meta
`(do
(~event-register-fn
~event-kw
~@(when (some? interceptors)
[interceptors])
(fn [~input-sym ~bindings]
(~handler ~input-sym)))
(defn ~event-name ~bindings
[~event-kw ~@bindings]))
{:input-sym input-sym})))
(defmacro defevent-db [event-name bindings & interceptors+handler]
(apply defevent-helper `trimmed-reg-event-db event-name bindings interceptors+handler))
(defmacro defevent-fx [event-name bindings & interceptors+handler]
(apply defevent-helper `trimmed-reg-event-fx event-name bindings interceptors+handler))
(def defevent-args-spec
(s/cat :name simple-symbol?
:bindings (s/coll-of simple-symbol? :kind vector?)
:interceptors (s/? any?)
:handler any?))
(s/fdef defevent-db
:args defevent-args-spec)
(s/fdef defevent-fx
:args defevent-args-spec)
@not-in-stock
Copy link
Author

(defevent-fx edit-success [response]
  (fn [cofx]
    (let [user (:chat/user response)]
      {:db (-> cofx
               :db
               (io/update-entity :users [:user/by-id (:db/id user)]
                                 (constantly user)))
       :dispatch (snackbar/show {:variant :success
                                 :message "Изменения сохранены"})})))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment