Browse Source

feat(component/sidebar): split into smaller components

Runjuu 5 years ago
parent
commit
a4b89bff36
1 changed files with 240 additions and 207 deletions
  1. 240 207
      src/main/frontend/components/sidebar.cljs

+ 240 - 207
src/main/frontend/components/sidebar.cljs

@@ -72,6 +72,208 @@
                                   :margin 12}}])
        (right-sidebar/contents)])))
 
+(rum/defc sidebar-header-logo < rum/reactive
+  [{:keys [white?]}]
+  [:a.opacity-70.hover:opacity-100.absolute.hidden.md:block
+   {:href "/"
+    :on-click (fn []
+                (util/scroll-to-top)
+                (state/set-journals-length! 1))
+    :style {:position "absolute"
+            :top 12
+            :left 16
+            :z-index 111}}
+   (if-let [logo (and config/publishing?
+                      (get-in (state/get-config) [:project :logo]))]
+     [:img {:src logo
+            :width 24
+            :height 24}]
+     (svg/logo (not white?)))])
+
+(rum/defc sidebar-mobile-sidebar < rum/reactive
+  [{:keys [open? close-fn route-match]}]
+  [:div.md:hidden
+   [:div.fixed.inset-0.z-30.bg-gray-600.opacity-0.pointer-events-none.transition-opacity.ease-linear.duration-300
+    {:class (if @open?
+              "opacity-75 pointer-events-auto"
+              "opacity-0 pointer-events-none")
+     :on-click close-fn}]
+   [:div#left-bar.fixed.inset-y-0.left-0.flex.flex-col.z-40.max-w-xs.w-full.transform.ease-in-out.duration-300
+    {:class (if @open?
+              "translate-x-0"
+              "-translate-x-full")
+     :style {:background-color "#002b36"}}
+    (if @open?
+      [:div.absolute.top-0.right-0.-mr-14.p-1
+       [:button.flex.items-center.justify-center.h-12.w-12.rounded-full.focus:outline-none.focus:bg-gray-600
+        {:on-click close-fn}
+        [:svg.h-6.w-6.text-white
+         {:viewBox "0 0 24 24", :fill "none", :stroke "currentColor"}
+         [:path
+          {:d "M6 18L18 6M6 6l12 12"
+           :stroke-width "2"
+           :stroke-linejoin "round"
+           :stroke-linecap "round"}]]]])
+    [:div.flex-shrink-0.flex.items-center.px-4.h-16 {:style {:background-color "#002b36"}}
+     (repo/repos-dropdown false)]
+    [:div.flex-1.h-0.overflow-y-auto
+     (sidebar-nav route-match close-fn)]]])
+
+(rum/defc sidebar-header
+  [{:keys [open-fn current-repo white? logged? page? route-match me default-home new-block-mode]}]
+  (rum/with-context [[t] i18n/*tongue-context*]
+    [:div.relative.z-10.flex-shrink-0.flex.sm:bg-transparent.shadow.sm:shadow-none.h-16.sm:h-12#head
+     [:button#left-menu.px-4.focus:outline-none.md:hidden.menu
+      {:on-click (fn []
+                   (open-fn)
+                   (state/set-left-sidebar-open! true))}
+      [:svg.h-6.w-6
+       {:viewBox "0 0 24 24", :fill "none", :stroke "currentColor"}
+       [:path
+        {:d "M4 6h16M4 12h16M4 18h7"
+         :stroke-width "2"
+         :stroke-linejoin "round"
+         :stroke-linecap "round"}]]]
+     (sidebar-header-logo {:white? white?})
+     [:div.flex-1.px-4.flex.justify-between
+      (if current-repo
+        (search/search)
+        [:div.flex.md:ml-0])
+      [:div.ml-4.flex.items-center.md:ml-6
+       (new-block-mode)
+
+       (when (and (not logged?)
+                  (not config/publishing?))
+         [:a.text-sm.font-medium.login.opacity-70.hover:opacity-100
+          {:href "/login/github"
+           :on-click (fn []
+                       (storage/remove :git/current-repo))}
+          (t :login-github)])
+
+       (repo/sync-status)
+
+       [:div.repos.hidden.md:block
+        (repo/repos-dropdown true)]
+
+       (when-let [project (and current-repo (state/get-current-project))]
+         [:a.opacity-70.hover:opacity-100.ml-4
+          {:title (str (t :go-to) "/" project)
+           :href (str config/website "/" project)
+           :target "_blank"}
+          svg/external-link])
+
+       (when (and page? current-repo (not config/mobile?))
+         (let [page (get-in route-match [:path-params :name])
+               page (string/lower-case (util/url-decode page))
+               page (db/entity [:page/name page])]
+           (page/presentation current-repo page (:journal? page))))
+
+       (if config/publishing?
+         [:a.text-sm.font-medium.ml-3 {:href (rfe/href :graph)}
+          (t :graph)]
+
+         (ui/dropdown-with-links
+          (fn [{:keys [toggle-fn]}]
+            [:button.max-w-xs.flex.items-center.text-sm.rounded-full.focus:outline-none.focus:shadow-outline.h-7.w-7.ml-2
+             {:on-click toggle-fn}
+             (if-let [avatar (:avatar me)]
+               [:img.h-7.w-7.rounded-full
+                {:src avatar}]
+               [:div.h-7.w-7.rounded-full.bg-base-2.opacity-70.hover:opacity-100. {:style {:padding 1.5}}
+                [:a svg/user]])])
+          (let [logged? (:name me)]
+            (->>
+             [(when current-repo
+                {:title (t :graph)
+                 :options {:href (rfe/href :graph)}
+                 :icon svg/graph-sm})
+              (when (and logged? current-repo)
+                {:title (t :publishing)
+                 :options {:on-click (fn []
+                                       (export/export-repo-as-html! current-repo))}
+                 :icon nil})
+              (when logged?
+                {:title (t :all-repos)
+                 :options {:href (rfe/href :repos)}
+                 :icon svg/repos-sm})
+              (when current-repo
+                {:title (t :all-pages)
+                 :options {:href (rfe/href :all-pages)}
+                 :icon svg/pages-sm})
+              (when current-repo
+                {:title (t :all-files)
+                 :options {:href (rfe/href :all-files)}
+                 :icon svg/folder-sm})
+              (when (and default-home current-repo)
+                {:title (t :all-journals)
+                 :options {:href (rfe/href :all-journals)}
+                 :icon svg/calendar-sm})
+              {:title (t :excalidraw-title)
+               :options {:href (rfe/href :draw)}
+               :icon (svg/excalidraw-logo)}
+              {:title (t :settings)
+               :options {:href (rfe/href :settings)}
+               :icon svg/settings-sm}
+              (when current-repo
+                {:title (t :import)
+                 :options {:href (rfe/href :import)}
+                 :icon svg/import-sm})
+              {:title [:div.flex-row.flex.justify-between.items-center
+                       [:span (t :join-community)]]
+               :options {:href "https://discord.gg/KpN4eHY"
+                         :title (t :discord-title)
+                         :target "_blank"}
+               :icon svg/discord}
+              (when logged?
+                {:title (t :sign-out)
+                 :options {:on-click user-handler/sign-out!}
+                 :icon svg/logout-sm})]
+             (remove nil?)))
+          {}))
+
+       [:a#download-as-html.hidden]
+
+       [:a.opacity-70.hover:opacity-100.ml-3.hidden.md:block
+        {:on-click (fn []
+                     (state/toggle-sidebar-open?!))}
+        (svg/menu)]]]]))
+
+(rum/defc sidebar-main
+  [{:keys [route-match global-graph-pages? logged? home? route-name indexeddb-support? white? db-restoring? main-content]}]
+  (rum/with-context [[t] i18n/*tongue-context*]
+    [:div#main-content.flex.wrapper {:style {:height "100vh"
+                                             :overflow-y "scroll"}}
+     (when-not config/mobile?
+       [:div#sidebar-nav-wrapper.flex-col.pt-4
+        {:style {:flex (if (state/get-left-sidebar-open)
+                         "0 1 20%"
+                         "0 0 0px")
+                 :border-right (str "1px solid "
+                                    (if white? "#f0f8ff" "#073642"))}}
+        (when (state/sub :ui/left-sidebar-open?)
+          (sidebar-nav route-match nil))])
+     [:div#main-content-container.cp__sidebar-main-content-container
+      [:div.cp__sidebar-main-content
+       {:data-is-global-graph-pages global-graph-pages?
+        :data-is-full-width (or global-graph-pages?
+                                (and (not logged?)
+                                     home?)
+                                (contains? #{:all-files :all-pages} route-name))}
+       (cond
+         (not indexeddb-support?)
+         nil
+
+         db-restoring?
+         [:div.mt-20
+          [:div.ls-center
+           (ui/loading (t :loading))]]
+
+         :else
+         [:div {:style {:margin-bottom (if global-graph-pages? 0 120)}}
+          main-content])]]
+     (when-not config/mobile?
+       (right-sidebar/sidebar))]))
+
 (defn get-default-home-if-valid
   []
   (when-let [default-home (state/get-default-home)]
@@ -246,7 +448,6 @@
         close-fn (fn []
                    (close-fn)
                    (state/set-left-sidebar-open! false))
-        prefered-language (keyword (state/sub :preferred-language))
         me (state/sub :me)
         current-repo (state/sub :git/current-repo)
         theme (state/sub :ui/theme)
@@ -261,209 +462,41 @@
         default-home (get-default-home-if-valid)]
     (rum/with-context [[t] i18n/*tongue-context*]
       [:div {:class (if white? "white-theme" "dark-theme")
-             :on-click (fn []
-                         (editor-handler/unhighlight-block!))}
-       [:div.h-screen.flex.overflow-hidden
-        [:div.md:hidden
-         [:div.fixed.inset-0.z-30.bg-gray-600.opacity-0.pointer-events-none.transition-opacity.ease-linear.duration-300
-          {:class (if @open?
-                    "opacity-75 pointer-events-auto"
-                    "opacity-0 pointer-events-none")
-           :on-click close-fn}]
-         [:div#left-bar.fixed.inset-y-0.left-0.flex.flex-col.z-40.max-w-xs.w-full.transform.ease-in-out.duration-300
-          {:class (if @open?
-                    "translate-x-0"
-                    "-translate-x-full")
-           :style {:background-color "#002b36"}}
-          (if @open?
-            [:div.absolute.top-0.right-0.-mr-14.p-1
-             [:button.flex.items-center.justify-center.h-12.w-12.rounded-full.focus:outline-none.focus:bg-gray-600
-              {:on-click close-fn}
-              [:svg.h-6.w-6.text-white
-               {:viewBox "0 0 24 24", :fill "none", :stroke "currentColor"}
-               [:path
-                {:d "M6 18L18 6M6 6l12 12"
-                 :stroke-width "2"
-                 :stroke-linejoin "round"
-                 :stroke-linecap "round"}]]]])
-          [:div.flex-shrink-0.flex.items-center.px-4.h-16 {:style {:background-color "#002b36"}}
-           (repo/repos-dropdown false)]
-          [:div.flex-1.h-0.overflow-y-auto
-           (sidebar-nav route-match close-fn)]]]
-        [:div.flex.flex-col.w-0.flex-1.overflow-hidden
-         [:div.relative.z-10.flex-shrink-0.flex.sm:bg-transparent.shadow.sm:shadow-none.h-16.sm:h-12#head
-          [:button#left-menu.px-4.focus:outline-none.md:hidden.menu
-           {:on-click (fn []
-                        (open-fn)
-                        (state/set-left-sidebar-open! true))}
-           [:svg.h-6.w-6
-            {:viewBox "0 0 24 24", :fill "none", :stroke "currentColor"}
-            [:path
-             {:d "M4 6h16M4 12h16M4 18h7"
-              :stroke-width "2"
-              :stroke-linejoin "round"
-              :stroke-linecap "round"}]]]
-          [:div.flex-1.px-4.flex.justify-between
-           (if current-repo
-             (search/search)
-             [:div.flex.md:ml-0])
-           [:div.ml-4.flex.items-center.md:ml-6
-            (new-block-mode)
-
-            (when (and (not logged?)
-                       (not config/publishing?))
-              [:a.text-sm.font-medium.login.opacity-70.hover:opacity-100
-               {:href "/login/github"
-                :on-click (fn []
-                            (storage/remove :git/current-repo))}
-               (t :login-github)])
-
-            (repo/sync-status)
-
-            [:div.repos.hidden.md:block
-             (repo/repos-dropdown true)]
-
-            (when-let [project (and current-repo (state/get-current-project))]
-              [:a.opacity-70.hover:opacity-100.ml-4
-               {:title (str (t :go-to) "/" project)
-                :href (str config/website "/" project)
-                :target "_blank"}
-               svg/external-link])
-
-            (when (and page? current-repo (not config/mobile?))
-              (let [page (get-in route-match [:path-params :name])
-                    page (string/lower-case (util/url-decode page))
-                    page (db/entity [:page/name page])]
-                (page/presentation current-repo page (:journal? page))))
-
-            (if config/publishing?
-              [:a.text-sm.font-medium.ml-3 {:href (rfe/href :graph)}
-               (t :graph)]
-
-              (ui/dropdown-with-links
-               (fn [{:keys [toggle-fn]}]
-                 [:button.max-w-xs.flex.items-center.text-sm.rounded-full.focus:outline-none.focus:shadow-outline.h-7.w-7.ml-2
-                  {:on-click toggle-fn}
-                  (if-let [avatar (:avatar me)]
-                    [:img.h-7.w-7.rounded-full
-                     {:src avatar}]
-                    [:div.h-7.w-7.rounded-full.bg-base-2.opacity-70.hover:opacity-100. {:style {:padding 1.5}}
-                     [:a svg/user]])])
-               (let [logged? (:name me)]
-                 (->>
-                  [(when current-repo
-                     {:title (t :graph)
-                      :options {:href (rfe/href :graph)}
-                      :icon svg/graph-sm})
-                   (when (and logged? current-repo)
-                     {:title (t :publishing)
-                      :options {:on-click (fn []
-                                            (export/export-repo-as-html! current-repo))}
-                      :icon nil})
-                   (when logged?
-                     {:title (t :all-repos)
-                      :options {:href (rfe/href :repos)}
-                      :icon svg/repos-sm})
-                   (when current-repo
-                     {:title (t :all-pages)
-                      :options {:href (rfe/href :all-pages)}
-                      :icon svg/pages-sm})
-                   (when current-repo
-                     {:title (t :all-files)
-                      :options {:href (rfe/href :all-files)}
-                      :icon svg/folder-sm})
-                   (when (and default-home current-repo)
-                     {:title (t :all-journals)
-                      :options {:href (rfe/href :all-journals)}
-                      :icon svg/calendar-sm})
-                   {:title (t :excalidraw-title)
-                    :options {:href (rfe/href :draw)}
-                    :icon (svg/excalidraw-logo)}
-                   {:title (t :settings)
-                    :options {:href (rfe/href :settings)}
-                    :icon svg/settings-sm}
-                   (when current-repo
-                     {:title (t :import)
-                      :options {:href (rfe/href :import)}
-                      :icon svg/import-sm})
-                   {:title [:div.flex-row.flex.justify-between.items-center
-                            [:span (t :join-community)]]
-                    :options {:href "https://discord.gg/KpN4eHY"
-                              :title (t :discord-title)
-                              :target "_blank"}
-                    :icon svg/discord}
-                   (when logged?
-                     {:title (t :sign-out)
-                      :options {:on-click user-handler/sign-out!}
-                      :icon svg/logout-sm})]
-                  (remove nil?)))
-               {}))
-
-            [:a#download-as-html.hidden]
-
-            [:a.opacity-70.hover:opacity-100.ml-3.hidden.md:block
-             {:on-click (fn []
-                          (state/toggle-sidebar-open?!))}
-             (svg/menu)]]]]
-
-         [:div#main-content.flex.wrapper {:style {:height "100vh"
-                                                  :overflow-y "scroll"}}
-          (when-not config/mobile?
-            [:div#sidebar-nav-wrapper.flex-col.pt-4
-             {:style {:flex (if (state/get-left-sidebar-open)
-                              "0 1 20%"
-                              "0 0 0px")
-                      :border-right (str "1px solid "
-                                         (if white? "#f0f8ff" "#073642"))}}
-             (when (state/sub :ui/left-sidebar-open?)
-               (sidebar-nav route-match nil))])
-          [:div#main-content-container.cp__sidebar-main-content-container
-           [:div.cp__sidebar-main-content
-            {:data-is-global-graph-pages global-graph-pages?
-             :data-is-full-width (or global-graph-pages?
-                                  (and (not logged?)
-                                       home?)
-                                  (contains? #{:all-files :all-pages} route-name))}
-            (cond
-              (not indexeddb-support?)
-              nil
-
-              db-restoring?
-              [:div.mt-20
-               [:div.ls-center
-                (ui/loading (t :loading))]]
-
-              :else
-              [:div {:style {:margin-bottom (if global-graph-pages? 0 120)}}
-               main-content])]]
-          (when-not config/mobile?
-            (right-sidebar/sidebar))]
-         [:a.opacity-70.hover:opacity-100.absolute.hidden.md:block
-          {:href "/"
-           :on-click (fn []
-                       (util/scroll-to-top)
-                       (state/set-journals-length! 1))
-           :style {:position "absolute"
-                   :top 12
-                   :left 16
-                   :z-index 111}}
-          (if-let [logo (and config/publishing?
-                             (get-in (state/get-config) [:project :logo]))]
-            [:img {:src logo
-                   :width 24
-                   :height 24}]
-            (svg/logo (not white?)))]
-         (ui/notification)
-         (ui/modal)
-         (custom-context-menu)
-         [:a#download.hidden]
-         (when (and (not config/mobile?)
-                    (not config/publishing?))
-           [(help-button)
-            ;; [:div.font-bold.absolute.bottom-4.bg-base-2.rounded-full.h-8.w-8.flex.items-center.justify-center.font-bold.cursor.opacity-70.hover:opacity-100
-            ;;  {:style {:left 24}
-            ;;   :title "Click to show/hide sidebar"
-            ;;   :on-click (fn []
-            ;;               (state/set-left-sidebar-open! (not (state/get-left-sidebar-open))))}
-            ;;  (if (state/sub :ui/left-sidebar-open?) "<" ">")]
-])]]])))
+             :on-click editor-handler/unhighlight-block!}
+       (sidebar-mobile-sidebar {:open? open?
+                                :close-fn close-fn
+                                :route-match route-match})
+
+       (sidebar-header {:open-fn open-fn
+                        :white? white?
+                        :current-repo current-repo
+                        :logged? logged?
+                        :page? page?
+                        :route-match route-match
+                        :me me
+                        :default-home default-home
+                        :new-block-mode new-block-mode})
+
+       (sidebar-main {:route-match route-match
+                      :global-graph-pages? global-graph-pages?
+                      :logged? logged?
+                      :home? home?
+                      :route-name route-name
+                      :indexeddb-support? indexeddb-support?
+                      :white? white?
+                      :db-restoring? db-restoring?
+                      :main-content main-content})
+       (ui/notification)
+       (ui/modal)
+       (custom-context-menu)
+       [:a#download.hidden]
+       (when (and (not config/mobile?)
+                 (not config/publishing?))
+         [(help-button)
+         ;; [:div.font-bold.absolute.bottom-4.bg-base-2.rounded-full.h-8.w-8.flex.items-center.justify-center.font-bold.cursor.opacity-70.hover:opacity-100
+         ;;  {:style {:left 24}
+         ;;   :title "Click to show/hide sidebar"
+         ;;   :on-click (fn []
+         ;;               (state/set-left-sidebar-open! (not (state/get-left-sidebar-open))))}
+         ;;  (if (state/sub :ui/left-sidebar-open?) "<" ">")]
+          ])])))