Upload folder using huggingface_hub
Browse files
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 |
-
|
|
|
|
|
|
|
| 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 |
-
|
| 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 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
}
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 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 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 442 |
}
|
| 443 |
}
|
| 444 |
-
|
|
|
|
| 445 |
} catch {}
|
| 446 |
})();
|
| 447 |
-
}, [getApiBase, TASKS_CACHE_KEY,
|
| 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={()=>{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 && (
|