Skip to content

Latest commit

History

57 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pushy

Build Status

A Clojurescript library for quick and easy HTML5 pushState.

Install

Clojars Project

Usage

Setup

You can construct a new instance by calling the pushy function.

pushy takes in two arguments:

  • dispatch fn: gets called when there is a match
  • match fn: checks if the path matches any routes defined.

Optionally, you can specify an :identity-fn which parses and returns the route based on the result of the match fn.

Event listeners

You can start the event listeners with the start! method.

This adds an event listener to all click events, which dispatches on all matched routes. Bypasses on Alt, Shift, Meta, Ctrl keys and middle clicks.

The stop! method will tear down all event listeners of the pushy instance.

Routing libraries

pushy should work with any routing library:

Secretary

(nsfoo.core
(:require [secretary.core :as secretary :include-macrostrue:refer-macros [defroute]]
[pushy.core :as pushy]))
(secretary/set-config!:prefix"/")
(defrouteindex"/foo" []
(.log js/console "Hi"))
(defhistory (pushy/pushy secretary/dispatch!
(fn [x] (when (secretary/locate-route x) x))))
;; Start event listeners
(pushy/start! history)

Bidi

(nsfoo.core
(:require [bidi.bidi :as bidi]
[pushy.core :as pushy]))
(defstate (atom {}))
(defapp-routes
["/" {"foo":foo}])
(defnset-page! [match]
(swap! state assoc :page match))
(defhistory
(pushy/pushy set-page! (partial bidi/match-route app-routes)))
(pushy/start! history)

Silk

(nsfoo.core
(:require [domkm.silk :as silk]
[pushy.core :as pushy]))
(defstate (atom {}))
(defapp-routes
(silk/routes [[:foo [["/foo"]]]]))
(defnset-page! [match]
(swap! state assoc :page match))
(defhistory
(pushy/pushy set-page! (partial silk/arrive app-routes)))
(pushy/start! history)

Router

(nsfoo.core
(:require [pushy.core :as pushy]
[darkleaf.router :as r]))
(r/defcontrollerroot-controller
(show [_req]
:root))
(r/defcontrollerpages-controller
(index [_req]
:pages-index))
(defrouting
(r/group
(r/resource:root root-controller, :segmentfalse)
(r/resources:pages:page pages-controller)))
(defhandler (r/make-handler routing))
(defhistory (pushy/pushy (fn [response] (prn response))
(fn [uri] (handler {:uri uri, :request-method:get}))))
(pushy/start! history)
#_(pushy/set-token! history "/")
#_(pushy/set-token! history "/pages")

Sibiro

(nsfoo.core
(:require [sibiro.core :as sibiro]
[pushy.core :as pushy]))
(defstate (atom {}))
(defnset-page! [match]
(assoc state :page match))
(defroutes
{[:get"/home":home]})
(defnmatch-uri [uri]
(:route-handler (sibiro/match-uri (sibiro/compile-routes routes) uri :get)))
(defhistory (pushy/pushy set-page! match-uri))
(pushy/start! history)

URL handling

By default pushy will dispatch on all relative URLs and absolute URLs that match the window's origin. This means that all external links will be bypassed.

It is possible to specify which URLs are processable to pushy by specifying a custom predicate function :processable-url? in the constructor. This function is passed a single argument which is an instance of goog.URI.

goog.history.HTML5History methods

You can set the history state manually by calling the set-token! method. This will call the dispatch fn on a successfully matched path.

Example:

(set-token! history "/foo")
(get-token history)
;; => /foo

Likewise, you can call replace-token! which will also call the dispatch fn and replace the current history state without affecting the rest of the history stack.

License

Copyright © 2017

Distributed under the Eclipse Public License either version 1.0

About

Clojurescript library for quick and easy HTML5 pushState

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages