setting up test functionality

This commit is contained in:
masongga
2026-05-23 16:47:42 -06:00
parent 2ad9e42f3f
commit 94dbd18946
27 changed files with 1451 additions and 230 deletions

74
lib/daily-quiz-storage.ts Normal file
View File

@@ -0,0 +1,74 @@
import {
computeAvatarCondition,
normalizeDailyQuizAnswers,
type AvatarCondition,
type DailyQuizAnswers,
type DailyQuizSubmission,
} from "@/lib/avatar-state";
import { notifyHabitPetDataUpdated } from "@/lib/app-events";
const STORAGE_KEY = "habit-pet-daily-quiz";
export function getTodayDateKey(date = new Date()) {
return date.toISOString().slice(0, 10);
}
function normalizeSubmission(
submission: DailyQuizSubmission,
): DailyQuizSubmission {
const answers = normalizeDailyQuizAnswers(submission.answers);
return {
...submission,
answers,
condition: computeAvatarCondition(answers),
};
}
export function getDailyQuizSubmission(): DailyQuizSubmission | null {
if (typeof window === "undefined") {
return null;
}
const raw = window.localStorage.getItem(STORAGE_KEY);
if (!raw) {
return null;
}
try {
return normalizeSubmission(JSON.parse(raw) as DailyQuizSubmission);
} catch {
return null;
}
}
export function hasCompletedDailyQuizToday() {
const submission = getDailyQuizSubmission();
return submission?.date === getTodayDateKey();
}
export function saveDailyQuizSubmission(
answers: DailyQuizAnswers,
): DailyQuizSubmission {
const submission: DailyQuizSubmission = {
date: getTodayDateKey(),
answers,
condition: computeAvatarCondition(answers),
};
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(submission));
notifyHabitPetDataUpdated();
return submission;
}
export function getAvatarConditionForToday(): AvatarCondition | null {
const submission = getDailyQuizSubmission();
if (!submission || submission.date !== getTodayDateKey()) {
return null;
}
return submission.condition;
}