feat(profile): surface daily free quotas

This commit is contained in:
2026-07-03 16:56:06 +08:00
parent 1fcad49baa
commit d17ab6c23d
11 changed files with 152 additions and 20 deletions
+28
View File
@@ -14,6 +14,25 @@ describe("User", () => {
countryCode: "HK",
intimacy: 0,
dolBalance: 0,
creditBalance: 0,
dailyFreeChatLimit: 30,
dailyFreeChatUsed: 1,
dailyFreeChatRemaining: 29,
dailyFreePrivateLimit: 2,
dailyFreePrivateUsed: 0,
dailyFreePrivateRemaining: 2,
dailyQuotas: {
chat: {
limit: 30,
used: 1,
remaining: 29,
},
privateMessage: {
limit: 2,
used: 0,
remaining: 2,
},
},
personalityTraits: {
caring: 0.5,
playful: 0.5,
@@ -35,6 +54,13 @@ describe("User", () => {
countryCode: "HK",
intimacy: 0,
dolBalance: 0,
creditBalance: 0,
dailyFreeChatLimit: 30,
dailyFreeChatUsed: 1,
dailyFreeChatRemaining: 29,
dailyFreePrivateLimit: 2,
dailyFreePrivateUsed: 0,
dailyFreePrivateRemaining: 2,
personalityTraits: {
caring: 0.5,
playful: 0.5,
@@ -46,6 +72,8 @@ describe("User", () => {
createdAt: "2026-06-12T08:08:27.378706+00:00",
lastMessageAt: "2026-06-24T11:00:23.156561+00:00",
});
expect("dailyQuotas" in user.toJson()).toBe(false);
});
it("parses the latest backend entitlements payload", () => {
+7
View File
@@ -17,6 +17,13 @@ export class User {
declare readonly countryCode: string;
declare readonly intimacy: number;
declare readonly dolBalance: number;
declare readonly creditBalance: number;
declare readonly dailyFreeChatLimit: number;
declare readonly dailyFreeChatUsed: number;
declare readonly dailyFreeChatRemaining: number;
declare readonly dailyFreePrivateLimit: number;
declare readonly dailyFreePrivateUsed: number;
declare readonly dailyFreePrivateRemaining: number;
declare readonly personalityTraits: PersonalityTraits;
declare readonly preferredLanguage: string;
declare readonly createdAt: string;
+6
View File
@@ -15,6 +15,12 @@ export const UserViewSchema = z.object({
intimacy: z.number(),
dolBalance: z.number(),
creditBalance: z.number(),
dailyFreeChatLimit: z.number(),
dailyFreeChatUsed: z.number(),
dailyFreeChatRemaining: z.number(),
dailyFreePrivateLimit: z.number(),
dailyFreePrivateUsed: z.number(),
dailyFreePrivateRemaining: z.number(),
vipExpiresAt: z.string().nullable(),
relationshipStage: z.string(),
currentMood: z.string(),
+7
View File
@@ -18,6 +18,13 @@ export const UserSchema = z.object({
countryCode: stringOrEmpty,
intimacy: numberOrZero,
dolBalance: numberOrZero,
creditBalance: numberOrZero,
dailyFreeChatLimit: numberOrZero,
dailyFreeChatUsed: numberOrZero,
dailyFreeChatRemaining: numberOrZero,
dailyFreePrivateLimit: numberOrZero,
dailyFreePrivateUsed: numberOrZero,
dailyFreePrivateRemaining: numberOrZero,
personalityTraits: PersonalityTraitsSchema.default(PERSONALITY_TRAITS_DEFAULTS),
preferredLanguage: stringOrEmpty,
createdAt: stringOrEmpty,