9
9
import { oneDark } from "react-syntax-highlighter/dist/esm/styles/prism" ;
10
10
11
11
import { highlighterStyles } from "@consts/highlighter-styles" ;
12
+ import { useLanguages } from "@hooks/useLanguages" ;
12
13
import {
13
14
AppState ,
14
15
HighlighterStyleType ,
@@ -30,7 +31,7 @@ const defaultHighlighterStyle: HighlighterStyleType = {
30
31
// TODO: add custom loading and error handling
31
32
const defaultState : AppState = {
32
33
language : defaultLanguage ,
33
- setLanguage : ( ) => { } ,
34
+ toggleLanguage : ( ) => { } ,
34
35
category : "" ,
35
36
setCategory : ( ) => { } ,
36
37
snippet : null ,
@@ -46,6 +47,8 @@ const AppContext = createContext<AppState>(defaultState);
46
47
export const AppProvider : FC < { children : React . ReactNode } > = ( {
47
48
children,
48
49
} ) => {
50
+ const { fetchedLanguages } = useLanguages ( ) ;
51
+
49
52
const [ language , setLanguage ] = useState < LanguageType > ( defaultLanguage ) ;
50
53
const [ category , setCategory ] = useState < string > ( "" ) ;
51
54
const [ snippet , setSnippet ] = useState < SnippetType | null > ( null ) ;
@@ -65,6 +68,11 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
65
68
: defaultHighlighterStyle
66
69
) ;
67
70
71
+ const toggleLanguage = ( newLanguage : LanguageType ) => {
72
+ setLanguage ( newLanguage ) ;
73
+ localStorage . setItem ( "languageName" , newLanguage . lang ) ;
74
+ } ;
75
+
68
76
const toggleTheme = useCallback ( ( ) => {
69
77
const newTheme = theme === "dark" ? "light" : "dark" ;
70
78
setTheme ( newTheme ) ;
@@ -79,6 +87,29 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
79
87
localStorage . setItem ( "highlighterStyleName" , newHighlighterStyle . name ) ;
80
88
} ;
81
89
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
+
82
113
/**
83
114
* set the theme on initial load
84
115
*/
@@ -91,7 +122,7 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
91
122
< AppContext . Provider
92
123
value = { {
93
124
language,
94
- setLanguage ,
125
+ toggleLanguage ,
95
126
category,
96
127
setCategory,
97
128
snippet,
0 commit comments