UNPKG

hele-router

Version:
1 lines 2.38 kB
import{Component as t,Context as e,createElement as s,Fragment as o}from"hele";const n=t=>t[t.length-1],r="router";class Router extends t{constructor(t,e){super(t,e),this.name=t.name}render(){return s(e,{value:{[this.name]:this}},this.props.children)}}Router.defaultProps={name:"router"};class HistoryRouter extends Router{constructor(t,e){super(t,e),this.onpopstate=(t=>{this.update(location.pathname)}),this.state=location.pathname}onDidMount(){window.addEventListener("popstate",this.onpopstate)}onWillUnmount(){window.removeEventListener("popstate",this.onpopstate)}push(t){this.props.noHash||-1!==t.lastIndexOf("#")||(t+=location.hash),history.pushState(null,"",t),this.update(location.pathname)}pop(){history.back()}}const h=Array(location.hash);class HashRouter extends Router{constructor(t,e){super(t,e),this.onhashchange=(()=>{this.update(location.hash.slice(1))}),this.state=n(h).slice(1)}onDidMount(){window.addEventListener("hashchange",this.onhashchange)}onWillUnmount(){window.removeEventListener("hashchange",this.onhashchange)}push(t){const e="#"+t;n(h)!==e&&(location.hash=e,h.push(e))}pop(){if(h.length>1){h.pop();const t=n(h);location.hash=t}}}class Switch extends Router{constructor(t,e){super(t,e),this._history=[],this._history.push(this.state=t.path)}push(t){const{_history:e}=this;n(e)!==t&&(e.push(t),this.update(t))}pop(){const{_history:t}=this;if(t.length>1){t.pop();const e=n(t);this.update(e)}}}function testRoute(t,e,s=!1){return s?t===e:t.indexOf(e)>=0}Switch.defaultProps={...Router.defaultProps,path:"/"};class Route extends t{constructor(t,e){super(t,e),this.state=testRoute(e[t.router].state,t.path,t.exact)}render(){const{props:t,state:e}=this;return t.render?t.render(e):e&&(t.component?s(t.component):s(o,null,this.props.children))}}Route.defaultProps={router:"router"};class Link extends t{constructor(t,e){super(t,e),this.onclick=this.onclick.bind(this)}render(){const{router:t,back:e,onclick:o,...n}=this.props;return s("a",Object.assign({},n,{onclick:this.onclick}),this.props.children)}onclick(t){const{props:e}=this;let s;if(e.onclick&&(s=e.onclick(t)),!t.defaultPrevented){t.preventDefault();const s=this.context[e.router];e.back?s.pop():e.href&&s.push(e.href)}return s}}Link.defaultProps={href:"javascript:;",back:!1,router:"router"};export{n as _last,r as defaultRouterName,Router,HistoryRouter,HashRouter,Switch,testRoute,Route,Link};