feat(chat): migrate chat protocol to lock detail

This commit is contained in:
2026-06-24 14:06:30 +08:00
parent c280a3c1ea
commit 42c03f8901
34 changed files with 609 additions and 373 deletions
+22 -39
View File
@@ -6,8 +6,6 @@
* - onTyping(isTyping)
* - onSentence(index, text, total, done) ← AI 逐句推送
* - onVoiceReady(index, audioUrl)
* - onIntimacyUpdate(intimacyChange, newIntimacy, relationshipStage)
* - onMoodUpdate(mood)
* - onError(errorMessage)
*/
import { getApiConfig } from "@/core/net/config/api_config";
@@ -23,17 +21,13 @@ export interface SentencePayload {
done: boolean;
}
export interface IntimacyPayload {
intimacyChange?: number;
newIntimacy?: number;
relationshipStage?: string;
}
export interface PaywallStatusPayload {
paywallTriggered: boolean;
locked: boolean;
showContent: boolean;
showUpgrade: boolean;
imageType: string | null;
imageUrl: string | null;
reason: string | null;
hint: string | null;
detail: Record<string, unknown> | null;
}
export class ChatWebSocket {
@@ -46,10 +40,8 @@ export class ChatWebSocket {
onTyping: ((isTyping: boolean) => void) | null = null;
onSentence: ((payload: SentencePayload) => void) | null = null;
onVoiceReady: ((index: number, audioUrl: string) => void) | null = null;
onImage: ((imageUrl: string) => void) | null = null;
onImage: ((url: string) => void) | null = null;
onPaywallStatus: ((payload: PaywallStatusPayload) => void) | null = null;
onIntimacyUpdate: ((payload: IntimacyPayload) => void) | null = null;
onMoodUpdate: ((mood: string) => void) | null = null;
onError: ((errorMessage: string) => void) | null = null;
constructor(
@@ -141,16 +133,13 @@ export class ChatWebSocket {
total?: number;
done?: boolean;
audioUrl?: string;
intimacyChange?: number;
newIntimacy?: number;
relationshipStage?: string;
mood?: string;
error?: string;
data?: {
imageUrl?: string | null;
paywallTriggered?: boolean;
showUpgrade?: boolean;
imageType?: string | null;
image?: {
type?: string | null;
url?: string | null;
};
lockDetail?: Partial<PaywallStatusPayload>;
};
};
try {
@@ -178,28 +167,22 @@ export class ChatWebSocket {
this.onVoiceReady?.(payload.index ?? 0, payload.audioUrl ?? "");
break;
case "image": {
const imageUrl = payload.data?.imageUrl;
if (imageUrl) this.onImage?.(imageUrl);
const url = payload.data?.image?.url;
if (url) this.onImage?.(url);
break;
}
case "paywall_status":
case "paywall_status": {
const lockDetail = payload.data?.lockDetail;
this.onPaywallStatus?.({
paywallTriggered: payload.data?.paywallTriggered ?? false,
showUpgrade: payload.data?.showUpgrade ?? false,
imageType: payload.data?.imageType ?? null,
imageUrl: payload.data?.imageUrl ?? null,
locked: lockDetail?.locked ?? false,
showContent: lockDetail?.showContent ?? true,
showUpgrade: lockDetail?.showUpgrade ?? false,
reason: lockDetail?.reason ?? null,
hint: lockDetail?.hint ?? null,
detail: lockDetail?.detail ?? null,
});
break;
case "intimacy_update":
this.onIntimacyUpdate?.({
intimacyChange: payload.intimacyChange,
newIntimacy: payload.newIntimacy,
relationshipStage: payload.relationshipStage,
});
break;
case "mood_update":
if (payload.mood) this.onMoodUpdate?.(payload.mood);
break;
}
case "error":
this.onError?.(payload.error ?? "Unknown error");
break;