93 lines
3.0 KiB
TypeScript
93 lines
3.0 KiB
TypeScript
"use client";
|
|
|
|
import {
|
|
DEFAULT_CHARACTER_ID,
|
|
DEFAULT_CHARACTER_SLUG,
|
|
getCharacterBySlug,
|
|
} from "@/data/constants/character";
|
|
import { buildGlobalPageUrl } from "@/router/global-route-context";
|
|
import { getCharacterRoutes, ROUTES } from "@/router/routes";
|
|
import type { AppSubscriptionReturnTo } from "@/router/navigation-types";
|
|
|
|
import { consumePendingChatImageReturn } from "./chat_image_return_session";
|
|
import {
|
|
clearPendingChatUnlock,
|
|
peekPendingChatUnlock,
|
|
} from "./chat_unlock_session";
|
|
|
|
export type SubscriptionReturnTo = AppSubscriptionReturnTo;
|
|
|
|
export async function consumeSubscriptionExplicitExitUrl(
|
|
characterSlug: string = DEFAULT_CHARACTER_SLUG,
|
|
): Promise<string | null> {
|
|
const characterId = resolveCharacterId(characterSlug);
|
|
const pendingImageReturn = await consumePendingChatImageReturn(characterId);
|
|
if (pendingImageReturn) return pendingImageReturn.returnUrl;
|
|
const pendingChatUnlock = await peekPendingChatUnlock(characterId);
|
|
if (pendingChatUnlock) {
|
|
await clearPendingChatUnlock();
|
|
return pendingChatUnlock.returnUrl;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export async function peekSubscriptionExplicitExitUrl(
|
|
characterSlug: string = DEFAULT_CHARACTER_SLUG,
|
|
): Promise<string | null> {
|
|
const pendingChatUnlock = await peekPendingChatUnlock(
|
|
resolveCharacterId(characterSlug),
|
|
);
|
|
if (pendingChatUnlock) return pendingChatUnlock.returnUrl;
|
|
return null;
|
|
}
|
|
|
|
export function getSubscriptionFallbackExitUrl(
|
|
returnTo: SubscriptionReturnTo,
|
|
characterSlug: string = DEFAULT_CHARACTER_SLUG,
|
|
): string {
|
|
const routes = getCharacterRoutes(characterSlug);
|
|
if (returnTo === "chat") return routes.chat;
|
|
if (returnTo === "private-room") return routes.privateRoom;
|
|
if (returnTo === "sidebar") {
|
|
return buildGlobalPageUrl(ROUTES.sidebar, routes.chat);
|
|
}
|
|
return ROUTES.sidebar;
|
|
}
|
|
|
|
export async function consumeSubscriptionExitUrl(
|
|
returnTo: SubscriptionReturnTo,
|
|
characterSlug: string = DEFAULT_CHARACTER_SLUG,
|
|
): Promise<string> {
|
|
if (returnTo === "private-room") {
|
|
return getCharacterRoutes(characterSlug).privateRoom;
|
|
}
|
|
if (returnTo === "sidebar") {
|
|
return getSubscriptionFallbackExitUrl(returnTo, characterSlug);
|
|
}
|
|
|
|
return (
|
|
(await consumeSubscriptionExplicitExitUrl(characterSlug)) ??
|
|
getSubscriptionFallbackExitUrl(returnTo, characterSlug)
|
|
);
|
|
}
|
|
|
|
export async function resolveSubscriptionSuccessExitUrl(
|
|
returnTo: SubscriptionReturnTo,
|
|
characterSlug: string = DEFAULT_CHARACTER_SLUG,
|
|
): Promise<string> {
|
|
if (returnTo === "private-room") {
|
|
return getCharacterRoutes(characterSlug).privateRoom;
|
|
}
|
|
if (returnTo === "sidebar") {
|
|
return getSubscriptionFallbackExitUrl(returnTo, characterSlug);
|
|
}
|
|
|
|
const pendingExitUrl = await peekSubscriptionExplicitExitUrl(characterSlug);
|
|
if (pendingExitUrl) return pendingExitUrl;
|
|
return consumeSubscriptionExitUrl(returnTo, characterSlug);
|
|
}
|
|
|
|
function resolveCharacterId(characterSlug: string): string {
|
|
return getCharacterBySlug(characterSlug)?.id ?? DEFAULT_CHARACTER_ID;
|
|
}
|