refactor(srs): update frontend.extensions.fsrs

This commit is contained in:
rcmerci
2024-09-18 19:00:57 +08:00
parent ccf70a5cef
commit ac752c8ba3
4 changed files with 42 additions and 9 deletions

View File

@@ -1,9 +1,39 @@
(ns frontend.extensions.fsrs
(:require [open-spaced-repetition.cljc-fsrs.core :as fsrs.core]))
(:require [frontend.db :as db]
[frontend.handler.property :as property-handler]
[open-spaced-repetition.cljc-fsrs.core :as fsrs.core]
[tick.core :as tick]))
(defn- fsrs-card-map->property-fsrs-state
"Convert card-map to value stored in property"
[fsrs-card-map]
(-> fsrs-card-map
(update :last-repeat tick/inst)
(update :due tick/inst)))
(defn fsrs-card->property-fsrs-state
[fsrs-card]
(-> fsrs-card
(update :last-repeat #(js/Date. %))
(update :due #(js/Date. %))))
(defn- property-fsrs-state->fsrs-card-map
"opposite version of `fsrs-card->property-fsrs-state`"
[prop-fsrs-state]
(-> prop-fsrs-state
(update :last-repeat tick/instant)
(update :due tick/instant)))
(defn- get-card-map
"Return nil if block is not #card.
Return default card-map if :logseq.property/fsrs-state is nil"
[block-entity]
(when (some (fn [tag] (= :logseq.class/Card (:db/ident tag))) ;block should contains #Card
(:block/tags block-entity))
(or (some-> (:logseq.property/fsrs-state block-entity)
property-fsrs-state->fsrs-card-map)
(fsrs.core/new-card!))))
(defn repeat-card!
[repo block-id rating]
(let [eid (if (uuid? block-id) [:block/uuid block-id] block-id)
block-entity (db/entity repo eid)]
(when-let [card-map (get-card-map block-entity)]
(let [next-card-map (fsrs.core/repeat-card! card-map rating)]
(property-handler/set-block-property!
repo block-id
:logseq.property/fsrs-state (fsrs-card-map->property-fsrs-state next-card-map))))))