mirror of
https://github.com/penpot/penpot.git
synced 2025-05-02 16:25:53 +02:00
113 lines
3.6 KiB
Clojure
113 lines
3.6 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC
|
|
|
|
(ns app.main.ui.routes
|
|
(:require
|
|
[app.common.spec :as us]
|
|
[app.common.uuid :as uuid]
|
|
[app.main.data.users :as du]
|
|
[app.main.repo :as rp]
|
|
[app.main.store :as st]
|
|
[app.util.router :as rt]
|
|
[beicon.core :as rx]
|
|
[cljs.spec.alpha :as s]
|
|
[potok.core :as ptk]))
|
|
|
|
(s/def ::page-id ::us/uuid)
|
|
(s/def ::file-id ::us/uuid)
|
|
(s/def ::section ::us/keyword)
|
|
(s/def ::index ::us/integer)
|
|
(s/def ::token (s/nilable ::us/not-empty-string))
|
|
(s/def ::share-id ::us/uuid)
|
|
|
|
(s/def ::viewer-path-params
|
|
(s/keys :req-un [::file-id]))
|
|
|
|
(s/def ::viewer-query-params
|
|
(s/keys :opt-un [::index ::share-id ::section ::page-id]))
|
|
|
|
(s/def ::any any?)
|
|
|
|
(def routes
|
|
[["/auth"
|
|
["/login" :auth-login]
|
|
["/register" :auth-register]
|
|
["/register/validate" :auth-register-validate]
|
|
["/register/success" :auth-register-success]
|
|
["/recovery/request" :auth-recovery-request]
|
|
["/recovery" :auth-recovery]
|
|
["/verify-token" :auth-verify-token]]
|
|
|
|
["/settings"
|
|
["/profile" :settings-profile]
|
|
["/password" :settings-password]
|
|
["/feedback" :settings-feedback]
|
|
["/options" :settings-options]
|
|
["/access-tokens" :settings-access-tokens]]
|
|
|
|
["/view/:file-id"
|
|
{:name :viewer
|
|
:conform
|
|
{:path-params ::viewer-path-params
|
|
:query-params ::viewer-query-params}}]
|
|
|
|
(when *assert*
|
|
["/debug/icons-preview" :debug-icons-preview])
|
|
|
|
["/debug/components-preview" :debug-components-preview]
|
|
|
|
;; Used for export
|
|
["/render-sprite/:file-id" :render-sprite]
|
|
|
|
["/dashboard/team/:team-id"
|
|
["/members" :dashboard-team-members]
|
|
["/invitations" :dashboard-team-invitations]
|
|
["/webhooks" :dashboard-team-webhooks]
|
|
["/settings" :dashboard-team-settings]
|
|
["/projects" :dashboard-projects]
|
|
["/search" :dashboard-search]
|
|
["/fonts" :dashboard-fonts]
|
|
["/fonts/providers" :dashboard-font-providers]
|
|
["/libraries" :dashboard-libraries]
|
|
["/projects/:project-id" :dashboard-files]]
|
|
|
|
["/workspace/:project-id/:file-id" :workspace]])
|
|
|
|
(defn- match-path
|
|
[router path]
|
|
(when-let [match (rt/match router path)]
|
|
(if-let [conform (get-in match [:data :conform])]
|
|
(let [spath (get conform :path-params ::any)
|
|
squery (get conform :query-params ::any)]
|
|
(try
|
|
(-> (dissoc match :params)
|
|
(assoc :path-params (us/conform spath (get match :path-params))
|
|
:query-params (us/conform squery (get match :query-params))))
|
|
(catch :default _
|
|
nil)))
|
|
match)))
|
|
|
|
(defn on-navigate
|
|
[router path]
|
|
(if-let [match (match-path router path)]
|
|
(st/emit! (rt/navigated match))
|
|
|
|
;; We just recheck with an additional profile request; this avoids
|
|
;; some race conditions that causes unexpected redirects on
|
|
;; invitations workflows (and probably other cases).
|
|
(->> (rp/cmd! :get-profile)
|
|
(rx/subs (fn [{:keys [id] :as profile}]
|
|
(if (= id uuid/zero)
|
|
(st/emit! (rt/nav :auth-login))
|
|
(st/emit! (rt/nav :dashboard-projects {:team-id (du/get-current-team-id profile)}))))))))
|
|
|
|
(defn init-routes
|
|
[]
|
|
(ptk/reify ::init-routes
|
|
ptk/WatchEvent
|
|
(watch [_ _ _]
|
|
(rx/of (rt/initialize-router routes)
|
|
(rt/initialize-history on-navigate)))))
|