From b0a6312db6e0f836bbae2b306646b83675866e88 Mon Sep 17 00:00:00 2001
From: iamdoubz <>
Date: Thu, 18 Jun 2026 00:46:43 -0500
Subject: [PATCH] Fix redirects going to wrong pages in certain scenarios
---
src/app/learn/[level]/[slug]/page.tsx | 8 ++++----
src/components/ColoringRunner.tsx | 3 +++
src/components/LessonRunner.tsx | 3 +++
src/components/ShadingRunner.tsx | 3 +++
src/components/TraceRunner.tsx | 3 +++
5 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/src/app/learn/[level]/[slug]/page.tsx b/src/app/learn/[level]/[slug]/page.tsx
index 6a6b1c8..f0d2d09 100644
--- a/src/app/learn/[level]/[slug]/page.tsx
+++ b/src/app/learn/[level]/[slug]/page.tsx
@@ -69,7 +69,7 @@ export default async function LessonPage({ params }: { params: Promise<{ level:
<>
-
+
>
);
@@ -82,7 +82,7 @@ export default async function LessonPage({ params }: { params: Promise<{ level:
<>
-
+
>
);
@@ -97,9 +97,9 @@ export default async function LessonPage({ params }: { params: Promise<{ level:
{isShade ? (
-
+
) : (
-
+
)}
>
diff --git a/src/components/ColoringRunner.tsx b/src/components/ColoringRunner.tsx
index 8d9bebf..5b7f0fc 100644
--- a/src/components/ColoringRunner.tsx
+++ b/src/components/ColoringRunner.tsx
@@ -1,6 +1,7 @@
"use client";
import { useCallback, useEffect, useRef, useState } from "react";
import Link from "next/link";
+import { useRouter } from "next/navigation";
import { loadProgressDrawing, saveProgressDrawing, saveFinalDrawing, fileToDataURL } from "./drawingPersistence";
interface Meta { level: string; levelName: string; sublevel: number; title: string; emoji: string; intro: string; baseSvg: string }
@@ -34,6 +35,7 @@ function newLayer(id: number, name: string): Layer {
export default function ColoringRunner({ meta, loggedIn, username, alreadyEarned }: {
meta: Meta; loggedIn: boolean; username: string; alreadyEarned: boolean;
}) {
+ const router = useRouter();
const [done, setDone] = useState(false);
const [finalImage, setFinalImage] = useState(null);
const [uploadMsg, setUploadMsg] = useState("");
@@ -223,6 +225,7 @@ export default function ColoringRunner({ meta, loggedIn, username, alreadyEarned
}
if (hasContent()) { const data = flatten(true); setFinalImage(data); if (loggedIn) await saveFinalDrawing(meta.level, meta.sublevel, "canvas", data); }
setDone(true);
+ router.refresh(); // refresh cached Learn page with the new completion
}
async function onUpload(e: React.ChangeEvent) {
const file = e.target.files?.[0]; if (!file) return;
diff --git a/src/components/LessonRunner.tsx b/src/components/LessonRunner.tsx
index db69505..fb3fa5f 100644
--- a/src/components/LessonRunner.tsx
+++ b/src/components/LessonRunner.tsx
@@ -1,6 +1,7 @@
"use client";
import { useCallback, useEffect, useRef, useState } from "react";
import Link from "next/link";
+import { useRouter } from "next/navigation";
import { badgeSvgMarkup, badgeFullSvg } from "./BadgeArt";
import {
loadProgressDrawing,
@@ -70,6 +71,7 @@ export default function LessonRunner({
completedSteps: number[];
alreadyEarned: boolean;
}) {
+ const router = useRouter();
const lastIndex = steps.length - 1;
const startIndex = Math.min(completedSteps.length, lastIndex);
const [idx, setIdx] = useState(startIndex);
@@ -288,6 +290,7 @@ export default function LessonRunner({
}
setEarned(loggedIn);
setFinished(true);
+ router.refresh();
}
async function onUpload(e: React.ChangeEvent) {
diff --git a/src/components/ShadingRunner.tsx b/src/components/ShadingRunner.tsx
index 8d301e3..d01cf8b 100644
--- a/src/components/ShadingRunner.tsx
+++ b/src/components/ShadingRunner.tsx
@@ -1,6 +1,7 @@
"use client";
import { useCallback, useEffect, useRef, useState } from "react";
import Link from "next/link";
+import { useRouter } from "next/navigation";
import { badgeSvgMarkup, badgeFullSvg } from "./BadgeArt";
import GripPressureDemo from "./GripPressureDemo";
import {
@@ -33,6 +34,7 @@ export default function ShadingRunner({
}: {
meta: Meta; steps: StepData[]; loggedIn: boolean; username: string; completedSteps: number[]; alreadyEarned: boolean;
}) {
+ const router = useRouter();
const lastIndex = steps.length - 1;
const [idx, setIdx] = useState(Math.min(completedSteps.length, lastIndex));
const [finished, setFinished] = useState(alreadyEarned);
@@ -182,6 +184,7 @@ export default function ShadingRunner({
}
setEarned(loggedIn);
setFinished(true);
+ router.refresh();
}
async function onUpload(e: React.ChangeEvent) {
diff --git a/src/components/TraceRunner.tsx b/src/components/TraceRunner.tsx
index 94e5f94..633acbc 100644
--- a/src/components/TraceRunner.tsx
+++ b/src/components/TraceRunner.tsx
@@ -1,6 +1,7 @@
"use client";
import { useCallback, useEffect, useRef, useState } from "react";
import Link from "next/link";
+import { useRouter } from "next/navigation";
import { badgeSvgMarkup, badgeFullSvg } from "./BadgeArt";
import LineDraw from "./LineDraw";
import { loadProgressDrawing, saveProgressDrawing, saveFinalDrawing, exportCanvasToDataURL, fileToDataURL } from "./drawingPersistence";
@@ -20,6 +21,7 @@ export default function TraceRunner({ meta, steps, loggedIn, username, completed
meta: Meta; steps: StepData[]; loggedIn: boolean; username: string; completedSteps: number[]; alreadyEarned: boolean;
carryImage?: string; nextHref?: string; nextLabel?: string;
}) {
+ const router = useRouter();
const lastIndex = steps.length - 1;
const [idx, setIdx] = useState(Math.min(completedSteps.length, lastIndex));
const [finished, setFinished] = useState(alreadyEarned);
@@ -111,6 +113,7 @@ export default function TraceRunner({ meta, steps, loggedIn, username, completed
}
setEarned(loggedIn && !!meta.badgeKey);
setFinished(true);
+ router.refresh(); // refresh cached pages (Learn, gating) with the new progress
}
async function onUpload(e: React.ChangeEvent) {
const file = e.target.files?.[0]; if (!file) return;