@sky-mavis/tanto-widget
Version:
Tanto Widget
101 lines (97 loc) • 3.41 kB
JavaScript
;
var jsxRuntime = require('@emotion/react/jsx-runtime');
var react = require('react');
var wagmi = require('wagmi');
var analytic = require('../../analytic.cjs');
var viewConfigs = require('../../configs/viewConfigs.cjs');
var index = require('../../constants/index.cjs');
var useTantoConfig = require('../../hooks/useTantoConfig.cjs');
var useUnmount = require('../../hooks/useUnmount.cjs');
var route = require('../../types/route.cjs');
var WidgetRouterContext = require('./WidgetRouterContext.cjs');
const WidgetRouterProvider = ({
children
}) => {
const {
disableProfile
} = useTantoConfig.useTantoConfig();
const {
isConnected
} = wagmi.useAccount();
const getInitialView = react.useCallback(route$1 => {
if (route$1) return viewConfigs.viewConfigs[route$1];
return isConnected && !disableProfile ? viewConfigs.viewConfigs[route.Route.PROFILE] : viewConfigs.viewConfigs[route.Route.WALLETS];
}, [isConnected, disableProfile]);
const [routerState, setRouterState] = react.useState(() => {
const initialView = getInitialView();
return {
view: initialView,
history: [initialView]
};
});
const reset = react.useCallback(route => {
const initialView = getInitialView(route);
setRouterState({
view: initialView,
history: [initialView]
});
}, [getInitialView]);
const goTo = react.useCallback((nextRoute, options) => {
if (!isConnected && route.authenticatedRoutes.includes(nextRoute)) return;
setRouterState(({
view: currentView,
history
}) => {
const isSameView = nextRoute === currentView.route;
const newView = {
route: nextRoute,
title: options?.title ?? currentView.title,
content: options?.content ?? viewConfigs.viewConfigs[nextRoute].content,
showBackButton: options?.showBackButton ?? (!isSameView && history.length > 0),
...options
};
return {
view: newView,
history: isSameView ? history : [...history, newView]
};
});
}, [isConnected]);
const goBack = react.useCallback(() => {
setRouterState(prevRouterState => {
const {
history
} = prevRouterState;
if (history.length <= 1) return prevRouterState;
const newHistory = history.slice(0, -1);
return {
view: newHistory[newHistory.length - 1],
history: newHistory
};
});
}, []);
react.useEffect(() => {
const {
route: route$1
} = routerState.view;
const shouldReset = isConnected && !disableProfile && route.publicRoutes.includes(route$1) || !isConnected && route.authenticatedRoutes.includes(route$1);
if (shouldReset) reset();
}, [isConnected, disableProfile, routerState.view.route, reset]);
useUnmount.useUnmount(() => {
if (route.internalRoutes.includes(routerState.view.route)) setTimeout(reset, index.VISIBILITY_TRANSITION_DURATION);
});
react.useEffect(() => {
analytic.analytic.sendScreen(routerState.view.route);
}, [routerState.view.route]);
const contextValue = react.useMemo(() => ({
view: routerState.view,
history: routerState.history,
goTo,
goBack,
reset
}), [routerState, goTo, goBack, reset]);
return jsxRuntime.jsx(WidgetRouterContext.WidgetRouterContext.Provider, {
value: contextValue,
children: children
});
};
exports.WidgetRouterProvider = WidgetRouterProvider;