shinkansen-gears 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +4 -0
- package/README.md +43 -0
- package/babel.config.js +71 -0
- package/gulp.sh +42 -0
- package/index.js +7 -0
- package/lib/gears/forward/index.js +1 -0
- package/lib/gears/index.js +1 -0
- package/lib/gears/reverse/index.js +1 -0
- package/lib/index.js +1 -0
- package/package.json +104 -0
- package/src/gears/forward/index.js +27 -0
- package/src/gears/index.js +120 -0
- package/src/gears/reverse/index.js +27 -0
- package/src/index.js +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
## `shinkansen-gears`
|
|
2
|
+
|
|
3
|
+
# Shinkansen Gears
|
|
4
|
+
|
|
5
|
+
*Gears* implements *React* + *React Router* navigation components for *Zashiki Karakuri*.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```javascript
|
|
10
|
+
import {
|
|
11
|
+
Gears
|
|
12
|
+
} from 'shinkansen-gears'
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
*Gears* exposes the props `reverse`, `forward`, and `pattern`.
|
|
16
|
+
|
|
17
|
+
These props are _optional_. If no props are given then *Gears* will render `null`.
|
|
18
|
+
|
|
19
|
+
*Gears* depends on a peer of *[Shinkansen Rails](https://github.com/modernpoacher/shinkansen-rails)* to transform the props `reverse` and `forward` into `<Link />` components for *React Router*. (The prop `pattern` describes how `reverse` and `forward` should be transformed.)
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
import React from 'react'
|
|
23
|
+
import PropTypes from 'prop-types'
|
|
24
|
+
|
|
25
|
+
export class Gears extends React.Component { }
|
|
26
|
+
|
|
27
|
+
Gears.propTypes = {
|
|
28
|
+
reverse: PropTypes.shape({
|
|
29
|
+
alpha: PropTypes.string,
|
|
30
|
+
omega: PropTypes.string
|
|
31
|
+
}),
|
|
32
|
+
forward: PropTypes.shape({
|
|
33
|
+
alpha: PropTypes.string,
|
|
34
|
+
omega: PropTypes.string
|
|
35
|
+
}),
|
|
36
|
+
pattern: PropTypes.string
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## See also
|
|
41
|
+
|
|
42
|
+
- [Shinkansen Rails](https://github.com/modernpoacher/shinkansen-rails)
|
|
43
|
+
- [Shinkansen Pantograph](https://github.com/modernpoacher/shinkansen-pantograph)
|
package/babel.config.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const debug = require('debug')
|
|
2
|
+
|
|
3
|
+
const log = debug('shinkansen-gears')
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
env: {
|
|
7
|
+
NODE_ENV = 'development'
|
|
8
|
+
}
|
|
9
|
+
} = process
|
|
10
|
+
|
|
11
|
+
log('`shinkansen` is awake')
|
|
12
|
+
|
|
13
|
+
function env () {
|
|
14
|
+
log({ NODE_ENV })
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
NODE_ENV === 'production'
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const presets = [
|
|
22
|
+
[
|
|
23
|
+
'@babel/env', {
|
|
24
|
+
targets: {
|
|
25
|
+
node: '12.19.0',
|
|
26
|
+
browsers: [
|
|
27
|
+
'last 4 versions',
|
|
28
|
+
'safari >= 9',
|
|
29
|
+
'ios >= 8',
|
|
30
|
+
'ie >= 9',
|
|
31
|
+
'> 2%'
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
useBuiltIns: 'usage',
|
|
35
|
+
corejs: 3
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
'@babel/react'
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
const plugins = [
|
|
42
|
+
'@babel/proposal-export-default-from',
|
|
43
|
+
[
|
|
44
|
+
'@babel/proposal-class-properties',
|
|
45
|
+
{
|
|
46
|
+
loose: false
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
[
|
|
50
|
+
'module-resolver', {
|
|
51
|
+
root: ['./src'],
|
|
52
|
+
cwd: 'babelrc',
|
|
53
|
+
alias: {
|
|
54
|
+
'shinkansen-gears': './src',
|
|
55
|
+
build: './build',
|
|
56
|
+
stories: './stories'
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
module.exports = (api) => {
|
|
63
|
+
if (api) api.cache.using(env)
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
compact: true,
|
|
67
|
+
comments: false,
|
|
68
|
+
presets,
|
|
69
|
+
plugins
|
|
70
|
+
}
|
|
71
|
+
}
|
package/gulp.sh
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
NVM=~/.nvm
|
|
5
|
+
|
|
6
|
+
if [[ -f "$NVM/nvm.sh" ]];
|
|
7
|
+
then
|
|
8
|
+
unset npm_package_scripts_nvm
|
|
9
|
+
unset npm_config_prefix
|
|
10
|
+
unset npm_lifecycle_script
|
|
11
|
+
|
|
12
|
+
source $NVM/nvm.sh
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
VERSION=$(nvm --version)
|
|
16
|
+
|
|
17
|
+
if [[ -z "$VERSION" ]];
|
|
18
|
+
then
|
|
19
|
+
echo NVM not installed
|
|
20
|
+
else
|
|
21
|
+
echo NVM version $VERSION installed
|
|
22
|
+
|
|
23
|
+
set -e
|
|
24
|
+
|
|
25
|
+
nvm use &> /dev/null
|
|
26
|
+
|
|
27
|
+
if [[ $? != 0 ]];
|
|
28
|
+
then
|
|
29
|
+
echo NVM not configured
|
|
30
|
+
else
|
|
31
|
+
echo NVM configured
|
|
32
|
+
fi
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
if [[ $# -gt 0 ]];
|
|
36
|
+
then
|
|
37
|
+
npx gulp "$@"
|
|
38
|
+
else
|
|
39
|
+
npx gulp
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
exit 0
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;require("core-js/modules/es.array.concat.js");var _react=_interopRequireDefault(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactRouterDom=require("react-router-dom");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function Forward(_ref){var pathname=_ref.pathname;var key=pathname.concat('-forward');var to={pathname:pathname};return _react["default"].createElement("li",{key:key,className:"shinkansen-gears-forward"},_react["default"].createElement(_reactRouterDom.Link,{to:to},"Forward"));}Forward.propTypes={pathname:_propTypes["default"].string.isRequired};var _default=Forward;exports["default"]=_default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj;};}else{_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};}return _typeof(obj);}require("core-js/modules/es.object.set-prototype-of.js");require("core-js/modules/es.object.get-prototype-of.js");require("core-js/modules/es.reflect.construct.js");require("core-js/modules/es.object.create.js");require("core-js/modules/es.array.iterator.js");require("core-js/modules/es.object.to-string.js");require("core-js/modules/es.string.iterator.js");require("core-js/modules/es.weak-map.js");require("core-js/modules/web.dom-collections.iterator.js");require("core-js/modules/es.object.get-own-property-descriptor.js");require("core-js/modules/es.symbol.js");require("core-js/modules/es.symbol.description.js");require("core-js/modules/es.symbol.iterator.js");Object.defineProperty(exports,"__esModule",{value:true});exports.renderReverse=renderReverse;exports.renderForward=renderForward;exports["default"]=void 0;require("core-js/modules/es.array.concat.js");require("core-js/modules/es.array.reverse.js");require("core-js/modules/es.object.define-property.js");var _react=_interopRequireWildcard(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _immutable=_interopRequireDefault(require("immutable"));var _shinkansenRails=require("shinkansen-rails");var _reverse=_interopRequireDefault(require("./reverse"));var _forward=_interopRequireDefault(require("./forward"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||_typeof(obj)!=="object"&&typeof obj!=="function"){return{"default":obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj["default"]=obj;if(cache){cache.set(obj,newObj);}return newObj;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function");}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_setPrototypeOf(subClass,superClass);}function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o;};return _setPrototypeOf(o,p);}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function _createSuperInternal(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget);}else{result=Super.apply(this,arguments);}return _possibleConstructorReturn(this,result);};}function _possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeof call==="function")){return call;}else if(call!==void 0){throw new TypeError("Derived constructors may only return object or undefined");}return _assertThisInitialized(self);}function _assertThisInitialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}function _isNativeReflectConstruct(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true;}catch(e){return false;}}function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o);};return _getPrototypeOf(o);}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function renderReverse(reverse,pattern){if(_shinkansenRails.Rails.go(reverse,pattern)){var pathname=_shinkansenRails.Rails.to(reverse,pattern);return _react["default"].createElement(_reverse["default"],{pathname:pathname});}return null;}function renderForward(forward,pattern){if(_shinkansenRails.Rails.go(forward,pattern)){var pathname=_shinkansenRails.Rails.to(forward,pattern);return _react["default"].createElement(_forward["default"],{pathname:pathname});}return null;}var Gears=function(_Component){_inherits(Gears,_Component);var _super=_createSuper(Gears);function Gears(){var _this;_classCallCheck(this,Gears);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_defineProperty(_assertThisInitialized(_this),"state",{});return _this;}_createClass(Gears,[{key:"shouldComponentUpdate",value:function shouldComponentUpdate(_ref,state){var pattern=_ref.pattern;var PATTERN=this.props.pattern;if(pattern!==PATTERN)return true;var reverse=state.reverse,forward=state.forward;var _this$state=this.state,REVERSE=_this$state.reverse,FORWARD=_this$state.forward;return reverse!==REVERSE||forward!==FORWARD;}},{key:"render",value:function render(){var _this$props=this.props,reverse=_this$props.reverse,forward=_this$props.forward,pattern=_this$props.pattern;var reverseGear=renderReverse(reverse,pattern);var forwardGear=renderForward(forward,pattern);if(reverseGear||forwardGear){return _react["default"].createElement("ul",{className:"shinkansen-gears"},reverseGear,forwardGear);}return null;}}],[{key:"getDerivedStateFromProps",value:function getDerivedStateFromProps(_ref2,_ref3){var reverse=_ref2.reverse,forward=_ref2.forward;var R=_ref3.reverse,F=_ref3.forward;var r=_immutable["default"].Map(reverse);var f=_immutable["default"].Map(forward);return{reverse:_immutable["default"].is(R,r)?R:r,forward:_immutable["default"].is(F,f)?F:f};}}]);return Gears;}(_react.Component);exports["default"]=Gears;Gears.defaultProps={reverse:{},forward:{},pattern:_shinkansenRails.Rails.pattern()};Gears.propTypes={reverse:_propTypes["default"].object,forward:_propTypes["default"].object,pattern:_propTypes["default"].string};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;require("core-js/modules/es.array.concat.js");var _react=_interopRequireDefault(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactRouterDom=require("react-router-dom");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function Reverse(_ref){var pathname=_ref.pathname;var key=pathname.concat('-reverse');var to={pathname:pathname};return _react["default"].createElement("li",{key:key,className:"shinkansen-gears-reverse"},_react["default"].createElement(_reactRouterDom.Link,{to:to},"Reverse"));}Reverse.propTypes={pathname:_propTypes["default"].string.isRequired};var _default=Reverse;exports["default"]=_default;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Gears",{enumerable:true,get:function get(){return _gears["default"];}});var _gears=_interopRequireDefault(require("./gears"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}
|
package/package.json
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "shinkansen-gears",
|
|
3
|
+
"version": "1.0.23",
|
|
4
|
+
"description": "Shinkansen Gears",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"Shinkansen",
|
|
7
|
+
"Gears",
|
|
8
|
+
"Zashiki Karakuri",
|
|
9
|
+
"Zashiki",
|
|
10
|
+
"Karakuri",
|
|
11
|
+
"React",
|
|
12
|
+
"React Router"
|
|
13
|
+
],
|
|
14
|
+
"main": "./index.js",
|
|
15
|
+
"author": "Jonathan Perry for Modern Poacher Limited <modernpoacher@modernpoacher.com>",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=12.19.0"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git@github.com/modernpoacher/shinkansen-gears.git"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"prepublishOnly": "cross-env NODE_ENV=production npm run build",
|
|
26
|
+
"prebuild": "npm run clean",
|
|
27
|
+
"build": "cross-env DEBUG=shinkansen-gears npm run babel -- --ignore \"**/__tests__/**\" && npm run gulp",
|
|
28
|
+
"build:watch": "npm run gulp -- build:watch",
|
|
29
|
+
"watch": "cross-env DEBUG=shinkansen-gears concurrently -r \"npm run babel:watch\" \"npm run build:watch\"",
|
|
30
|
+
"clean": "rimraf lib",
|
|
31
|
+
"transform": "npm run gulp -- transform",
|
|
32
|
+
"transform:watch": "npm run gulp -- transform:watch",
|
|
33
|
+
"babel": "babel src -d lib",
|
|
34
|
+
"babel:watch": "npm run babel -- -w",
|
|
35
|
+
"gulp": "bash gulp.sh --color",
|
|
36
|
+
"lint": "eslint .",
|
|
37
|
+
"lint:fix": "npm run lint -- --fix",
|
|
38
|
+
"test": "cross-env NODE_ENV=test jest --collect-coverage false --verbose --run-in-band",
|
|
39
|
+
"storybook": "npm run build && npm run transform && start-storybook -p 6006",
|
|
40
|
+
"build-storybook": "build-storybook",
|
|
41
|
+
"pre-commit": "npm run lint && npm test && npm run build && npm run transform && git add lib .storybook"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"debug": "^4.3.2",
|
|
45
|
+
"immutable": "3.8.2"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@babel/cli": "^7.15.4",
|
|
49
|
+
"@babel/core": "^7.15.5",
|
|
50
|
+
"@babel/eslint-parser": "^7.15.4",
|
|
51
|
+
"@babel/plugin-proposal-class-properties": "^7.14.5",
|
|
52
|
+
"@babel/plugin-proposal-export-default-from": "^7.14.5",
|
|
53
|
+
"@babel/preset-env": "^7.15.6",
|
|
54
|
+
"@babel/preset-react": "^7.14.5",
|
|
55
|
+
"@babel/register": "^7.15.3",
|
|
56
|
+
"@modernpoacher/design-system": "0.0.383",
|
|
57
|
+
"autoprefixer": "^10.3.4",
|
|
58
|
+
"babel-jest": "^27.2.0",
|
|
59
|
+
"babel-plugin-module-resolver": "^4.1.0",
|
|
60
|
+
"babel-plugin-transform-react-jsx": "^6.24.1",
|
|
61
|
+
"babel-preset-react": "^6.24.1",
|
|
62
|
+
"concurrently": "^6.2.1",
|
|
63
|
+
"core-js": "^3.17.3",
|
|
64
|
+
"cross-env": "^7.0.3",
|
|
65
|
+
"cssnano": "^5.0.8",
|
|
66
|
+
"dart-sass": "^1.25.0",
|
|
67
|
+
"del": "^6.0.0",
|
|
68
|
+
"enzyme": "^3.11.0",
|
|
69
|
+
"enzyme-adapter-react-16": "^1.15.6",
|
|
70
|
+
"eslint": "^7.32.0",
|
|
71
|
+
"eslint-config-standard": "^16.0.3",
|
|
72
|
+
"eslint-import-resolver-babel-module": "^5.3.1",
|
|
73
|
+
"eslint-plugin-import": "^2.24.2",
|
|
74
|
+
"eslint-plugin-node": "^11.1.0",
|
|
75
|
+
"eslint-plugin-promise": "^5.1.0",
|
|
76
|
+
"eslint-plugin-react": "^7.25.2",
|
|
77
|
+
"glob-all": "^3.2.1",
|
|
78
|
+
"gulp": "^4.0.2",
|
|
79
|
+
"gulp-clean-css": "^4.3.0",
|
|
80
|
+
"gulp-css-purge": "^3.0.9",
|
|
81
|
+
"gulp-debug": "^4.0.0",
|
|
82
|
+
"gulp-postcss": "^9.0.1",
|
|
83
|
+
"gulp-rename": "^2.0.0",
|
|
84
|
+
"gulp-sass": "^5.0.0",
|
|
85
|
+
"gulp-sourcemaps": "^3.0.0",
|
|
86
|
+
"husky": "^7.0.2",
|
|
87
|
+
"jest": "^27.2.0",
|
|
88
|
+
"postcss": "^8.3.6",
|
|
89
|
+
"postcss-easy-import": "^3.0.0",
|
|
90
|
+
"postcss-map": "^0.11.0",
|
|
91
|
+
"postcss-normalize": "^10.0.1",
|
|
92
|
+
"postcss-scss": "^4.0.0",
|
|
93
|
+
"prop-types": "15.7.2",
|
|
94
|
+
"react": "16.14.0",
|
|
95
|
+
"react-dom": "16.14.0",
|
|
96
|
+
"react-router": "5.2.0",
|
|
97
|
+
"react-router-dom": "5.2.0",
|
|
98
|
+
"react-test-renderer": "16.14.0",
|
|
99
|
+
"regenerator-runtime": "^0.13.9",
|
|
100
|
+
"rimraf": "^3.0.2",
|
|
101
|
+
"shinkansen-rails": "1.0.18",
|
|
102
|
+
"vinyl-paths": "3.0.1"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Link
|
|
6
|
+
} from 'react-router-dom'
|
|
7
|
+
|
|
8
|
+
function Forward ({ pathname }) {
|
|
9
|
+
const key = pathname.concat('-forward')
|
|
10
|
+
const to = {
|
|
11
|
+
pathname
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<li key={key} className='shinkansen-gears-forward'>
|
|
16
|
+
<Link to={to}>
|
|
17
|
+
Forward
|
|
18
|
+
</Link>
|
|
19
|
+
</li>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Forward.propTypes = {
|
|
24
|
+
pathname: PropTypes.string.isRequired
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default Forward
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import React, { Component } from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
import Immutable from 'immutable'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Rails
|
|
7
|
+
} from 'shinkansen-rails'
|
|
8
|
+
|
|
9
|
+
import Reverse from './reverse'
|
|
10
|
+
import Forward from './forward'
|
|
11
|
+
|
|
12
|
+
export function renderReverse (reverse, pattern) {
|
|
13
|
+
if (Rails.go(reverse, pattern)) {
|
|
14
|
+
const pathname = Rails.to(reverse, pattern)
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Reverse
|
|
18
|
+
pathname={pathname}
|
|
19
|
+
/>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function renderForward (forward, pattern) {
|
|
27
|
+
if (Rails.go(forward, pattern)) {
|
|
28
|
+
const pathname = Rails.to(forward, pattern)
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Forward
|
|
32
|
+
pathname={pathname}
|
|
33
|
+
/>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default class Gears extends Component {
|
|
41
|
+
state = {} // define state
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Convert latest 'props' to an Immutable.Map() and store in 'state'
|
|
45
|
+
*
|
|
46
|
+
* @param {Object} props Latest props
|
|
47
|
+
* @param {Object} state Current state
|
|
48
|
+
*/
|
|
49
|
+
static getDerivedStateFromProps ({ reverse, forward }, { reverse: R, forward: F }) { // console.log('[Gears]getDerivedStateFromProps()')
|
|
50
|
+
const r = Immutable.Map(reverse)
|
|
51
|
+
const f = Immutable.Map(forward)
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
reverse: Immutable.is(R, r) ? R : r,
|
|
55
|
+
forward: Immutable.is(F, f) ? F : f
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Compare latest 'props' and 'state' for changes to 'pattern', 'reverse' or 'forward'
|
|
61
|
+
*
|
|
62
|
+
* @param {Object} props Latest props
|
|
63
|
+
*/
|
|
64
|
+
shouldComponentUpdate ({ pattern }, state) { // console.log('(Gears)shouldComponentUpdate()', { pattern }, state)
|
|
65
|
+
const {
|
|
66
|
+
pattern: PATTERN
|
|
67
|
+
} = this.props
|
|
68
|
+
|
|
69
|
+
if (pattern !== PATTERN) return true
|
|
70
|
+
|
|
71
|
+
const {
|
|
72
|
+
reverse,
|
|
73
|
+
forward
|
|
74
|
+
} = state
|
|
75
|
+
|
|
76
|
+
const {
|
|
77
|
+
reverse: REVERSE,
|
|
78
|
+
forward: FORWARD
|
|
79
|
+
} = this.state // state must be defined
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
reverse !== REVERSE ||
|
|
83
|
+
forward !== FORWARD
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
render () { // console.log('(Gears)render()')
|
|
88
|
+
const {
|
|
89
|
+
reverse,
|
|
90
|
+
forward,
|
|
91
|
+
pattern
|
|
92
|
+
} = this.props
|
|
93
|
+
|
|
94
|
+
const reverseGear = renderReverse(reverse, pattern)
|
|
95
|
+
const forwardGear = renderForward(forward, pattern)
|
|
96
|
+
|
|
97
|
+
if (reverseGear || forwardGear) {
|
|
98
|
+
return (
|
|
99
|
+
<ul className='shinkansen-gears'>
|
|
100
|
+
{reverseGear}
|
|
101
|
+
{forwardGear}
|
|
102
|
+
</ul>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return null
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Gears.defaultProps = {
|
|
111
|
+
reverse: {},
|
|
112
|
+
forward: {},
|
|
113
|
+
pattern: Rails.pattern()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
Gears.propTypes = {
|
|
117
|
+
reverse: PropTypes.object,
|
|
118
|
+
forward: PropTypes.object,
|
|
119
|
+
pattern: PropTypes.string
|
|
120
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Link
|
|
6
|
+
} from 'react-router-dom'
|
|
7
|
+
|
|
8
|
+
function Reverse ({ pathname }) {
|
|
9
|
+
const key = pathname.concat('-reverse')
|
|
10
|
+
const to = {
|
|
11
|
+
pathname
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<li key={key} className='shinkansen-gears-reverse'>
|
|
16
|
+
<Link to={to}>
|
|
17
|
+
Reverse
|
|
18
|
+
</Link>
|
|
19
|
+
</li>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Reverse.propTypes = {
|
|
24
|
+
pathname: PropTypes.string.isRequired
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default Reverse
|
package/src/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export Gears from './gears'
|