checking other branch

This commit is contained in:
masongga
2026-05-23 18:59:27 -06:00
parent 94dbd18946
commit 7deb3e83cb
4 changed files with 193 additions and 16 deletions

View File

@@ -6,7 +6,6 @@ export type DailyQuizAnswers = {
energy: number;
sleepLength: number;
sleepQuality: number;
journal: string;
};
export type AvatarCondition = {
@@ -29,7 +28,6 @@ export const defaultDailyQuizAnswers: DailyQuizAnswers = {
energy: 3,
sleepLength: 3,
sleepQuality: 3,
journal: "",
};
export function computeAvatarCondition(
@@ -71,6 +69,7 @@ export const defaultAvatarCondition: AvatarCondition = {
export function normalizeDailyQuizAnswers(
answers: Partial<DailyQuizAnswers> & {
mood?: number;
journal?: string;
},
): DailyQuizAnswers {
const scaleValue = (value: number | undefined, fallback: number) => {
@@ -92,6 +91,5 @@ export function normalizeDailyQuizAnswers(
answers.sleepQuality,
defaultDailyQuizAnswers.sleepQuality,
),
journal: answers.journal ?? "",
};
}

110
lib/journal-storage.ts Normal file
View File

@@ -0,0 +1,110 @@
import { createClient } from "@/lib/supabase/client";
export type JournalEntry = {
entryDate: string;
content: string;
};
const LOCAL_STORAGE_KEY = "habit-pet-journal";
export function getTodayDateKey(date = new Date()) {
return date.toISOString().slice(0, 10);
}
function getLocalJournalEntry(entryDate = getTodayDateKey()): JournalEntry | null {
if (typeof window === "undefined") {
return null;
}
const raw = window.localStorage.getItem(LOCAL_STORAGE_KEY);
if (!raw) {
return null;
}
try {
const entry = JSON.parse(raw) as JournalEntry;
return entry.entryDate === entryDate ? entry : null;
} catch {
return null;
}
}
function saveLocalJournalEntry(content: string, entryDate = getTodayDateKey()) {
const entry: JournalEntry = { entryDate, content };
window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(entry));
return entry;
}
export async function getJournalEntryForToday(): Promise<JournalEntry | null> {
const entryDate = getTodayDateKey();
const supabase = createClient();
const {
data: { user },
} = await supabase.auth.getUser();
if (!user) {
return getLocalJournalEntry(entryDate);
}
const { data, error } = await supabase
.from("journal_entries")
.select("entry_date, content")
.eq("user_id", user.id)
.eq("entry_date", entryDate)
.maybeSingle();
if (error) {
console.error("Failed to load journal entry:", error.message);
return getLocalJournalEntry(entryDate);
}
if (!data) {
return null;
}
return {
entryDate: data.entry_date,
content: data.content,
};
}
export async function saveJournalEntry(content: string): Promise<JournalEntry> {
const entryDate = getTodayDateKey();
const supabase = createClient();
const {
data: { user },
} = await supabase.auth.getUser();
if (!user) {
return saveLocalJournalEntry(content, entryDate);
}
const { data, error } = await supabase
.from("journal_entries")
.upsert(
{
user_id: user.id,
entry_date: entryDate,
content,
updated_at: new Date().toISOString(),
},
{ onConflict: "user_id,entry_date" },
)
.select("entry_date, content")
.single();
if (error) {
console.error("Failed to save journal entry:", error.message);
return saveLocalJournalEntry(content, entryDate);
}
return {
entryDate: data.entry_date,
content: data.content,
};
}
export function hasJournalEntryToday(entry: JournalEntry | null) {
return entry?.entryDate === getTodayDateKey() && entry.content.trim().length > 0;
}