Files
integreat/src/cljs/auto_ap/events/admin/vendors.cljs

121 lines
4.1 KiB
Clojure

(ns auto-ap.events.admin.vendors
(:require [re-frame.core :as re-frame]
[clojure.spec.alpha :as s]
[auto-ap.db :as db]
[auto-ap.routes :as routes]
[auto-ap.effects :as effects]
[auto-ap.entities.vendors :as entity]
[auto-ap.events :as events]
[auto-ap.utils :refer [by]]
[bidi.bidi :as bidi]))
(re-frame/reg-event-fx
::edit
(fn [{:keys [db]} [_ vendor-id]]
{:db (assoc-in db [:admin :vendor]
(-> (get (:vendors db) vendor-id)
(assoc :default-account-id (:id (:default-account (get (:vendors db) vendor-id))))))
:dispatch [::events/modal-status :auto-ap.views.pages.admin.vendors/admin-vendor {:visible? true}]}))
(re-frame/reg-event-fx
::new
(fn [{:keys [db]} _]
{:db (assoc-in db [:admin :vendor]
{})
:dispatch [::events/modal-status :auto-ap.views.pages.admin.vendors/admin-vendor {:visible? true}]}))
(re-frame/reg-event-fx
::save
(fn [{:keys [db]} _]
(let [edited-vendor (get-in db [:admin :vendor])
fx {:db (assoc-in db [:admin :vendor :saving?] true)}
_ (println "EDITED" edited-vendor)]
(when (s/valid? ::entity/vendor edited-vendor)
(assoc fx :graphql
{:token (-> db :user)
:query-obj {:venia/operation {:operation/type :mutation
:operation/name "UpsertVendor"}
:venia/queries [{:query/data [:upsert-vendor
{:vendor (-> edited-vendor
(dissoc :default-account))}
events/vendor-query]}]}
:on-success [::save-complete]
:on-error [::save-error]})))))
(re-frame/reg-event-fx
::remind
(fn [{:keys [db] :as fx} [_ id]]
{ :http {:method :post
:token (:user db)
:headers {"Content-Type" "application/edn"}
:uri (str "/api/vendors/" id "/remind")
:on-success [::reminder-sent]
:on-error [::failed "Failed to send reminder"]}
:db (assoc-in db [:admin :banner] nil)}))
(re-frame/reg-event-db
::reminder-sent
(fn [db [_ error]]
(-> db
(assoc-in [:admin :banner] "Reminder sent!"))))
(re-frame/reg-event-db
::failed
(fn [db [_ error]]
(-> db
(assoc-in [:admin :banner] error))))
(re-frame/reg-event-fx
::save-complete
(fn [{:keys [db]} [_ {vendor :upsert-vendor} ]]
{:dispatch [::events/modal-completed :auto-ap.views.pages.admin.vendors/admin-vendor ]
:db (-> db
(assoc-in [:admin :vendor] nil)
(assoc-in [:vendors (:id vendor)] vendor))}))
(re-frame/reg-event-db
::save-error
(fn [db [_ vendor]]
(-> db
(assoc-in [:admin :vendor :error] true)
(assoc-in [:admin :vendor :saving?] false))))
(re-frame/reg-event-db
::change
(fn [db [_ path value]]
(println path value)
(assoc-in db (concat [:admin :vendor] path)
value)))
(re-frame/reg-event-db
::add-relationship
(fn [db [_ ]]
(-> db
(update-in [:admin :vendor :relationships] #(conj (or % [])
{:account-number (get-in db [:admin :vendor :new-relationship-account-number])
:client-id (get-in db [:admin :vendor :new-relationship-client])}))
(update-in [:admin :vendor] dissoc :new-relationship-account-number :new-relationship-client))))
(re-frame/reg-event-db
::remove-relationship
(fn [db [_ i]]
(-> db
(update-in [:admin :vendor :relationships] #(vec (concat (subvec % 0 i) (subvec % (min (count %) (inc i)))))))))
(re-frame/reg-event-fx
::mounted
(fn [{:keys [db]} _]
{:graphql {:token (:user db)
:query-obj {:venia/queries [[:vendor events/vendor-query]]}
:on-success [::received-vendors]}}))
(re-frame/reg-event-db
::received-vendors
(fn [db [_ vendors]]
(assoc db :vendors (by :id (:vendor vendors )))))