|
1 |
| -import { |
2 |
| - createContext, |
3 |
| - FC, |
4 |
| - useCallback, |
5 |
| - useContext, |
6 |
| - useEffect, |
7 |
| - useState, |
8 |
| -} from "react"; |
| 1 | +import { createContext, FC, useContext, useEffect, useState } from "react"; |
9 | 2 | import { useParams } from "react-router-dom";
|
10 | 3 |
|
11 | 4 | import { useLanguages } from "@hooks/useLanguages";
|
12 |
| -import { AppState, CategoryType, LanguageType, SnippetType } from "@types"; |
13 |
| -import { defaultLanguage } from "@utils/consts"; |
14 |
| -import { slugify } from "@utils/slugify"; |
| 5 | +import { AppState, LanguageType, SnippetType } from "@types"; |
| 6 | +import { configureProfile } from "@utils/configureProfile"; |
15 | 7 |
|
16 | 8 | // TODO: add custom loading and error handling
|
17 | 9 | const defaultState: AppState = {
|
@@ -39,50 +31,22 @@ export const AppProvider: FC<{ children: React.ReactNode }> = ({
|
39 | 31 | const [snippet, setSnippet] = useState<SnippetType | null>(null);
|
40 | 32 | const [searchText, setSearchText] = useState<string>("");
|
41 | 33 |
|
42 |
| - const assignLanguage = useCallback(() => { |
43 |
| - if (fetchedLanguages.length === 0) { |
44 |
| - return; |
45 |
| - } |
| 34 | + const configure = async () => { |
| 35 | + const { language, category } = await configureProfile({ |
| 36 | + languageName, |
| 37 | + categoryName, |
| 38 | + }); |
46 | 39 |
|
47 |
| - const language = fetchedLanguages.find( |
48 |
| - (lang) => slugify(lang.name) === languageName |
49 |
| - ); |
50 |
| - if (!language) { |
51 |
| - setLanguage(defaultLanguage); |
52 |
| - return; |
53 |
| - } |
54 | 40 | setLanguage(language);
|
55 |
| - }, [fetchedLanguages, languageName]); |
56 |
| - |
57 |
| - const assignCategory = useCallback(async () => { |
58 |
| - if (!language) { |
59 |
| - return; |
60 |
| - } |
61 |
| - |
62 |
| - let category: CategoryType | undefined; |
63 |
| - try { |
64 |
| - const res = await fetch(`/consolidated/${slugify(language.name)}.json`); |
65 |
| - const data: CategoryType[] = await res.json(); |
66 |
| - category = data.find((item) => item.name === categoryName); |
67 |
| - if (!category) { |
68 |
| - setCategory(data[0].name); |
69 |
| - return; |
70 |
| - } |
71 |
| - setCategory(category.name); |
72 |
| - } catch (_error) { |
73 |
| - // no-op |
74 |
| - } |
75 |
| - }, [language, categoryName]); |
76 |
| - |
77 |
| - useEffect(() => { |
78 |
| - assignLanguage(); |
79 |
| - }, [assignLanguage, languageName]); |
| 41 | + setCategory(category); |
| 42 | + }; |
80 | 43 |
|
81 | 44 | useEffect(() => {
|
82 |
| - assignCategory(); |
83 |
| - }, [assignCategory, categoryName]); |
| 45 | + configure(); |
| 46 | + // eslint-disable-next-line react-hooks/exhaustive-deps |
| 47 | + }, [fetchedLanguages]); |
84 | 48 |
|
85 |
| - if (!language || !category) { |
| 49 | + if (language === null || category === null) { |
86 | 50 | return <div>Loading...</div>;
|
87 | 51 | }
|
88 | 52 |
|
|
0 commit comments