@saber2pr/router
Version:
> react-router-dom by hooks api.
50 lines (49 loc) • 2.19 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
/*
* @Author: saber2pr
* @Date: 2019-06-03 18:19:53
* @Last Modified by: saber2pr
* @Last Modified time: 2019-06-06 14:26:17
*/
var react_1 = __importStar(require("react"));
var route_1 = require("./route");
var useHistory_1 = require("./useHistory");
var createRouteFrame_1 = require("./createRouteFrame");
function Router(_a) {
var children = _a.children, history = _a.history;
var _b = react_1.useState(), frame = _b[0], render = _b[1];
var H = useHistory_1.useHistory(history);
var list = react_1.default.Children.toArray(children);
react_1.useEffect(function () {
var effects = list.reduce(function (receiver, c, index) {
// is not route component
if (!route_1.isRoute(c))
return receiver;
// is none matched
if (!c.props.path) {
return receiver.concat(H.subscribe('/404', function () { return render(react_1.default.createElement(c.props.component, null)); }));
}
// create route's frame
var rFrame = createRouteFrame_1.createRouteFrame(list, index);
var effect = H.subscribe(c.props.path, function () { return render(rFrame); });
return receiver.concat(effect);
}, []);
// default 404
effects.concat(H.subscribe('/404', function () { return render(react_1.default.createElement("h1", null, "404")); }));
var defaultRoute = list.find(route_1.isDefaultRoute) || list.find(route_1.isRoute);
// if not default tag, use the first route.
var exec = defaultRoute.props.path;
H.push(exec);
return function () { return effects.forEach(function (c) { return c(); }); };
}, [children]);
return react_1.default.createElement(react_1.default.Fragment, null, frame);
}
exports.Router = Router;