Compare commits
3 commits
905fe2bd88
...
8d7e4dde0e
| Author | SHA1 | Date | |
|---|---|---|---|
| 8d7e4dde0e | |||
| c91b1ff2d4 | |||
| 2b78afde38 |
2 changed files with 37 additions and 33 deletions
|
|
@ -153,13 +153,11 @@
|
|||
(obtain-oauth-authorization-code! application))))))
|
||||
|
||||
(declare fetch-posts!)
|
||||
(declare refresh-displayed-posts!)
|
||||
(declare debounced-refresh!)
|
||||
|
||||
(defn- fetch-application-settings []
|
||||
(-> (db/open-cursor! ::db/application db/all)
|
||||
(db/transduce-cursor (comp (take 1)
|
||||
(map #(js->clj % :keywordize-keys true)))
|
||||
(fn [_ x] x))))
|
||||
(->> (db/open-cursor! ::db/application db/all)
|
||||
(db/first-result (map #(js->clj % :keywordize-keys true)))))
|
||||
|
||||
(defn setup-application!
|
||||
"Handles Mastodon application setup on the client side"
|
||||
|
|
@ -202,7 +200,7 @@
|
|||
(if (zero? post-count)
|
||||
(fetch-posts! {:instance-url (:instance_url application)
|
||||
:bearer-token (:bearer_token application)})
|
||||
(refresh-displayed-posts! (:section/posts @state))))))))
|
||||
(debounced-refresh! (:section/posts @state))))))))
|
||||
|
||||
;;; views
|
||||
|
||||
|
|
@ -289,7 +287,7 @@
|
|||
:on-change (fn [e]
|
||||
(let [query (.. e -target -value)]
|
||||
(swap! state assoc-in [:section/posts :query] (if (str/blank? query) nil query))
|
||||
(refresh-displayed-posts! (:section/posts @state))))}])
|
||||
(debounced-refresh! (:section/posts @state))))}])
|
||||
|
||||
(defn- debug
|
||||
"Implements a lazy pretty-printer for whatever is passed in as `obj`. The
|
||||
|
|
@ -317,16 +315,23 @@
|
|||
(drop 1))])
|
||||
|
||||
(defn attachment [{:keys [attachment]}]
|
||||
(let [preview-url (or (:preview_remote_url attachment) (:preview_url attachment))
|
||||
remote-url (or (:remote_url attachment) (:url attachment))
|
||||
_ (js/console.log :preview-url preview-url :remote_url remote-url :attachment attachment)
|
||||
ext (last (str/split remote-url #"\."))]
|
||||
(case (:type attachment)
|
||||
"image" [:img {:src (:preview_url attachment)
|
||||
"image" [:img {:src preview-url
|
||||
:srcset (str preview-url ", " remote-url)
|
||||
:alt (:description attachment)
|
||||
:lazy "lazy"}]
|
||||
"video" [:video {:controls true}
|
||||
[:source {:type (str "video/" (last (str/split (:remote_url attachment) #"\.")))
|
||||
:src (:remote_url attachment)}]
|
||||
[:source {:type (str "video/" ext) :src remote-url}]
|
||||
[:a {:href (:remote_url attachment)} (str "Original video at " (:remote_url attachment))]]
|
||||
"gifv" [:video {:controls true :loop true :autoplay true}
|
||||
[:source {:type (str "video/" ext) :src remote-url}]
|
||||
[:a {:href (:remote_url attachment)} (str "Original video at " (:remote_url attachment))]]
|
||||
[:div [:strong "Unsupported attachment"]
|
||||
[debug attachment]]))
|
||||
[debug attachment]])))
|
||||
|
||||
(defn post [{:keys [post]}]
|
||||
; TODO: handle (:sensitive post)
|
||||
|
|
@ -377,7 +382,7 @@
|
|||
refresh-id (js/Date.now)]
|
||||
(swap! state update-in [:section/posts :loading] conj refresh-id)
|
||||
(. (promise-all [(db/count! ::db/posts)
|
||||
(-> (db/open-cursor! ::db/posts ::db/post-created-at db/all "prev")
|
||||
(->> (db/open-cursor! ::db/posts ::db/post-created-at db/all "prev")
|
||||
(db/transduce-cursor xform))])
|
||||
(then (fn [[total displayed-posts]]
|
||||
(swap! state update :section/posts #(-> (assoc % :total total)
|
||||
|
|
@ -407,12 +412,10 @@
|
|||
(paginate-posts! (merge defaults opts))))
|
||||
|
||||
(defn- internal-post-id [max-or-min]
|
||||
(-> (db/open-cursor! ::db/posts ::db/post-created-at db/all (if (= max-or-min :min)
|
||||
(->> (db/open-cursor! ::db/posts ::db/post-created-at db/all (if (= max-or-min :min)
|
||||
"next"
|
||||
"prev"))
|
||||
(db/transduce-cursor (comp (keep (j/get :internal_id))
|
||||
(take 1))
|
||||
(fn [_ x] x))))
|
||||
(db/first-result (keep (j/get :internal_id)))))
|
||||
|
||||
(defn fetch-more-posts! [e]
|
||||
(.preventDefault e)
|
||||
|
|
|
|||
|
|
@ -103,13 +103,13 @@
|
|||
Takes a transducer `xform`, a reducing function `rf` and an initial `init`.
|
||||
If no `init` is given, it will default to `(rf)`. If no `rf` is given, the
|
||||
resulting value will be a persistent vector containing the result of all steps."
|
||||
([cursor-req xform]
|
||||
([xform cursor-req]
|
||||
; optimization: work with a transient vector before returning the final result
|
||||
(-> (transduce-cursor cursor-req xform conj! (transient []))
|
||||
(-> (transduce-cursor xform conj! (transient []) cursor-req)
|
||||
(.then persistent!)))
|
||||
([cursor-req xform rf]
|
||||
(transduce-cursor cursor-req xform rf (rf)))
|
||||
([cursor-req xform rf init]
|
||||
([xform rf cursor-req]
|
||||
(transduce-cursor xform rf (rf) cursor-req))
|
||||
([xform rf init cursor-req]
|
||||
(let [result (volatile! init)
|
||||
xform (xform rf)]
|
||||
(js/Promise.
|
||||
|
|
@ -121,14 +121,15 @@
|
|||
; to avoid unnecessary conversion costs.
|
||||
(let [step (xform @result (.-value cursor))]
|
||||
(if (reduced? step)
|
||||
(do
|
||||
(vreset! result @step)
|
||||
(resolve @result))
|
||||
(resolve @step)
|
||||
(do
|
||||
(vreset! result step)
|
||||
(.continue cursor))))
|
||||
(resolve @result)))))))))
|
||||
|
||||
(defn first-result [xform cursor-req]
|
||||
(transduce-cursor (comp xform (take 1)) (fn [_ x] x) cursor-req))
|
||||
|
||||
(def all (js/IDBKeyRange.lowerBound ""))
|
||||
|
||||
(comment
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue