Browse Source

refactor(srs): update frontend.extensions.fsrs

rcmerci 1 năm trước cách đây
mục cha
commit
ac752c8ba3

+ 2 - 1
deps.edn

@@ -46,7 +46,8 @@
                                               ;; TODO: use https://github.com/open-spaced-repetition/cljc-fsrs
                                               ;; when PR merged
                                               ;; https://github.com/open-spaced-repetition/cljc-fsrs/pull/5
-                                              :git/url "https://github.com/rcmerci/cljc-fsrs"}}
+                                              :git/url "https://github.com/rcmerci/cljc-fsrs"}
+  tick/tick                             {:mvn/version "0.7.5"}}
 
  :aliases {:cljs {:extra-paths ["src/dev-cljs/" "src/test/" "src/electron/"]
                   :extra-deps  {org.clojure/clojurescript        {:mvn/version "1.11.132"}

+ 3 - 1
deps/db/src/logseq/db/frontend/class.cljs

@@ -15,7 +15,9 @@
    {:title "Task"
     :schema {:properties [:logseq.task/status :logseq.task/priority :logseq.task/deadline]}}
 
-   :logseq.class/Card {:title "Card"}
+   :logseq.class/Card
+   {:title "Card"
+    :schema {:properties [:logseq.property/fsrs-state]}}
 
    :logseq.class/Journal {:title "Journal"
                           :properties {:logseq.property.journal/title-format "MMM do, yyyy"}}

+ 1 - 1
deps/db/src/logseq/db/frontend/property.cljs

@@ -225,7 +225,7 @@
                                             :public? false}}
    :logseq.property/fsrs-state {:schema
                                 {:type :map
-                                 :hide? true
+                                 :hide? false ; show for debug now, hide it later
                                  :public? false}}))
 
 (def built-in-properties

+ 36 - 6
src/main/frontend/extensions/fsrs.cljs

@@ -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))))))