diff --git a/src/computersandblues/lodestone/app.cljs b/src/computersandblues/lodestone/app.cljs index 70cd04d..945705c 100644 --- a/src/computersandblues/lodestone/app.cljs +++ b/src/computersandblues/lodestone/app.cljs @@ -153,11 +153,13 @@ (obtain-oauth-authorization-code! application)))))) (declare fetch-posts!) -(declare debounced-refresh!) +(declare refresh-displayed-posts!) (defn- fetch-application-settings [] - (->> (db/open-cursor! ::db/application db/all) - (db/first-result (map #(js->clj % :keywordize-keys true))))) + (-> (db/open-cursor! ::db/application db/all) + (db/transduce-cursor (comp (take 1) + (map #(js->clj % :keywordize-keys true))) + (fn [_ x] x)))) (defn setup-application! "Handles Mastodon application setup on the client side" @@ -200,7 +202,7 @@ (if (zero? post-count) (fetch-posts! {:instance-url (:instance_url application) :bearer-token (:bearer_token application)}) - (debounced-refresh! (:section/posts @state)))))))) + (refresh-displayed-posts! (:section/posts @state)))))))) ;;; views @@ -287,7 +289,7 @@ :on-change (fn [e] (let [query (.. e -target -value)] (swap! state assoc-in [:section/posts :query] (if (str/blank? query) nil query)) - (debounced-refresh! (:section/posts @state))))}]) + (refresh-displayed-posts! (:section/posts @state))))}]) (defn- debug "Implements a lazy pretty-printer for whatever is passed in as `obj`. The @@ -315,23 +317,16 @@ (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 - :srcset (str preview-url ", " remote-url) - :alt (:description attachment) - :lazy "lazy"}] - "video" [:video {:controls true} - [: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]]))) + (case (:type attachment) + "image" [:img {:src (:preview_url attachment) + :alt (:description attachment) + :lazy "lazy"}] + "video" [:video {:controls true} + [:source {:type (str "video/" (last (str/split (:remote_url attachment) #"\."))) + :src (:remote_url attachment)}] + [:a {:href (:remote_url attachment)} (str "Original video at " (:remote_url attachment))]] + [:div [:strong "Unsupported attachment"] + [debug attachment]])) (defn post [{:keys [post]}] ; TODO: handle (:sensitive post) @@ -382,8 +377,8 @@ 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/transduce-cursor xform))]) + (-> (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) (assoc :displayed-posts displayed-posts) @@ -412,10 +407,12 @@ (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) - "next" - "prev")) - (db/first-result (keep (j/get :internal_id))))) + (-> (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)))) (defn fetch-more-posts! [e] (.preventDefault e) diff --git a/src/computersandblues/lodestone/database.cljs b/src/computersandblues/lodestone/database.cljs index 119bc6a..0ec3905 100644 --- a/src/computersandblues/lodestone/database.cljs +++ b/src/computersandblues/lodestone/database.cljs @@ -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." - ([xform cursor-req] + ([cursor-req xform] ; optimization: work with a transient vector before returning the final result - (-> (transduce-cursor xform conj! (transient []) cursor-req) + (-> (transduce-cursor cursor-req xform conj! (transient [])) (.then persistent!))) - ([xform rf cursor-req] - (transduce-cursor xform rf (rf) cursor-req)) - ([xform rf init cursor-req] + ([cursor-req xform rf] + (transduce-cursor cursor-req xform rf (rf))) + ([cursor-req xform rf init] (let [result (volatile! init) xform (xform rf)] (js/Promise. @@ -121,15 +121,14 @@ ; to avoid unnecessary conversion costs. (let [step (xform @result (.-value cursor))] (if (reduced? step) - (resolve @step) + (do + (vreset! result @step) + (resolve @result)) (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