Browse Source

feat(deeplink): support deeplink across graphs

llcc 3 years ago
parent
commit
851cc779db
1 changed files with 37 additions and 25 deletions
  1. 37 25
      src/main/frontend/mobile/deeplink.cljs

+ 37 - 25
src/main/frontend/mobile/deeplink.cljs

@@ -1,26 +1,32 @@
 (ns frontend.mobile.deeplink 
   (:require
    [clojure.string :as string]
+   [frontend.config :as config]
    [frontend.db.model :as db-model]
    [frontend.handler.editor :as editor-handler]
    [frontend.handler.notification :as notification]
    [frontend.handler.route :as route-handler]
    [frontend.handler.user :as user-handler]
-   [frontend.mobile.intent :as intent]
    [frontend.state :as state]
    [frontend.text :as text]))
 
+(def *link-to-another-graph (atom false))
+
 (defn deeplink [url]
   (let [parsed-url (js/URL. url)
         hostname (.-hostname parsed-url)
         pathname (.-pathname parsed-url)
         search-params (.-searchParams parsed-url)
         current-repo-url (state/get-current-repo)
-        current-graph-name (-> (text/get-graph-name-from-path current-repo-url)
+        get-graph-name-fn #(-> (text/get-graph-name-from-path %)
                                (string/split "/")
                                last
-                               string/lower-case)]
-
+                               string/lower-case)
+        current-graph-name (get-graph-name-fn current-repo-url)
+        repos (->> (state/sub [:me :repos])
+                   (remove #(= (:url %) config/local-repo))
+                   (map :url))
+        repo-names (map #(get-graph-name-fn %) repos)]
     (cond
       (= hostname "auth-callback")
       (when-let [code (.get search-params  "code")]
@@ -34,26 +40,32 @@
                                         ["page" "block-id"])]
 
         (when-not (string/blank? graph-name)
-          (if (= graph-name current-graph-name)
-            (cond
-              page-name
-              (let [db-page-name (db-model/get-redirect-page-name page-name)]
-                (editor-handler/insert-first-page-block-if-not-exists! db-page-name))
-
-              block-uuid
-              (if (db-model/get-block-by-uuid block-uuid)
-                (route-handler/redirect-to-page! block-uuid)
-                (notification/show! (str "Open link failed. Block-id `" block-uuid "` doesn't exist in the graph.") :error false))
-
-              :else
-              (notification/show! (str "Opening File link is not supported on mobile.") :error false))
-            (notification/show! (str "The SCHEME across graphs has not been supported yet.") :error false))))
-
-      (= hostname "shared")
-      (let [result (into {} (map (fn [key]
-                                   [(keyword key) (.get search-params key)])
-                                 ["title" "url" "type"]))]
-        (intent/handle-result result))
+          (when-not (= graph-name current-graph-name)
+            (let [graph-idx (.indexOf repo-names graph-name)
+                  graph-url (when (not= graph-idx -1)
+                              (nth repos graph-idx))]
+              (if graph-url
+                (do (state/pub-event! [:graph/switch graph-url])
+                    (reset! *link-to-another-graph true))
+                (notification/show! (str "Open graph failed. Graph `" graph-name "` doesn't exist.") :error false))))
+
+          (js/setTimeout
+           (fn []
+             (cond
+               page-name
+               (let [db-page-name (db-model/get-redirect-page-name page-name)]
+                 (editor-handler/insert-first-page-block-if-not-exists! db-page-name))
+
+               block-uuid
+               (if (db-model/get-block-by-uuid block-uuid)
+                 (route-handler/redirect-to-page! block-uuid)
+                 (notification/show! (str "Open link failed. Block-id `" block-uuid "` doesn't exist in the graph.") :error false))
+
+               :else
+               nil))
+           (if @*link-to-another-graph
+             1000
+             0))))
 
       :else
-      nil)))
+      (notification/show! (str "The url has not been supported yet.") :error false))))