Files
cozsweet-frontend-nextjs/src/router/use-global-app-navigator.ts
T

133 lines
3.4 KiB
TypeScript

"use client";
import { useCallback, useMemo } from "react";
import { useRouter } from "next/navigation";
import {
behaviorAnalytics,
getDefaultPaymentAnalyticsContext,
} from "@/lib/analytics";
import { getDefaultPayChannelForCountryCode } from "@/lib/payment/default_pay_channel";
import { useAuthSelector } from "@/stores/auth/auth-context";
import { useUserSelector } from "@/stores/user/user-context";
import {
isAuthenticatedUser as resolveIsAuthenticatedUser,
resolveAuthenticatedNavigation,
} from "./navigation-resolver";
import type { OpenSubscriptionInput } from "./navigation-types";
import { ROUTE_BUILDERS } from "./routes";
export interface OpenGlobalSubscriptionInput extends OpenSubscriptionInput {
sourceCharacterSlug: string;
}
export interface GlobalAppNavigator {
push: (href: string, options?: { scroll?: boolean }) => void;
replace: (href: string, options?: { scroll?: boolean }) => void;
back: () => void;
openAuth: (redirectTo: string) => void;
openSubscription: (input: OpenGlobalSubscriptionInput) => void;
getDefaultPayChannel: () => ReturnType<
typeof getDefaultPayChannelForCountryCode
>;
isAuthenticatedUser: boolean;
}
export function useGlobalAppNavigator(): GlobalAppNavigator {
const router = useRouter();
const loginStatus = useAuthSelector((state) => state.context.loginStatus);
const countryCode = useUserSelector(
(state) => state.context.currentUser?.countryCode,
);
const isAuthenticatedUser = resolveIsAuthenticatedUser(loginStatus);
const push = useCallback(
(href: string, options?: { scroll?: boolean }): void => {
router.push(href, options);
},
[router],
);
const replace = useCallback(
(href: string, options?: { scroll?: boolean }): void => {
router.replace(href, options);
},
[router],
);
const back = useCallback((): void => {
router.back();
}, [router]);
const openAuth = useCallback(
(redirectTo: string): void => {
router.push(ROUTE_BUILDERS.authWithRedirect(redirectTo));
},
[router],
);
const getDefaultPayChannel = useCallback(() => {
return getDefaultPayChannelForCountryCode(countryCode);
}, [countryCode]);
const openSubscription = useCallback(
({
type,
sourceCharacterSlug,
payChannel = getDefaultPayChannel(),
returnTo = null,
replace: shouldReplace = false,
analytics = getDefaultPaymentAnalyticsContext(type),
chatActionId,
planId,
commercialOfferId,
}: OpenGlobalSubscriptionInput): void => {
const target = ROUTE_BUILDERS.subscription(type, {
payChannel,
returnTo: returnTo ?? undefined,
sourceCharacterSlug,
analytics,
chatActionId,
planId,
commercialOfferId,
});
behaviorAnalytics.rechargeModalOpen(analytics);
const nextUrl = resolveAuthenticatedNavigation({
loginStatus,
targetUrl: target,
});
if (shouldReplace) {
router.replace(nextUrl);
return;
}
router.push(nextUrl);
},
[getDefaultPayChannel, loginStatus, router],
);
return useMemo(
() => ({
push,
replace,
back,
openAuth,
openSubscription,
getDefaultPayChannel,
isAuthenticatedUser,
}),
[
back,
getDefaultPayChannel,
isAuthenticatedUser,
openAuth,
openSubscription,
push,
replace,
],
);
}