feat(chat): support ai photo viewing

This commit is contained in:
2026-06-23 10:33:20 +08:00
parent cebc8f7443
commit d81abd6efd
16 changed files with 160 additions and 45 deletions
+28
View File
@@ -29,6 +29,13 @@ export interface IntimacyPayload {
relationshipStage?: string;
}
export interface PaywallStatusPayload {
paywallTriggered: boolean;
showUpgrade: boolean;
imageType: string | null;
imageUrl: string | null;
}
export class ChatWebSocket {
private ws: WebSocket | null = null;
private reconnectTimer: ReturnType<typeof setTimeout> | null = null;
@@ -38,6 +45,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;
onPaywallStatus: ((payload: PaywallStatusPayload) => void) | null = null;
onIntimacyUpdate: ((payload: IntimacyPayload) => void) | null = null;
onMoodUpdate: ((mood: string) => void) | null = null;
onError: ((errorMessage: string) => void) | null = null;
@@ -104,6 +113,12 @@ export class ChatWebSocket {
relationshipStage?: string;
mood?: string;
error?: string;
data?: {
imageUrl?: string | null;
paywallTriggered?: boolean;
showUpgrade?: boolean;
imageType?: string | null;
};
};
try {
payload = JSON.parse(data);
@@ -128,6 +143,19 @@ export class ChatWebSocket {
case "voice_ready":
this.onVoiceReady?.(payload.index ?? 0, payload.audioUrl ?? "");
break;
case "image": {
const imageUrl = payload.data?.imageUrl;
if (imageUrl) this.onImage?.(imageUrl);
break;
}
case "paywall_status":
this.onPaywallStatus?.({
paywallTriggered: payload.data?.paywallTriggered ?? false,
showUpgrade: payload.data?.showUpgrade ?? false,
imageType: payload.data?.imageType ?? null,
imageUrl: payload.data?.imageUrl ?? null,
});
break;
case "intimacy_update":
this.onIntimacyUpdate?.({
intimacyChange: payload.intimacyChange,