Explorar o código

fix: use api and minor refactoring

Weihua Lu %!s(int64=4) %!d(string=hai) anos
pai
achega
5530ea6e7a

+ 2 - 73
src/main/frontend/components/editor.cljs

@@ -6,7 +6,6 @@
             [frontend.components.datetime :as datetime-comp]
             [frontend.components.search :as search]
             [frontend.components.svg :as svg]
-            [cljs.core.async :refer [go <!]]
             [frontend.components.block :as block]
             [frontend.config :as config]
             [frontend.db :as db]
@@ -15,12 +14,11 @@
             [frontend.handler.page :as page-handler]
             [frontend.mixins :as mixins]
             [frontend.modules.shortcut.core :as shortcut]
+            [frontend.extensions.zotero :as zotero]
             [frontend.state :as state]
             [frontend.ui :as ui]
             [frontend.util :as util]
             [frontend.util.cursor :as cursor]
-            [frontend.extensions.zotero.handler :as zotero-handler]
-            [cljs-bean.core :as bean]
             [goog.dom :as gdom]
             [promesa.core :as p]
             [rum.core :as rum]))
@@ -234,75 +232,6 @@
     {:on-click #(commands/simple-insert! parent-id "/" {})}
     "/"]])
 
-(rum/defc zotero-search-item [item]
-  (let [data (:data item)
-        type (:itemType data)
-        abstract (str (subs (:abstractNote data) 0 200) "...")
-        title (:title data)]
-
-
-    (if (= type "journalArticle")
-      [:div.px-2.py-4.border-b.cursor-pointer.border-solid.hover:bg-gray-100.last:border-none
-       {:on-click (fn [] (go (<! (zotero-handler/create-zotero-page item))))}
-       [[:div.font-bold.mb-1 title]
-        [:div.text-sm abstract]]]
-      nil)))
-
-(rum/defc zotero-search []
-
-  (let [cache-api-key (js/localStorage.getItem "zotero-api-key")
-        cache-user-id (js/localStorage.getItem "zotero-user-id")
-        cache-api-key-empty (clojure.string/blank? cache-api-key)
-        cache-user-id-empty (clojure.string/blank? cache-user-id)]
-
-    (let
-     [api-key
-      (if cache-api-key-empty (js/prompt "Please enter your Zotero API key (https://www.zotero.org/settings/keys/new)") cache-api-key)
-      user-id
-      (if cache-user-id-empty (js/prompt "Please enter your Zotero user id (https://www.zotero.org/settings/keys)") cache-user-id)]
-
-      (when cache-api-key-empty (js/localStorage.setItem "zotero-api-key" api-key))
-      (when cache-user-id-empty (js/localStorage.setItem "zotero-user-id" user-id))
-
-
-
-
-
-      (let [[term set-term!] (rum/use-state "")
-            [search-result set-search-result!] (rum/use-state [])
-            [search-error set-search-error!] (rum/use-state nil)
-            [is-searching set-is-searching!] (rum/use-state false)]
-
-
-        (rum/use-effect!
-         (fn []
-           (let [do-search (fn [] (when (not (clojure.string/blank? term))
-                                    (util/fetch (str "https://api.zotero.org/users/" user-id "/items?itemType=journalArticle&qmode=everything&q=" term)
-                                                (bean/->js {:method "get"
-                                                            :headers {:Accept "application/json"
-                                                                      :Content-Type "application/json"
-                                                                      :Authorization (str "Bearer " api-key)}})
-                                                (fn [result] (set-search-result! result))
-                                                (fn [error] (set-search-error! error)))))
-                 do-search (util/debounce 200 do-search)]
-
-             (do-search)))
-         [term])
-
-
-        [:div.zotero-search.p-4
-
-         [:input.p-2.border.block.w-full.mb-3
-          {:autoFocus true
-           :placeholder "Search for your Zotero journal article (title, author, text, anything)"
-           :value term :on-change (fn [e] (set-term! (util/evalue e)))}]
-
-         [:div
-          (map
-           (fn [item] (rum/with-key (zotero-search-item item) (:key item)))
-           search-result)]]))))
-
-
 (rum/defcs input < rum/reactive
   (rum/local {} ::input-value)
   (mixins/event-mixin
@@ -572,7 +501,7 @@
 
      (when (state/sub :editor/show-zotero)
        (transition-cp
-        (zotero-search)
+        (zotero/zotero-search)
         false
         *slash-caret-pos))
 

+ 0 - 4
src/main/frontend/components/editor.css

@@ -68,7 +68,3 @@ pre {
 .preview-trigger-wrapper > [data-tooltipped] {
   display: block !important;
 }
-
-.zotero-search {
-  width: 600px;
-}

+ 67 - 1
src/main/frontend/extensions/zotero.cljs

@@ -1 +1,67 @@
-(ns frontend.extensions.zotero)
+(ns frontend.extensions.zotero
+  (:require [cljs.core.async :refer [<! go]]
+            [clojure.string :as str]
+            [frontend.extensions.zotero.api :as api]
+            [frontend.extensions.zotero.handler :as zotero-handler]
+            [frontend.state :as state]
+            [frontend.util :as util]
+            [rum.core :as rum]))
+
+(rum/defc zotero-search-item [{:keys [data title] :as item}]
+  (let [type (:item-type data)
+        abstract (str (subs (:abstract-note data) 0 200) "...")]
+
+    (if (= type "journalArticle")
+      [:div.px-2.py-4.border-b.cursor-pointer.border-solid.hover:bg-gray-100.last:border-none
+       {:on-click (fn [] (go (<! (zotero-handler/create-zotero-page item))))}
+       [[:div.font-bold.mb-1 title]
+        [:div.text-sm abstract]]]
+      nil)))
+
+(rum/defc zotero-search []
+
+  (let [cache-api-key       (js/localStorage.getItem "zotero-api-key")
+        cache-user-id       (js/localStorage.getItem "zotero-user-id")
+        cache-api-key-empty (str/blank? cache-api-key)
+        cache-user-id-empty (str/blank? cache-user-id)
+        api-key
+        (if cache-api-key-empty
+          (js/prompt "Please enter your Zotero API key (https://www.zotero.org/settings/keys/new)")
+          cache-api-key)
+
+        user-id (if cache-user-id-empty (js/prompt "Please enter your Zotero user id (https://www.zotero.org/settings/keys)") cache-user-id)]
+
+    (when cache-api-key-empty (js/localStorage.setItem "zotero-api-key" api-key))
+
+    (when cache-user-id-empty (js/localStorage.setItem "zotero-user-id" user-id))
+
+    (let [[term set-term!]                   (rum/use-state "")
+          [search-result set-search-result!] (rum/use-state [])
+          [search-error set-search-error!]   (rum/use-state nil)
+          [is-searching set-is-searching!]   (rum/use-state false)]
+
+
+      (rum/use-effect!
+       (fn []
+         (let [do-search (fn [] (when-not (str/blank? term)
+                                  (go
+                                    (let [result (<! (api/query-items "journalArticle" term))]
+                                      (set-search-result! result)))))
+               do-search (util/debounce 200 do-search)]
+
+           (do-search)))
+       [term])
+
+
+      [:div.zotero-search.p-4
+       {:style {:width 600}}
+
+       [:input.p-2.border.block.w-full.mb-3
+        {:autoFocus   true
+         :placeholder "Search for your Zotero journal article (title, author, text, anything)"
+         :value       term :on-change (fn [e] (set-term! (util/evalue e)))}]
+
+       [:div
+        (map
+         (fn [item] (rum/with-key (zotero-search-item item) (:key item)))
+         search-result)]])))

+ 6 - 0
src/main/frontend/extensions/zotero/api.cljs

@@ -43,6 +43,12 @@
 (defn item [key]
   (get* config (str "/items/" key)))
 
+(defn query-items [type term]
+  (get* config (str "/items")
+        {:qmode "everything"
+         :q term
+         :item-type type}))
+
 (defn notes [key]
   (get* config (str "/items/" key "/children") {:item-type "note"}))