feat(daily-task): 增加每日任务倒计时时间

This commit is contained in:
huanghaipeng 2026-09-07 14:56:21 +08:00
parent 04ed8d700f
commit af6623a823
3 changed files with 12 additions and 2 deletions

View File

@ -30,6 +30,7 @@ export type DailyWeeklyTaskData = {
version: 2;
dayKey: string;
weekKey: string;
dayEndsAt: number;
weekEndsAt: number;
serverNow: number;
dailyTasks: DailyTask[];

View File

@ -12,6 +12,10 @@ export function getDayKey(nowMs = Date.now()): string {
return new Date(nowMs + SHANGHAI_OFFSET_MS).toISOString().slice(0, 10);
}
export function getDayEndsAt(nowMs = Date.now()): number {
return Date.parse(`${getDayKey(nowMs)}T00:00:00+08:00`) + DAY_MS;
}
export function getWeekKey(nowMs = Date.now()): string {
const shifted = new Date(nowMs + SHANGHAI_OFFSET_MS);
const day = shifted.getUTCDay() || 7;
@ -61,6 +65,7 @@ export function refreshTaskData(
): { data: DailyWeeklyTaskData; changed: boolean } {
const dayKey = getDayKey(nowMs);
const weekKey = getWeekKey(nowMs);
const dayEndsAt = getDayEndsAt(nowMs);
const weekEndsAt = getWeekEndsAt(nowMs);
const parsed = typeof stored === "string" ? safeParse(stored) : stored;
const valid = parsed && (parsed as DailyWeeklyTaskData).version === 2
@ -72,7 +77,8 @@ export function refreshTaskData(
const newDay = !old || old.dayKey !== dayKey;
if (!newDay && !newWeek) {
const changed = old.weekEndsAt !== weekEndsAt;
const changed = old.dayEndsAt !== dayEndsAt || old.weekEndsAt !== weekEndsAt;
old.dayEndsAt = dayEndsAt;
old.weekEndsAt = weekEndsAt;
old.serverNow = nowMs;
applyLocks(old.dailyTasks);
@ -85,6 +91,7 @@ export function refreshTaskData(
version: 2,
dayKey,
weekKey,
dayEndsAt,
weekEndsAt,
serverNow: nowMs,
dailyTasks: selectDailyTasks(uid, dayKey, Math.max(1, level), previousTaskIds),

View File

@ -12,11 +12,12 @@ registerHooks({
},
});
const { getDayKey, getWeekKey, getWeekEndsAt, refreshTaskData, mergeClientProgress, claimDaily, claimWeekly } = await import(serviceUrl);
const { getDayKey, getDayEndsAt, getWeekKey, getWeekEndsAt, refreshTaskData, mergeClientProgress, claimDaily, claimWeekly } = await import(serviceUrl);
test("uses Shanghai natural day and Monday week keys", () => {
assert.equal(getDayKey(Date.parse("2026-09-06T15:59:59Z")), "2026-09-06");
assert.equal(getDayKey(Date.parse("2026-09-06T16:00:00Z")), "2026-09-07");
assert.equal(getDayEndsAt(Date.parse("2026-09-06T16:00:00Z")), Date.parse("2026-09-08T00:00:00+08:00"));
assert.equal(getWeekKey(Date.parse("2026-09-06T16:00:00Z")), "2026-09-07");
assert.equal(getWeekEndsAt(Date.parse("2026-09-06T16:00:00Z")), Date.parse("2026-09-14T00:00:00+08:00"));
});
@ -28,6 +29,7 @@ test("returns current server time and refreshes it on repeated reads", () => {
const second = refreshTaskData(JSON.stringify(first), "user-time", 20, secondNow);
assert.equal(second.changed, false);
assert.equal(second.data.serverNow, secondNow);
assert.equal(second.data.dayEndsAt, Date.parse("2026-09-08T00:00:00+08:00"));
assert.equal(second.data.weekEndsAt, Date.parse("2026-09-14T00:00:00+08:00"));
});