Skip to content

Commit e8df55f

Browse files
committed
fix(react): stale lesson data after navigation
1 parent 1eb41fd commit e8df55f

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

packages/react/src/Panels/WorkspacePanel.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ export function WorkspacePanel({ tutorialStore, theme }: Props) {
3636
const hasPreviews = tutorialStore.hasPreviews();
3737
const hideTerminalPanel = !tutorialStore.hasTerminalPanel();
3838

39+
/**
40+
* Re-render when lesson changes. Some children are accessing non-reactive properties of store,
41+
* so we need to re-render whole application in order to get those stale references updated.
42+
*/
43+
useStore(tutorialStore.ref);
44+
3945
const terminalPanelRef = useRef<ImperativePanelHandle>(null);
4046
const terminalExpanded = useRef(false);
4147

@@ -89,6 +95,7 @@ function EditorSection({ theme, tutorialStore, hasEditor }: PanelProps) {
8995
const selectedFile = useStore(tutorialStore.selectedFile);
9096
const currentDocument = useStore(tutorialStore.currentDocument);
9197
const lessonFullyLoaded = useStore(tutorialStore.lessonFullyLoaded);
98+
const storeRef = useStore(tutorialStore.ref);
9299

93100
const lesson = tutorialStore.lesson!;
94101

@@ -116,7 +123,7 @@ function EditorSection({ theme, tutorialStore, hasEditor }: PanelProps) {
116123
} else {
117124
setHelpAction('reset');
118125
}
119-
}, [tutorialStore.ref]);
126+
}, [storeRef]);
120127

121128
return (
122129
<Panel
@@ -128,7 +135,7 @@ function EditorSection({ theme, tutorialStore, hasEditor }: PanelProps) {
128135
className="transition-theme bg-tk-elements-panel-backgroundColor text-tk-elements-panel-textColor"
129136
>
130137
<EditorPanel
131-
id={tutorialStore.ref}
138+
id={storeRef}
132139
theme={theme}
133140
showFileTree={tutorialStore.hasFileTree()}
134141
editorDocument={currentDocument}
@@ -157,6 +164,7 @@ function PreviewsSection({
157164
const previewRef = useRef<ImperativePreviewHandle>(null);
158165
const lesson = tutorialStore.lesson!;
159166
const terminalConfig = useStore(tutorialStore.terminalConfig);
167+
const storeRef = useStore(tutorialStore.ref);
160168

161169
function showTerminal() {
162170
const { current: terminal } = terminalPanelRef;
@@ -206,7 +214,7 @@ function PreviewsSection({
206214
});
207215

208216
return () => unsubscribe();
209-
}, [tutorialStore.ref]);
217+
}, [storeRef]);
210218

211219
return (
212220
<Panel

packages/runtime/src/store/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class TutorialStore {
3939
private _lessonFilesFetcher: LessonFilesFetcher;
4040
private _lessonTask: Task<unknown> | undefined;
4141
private _lesson: Lesson | undefined;
42-
private _ref: number = 1;
42+
private _ref = atom(1);
4343
private _themeRef = atom(1);
4444

4545
private _lessonFiles: Files | undefined;
@@ -135,7 +135,7 @@ export class TutorialStore {
135135

136136
this._lessonTask?.cancel();
137137

138-
this._ref += 1;
138+
this._ref.set(1 + (this._ref.value || 0));
139139
this._lesson = lesson;
140140
this.lessonFullyLoaded.set(false);
141141

@@ -219,7 +219,7 @@ export class TutorialStore {
219219
return this._lesson;
220220
}
221221

222-
get ref(): unknown {
222+
get ref(): ReadableAtom<unknown> {
223223
return this._ref;
224224
}
225225

0 commit comments

Comments
 (0)