Skip to content

Commit 38d8ab5

Browse files
committed
Fix cross-language data corruption and remove loading flash on language switch
1 parent d33c134 commit 38d8ab5

2 files changed

Lines changed: 15 additions & 19 deletions

File tree

src/App.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import LanguageSelector from "./LanguageSelector";
5555
import { getQuestion } from "./QuestionSelector";
5656

5757
function App() {
58-
const { lang, t, questions, dbArrayBuffer, defaultQuery, isLoading } = useLanguage();
58+
const { lang, t, questions, dbArrayBuffer, defaultQuery } = useLanguage();
5959
const [question, setQuestion] = useState<Question>();
6060
const [database, setDatabase] = useState<initSqlJs.Database>();
6161
const [error, setError] = useState<string | null>(null);
@@ -205,10 +205,20 @@ function App() {
205205
}
206206
}, [question]);
207207

208+
// Track which language the current question was loaded in
209+
const questionLangRef = useRef(lang);
210+
useEffect(() => {
211+
if (question) questionLangRef.current = lang;
212+
}, [question, lang]);
213+
208214
useEffect(() => {
209215
if (!database || !question || query === undefined) {
210216
return;
211217
}
218+
// Don't write to localStorage if lang changed but question hasn't been cleared yet
219+
if (questionLangRef.current !== lang) {
220+
return;
221+
}
212222
let wq = JSON.parse(localStorage.getItem(langKey(lang, "writtenQuestions")) || "[]");
213223
const initialLength = wq.length;
214224
if (query === defaultQuery || query === "") {
@@ -382,6 +392,9 @@ function App() {
382392
if (!result || !question || evaluatedQuery !== query) {
383393
return;
384394
}
395+
if (questionLangRef.current !== lang) {
396+
return;
397+
}
385398
const matchesPrimary = isCorrectResult(question.evaluable_result, result);
386399
const matchedAlt = !matchesPrimary ? question.alternative_evaluable_results?.find(alt => isCorrectResult(alt, result)) : undefined;
387400
if (!matchesPrimary && !matchedAlt) {
@@ -781,17 +794,6 @@ function App() {
781794
});
782795
}, [evaluatedQuery, exportQuery, exportRendererRef, getTheme, isDarkMode, exportingStatus, question, resetResult, setTheme, exportQuestion, exportView]);
783796

784-
if (isLoading) {
785-
return (
786-
<div className="App">
787-
<header className="App-header">
788-
<h1 className="text-6xl font-semibold my-3">SQL Validator</h1>
789-
<p className="text-base text-gray-500">Loading...</p>
790-
</header>
791-
</div>
792-
);
793-
}
794-
795797
return (
796798
<div className="App">
797799
{exportQuestion && exportQuery && <ExportRenderer query={{isCorrect: isCorrectResult(exportQuestion.evaluable_result, evalSql(exportQuery)) || (exportQuestion.alternative_evaluable_results?.some(alt => isCorrectResult(alt, evalSql(exportQuery))) ?? false), question: exportQuestion, code: exportQuery, result: evalSql(exportQuery)}} ref={exportRendererRef} />}

src/i18n/context.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ interface LanguageContextValue {
3333
dbArrayBuffer: ArrayBuffer | null;
3434
/** Default query for the current language */
3535
defaultQuery: string;
36-
/** Whether language data is currently loading */
37-
isLoading: boolean;
3836
}
3937

4038
const LanguageContext = createContext<LanguageContextValue | null>(null);
@@ -78,10 +76,8 @@ export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({ chil
7876
const [questions, setQuestions] = useState<QuestionCategory[]>([]);
7977
const [dbArrayBuffer, setDbArrayBuffer] = useState<ArrayBuffer | null>(null);
8078
const [defaultQuery, setDefaultQuery] = useState("SELECT * FROM Student;");
81-
const [isLoading, setIsLoading] = useState(true);
8279

8380
const loadLanguageData = useCallback(async (langCode: string) => {
84-
setIsLoading(true);
8581
try {
8682
const [qpResponse, dbResponse] = await Promise.all([
8783
fetch(`/languages/${langCode}/questionpool.json`),
@@ -101,8 +97,6 @@ export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({ chil
10197
setDbArrayBuffer(dbData);
10298
} catch (e) {
10399
console.error("Failed to load language data:", e);
104-
} finally {
105-
setIsLoading(false);
106100
}
107101
}, []);
108102

@@ -131,7 +125,7 @@ export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({ chil
131125
}, [lang]);
132126

133127
return (
134-
<LanguageContext.Provider value={{ lang, setLang, t, questions, dbArrayBuffer, defaultQuery, isLoading }}>
128+
<LanguageContext.Provider value={{ lang, setLang, t, questions, dbArrayBuffer, defaultQuery }}>
135129
{children}
136130
</LanguageContext.Provider>
137131
);

0 commit comments

Comments
 (0)