UNPKG

smart-react-components

Version:

React UI library, wide variety of editable ready to use Styled and React components.

184 lines (168 loc) 8.85 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var index = require('../index-6d498b59.js'); var DOMHelper = require('../DOMHelper-c0bd5a29.js'); var React = require('react'); var React__default = _interopDefault(React); require('styled-components'); require('../index-56ba89df.js'); var Div = require('../element/Div.js'); var UseLinkMethods = require('../UseLinkMethods-aa925676.js'); require('react-router'); var A = require('../element/A.js'); var ProgressBar$1 = require('../ProgressBar-6e7f8767.js'); const SET_URL = "SET_URL"; const SET_NEW_URL = "SET_NEW_URL"; const SET_CANCEL_CALLBACK = "SET_CANCEL_CALLBACK"; const SET_PERCENTAGE = "SET_PERCENTAGE"; const getInitialState = (url = UseLinkMethods.RouterHelper.getUrl()) => ({ url: UseLinkMethods.RouterHelper.setUrl(url), newUrl: null, key: null, cancelCallback: null, percentage: 0, }); const reducer = (state, action) => { switch (action.type) { case SET_URL: return Object.assign(Object.assign({}, state), { url: action.payload, newUrl: null, key: null, cancelCallback: null, percentage: 0 }); case SET_NEW_URL: if (state.cancelCallback) state.cancelCallback(); return Object.assign(Object.assign({}, state), { newUrl: action.payload, key: action.key, cancelCallback: null, percentage: 0 }); case SET_CANCEL_CALLBACK: return Object.assign(Object.assign({}, state), { cancelCallback: state.key == action.key ? action.payload : state.cancelCallback }); case SET_PERCENTAGE: if (state.key == action.key) return action.payload == 100 ? reducer(state, { type: SET_URL, payload: state.newUrl }) : Object.assign(Object.assign({}, state), { percentage: action.payload }); else return state; default: throw new Error(); } }; const ProgressBar = ({ progressBarProps = index.DV.JSX_ELEMENT_PROPS }) => { const router = React__default.useContext(UseLinkMethods.RouterContext); return (React__default.createElement(Div, { position: "fixed", zIndex: "routerProgressBar", left: "0", right: "0", top: "0", style: (router.state.newUrl ? {} : { visibility: "hidden", pointerEvents: "none" }) }, React__default.createElement(ProgressBar$1.ProgressBar$, Object.assign({}, progressBarProps, { percentage: router.state.percentage })))); }; const ServerRouter = ({ children, url, progressBarProps }) => { const [state, dispatch] = React__default.useReducer(reducer, getInitialState(url)); return (React__default.createElement(UseLinkMethods.RouterContext.Provider, { value: { state, dispatch } }, React__default.createElement(ProgressBar, { progressBarProps: progressBarProps }), children)); }; const setUrl = (url) => ({ type: SET_URL, payload: url }); const setNewUrl = (newUrl, key) => ({ type: SET_NEW_URL, payload: newUrl, key }); const setCancelCallback = (callback, key) => ({ type: SET_CANCEL_CALLBACK, payload: callback, key }); const setPercentage = (percentage, key) => ({ type: SET_PERCENTAGE, payload: percentage, key }); const ClientRouter = ({ children, params = {}, progressBarProps = index.DV.JSX_ELEMENT_PROPS, routes }) => { const [state, dispatch] = React__default.useReducer(reducer, getInitialState()); const setRouterUrl = React__default.useCallback((_url) => { (function () { return UseLinkMethods.__awaiter(this, void 0, void 0, function* () { const url = UseLinkMethods.RouterHelper.setUrl(_url); let key = new Date().getTime().toString(); const setPercentage$ = (payload) => dispatch(setPercentage(payload, key)); const setCancelCallback$ = (payload) => dispatch(setCancelCallback(payload, key)); let loaderMethods = []; yield UseLinkMethods.RouterHelper.getLoaderMethods(routes, url.pathname, url.query, loaderMethods, params, state.url, setPercentage$, setCancelCallback$); if (loaderMethods.length == 0) dispatch(setUrl(url)); else { dispatch(setNewUrl(url, key)); try { setPercentage$(10); for (let i in loaderMethods) { yield loaderMethods[i](); } setPercentage$(100); } catch (ignored) { } } }); }()); }, [state.url]); const popstate = () => setRouterUrl(UseLinkMethods.RouterHelper.getUrl()); React__default.useEffect(() => { history.push = (url) => { history.pushState({}, null, url); setRouterUrl(UseLinkMethods.RouterHelper.getUrl()); }; history.replace = (url) => { history.replaceState({}, null, url); setRouterUrl(UseLinkMethods.RouterHelper.getUrl()); }; DOMHelper.DOMHelper.addEventListener(window, ["popstate"], popstate); return () => { DOMHelper.DOMHelper.removeEventListener(window, ["popstate"], popstate); }; }, [state.url]); return (React__default.createElement(UseLinkMethods.RouterContext.Provider, { value: { state, dispatch } }, React__default.createElement(ProgressBar, { progressBarProps: progressBarProps }), children)); }; const Switch = ({ children }) => { const router = React__default.useContext(UseLinkMethods.RouterContext); const getElements = () => { let switchNotRendered = false; return children.map((item, index) => { let el = React__default.cloneElement(item, { key: (item.key || index), switchNotRendered }); if (!switchNotRendered && UseLinkMethods.RouterHelper.matchPath(router.state.url.pathname, router.state.url.query, { path: item.props.path, exact: item.props.exact, searchKeys: item.props.searchKeys })) switchNotRendered = true; return el; }); }; const [elements, setElements] = React__default.useState(() => getElements()); const init = React__default.useRef(false); React__default.useEffect(() => { if (!init.current) init.current = true; else setElements(getElements()); }, [children, router.state.url]); return React__default.createElement(React__default.Fragment, null, elements); }; const Route = ({ path, exact, Component, render, searchKeys, switchNotRendered, defaultSearchValues }) => { const router = React__default.useContext(UseLinkMethods.RouterContext); const [match, setMatch] = React__default.useState(() => UseLinkMethods.RouterHelper.matchPath(router.state.url.pathname, router.state.url.query, { path, exact, searchKeys, defaultSearchValues })); React__default.useEffect(() => { setMatch(UseLinkMethods.RouterHelper.matchPath(router.state.url.pathname, router.state.url.query, { path, exact, searchKeys, defaultSearchValues })); }, [router.state.url]); return (React__default.createElement(React__default.Fragment, { key: match ? match.key : "" }, (!switchNotRendered && match && typeof Component !== "undefined") && React__default.createElement(Component, { url: router.state.url, match: match }), render && render((!switchNotRendered && match ? match : null), router.state.url))); }; const Link = ({ children, elementProps = index.DV.JSX_ELEMENT_PROPS, to }) => { const { click } = UseLinkMethods.useLinkMethods({ to, checkActive: false }); return (React__default.createElement(A, Object.assign({}, elementProps, { href: to, onClick: click }), children)); }; const NavLink = ({ children, elementProps = index.DV.JSX_ELEMENT_PROPS, to, path, exact, emptyQueryActive }) => { const { click, active, activating } = UseLinkMethods.useLinkMethods({ to, path, exact, emptyQueryActive }); return (React__default.createElement(A, Object.assign({}, elementProps, { href: to, onClick: click, className: `${elementProps.className || ""} ${active ? "active" : ""} ${activating ? "activating" : ""}` }), children)); }; const runLoaders = UseLinkMethods.RouterHelper.runLoaders.bind(UseLinkMethods.RouterHelper); exports.RouterContext = UseLinkMethods.RouterContext; exports.ClientRouter = ClientRouter; exports.Link = Link; exports.NavLink = NavLink; exports.Route = Route; exports.ServerRouter = ServerRouter; exports.Switch = Switch; exports.runLoaders = runLoaders;