refactor(chat): clean stale mocks and external browser helpers

This commit is contained in:
2026-06-30 14:32:58 +08:00
parent 958a0f8ffd
commit 1fed21fa2f
11 changed files with 61 additions and 170 deletions
+2 -50
View File
@@ -1,11 +1,8 @@
"use client"; "use client";
import type { LoginStatus } from "@/data/dto/auth"; import type { LoginStatus } from "@/data/dto/auth";
import { AppStorage } from "@/data/storage/app/app_storage"; import { ROUTE_BUILDERS } from "@/router/routes";
import { AuthStorage } from "@/data/storage/auth/auth_storage"; import { AppEnvUtil, BrowserDetector } from "@/utils";
import { UserStorage } from "@/data/storage/user/user_storage";
import { ROUTE_BUILDERS, ROUTES } from "@/router/routes";
import { AppEnvUtil, BrowserDetector, todayString, UrlLauncherUtil } from "@/utils";
export interface ExternalBrowserPromptState { export interface ExternalBrowserPromptState {
hasInitialized: boolean; hasInitialized: boolean;
@@ -33,51 +30,6 @@ export function shouldStartExternalBrowserPrompt({
); );
} }
export async function resolveExternalBrowserPromptEligibility(): Promise<{
canShow: boolean;
today: string;
}> {
const today = todayString();
const result = await AppStorage.canShowExternalBrowserDialog(today);
return {
canShow: result.success && result.data,
today,
};
}
export function recordExternalBrowserPromptShown(today: string): Promise<unknown> {
return AppStorage.recordExternalBrowserDialogShown(today);
}
export async function openChatInExternalBrowser(): Promise<void> {
const authStorage = AuthStorage.getInstance();
const userStorage = UserStorage.getInstance();
const [deviceIdR, facebookIdR, avatarUrlR] = await Promise.all([
authStorage.getDeviceId(),
authStorage.getFacebookId(),
userStorage.getAvatarUrl(),
]);
const deviceId = deviceIdR.success ? deviceIdR.data : null;
const facebookId = facebookIdR.success ? facebookIdR.data : null;
const avatarUrl = avatarUrlR.success ? avatarUrlR.data : null;
if (deviceId && facebookId) {
UrlLauncherUtil.openUrlWithExternalBrowser(
ROUTE_BUILDERS.chatDeviceId(deviceId),
{
queryParams: {
fbid: facebookId,
...(avatarUrl ? { avatarUrl } : {}),
},
},
);
return;
}
UrlLauncherUtil.openUrlWithExternalBrowser(ROUTES.splash);
}
export function getChatPaywallSubscriptionUrl(): string { export function getChatPaywallSubscriptionUrl(): string {
return ROUTE_BUILDERS.subscription("vip", { return ROUTE_BUILDERS.subscription("vip", {
returnTo: "chat", returnTo: "chat",
+5 -3
View File
@@ -7,6 +7,11 @@ import { useRouter } from "next/navigation";
import { useAuthState } from "@/stores/auth/auth-context"; import { useAuthState } from "@/stores/auth/auth-context";
import { useChatDispatch, useChatState } from "@/stores/chat/chat-context"; import { useChatDispatch, useChatState } from "@/stores/chat/chat-context";
import { useUserState } from "@/stores/user/user-context"; import { useUserState } from "@/stores/user/user-context";
import {
openChatInExternalBrowser,
recordExternalBrowserPromptShown,
resolveExternalBrowserPromptEligibility,
} from "@/lib/chat/chat_external_browser";
import { MobileShell } from "@/app/_components/core"; import { MobileShell } from "@/app/_components/core";
@@ -25,9 +30,6 @@ import {
getChatPaywallNavigationUrl, getChatPaywallNavigationUrl,
getInsufficientCreditsSubscriptionType, getInsufficientCreditsSubscriptionType,
isChatDevelopmentEnvironment, isChatDevelopmentEnvironment,
openChatInExternalBrowser,
recordExternalBrowserPromptShown,
resolveExternalBrowserPromptEligibility,
shouldStartExternalBrowserPrompt, shouldStartExternalBrowserPrompt,
} from "./chat-screen.helpers"; } from "./chat-screen.helpers";
import styles from "./components/chat-screen.module.css"; import styles from "./components/chat-screen.module.css";
@@ -1,28 +0,0 @@
{
"code": 200,
"message": "success",
"success": true,
"data": {
"reply": "",
"audioUrl": "",
"messageId": "msg_blocked_daily_001",
"isGuest": false,
"timestamp": 1782180665000,
"image": {
"type": null,
"url": null
},
"lockDetail": {
"locked": true,
"showContent": false,
"showUpgrade": true,
"reason": "daily_limit",
"hint": "免费消息额度已用完,开通会员后可以继续聊天。",
"detail": {
"type": "daily_msg_limit",
"usedToday": 20,
"limit": 20
}
}
}
}
@@ -1,28 +0,0 @@
{
"code": 200,
"message": "success",
"success": true,
"data": {
"reply": "",
"audioUrl": "",
"messageId": "",
"isGuest": true,
"timestamp": 1782197944984,
"image": {
"type": null,
"url": null
},
"lockDetail": {
"locked": true,
"showContent": false,
"showUpgrade": true,
"reason": "daily_limit",
"hint": "Log in to get more free chat messages.",
"detail": {
"type": "daily_msg_limit",
"usedToday": 5,
"limit": 5
}
}
}
}
@@ -1,14 +0,0 @@
{
"code": 200,
"message": "success",
"success": true,
"data": {
"unlocked": false,
"content": null,
"showUpgrade": true,
"paywallTriggered": true,
"privateFreeLimit": 1,
"privateUsedToday": 1,
"reason": "quota_exceeded"
}
}
@@ -1,9 +0,0 @@
{
"type": "sentence",
"data": {
"index": 0,
"text": "I am listening.",
"total": 2,
"done": false
}
}
@@ -1,6 +0,0 @@
{
"type": "connected",
"data": {
"userId": "user_mock_001"
}
}
@@ -1,6 +0,0 @@
{
"type": "error",
"data": {
"message": "WebSocket connection interrupted."
}
}
@@ -1,9 +0,0 @@
{
"type": "image",
"data": {
"image": {
"type": "elio_schedule",
"url": "https://cdn.cozsweet.com/mock/chat/elio-schedule-001.jpg"
}
}
}
@@ -1,17 +0,0 @@
{
"type": "paywall_status",
"data": {
"lockDetail": {
"locked": true,
"showContent": false,
"showUpgrade": true,
"reason": "daily_limit",
"hint": "免费消息额度已用完,开通会员后可以继续聊天。",
"detail": {
"type": "daily_msg_limit",
"usedToday": 20,
"limit": 20
}
}
}
}
+54
View File
@@ -0,0 +1,54 @@
"use client";
import { AppStorage } from "@/data/storage/app/app_storage";
import { AuthStorage } from "@/data/storage/auth/auth_storage";
import { UserStorage } from "@/data/storage/user/user_storage";
import { ROUTE_BUILDERS, ROUTES } from "@/router/routes";
import { todayString, UrlLauncherUtil } from "@/utils";
export async function resolveExternalBrowserPromptEligibility(): Promise<{
canShow: boolean;
today: string;
}> {
const today = todayString();
const result = await AppStorage.canShowExternalBrowserDialog(today);
return {
canShow: result.success && result.data,
today,
};
}
export function recordExternalBrowserPromptShown(
today: string,
): Promise<unknown> {
return AppStorage.recordExternalBrowserDialogShown(today);
}
export async function openChatInExternalBrowser(): Promise<void> {
const authStorage = AuthStorage.getInstance();
const userStorage = UserStorage.getInstance();
const [deviceIdR, facebookIdR, avatarUrlR] = await Promise.all([
authStorage.getDeviceId(),
authStorage.getFacebookId(),
userStorage.getAvatarUrl(),
]);
const deviceId = deviceIdR.success ? deviceIdR.data : null;
const facebookId = facebookIdR.success ? facebookIdR.data : null;
const avatarUrl = avatarUrlR.success ? avatarUrlR.data : null;
if (deviceId && facebookId) {
UrlLauncherUtil.openUrlWithExternalBrowser(
ROUTE_BUILDERS.chatDeviceId(deviceId),
{
queryParams: {
fbid: facebookId,
...(avatarUrl ? { avatarUrl } : {}),
},
},
);
return;
}
UrlLauncherUtil.openUrlWithExternalBrowser(ROUTES.splash);
}