Skip to content

Instantly share code, notes, and snippets.

@carrete

carrete/core.clj Secret

Created August 13, 2021 14:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save carrete/57979732b1c57970596f72c888fbf04d to your computer and use it in GitHub Desktop.
Save carrete/57979732b1c57970596f72c888fbf04d to your computer and use it in GitHub Desktop.
server-side render
(defn- compute-context
[request target]
(let [session-state (merge (parsers/sessions-endpoint (get-query sessions/Session)
{:target [:component/id :session]
:remote :sessions
:request request})
{:session/next-uri (:uri request)})
session-ident (get-ident sessions/Session session-state)
server-side-state (-> (ssr/build-initial-state (get-initial-state ui/Root) ui/Root)
(assoc-in (conj [::dr/id ::ui/SiteRouter] ::dr/current-route)
(get-initial-state target))
(set-query*
ui/SiteRouter {:query [::dr/id {::dr/current-route (get-query target)}]})
(assoc :sessions/session session-ident)
(assoc-in session-ident session-state))
server-side-app (application/fulcro-app {:initial-db server-side-state})
server-side-props (denorm/db->tree (get-query ui/Root server-side-state) server-side-state server-side-state)
content (binding [*app* server-side-app]
(dom/render-to-str (ui/ui-root server-side-props)))
script-tag (ssr/initial-state->script-tag server-side-state)]
{:content content
:script-tag script-tag}))
(defn- wrap-server-side-render
[handler]
(let [js-bundle-name (js-bundle-name-for :main)]
(fn [{:keys [uri] :as request}]
(let [{:keys [target]} (dr/route-target ui/SiteRouter (urls/url->route uri))]
(if target
(response/content-type
(response/ok
(let [context (merge (compute-context request target) {:js-bundle-name js-bundle-name})]
(resources/render-resource "templates/index.html" context)))
"text/html; charset=utf-8")
(handler request))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment