import { FlowRouter } from 'meteor/kadira:flow-router'; import { Tracker } from 'meteor/tracker'; import React, { FC } from 'react'; import { Subscription, Unsubscribe } from 'use-subscription'; import { RouterContext, RouterContextValue } from '../contexts/RouterContext'; const createSubscription = function (getValue: () => T): Subscription { let currentValue = Tracker.nonreactive(getValue); return { getCurrentValue: (): T => currentValue, subscribe: (callback: () => void): Unsubscribe => { const computation = Tracker.autorun(() => { currentValue = getValue(); callback(); }); return (): void => { computation.stop(); }; }, }; }; const queryRoutePath = ( name: Parameters[0], parameters: Parameters[1], queryStringParameters: Parameters[2], ): ReturnType => createSubscription(() => FlowRouter.path(name, parameters, queryStringParameters)); const queryRouteUrl = ( name: Parameters[0], parameters: Parameters[1], queryStringParameters: Parameters[2], ): ReturnType => createSubscription(() => FlowRouter.url(name, parameters, queryStringParameters)); const pushRoute = ( name: Parameters[0], parameters: Parameters[1], queryStringParameters: Parameters[2], ): ReturnType => { FlowRouter.go(name, parameters, queryStringParameters); }; const replaceRoute = ( name: Parameters[0], parameters: Parameters[1], queryStringParameters: Parameters[2], ): ReturnType => { FlowRouter.withReplaceState(() => { FlowRouter.go(name, parameters, queryStringParameters); }); }; const queryRouteParameter = ( name: Parameters[0], ): ReturnType => createSubscription(() => FlowRouter.getParam(name)); const queryQueryStringParameter = ( name: Parameters[0], ): ReturnType => createSubscription(() => FlowRouter.getQueryParam(name)); const queryCurrentRoute = (): ReturnType => createSubscription(() => { FlowRouter.watchPathChange(); const { route, params, queryParams } = FlowRouter.current(); return [route?.name, params, queryParams, route?.group?.name]; }); const contextValue = { queryRoutePath, queryRouteUrl, pushRoute, replaceRoute, queryRouteParameter, queryQueryStringParameter, queryCurrentRoute, }; const RouterProvider: FC = ({ children }) => ; export default RouterProvider;