feat(chat): migrate chat protocol to lock detail
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user