فهرست منبع

Merge branch 'master' into feat/chrome-native-fs

Tienson Qin 5 سال پیش
والد
کامیت
b1d6ae8815

+ 14 - 7
resources/css/common.css

@@ -39,7 +39,8 @@
     --ls-page-inline-code-color: var(--ls-primary-text-color);
     --ls-page-inline-code-bg-color: #01222a;
 
-    --ls-scrollbar-color: #001F27;
+    --ls-scrollbar-foreground-color: #001F27;
+    --ls-scrollbar-background-color: var(--ls-primary-background-color);
     --ls-scrollbar-thumb-hover-color: #b4b4b466;
 
     --ls-head-text-color: var(--ls-link-text-color);
@@ -82,6 +83,10 @@
     --ls-page-inline-code-color: var(--ls-primary-text-color);
     --ls-page-inline-code-bg-color: #eeeeee;
 
+    --ls-scrollbar-foreground-color: var(--ls-primary-text-color);
+    --ls-scrollbar-background-color: var(--ls-primary-background-color);
+    --ls-scrollbar-thumb-hover-color: var(--ls-secondary-text-color);
+
     --ls-head-text-color: var(--ls-link-text-color);
     --ls-icon-color: #6b7280;
     --ls-search-icon-color: var(--ls-icon-color);
@@ -724,7 +729,7 @@ dt {
 }
 
 :root {
-  scrollbar-color: #0079D3 #2E3645 !important;
+  scrollbar-color: var(--ls-scrollbar-foreground-color) var(--ls-scrollbar-background-color) !important;
   scrollbar-width: thin !important;
 }
 
@@ -747,13 +752,13 @@ blockquote {
 }
 
 .dark-theme ::-webkit-scrollbar, .dark-theme ::-webkit-scrollbar-track-piece {
-  background-color: var(--ls-scrollbar-color);
+  background-color: var(--ls-scrollbar-background-color);
   border: 4px solid;
-  border-color: var(--ls-scrollbar-color);
+  border-color: var(--ls-scrollbar-background-color);
 }
 
 .dark-theme ::-webkit-scrollbar-thumb {
-  background-color: var(--ls-secondary-background-color);
+  background-color: var(--ls-scrollbar-foreground-color);
   background-clip: padding-box;
   min-height: 28px;
 }
@@ -1027,11 +1032,13 @@ button.context-menu-option {
 }
 
 ::selection {
-  background: #338FFF;
+  background: var(--ls-block-highlight-color);
+  color: var(--ls-primary-text-color);
 }
 
 ::-moz-selection {
-  background: #338FFF;
+  background: var(--ls-block-highlight-color);
+  color: var(--ls-primary-text-color);
 }
 
 .dropdown-overflow-auto {

+ 1 - 1
src/main/frontend/components/block.cljs

@@ -1622,7 +1622,7 @@
           (let [language (if (contains? #{"edn" "clj" "cljc" "cljs" "clojure"} language) "text/x-clojure" language)]
             [:div
              (lazy-editor/editor config (str (dc/squuid)) attr code pos_meta)
-             (when (and (= language "clojure") (contains? (set options) ":results"))
+             (when (and (= language "text/x-clojure") (contains? (set options) ":results"))
                (sci/eval-result code))])))
       ["Quote" l]
       (->elem

+ 8 - 6
src/main/frontend/components/diff.cljs

@@ -13,6 +13,7 @@
             [frontend.ui :as ui]
             [frontend.db :as db]
             [frontend.git :as git]
+            [frontend.helper :as helper]
             [goog.object :as gobj]
             [promesa.core :as p]
             [frontend.github :as github]
@@ -135,20 +136,22 @@
        [:div "loading..."])]))
 
 ;; TODO: `n` shortcut for next diff, `p` for previous diff
-(rum/defcc diff < rum/reactive
+(rum/defcc diff <
+  rum/reactive
   {:will-mount
    (fn [state]
      (when-let [repo (state/get-current-repo)]
        (p/let [remote-latest-commit (common-handler/get-remote-ref repo)
                local-latest-commit (common-handler/get-ref repo)
-               result (git/get-local-diffs repo local-latest-commit remote-latest-commit)]
+               result (git/get-local-diffs repo local-latest-commit remote-latest-commit)
+               token (helper/get-github-token repo)]
          (reset! diffs result)
          (reset! remote-hash-id remote-latest-commit)
          (doseq [{:keys [type path]} result]
            (when (contains? #{"added" "modify"}
                             type)
              (github/get-content
-              (state/get-github-token repo)
+              token
               repo
               path
               remote-latest-commit
@@ -166,8 +169,7 @@
                       "Install Logseq on GitHub"
                       :href (str "https://github.com/apps/" config/github-app-name "/installations/new"))]
                    :error
-                   false))))))))
-     state)
+                   false)))))))))
    :will-unmount
    (fn [state]
      (reset! diffs nil)
@@ -199,7 +201,7 @@
          (ui/textarea
           {:placeholder "Commit message (optional)"
            :on-change (fn [e]
-                        (reset! commit-message (util/evalue e)))})
+                       (reset! commit-message (util/evalue e)))})
          (if pushing?
            [:span (ui/loading "Pushing")]
            (ui/button "Commit and push"

+ 3 - 1
src/main/frontend/core.cljs

@@ -4,8 +4,10 @@
             [frontend.handler.route :as route]
             [frontend.page :as page]
             [frontend.routes :as routes]
+            [frontend.spec]
             [reitit.frontend :as rf]
-            [reitit.frontend.easy :as rfe]))
+            [reitit.frontend.easy :as rfe]
+            ))
 
 (defn set-router!
   []

+ 34 - 49
src/main/frontend/db.cljs

@@ -1,6 +1,5 @@
 (ns frontend.db
   (:require [datascript.core :as d]
-            [frontend.util :as util]
             [frontend.date :as date]
             [medley.core :as medley]
             [datascript.transit :as dt]
@@ -11,9 +10,7 @@
             [clojure.string :as string]
             [clojure.set :as set]
             [frontend.utf8 :as utf8]
-            [cljs-bean.core :as bean]
             [frontend.config :as config]
-            [goog.object :as gobj]
             [promesa.core :as p]
             [cljs.reader :as reader]
             [cljs-time.core :as t]
@@ -21,7 +18,6 @@
             [clojure.walk :as walk]
             [frontend.util :as util :refer-macros [profile]]
             [frontend.extensions.sci :as sci]
-            [goog.array :as garray]
             [frontend.db-schema :as db-schema]
             [clojure.core.async :as async]
             [frontend.idb :as idb]))
@@ -30,8 +26,6 @@
 ;; TODO: replace with LRUCache, only keep the latest 20 or 50 items?
 (defonce query-state (atom {}))
 
-(defonce async-chan (atom nil))
-
 (defn get-repo-path
   [url]
   (if (util/starts-with? url "http")
@@ -93,7 +87,6 @@
 
 ;; transit serialization
 
-
 (defn db->string [db]
   (dt/write-transit-str db))
 
@@ -140,8 +133,8 @@
   (swap! query-state assoc k {:query query
                               :inputs inputs
                               :result result-atom
-                              :query-fn query-fn
                               :transform-fn transform-fn
+                              :query-fn query-fn
                               :inputs-fn inputs-fn})
   result-atom)
 
@@ -157,16 +150,16 @@
 
 (defn remove-query-component!
   [component]
-  (let [ks (->> (filter (fn [[_ components]]
-                          (contains? (set components) component))
-                        @query-components)
-                (map first))]
-    (doseq [k ks]
-      (swap! query-components update k (fn [components]
-                                         (remove #(= component %) components)))
-      (when (zero? (count (get @query-components k))) ; no subscribed components
-        (swap! query-components dissoc k)
-        (remove-q! k)))))
+  (reset!
+   query-components
+   (->> (for [[k components] @query-components
+              :let [new-components (remove #(= component %) components)]]
+          (if (empty? new-components) ; no subscribed components
+            (do (remove-q! k)
+                nil)
+            [k new-components]))
+        (keep identity)
+        (into {}))))
 
 (defn get-page-blocks-cache-atom
   [repo page-id]
@@ -286,10 +279,9 @@
 
     :else
     (case key
-      (list :block/change :block/insert)
-      (when (seq data)
-        (let [blocks data
-              pre-block? (:block/pre-block? (first blocks))
+      (:block/change :block/insert)
+      (when-let [blocks (seq data)]
+        (let [pre-block? (:block/pre-block? (first blocks))
               current-priority (get-current-priority)
               current-marker (get-current-marker)
               current-page-id (:db/id (get-current-page))
@@ -461,7 +453,7 @@
   [blocks]
   (some->> blocks
            (group-by :block/page)
-           (sort-by (fn [[p blocks]] (:page/last-modified-at p)) >)))
+           (sort-by (fn [[p _blocks]] (:page/last-modified-at p)) >)))
 
 (defn- with-repo
   [repo blocks]
@@ -538,10 +530,6 @@
           (group-by-page result)))
       result)))
 
-;; (defn get-repo-tx-id [repo]
-;;   (when-let [db (get-conn repo)]
-;;     ))
-
 (defn get-tx-id [tx-report]
   (get-in tx-report [:tempids :db/current-tx]))
 
@@ -675,7 +663,7 @@
          :where
          [?page :page/tags ?e]
          [?e :tag/name ?tag]
-         [?tag-page :page/name ?tag]
+         [_ :page/name ?tag]
          [?page :page/name ?page-name]]
        (get-conn repo)))
 
@@ -692,7 +680,7 @@
         '[:find ?page-name
           :where
           [?page :page/original-name ?page-name]]
-        (get-conn))
+        (get-conn repo))
        (map first)))
 
 (defn get-sync-metadata
@@ -726,7 +714,6 @@
           '[:find ?page-name ?modified-at
             :where
             [?page :page/original-name ?page-name]
-            [(get-else $ ?page :page/journal? false) ?journal]
             [(get-else $ ?page :page/last-modified-at 0) ?modified-at]]
           (get-conn repo))
          (seq)
@@ -787,7 +774,7 @@
 (defn get-files-blocks
   [repo-url paths]
   (let [paths (set paths)
-        pred (fn [db e]
+        pred (fn [_db e]
                (contains? paths e))]
     (-> (d/q '[:find ?block
                :in $ ?pred
@@ -1556,7 +1543,7 @@
         pages)))))
 
 (defn me-tx
-  [db {:keys [name email avatar repos]}]
+  [db {:keys [name email avatar]}]
   (util/remove-nils {:me/name name
                      :me/email email
                      :me/avatar avatar}))
@@ -1647,8 +1634,8 @@
                 [?ref-page :page/name ?ref-page-name]]
               '[:find ?page ?ref-page-name
                 :where
-                [?p :page/name ?page]
                 [?p :page/journal? false]
+                [?p :page/name ?page]
                 [?block :block/page ?p]
                 [?block :block/ref-pages ?ref-page]
                 [?ref-page :page/name ?ref-page-name]])]
@@ -1906,19 +1893,18 @@
 (defn- build-nodes
   [dark? current-page edges nodes]
   (mapv (fn [p]
-          (cond->
-           {:id p
-            :name p
-            :val (get-connections p edges)
-            :autoColorBy "group"
-            :group (js/Math.ceil (* (js/Math.random) 12))
-            :color "#222222"}
-            dark?
-            (assoc :color "#8abbbb")
-            (= p current-page)
-            (assoc :color (if dark?
-                            "#ffffff"
-                            "#045591"))))
+          (let [current-page? (= p current-page)
+                color (case [dark? current-page?]
+                            [false false] "#222222"
+                            [false true]  "#045591"
+                            [true false]  "#8abbbb"
+                            [true true]   "#ffffff")] ; FIXME: Put it into CSS
+            {:id p
+             :name p
+             :val (get-connections p edges)
+             :autoColorBy "group"
+             :group (js/Math.ceil (* (js/Math.random) 12))
+             :color color}))
         (set (flatten nodes))))
 
 (defn normalize-page-name
@@ -2182,8 +2168,8 @@
   (d/q
    '[:find ?content
      :where
-     [?h :block/content ?content]
-     [?h :block/collapsed? true]]
+     [?h :block/collapsed? true]
+     [?h :block/content ?content]]
    (get-conn)))
 
 (defn get-block-parent
@@ -2289,7 +2275,6 @@
       (let [f (async/<! chan)]
         (f))
       (recur))
-    (reset! async-chan chan)
     chan))
 
 (defonce blocks-count-cache (atom nil))

+ 3 - 2
src/main/frontend/handler.cljs

@@ -14,7 +14,8 @@
             [frontend.handler.ui :as ui-handler]
             [frontend.handler.web.nfs :as nfs]
             [frontend.ui :as ui]
-            [goog.object :as gobj]))
+            [goog.object :as gobj]
+            [frontend.helper :as helper]))
 
 (defn- watch-for-date!
   []
@@ -53,7 +54,7 @@
                             (page-handler/init-commands!)
                             (if (seq (:repos me))
                               ;; FIXME: handle error
-                              (repo-handler/request-app-tokens!
+                              (helper/request-app-tokens!
                                (fn []
                                  (repo-handler/clone-and-pull-repos me))
                                (fn []

+ 5 - 4
src/main/frontend/handler/git.cljs

@@ -11,7 +11,9 @@
             [frontend.handler.route :as route-handler]
             [frontend.handler.common :as common-handler]
             [frontend.config :as config]
-            [cljs-time.local :as tl]))
+            [cljs-time.local :as tl]
+            [frontend.helper :as helper]))
+
 
 (defn- set-git-status!
   [repo-url value]
@@ -45,9 +47,8 @@
     (p/let [remote-oid (common-handler/get-remote-ref repo)
             commit-oid (git/commit repo commit-message (array remote-oid))
             result (git/write-ref! repo commit-oid)
-            push-result (git/push repo
-                                  (state/get-github-token repo)
-                                  true)]
+            token (helper/get-github-token repo)
+            push-result (git/push repo token true)]
       (reset! pushing? false)
       (notification/clear! nil)
       (route-handler/redirect! {:to :home}))))

+ 45 - 131
src/main/frontend/handler/repo.cljs

@@ -21,8 +21,7 @@
             [cljs.reader :as reader]
             [clojure.string :as string]
             [frontend.dicts :as dicts]
-            ;; [clojure.set :as set]
-))
+            [frontend.helper :as helper]))
 
 ;; Project settings should be checked in two situations:
 ;; 1. User changes the config.edn directly in logseq.com (fn: alter-file)
@@ -43,42 +42,6 @@
    :error
    false))
 
-(defn get-new-token
-  [repo]
-  (when-let [installation-id (-> (filter
-                                  (fn [r]
-                                    (= (:url r) repo))
-                                  (:repos (state/get-me)))
-                                 (first)
-                                 :installation_id)]
-    (util/post (str config/api "refresh_github_token")
-               {:installation-ids [installation-id]}
-               (fn [result]
-                 (let [token (:token (first result))]
-                   (state/set-github-token! repo token)))
-               (fn [error]
-                 (println "Something wrong!")
-                 (js/console.dir error)))))
-
-(defn request-app-tokens!
-  [ok-handler error-handler]
-  (let [repos (:repos (state/get-me))
-        installation-ids (->> (map :installation_id repos)
-                              (remove nil?)
-                              (distinct))]
-    (when (or (seq repos)
-              (seq installation-ids))
-      (util/post (str config/api "refresh_github_token")
-                 {:installation-ids installation-ids
-                  :repos repos}
-                 (fn [result]
-                   (state/set-github-installation-tokens! result)
-                   (when ok-handler (ok-handler)))
-                 (fn [error]
-                   (println "Something wrong!")
-                   (js/console.dir error)
-                   (when error-handler (error-handler)))))))
-
 (defn journal-file-changed?
   [repo-url diffs]
   (contains? (set (map :path diffs))
@@ -298,13 +261,10 @@
 (declare push)
 
 (defn pull
-  [repo-url token {:keys [fallback? force-pull?]
-                   :or {fallback? false
-                        force-pull? false}}]
+  [repo-url {:keys [force-pull?] :or {force-pull? false}}]
   (when (and
          (db/get-conn repo-url true)
-         (db/cloned? repo-url)
-         token)
+         (db/cloned? repo-url))
     (p/let [remote-latest-commit (common-handler/get-remote-ref repo-url)
             local-latest-commit (common-handler/get-ref repo-url)
             descendent? (git/descendent? repo-url local-latest-commit remote-latest-commit)]
@@ -323,7 +283,8 @@
                       (not (state/in-draw-mode?))))
                 (git-handler/set-git-status! repo-url :pulling)
                 (->
-                 (p/let [result (git/fetch repo-url token)]
+                 (p/let [token (helper/get-github-token repo-url)
+                         result (git/fetch repo-url token)]
                    (let [{:keys [fetchHead]} (bean/->clj result)]
                      (-> (git/merge repo-url)
                          (p/then (fn [result]
@@ -363,28 +324,13 @@
                  (p/catch (fn [error]
                             (println "Pull error:" (str error))
                             (js/console.error error)
-                            ;; token might be expired, request new token
-
-                            (cond
-                              (and (or (string/includes? (str error) "401")
-                                       (string/includes? (str error) "404"))
-                                   (not fallback?))
-                              (request-app-tokens!
-                               (fn []
-                                 (pull repo-url (state/get-github-token repo-url) {:fallback? true}))
-                               nil)
-
-                              (or (string/includes? (str error) "401")
-                                  (string/includes? (str error) "404"))
-                              (show-install-error! repo-url (util/format "Failed to fetch %s." repo-url))
-
-                              :else
-                              nil))))))))))))
+                            (when (or (string/includes? (str error) "401")
+                                      (string/includes? (str error) "404"))
+                              (show-install-error! repo-url (util/format "Failed to fetch %s." repo-url))))))))))))))
 
 (defn push
-  [repo-url {:keys [commit-message fallback? diff-push? commit-push? force?]
+  [repo-url {:keys [commit-message diff-push? commit-push? force?]
              :or {commit-message "Logseq auto save"
-                  fallback? false
                   diff-push? false
                   commit-push? false
                   force? false}}]
@@ -399,15 +345,15 @@
             (when (or
                    commit-push?
                    (seq files)
-                   fallback?
                    diff-push?)
               ;; auto commit if there are any un-committed changes
               (let [commit-message (if (string/blank? commit-message)
                                      "Logseq auto save"
                                      commit-message)]
-                (p/let [commit-oid (git/commit repo-url commit-message)]
+                (p/let [commit-oid (git/commit repo-url commit-message)
+                        token (helper/get-github-token repo-url)]
                   (git-handler/set-git-status! repo-url :pushing)
-                  (when-let [token (state/get-github-token repo-url)]
+                  (when token
                     (util/p-handle
                      (git/push repo-url token force?)
                      (fn [result]
@@ -418,31 +364,11 @@
                        (println "Git push error: ")
                        (js/console.error error)
                        (common-handler/check-changed-files-status repo-url)
-                       (let [permission? (or (string/includes? (str error) "401")
-                                             (string/includes? (str error) "404"))]
-                         (cond
-                           (and permission? (not fallback?))
-                           (request-app-tokens!
-                            (fn []
-                              (git-handler/set-git-status! repo-url :re-push)
-                              (push repo-url
-                                    {:commit-message commit-message
-                                     :fallback? true}))
-                            nil)
-
-                           :else
-                           (do
-                             (git-handler/set-git-status! repo-url :push-failed)
-                             (git-handler/set-git-error! repo-url error)
-                             (cond
-                               permission?
-                               (show-install-error! repo-url (util/format "Failed to push to %s. " repo-url))
-
-                               (state/online?)
-                               (pull repo-url token {:force-pull? true})
-
-                               :else    ; offline
-                               nil)))))))))))
+                       (do
+                         (git-handler/set-git-status! repo-url :push-failed)
+                         (git-handler/set-git-error! repo-url error)
+                         (when (state/online?)
+                           (pull repo-url {:force-pull? true}))))))))))
           (p/catch (fn [error]
                      (println "Git push error: ")
                      (git-handler/set-git-status! repo-url :push-failed)
@@ -457,39 +383,28 @@
 (defn pull-current-repo
   []
   (when-let [repo (state/get-current-repo)]
-    (when-let [token (state/get-github-token repo)]
-      (pull repo token {:force-pull? true}))))
+    (pull repo {:force-pull? true})))
 
 (defn clone
-  ([repo-url]
-   (clone repo-url false))
-  ([repo-url fallback?]
-   (when-let [token (state/get-github-token repo-url)]
-     (util/p-handle
-      (do
-        (state/set-cloning! true)
-        (git/clone repo-url token))
-      (fn [result]
-        (state/set-git-clone-repo! "")
-        (state/set-current-repo! repo-url)
-        (db/start-db-conn! (:me @state/state) repo-url)
-        (db/mark-repo-as-cloned repo-url))
-      (fn [e]
-        (if (and (not fallback?)
-                 (or (string/includes? (str e) "401")
-                     (string/includes? (str e) "404")))
-          (request-app-tokens!
-           (fn []
-             (clone repo-url true))
-           nil)
-          (do
-            (println "Clone failed, error: ")
-            (js/console.error e)
-            (state/set-cloning! false)
-            (git-handler/set-git-status! repo-url :clone-failed)
-            (git-handler/set-git-error! repo-url e)
-
-            (show-install-error! repo-url (util/format "Failed to clone %s." repo-url)))))))))
+  [repo-url]
+  (p/let [token (helper/get-github-token repo-url)]
+    (when token
+      (util/p-handle
+        (do
+          (state/set-cloning! true)
+          (git/clone repo-url token))
+        (fn [result]
+          (state/set-git-clone-repo! "")
+          (state/set-current-repo! repo-url)
+          (db/start-db-conn! (:me @state/state) repo-url)
+          (db/mark-repo-as-cloned repo-url))
+        (fn [e]
+          (println "Clone failed, error: ")
+          (js/console.error e)
+          (state/set-cloning! false)
+          (git-handler/set-git-status! repo-url :clone-failed)
+          (git-handler/set-git-error! repo-url e)
+          (show-install-error! repo-url (util/format "Failed to clone %s." repo-url)))))))
 
 (defn set-config-content!
   [repo path new-config]
@@ -553,18 +468,18 @@
 
 (defn periodically-pull
   [repo-url pull-now?]
-  (when-let [token (state/get-github-token repo-url)]
-    (when pull-now? (pull repo-url token nil))
-    (js/setInterval #(pull repo-url token nil)
-                    (* (config/git-pull-secs) 1000))))
+  (p/let [token (helper/get-github-token repo-url)]
+    (when token
+      (when pull-now? (pull repo-url nil))
+      (js/setInterval #(pull repo-url nil)
+        (* (config/git-pull-secs) 1000)))))
 
 (defn periodically-push-tasks
   [repo-url]
-  (let [token (state/get-github-token repo-url)
-        push (fn []
+  (let [push (fn []
                (when (and (not (false? (:git-auto-push (state/get-config repo-url))))
-                          ;; (not config/dev?)
-)
+                       ;; (not config/dev?)
+                       )
                  (push repo-url nil)))]
     (js/setInterval push
                     (* (config/git-push-secs) 1000))))
@@ -636,5 +551,4 @@
   [commit-message]
   (when-let [repo (state/get-current-repo)]
     (push repo {:commit-message commit-message
-                :fallback? false
                 :commit-push? true})))

+ 57 - 0
src/main/frontend/helper.cljs

@@ -0,0 +1,57 @@
+(ns frontend.helper
+  (:require [cljs-time.format :as tf]
+            [cljs-time.core :as t]
+            [frontend.util :as util]
+            [frontend.state :as state]
+            [frontend.config :as config]))
+
+(defn request-app-tokens!
+  [ok-handler error-handler]
+  (let [repos (state/get-repos)
+        installation-ids (->> (map :installation_id repos)
+                              (remove nil?)
+                              (distinct))]
+    (when (or (seq repos)
+            (seq installation-ids))
+      (util/post (str config/api "refresh_github_token")
+        {:installation-ids installation-ids
+         :repos repos}
+        (fn [result]
+          (state/set-github-installation-tokens! result)
+          (when ok-handler (ok-handler)))
+        (fn [error]
+          (println "Request app token failed.")
+          (js/console.dir error)
+          (when error-handler (error-handler)))))))
+
+(defn- get-github-token*
+  [repo]
+  (when repo
+    (let [{:keys [token expires_at] :as token-state}
+          (state/get-github-token repo)
+          expires-at (tf/parse (tf/formatters :date-time-no-ms) expires_at)
+          request-time-gap (t/minutes 1)
+          now (t/now)
+          expired? (t/after? now (t/minus expires-at request-time-gap))]
+      {:expired? expired?
+       :token token})))
+
+(defn get-github-token
+  ([]
+   (get-github-token  (state/get-current-repo)))
+  ([repo]
+   (js/Promise.
+     (fn [resolve reject]
+       (let [{:keys [expired? token]} (get-github-token* repo)]
+        (if-not expired?
+          (resolve token)
+          (request-app-tokens!
+            (fn []
+              (let [{:keys [expired? token]} (get-github-token* repo)]
+                (if-not expired?
+                  (resolve token)
+                  (do (js/console.error "Failed to get GitHub token.")
+                      (reject)))))
+            nil)))))))
+
+

+ 21 - 21
src/main/frontend/state.cljs

@@ -502,36 +502,36 @@
   (storage/set :git/clone-repo repo))
 
 (defn set-github-token!
-  [repo token]
-  (when token
-    (swap! state update-in [:me :repos]
-           (fn [repos]
-             (map (fn [r]
-                    (if (= repo (:url r))
-                      (assoc r :token token)
-                      repo)) repos)))))
+  [repo token-result]
+  (when token-result
+    (let [{:keys [token expires_at]} token-result]
+      (swap! state update-in [:me :repos]
+       (fn [repos]
+         (map (fn [r]
+                (if (= repo (:url r))
+                  (merge r {:token token :expires_at expires_at})
+                  repo)) repos))))))
 
 (defn set-github-installation-tokens!
   [tokens]
   (when (seq tokens)
-    (let [tokens (medley/map-keys name tokens)
+    (let [tokens  (medley/index-by :installation_id tokens)
           repos (get-repos)]
       (when (seq repos)
-        (let [repos (mapv (fn [{:keys [installation_id] :as r}]
-                            (if-let [token (get tokens installation_id)]
-                              (assoc r :token token)
-                              r)) repos)]
+        (let [set-token-f
+              (fn [{:keys [installation_id] :as repo}]
+                (let [{:keys [token expires_at] :as m} (get tokens installation_id)]
+                  (if (and token expires_at)
+                    (merge repo {:token token :expires_at expires_at})
+                    (do (js/console.log "Can't find token, expires_at key") m))))
+              repos (mapv set-token-f repos)]
           (swap! state assoc-in [:me :repos] repos))))))
 
 (defn get-github-token
-  ([]
-   (get-github-token (get-current-repo)))
-  ([repo]
-   (when repo
-     (let [repos (get-repos)]
-       (-> (filter #(= repo (:url %)) repos)
-           first
-           :token)))))
+  [repo]
+  (when repo
+    (let [repos (get-repos)]
+      (some #(when (= repo (:url %)) %) repos))))
 
 (defn toggle-sidebar-open?!
   []