UNPKG

@itznevikat/router

Version:

πŸ“¦ ΠœΠ½ΠΎΠ³ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° React ΠΈ VKUI

2 lines (1 loc) β€’ 6.19 kB
import{createHashHistory as n,Action as t,createPath as r}from"history";import e,{isValidElement as o,Children as i,useState as a,useEffect as u,useContext as c,useMemo as l,useCallback as f,createContext as s,useRef as p,cloneElement as v}from"react";import{deepMap as d,deepForEach as h}from"react-children-utilities";import{ConfigProviderContext as m,Platform as y,View as b,Root as k,Epic as w,ModalRoot as E}from"@vkontakte/vkui";import{getNavId as I}from"@vkontakte/vkui/dist/lib/getNavId";import D from"@vkontakte/vk-bridge";var O=n({window:window});function R(n,t){return O.push(n,{meta:t})}function L(n,t){return O.replace(n,{meta:t})}function P(){return O.back()}function g(){return O.forward()}function S(n){return O.go(n)}function M(n){return O.block(n)}function A(n){return O.listen(n)}function B(){return B=Object.assign||function(n){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(n[e]=r[e])}return n},B.apply(this,arguments)}function K(n){if(o(n))return n.props["data-node-id"]}function T(n){if(o(n))return I(n.props)}function U(n,t,r){var e={},a=r.split(/(?=\/)/),u=a.shift();return function n(r,c){if(o(r)&&o(c)){var l=T(r),f=K(c);if(l&&f&&u===l){var s=t.find(function(n){return n.nodeID===f});null!=s&&s.availableTransitionIDs.includes(l)&&(e[f]=l,u=a.shift())}r.props.children&&i.toArray(r.props.children).forEach(function(t){return n(t,l?r:c)})}}(n,n),e}var V=location;function j(){var n;return null!=(n=Object.fromEntries(new URLSearchParams(O.location.search.slice(1))))?n:{}}function C(){var n=a(j),t=n[0],r=n[1];return u(function(){return O.listen(function(){return r(j)})},[]),t}function x(){var n,t;return null!=(n=null==(t=O.location.state)?void 0:t.meta)?n:{}}function H(){var n=a(x),r=n[0],e=n[1];return u(function(){return O.listen(function(n){[t.Push,t.Replace].includes(n.action)&&e(x)})},[]),r}function N(){return O.location}function W(){var n=a(N),t=n[0],r=n[1];return u(function(){return O.listen(function(){return r(N)})},[]),t}function _(){return V}function q(){var n=c($),t=n.root,r=n.navs,e=l(function(){return U(t,r,O.location.pathname)},[t,O.location.pathname]),o=l(function(){var n,t,o,i,a,u,c=null!=(n=null==(t=r.find(function(n){var t=n.type;return"root"===t||"epic"===t}))?void 0:t.nodeID)?n:"/",l=null!=(o=e[c])?o:"/",f=null!=(i=null==(a=r.find(function(n){return"view"===n.type&&n.navID===l}))?void 0:a.nodeID)?i:"/",s=null!=(u=e[f])?u:"/";return{view:l,panel:s}},[t,r,O.location.pathname]);return B({},e,{view:o.view,panel:o.panel})}var z=null;function F(n){var t=f(function(t){z=t,n&&n(z)},[n]),r=f(function(t){z=null==t?void 0:t.target,n&&n(z)},[n]);return{actionRef:z,setActionRef:t,setActionRefHandler:r}}function G(){return c(m).platform===y.VKCOM?J.DESKTOP:J.MOBILE}var J,Q=function(n){return e.createElement(b,B({},n),n.children)},X=function(n){return e.createElement(k,B({},n),n.children)},Y=function(n){return e.createElement(w,B({},n),n.children)},Z=function(n){var t=C().modal;return e.createElement(E,B({activeModal:void 0===t?null:t,onClose:P},n),n.children)},$=s({});!function(n){n.MOBILE="MOBILE",n.DESKTOP="DESKTOP"}(J||(J={}));var nn=function(n){var c=n.children,f=n.style,s=n.initialURL,m=n.fallbackURL,y=n.disableSetLocation,E=a()[1],I=p(!0),R=l(function(){return function(n){return d(n,function(n){var t;if(!o(n))return n;if(!T(n)){switch(n.type){case Q:case X:case Y:console.warn("[router] found known navigation layout but no `nav` property. Maybe you forgot about it?");break;case b:case k:case w:console.warn("[router] use View, Root and Epic imported from the router to work correctly.")}return n}return v(n,B({},n.props,((t={})["data-node-id"]=function(n){var t="";return h(n,function(n){var r;o(n)&&(t+=null!=(r=n.key)?r:n.type.name)}),t}(n),t)))})[0]}(c)},[c]),L=l(function(){return function(n){var t=[];return h(n,function(n){if(o(n)){var r,e=T(n);if(!e)return n;switch(n.type){case Q:r="view";break;case X:r="root";break;case Y:r="epic";break;default:return n}var a=i.toArray(n.props.children).map(function(n){return o(n)&&T(n)}).filter(function(n){return!!n});t.unshift(function(n,t,r,e){return{type:n,navID:t,nodeID:e,availableTransitionIDs:r,transitions:[r[0]]}}(r,e,a,n.props["data-node-id"]))}}),t}(R)},[]),P=I.current&&null!=s?s:O.location.pathname,g=null!=f?f:G();return u(function(){var n=O.listen(function(n){var e,o,i,a=n.location,u=n.action,c=a.state,l=U(R,L,a.pathname);if(0===Object.keys(l).length&&(console.warn("[router] route not found."),m))return(null==c||null==(e=c.meta)?void 0:e.retry)>0?console.error("[router] fallback route not found."):O.replace(m,{force:!0,meta:{from:r(a),retry:null!=c&&null!=(o=c.meta)&&o.retry?(null==c||null==(i=c.meta)?void 0:i.retry)+1:1,meta:null==c?void 0:c.meta}});null!=c&&c.force&&(u=t.Push),L.forEach(function(n){var r,e=n.transitions,o=null!=(r=l[n.nodeID])?r:"/";e[e.length-1]!==o&&(u===t.Push&&e.push(o),u===t.Replace&&e.splice(-1,1,o),u===t.Pop&&(e.includes(o)?e.pop():e.push(o)))}),y||function(n){D.send("VKWebAppSetLocation",{location:r(n),replace_state:!0})}(a),E({})}),e=r(O.location);return s?s!==e&&(P=s,O.replace(s)):O.location.search.slice(1)?(O.replace(O.location.pathname),O.push(e)):O.location.pathname.slice(1)&&(O.replace("/"),O.push(e)),I.current=!1,n},[]),e.createElement($.Provider,{value:{root:R,navs:L,style:g,initialURL:s,fallbackURL:m,disableSetLocation:y}},function(n,t,r,e){var i=U(t,r,n);return d(t,function(n){var t;if(!o(n))return n;var a=K(n);if(!a)return n;var u=null!=(t=i[a])?t:"/",c=B({},n.props);switch(n.type){case Q:if(c.activePanel=u,e===J.MOBILE){var l=r.find(function(n){return n.nodeID===a});c.history=l.transitions,c.onSwipeBack=O.back}break;case X:c.activeView=u;break;case Y:c.activeStory=u;break;default:return n}return v(n,c)})[0]}(P,R,L,g))};function tn(n,t){var r;return n&&null!=(r=t.find(function(t){return T(t)===n}))?r:null}export{Y as Epic,nn as Match,$ as MatchContext,Z as ModalRoot,X as Root,J as Style,Q as View,P as back,M as block,g as forward,S as go,A as listen,tn as matchPopout,R as push,L as replace,F as useActionRef,q as useDeserialized,_ as useInitialLocation,W as useLocation,H as useMeta,C as useParams,G as useStyle};