feat(chat): handle credit-gated send responses
This commit is contained in:
@@ -17,6 +17,12 @@ export class ChatSendResponse {
|
||||
declare readonly timestamp: number;
|
||||
declare readonly image: ChatImageData;
|
||||
declare readonly lockDetail: ChatLockDetailData;
|
||||
declare readonly canSendMessage: boolean;
|
||||
declare readonly cannotSendReason: string | null;
|
||||
declare readonly creditBalance: number;
|
||||
declare readonly creditsCharged: number;
|
||||
declare readonly requiredCredits: number;
|
||||
declare readonly shortfallCredits: number;
|
||||
|
||||
private constructor(input: ChatSendResponseInput) {
|
||||
const data = ChatSendResponseSchema.parse(input);
|
||||
|
||||
@@ -3,17 +3,24 @@
|
||||
*
|
||||
*/
|
||||
import { z } from "zod";
|
||||
import { booleanOrFalse, stringOrNull } from "../nullable-defaults";
|
||||
import { ChatImageSchema, ChatLockDetailSchema } from "./chat_payloads";
|
||||
|
||||
export const ChatSendResponseSchema = z.object({
|
||||
reply: z.string(),
|
||||
audioUrl: z.string().default(""),
|
||||
messageId: z.string(),
|
||||
isGuest: z.boolean().default(false),
|
||||
isGuest: booleanOrFalse,
|
||||
// 函数式 default —— 每次 parse 时重新调 Date.now()(后端不返回 timestamp 时用当下时间)
|
||||
timestamp: z.number().default(() => Date.now()),
|
||||
image: ChatImageSchema,
|
||||
lockDetail: ChatLockDetailSchema,
|
||||
canSendMessage: z.boolean().default(true),
|
||||
cannotSendReason: stringOrNull,
|
||||
creditBalance: z.number().default(0),
|
||||
creditsCharged: z.number().default(0),
|
||||
requiredCredits: z.number().default(0),
|
||||
shortfallCredits: z.number().default(0),
|
||||
});
|
||||
|
||||
export type ChatSendResponseInput = z.input<typeof ChatSendResponseSchema>;
|
||||
|
||||
@@ -18,6 +18,9 @@ export const stringOrEmpty = z
|
||||
.transform((v) => v ?? "")
|
||||
.default("");
|
||||
|
||||
/** `string | null | undefined` → `string | null`(默认 null) */
|
||||
export const stringOrNull = z.string().nullable().default(null);
|
||||
|
||||
/** `number | null | undefined` → `number`(默认 0) */
|
||||
export const numberOrZero = z
|
||||
.number()
|
||||
@@ -30,4 +33,4 @@ export const booleanOrFalse = z
|
||||
.boolean()
|
||||
.nullable()
|
||||
.transform((v) => v ?? false)
|
||||
.default(false);
|
||||
.default(false);
|
||||
|
||||
Reference in New Issue
Block a user