[front/feat] basic history feature

This commit is contained in:
SouthFox 2023-09-20 17:00:09 +08:00
parent 27dadca343
commit 29babcb300
2 changed files with 51 additions and 10 deletions

15
src/main/frontend/db.cljs Normal file
View file

@ -0,0 +1,15 @@
(ns frontend.db
(:require [cljs.reader]
[re-frame.core :refer [reg-cofx]]))
(defn set-ls-history
[user]
(.setItem js/localStorage "history" (str user)))
(reg-cofx
:local-store-history
(fn [cofx _]
(assoc cofx :local-store-history
(into (list)
(some->> (.getItem js/localStorage "history")
(cljs.reader/read-string))))))

View file

@ -1,7 +1,8 @@
(ns frontend.events
(:require [re-frame.core :refer [reg-event-db reg-event-fx]]
(:require [re-frame.core :refer [reg-event-db reg-event-fx inject-cofx path after trim-v]]
[superstructor.re-frame.fetch-fx]
[clojure.string :as str]))
[clojure.string :as str]
[frontend.db :refer [set-ls-history]]))
(if js/goog.DEBUG
@ -13,6 +14,10 @@
[& params]
(str/join "/" (cons api-url params)))
(def set-history-interceptor [(path :history)
(after set-ls-history)
trim-v])
(reg-event-fx
:set-active-page
(fn [{:keys [db]} [_ {:keys [new-match id query]}]]
@ -82,12 +87,32 @@
:db (-> db
(assoc-in [:loading :question] true))}))
(reg-event-db
(reg-event-fx
:set-history
set-history-interceptor
(fn [{:keys [db]} history]
(let [history-item (first history)
update? (fn [x]
(and (= (:id x) (:id history-item))
(= (:type x) (:type history-item))))]
{:db (as-> db $
(remove update? $)
(conj $ history-item))})))
(reg-event-fx
:get-question-success
(fn [db [_ {body :body}]]
(-> db
(assoc-in [:loading :question] false)
(assoc-in [:post] body))))
(fn [{:keys [db]} [_ {body :body}]]
(let [id (get-in db [:current-route :path-params :id])
type (get-in db [:current-route :data :name])
title (get-in body [:question :title])
detil (get-in body [:question :detail])]
{:db (-> db
(assoc-in [:loading :question] false)
(assoc-in [:post] body))
:dispatch [:set-history {:id id
:type type
:title title
:detil detil}]})))
(reg-event-db
:get-question-failure
@ -122,7 +147,8 @@
(update-in db-path into (:answers body))
(assoc-in [:post :paging] (:paging body))))))
(reg-event-db
(reg-event-fx
:initialize-db
(fn [_ _]
{:current-route nil}))
[(inject-cofx :local-store-history)]
(fn [{:keys [local-store-history]} _]
{:db (assoc {} :history local-store-history)}))