linguabot commited on
Commit
e50e6a0
·
verified ·
1 Parent(s): 4b427a2

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. client/src/components/Refinity.tsx +61 -42
client/src/components/Refinity.tsx CHANGED
@@ -176,6 +176,8 @@ const Refinity: React.FC = () => {
176
  return String(params.get('taskId') || '');
177
  } catch { return ''; }
178
  });
 
 
179
  const [versions, setVersions] = React.useState<Version[]>([]);
180
  const [currentVersionId, setCurrentVersionId] = React.useState<string | null>(() => {
181
  try {
@@ -345,36 +347,35 @@ const Refinity: React.FC = () => {
345
  const cached = JSON.parse(sessionStorage.getItem(TASKS_CACHE_KEY) || '[]');
346
  if (Array.isArray(cached) && cached.length && tasks.length === 0) {
347
  setTasks(cached);
348
- if (!selectedTaskId) {
 
 
349
  const initTaskId = initialRouteRef.current?.taskId;
350
  const isTutorial = getTutorialMode();
351
  if (initTaskId && cached.some((t:any)=>t.id===initTaskId)) {
352
- setSelectedTaskId(initTaskId);
353
  if (isTutorial) {
354
  const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
355
  if (weekNumber > 0) {
356
  localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, initTaskId);
357
  }
358
  }
 
359
  } else if (cached.length) {
360
  if (isTutorial) {
361
  const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
362
  if (weekNumber > 0) {
363
  const savedTaskId = localStorage.getItem(`tutorial_selected_task_week_${weekNumber}`);
364
  if (savedTaskId && cached.some((t:any)=>t.id===savedTaskId)) {
365
- setSelectedTaskId(savedTaskId);
366
  } else {
367
- setSelectedTaskId(cached[0].id);
368
  localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, cached[0].id);
369
  }
370
- } else {
371
- setSelectedTaskId(cached[0].id);
372
  }
373
- } else {
374
- setSelectedTaskId(cached[0].id);
375
  }
 
376
  }
377
- }
 
378
  }
379
  } catch {}
380
  // In tutorial mode, include weekNumber in query
@@ -406,45 +407,49 @@ const Refinity: React.FC = () => {
406
  setTasks(normalized);
407
  try { sessionStorage.setItem(TASKS_CACHE_KEY, JSON.stringify(normalized)); } catch {}
408
  // Apply initial route task selection if available
409
- const initTaskId = initialRouteRef.current?.taskId;
410
- if (normalized.length) {
411
- if (initTaskId && normalized.some(t => t.id === initTaskId)) {
412
- setSelectedTaskId(initTaskId);
413
- if (currentTutorialMode) {
414
- const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
415
- if (weekNumber > 0) {
416
- localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, initTaskId);
417
- }
418
- }
419
- } else if (!selectedTaskId) {
420
- // In tutorial mode, try to restore from localStorage
421
- if (currentTutorialMode) {
422
- const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
423
- if (weekNumber > 0) {
424
- const savedTaskId = localStorage.getItem(`tutorial_selected_task_week_${weekNumber}`);
425
- if (savedTaskId && normalized.some(t => t.id === savedTaskId)) {
426
- setSelectedTaskId(savedTaskId);
427
- } else {
428
- setSelectedTaskId(normalized[0].id);
429
- localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, normalized[0].id);
430
  }
431
- } else {
432
- setSelectedTaskId(normalized[0].id);
433
  }
 
434
  } else {
435
- setSelectedTaskId(normalized[0].id);
436
- }
437
- } else if (currentTutorialMode && selectedTaskId && normalized.some(t => t.id === selectedTaskId)) {
438
- // Persist selected task in tutorial mode
439
- const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
440
- if (weekNumber > 0) {
441
- localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, selectedTaskId);
 
 
 
 
 
 
442
  }
443
  }
444
- }
 
445
  } catch {}
446
  })();
447
- }, [getApiBase, TASKS_CACHE_KEY, selectedTaskId, tasks.length, getTutorialMode]);
448
 
449
  // Load versions when task changes
450
  React.useEffect(() => {
@@ -1110,7 +1115,21 @@ const Refinity: React.FC = () => {
1110
  <ul className="relative max-h-64 overflow-auto text-sm">
1111
  {tasks.map(t => (
1112
  <li key={t.id}>
1113
- <button type="button" onClick={()=>{ setSelectedTaskId(t.id); setTaskMenuOpen(false); }} className={`w-full text-left px-3 py-1.5 text-gray-900 hover:bg-white/30 ${selectedTaskId===t.id ? 'bg-indigo-600/20' : ''}`}>{t.title}</button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1114
  </li>
1115
  ))}
1116
  {tasks.length===0 && (
 
176
  return String(params.get('taskId') || '');
177
  } catch { return ''; }
178
  });
179
+ // Track user-initiated task selections to prevent effect from overriding them
180
+ const userSelectedTaskIdRef = React.useRef<string | null>(null);
181
  const [versions, setVersions] = React.useState<Version[]>([]);
182
  const [currentVersionId, setCurrentVersionId] = React.useState<string | null>(() => {
183
  try {
 
347
  const cached = JSON.parse(sessionStorage.getItem(TASKS_CACHE_KEY) || '[]');
348
  if (Array.isArray(cached) && cached.length && tasks.length === 0) {
349
  setTasks(cached);
350
+ // Use a function to get current selectedTaskId to avoid stale closure
351
+ setSelectedTaskId(prev => {
352
+ if (prev) return prev; // Don't override if already set
353
  const initTaskId = initialRouteRef.current?.taskId;
354
  const isTutorial = getTutorialMode();
355
  if (initTaskId && cached.some((t:any)=>t.id===initTaskId)) {
 
356
  if (isTutorial) {
357
  const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
358
  if (weekNumber > 0) {
359
  localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, initTaskId);
360
  }
361
  }
362
+ return initTaskId;
363
  } else if (cached.length) {
364
  if (isTutorial) {
365
  const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
366
  if (weekNumber > 0) {
367
  const savedTaskId = localStorage.getItem(`tutorial_selected_task_week_${weekNumber}`);
368
  if (savedTaskId && cached.some((t:any)=>t.id===savedTaskId)) {
369
+ return savedTaskId;
370
  } else {
 
371
  localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, cached[0].id);
372
  }
 
 
373
  }
 
 
374
  }
375
+ return cached[0].id;
376
  }
377
+ return prev;
378
+ });
379
  }
380
  } catch {}
381
  // In tutorial mode, include weekNumber in query
 
407
  setTasks(normalized);
408
  try { sessionStorage.setItem(TASKS_CACHE_KEY, JSON.stringify(normalized)); } catch {}
409
  // Apply initial route task selection if available
410
+ // Use functional update to get current state and avoid overriding user selections
411
+ setSelectedTaskId(prev => {
412
+ // Don't override if user just selected a task
413
+ const currentUserSelection = userSelectedTaskIdRef.current;
414
+ if (currentUserSelection && normalized.some(t => t.id === currentUserSelection)) {
415
+ return currentUserSelection;
416
+ }
417
+ // If current selection is valid, keep it
418
+ if (prev && normalized.some(t => t.id === prev)) {
419
+ return prev;
420
+ }
421
+ // Otherwise, set initial selection
422
+ const initTaskId = initialRouteRef.current?.taskId;
423
+ if (normalized.length) {
424
+ if (initTaskId && normalized.some(t => t.id === initTaskId)) {
425
+ if (currentTutorialMode) {
426
+ const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
427
+ if (weekNumber > 0) {
428
+ localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, initTaskId);
 
 
429
  }
 
 
430
  }
431
+ return initTaskId;
432
  } else {
433
+ // In tutorial mode, try to restore from localStorage
434
+ if (currentTutorialMode) {
435
+ const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
436
+ if (weekNumber > 0) {
437
+ const savedTaskId = localStorage.getItem(`tutorial_selected_task_week_${weekNumber}`);
438
+ if (savedTaskId && normalized.some(t => t.id === savedTaskId)) {
439
+ return savedTaskId;
440
+ } else {
441
+ localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, normalized[0].id);
442
+ }
443
+ }
444
+ }
445
+ return normalized[0].id;
446
  }
447
  }
448
+ return prev;
449
+ });
450
  } catch {}
451
  })();
452
+ }, [getApiBase, TASKS_CACHE_KEY, tasks.length, getTutorialMode]);
453
 
454
  // Load versions when task changes
455
  React.useEffect(() => {
 
1115
  <ul className="relative max-h-64 overflow-auto text-sm">
1116
  {tasks.map(t => (
1117
  <li key={t.id}>
1118
+ <button type="button" onClick={()=>{
1119
+ userSelectedTaskIdRef.current = t.id;
1120
+ setSelectedTaskId(t.id);
1121
+ setTaskMenuOpen(false);
1122
+ // Persist user selection to localStorage in tutorial mode
1123
+ try {
1124
+ const isTutorial = localStorage.getItem('refinityMode') === 'tutorial';
1125
+ if (isTutorial) {
1126
+ const weekNumber = parseInt(localStorage.getItem('tutorialWeekNumber') || '0');
1127
+ if (weekNumber > 0) {
1128
+ localStorage.setItem(`tutorial_selected_task_week_${weekNumber}`, t.id);
1129
+ }
1130
+ }
1131
+ } catch {}
1132
+ }} className={`w-full text-left px-3 py-1.5 text-gray-900 hover:bg-white/30 ${selectedTaskId===t.id ? 'bg-indigo-600/20' : ''}`}>{t.title}</button>
1133
  </li>
1134
  ))}
1135
  {tasks.length===0 && (