Files
cozsweet-frontend-nextjs/src/app/chat/chat-screen.helpers.ts
T

81 lines
2.1 KiB
TypeScript

"use client";
import type { LoginStatus } from "@/data/dto/auth";
import type { ChatUpgradeReason } from "@/stores/chat/chat-state";
import { AppEnvUtil, BrowserDetector } from "@/utils";
export interface ExternalBrowserPromptState {
hasInitialized: boolean;
isLoading: boolean;
loginStatus: LoginStatus;
isInAppBrowser?: boolean;
}
export type InsufficientCreditsAction = "auth" | "topup";
export interface InsufficientCreditsMessageLimitView {
title: string;
description: string;
ctaLabel: string;
action: InsufficientCreditsAction;
}
export interface MessageLimitBannerState {
upgradePromptVisible: boolean;
upgradeReason: ChatUpgradeReason | null;
}
export function deriveIsGuest(loginStatus: LoginStatus): boolean {
return loginStatus === "guest";
}
export function shouldShowMessageLimitBanner({
upgradePromptVisible,
upgradeReason,
}: MessageLimitBannerState): boolean {
return upgradePromptVisible && upgradeReason === "insufficient_credits";
}
export function getInsufficientCreditsMessageLimitView(
loginStatus: LoginStatus,
): InsufficientCreditsMessageLimitView {
if (loginStatus === "guest" || loginStatus === "notLoggedIn") {
return {
title: "Log in to get more free chats",
description: "Free chats refresh every day.",
ctaLabel: "Log in to continue",
action: "auth",
};
}
return {
title: "Insufficient credits",
description: "Free chats refresh every day.",
ctaLabel: "Top up credits to continue",
action: "topup",
};
}
export function isChatDevelopmentEnvironment(): boolean {
return AppEnvUtil.isDevelopment();
}
export function shouldStartExternalBrowserPrompt({
hasInitialized,
isLoading,
loginStatus,
isInAppBrowser = BrowserDetector.isInAppBrowser(),
}: ExternalBrowserPromptState): boolean {
if (!hasInitialized || isLoading) return false;
return (
isChatDevelopmentEnvironment() ||
(loginStatus === "facebook" && isInAppBrowser)
);
}
export function getInsufficientCreditsSubscriptionType(
isVip: boolean,
): "vip" | "topup" {
return isVip ? "topup" : "vip";
}