From c26e59422cea39cc9778d6d2f30c301f87f1eb09 Mon Sep 17 00:00:00 2001 From: Adam Jolicoeur Date: Mon, 12 Oct 2026 09:06:16 -0400 Subject: [PATCH] fix: replace Date.now() UUIDs with crypto.randomUUID() to prevent sync collisions Tasks and archived days used Date.now().toString() for IDs, causing collisions when multiple devices generated IDs at the same millisecond. Supabase upsert (onConflict: id) would overwrite task day_record_id values, severing archived days from their tasks. Replaced Date.now().toString() with crypto.randomUUID() for task IDs, day IDs, project IDs, client IDs, and category IDs. --- src/contexts/TimeTrackingContext.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/contexts/TimeTrackingContext.tsx b/src/contexts/TimeTrackingContext.tsx index 0e7b19b..9a4361e 100644 --- a/src/contexts/TimeTrackingContext.tsx +++ b/src/contexts/TimeTrackingContext.tsx @@ -830,7 +830,7 @@ export const TimeTrackingProvider: React.FC<{ children: React.ReactNode }> = ({ // Create new task const newTask: Task = { - id: Date.now().toString(), + id: crypto.randomUUID(), title, description, startTime: taskStartTime, @@ -901,7 +901,7 @@ export const TimeTrackingProvider: React.FC<{ children: React.ReactNode }> = ({ const carriedOverIds = new Set(carriedOverItems.map(item => item.id)); const dayRecord: DayRecord = { - id: Date.now().toString(), + id: crypto.randomUUID(), date: dayStartTime.toDateString(), tasks: tasks, totalDuration: calcTotalDayDuration(tasks, currentTask, new Date()), @@ -1017,7 +1017,7 @@ export const TimeTrackingProvider: React.FC<{ children: React.ReactNode }> = ({ const addProject = useCallback((project: Omit) => { const newProject: Project = { ...project, - id: Date.now().toString() + id: crypto.randomUUID() }; const next = [...projectsRef.current, newProject]; projectsRef.current = next; @@ -1123,7 +1123,7 @@ export const TimeTrackingProvider: React.FC<{ children: React.ReactNode }> = ({ const trimmed = data.name.trim(); if (!trimmed) return null; const newClient: Client = { - id: Date.now().toString(), + id: crypto.randomUUID(), name: trimmed, archived: false, createdAt: new Date().toISOString(), @@ -1315,7 +1315,7 @@ export const TimeTrackingProvider: React.FC<{ children: React.ReactNode }> = ({ const addCategory = useCallback((category: Omit) => { const newCategory: TaskCategory = { ...category, - id: Date.now().toString() + id: crypto.randomUUID() }; setCategories(prev => [...prev, newCategory]); setHasUnsavedChanges(true);