Skip to content

Commit f205b88

Browse files
committed
language persisted in localStorage
1 parent 4ce57e5 commit f205b88

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

src/components/LanguageSelector.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { SelectorOption } from "@types";
77
import Selector from "./Selector";
88

99
const LanguageSelector = () => {
10-
const { language, setLanguage } = useAppContext();
10+
const { language, toggleLanguage } = useAppContext();
1111
const { fetchedLanguages, loading, error } = useLanguages();
1212

1313
const options = useMemo(
@@ -24,7 +24,7 @@ const LanguageSelector = () => {
2424
if (!selected) {
2525
return;
2626
}
27-
setLanguage(selected);
27+
toggleLanguage(selected);
2828
};
2929

3030
if (loading) {

src/contexts/AppContext.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
import { oneDark } from "react-syntax-highlighter/dist/esm/styles/prism";
1010

1111
import { highlighterStyles } from "@consts/highlighter-styles";
12+
import { useLanguages } from "@hooks/useLanguages";
1213
import {
1314
AppState,
1415
HighlighterStyleType,
@@ -30,7 +31,7 @@ const defaultHighlighterStyle: HighlighterStyleType = {
3031
// TODO: add custom loading and error handling
3132
const defaultState: AppState = {
3233
language: defaultLanguage,
33-
setLanguage: () => {},
34+
toggleLanguage: () => {},
3435
category: "",
3536
setCategory: () => {},
3637
snippet: null,
@@ -46,6 +47,8 @@ const AppContext = createContext<AppState>(defaultState);
4647
export const AppProvider: FC<{ children: React.ReactNode }> = ({
4748
children,
4849
}) => {
50+
const { fetchedLanguages } = useLanguages();
51+
4952
const [language, setLanguage] = useState<LanguageType>(defaultLanguage);
5053
const [category, setCategory] = useState<string>("");
5154
const [snippet, setSnippet] = useState<SnippetType | null>(null);
@@ -65,6 +68,11 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
6568
: defaultHighlighterStyle
6669
);
6770

71+
const toggleLanguage = (newLanguage: LanguageType) => {
72+
setLanguage(newLanguage);
73+
localStorage.setItem("languageName", newLanguage.lang);
74+
};
75+
6876
const toggleTheme = useCallback(() => {
6977
const newTheme = theme === "dark" ? "light" : "dark";
7078
setTheme(newTheme);
@@ -79,6 +87,29 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
7987
localStorage.setItem("highlighterStyleName", newHighlighterStyle.name);
8088
};
8189

90+
/**
91+
* check if the language is saved in local storage
92+
*/
93+
useEffect(() => {
94+
if (fetchedLanguages.length === 0) {
95+
return;
96+
}
97+
98+
const languageName = localStorage.getItem("languageName");
99+
if (!languageName) {
100+
return;
101+
}
102+
103+
const selected = fetchedLanguages.find(
104+
(lang) => lang.lang === languageName
105+
);
106+
if (!selected) {
107+
return;
108+
}
109+
110+
setLanguage(selected);
111+
}, [fetchedLanguages]);
112+
82113
/**
83114
* set the theme on initial load
84115
*/
@@ -91,7 +122,7 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
91122
<AppContext.Provider
92123
value={{
93124
language,
94-
setLanguage,
125+
toggleLanguage,
95126
category,
96127
setCategory,
97128
snippet,

src/types/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export type HighlighterStyleType = {
2323

2424
export type AppState = {
2525
language: LanguageType;
26-
setLanguage: React.Dispatch<React.SetStateAction<LanguageType>>;
26+
toggleLanguage: (_: LanguageType) => void;
2727
category: string;
2828
setCategory: React.Dispatch<React.SetStateAction<string>>;
2929
snippet: SnippetType | null;

0 commit comments

Comments
 (0)